1package eu.siacs.conversations.xmpp.manager;
2
3import android.util.Log;
4import androidx.annotation.NonNull;
5import com.google.common.util.concurrent.FutureCallback;
6import com.google.common.util.concurrent.Futures;
7import com.google.common.util.concurrent.MoreExecutors;
8import eu.siacs.conversations.Config;
9import eu.siacs.conversations.entities.Conversation;
10import eu.siacs.conversations.services.XmppConnectionService;
11import eu.siacs.conversations.xmpp.Jid;
12import eu.siacs.conversations.xmpp.XmppConnection;
13import im.conversations.android.xmpp.model.mds.Displayed;
14import im.conversations.android.xmpp.model.pubsub.Items;
15import java.util.Map;
16
17public class MessageDisplayedSynchronizationManager extends AbstractManager {
18
19 private final XmppConnectionService service;
20
21 public MessageDisplayedSynchronizationManager(
22 final XmppConnectionService service, XmppConnection connection) {
23 super(service.getApplicationContext(), connection);
24 this.service = service;
25 }
26
27 public void handleItems(final Items items) {
28 for (final var item : items.getItemMap(Displayed.class).entrySet()) {
29 this.processMdsItem(item);
30 }
31 }
32
33 public void processMdsItem(final Map.Entry<String, Displayed> item) {
34 final var account = getAccount();
35 final Jid jid = Jid.Invalid.getNullForInvalid(Jid.ofOrInvalid(item.getKey()));
36 if (jid == null) {
37 return;
38 }
39 final var displayed = item.getValue();
40 final var stanzaId = displayed.getStanzaId();
41 final String id = stanzaId == null ? null : stanzaId.getId();
42 final Conversation conversation = this.service.find(account, jid);
43 if (id != null && conversation != null) {
44 conversation.setDisplayState(id);
45 this.service.markReadUpToStanzaId(conversation, id);
46 }
47 }
48
49 public void fetch() {
50 final var future = getManager(PepManager.class).fetchItems(Displayed.class);
51 Futures.addCallback(
52 future,
53 new FutureCallback<>() {
54 @Override
55 public void onSuccess(Map<String, Displayed> result) {
56 for (final var entry : result.entrySet()) {
57 processMdsItem(entry);
58 }
59 }
60
61 @Override
62 public void onFailure(@NonNull Throwable t) {
63 Log.d(
64 Config.LOGTAG,
65 getAccount().getJid().asBareJid()
66 + ": could not retrieve MDS items",
67 t);
68 }
69 },
70 MoreExecutors.directExecutor());
71 }
72}