From a582c2053c43719945bc6d01ff60ea43a0af8b0b Mon Sep 17 00:00:00 2001 From: Praveen Kumar Date: Tue, 9 Apr 2024 12:33:37 +0530 Subject: [PATCH] Renaming of Groups --- .../aegis/ui/GroupManagerActivity.java | 59 +++++++++++++++++-- .../aegis/ui/dialogs/Dialogs.java | 21 ++++--- .../aegis/ui/views/GroupAdapter.java | 22 +++++++ .../aegis/ui/views/GroupHolder.java | 6 ++ .../aegis/vault/VaultRepository.java | 4 ++ app/src/main/res/layout/card_group.xml | 47 +++++++++------ app/src/main/res/values/strings.xml | 1 + 7 files changed, 130 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java index eb202f6d..b9c09312 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java @@ -13,9 +13,14 @@ import androidx.recyclerview.widget.RecyclerView; import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.ui.dialogs.Dialogs; import com.beemdevelopment.aegis.ui.views.GroupAdapter; +import com.beemdevelopment.aegis.util.Cloner; +import com.beemdevelopment.aegis.vault.VaultEntryException; import com.beemdevelopment.aegis.vault.VaultGroup; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -25,6 +30,7 @@ import java.util.UUID; public class GroupManagerActivity extends AegisActivity implements GroupAdapter.Listener { private GroupAdapter _adapter; private HashSet _removedGroups; + private HashSet _renamedGroups; private RecyclerView _groupsView; private View _emptyStateView; private BackPressHandler _backPressHandler; @@ -45,13 +51,24 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. getOnBackPressedDispatcher().addCallback(this, _backPressHandler); _removedGroups = new HashSet<>(); + _renamedGroups = new HashSet<>(); if (savedInstanceState != null) { - List groups = savedInstanceState.getStringArrayList("removedGroups"); - if (groups != null) { - for (String uuid : groups) { + List removedGroups = savedInstanceState.getStringArrayList("removedGroups"); + List renamedGroups = savedInstanceState.getStringArrayList("renamedGroups"); + if (removedGroups != null) { + for (String uuid : removedGroups) { _removedGroups.add(UUID.fromString(uuid)); } } + if (renamedGroups != null) { + for (String groupObject : renamedGroups) { + try { + _renamedGroups.add(VaultGroup.fromJson(new JSONObject(groupObject))); + } catch (VaultEntryException | JSONException ignored) { + // This is intentionally ignored since the json object is valid + } + } + } } _adapter = new GroupAdapter(this); @@ -67,6 +84,11 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. } } + for(VaultGroup group: _renamedGroups) { + _adapter.replaceGroup(group.getUUID(), group); + } + + _emptyStateView = findViewById(R.id.vEmptyList); updateEmptyState(); } @@ -78,10 +100,31 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. for (UUID uuid : _removedGroups) { removed.add(uuid.toString()); } + ArrayList renamed = new ArrayList<>(); + for (VaultGroup group : _renamedGroups) { + renamed.add(group.toJson().toString()); + } + outState.putStringArrayList("renamedGroups", renamed); outState.putStringArrayList("removedGroups", removed); } + @Override + public void onEditGroup(VaultGroup group) { + Dialogs.TextInputListener onEditGroup = text -> { + String newGroupName = new String(text).trim(); + if (!newGroupName.isEmpty()) { + VaultGroup newGroup = Cloner.clone(group); + newGroup.setName(newGroupName); + _renamedGroups.add(newGroup); + _adapter.replaceGroup(group.getUUID(), newGroup); + _backPressHandler.setEnabled(true); + } + }; + + Dialogs.showTextInputDialog(GroupManagerActivity.this, R.string.rename_group, R.string.group_name_hint, onEditGroup, group.getName()); + } + @Override public void onRemoveGroup(VaultGroup group) { Dialogs.showSecureDialog(new MaterialAlertDialogBuilder(this, R.style.ThemeOverlay_Aegis_AlertDialog_Warning) @@ -126,12 +169,20 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. saveAndBackupVault(); } + if (!_renamedGroups.isEmpty()) { + _renamedGroups.removeIf(group -> _removedGroups.contains(group.getUUID())); + for (VaultGroup renamedGroup : _renamedGroups) { + _vaultManager.getVault().renameGroup(renamedGroup); + } + + saveAndBackupVault(); + } finish(); } private void discardAndFinish() { - if (_removedGroups.isEmpty()) { + if (_removedGroups.isEmpty() && _renamedGroups.isEmpty()) { finish(); return; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java index 7bede047..4d14908d 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/dialogs/Dialogs.java @@ -188,10 +188,13 @@ public class Dialogs { showSecureDialog(dialog); } - private static void showTextInputDialog(Context context, @StringRes int titleId, @StringRes int messageId, @StringRes int hintId, TextInputListener listener, DialogInterface.OnCancelListener cancelListener, boolean isSecret) { + private static void showTextInputDialog(Context context, @StringRes int titleId, @StringRes int messageId, @StringRes int hintId, TextInputListener listener, DialogInterface.OnCancelListener cancelListener, boolean isSecret,@Nullable String hint) { final AtomicReference