@@ -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) {
@@ -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);
@@ -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) {