3
3
import android .content .Context ;
4
4
import android .net .ConnectivityManager ;
5
5
import android .net .Network ;
6
+ import android .net .NetworkCapabilities ;
6
7
import android .net .NetworkRequest ;
7
8
import android .os .Build ;
8
9
9
10
import androidx .annotation .NonNull ;
10
11
import androidx .annotation .RequiresApi ;
11
12
12
13
import java .util .ArrayList ;
14
+ import java .util .HashSet ;
15
+ import java .util .Set ;
13
16
14
17
class IterableNetworkConnectivityManager {
15
18
private static final String TAG = "NetworkConnectivityManager" ;
16
19
private boolean isConnected ;
17
20
18
21
private static IterableNetworkConnectivityManager sharedInstance ;
19
-
22
+ private ConnectivityManager connectivityManager ;
20
23
private ArrayList <IterableNetworkMonitorListener > networkMonitorListeners = new ArrayList <>();
24
+ private Set <Network > networkSet = new HashSet <>();
21
25
22
26
public interface IterableNetworkMonitorListener {
23
27
void onNetworkConnected ();
@@ -37,21 +41,36 @@ private IterableNetworkConnectivityManager(Context context) {
37
41
return ;
38
42
}
39
43
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
44
+ connectivityManager = (ConnectivityManager ) context .getSystemService (Context .CONNECTIVITY_SERVICE );
45
+ checkInternetAvailabilityOnActiveNetwork ();
40
46
startNetworkCallback (context );
41
47
}
42
48
}
43
49
50
+ private void checkInternetAvailabilityOnActiveNetwork () {
51
+ try {
52
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
53
+ Network activeNetwork = connectivityManager .getActiveNetwork ();
54
+ isConnected = activeNetwork == null ? false : connectivityManager .getNetworkCapabilities (activeNetwork ).hasCapability (NetworkCapabilities .NET_CAPABILITY_INTERNET );
55
+ IterableLogger .v (TAG , "Internet active : " + isConnected );
56
+ } else {
57
+ IterableLogger .v (TAG , "Internet capability could not be detected on active network due to Android OS < Marshmallow." );
58
+ }
59
+ } catch (Exception e ) {
60
+ IterableLogger .e (TAG , "Error in detecting network availability" );
61
+ }
62
+ }
63
+
44
64
@ RequiresApi (api = Build .VERSION_CODES .LOLLIPOP )
45
65
private void startNetworkCallback (Context context ) {
46
- ConnectivityManager connectivityManager = (ConnectivityManager ) context .getSystemService (Context .CONNECTIVITY_SERVICE );
47
- NetworkRequest .Builder networkBuilder = new NetworkRequest .Builder ();
48
-
66
+ NetworkRequest networkRequest = new NetworkRequest .Builder ().build ();
49
67
if (connectivityManager != null ) {
50
68
try {
51
- connectivityManager .registerNetworkCallback (networkBuilder . build () , new ConnectivityManager .NetworkCallback () {
69
+ connectivityManager .registerNetworkCallback (networkRequest , new ConnectivityManager .NetworkCallback () {
52
70
@ Override
53
71
public void onAvailable (@ NonNull Network network ) {
54
72
super .onAvailable (network );
73
+ networkSet .add (network );
55
74
IterableLogger .v (TAG , "Network Connected" );
56
75
isConnected = true ;
57
76
ArrayList <IterableNetworkMonitorListener > networkListenersCopy = new ArrayList <>(networkMonitorListeners );
@@ -64,10 +83,13 @@ public void onAvailable(@NonNull Network network) {
64
83
public void onLost (@ NonNull Network network ) {
65
84
super .onLost (network );
66
85
IterableLogger .v (TAG , "Network Disconnected" );
67
- isConnected = false ;
68
- ArrayList <IterableNetworkMonitorListener > networkListenersCopy = new ArrayList <>(networkMonitorListeners );
69
- for (IterableNetworkMonitorListener listener : networkListenersCopy ) {
70
- listener .onNetworkDisconnected ();
86
+ networkSet .remove (network );
87
+ if (networkSet .isEmpty ()) {
88
+ isConnected = false ;
89
+ ArrayList <IterableNetworkMonitorListener > networkListenersCopy = new ArrayList <>(networkMonitorListeners );
90
+ for (IterableNetworkMonitorListener listener : networkListenersCopy ) {
91
+ listener .onNetworkDisconnected ();
92
+ }
71
93
}
72
94
}
73
95
});
0 commit comments