publish MDS via manager

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/generator/IqGenerator.java                               | 18 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java                      | 84 
src/main/java/eu/siacs/conversations/xmpp/manager/MessageDisplayedSynchronizationManager.java | 21 
src/main/java/eu/siacs/conversations/xmpp/pep/PublishOptions.java                             | 20 
src/main/java/im/conversations/android/xmpp/model/unique/StanzaId.java                        |  4 
5 files changed, 33 insertions(+), 114 deletions(-)

Detailed changes

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,

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<String, Account> 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<String> reactions) {

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<Void> publish(final Jid itemId, final Displayed displayed) {
+        return getManager(PepManager.class)
+                .publish(displayed, itemId.toString(), NodeConfiguration.WHITELIST_MAX_ITEMS);
+    }
 }

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;