1package im.conversations.android.xmpp.processor;
2
3import android.text.TextUtils;
4import android.util.Log;
5
6import eu.siacs.conversations.Config;
7import eu.siacs.conversations.entities.Account;
8import eu.siacs.conversations.generator.IqGenerator;
9import eu.siacs.conversations.services.XmppConnectionService;
10import eu.siacs.conversations.xmpp.XmppConnection;
11
12import im.conversations.android.xmpp.model.stanza.Iq;
13
14public class BindProcessor implements Runnable {
15
16 private final XmppConnectionService service;
17 private final Account account;
18
19 public BindProcessor(XmppConnectionService service, Account account) {
20 this.service = service;
21 this.account = account;
22 }
23
24 @Override
25 public void run() {
26 final XmppConnection connection = account.getXmppConnection();
27 service.cancelAvatarFetches(account);
28 final boolean loggedInSuccessfully =
29 account.setOption(Account.OPTION_LOGGED_IN_SUCCESSFULLY, true);
30 final boolean gainedFeature =
31 account.setOption(
32 Account.OPTION_HTTP_UPLOAD_AVAILABLE,
33 connection.getFeatures().httpUpload(0));
34 if (loggedInSuccessfully || gainedFeature) {
35 service.databaseBackend.updateAccount(account);
36 }
37
38 if (loggedInSuccessfully) {
39 if (!TextUtils.isEmpty(account.getDisplayName())) {
40 Log.d(
41 Config.LOGTAG,
42 account.getJid().asBareJid()
43 + ": display name wasn't empty on first log in. publishing");
44 service.publishDisplayName(account);
45 }
46 }
47
48 account.getRoster().clearPresences();
49 synchronized (account.inProgressConferenceJoins) {
50 account.inProgressConferenceJoins.clear();
51 }
52 synchronized (account.inProgressConferencePings) {
53 account.inProgressConferencePings.clear();
54 }
55 service.getJingleConnectionManager().notifyRebound(account);
56 service.getQuickConversationsService().considerSyncBackground(false);
57
58 connection.fetchRoster();
59
60 if (connection.getFeatures().bookmarks2()) {
61 service.fetchBookmarks2(account);
62 } else if (!connection.getFeatures().bookmarksConversion()) {
63 service.fetchBookmarks(account);
64 }
65
66 if (connection.getFeatures().mds()) {
67 service.fetchMessageDisplayedSynchronization(account);
68 } else {
69 Log.d(Config.LOGTAG, account.getJid() + ": server has no support for mds");
70 }
71 final var features = connection.getFeatures();
72 final boolean bind2 = features.bind2();
73 final boolean flexible = features.flexibleOfflineMessageRetrieval();
74 final boolean catchup = service.getMessageArchiveService().inCatchup(account);
75 final boolean trackOfflineMessageRetrieval;
76 if (!bind2 && flexible && catchup && connection.isMamPreferenceAlways()) {
77 trackOfflineMessageRetrieval = false;
78 connection.sendIqPacket(
79 IqGenerator.purgeOfflineMessages(),
80 (packet) -> {
81 if (packet.getType() == Iq.Type.RESULT) {
82 Log.d(
83 Config.LOGTAG,
84 account.getJid().asBareJid()
85 + ": successfully purged offline messages");
86 }
87 });
88 } else {
89 trackOfflineMessageRetrieval = true;
90 }
91 service.sendPresence(account);
92 connection.trackOfflineMessageRetrieval(trackOfflineMessageRetrieval);
93 if (service.getPushManagementService().available(account)) {
94 service.getPushManagementService().registerPushTokenOnServer(account);
95 }
96 service.connectMultiModeConversations(account);
97 service.syncDirtyContacts(account);
98
99 service.getUnifiedPushBroker().renewUnifiedPushEndpointsOnBind(account);
100 }
101}