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