From f9286975d60b7aa2cb6bf317683045e05ef9c0be Mon Sep 17 00:00:00 2001 From: bjoern Date: Sat, 29 Oct 2022 15:42:44 +0200 Subject: [PATCH] use more modern methods to track connectivity changes (#2403) * use registerDefaultNetworkCallback() instead of deprecated CONNECTIVITY_ACTION CONNECTIVITY_ACTION is deprecated, see https://developer.android.com/reference/android/net/ConnectivityManager#CONNECTIVITY_ACTION, instead, we call maybe_network() at ConnectivityManager.NetworkCallback::onAvailable() callback. * add more debug info --- .../securesms/ApplicationContext.java | 38 ++++++++++++++++++- .../connect/NetworkStateReceiver.java | 11 ++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 11d4bbf46..fa190cba6 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -4,6 +4,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.LinkProperties; +import android.net.NetworkCapabilities; +import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; @@ -16,9 +20,9 @@ import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import com.b44t.messenger.DcAccounts; -import com.b44t.messenger.DcEventEmitter; import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; +import com.b44t.messenger.DcEventEmitter; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -54,6 +58,11 @@ public class ApplicationContext extends MultiDexApplication { public NotificationCenter notificationCenter; private JobManager jobManager; + private int debugOnAvailableCount; + private int debugOnBlockedStatusChangedCount; + private int debugOnCapabilitiesChangedCount; + private int debugOnLinkPropertiesChangedCount; + public static ApplicationContext getInstance(@NonNull Context context) { return (ApplicationContext)context.getApplicationContext(); } @@ -120,6 +129,33 @@ public class ApplicationContext extends MultiDexApplication { new ForegroundDetector(ApplicationContext.getInstance(this)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ConnectivityManager connectivityManager = + (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); + connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(@NonNull android.net.Network network) { + Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onAvailable() #" + debugOnAvailableCount++); + dcAccounts.maybeNetwork(); + } + + @Override + public void onBlockedStatusChanged(@NonNull android.net.Network network, boolean blocked) { + Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onBlockedStatusChanged() #" + debugOnBlockedStatusChangedCount++); + } + + @Override + public void onCapabilitiesChanged(@NonNull android.net.Network network, NetworkCapabilities networkCapabilities) { + // usually called after onAvailable(), so a maybeNetwork seems contraproductive + Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onCapabilitiesChanged() #" + debugOnCapabilitiesChangedCount++); + } + + @Override + public void onLinkPropertiesChanged(@NonNull android.net.Network network, LinkProperties linkProperties) { + Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onLinkPropertiesChanged() #" + debugOnLinkPropertiesChangedCount++); + } + }); + } // no else: use old method for debugging BroadcastReceiver networkStateReceiver = new NetworkStateReceiver(); registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); diff --git a/src/org/thoughtcrime/securesms/connect/NetworkStateReceiver.java b/src/org/thoughtcrime/securesms/connect/NetworkStateReceiver.java index 03c592a5f..9b0fb03d8 100644 --- a/src/org/thoughtcrime/securesms/connect/NetworkStateReceiver.java +++ b/src/org/thoughtcrime/securesms/connect/NetworkStateReceiver.java @@ -5,12 +5,15 @@ import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.Build; import android.util.Log; import com.b44t.messenger.DcContext; public class NetworkStateReceiver extends BroadcastReceiver { + private int debugConnectedCount; + @Override public void onReceive(Context context, Intent intent) { @@ -19,8 +22,9 @@ public class NetworkStateReceiver extends BroadcastReceiver { NetworkInfo ni = manager.getActiveNetworkInfo(); if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { - Log.i("DeltaChat", "++++++++++++++++++ Connected ++++++++++++++++++"); - new Thread(() -> { + Log.i("DeltaChat", "++++++++++++++++++ Connected #" + debugConnectedCount++); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + new Thread(() -> { // call dc_maybe_network() from a worker thread. // theoretically, dc_maybe_network() can be called from the main thread and returns at once, // however, in reality, it does currently halt things for some seconds. @@ -28,7 +32,8 @@ public class NetworkStateReceiver extends BroadcastReceiver { Log.i("DeltaChat", "calling maybeNetwork()"); DcHelper.getAccounts(context).maybeNetwork(); Log.i("DeltaChat", "maybeNetwork() returned"); - }).start(); + }).start(); + } } } catch (Exception e) {