From b9952f27fd4c7c364de71252e57000511ef71965 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 3 Jan 2019 14:07:03 +0100 Subject: [PATCH] archive destoryed mucs when registering that bookmark has been removed --- .../eu/siacs/conversations/entities/Account.java | 12 ++++++++++++ .../services/XmppConnectionService.java | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 1fe74a6c8..08cb46026 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/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 getBookmarkedJids() { + final Set 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; } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 0ef192b94..f7e9cf4a7 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/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 previousBookmarks = account.getBookmarkedJids(); final HashMap 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;