diff options
author | Christian Schneppe <christian.schneppe@pix-art.de> | 2019-10-26 17:48:13 +0200 |
---|---|---|
committer | Christian Schneppe <christian.schneppe@pix-art.de> | 2019-10-26 17:48:13 +0200 |
commit | 6df9c91b30c01beeb5d3f25d68f599e0dbe4c319 (patch) | |
tree | ee22edb2587cae2748db3b93878e392a619a3e91 /src/main/java/de/pixart/messenger/services | |
parent | 5e41a659b7256c46667086cf690c428f7c764a4c (diff) |
WIP Bookmarks 2 support
Diffstat (limited to 'src/main/java/de/pixart/messenger/services')
-rw-r--r-- | src/main/java/de/pixart/messenger/services/XmppConnectionService.java | 136 |
1 files changed, 76 insertions, 60 deletions
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 432ad0fdf..b2ae329c8 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -68,7 +68,6 @@ import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; @@ -339,9 +338,10 @@ public class XmppConnectionService extends Service { mJingleConnectionManager.cancelInTransmission(); mQuickConversationsService.considerSyncBackground(false); fetchRosterFromServer(account); - if (!account.getXmppConnection().getFeatures().bookmarksConversion()) { + fetchBookmarks2(account); + /*if (!account.getXmppConnection().getFeatures().bookmarksConversion()) { fetchBookmarks(account); - } + }*/ final boolean flexible = account.getXmppConnection().getFeatures().flexibleOfflineMessageRetrieval(); final boolean catchup = getMessageArchiveService().inCatchup(account); if (flexible && catchup && account.getXmppConnection().isMamPreferenceAlways()) { @@ -1802,7 +1802,8 @@ public class XmppConnectionService extends Service { if (response.getType() == IqPacket.TYPE.RESULT) { final Element query1 = response.query(); final Element storage = query1.findChild("storage", "storage:bookmarks"); - processBookmarks(a, storage, false); + Collection<Bookmark> bookmarks = Bookmark.parseFromStorage(storage, account); + processBookmarksInitial(a, bookmarks, false); } else { Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": could not fetch bookmarks"); } @@ -1810,59 +1811,62 @@ public class XmppConnectionService extends Service { sendIqPacket(account, iqPacket, callback); } - public void processBookmarks(Account account, Element storage, final boolean pep) { + public void fetchBookmarks2(final Account account) { + final IqPacket retrieve = mIqGenerator.retrieveBookmarks(); + sendIqPacket(account, retrieve, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(final Account account, final IqPacket response) { + if (response.getType() == IqPacket.TYPE.RESULT) { + final Element pubsub = response.findChild("pubsub", Namespace.PUBSUB); + final Collection<Bookmark> bookmarks = Bookmark.parseFromPubsub(pubsub, account); + Log.d(Config.LOGTAG, "bookmarks2 " + pubsub); + Log.d(Config.LOGTAG, "bookmarks2" + bookmarks); + processBookmarksInitial(account, bookmarks, true); + } + } + }); + } + + public void processBookmarksInitial(Account account, Collection<Bookmark> bookmarks, final boolean pep) { final Set<Jid> previousBookmarks = account.getBookmarkedJids(); - final HashMap<Jid, Bookmark> bookmarks = new HashMap<>(); final boolean synchronizeWithBookmarks = synchronizeWithBookmarks(); - if (storage != null) { - for (final Element item : storage.getChildren()) { - if (item.getName().equals("conference")) { - final Bookmark bookmark = Bookmark.parse(item, account); - Bookmark old = bookmarks.put(bookmark.getJid(), bookmark); - if (old != null && old.getBookmarkName() != null && bookmark.getBookmarkName() == null) { - bookmark.setBookmarkName(old.getBookmarkName()); - } - if (bookmark.getJid() == null) { - continue; - } - previousBookmarks.remove(bookmark.getJid().asBareJid()); - Conversation conversation = find(bookmark); - if (conversation != null) { - if (conversation.getMode() != Conversation.MODE_MULTI) { - continue; - } - bookmark.setConversation(conversation); - if (pep && synchronizeWithBookmarks && !bookmark.autojoin()) { - Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving conference (" + conversation.getJid() + ") after receiving pep"); - archiveConversation(conversation, false); - } - } else if (synchronizeWithBookmarks && bookmark.autojoin()) { - conversation = findOrCreateConversation(account, bookmark.getFullJid(), true, true, false); - bookmark.setConversation(conversation); - } + for (Bookmark bookmark : bookmarks) { + previousBookmarks.remove(bookmark.getJid().asBareJid()); + Conversation conversation = find(bookmark); + if (conversation != null) { + if (conversation.getMode() != Conversation.MODE_MULTI) { + continue; } + bookmark.setConversation(conversation); + if (pep && synchronizeWithBookmarks && !bookmark.autojoin()) { + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving conference (" + conversation.getJid() + ") after receiving pep"); + archiveConversation(conversation, false); + } + } else if (synchronizeWithBookmarks && bookmark.autojoin()) { + conversation = findOrCreateConversation(account, bookmark.getFullJid(), true, true, false); + bookmark.setConversation(conversation); } - 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); - } + } + 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())); + account.setBookmarks(new CopyOnWriteArrayList<>(bookmarks)); } - public void pushBookmarks(Account account) { + public void createBookmark(final Account account, final Bookmark bookmark) { + final Element item = mIqGenerator.publishBookmarkItem(bookmark); + pushNodeAndEnforcePublishOptions(account, Namespace.BOOKMARK, item, bookmark.getJid().asBareJid().toEscapedString(), PublishOptions.persistentWhitelistAccessMaxItems()); + } + + public void deleteBookmark(final Account account, final Bookmark bookmark) { final XmppConnection connection = account.getXmppConnection(); - if (connection != null && connection.getFeatures().bookmarksConversion()) { - new Thread(() -> pushBookmarksPep(account)).start(); - } else { - new Thread(() -> pushBookmarksPrivateXml(account)).start(); - } } private void pushBookmarksPrivateXml(Account account) { @@ -1886,11 +1890,16 @@ public class XmppConnectionService extends Service { } private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final Bundle options) { - pushNodeAndEnforcePublishOptions(account, node, element, options, true); + pushNodeAndEnforcePublishOptions(account, node, element, null, options, true); + + } + + private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final String id, final Bundle options) { + pushNodeAndEnforcePublishOptions(account, node, element, id, options, true); } - private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final Bundle options, final boolean retry) { - final IqPacket packet = mIqGenerator.publishElement(node, element, options); + private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final String id, final Bundle options, final boolean retry) { + final IqPacket packet = mIqGenerator.publishElement(node, element, id, options); sendIqPacket(account, packet, (a, response) -> { if (response.getType() == IqPacket.TYPE.RESULT) { return; @@ -1899,7 +1908,7 @@ public class XmppConnectionService extends Service { pushNodeConfiguration(account, node, options, new OnConfigurationPushed() { @Override public void onPushSucceeded() { - pushNodeAndEnforcePublishOptions(account, node, element, options, false); + pushNodeAndEnforcePublishOptions(account, node, element, id, options, false); } @Override @@ -2331,8 +2340,15 @@ public class XmppConnectionService extends Service { if (conversation.getAccount().getStatus() == Account.State.ONLINE) { Bookmark bookmark = conversation.getBookmark(); if (maySynchronizeWithBookmarks && bookmark != null && synchronizeWithBookmarks()) { - bookmark.setAutojoin(false); - pushBookmarks(bookmark.getAccount()); + if (conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) { + Account account = bookmark.getAccount(); + bookmark.setConversation(null); + account.getBookmarks().remove(bookmark); + deleteBookmark(account, bookmark); + } else if (bookmark.autojoin()) { + bookmark.setAutojoin(false); + createBookmark(bookmark.getAccount(), bookmark); + } } } if (conversation.getMucOptions().push()) { @@ -2341,7 +2357,6 @@ public class XmppConnectionService extends Service { } leaveMuc(conversation); } else { - conversation.endOtrIfNeeded(); if (conversation.getContact().getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) { stopPresenceUpdatesTo(conversation.getContact()); } @@ -3059,10 +3074,11 @@ public class XmppConnectionService extends Service { if (conversation.getMode() == Conversation.MODE_MULTI) { conversation.getMucOptions().setPassword(password); if (conversation.getBookmark() != null) { + final Bookmark bookmark = conversation.getBookmark(); if (synchronizeWithBookmarks()) { - conversation.getBookmark().setAutojoin(true); + bookmark.setAutojoin(true); } - pushBookmarks(conversation.getAccount()); + createBookmark(conversation.getAccount(), bookmark); } updateConversation(conversation); joinMuc(conversation); @@ -3113,7 +3129,7 @@ public class XmppConnectionService extends Service { } Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": persist nick '" + full.getResource() + "' into bookmark for " + conversation.getJid().asBareJid()); bookmark.setNick(full.getResource()); - pushBookmarks(bookmark.getAccount()); + createBookmark(bookmark.getAccount(), bookmark); } } @@ -3147,7 +3163,7 @@ public class XmppConnectionService extends Service { Bookmark bookmark = conversation.getBookmark(); if (bookmark != null) { bookmark.setNick(nick); - pushBookmarks(bookmark.getAccount()); + createBookmark(bookmark.getAccount(), bookmark); } joinMuc(conversation); } @@ -3314,7 +3330,7 @@ public class XmppConnectionService extends Service { if (bookmark != null && (sameBefore || bookmark.getBookmarkName() == null)) { if (bookmark.setBookmarkName(StringUtils.nullOnEmpty(mucOptions.getName()))) { - pushBookmarks(account); + createBookmark(account, bookmark); } } @@ -4825,7 +4841,7 @@ public class XmppConnectionService extends Service { } bookmark.setAutojoin(getPreferences().getBoolean("autojoin", getResources().getBoolean(R.bool.autojoin))); account.getBookmarks().add(bookmark); - pushBookmarks(account); + createBookmark(account, bookmark); bookmark.setConversation(conversation); } |