BindProcessor.java

  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}