Mercury-IM/core/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java

142 lines
5.0 KiB
Java
Raw Normal View History

2019-08-25 17:54:03 +02:00
package org.mercury_im.messenger.core.connection;
2019-05-27 21:34:11 +02:00
2019-07-02 00:46:40 +02:00
import org.jivesoftware.smack.AbstractXMPPConnection;
2019-06-21 03:45:33 +02:00
import org.jivesoftware.smack.ConnectionListener;
2019-07-02 00:46:40 +02:00
import org.jivesoftware.smack.ReconnectionManager;
2019-08-12 17:05:30 +02:00
import org.jivesoftware.smack.SmackException;
2019-05-27 21:34:11 +02:00
import org.jivesoftware.smack.XMPPConnection;
2019-08-12 17:05:30 +02:00
import org.jivesoftware.smack.XMPPException;
2019-06-21 03:45:33 +02:00
import org.jivesoftware.smack.chat2.ChatManager;
2019-08-12 17:05:30 +02:00
import org.jivesoftware.smack.packet.Presence;
2019-05-27 21:34:11 +02:00
import org.jivesoftware.smack.roster.Roster;
2019-06-21 03:45:33 +02:00
import org.jivesoftware.smackx.carbons.CarbonManager;
2019-07-02 00:46:40 +02:00
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
2019-08-10 21:50:03 +02:00
import org.jivesoftware.smackx.iqversion.VersionManager;
2019-09-08 04:47:59 +02:00
import org.jivesoftware.smackx.mam.MamManager;
2019-06-30 13:37:36 +02:00
import org.jivesoftware.smackx.sid.StableUniqueStanzaIdManager;
2019-06-24 01:41:17 +02:00
2019-08-12 17:05:30 +02:00
import java.io.IOException;
import java.util.logging.Level;
2019-06-24 01:41:17 +02:00
import java.util.logging.Logger;
2019-05-27 21:34:11 +02:00
2019-08-12 17:05:30 +02:00
import io.reactivex.subjects.BehaviorSubject;
public class MercuryConnection {
2019-06-21 03:45:33 +02:00
public static final String TAG = "Mercury";
2019-05-27 21:34:11 +02:00
2019-06-24 01:41:17 +02:00
private static final Logger LOGGER = Logger.getLogger(MercuryConnection.class.getName());
2019-08-04 04:22:08 +02:00
protected final AbstractXMPPConnection connection;
2019-06-10 02:52:08 +02:00
protected final long accountId;
2019-06-21 03:45:33 +02:00
2019-07-02 00:46:40 +02:00
protected final ReconnectionManager reconnectionManager;
2019-06-10 02:52:08 +02:00
protected final Roster roster;
2019-06-21 03:45:33 +02:00
protected final ChatManager chatManager;
protected final CarbonManager carbonManager;
2019-06-30 13:37:36 +02:00
protected final StableUniqueStanzaIdManager stanzaIdManager;
2019-07-02 00:46:40 +02:00
protected final ServiceDiscoveryManager serviceDiscoveryManager;
2019-09-08 04:47:59 +02:00
protected final MamManager mamManager;
2019-06-30 13:37:36 +02:00
2019-08-12 17:05:30 +02:00
BehaviorSubject<ConnectionState> state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED);
2019-08-04 04:22:08 +02:00
public MercuryConnection(AbstractXMPPConnection connection, long accountId) {
2019-05-27 21:34:11 +02:00
this.connection = connection;
2019-08-12 17:05:30 +02:00
connection.addConnectionListener(connectionListener);
2019-05-27 21:34:11 +02:00
this.accountId = accountId;
2019-08-04 04:22:08 +02:00
reconnectionManager = ReconnectionManager.getInstanceFor(connection);
2019-07-02 00:46:40 +02:00
reconnectionManager.enableAutomaticReconnection();
2019-05-27 21:34:11 +02:00
this.roster = Roster.getInstanceFor(connection);
2019-08-19 02:36:31 +02:00
roster.setRosterLoadedAtLogin(true);
2019-06-21 03:45:33 +02:00
this.chatManager = ChatManager.getInstanceFor(connection);
this.carbonManager = CarbonManager.getInstanceFor(connection);
2019-06-30 13:37:36 +02:00
this.stanzaIdManager = StableUniqueStanzaIdManager.getInstanceFor(connection);
stanzaIdManager.enable();
2019-07-02 00:46:40 +02:00
this.serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
2019-08-26 09:11:45 +02:00
VersionManager.setAutoAppendSmackVersion(false);
2019-08-10 21:50:03 +02:00
VersionManager.getInstanceFor(connection).setVersion("Mercury", "0.0.1-stealth", "Android");
2019-07-02 00:46:40 +02:00
serviceDiscoveryManager.setIdentity(new DiscoverInfo.Identity("client", "Mercury", "phone"));
2019-09-08 04:47:59 +02:00
mamManager = MamManager.getInstanceFor(connection);
2019-05-27 21:34:11 +02:00
}
2019-08-12 17:05:30 +02:00
public void connect() {
LOGGER.log(Level.INFO, "Connecting...");
state.onNext(ConnectionState.CONNECTING);
AbstractXMPPConnection con = (AbstractXMPPConnection) getConnection();
try {
con.connect().login();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SmackException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
}
}
public void disconnect() {
AbstractXMPPConnection con = (AbstractXMPPConnection) getConnection();
state.onNext(ConnectionState.DISCONNECTING);
try {
con.disconnect(new Presence(Presence.Type.unavailable));
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
state.onNext(ConnectionState.DISCONNECTED);
}
2019-05-27 21:34:11 +02:00
public XMPPConnection getConnection() {
return connection;
}
public long getAccountId() {
return accountId;
}
public Roster getRoster() {
return roster;
}
2019-06-21 03:45:33 +02:00
2019-08-12 17:05:30 +02:00
private final ConnectionListener connectionListener = new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
state.onNext(ConnectionState.CONNECTED);
2019-06-21 03:45:33 +02:00
}
2019-08-12 17:05:30 +02:00
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
state.onNext(ConnectionState.AUTHENTICATED);
LOGGER.info("Connection " + getAccountId() + " authenticated (" + (resumed ? "resumed" : "initially") + ")");
if (!resumed) {
LOGGER.info("Enabling carbons!");
carbonManager.enableCarbonsAsync(exception -> {
LOGGER.severe("Could not enable carbons for connection " + accountId + ": " + exception.getMessage());
exception.printStackTrace();
});
}
2019-09-08 04:47:59 +02:00
2019-08-12 17:05:30 +02:00
}
2019-06-21 03:45:33 +02:00
2019-08-12 17:05:30 +02:00
@Override
public void connectionClosed() {
state.onNext(ConnectionState.DISCONNECTED);
}
2019-07-03 00:56:55 +02:00
2019-08-12 17:05:30 +02:00
@Override
public void connectionClosedOnError(Exception e) {
state.onNext(ConnectionState.DISCONNECTED);
}
};
2019-05-27 21:34:11 +02:00
}