From d40e619cab92006c13a256590a1ed5cbf3bd7db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Sch=C3=A4ttgen?= Date: Wed, 11 Sep 2024 12:24:50 +0200 Subject: [PATCH] Add ability to reorder groups --- .../aegis/ui/GroupManagerActivity.java | 65 ++++++++----------- .../aegis/ui/views/GroupAdapter.java | 20 +++++- .../aegis/vault/VaultRepository.java | 7 +- app/src/main/res/layout/card_group.xml | 1 + 4 files changed, 53 insertions(+), 40 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 b9c09312..b2872e72 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/GroupManagerActivity.java @@ -7,6 +7,7 @@ import android.view.View; import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -14,13 +15,9 @@ 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; @@ -30,7 +27,6 @@ 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; @@ -51,32 +47,45 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. getOnBackPressedDispatcher().addCallback(this, _backPressHandler); _removedGroups = new HashSet<>(); - _renamedGroups = new HashSet<>(); if (savedInstanceState != null) { 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 - } - } - } } + ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { + @Override + public int getMovementFlags( + @NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder viewHolder) { + + return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + int draggedItemIndex = viewHolder.getBindingAdapterPosition(); + int targetIndex = target.getBindingAdapterPosition(); + + _adapter.onItemMove(draggedItemIndex, targetIndex); + + return true; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { } + }); + _adapter = new GroupAdapter(this); _groupsView = findViewById(R.id.list_groups); LinearLayoutManager layoutManager = new LinearLayoutManager(this); _groupsView.setLayoutManager(layoutManager); _groupsView.setAdapter(_adapter); _groupsView.setNestedScrollingEnabled(false); + touchHelper.attachToRecyclerView(_groupsView); for (VaultGroup group : _vaultManager.getVault().getGroups()) { if (!_removedGroups.contains(group.getUUID())) { @@ -84,11 +93,6 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. } } - for(VaultGroup group: _renamedGroups) { - _adapter.replaceGroup(group.getUUID(), group); - } - - _emptyStateView = findViewById(R.id.vEmptyList); updateEmptyState(); } @@ -100,12 +104,7 @@ 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); } @@ -116,7 +115,6 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. if (!newGroupName.isEmpty()) { VaultGroup newGroup = Cloner.clone(group); newGroup.setName(newGroupName); - _renamedGroups.add(newGroup); _adapter.replaceGroup(group.getUUID(), newGroup); _backPressHandler.setEnabled(true); } @@ -166,23 +164,16 @@ public class GroupManagerActivity extends AegisActivity implements GroupAdapter. for (UUID uuid : _removedGroups) { _vaultManager.getVault().removeGroup(uuid); } - - saveAndBackupVault(); } - if (!_renamedGroups.isEmpty()) { - _renamedGroups.removeIf(group -> _removedGroups.contains(group.getUUID())); - for (VaultGroup renamedGroup : _renamedGroups) { - _vaultManager.getVault().renameGroup(renamedGroup); - } - saveAndBackupVault(); - } + _vaultManager.getVault().replaceGroups(_adapter.getGroups()); + saveAndBackupVault(); finish(); } private void discardAndFinish() { - if (_removedGroups.isEmpty() && _renamedGroups.isEmpty()) { + if (_removedGroups.isEmpty()) { finish(); return; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/GroupAdapter.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/GroupAdapter.java index 2dca0cb6..0e3346fc 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/GroupAdapter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/GroupAdapter.java @@ -7,12 +7,14 @@ import android.view.ViewGroup; import androidx.recyclerview.widget.RecyclerView; import com.beemdevelopment.aegis.R; +import com.beemdevelopment.aegis.helpers.ItemTouchHelperAdapter; +import com.beemdevelopment.aegis.util.CollectionUtils; import com.beemdevelopment.aegis.vault.VaultGroup; import java.util.ArrayList; import java.util.UUID; -public class GroupAdapter extends RecyclerView.Adapter { +public class GroupAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter { private GroupAdapter.Listener _listener; private ArrayList _groups; @@ -32,6 +34,10 @@ public class GroupAdapter extends RecyclerView.Adapter { } } + public ArrayList getGroups() { + return _groups; + } + public void replaceGroup(UUID uuid, VaultGroup newGroup) { VaultGroup oldGroup = getGroupByUUID(uuid); int position = _groups.indexOf(oldGroup); @@ -64,6 +70,18 @@ public class GroupAdapter extends RecyclerView.Adapter { }); } + @Override + public void onItemMove(int firstPosition, int secondPosition) { + CollectionUtils.move(_groups, firstPosition, secondPosition); + notifyItemMoved(firstPosition, secondPosition); + } + + @Override + public void onItemDismiss(int position) { } + + @Override + public void onItemDrop(int position) { } + private VaultGroup getGroupByUUID(UUID uuid) { for (VaultGroup group : _groups) { if (group.getUUID().equals(uuid)) { diff --git a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultRepository.java b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultRepository.java index 4044a6fe..b96522f0 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/vault/VaultRepository.java +++ b/app/src/main/java/com/beemdevelopment/aegis/vault/VaultRepository.java @@ -291,8 +291,11 @@ public class VaultRepository { removeGroup(group); } - public void renameGroup(VaultGroup renamedGroup) { - _vault.getGroups().replace(renamedGroup); + public void replaceGroups(Collection groups) { + _vault.getGroups().wipe(); + for (VaultGroup group : groups) { + _vault.getGroups().add(group); + } } public void removeGroup(VaultGroup group) { diff --git a/app/src/main/res/layout/card_group.xml b/app/src/main/res/layout/card_group.xml index 75eec71a..9e867e7e 100644 --- a/app/src/main/res/layout/card_group.xml +++ b/app/src/main/res/layout/card_group.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/colorBackground" android:orientation="horizontal">