MessageDisplayedSynchronizationManager.java

 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}