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