|
17 | 17 | import static com.google.firebase.firestore.util.Assert.hardAssert;
|
18 | 18 |
|
19 | 19 | import android.annotation.TargetApi;
|
| 20 | +import android.app.Activity; |
| 21 | +import android.app.Application; |
20 | 22 | import android.content.BroadcastReceiver;
|
21 | 23 | import android.content.Context;
|
22 | 24 | import android.content.Intent;
|
23 | 25 | import android.content.IntentFilter;
|
24 | 26 | import android.net.ConnectivityManager;
|
25 | 27 | import android.net.Network;
|
26 | 28 | import android.os.Build;
|
| 29 | +import android.os.Bundle; |
| 30 | +import androidx.annotation.NonNull; |
27 | 31 | import androidx.annotation.Nullable;
|
28 |
| -import com.google.android.gms.common.api.internal.BackgroundDetector; |
29 | 32 | import com.google.firebase.firestore.util.Consumer;
|
| 33 | +import com.google.firebase.firestore.util.Logger; |
30 | 34 | import java.util.ArrayList;
|
31 | 35 | import java.util.List;
|
32 | 36 |
|
|
36 | 40 | * <p>Implementation note: Most of the code here was shamelessly stolen from
|
37 | 41 | * https://github.com/grpc/grpc-java/blob/master/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
|
38 | 42 | */
|
39 |
| -public final class AndroidConnectivityMonitor |
40 |
| - implements ConnectivityMonitor, BackgroundDetector.BackgroundStateChangeListener { |
| 43 | +public final class AndroidConnectivityMonitor implements ConnectivityMonitor { |
| 44 | + |
| 45 | + private static final String LOG_TAG = "AndroidConnectivityMonitor"; |
41 | 46 |
|
42 | 47 | private final Context context;
|
43 | 48 | @Nullable private final ConnectivityManager connectivityManager;
|
@@ -78,34 +83,56 @@ private void configureNetworkMonitoring() {
|
78 | 83 | final DefaultNetworkCallback defaultNetworkCallback = new DefaultNetworkCallback();
|
79 | 84 | connectivityManager.registerDefaultNetworkCallback(defaultNetworkCallback);
|
80 | 85 | unregisterRunnable =
|
81 |
| - new Runnable() { |
82 |
| - @Override |
83 |
| - public void run() { |
84 |
| - connectivityManager.unregisterNetworkCallback(defaultNetworkCallback); |
85 |
| - } |
86 |
| - }; |
| 86 | + () -> connectivityManager.unregisterNetworkCallback(defaultNetworkCallback); |
87 | 87 | } else {
|
88 | 88 | NetworkReceiver networkReceiver = new NetworkReceiver();
|
89 | 89 | @SuppressWarnings("deprecation")
|
90 | 90 | IntentFilter networkIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
|
91 | 91 | context.registerReceiver(networkReceiver, networkIntentFilter);
|
92 |
| - unregisterRunnable = |
93 |
| - new Runnable() { |
94 |
| - @Override |
95 |
| - public void run() { |
96 |
| - context.unregisterReceiver(networkReceiver); |
97 |
| - } |
98 |
| - }; |
| 92 | + unregisterRunnable = () -> context.unregisterReceiver(networkReceiver); |
99 | 93 | }
|
100 | 94 | }
|
101 | 95 |
|
102 | 96 | private void configureBackgroundStateListener() {
|
103 |
| - BackgroundDetector.getInstance().addListener(this); |
| 97 | + // Manually register an ActivityLifecycleCallback. Android's BackgroundDetector only notifies |
| 98 | + // when it is certain that the app transitioned from background to foreground. Instead, we |
| 99 | + // want to be notified whenever there is a slight chance that this transition happened. |
| 100 | + ((Application) context.getApplicationContext()) |
| 101 | + .registerActivityLifecycleCallbacks( |
| 102 | + new Application.ActivityLifecycleCallbacks() { |
| 103 | + @Override |
| 104 | + public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) { |
| 105 | + raiseForegroundNotification(); |
| 106 | + } |
| 107 | + |
| 108 | + @Override |
| 109 | + public void onActivityStarted(@NonNull Activity activity) { |
| 110 | + raiseForegroundNotification(); |
| 111 | + } |
| 112 | + |
| 113 | + @Override |
| 114 | + public void onActivityResumed(@NonNull Activity activity) { |
| 115 | + raiseForegroundNotification(); |
| 116 | + } |
| 117 | + |
| 118 | + @Override |
| 119 | + public void onActivityPaused(@NonNull Activity activity) {} |
| 120 | + |
| 121 | + @Override |
| 122 | + public void onActivityStopped(@NonNull Activity activity) {} |
| 123 | + |
| 124 | + @Override |
| 125 | + public void onActivitySaveInstanceState( |
| 126 | + @NonNull Activity activity, @NonNull Bundle outState) {} |
| 127 | + |
| 128 | + @Override |
| 129 | + public void onActivityDestroyed(@NonNull Activity activity) {} |
| 130 | + }); |
104 | 131 | }
|
105 | 132 |
|
106 |
| - @Override |
107 |
| - public void onBackgroundStateChanged(boolean background) { |
108 |
| - if (!background && isConnected()) { |
| 133 | + public void raiseForegroundNotification() { |
| 134 | + Logger.debug(LOG_TAG, "App has entered the foreground."); |
| 135 | + if (isConnected()) { |
109 | 136 | raiseCallbacks(/* connected= */ true);
|
110 | 137 | }
|
111 | 138 | }
|
|
0 commit comments