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
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()
}
}
}

View file

@ -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<Event>()
@ -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()
}

View file

@ -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<NetworkConstraint> {

View file

@ -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<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) {
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();
}
}

View file

@ -250,7 +250,7 @@ public final class JobManagerFactories {
public static List<ConstraintObserver> 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());

View file

@ -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<Runnable> decryptionDrainedListeners;
private final NetworkConstraintObserver.NetworkListener networkListener;
private final Application context;
private final SignalServiceNetworkAccess networkAccess;
private final List<Runnable> 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.");

View file

@ -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();
}
}