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