From fa3db0f8889f16806c888154a264ae6e94611a6d Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 20 Apr 2022 11:49:05 -0300 Subject: [PATCH 1/4] Add method for unpairing to MailboxManager --- .../bramble/api/mailbox/MailboxManager.java | 7 +++++++ .../api/mailbox/MailboxSettingsManager.java | 2 ++ .../bramble/mailbox/MailboxManagerImpl.java | 14 ++++++++++++++ .../mailbox/MailboxSettingsManagerImpl.java | 11 +++++++++++ 4 files changed, 34 insertions(+) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java index 4276ccbdb..784fff21d 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.api.mailbox; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.IoExecutor; import javax.annotation.Nullable; @@ -41,4 +42,10 @@ public interface MailboxManager { */ boolean checkConnection(); + /** + * Unpairs the owner's mailbox and tries to wipe it. + * As this makes a network call, it should be run on the {@link IoExecutor}. + */ + @IoExecutor + void unPair() throws DbException; } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java index bad4ef71c..e2a4c7110 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java @@ -26,6 +26,8 @@ public interface MailboxSettingsManager { void setOwnMailboxProperties(Transaction txn, MailboxProperties p) throws DbException; + void removeOwnMailboxProperties(Transaction txn) throws DbException; + MailboxStatus getOwnMailboxStatus(Transaction txn) throws DbException; void recordSuccessfulConnection(Transaction txn, long now) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java index ecdf5291f..d17401559 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java @@ -131,4 +131,18 @@ class MailboxManagerImpl implements MailboxManager { }); } + @Override + public void unPair() throws DbException { + MailboxProperties properties = db.transactionWithNullableResult(true, + mailboxSettingsManager::getOwnMailboxProperties); + try { + api.wipeMailbox(properties); + } catch (IOException | MailboxApi.ApiException e) { + // We wipe on a best-effort basis. + // If we can't do it, we still unpair. + logException(LOG, WARNING, e); + } + db.transaction(false, + mailboxSettingsManager::removeOwnMailboxProperties); + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java index a93117870..29a7fa33b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java @@ -75,6 +75,17 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager { } } + @Override + public void removeOwnMailboxProperties(Transaction txn) throws DbException { + Settings s = new Settings(); + s.put(SETTINGS_KEY_ONION, ""); + s.put(SETTINGS_KEY_TOKEN, ""); + settingsManager.mergeSettings(txn, s, SETTINGS_NAMESPACE); + for (MailboxHook hook : hooks) { + hook.mailboxUnpaired(txn); + } + } + @Override public MailboxStatus getOwnMailboxStatus(Transaction txn) throws DbException { From fa3a5be083e1382d76043f172fda42bb7f1a161f Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 20 Apr 2022 11:49:57 -0300 Subject: [PATCH 2/4] Implement UI for unpairing the mailbox --- .../mailbox/MailboxStatusFragment.java | 28 +++++++++++++++---- .../android/mailbox/MailboxViewModel.java | 13 +++++++++ .../res/layout/fragment_mailbox_status.xml | 11 ++++++++ briar-android/src/main/res/values/strings.xml | 2 ++ 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java index 921081964..fd678fa88 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java @@ -12,7 +12,6 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import android.widget.Toast; import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; @@ -25,6 +24,7 @@ import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import androidx.annotation.UiThread; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; @@ -57,6 +57,8 @@ public class MailboxStatusFragment extends Fragment { private ImageView imageView; private TextView statusTitleView; private TextView statusInfoView; + private Button unlinkButton; + private ProgressBar unlinkProgress; @Override public void onAttach(Context context) { @@ -101,10 +103,9 @@ public class MailboxStatusFragment extends Fragment { // TODO // * Implement UI for warning user when mailbox is unreachable #2175 - // * add "Unlink" button confirmation dialog and functionality #2173 - Button unlinkButton = v.findViewById(R.id.unlinkButton); - unlinkButton.setOnClickListener(view -> Toast.makeText(requireContext(), - "NOT IMPLEMENTED", Toast.LENGTH_SHORT).show()); + unlinkButton = v.findViewById(R.id.unlinkButton); + unlinkProgress = v.findViewById(R.id.unlinkProgress); + unlinkButton.setOnClickListener(view -> onUnlinkButtonClicked()); } @Override @@ -167,4 +168,21 @@ public class MailboxStatusFragment extends Fragment { } } + private void onUnlinkButtonClicked() { + AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(), + R.style.BriarDialogTheme); + builder.setTitle(R.string.mailbox_status_unlink_dialog_title); + builder.setMessage(R.string.mailbox_status_unlink_dialog_message); + builder.setPositiveButton(R.string.cancel, + (dialog, which) -> dialog.cancel()); + builder.setNegativeButton(R.string.mailbox_status_unlink_button, + (dialog, which) -> { + beginDelayedTransition((ViewGroup) requireView()); + unlinkButton.setVisibility(INVISIBLE); + unlinkProgress.setVisibility(VISIBLE); + viewModel.unlink(); + }); + builder.show(); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java index 3a47e1393..eeacb180e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java @@ -6,6 +6,7 @@ import com.google.zxing.Result; import org.briarproject.bramble.api.Consumer; import org.briarproject.bramble.api.db.DatabaseExecutor; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; @@ -220,6 +221,18 @@ class MailboxViewModel extends DbViewModel return liveData; } + @UiThread + void unlink() { + ioExecutor.execute(() -> { + try { + mailboxManager.unPair(); + pairingState.postEvent(new MailboxState.NotSetup()); + } catch (DbException e) { + handleException(e); + } + }); + } + @UiThread LiveEvent getPairingState() { return pairingState; diff --git a/briar-android/src/main/res/layout/fragment_mailbox_status.xml b/briar-android/src/main/res/layout/fragment_mailbox_status.xml index 098c71d7c..63b2e80df 100644 --- a/briar-android/src/main/res/layout/fragment_mailbox_status.xml +++ b/briar-android/src/main/res/layout/fragment_mailbox_status.xml @@ -83,4 +83,15 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index f38a3639f..58ac7813b 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -651,6 +651,8 @@ Never Unlink + Unlink mailbox? + Unlinking a working Mailbox will result in message delivery issues, even when relinking it later again. Disappearing messages From 9d19761dbefd92778b92b8629b975a89850a5809 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 26 Apr 2022 15:26:09 -0300 Subject: [PATCH 3/4] Tweak mailbox unlink dialog warning --- .../briar/android/mailbox/MailboxStatusFragment.java | 2 +- briar-android/src/main/res/values/strings.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java index fd678fa88..6051e9e22 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java @@ -172,7 +172,7 @@ public class MailboxStatusFragment extends Fragment { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(), R.style.BriarDialogTheme); builder.setTitle(R.string.mailbox_status_unlink_dialog_title); - builder.setMessage(R.string.mailbox_status_unlink_dialog_message); + builder.setMessage(R.string.mailbox_status_unlink_dialog_question); builder.setPositiveButton(R.string.cancel, (dialog, which) -> dialog.cancel()); builder.setNegativeButton(R.string.mailbox_status_unlink_button, diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 58ac7813b..ad98a1a7d 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -652,7 +652,8 @@ Never Unlink Unlink mailbox? - Unlinking a working Mailbox will result in message delivery issues, even when relinking it later again. + Are you sure you want to unlink your Mailbox? + If you unlink your Mailbox, you won\'t be able to receive messages while Briar is offline. Disappearing messages From d080af4b7a2353fa298dff60ccf7b60058e40032 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 27 Apr 2022 08:07:12 -0300 Subject: [PATCH 4/4] Show a warning before unlinking the mailbox when there haven't been any connection failures --- .../android/mailbox/MailboxStatusFragment.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java index 6051e9e22..555e23d79 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java @@ -53,6 +53,7 @@ public class MailboxStatusFragment extends Fragment { private final Handler handler = new Handler(Looper.getMainLooper()); @Nullable // UiThread private Runnable refresher = null; + private boolean showUnlinkWarning = true; private ImageView imageView; private TextView statusTitleView; @@ -105,7 +106,9 @@ public class MailboxStatusFragment extends Fragment { // * Implement UI for warning user when mailbox is unreachable #2175 unlinkButton = v.findViewById(R.id.unlinkButton); unlinkProgress = v.findViewById(R.id.unlinkProgress); - unlinkButton.setOnClickListener(view -> onUnlinkButtonClicked()); + unlinkButton.setOnClickListener(view -> + onUnlinkButtonClicked(showUnlinkWarning) + ); } @Override @@ -131,14 +134,17 @@ public class MailboxStatusFragment extends Fragment { iconRes = R.drawable.ic_check_circle_outline; title = getString(R.string.mailbox_status_connected_title); tintRes = R.color.briar_brand_green; + showUnlinkWarning = true; } else if (status.getAttemptsSinceSuccess() < NUM_FAILURES) { iconRes = R.drawable.ic_help_outline_white; title = getString(R.string.mailbox_status_problem_title); tintRes = R.color.briar_orange_500; + showUnlinkWarning = false; } else { tintRes = R.color.briar_red_500; title = getString(R.string.mailbox_status_failure_title); iconRes = R.drawable.alerts_and_states_error; + showUnlinkWarning = false; } imageView.setImageResource(iconRes); int color = getColor(requireContext(), tintRes); @@ -168,11 +174,16 @@ public class MailboxStatusFragment extends Fragment { } } - private void onUnlinkButtonClicked() { + private void onUnlinkButtonClicked(boolean showWarning) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(), R.style.BriarDialogTheme); builder.setTitle(R.string.mailbox_status_unlink_dialog_title); - builder.setMessage(R.string.mailbox_status_unlink_dialog_question); + String msg = getString(R.string.mailbox_status_unlink_dialog_question); + if (showWarning) { + msg = getString(R.string.mailbox_status_unlink_dialog_warning) + + "\n\n" + msg; + } + builder.setMessage(msg); builder.setPositiveButton(R.string.cancel, (dialog, which) -> dialog.cancel()); builder.setNegativeButton(R.string.mailbox_status_unlink_button,