leave channel when bookmark gets deleted

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java    |  2 
src/main/java/eu/siacs/conversations/parser/MessageParser.java           | 33 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 28 
3 files changed, 47 insertions(+), 16 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java 🔗

@@ -105,7 +105,7 @@ public abstract class AbstractGenerator {
         return Base64.encodeToString(sha1, Base64.NO_WRAP);
     }
 
-    public List<String> getFeatures(Account account) {
+    public List<String> getFeatures(final Account account) {
         final XmppConnection connection = account.getXmppConnection();
         final ArrayList<String> features = new ArrayList<>(Arrays.asList(STATIC_FEATURES));
         if (Config.MESSAGE_DISPLAYED_SYNCHRONIZATION) {

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -245,14 +245,27 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             final AxolotlService axolotlService = account.getAxolotlService();
             axolotlService.registerDevices(from, deviceIds);
         } else if (Namespace.BOOKMARKS.equals(node) && account.getJid().asBareJid().equals(from)) {
-            if (account.getXmppConnection().getFeatures().bookmarksConversion()) {
+            final var connection = account.getXmppConnection();
+            if (connection.getFeatures().bookmarksConversion()) {
+                if (connection.getFeatures().bookmarks2()) {
+                    Log.w(
+                            Config.LOGTAG,
+                            account.getJid().asBareJid()
+                                    + ": received storage:bookmark notification even though we opted into bookmarks:1");
+                }
                 final Element i = items.findChild("item");
-                final Element storage = i == null ? null : i.findChild("storage", Namespace.BOOKMARKS);
-                Map<Jid, Bookmark> bookmarks = Bookmark.parseFromStorage(storage, account);
+                final Element storage =
+                        i == null ? null : i.findChild("storage", Namespace.BOOKMARKS);
+                final Map<Jid, Bookmark> bookmarks = Bookmark.parseFromStorage(storage, account);
                 mXmppConnectionService.processBookmarksInitial(account, bookmarks, true);
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": processing bookmark PEP event");
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid() + ": processing bookmark PEP event");
             } else {
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": ignoring bookmark PEP event because bookmark conversion was not detected");
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid()
+                                + ": ignoring bookmark PEP event because bookmark conversion was not detected");
             }
         } else if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
             final Element item = items.findChild("item");
@@ -295,8 +308,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             Log.d(Config.LOGTAG, "parsing nick delete event from " + from);
             setNick(account, from, null);
         } else if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
-            account.setBookmarks(Collections.emptyMap());
             Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": deleted bookmarks node");
+            deleteAllBookmarks(account);
         } else if (Namespace.AVATAR_METADATA.equals(node) && account.getJid().asBareJid().equals(from)) {
             Log.d(Config.LOGTAG,account.getJid().asBareJid()+": deleted avatar metadata node");
         }
@@ -306,11 +319,17 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
         final Element purge = event.findChild("purge");
         final String node = purge == null ? null : purge.getAttribute("node");
         if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
-            account.setBookmarks(Collections.emptyMap());
             Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": purged bookmarks");
+            deleteAllBookmarks(account);
         }
     }
 
+    private void deleteAllBookmarks(final Account account) {
+        final var previous = account.getBookmarkedJids();
+        account.setBookmarks(Collections.emptyMap());
+        mXmppConnectionService.processDeletedBookmarks(account, previous);
+    }
+
     private void setNick(Account account, Jid user, String nick) {
         if (user.asBareJid().equals(account.getJid().asBareJid())) {
             account.setDisplayName(nick);

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -2018,20 +2018,32 @@ public class XmppConnectionService extends Service {
             processModifiedBookmark(bookmark, pep);
         }
         if (pep) {
-            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": " + previousBookmarks.size() + " bookmarks have been removed");
-            for (Jid jid : previousBookmarks) {
-                processDeletedBookmark(account, jid);
-            }
+            processDeletedBookmarks(account, previousBookmarks);
         }
         account.setBookmarks(bookmarks);
     }
 
-    public void processDeletedBookmark(Account account, Jid jid) {
+    public void processDeletedBookmarks(final Account account, final Collection<Jid> bookmarks) {
+        Log.d(
+                Config.LOGTAG,
+                account.getJid().asBareJid()
+                        + ": "
+                        + bookmarks.size()
+                        + " bookmarks have been removed");
+        for (final Jid bookmark : bookmarks) {
+            processDeletedBookmark(account, bookmark);
+        }
+    }
+
+    public void processDeletedBookmark(final Account account, final Jid jid) {
         final Conversation conversation = find(account, jid);
-        if (conversation != null && conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) {
-            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving destroyed conference (" + conversation.getJid() + ") after receiving pep");
-            archiveConversation(conversation, false);
+        if (conversation == null) {
+            return;
         }
+        Log.d(
+                Config.LOGTAG,
+                account.getJid().asBareJid() + ": archiving MUC " + jid + " after PEP update");
+        archiveConversation(conversation, false);
     }
 
     private void processModifiedBookmark(final Bookmark bookmark, final boolean pep) {