Allow multi-select tags

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java | 43 
1 file changed, 35 insertions(+), 8 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java 🔗

@@ -173,7 +173,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
     private int mRequestCode = -1;
     private com.mikepenz.materialdrawer.widget.AccountHeaderView accountHeader;
     private Bundle savedState = null;
-    private Tag selectedTag = null;
+    private HashSet<Tag> selectedTag = new HashSet<>();
     private long mainFilter = DRAWER_ALL_CHATS;
     private boolean refreshAccounts = true;
 
@@ -445,14 +445,14 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
 
         if (useSavedState != null) {
             mainFilter = useSavedState.getLong("mainFilter", DRAWER_ALL_CHATS);
-            selectedTag = (Tag) useSavedState.getSerializable("selectedTag");
+            selectedTag = (HashSet<Tag>) useSavedState.getSerializable("selectedTag");
         }
         refreshUiReal();
         if (useSavedState != null) binding.drawer.setSavedInstance(useSavedState);
         accountHeader.attachToSliderView(binding.drawer);
         if (useSavedState != null) accountHeader.withSavedInstance(useSavedState);
 
-        if (mainFilter == DRAWER_ALL_CHATS && selectedTag == null) {
+        if (mainFilter == DRAWER_ALL_CHATS && selectedTag.isEmpty()) {
             binding.drawer.setSelectedItemIdentifier(DRAWER_ALL_CHATS);
         }
 
@@ -473,11 +473,14 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
             } else if (id == DRAWER_START_CHAT_DISCOVER) {
                 launchStartConversation(R.id.discover_public_channels);
             } else if (id == DRAWER_ALL_CHATS || id == DRAWER_UNREAD_CHATS || id == DRAWER_DIRECT_MESSAGES || id == DRAWER_CHANNELS) {
-                selectedTag = null;
+                selectedTag.clear();
                 mainFilter = id;
                 binding.drawer.getSelectExtension().deselect();
             } else if (id >= 1000) {
-                selectedTag = (Tag) drawerItem.getTag();
+                selectedTag.clear();
+                selectedTag.add((Tag) drawerItem.getTag());
+                binding.drawer.getSelectExtension().deselect();
+                binding.drawer.getSelectExtension().select(pos, false, true);
             }
             binding.drawer.getSelectExtension().selectByIdentifier(mainFilter, false, true);
 
@@ -494,6 +497,28 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
             return false;
         });
 
+        binding.drawer.setOnDrawerItemLongClickListener((v, drawerItem, pos) -> {
+            final var id = drawerItem.getIdentifier();
+            if (id == DRAWER_ALL_CHATS || id == DRAWER_UNREAD_CHATS || id == DRAWER_DIRECT_MESSAGES || id == DRAWER_CHANNELS) {
+                selectedTag.clear();
+                mainFilter = id;
+                binding.drawer.getSelectExtension().deselect();
+            } else if (id >= 1000) {
+                final var tag = (Tag) drawerItem.getTag();
+                if (selectedTag.contains(tag)) {
+                    selectedTag.remove(tag);
+                    binding.drawer.getSelectExtension().deselect(pos);
+                } else {
+                    selectedTag.add(tag);
+                    binding.drawer.getSelectExtension().select(pos, false, true);
+                }
+            }
+            binding.drawer.getSelectExtension().selectByIdentifier(mainFilter, false, true);
+
+            refreshUi();
+            return true;
+        });
+
          accountHeader.setOnAccountHeaderListener((v, profile, isCurrent) -> {
             final var id = profile.getIdentifier();
             if (isCurrent) return false; // Ignore switching to already selected profile
@@ -590,8 +615,10 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
                 list.remove(c);
             } else if (selectedAccount != null && !selectedAccount.equals(c.getAccount().getUuid())) {
                 list.remove(c);
-            } else if (selectedTag != null && tagFilter && !c.getTags(this).contains(selectedTag)) {
-                list.remove(c);
+            } else if (!selectedTag.isEmpty() && tagFilter) {
+                final var tags = new HashSet<>(c.getTags(this));
+                tags.retainAll(selectedTag);
+                if (tags.isEmpty()) list.remove(c);
             }
         }
     }
@@ -602,7 +629,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
     }
 
     public void launchStartConversation(int goTo) {
-        StartConversationActivity.launch(this, (Account) accountHeader.getActiveProfile().getTag(), selectedTag == null ? null : selectedTag.getName(), goTo);
+        StartConversationActivity.launch(this, (Account) accountHeader.getActiveProfile().getTag(), selectedTag.stream().map(tag -> tag.getName()).collect(Collectors.joining(", ")), goTo);
     }
 
     private boolean performRedirectIfNecessary(boolean noAnimation) {