diff --git a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java b/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java index 905b08286149639b7dc4bea7ff97c63763e95105..9d94813e72b26c6b97316c5dead77d30d812ccb4 100644 --- a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java +++ b/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 getFeatures(Account account) { + public List getFeatures(final Account account) { final XmppConnection connection = account.getXmppConnection(); final ArrayList features = new ArrayList<>(Arrays.asList(STATIC_FEATURES)); if (Config.MESSAGE_DISPLAYED_SYNCHRONIZATION) { diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index ec8601bf0622afc6c05d6efc5ea9682e4d65c62d..6accc1f12a01ff880d2b6e86191e6c7856930ddb 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/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 bookmarks = Bookmark.parseFromStorage(storage, account); + final Element storage = + i == null ? null : i.findChild("storage", Namespace.BOOKMARKS); + final Map 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); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ce45d9083ce69ae32d17477d5d6c99194e1525ea..89efa949a3185ec722b4def9abccfe7a97b2e5e6 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/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 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) {