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
17 private final XmppConnectionService service;
18 private final Account account;
19
20 public BindProcessor(XmppConnectionService service, Account account) {
21 this.service = service;
22 this.account = account;
23 }
24
25 @Override
26 public void run() {
27 final XmppConnection connection = account.getXmppConnection();
28 service.cancelAvatarFetches(account);
29 final boolean loggedInSuccessfully = account.setOption(Account.OPTION_LOGGED_IN_SUCCESSFULLY, true);
30 final boolean gainedFeature = account.setOption(Account.OPTION_HTTP_UPLOAD_AVAILABLE, connection.getFeatures().httpUpload(0));
31 if (loggedInSuccessfully || gainedFeature) {
32 service.databaseBackend.updateAccount(account);
33 }
34
35 if (loggedInSuccessfully) {
36 if (!TextUtils.isEmpty(account.getDisplayName())) {
37 Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": display name wasn't empty on first log in. publishing");
38 service.publishDisplayName(account);
39 }
40 }
41
42 account.getRoster().clearPresences();
43 synchronized (account.inProgressConferenceJoins) {
44 account.inProgressConferenceJoins.clear();
45 }
46 synchronized (account.inProgressConferencePings) {
47 account.inProgressConferencePings.clear();
48 }
49 service.getJingleConnectionManager().notifyRebound(account);
50 service.getQuickConversationsService().considerSyncBackground(false);
51
52
53 connection.fetchRoster();
54
55 if (connection.getFeatures().bookmarks2()) {
56 service.fetchBookmarks2(account);
57 } else if (!connection.getFeatures().bookmarksConversion()) {
58 service.fetchBookmarks(account);
59 }
60
61 if (connection.getFeatures().mds()) {
62 service.fetchMessageDisplayedSynchronization(account);
63 } else {
64 Log.d(Config.LOGTAG,account.getJid()+": server has no support for mds");
65 }
66 final boolean flexible = connection.getFeatures().flexibleOfflineMessageRetrieval();
67 final boolean catchup = service.getMessageArchiveService().inCatchup(account);
68 final boolean trackOfflineMessageRetrieval;
69 if (flexible && catchup && connection.isMamPreferenceAlways()) {
70 trackOfflineMessageRetrieval = false;
71 connection.sendIqPacket(IqGenerator.purgeOfflineMessages(), (packet) -> {
72 if (packet.getType() == Iq.Type.RESULT) {
73 Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": successfully purged offline messages");
74 }
75 });
76 } else {
77 trackOfflineMessageRetrieval = true;
78 }
79 service.sendPresence(account);
80 connection.trackOfflineMessageRetrieval(trackOfflineMessageRetrieval);
81 if (service.getPushManagementService().available(account)) {
82 service.getPushManagementService().registerPushTokenOnServer(account);
83 }
84 service.connectMultiModeConversations(account);
85 service.syncDirtyContacts(account);
86
87 service.getUnifiedPushBroker().renewUnifiedPushEndpointsOnBind(account);
88
89 }
90}