Skip to content

Commit 357973f

Browse files
author
“Akshay
committed
Taking account of multiple network
Device can be connected to multiple network at once. Mostly Wifi and cellular. Previous implementation would switch back to offline if either of the one got disconnected, thereby falsely picturing device being offline. This implementation takes multiple network into consideration and saves them in a Set. Only if all the network are disconnected, only then `isConnected` is flipped to false. onCapabilitiesChanged is another callback that can give even granular controls over if internet is actually present or not, but to keep it simple, this is a good improvement to existing functionality of offline mode.
1 parent b73fa6c commit 357973f

File tree

1 file changed

+11
-20
lines changed

1 file changed

+11
-20
lines changed

Diff for: iterableapi/src/main/java/com/iterable/iterableapi/IterableNetworkConnectivityManager.java

+11-20
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import androidx.annotation.RequiresApi;
1212

1313
import java.util.ArrayList;
14+
import java.util.HashSet;
15+
import java.util.Set;
1416

1517
class IterableNetworkConnectivityManager {
1618
private static final String TAG = "NetworkConnectivityManager";
@@ -19,6 +21,7 @@ class IterableNetworkConnectivityManager {
1921
private static IterableNetworkConnectivityManager sharedInstance;
2022

2123
private ArrayList<IterableNetworkMonitorListener> networkMonitorListeners = new ArrayList<>();
24+
private Set<Network> networkSet = new HashSet<>();
2225

2326
public interface IterableNetworkMonitorListener {
2427
void onNetworkConnected();
@@ -55,6 +58,7 @@ private void startNetworkCallback(Context context) {
5558
@Override
5659
public void onAvailable(@NonNull Network network) {
5760
super.onAvailable(network);
61+
networkSet.add(network);
5862
IterableLogger.v(TAG, "Network Connected");
5963
isConnected = true;
6064
ArrayList<IterableNetworkMonitorListener> networkListenersCopy = new ArrayList<>(networkMonitorListeners);
@@ -63,31 +67,18 @@ public void onAvailable(@NonNull Network network) {
6367
}
6468
}
6569

66-
@Override
67-
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
68-
super.onCapabilitiesChanged(network, networkCapabilities);
69-
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && !isConnected) {
70-
IterableLogger.v(TAG, "Network with internet capability available");
71-
isConnected = true;
72-
ArrayList<IterableNetworkMonitorListener> networkListenersCopy = new ArrayList<>(networkMonitorListeners);
73-
for (IterableNetworkMonitorListener listener : networkListenersCopy) {
74-
listener.onNetworkConnected();
75-
}
76-
}
77-
}
78-
7970
@Override
8071
public void onLost(@NonNull Network network) {
8172
super.onLost(network);
8273
IterableLogger.v(TAG, "Network Disconnected");
83-
isConnected = false;
84-
ArrayList<IterableNetworkMonitorListener> networkListenersCopy = new ArrayList<>(networkMonitorListeners);
85-
for (IterableNetworkMonitorListener listener : networkListenersCopy) {
86-
listener.onNetworkDisconnected();
74+
networkSet.remove(network);
75+
if (networkSet.isEmpty()) {
76+
isConnected = false;
77+
ArrayList<IterableNetworkMonitorListener> networkListenersCopy = new ArrayList<>(networkMonitorListeners);
78+
for (IterableNetworkMonitorListener listener : networkListenersCopy) {
79+
listener.onNetworkDisconnected();
80+
}
8781
}
88-
89-
//TODO: Have to keep track of which network lost the connection. Could be possible that device is connected to multiple networks.
90-
// One network failing should not turn on offline mode. Only if all the network are lost, isConnected should flip to false.
9182
}
9283
});
9384
} catch (SecurityException e) {

0 commit comments

Comments
 (0)