From 7eea532a81fe1a993d60ce3458da1f6d402c3214 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 25 May 2021 11:18:22 +0200 Subject: [PATCH] Add explainer fragment for activating a remote wipe --- .../android/activity/ActivityComponent.java | 6 ++ .../activate/ActivateRemoteWipeActivity.java | 68 +++++++++++++++++- .../ActivateRemoteWipeExplainerFragment.java | 54 +++++++++++++- .../activate/ActivateRemoteWipeState.java | 8 +++ .../activate/ActivateRemoteWipeViewModel.java | 55 ++++++++++++++- .../drawable/remote_wipe_activate_explain.xml | 17 +++++ ...ragment_activate_remote_wipe_explainer.xml | 70 +++++++++++++++++++ briar-android/src/main/res/values/strings.xml | 8 +++ 8 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeState.java create mode 100644 briar-android/src/main/res/drawable/remote_wipe_activate_explain.xml create mode 100644 briar-android/src/main/res/layout/fragment_activate_remote_wipe_explainer.xml diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java index 70df92463..0ab3303f3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java @@ -69,6 +69,8 @@ import org.briarproject.briar.android.remotewipe.RemoteWipeDisplayFragment; import org.briarproject.briar.android.remotewipe.RemoteWipeSetupActivity; import org.briarproject.briar.android.remotewipe.RemoteWipeSuccessFragment; import org.briarproject.briar.android.remotewipe.WiperSelectorFragment; +import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeActivity; +import org.briarproject.briar.android.remotewipe.activate.ActivateRemoteWipeExplainerFragment; import org.briarproject.briar.android.reporting.CrashFragment; import org.briarproject.briar.android.reporting.CrashReportActivity; import org.briarproject.briar.android.reporting.ReportFormFragment; @@ -221,6 +223,8 @@ public interface ActivityComponent { void inject(RemoteWipeSetupActivity remoteWipeSetupActivity); + void inject(ActivateRemoteWipeActivity activateRemoteWipeActivity); + // Fragments void inject(AuthorNameFragment fragment); @@ -318,4 +322,6 @@ public interface ActivityComponent { void inject(RemoteWipeDisplayFragment remoteWipeDisplayFragment); void inject(RemoteWipeSuccessFragment remoteWipeSuccessFragment); + + void inject(ActivateRemoteWipeExplainerFragment activateRemoteWipeExplainerFragment); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeActivity.java index c233261eb..129cf8b18 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeActivity.java @@ -1,4 +1,70 @@ package org.briarproject.briar.android.remotewipe.activate; -public class ActivateRemoteWipeActivity { +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.briar.R; +import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.activity.BriarActivity; + +import javax.inject.Inject; + +import androidx.lifecycle.ViewModelProvider; + +import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; + +public class ActivateRemoteWipeActivity extends BriarActivity { + + @Inject + ViewModelProvider.Factory viewModelFactory; + ActivateRemoteWipeViewModel viewModel; + + @Override + public void injectActivity(ActivityComponent component) { + component.inject(this); + + viewModel = new ViewModelProvider(this, viewModelFactory) + .get(ActivateRemoteWipeViewModel.class); + + viewModel.getState().observe(this, this::onStateChanged); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState == null) { + Intent intent = getIntent(); + int id = intent.getIntExtra(CONTACT_ID, -1); + if (id == -1) throw new IllegalStateException("No ContactId"); + ContactId contactId = new ContactId(id); + viewModel.setContactId(contactId); + showInitialFragment(new ActivateRemoteWipeExplainerFragment()); + } + } + + private void onStateChanged(ActivateRemoteWipeState state) { + switch(state) { + case FAILED: + Toast.makeText(this, + R.string.remote_wipe_activate_failure, + Toast.LENGTH_LONG).show(); + break; + case SUCCESS: +// showNextFragment(new ActivateRemoteWipeSuccessFragment()); + Toast.makeText(this, + R.string.remote_wipe_activate_success, + Toast.LENGTH_LONG).show(); + finish(); + break; + case FINISHED: + finish(); + break; + case CANCELLED: + finish(); + break; + } + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeExplainerFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeExplainerFragment.java index 01543f467..e5fb4ffe6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeExplainerFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeExplainerFragment.java @@ -1,4 +1,56 @@ package org.briarproject.briar.android.remotewipe.activate; -public class ActivateRemoteWipeExplainerFragment { +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import org.briarproject.briar.R; +import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.fragment.BaseFragment; + +import javax.inject.Inject; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +public class ActivateRemoteWipeExplainerFragment extends + BaseFragment { + + public static final String TAG = + ActivateRemoteWipeExplainerFragment.class.getName(); + + @Inject + ViewModelProvider.Factory viewModelFactory; + + private ActivateRemoteWipeViewModel viewModel; + + @Override + public void injectFragment(ActivityComponent component) { + component.inject(this); + viewModel = new ViewModelProvider(requireActivity(), viewModelFactory) + .get(ActivateRemoteWipeViewModel.class); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_activate_remote_wipe_explainer, + container, false); + Button cancelButton = view.findViewById(R.id.button_cancel); + cancelButton.setOnClickListener(e -> viewModel.onCancelClicked()); + + Button confirmButton = view.findViewById(R.id.button_confirm); + confirmButton.setOnClickListener(e -> viewModel.onConfirmClicked()); + return view; + } + + @Override + public String getUniqueTag() { + return TAG; + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeState.java b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeState.java new file mode 100644 index 000000000..6aa79aa0c --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeState.java @@ -0,0 +1,8 @@ +package org.briarproject.briar.android.remotewipe.activate; + +public enum ActivateRemoteWipeState { + FAILED, + SUCCESS, + FINISHED, + CANCELLED +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeViewModel.java index 8fa73047a..23555f15f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/remotewipe/activate/ActivateRemoteWipeViewModel.java @@ -2,15 +2,68 @@ package org.briarproject.briar.android.remotewipe.activate; import android.app.Application; +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.briar.android.remotewipe.RemoteWipeSetupState; +import org.briarproject.briar.api.remotewipe.RemoteWipeManager; + +import java.text.Normalizer; + import javax.inject.Inject; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.MutableLiveData; public class ActivateRemoteWipeViewModel extends AndroidViewModel { + + private final RemoteWipeManager remoteWipeManager; + private final DatabaseComponent db; + private final MutableLiveData state = new MutableLiveData<>(); + private ContactId contactId; + @Inject public ActivateRemoteWipeViewModel( - @NonNull Application application) { + @NonNull Application application, + RemoteWipeManager remoteWipeManager, + DatabaseComponent db) { super(application); + this.remoteWipeManager = remoteWipeManager; + this.db = db; + } + + private void activateWipe() { + try { + db.transaction(false, txn -> { + try { + remoteWipeManager.wipe(txn, db.getContact(txn, contactId)); + } catch (DbException e) { + state.postValue(ActivateRemoteWipeState.FAILED); + } catch (FormatException e) { + state.postValue(ActivateRemoteWipeState.FAILED); + } + state.postValue(ActivateRemoteWipeState.SUCCESS); + }); + } catch (DbException e) { + state.postValue(ActivateRemoteWipeState.FAILED); + } + } + + public MutableLiveData getState() { + return state; + } + + public void setContactId(ContactId c) { + contactId = c; + } + + public void onCancelClicked() { + state.postValue(ActivateRemoteWipeState.CANCELLED); + } + + public void onConfirmClicked() { + activateWipe(); } } diff --git a/briar-android/src/main/res/drawable/remote_wipe_activate_explain.xml b/briar-android/src/main/res/drawable/remote_wipe_activate_explain.xml new file mode 100644 index 000000000..54d056345 --- /dev/null +++ b/briar-android/src/main/res/drawable/remote_wipe_activate_explain.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/briar-android/src/main/res/layout/fragment_activate_remote_wipe_explainer.xml b/briar-android/src/main/res/layout/fragment_activate_remote_wipe_explainer.xml new file mode 100644 index 000000000..fd32957b7 --- /dev/null +++ b/briar-android/src/main/res/layout/fragment_activate_remote_wipe_explainer.xml @@ -0,0 +1,70 @@ + + + + + + + + + +