MessageDisplayedSynchronizationManager.java

 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}