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