33import android .content .Context ;
44import android .net .ConnectivityManager ;
55import android .net .Network ;
6+ import android .net .NetworkCapabilities ;
67import android .net .NetworkRequest ;
78import android .os .Build ;
89
910import androidx .annotation .NonNull ;
1011import androidx .annotation .RequiresApi ;
1112
1213import java .util .ArrayList ;
14+ import java .util .HashSet ;
15+ import java .util .Set ;
1316
1417class IterableNetworkConnectivityManager {
1518 private static final String TAG = "NetworkConnectivityManager" ;
1619 private boolean isConnected ;
1720
1821 private static IterableNetworkConnectivityManager sharedInstance ;
19-
22+ private ConnectivityManager connectivityManager ;
2023 private ArrayList <IterableNetworkMonitorListener > networkMonitorListeners = new ArrayList <>();
24+ private Set <Network > networkSet = new HashSet <>();
2125
2226 public interface IterableNetworkMonitorListener {
2327 void onNetworkConnected ();
@@ -37,21 +41,36 @@ private IterableNetworkConnectivityManager(Context context) {
3741 return ;
3842 }
3943 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
44+ connectivityManager = (ConnectivityManager ) context .getSystemService (Context .CONNECTIVITY_SERVICE );
45+ checkInternetAvailabilityOnActiveNetwork ();
4046 startNetworkCallback (context );
4147 }
4248 }
4349
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+
4464 @ RequiresApi (api = Build .VERSION_CODES .LOLLIPOP )
4565 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 ();
4967 if (connectivityManager != null ) {
5068 try {
51- connectivityManager .registerNetworkCallback (networkBuilder . build () , new ConnectivityManager .NetworkCallback () {
69+ connectivityManager .registerNetworkCallback (networkRequest , new ConnectivityManager .NetworkCallback () {
5270 @ Override
5371 public void onAvailable (@ NonNull Network network ) {
5472 super .onAvailable (network );
73+ networkSet .add (network );
5574 IterableLogger .v (TAG , "Network Connected" );
5675 isConnected = true ;
5776 ArrayList <IterableNetworkMonitorListener > networkListenersCopy = new ArrayList <>(networkMonitorListeners );
@@ -64,10 +83,13 @@ public void onAvailable(@NonNull Network network) {
6483 public void onLost (@ NonNull Network network ) {
6584 super .onLost (network );
6685 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+ }
7193 }
7294 }
7395 });
0 commit comments