archive destoryed mucs when registering that bookmark has been removed

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Account.java               | 12 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 15 
2 files changed, 25 insertions(+), 2 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Account.java 🔗

@@ -13,6 +13,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 
@@ -472,6 +473,17 @@ public class Account extends AbstractEntity {
         this.bookmarks = bookmarks;
     }
 
+    public Set<Jid> getBookmarkedJids() {
+        final Set<Jid> jids = new HashSet<>();
+        for(final Bookmark bookmark : this.bookmarks) {
+            final Jid jid = bookmark.getJid();
+            if (jid != null) {
+                jids.add(jid.asBareJid());
+            }
+        }
+        return jids;
+    }
+
     public boolean hasBookmarkFor(final Jid conferenceJid) {
         return getBookmark(conferenceJid) != null;
     }

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

@@ -1410,6 +1410,7 @@ public class XmppConnectionService extends Service {
     }
 
     public void processBookmarks(Account account, Element storage, final boolean pep) {
+        final Set<Jid> previousBookmarks = account.getBookmarkedJids();
         final HashMap<Jid, Bookmark> bookmarks = new HashMap<>();
         final boolean synchronizeWithBookmarks = synchronizeWithBookmarks();
         if (storage != null) {
@@ -1423,6 +1424,7 @@ public class XmppConnectionService extends Service {
                     if (bookmark.getJid() == null) {
                         continue;
                     }
+                    previousBookmarks.remove(bookmark.getJid().asBareJid());
                     Conversation conversation = find(bookmark);
                     if (conversation != null) {
                         if (conversation.getMode() != Conversation.MODE_MULTI) {
@@ -1439,6 +1441,16 @@ public class XmppConnectionService extends Service {
                     }
                 }
             }
+            if (pep && synchronizeWithBookmarks) {
+                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": " + previousBookmarks.size() + " bookmarks have been removed");
+                for (Jid jid : previousBookmarks) {
+                    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);
+                    }
+                }
+            }
         }
         account.setBookmarks(new CopyOnWriteArrayList<>(bookmarks.values()));
     }
@@ -1479,8 +1491,7 @@ public class XmppConnectionService extends Service {
     }
 
 	private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final Bundle options, final boolean retry) {
-        IqPacket packet = mIqGenerator.publishElement(node, element, options);
-        Log.d(Config.LOGTAG,packet.toString());
+        final IqPacket packet = mIqGenerator.publishElement(node, element, options);
         sendIqPacket(account, packet, (a, response) -> {
             if (response.getType() == IqPacket.TYPE.RESULT) {
                 return;