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