25
25
import android .net .Network ;
26
26
import android .os .Build ;
27
27
import androidx .annotation .Nullable ;
28
+ import com .google .android .gms .common .api .internal .BackgroundDetector ;
28
29
import com .google .firebase .firestore .util .Consumer ;
29
30
import java .util .ArrayList ;
30
31
import java .util .List ;
35
36
* <p>Implementation note: Most of the code here was shamelessly stolen from
36
37
* https://github.com/grpc/grpc-java/blob/master/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
37
38
*/
38
- public final class AndroidConnectivityMonitor implements ConnectivityMonitor {
39
+ public final class AndroidConnectivityMonitor
40
+ implements ConnectivityMonitor , BackgroundDetector .BackgroundStateChangeListener {
39
41
40
42
private final Context context ;
41
43
@ Nullable private final ConnectivityManager connectivityManager ;
@@ -50,6 +52,7 @@ public AndroidConnectivityMonitor(Context context) {
50
52
51
53
connectivityManager =
52
54
(ConnectivityManager ) context .getSystemService (Context .CONNECTIVITY_SERVICE );
55
+ configureBackgroundStateListener ();
53
56
configureNetworkMonitoring ();
54
57
}
55
58
@@ -96,53 +99,60 @@ public void run() {
96
99
}
97
100
}
98
101
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
+
99
113
/** Respond to changes in the default network. Only used on API levels 24+. */
100
114
@ TargetApi (Build .VERSION_CODES .N )
101
115
private class DefaultNetworkCallback extends ConnectivityManager .NetworkCallback {
102
116
@ Override
103
117
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 );
109
119
}
110
120
111
121
@ Override
112
122
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 );
118
124
}
119
125
}
120
126
121
127
/** Respond to network changes. Only used on API levels < 24. */
122
128
private class NetworkReceiver extends BroadcastReceiver {
123
- private boolean isConnected = false ;
129
+ private boolean wasConnected = false ;
124
130
125
131
@ Override
126
132
@ SuppressWarnings ("deprecation" )
127
133
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 );
139
137
} else if (!isConnected && wasConnected ) {
140
- synchronized (callbacks ) {
141
- for (Consumer <NetworkStatus > callback : callbacks ) {
142
- callback .accept (NetworkStatus .UNREACHABLE );
143
- }
144
- }
138
+ raiseCallbacks (/* connected= */ false );
145
139
}
140
+ wasConnected = isConnected ;
146
141
}
147
142
}
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
+ }
148
158
}
0 commit comments