From 5f0d37739a40af85b219c0e515a53dfa1bc66a33 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 13 Dec 2022 10:36:31 -0400 Subject: [PATCH] Remove SLE from EditProxyViewModel. --- .../preferences/EditProxyFragment.java | 15 +++-- .../preferences/EditProxyViewModel.java | 66 +++++++++---------- .../proxy/ProxyBottomSheetFragment.java | 12 +++- .../securesms/util/LifecycleDisposable.kt | 5 ++ 4 files changed, 58 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java index caa7231ba2..c9c561e1d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.util.CommunicationActions; +import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.SignalProxyUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; @@ -40,6 +41,7 @@ public class EditProxyFragment extends Fragment { private View shareButton; private CircularProgressMaterialButton saveButton; private EditProxyViewModel viewModel; + private LifecycleDisposable lifecycleDisposable; public static EditProxyFragment newInstance() { return new EditProxyFragment(); @@ -59,6 +61,9 @@ public class EditProxyFragment extends Fragment { this.saveButton = view.findViewById(R.id.edit_proxy_save); this.shareButton = view.findViewById(R.id.edit_proxy_share); + lifecycleDisposable = new LifecycleDisposable(); + lifecycleDisposable.bindTo(getViewLifecycleOwner()); + proxyText.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(String text) { @@ -92,10 +97,12 @@ public class EditProxyFragment extends Fragment { private void initViewModel() { viewModel = new ViewModelProvider(this).get(EditProxyViewModel.class); - viewModel.getUiState().observe(getViewLifecycleOwner(), this::presentUiState); - viewModel.getProxyState().observe(getViewLifecycleOwner(), this::presentProxyState); - viewModel.getEvents().observe(getViewLifecycleOwner(), this::presentEvent); - viewModel.getSaveState().observe(getViewLifecycleOwner(), this::presentSaveState); + lifecycleDisposable.addAll( + viewModel.getUiState().subscribe(this::presentUiState), + viewModel.getProxyState().subscribe(this::presentProxyState), + viewModel.getEvents().subscribe(this::presentEvent), + viewModel.getSaveState().subscribe(this::presentSaveState) + ); } private void presentUiState(@NonNull EditProxyViewModel.UiState uiState) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyViewModel.java index f7347e3f77..4bc7caca16 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyViewModel.java @@ -1,45 +1,45 @@ package org.thoughtcrime.securesms.preferences; import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.util.SignalProxyUtil; -import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState; import org.whispersystems.signalservice.internal.configuration.SignalProxy; import java.util.concurrent.TimeUnit; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.BackpressureStrategy; - -import static androidx.lifecycle.LiveDataReactiveStreams.fromPublisher; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.subjects.BehaviorSubject; +import io.reactivex.rxjava3.subjects.PublishSubject; public class EditProxyViewModel extends ViewModel { - private final SingleLiveEvent events; - private final MutableLiveData uiState; - private final MutableLiveData saveState; - private final LiveData pipeState; + private final PublishSubject events; + private final BehaviorSubject uiState; + private final BehaviorSubject saveState; + private final Flowable pipeState; public EditProxyViewModel() { - this.events = new SingleLiveEvent<>(); - this.uiState = new MutableLiveData<>(); - this.saveState = new MutableLiveData<>(SaveState.IDLE); - this.pipeState = SignalStore.account().getE164() == null ? new MutableLiveData<>() - : fromPublisher(ApplicationDependencies.getSignalWebSocket() - .getWebSocketState() - .toFlowable(BackpressureStrategy.LATEST)); + this.events = PublishSubject.create(); + this.uiState = BehaviorSubject.create(); + this.saveState = BehaviorSubject.createDefault(SaveState.IDLE); + this.pipeState = SignalStore.account().getE164() == null ? Flowable.empty() + : ApplicationDependencies.getSignalWebSocket() + .getWebSocketState() + .toFlowable(BackpressureStrategy.LATEST); if (SignalStore.proxy().isProxyEnabled()) { - uiState.setValue(UiState.ALL_ENABLED); + uiState.onNext(UiState.ALL_ENABLED); } else { - uiState.setValue(UiState.ALL_DISABLED); + uiState.onNext(UiState.ALL_DISABLED); } } @@ -50,20 +50,20 @@ public class EditProxyViewModel extends ViewModel { if (currentProxy != null && !Util.isEmpty(currentProxy.getHost())) { SignalProxyUtil.enableProxy(currentProxy); } - uiState.postValue(UiState.ALL_ENABLED); + uiState.onNext(UiState.ALL_ENABLED); } else if (Util.isEmpty(text)) { SignalProxyUtil.disableAndClearProxy(); - uiState.postValue(UiState.ALL_DISABLED); + uiState.onNext(UiState.ALL_DISABLED); } else { SignalProxyUtil.disableProxy(); - uiState.postValue(UiState.ALL_DISABLED); + uiState.onNext(UiState.ALL_DISABLED); } } public void onSaveClicked(@NonNull String host) { String trueHost = SignalProxyUtil.convertUserEnteredAddressToHost(host); - saveState.postValue(SaveState.IN_PROGRESS); + saveState.onNext(SaveState.IN_PROGRESS); SignalExecutors.BOUNDED.execute(() -> { SignalProxyUtil.enableProxy(new SignalProxy(trueHost, 443)); @@ -71,30 +71,30 @@ public class EditProxyViewModel extends ViewModel { boolean success = SignalProxyUtil.testWebsocketConnection(TimeUnit.SECONDS.toMillis(10)); if (success) { - events.postValue(Event.PROXY_SUCCESS); + events.onNext(Event.PROXY_SUCCESS); } else { SignalProxyUtil.disableProxy(); - events.postValue(Event.PROXY_FAILURE); + events.onNext(Event.PROXY_FAILURE); } - saveState.postValue(SaveState.IDLE); + saveState.onNext(SaveState.IDLE); }); } - @NonNull LiveData getUiState() { - return uiState; + @NonNull Observable getUiState() { + return uiState.observeOn(AndroidSchedulers.mainThread()); } - public @NonNull LiveData getEvents() { - return events; + public @NonNull Observable getEvents() { + return events.observeOn(AndroidSchedulers.mainThread()); } - @NonNull LiveData getProxyState() { - return pipeState; + @NonNull Flowable getProxyState() { + return pipeState.observeOn(AndroidSchedulers.mainThread()); } - public @NonNull LiveData getSaveState() { - return saveState; + public @NonNull Observable getSaveState() { + return saveState.observeOn(AndroidSchedulers.mainThread()); } enum UiState { diff --git a/app/src/main/java/org/thoughtcrime/securesms/proxy/ProxyBottomSheetFragment.java b/app/src/main/java/org/thoughtcrime/securesms/proxy/ProxyBottomSheetFragment.java index 2acc6e42ca..6e94a26409 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/proxy/ProxyBottomSheetFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/proxy/ProxyBottomSheetFragment.java @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.proxy; -import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -21,6 +20,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.preferences.EditProxyViewModel; import org.thoughtcrime.securesms.util.BottomSheetUtil; +import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton; @@ -37,6 +37,7 @@ public final class ProxyBottomSheetFragment extends BottomSheetDialogFragment { private View cancelButton; private CircularProgressMaterialButton useProxyButton; private EditProxyViewModel viewModel; + private LifecycleDisposable lifecycleDisposable; public static void showForProxy(@NonNull FragmentManager manager, @NonNull String proxyLink) { ProxyBottomSheetFragment fragment = new ProxyBottomSheetFragment(); @@ -68,6 +69,9 @@ public final class ProxyBottomSheetFragment extends BottomSheetDialogFragment { this.useProxyButton = view.findViewById(R.id.proxy_sheet_use_proxy); this.cancelButton = view.findViewById(R.id.proxy_sheet_cancel); + lifecycleDisposable = new LifecycleDisposable(); + lifecycleDisposable.bindTo(getViewLifecycleOwner()); + String host = getArguments().getString(ARG_PROXY_LINK); proxyText.setText(host); @@ -80,8 +84,10 @@ public final class ProxyBottomSheetFragment extends BottomSheetDialogFragment { private void initViewModel() { this.viewModel = new ViewModelProvider(this).get(EditProxyViewModel.class); - viewModel.getSaveState().observe(getViewLifecycleOwner(), this::presentSaveState); - viewModel.getEvents().observe(getViewLifecycleOwner(), this::presentEvents); + lifecycleDisposable.addAll( + viewModel.getSaveState().subscribe(this::presentSaveState), + viewModel.getEvents().subscribe(this::presentEvents) + ); } private void presentSaveState(@NonNull EditProxyViewModel.SaveState state) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/LifecycleDisposable.kt b/app/src/main/java/org/thoughtcrime/securesms/util/LifecycleDisposable.kt index b5020720c3..32de6db47d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/LifecycleDisposable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/LifecycleDisposable.kt @@ -26,6 +26,11 @@ class LifecycleDisposable : DefaultLifecycleObserver { return this } + fun addAll(vararg disposable: Disposable): LifecycleDisposable { + disposables.addAll(*disposable) + return this + } + fun clear() { disposables.clear() }