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