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