Skip to content

Commit 7ec8cec

Browse files
Skip backoff when App enters Foreground
1 parent b5d06cd commit 7ec8cec

File tree

3 files changed

+42
-31
lines changed

3 files changed

+42
-31
lines changed

firebase-firestore/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Unreleased
2+
- [changed] The SDK now tries to immediately establish a connection to the
3+
backend when the app enters the foreground.
4+
15
# 22.1.1
26
- [fixed] Fixed an issue that dropped the limit for queries loaded from
37
Bundles that were generated by the NodeJS SDK.

firebase-firestore/src/main/java/com/google/firebase/firestore/remote/AndroidConnectivityMonitor.java

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.net.Network;
2626
import android.os.Build;
2727
import androidx.annotation.Nullable;
28+
import com.google.android.gms.common.api.internal.BackgroundDetector;
2829
import com.google.firebase.firestore.util.Consumer;
2930
import java.util.ArrayList;
3031
import java.util.List;
@@ -35,7 +36,8 @@
3536
* <p>Implementation note: Most of the code here was shamelessly stolen from
3637
* https://github.com/grpc/grpc-java/blob/master/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
3738
*/
38-
public final class AndroidConnectivityMonitor implements ConnectivityMonitor {
39+
public final class AndroidConnectivityMonitor
40+
implements ConnectivityMonitor, BackgroundDetector.BackgroundStateChangeListener {
3941

4042
private final Context context;
4143
@Nullable private final ConnectivityManager connectivityManager;
@@ -50,6 +52,7 @@ public AndroidConnectivityMonitor(Context context) {
5052

5153
connectivityManager =
5254
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
55+
configureBackgroundStateListener();
5356
configureNetworkMonitoring();
5457
}
5558

@@ -96,53 +99,60 @@ public void run() {
9699
}
97100
}
98101

102+
private void configureBackgroundStateListener() {
103+
BackgroundDetector.getInstance().addListener(this);
104+
}
105+
106+
@Override
107+
public void onBackgroundStateChanged(boolean background) {
108+
if (!background && isConnected()) {
109+
raiseCallbacks(/* connected= */ true);
110+
}
111+
}
112+
99113
/** Respond to changes in the default network. Only used on API levels 24+. */
100114
@TargetApi(Build.VERSION_CODES.N)
101115
private class DefaultNetworkCallback extends ConnectivityManager.NetworkCallback {
102116
@Override
103117
public void onAvailable(Network network) {
104-
synchronized (callbacks) {
105-
for (Consumer<NetworkStatus> callback : callbacks) {
106-
callback.accept(NetworkStatus.REACHABLE);
107-
}
108-
}
118+
raiseCallbacks(/* connected= */ true);
109119
}
110120

111121
@Override
112122
public void onLost(Network network) {
113-
synchronized (callbacks) {
114-
for (Consumer<NetworkStatus> callback : callbacks) {
115-
callback.accept(NetworkStatus.UNREACHABLE);
116-
}
117-
}
123+
raiseCallbacks(/* connected= */ false);
118124
}
119125
}
120126

121127
/** Respond to network changes. Only used on API levels < 24. */
122128
private class NetworkReceiver extends BroadcastReceiver {
123-
private boolean isConnected = false;
129+
private boolean wasConnected = false;
124130

125131
@Override
126132
@SuppressWarnings("deprecation")
127133
public void onReceive(Context context, Intent intent) {
128-
ConnectivityManager conn =
129-
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
130-
android.net.NetworkInfo networkInfo = conn.getActiveNetworkInfo();
131-
boolean wasConnected = isConnected;
132-
isConnected = networkInfo != null && networkInfo.isConnected();
133-
if (isConnected && !wasConnected) {
134-
synchronized (callbacks) {
135-
for (Consumer<NetworkStatus> callback : callbacks) {
136-
callback.accept(NetworkStatus.REACHABLE);
137-
}
138-
}
134+
boolean isConnected = isConnected();
135+
if (isConnected() && !wasConnected) {
136+
raiseCallbacks(/* connected= */ true);
139137
} else if (!isConnected && wasConnected) {
140-
synchronized (callbacks) {
141-
for (Consumer<NetworkStatus> callback : callbacks) {
142-
callback.accept(NetworkStatus.UNREACHABLE);
143-
}
144-
}
138+
raiseCallbacks(/* connected= */ false);
145139
}
140+
wasConnected = isConnected;
146141
}
147142
}
143+
144+
private void raiseCallbacks(boolean connected) {
145+
synchronized (callbacks) {
146+
for (Consumer<NetworkStatus> callback : callbacks) {
147+
callback.accept(connected ? NetworkStatus.REACHABLE : NetworkStatus.UNREACHABLE);
148+
}
149+
}
150+
}
151+
152+
private boolean isConnected() {
153+
ConnectivityManager conn =
154+
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
155+
android.net.NetworkInfo networkInfo = conn.getActiveNetworkInfo();
156+
return networkInfo != null && networkInfo.isConnected();
157+
}
148158
}

subprojects.cfg

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ firebase-components:firebase-dynamic-module-support
1616
firebase-config
1717
firebase-config:ktx
1818
firebase-config:bandwagoner
19-
firebase-crashlytics
20-
firebase-crashlytics:ktx
21-
firebase-crashlytics-ndk
2219
firebase-database
2320
firebase-database:ktx
2421
firebase-database-collection

0 commit comments

Comments
 (0)