Skip to content

Commit

Permalink
Remove SLE from EditProxyViewModel.
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-signal authored and cody-signal committed Dec 16, 2022
1 parent c5b4f44 commit 5f0d377
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
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;
Expand All @@ -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();
Expand All @@ -59,6 +61,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
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) {
Expand Down Expand Up @@ -92,10 +97,12 @@ public void onResume() {
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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Event> events;
private final MutableLiveData<UiState> uiState;
private final MutableLiveData<SaveState> saveState;
private final LiveData<WebSocketConnectionState> pipeState;
private final PublishSubject<Event> events;
private final BehaviorSubject<UiState> uiState;
private final BehaviorSubject<SaveState> saveState;
private final Flowable<WebSocketConnectionState> 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);
}
}

Expand All @@ -50,51 +50,51 @@ void onToggleProxy(boolean enabled, String text) {
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));

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<UiState> getUiState() {
return uiState;
@NonNull Observable<UiState> getUiState() {
return uiState.observeOn(AndroidSchedulers.mainThread());
}

public @NonNull LiveData<Event> getEvents() {
return events;
public @NonNull Observable<Event> getEvents() {
return events.observeOn(AndroidSchedulers.mainThread());
}

@NonNull LiveData<WebSocketConnectionState> getProxyState() {
return pipeState;
@NonNull Flowable<WebSocketConnectionState> getProxyState() {
return pipeState.observeOn(AndroidSchedulers.mainThread());
}

public @NonNull LiveData<SaveState> getSaveState() {
return saveState;
public @NonNull Observable<SaveState> getSaveState() {
return saveState.observeOn(AndroidSchedulers.mainThread());
}

enum UiState {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -21,6 +20,7 @@
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;

Expand All @@ -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();
Expand Down Expand Up @@ -68,6 +69,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
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);

Expand All @@ -80,8 +84,10 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ class LifecycleDisposable : DefaultLifecycleObserver {
return this
}

fun addAll(vararg disposable: Disposable): LifecycleDisposable {
disposables.addAll(*disposable)
return this
}

fun clear() {
disposables.clear()
}
Expand Down

0 comments on commit 5f0d377

Please sign in to comment.