diff --git a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java index 3394f9b4ec309cc9f320400d94206148d8f56fe2..61c24b8748e0030518aa986982fe542d400ad315 100644 --- a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java @@ -192,24 +192,6 @@ public class IqGenerator extends AbstractGenerator { return publish(AxolotlService.PEP_DEVICE_LIST, item, publishOptions); } - public Element mdsDisplayed(final String stanzaId, final Conversation conversation) { - final Jid by; - if (conversation.getMode() == Conversation.MODE_MULTI) { - by = conversation.getJid().asBareJid(); - } else { - by = conversation.getAccount().getJid().asBareJid(); - } - return mdsDisplayed(stanzaId, by); - } - - private Element mdsDisplayed(final String stanzaId, final Jid by) { - final Element displayed = new Element("displayed", Namespace.MDS_DISPLAYED); - final Element stanzaIdElement = displayed.addChild("stanza-id", Namespace.STANZA_IDS); - stanzaIdElement.setAttribute("id", stanzaId); - stanzaIdElement.setAttribute("by", by); - return displayed; - } - public Iq publishBundles( final SignedPreKeyRecord signedPreKeyRecord, final IdentityKey identityKey, diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index b96cd096adbcae06e2caeaaa4b476285052a2689..8163581fad99af56fba70a828fd6b154ab769475 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -137,6 +137,7 @@ import eu.siacs.conversations.xmpp.manager.BlockingManager; import eu.siacs.conversations.xmpp.manager.BookmarkManager; import eu.siacs.conversations.xmpp.manager.DiscoManager; import eu.siacs.conversations.xmpp.manager.LegacyBookmarkManager; +import eu.siacs.conversations.xmpp.manager.MessageDisplayedSynchronizationManager; import eu.siacs.conversations.xmpp.manager.NickManager; import eu.siacs.conversations.xmpp.manager.PresenceManager; import eu.siacs.conversations.xmpp.manager.PrivateStorageManager; @@ -2107,66 +2108,6 @@ public class XmppConnectionService extends Service { MoreExecutors.directExecutor()); } - 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 String id, - final Bundle options, - final boolean retry) { - final Iq packet = mIqGenerator.publishElement(node, element, id, options); - sendIqPacket( - account, - packet, - (response) -> { - if (response.getType() == Iq.Type.RESULT) { - return; - } - if (retry && PublishOptions.preconditionNotMet(response)) { - pushNodeConfiguration( - account, - node, - options, - new OnConfigurationPushed() { - @Override - public void onPushSucceeded() { - pushNodeAndEnforcePublishOptions( - account, node, element, id, options, false); - } - - @Override - public void onPushFailed() { - Log.d( - Config.LOGTAG, - account.getJid().asBareJid() - + ": unable to push node configuration (" - + node - + ")"); - } - }); - } else { - Log.d( - Config.LOGTAG, - account.getJid().asBareJid() - + ": error publishing " - + node - + " (retry=" - + retry - + ") " - + response); - } - }); - } - private void restoreFromDatabase() { synchronized (this.conversations) { final Map accountLookupTable = @@ -5387,7 +5328,8 @@ public class XmppConnectionService extends Service { final String stanzaId = last.getServerMsgId(); if (sendDisplayedMarker && serverAssist) { - final var mdsDisplayed = mIqGenerator.mdsDisplayed(stanzaId, conversation); + final var mdsDisplayed = + MessageDisplayedSynchronizationManager.displayed(stanzaId, conversation); final var packet = mMessageGenerator.confirm(last); packet.addChild(mdsDisplayed); if (!last.isPrivateMessage()) { @@ -5434,21 +5376,11 @@ public class XmppConnectionService extends Service { itemId = conversation.getJid().asBareJid(); } Log.d(Config.LOGTAG, "publishing mds for " + itemId + "/" + stanzaId); - publishMds(account, itemId, stanzaId, conversation); - } - - private void publishMds( - final Account account, - final Jid itemId, - final String stanzaId, - final Conversation conversation) { - final var item = mIqGenerator.mdsDisplayed(stanzaId, conversation); - pushNodeAndEnforcePublishOptions( - account, - Namespace.MDS_DISPLAYED, - item, - itemId.toString(), - PublishOptions.persistentWhitelistAccessMaxItems()); + final var displayed = + MessageDisplayedSynchronizationManager.displayed(stanzaId, conversation); + connection + .getManager(MessageDisplayedSynchronizationManager.class) + .publish(itemId, displayed); } public boolean sendReactions(final Message message, final Collection reactions) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/MessageDisplayedSynchronizationManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/MessageDisplayedSynchronizationManager.java index 8d2c4b65748cd1d9bb8ced1de16f47e1e4e692e9..84417d90b160bc70edb7b93298882a82bfeb7192 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/MessageDisplayedSynchronizationManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/MessageDisplayedSynchronizationManager.java @@ -4,14 +4,17 @@ import android.util.Log; import androidx.annotation.NonNull; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import eu.siacs.conversations.Config; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.XmppConnection; +import im.conversations.android.xmpp.NodeConfiguration; import im.conversations.android.xmpp.model.mds.Displayed; import im.conversations.android.xmpp.model.pubsub.Items; +import im.conversations.android.xmpp.model.unique.StanzaId; import java.util.Map; public class MessageDisplayedSynchronizationManager extends AbstractManager { @@ -69,4 +72,22 @@ public class MessageDisplayedSynchronizationManager extends AbstractManager { }, MoreExecutors.directExecutor()); } + + public static Displayed displayed(final String id, final Conversation conversation) { + final Jid by; + if (conversation.getMode() == Conversation.MODE_MULTI) { + by = conversation.getJid().asBareJid(); + } else { + by = conversation.getAccount().getJid().asBareJid(); + } + final var displayed = new Displayed(); + final var stanzaId = displayed.addExtension(new StanzaId(id)); + stanzaId.setBy(by); + return displayed; + } + + public ListenableFuture publish(final Jid itemId, final Displayed displayed) { + return getManager(PepManager.class) + .publish(displayed, itemId.toString(), NodeConfiguration.WHITELIST_MAX_ITEMS); + } } diff --git a/src/main/java/eu/siacs/conversations/xmpp/pep/PublishOptions.java b/src/main/java/eu/siacs/conversations/xmpp/pep/PublishOptions.java index 2dcaf9bac7b07c6cc89d7d7a3b6db18789f59fc7..534f943c03738c2511fb327ad92fd067e10239bb 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/pep/PublishOptions.java +++ b/src/main/java/eu/siacs/conversations/xmpp/pep/PublishOptions.java @@ -23,26 +23,6 @@ public class PublishOptions { return options; } - public static Bundle persistentWhitelistAccess() { - final Bundle options = new Bundle(); - options.putString("pubsub#persist_items", "true"); - options.putString("pubsub#access_model", "whitelist"); - return options; - } - - public static Bundle persistentWhitelistAccessMaxItems() { - final Bundle options = new Bundle(); - options.putString("pubsub#persist_items", "true"); - options.putString("pubsub#access_model", "whitelist"); - options.putString("pubsub#send_last_published_item", "never"); - options.putString("pubsub#max_items", "max"); - options.putString("pubsub#notify_delete", "true"); - options.putString( - "pubsub#notify_retract", "true"); // one could also set notify=true on the retract - - return options; - } - public static boolean preconditionNotMet(Iq response) { final Element error = response.getType() == Iq.Type.ERROR ? response.findChild("error") : null; diff --git a/src/main/java/im/conversations/android/xmpp/model/unique/StanzaId.java b/src/main/java/im/conversations/android/xmpp/model/unique/StanzaId.java index f2d1c506814b6cc3f160fb0866348bb61513546d..bd2319f9307c7c7632469461d336109e69697dee 100644 --- a/src/main/java/im/conversations/android/xmpp/model/unique/StanzaId.java +++ b/src/main/java/im/conversations/android/xmpp/model/unique/StanzaId.java @@ -22,6 +22,10 @@ public class StanzaId extends Extension { return this.getAttributeAsJid("by"); } + public void setBy(final Jid by) { + this.setAttribute("by", by); + } + public String getId() { return this.getAttribute("id"); }