Skip to content

Commit fbbf62b

Browse files
authored
Merge pull request #476 from Iterable/MOB-4998-ConnectivityManager-OfflineMode-improvements
Mob 4998 connectivity manager offline mode improvements
2 parents 4234303 + 9eb7c51 commit fbbf62b

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

iterableapi/src/main/java/com/iterable/iterableapi/IterableNetworkConnectivityManager.java

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,25 @@
33
import android.content.Context;
44
import android.net.ConnectivityManager;
55
import android.net.Network;
6+
import android.net.NetworkCapabilities;
67
import android.net.NetworkRequest;
78
import android.os.Build;
89

910
import androidx.annotation.NonNull;
1011
import androidx.annotation.RequiresApi;
1112

1213
import java.util.ArrayList;
14+
import java.util.HashSet;
15+
import java.util.Set;
1316

1417
class 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
});

iterableapi/src/main/java/com/iterable/iterableapi/IterableTaskRunner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void onSwitchToBackground() {
8787

8888
}
8989

90-
private void runNow() {
90+
private synchronized void runNow() {
9191
handler.removeMessages(OPERATION_PROCESS_TASKS);
9292
handler.sendEmptyMessage(OPERATION_PROCESS_TASKS);
9393
}

0 commit comments

Comments
 (0)