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