BindProcessor.java

  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}