From 22c93bf5c6bfd14a7254460fde6bd06c22eb3cd7 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sun, 24 Jan 2021 14:20:29 +0100 Subject: [PATCH] Show some additional warning info in the entry deletion dialog Close #565. --- .../com/beemdevelopment/aegis/ui/Dialogs.java | 23 +++++++++---------- .../aegis/ui/EditEntryActivity.java | 5 ++-- .../aegis/ui/MainActivity.java | 8 ++----- .../main/res/layout/dialog_delete_entry.xml | 21 +++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/layout/dialog_delete_entry.xml diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java index b38982ae..acbb6c52 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java @@ -10,6 +10,7 @@ import android.content.res.ColorStateList; import android.graphics.Color; import android.text.Editable; import android.text.InputType; +import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.PasswordTransformationMethod; import android.view.LayoutInflater; @@ -28,6 +29,7 @@ import android.widget.TextView; import androidx.activity.ComponentActivity; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; +import androidx.core.text.HtmlCompat; import com.beemdevelopment.aegis.Preferences; import com.beemdevelopment.aegis.R; @@ -64,28 +66,25 @@ public class Dialogs { dialog.show(); } - public static void showDeleteEntryDialog(Activity activity, DialogInterface.OnClickListener onDelete) { - showSecureDialog(new AlertDialog.Builder(activity) - .setTitle(activity.getString(R.string.delete_entry)) - .setMessage(activity.getString(R.string.delete_entry_description)) - .setPositiveButton(android.R.string.yes, onDelete) - .setNegativeButton(android.R.string.no, null) - .create()); - } + public static void showDeleteEntriesDialog(Activity activity, List services, DialogInterface.OnClickListener onDelete) { + View view = activity.getLayoutInflater().inflate(R.layout.dialog_delete_entry, null); + TextView textMessage = view.findViewById(R.id.text_message); + TextView textExplanation = view.findViewById(R.id.text_explanation); + textExplanation.setText(HtmlCompat.fromHtml(activity.getString(R.string.delete_entry_explanation, TextUtils.join(", ", services)), HtmlCompat.FROM_HTML_MODE_COMPACT)); - public static void showDeleteEntriesDialog(Activity activity, DialogInterface.OnClickListener onDelete, int totalEntries) { String title, message; - if (totalEntries > 1) { + if (services.size() > 1) { title = activity.getString(R.string.delete_entries); - message = activity.getResources().getQuantityString(R.plurals.delete_entries_description, totalEntries, totalEntries); + message = activity.getResources().getQuantityString(R.plurals.delete_entries_description, services.size(), services.size()); } else { title = activity.getString(R.string.delete_entry); message = activity.getString(R.string.delete_entry_description); } + textMessage.setText(message); showSecureDialog(new AlertDialog.Builder(activity) .setTitle(title) - .setMessage(message) + .setView(view) .setPositiveButton(android.R.string.yes, onDelete) .setNegativeButton(android.R.string.no, null) .create()); diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index 4768d041..c7e893e8 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -30,8 +30,8 @@ import com.avito.android.krop.KropView; import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.encoding.Base32; import com.beemdevelopment.aegis.encoding.EncodingException; -import com.beemdevelopment.aegis.helpers.EditTextHelper; import com.beemdevelopment.aegis.helpers.DropdownHelper; +import com.beemdevelopment.aegis.helpers.EditTextHelper; import com.beemdevelopment.aegis.helpers.TextDrawableHelper; import com.beemdevelopment.aegis.otp.GoogleAuthInfo; import com.beemdevelopment.aegis.otp.HotpInfo; @@ -51,6 +51,7 @@ import com.google.android.material.textfield.TextInputLayout; import java.io.ByteArrayOutputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.TreeSet; import java.util.UUID; @@ -345,7 +346,7 @@ public class EditEntryActivity extends AegisActivity { onSave(); break; case R.id.action_delete: - Dialogs.showDeleteEntryDialog(this, (dialog, which) -> { + Dialogs.showDeleteEntriesDialog(this, Collections.singletonList(_origEntry.getIssuer()), (dialog, which) -> { deleteAndFinish(_origEntry); }); break; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java index abb6db59..1863ac53 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -13,7 +13,6 @@ import android.provider.Settings; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.SubMenu; import android.view.View; import android.widget.LinearLayout; import android.widget.Toast; @@ -41,8 +40,6 @@ import com.beemdevelopment.aegis.vault.VaultManager; import com.beemdevelopment.aegis.vault.VaultManagerException; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.chip.Chip; -import com.google.android.material.chip.ChipGroup; import com.google.zxing.BinaryBitmap; import com.google.zxing.ChecksumException; import com.google.zxing.FormatException; @@ -58,7 +55,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import java.util.TreeSet; import java.util.UUID; import java.util.stream.Collectors; @@ -777,7 +773,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene return true; case R.id.action_delete: - Dialogs.showDeleteEntriesDialog(MainActivity.this, (d, which) -> { + Dialogs.showDeleteEntriesDialog(MainActivity.this, _selectedEntries.stream().map(VaultEntry::getIssuer).collect(Collectors.toList()), (d, which) -> { deleteEntries(_selectedEntries); for (VaultEntry entry : _selectedEntries) { @@ -789,7 +785,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene } mode.finish(); - }, _selectedEntries.size()); + }); return true; default: return false; diff --git a/app/src/main/res/layout/dialog_delete_entry.xml b/app/src/main/res/layout/dialog_delete_entry.xml new file mode 100644 index 00000000..fb8b01ed --- /dev/null +++ b/app/src/main/res/layout/dialog_delete_entry.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45817d11..4fb376a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,6 +150,7 @@ Exporting the vault Delete entry Are you sure you want to delete this entry? + This action does not disable 2FA for %s. To prevent losing access, make sure that you have disabled 2FA or that you have an alternative way to generate codes for this service. Delete entries Are you sure you want to delete %d entry?