2019-11-18 23:51:27 +01:00
|
|
|
package org.mercury_im.messenger;
|
2019-11-08 00:47:17 +01:00
|
|
|
|
2019-12-21 03:24:00 +01:00
|
|
|
import org.jivesoftware.smack.SmackException;
|
|
|
|
import org.jivesoftware.smackx.csi.ClientStateIndicationManager;
|
2019-12-09 15:49:59 +01:00
|
|
|
import org.mercury_im.messenger.data.repository.Repositories;
|
2019-12-21 00:27:48 +01:00
|
|
|
import org.mercury_im.messenger.usecase.AddAccount;
|
2020-01-04 22:56:34 +01:00
|
|
|
import org.mercury_im.messenger.usecase.RosterStoreBinder;
|
2019-12-21 00:27:48 +01:00
|
|
|
import org.mercury_im.messenger.xmpp.MercuryConnection;
|
2020-01-05 15:54:44 +01:00
|
|
|
import org.mercury_im.messenger.xmpp.MercuryConnectionManager;
|
2019-11-12 00:07:57 +01:00
|
|
|
|
2019-12-21 03:24:00 +01:00
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
2019-11-12 00:07:57 +01:00
|
|
|
|
2019-12-02 02:31:32 +01:00
|
|
|
import javax.inject.Inject;
|
2020-01-06 01:27:11 +01:00
|
|
|
import javax.inject.Singleton;
|
2019-12-02 02:31:32 +01:00
|
|
|
|
2019-12-22 05:48:07 +01:00
|
|
|
import io.reactivex.disposables.CompositeDisposable;
|
|
|
|
import io.reactivex.schedulers.Schedulers;
|
|
|
|
|
2020-01-06 01:27:11 +01:00
|
|
|
@Singleton
|
2020-01-05 15:54:44 +01:00
|
|
|
public class Messenger implements ClientStateListener {
|
2019-11-12 00:07:57 +01:00
|
|
|
|
2019-12-09 13:50:26 +01:00
|
|
|
public static final String TAG = "MercuryIM";
|
2019-12-21 03:24:00 +01:00
|
|
|
private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName());
|
2019-12-09 13:50:26 +01:00
|
|
|
|
2020-01-05 15:54:44 +01:00
|
|
|
private final MercuryConnectionManager connectionManager;
|
|
|
|
private final Repositories repositories;
|
2020-01-04 22:56:34 +01:00
|
|
|
|
2019-12-22 05:48:07 +01:00
|
|
|
private CompositeDisposable disposable = new CompositeDisposable();
|
|
|
|
|
2019-12-02 02:31:32 +01:00
|
|
|
@Inject
|
2020-01-06 01:27:11 +01:00
|
|
|
public Messenger(Repositories repositories, MercuryConnectionManager connectionManager) {
|
2019-12-09 15:49:59 +01:00
|
|
|
this.repositories = repositories;
|
2020-01-06 01:27:11 +01:00
|
|
|
this.connectionManager = connectionManager;
|
2020-01-04 22:56:34 +01:00
|
|
|
performInitialLogin();
|
2019-12-22 05:48:07 +01:00
|
|
|
}
|
|
|
|
|
2020-01-05 15:54:44 +01:00
|
|
|
public MercuryConnectionManager getConnectionManager() {
|
|
|
|
return connectionManager;
|
|
|
|
}
|
|
|
|
|
2020-01-04 22:56:34 +01:00
|
|
|
public void performInitialLogin() {
|
2020-01-06 01:27:11 +01:00
|
|
|
LOGGER.log(Level.INFO, "Perform initial login.");
|
2019-12-22 05:48:07 +01:00
|
|
|
disposable.add(repositories.getAccountRepository().observeAllAccounts().firstOrError()
|
|
|
|
.subscribeOn(Schedulers.newThread())
|
2020-01-06 01:27:11 +01:00
|
|
|
.subscribe(connectionManager::registerConnections));
|
2019-11-18 00:04:28 +01:00
|
|
|
}
|
2019-12-09 13:50:26 +01:00
|
|
|
|
2019-12-21 00:27:48 +01:00
|
|
|
public AddAccount addAccount() {
|
2020-01-05 15:54:44 +01:00
|
|
|
return new AddAccount(repositories.getAccountRepository(), this.connectionManager);
|
2019-12-09 13:50:26 +01:00
|
|
|
}
|
2019-12-21 03:24:00 +01:00
|
|
|
|
|
|
|
// CSI
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onClientInForeground() {
|
|
|
|
LOGGER.log(Level.INFO, "CSI: active");
|
2020-01-05 15:54:44 +01:00
|
|
|
for (MercuryConnection connection : connectionManager.getConnections()) {
|
2019-12-21 03:24:00 +01:00
|
|
|
tryCsiActive(connection);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onClientInBackground() {
|
|
|
|
LOGGER.log(Level.INFO, "CSI: inactive");
|
2020-01-05 15:54:44 +01:00
|
|
|
for (MercuryConnection connection : connectionManager.getConnections()) {
|
2019-12-21 03:24:00 +01:00
|
|
|
tryCsiInactive(connection);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void tryCsiActive(MercuryConnection connection) {
|
|
|
|
try {
|
|
|
|
ClientStateIndicationManager.active(connection.getConnection());
|
|
|
|
} catch (SmackException.NotConnectedException | InterruptedException e) {
|
|
|
|
LOGGER.log(Level.WARNING, "Sending CSI state 'active' failed.", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void tryCsiInactive(MercuryConnection connection) {
|
|
|
|
try {
|
|
|
|
ClientStateIndicationManager.inactive(connection.getConnection());
|
|
|
|
} catch (SmackException.NotConnectedException | InterruptedException e) {
|
|
|
|
LOGGER.log(Level.WARNING, "Sending CSI state 'inactive' failed.", e);
|
|
|
|
}
|
|
|
|
}
|
2019-11-08 00:47:17 +01:00
|
|
|
}
|