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
This commit is contained in:
bjoern 2022-10-29 15:42:44 +02:00 committed by GitHub
parent c95bfb544d
commit f9286975d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 4 deletions

View file

@ -4,6 +4,10 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; 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 android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -16,9 +20,9 @@ import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import com.b44t.messenger.DcAccounts; import com.b44t.messenger.DcAccounts;
import com.b44t.messenger.DcEventEmitter;
import com.b44t.messenger.DcContext; import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcEventEmitter;
import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.connect.AccountManager; import org.thoughtcrime.securesms.connect.AccountManager;
@ -54,6 +58,11 @@ public class ApplicationContext extends MultiDexApplication {
public NotificationCenter notificationCenter; public NotificationCenter notificationCenter;
private JobManager jobManager; private JobManager jobManager;
private int debugOnAvailableCount;
private int debugOnBlockedStatusChangedCount;
private int debugOnCapabilitiesChangedCount;
private int debugOnLinkPropertiesChangedCount;
public static ApplicationContext getInstance(@NonNull Context context) { public static ApplicationContext getInstance(@NonNull Context context) {
return (ApplicationContext)context.getApplicationContext(); return (ApplicationContext)context.getApplicationContext();
} }
@ -120,6 +129,33 @@ public class ApplicationContext extends MultiDexApplication {
new ForegroundDetector(ApplicationContext.getInstance(this)); 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(); BroadcastReceiver networkStateReceiver = new NetworkStateReceiver();
registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));

View file

@ -5,12 +5,15 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.os.Build;
import android.util.Log; import android.util.Log;
import com.b44t.messenger.DcContext; import com.b44t.messenger.DcContext;
public class NetworkStateReceiver extends BroadcastReceiver { public class NetworkStateReceiver extends BroadcastReceiver {
private int debugConnectedCount;
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@ -19,8 +22,9 @@ public class NetworkStateReceiver extends BroadcastReceiver {
NetworkInfo ni = manager.getActiveNetworkInfo(); NetworkInfo ni = manager.getActiveNetworkInfo();
if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
Log.i("DeltaChat", "++++++++++++++++++ Connected ++++++++++++++++++"); Log.i("DeltaChat", "++++++++++++++++++ Connected #" + debugConnectedCount++);
new Thread(() -> { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
new Thread(() -> {
// call dc_maybe_network() from a worker thread. // call dc_maybe_network() from a worker thread.
// theoretically, dc_maybe_network() can be called from the main thread and returns at once, // 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. // 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()"); Log.i("DeltaChat", "calling maybeNetwork()");
DcHelper.getAccounts(context).maybeNetwork(); DcHelper.getAccounts(context).maybeNetwork();
Log.i("DeltaChat", "maybeNetwork() returned"); Log.i("DeltaChat", "maybeNetwork() returned");
}).start(); }).start();
}
} }
} }
catch (Exception e) { catch (Exception e) {