From 7e6fcb80a3b101299457180da59e588f03db10fd Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 21 Mar 2022 12:21:46 -0400 Subject: [PATCH] Revert all new network detection API usage and refactorings. --- .../AdvancedPrivacySettingsFragment.kt | 38 ++++++++- .../AdvancedPrivacySettingsViewModel.kt | 9 +- .../jobmanager/impl/NetworkConstraint.java | 11 ++- .../impl/NetworkConstraintObserver.java | 85 +------------------ .../securesms/jobs/JobManagerFactories.java | 2 +- .../messages/IncomingMessageObserver.java | 41 +++++---- .../service/webrtc/WebRtcCallService.java | 27 +++--- 7 files changed, 92 insertions(+), 121 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt index 34c1efc210..37957b1e07 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt @@ -1,9 +1,14 @@ package org.thoughtcrime.securesms.components.settings.app.privacy.advanced import android.app.ProgressDialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter import android.graphics.drawable.Drawable +import android.net.ConnectivityManager import android.text.SpannableStringBuilder import android.widget.TextView import android.widget.Toast @@ -27,7 +32,9 @@ import org.thoughtcrime.securesms.util.ViewUtil class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__advanced) { - lateinit var viewModel: AdvancedPrivacySettingsViewModel + private lateinit var viewModel: AdvancedPrivacySettingsViewModel + + private var networkReceiver: NetworkReceiver? = null private val sealedSenderSummary: CharSequence by lazy { SpanUtil.learnMore( @@ -60,6 +67,12 @@ class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences override fun onResume() { super.onResume() viewModel.refresh() + registerNetworkReceiver() + } + + override fun onPause() { + super.onPause() + unregisterNetworkReceiver() } override fun bindAdapter(adapter: DSLSettingsAdapter) { @@ -195,4 +208,27 @@ class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences getString(R.string.preferences__free_private_messages_and_calls) } } + + @Suppress("DEPRECATION") + private fun registerNetworkReceiver() { + val context: Context? = context + if (context != null && networkReceiver == null) { + networkReceiver = NetworkReceiver() + context.registerReceiver(networkReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) + } + } + + private fun unregisterNetworkReceiver() { + val context: Context? = context + if (context != null && networkReceiver != null) { + context.unregisterReceiver(networkReceiver) + networkReceiver = null + } + } + + private inner class NetworkReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + viewModel.refresh() + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt index 1d0d3942cf..27e8769fd4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsViewModel.kt @@ -8,7 +8,6 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint -import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver import org.thoughtcrime.securesms.jobs.RefreshAttributesJob import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob import org.thoughtcrime.securesms.keyvalue.SettingsValues @@ -22,7 +21,7 @@ import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState class AdvancedPrivacySettingsViewModel( private val sharedPreferences: SharedPreferences, private val repository: AdvancedPrivacySettingsRepository -) : ViewModel(), NetworkConstraintObserver.NetworkListener { +) : ViewModel() { private val store = Store(getState()) private val singleEvents = SingleLiveEvent() @@ -32,7 +31,6 @@ class AdvancedPrivacySettingsViewModel( val disposables: CompositeDisposable = CompositeDisposable() init { - NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).addListener(this) disposables.add( ApplicationDependencies.getSignalWebSocket().webSocketState .observeOn(AndroidSchedulers.mainThread()) @@ -87,12 +85,7 @@ class AdvancedPrivacySettingsViewModel( store.update { getState().copy(showProgressSpinner = it.showProgressSpinner) } } - override fun onNetworkChanged() { - refresh() - } - override fun onCleared() { - NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).removeListener(this) disposables.dispose() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java index e96e7a1ed0..5851a1af04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java @@ -2,8 +2,12 @@ package org.thoughtcrime.securesms.jobmanager.impl; import android.app.Application; import android.app.job.JobInfo; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import org.thoughtcrime.securesms.jobmanager.Constraint; @@ -39,8 +43,11 @@ public class NetworkConstraint implements Constraint { return "NETWORK"; } - public static boolean isMet(@NonNull Application application) { - return NetworkConstraintObserver.getInstance(application).hasInternet(); + public static boolean isMet(@NonNull Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); + + return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } public static final class Factory implements Constraint.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java index ea71004c39..59ddcbf7cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java @@ -6,112 +6,33 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.Build; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.jobmanager.ConstraintObserver; -import java.util.HashSet; -import java.util.Set; - public class NetworkConstraintObserver implements ConstraintObserver { private static final String REASON = Log.tag(NetworkConstraintObserver.class); - private static final String TAG = Log.tag(NetworkConstraintObserver.class); private final Application application; - private volatile Notifier notifier; - private volatile boolean hasInternet; - - private final Set networkListeners = new HashSet<>(); - - private static volatile NetworkConstraintObserver instance; - - public static NetworkConstraintObserver getInstance(@NonNull Application application) { - if (instance == null) { - synchronized (NetworkConstraintObserver.class) { - if (instance == null) { - instance = new NetworkConstraintObserver(application); - } - } - } - return instance; - } - - private NetworkConstraintObserver(Application application) { + public NetworkConstraintObserver(Application application) { this.application = application; } @Override public void register(@NonNull Notifier notifier) { - this.notifier = notifier; - this.hasInternet = isActiveNetworkConnected(application); - - requestNetwork(); - } - - private static boolean isActiveNetworkConnected(@NonNull Context context) { - ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); - - return activeNetworkInfo != null && activeNetworkInfo.isConnected(); - } - - private void requestNetwork() { application.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - hasInternet = isActiveNetworkConnected(context); + NetworkConstraint constraint = new NetworkConstraint.Factory(application).create(); - if (hasInternet) { - Log.i(TAG, logPrefix() + "Network available."); + if (constraint.isMet()) { notifier.onConstraintMet(REASON); - } else { - Log.w(TAG, logPrefix() + "Network unavailable."); } - - notifyListeners(); } }, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } - - public boolean hasInternet() { - return hasInternet; - } - - public void addListener(@Nullable NetworkListener networkListener) { - synchronized (networkListeners) { - networkListeners.add(networkListener); - } - } - - public void removeListener(@Nullable NetworkListener networkListener) { - if (networkListener == null) { - return; - } - - synchronized (networkListeners) { - networkListeners.remove(networkListener); - } - } - - private void notifyListeners() { - synchronized (networkListeners) { - //noinspection SimplifyStreamApiCallChains - networkListeners.stream().forEach(NetworkListener::onNetworkChanged); - } - } - - private static String logPrefix() { - return "[API " + Build.VERSION.SDK_INT + "] "; - } - - public interface NetworkListener { - void onNetworkChanged(); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 316d34f317..c7eeb4dd75 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -250,7 +250,7 @@ public final class JobManagerFactories { public static List getConstraintObservers(@NonNull Application application) { return Arrays.asList(CellServiceConstraintObserver.getInstance(application), new ChargingConstraintObserver(application), - NetworkConstraintObserver.getInstance(application), + new NetworkConstraintObserver(application), new SqlCipherMigrationConstraintObserver(), new DecryptionsDrainedConstraintObserver(), new NotInCallConstraintObserver()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java index 54953b0188..0e28435eb0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.java @@ -2,7 +2,11 @@ package org.thoughtcrime.securesms.messages; import android.app.Application; import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; import android.os.IBinder; import androidx.annotation.NonNull; @@ -17,7 +21,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; -import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver; import org.thoughtcrime.securesms.jobs.PushDecryptDrainedJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.messages.IncomingMessageProcessor.Processor; @@ -50,10 +53,10 @@ public class IncomingMessageObserver { private static final AtomicInteger INSTANCE_COUNT = new AtomicInteger(0); - private final Application context; - private final SignalServiceNetworkAccess networkAccess; - private final List decryptionDrainedListeners; - private final NetworkConstraintObserver.NetworkListener networkListener; + private final Application context; + private final SignalServiceNetworkAccess networkAccess; + private final List decryptionDrainedListeners; + private final BroadcastReceiver connectionReceiver; private boolean appVisible; @@ -88,18 +91,22 @@ public class IncomingMessageObserver { } }); - networkListener = this::networkChanged; - NetworkConstraintObserver.getInstance(this.context).addListener(networkListener); - } + connectionReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (IncomingMessageObserver.this) { + if (!NetworkConstraint.isMet(context)) { + Log.w(TAG, "Lost network connection. Shutting down our websocket connections and resetting the drained state."); + networkDrained = false; + decryptionDrained = false; + disconnect(); + } + IncomingMessageObserver.this.notifyAll(); + } + } + }; - private synchronized void networkChanged() { - if (!NetworkConstraint.isMet(context)) { - Log.w(TAG, "Lost network connection. Shutting down our websocket connections and resetting the drained state."); - networkDrained = false; - decryptionDrained = false; - disconnect(); - } - IncomingMessageObserver.this.notifyAll(); + context.registerReceiver(connectionReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } public synchronized void notifyRegistrationChanged() { @@ -169,7 +176,7 @@ public class IncomingMessageObserver { public void terminateAsync() { INSTANCE_COUNT.decrementAndGet(); - NetworkConstraintObserver.getInstance(context).removeListener(networkListener); + context.unregisterReceiver(connectionReceiver); SignalExecutors.BOUNDED.execute(() -> { Log.w(TAG, "Beginning termination."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java index aeff780fa3..8c86df16b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java @@ -6,6 +6,8 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; @@ -54,7 +56,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag private SignalCallManager callManager; - private NetworkListener networkListener; + private NetworkReceiver networkReceiver; private PowerButtonReceiver powerButtonReceiver; private UncaughtExceptionHandlerManager uncaughtExceptionHandlerManager; private PhoneStateListener hangUpRtcOnDeviceCallAnswered; @@ -224,16 +226,18 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } private void registerNetworkReceiver() { - if (networkListener == null) { - networkListener = new NetworkListener(); - NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).addListener(networkListener); + if (networkReceiver == null) { + networkReceiver = new NetworkReceiver(); + + registerReceiver(networkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } } private void unregisterNetworkReceiver() { - if (networkListener != null) { - NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).removeListener(networkListener); - networkListener = null; + if (networkReceiver != null) { + unregisterReceiver(networkReceiver); + + networkReceiver = null; } } @@ -278,10 +282,13 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } } - private static class NetworkListener implements NetworkConstraintObserver.NetworkListener { + private static class NetworkReceiver extends BroadcastReceiver { @Override - public void onNetworkChanged() { - ApplicationDependencies.getSignalCallManager().networkChange(NetworkConstraint.isMet(ApplicationDependencies.getApplication())); + public void onReceive(Context context, Intent intent) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); + + ApplicationDependencies.getSignalCallManager().networkChange(activeNetworkInfo != null && activeNetworkInfo.isConnected()); ApplicationDependencies.getSignalCallManager().bandwidthModeUpdate(); } }