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