Revert all new network detection API usage and refactorings.

This commit is contained in:
Cody Henthorne 2022-03-21 12:21:46 -04:00 committed by GitHub
parent 5e46e1e3d9
commit 7e6fcb80a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 92 additions and 121 deletions

View file

@ -1,9 +1,14 @@
package org.thoughtcrime.securesms.components.settings.app.privacy.advanced package org.thoughtcrime.securesms.components.settings.app.privacy.advanced
import android.app.ProgressDialog 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.PorterDuff
import android.graphics.PorterDuffColorFilter import android.graphics.PorterDuffColorFilter
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.ConnectivityManager
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
@ -27,7 +32,9 @@ import org.thoughtcrime.securesms.util.ViewUtil
class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__advanced) { 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 { private val sealedSenderSummary: CharSequence by lazy {
SpanUtil.learnMore( SpanUtil.learnMore(
@ -60,6 +67,12 @@ class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
viewModel.refresh() viewModel.refresh()
registerNetworkReceiver()
}
override fun onPause() {
super.onPause()
unregisterNetworkReceiver()
} }
override fun bindAdapter(adapter: DSLSettingsAdapter) { override fun bindAdapter(adapter: DSLSettingsAdapter) {
@ -195,4 +208,27 @@ class AdvancedPrivacySettingsFragment : DSLSettingsFragment(R.string.preferences
getString(R.string.preferences__free_private_messages_and_calls) 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()
}
}
} }

View file

@ -8,7 +8,6 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint 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.RefreshAttributesJob
import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob
import org.thoughtcrime.securesms.keyvalue.SettingsValues import org.thoughtcrime.securesms.keyvalue.SettingsValues
@ -22,7 +21,7 @@ import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
class AdvancedPrivacySettingsViewModel( class AdvancedPrivacySettingsViewModel(
private val sharedPreferences: SharedPreferences, private val sharedPreferences: SharedPreferences,
private val repository: AdvancedPrivacySettingsRepository private val repository: AdvancedPrivacySettingsRepository
) : ViewModel(), NetworkConstraintObserver.NetworkListener { ) : ViewModel() {
private val store = Store(getState()) private val store = Store(getState())
private val singleEvents = SingleLiveEvent<Event>() private val singleEvents = SingleLiveEvent<Event>()
@ -32,7 +31,6 @@ class AdvancedPrivacySettingsViewModel(
val disposables: CompositeDisposable = CompositeDisposable() val disposables: CompositeDisposable = CompositeDisposable()
init { init {
NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).addListener(this)
disposables.add( disposables.add(
ApplicationDependencies.getSignalWebSocket().webSocketState ApplicationDependencies.getSignalWebSocket().webSocketState
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
@ -87,12 +85,7 @@ class AdvancedPrivacySettingsViewModel(
store.update { getState().copy(showProgressSpinner = it.showProgressSpinner) } store.update { getState().copy(showProgressSpinner = it.showProgressSpinner) }
} }
override fun onNetworkChanged() {
refresh()
}
override fun onCleared() { override fun onCleared() {
NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).removeListener(this)
disposables.dispose() disposables.dispose()
} }

View file

@ -2,8 +2,12 @@ package org.thoughtcrime.securesms.jobmanager.impl;
import android.app.Application; import android.app.Application;
import android.app.job.JobInfo; import android.app.job.JobInfo;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import org.thoughtcrime.securesms.jobmanager.Constraint; import org.thoughtcrime.securesms.jobmanager.Constraint;
@ -39,8 +43,11 @@ public class NetworkConstraint implements Constraint {
return "NETWORK"; return "NETWORK";
} }
public static boolean isMet(@NonNull Application application) { public static boolean isMet(@NonNull Context context) {
return NetworkConstraintObserver.getInstance(application).hasInternet(); 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<NetworkConstraint> { public static final class Factory implements Constraint.Factory<NetworkConstraint> {

View file

@ -6,112 +6,33 @@ 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.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.ConstraintObserver; import org.thoughtcrime.securesms.jobmanager.ConstraintObserver;
import java.util.HashSet;
import java.util.Set;
public class NetworkConstraintObserver implements ConstraintObserver { public class NetworkConstraintObserver implements ConstraintObserver {
private static final String REASON = Log.tag(NetworkConstraintObserver.class); private static final String REASON = Log.tag(NetworkConstraintObserver.class);
private static final String TAG = Log.tag(NetworkConstraintObserver.class);
private final Application application; private final Application application;
private volatile Notifier notifier; public NetworkConstraintObserver(Application application) {
private volatile boolean hasInternet;
private final Set<NetworkListener> 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) {
this.application = application; this.application = application;
} }
@Override @Override
public void register(@NonNull Notifier notifier) { 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() { application.registerReceiver(new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
hasInternet = isActiveNetworkConnected(context); NetworkConstraint constraint = new NetworkConstraint.Factory(application).create();
if (hasInternet) { if (constraint.isMet()) {
Log.i(TAG, logPrefix() + "Network available.");
notifier.onConstraintMet(REASON); notifier.onConstraintMet(REASON);
} else {
Log.w(TAG, logPrefix() + "Network unavailable.");
} }
notifyListeners();
} }
}, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); }, 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();
}
} }

View file

@ -250,7 +250,7 @@ public final class JobManagerFactories {
public static List<ConstraintObserver> getConstraintObservers(@NonNull Application application) { public static List<ConstraintObserver> getConstraintObservers(@NonNull Application application) {
return Arrays.asList(CellServiceConstraintObserver.getInstance(application), return Arrays.asList(CellServiceConstraintObserver.getInstance(application),
new ChargingConstraintObserver(application), new ChargingConstraintObserver(application),
NetworkConstraintObserver.getInstance(application), new NetworkConstraintObserver(application),
new SqlCipherMigrationConstraintObserver(), new SqlCipherMigrationConstraintObserver(),
new DecryptionsDrainedConstraintObserver(), new DecryptionsDrainedConstraintObserver(),
new NotInCallConstraintObserver()); new NotInCallConstraintObserver());

View file

@ -2,7 +2,11 @@ package org.thoughtcrime.securesms.messages;
import android.app.Application; import android.app.Application;
import android.app.Service; import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.IBinder; import android.os.IBinder;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -17,7 +21,6 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil; import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver;
import org.thoughtcrime.securesms.jobs.PushDecryptDrainedJob; import org.thoughtcrime.securesms.jobs.PushDecryptDrainedJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.messages.IncomingMessageProcessor.Processor; import org.thoughtcrime.securesms.messages.IncomingMessageProcessor.Processor;
@ -53,7 +56,7 @@ public class IncomingMessageObserver {
private final Application context; private final Application context;
private final SignalServiceNetworkAccess networkAccess; private final SignalServiceNetworkAccess networkAccess;
private final List<Runnable> decryptionDrainedListeners; private final List<Runnable> decryptionDrainedListeners;
private final NetworkConstraintObserver.NetworkListener networkListener; private final BroadcastReceiver connectionReceiver;
private boolean appVisible; private boolean appVisible;
@ -88,11 +91,10 @@ public class IncomingMessageObserver {
} }
}); });
networkListener = this::networkChanged; connectionReceiver = new BroadcastReceiver() {
NetworkConstraintObserver.getInstance(this.context).addListener(networkListener); @Override
} public void onReceive(Context context, Intent intent) {
synchronized (IncomingMessageObserver.this) {
private synchronized void networkChanged() {
if (!NetworkConstraint.isMet(context)) { if (!NetworkConstraint.isMet(context)) {
Log.w(TAG, "Lost network connection. Shutting down our websocket connections and resetting the drained state."); Log.w(TAG, "Lost network connection. Shutting down our websocket connections and resetting the drained state.");
networkDrained = false; networkDrained = false;
@ -101,6 +103,11 @@ public class IncomingMessageObserver {
} }
IncomingMessageObserver.this.notifyAll(); IncomingMessageObserver.this.notifyAll();
} }
}
};
context.registerReceiver(connectionReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
public synchronized void notifyRegistrationChanged() { public synchronized void notifyRegistrationChanged() {
notifyAll(); notifyAll();
@ -169,7 +176,7 @@ public class IncomingMessageObserver {
public void terminateAsync() { public void terminateAsync() {
INSTANCE_COUNT.decrementAndGet(); INSTANCE_COUNT.decrementAndGet();
NetworkConstraintObserver.getInstance(context).removeListener(networkListener); context.unregisterReceiver(connectionReceiver);
SignalExecutors.BOUNDED.execute(() -> { SignalExecutors.BOUNDED.execute(() -> {
Log.w(TAG, "Beginning termination."); Log.w(TAG, "Beginning termination.");

View file

@ -6,6 +6,8 @@ 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.NetworkInfo;
import android.os.IBinder; import android.os.IBinder;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@ -54,7 +56,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag
private SignalCallManager callManager; private SignalCallManager callManager;
private NetworkListener networkListener; private NetworkReceiver networkReceiver;
private PowerButtonReceiver powerButtonReceiver; private PowerButtonReceiver powerButtonReceiver;
private UncaughtExceptionHandlerManager uncaughtExceptionHandlerManager; private UncaughtExceptionHandlerManager uncaughtExceptionHandlerManager;
private PhoneStateListener hangUpRtcOnDeviceCallAnswered; private PhoneStateListener hangUpRtcOnDeviceCallAnswered;
@ -224,16 +226,18 @@ public final class WebRtcCallService extends Service implements SignalAudioManag
} }
private void registerNetworkReceiver() { private void registerNetworkReceiver() {
if (networkListener == null) { if (networkReceiver == null) {
networkListener = new NetworkListener(); networkReceiver = new NetworkReceiver();
NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).addListener(networkListener);
registerReceiver(networkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
} }
} }
private void unregisterNetworkReceiver() { private void unregisterNetworkReceiver() {
if (networkListener != null) { if (networkReceiver != null) {
NetworkConstraintObserver.getInstance(ApplicationDependencies.getApplication()).removeListener(networkListener); unregisterReceiver(networkReceiver);
networkListener = null;
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 @Override
public void onNetworkChanged() { public void onReceive(Context context, Intent intent) {
ApplicationDependencies.getSignalCallManager().networkChange(NetworkConstraint.isMet(ApplicationDependencies.getApplication())); ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
ApplicationDependencies.getSignalCallManager().networkChange(activeNetworkInfo != null && activeNetworkInfo.isConnected());
ApplicationDependencies.getSignalCallManager().bandwidthModeUpdate(); ApplicationDependencies.getSignalCallManager().bandwidthModeUpdate();
} }
} }