Latest non-working version
This commit is contained in:
parent
10ed534876
commit
272924643c
|
@ -1,6 +1,7 @@
|
|||
package org.mercury_im.messenger.ui.account;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
@ -63,11 +64,12 @@ public class AccountsViewModel extends AndroidViewModel {
|
|||
MercuryConnection connection = messenger.getConnectionManager().getConnection(accountModel);
|
||||
if (connection != null) {
|
||||
if (enabled) {
|
||||
connection.connect()
|
||||
compositeDisposable.add(connection.connect()
|
||||
.andThen(connection.login())
|
||||
.subscribeOn(Schedulers.newThread())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe();
|
||||
.subscribe(() -> Log.d("Mercury-IM", "Login successful for " + accountModel.getAddress()),
|
||||
e -> Log.e("Mercury-IM", "Connecting failed.", e)));
|
||||
} else {
|
||||
connection.shutdown();
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.mercury_im.messenger.ui.account;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
@ -95,7 +96,8 @@ public class LoginViewModel extends AndroidViewModel {
|
|||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doOnComplete(this::signalLoginSuccessful)
|
||||
.doOnError(this::signalLoginError)
|
||||
.subscribe());
|
||||
.subscribe(() -> Log.d("Mercury-IM", "Login successful for " + account.getAddress()),
|
||||
e -> Log.e("Mercury-IM", "Login failed for " + account.getAddress(), e)));
|
||||
}
|
||||
|
||||
private void signalLoginSuccessful() {
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.mercury_im.messenger.xmpp.state.ConnectionState;
|
|||
import org.mercury_im.messenger.xmpp.state.ConnectivityState;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.rmi.server.ExportException;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
|
@ -39,6 +40,7 @@ public class MercuryConnection {
|
|||
|
||||
this.state = BehaviorSubject.createDefault(new ConnectionState(account.getId(), this,
|
||||
ConnectivityState.disconnected, false, false));
|
||||
connection.addConnectionListener(connectionListener);
|
||||
}
|
||||
|
||||
public UUID getAccountId() {
|
||||
|
@ -75,7 +77,7 @@ public class MercuryConnection {
|
|||
return Completable.fromAction(this::doLogin);
|
||||
}
|
||||
|
||||
private void doLogin() throws InvalidCredentialsException, ServerUnreachableException {
|
||||
private void doLogin() throws InvalidCredentialsException {
|
||||
try {
|
||||
((AbstractXMPPConnection) getConnection()).login();
|
||||
} catch (SASLErrorException e) {
|
||||
|
|
|
@ -3,11 +3,7 @@ package org.mercury_im.messenger.xmpp;
|
|||
import org.jivesoftware.smack.AbstractXMPPConnection;
|
||||
import org.jivesoftware.smack.ReconnectionListener;
|
||||
import org.jivesoftware.smack.ReconnectionManager;
|
||||
import org.jivesoftware.smack.sm.packet.StreamManagement;
|
||||
import org.jivesoftware.smackx.caps.EntityCapsManager;
|
||||
import org.jivesoftware.smackx.iqversion.VersionManager;
|
||||
import org.jivesoftware.smackx.receipts.DeliveryReceiptManager;
|
||||
import org.jivesoftware.smackx.sid.StableUniqueStanzaIdManager;
|
||||
import org.mercury_im.messenger.data.repository.AccountRepository;
|
||||
import org.mercury_im.messenger.data.repository.Repositories;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
|
@ -41,29 +37,19 @@ public class MercuryConnectionManager {
|
|||
private static final Logger LOGGER = Logger.getLogger("ConnectionManager");
|
||||
private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory();
|
||||
|
||||
private final Map<UUID, MercuryConnection> connections = new ConcurrentHashMap<>();
|
||||
private final Map<UUID, Disposable> connectionDisposables = new ConcurrentHashMap<>();
|
||||
|
||||
private final BehaviorSubject<ConnectionPoolState> stateObservable =
|
||||
BehaviorSubject.createDefault(new ConnectionPoolState());
|
||||
|
||||
private final AccountRepository accountRepository;
|
||||
|
||||
private final RosterStoreBinder rosterStoreBinder;
|
||||
private final MercuryEntityCapsStore entityCapsStore;
|
||||
|
||||
private final Map<UUID, MercuryConnection> connectionsMap = new ConcurrentHashMap<>();
|
||||
private final Map<UUID, Disposable> connectionDisposables = new ConcurrentHashMap<>();
|
||||
private final BehaviorSubject<ConnectionPoolState> connectionPoolObservable =
|
||||
BehaviorSubject.createDefault(new ConnectionPoolState());
|
||||
|
||||
private final CompositeDisposable disposable = new CompositeDisposable();
|
||||
|
||||
static {
|
||||
ReconnectionManager.setEnabledPerDefault(true);
|
||||
ReconnectionManager.setDefaultReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.RANDOM_INCREASING_DELAY);
|
||||
|
||||
VersionManager.setAutoAppendSmackVersion(false);
|
||||
VersionManager.setDefaultVersion("Mercury-IM", "0.0.1-little-joe");
|
||||
|
||||
DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.ifIsSubscribed);
|
||||
|
||||
StableUniqueStanzaIdManager.setEnabledByDefault(true);
|
||||
SmackConfig.staticConfiguration();
|
||||
}
|
||||
|
||||
@Inject
|
||||
|
@ -75,14 +61,20 @@ public class MercuryConnectionManager {
|
|||
this.entityCapsStore = entityCapsStore;
|
||||
|
||||
EntityCapsManager.setPersistentCache(entityCapsStore);
|
||||
start();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
accountRepository.observeAllAccounts()
|
||||
.subscribe(accounts -> registerConnections(accounts));
|
||||
}
|
||||
|
||||
public List<MercuryConnection> getConnections() {
|
||||
return new ArrayList<>(connections.values());
|
||||
return new ArrayList<>(connectionsMap.values());
|
||||
}
|
||||
|
||||
public Observable<ConnectionPoolState> observeConnectionPool() {
|
||||
return stateObservable;
|
||||
return connectionPoolObservable;
|
||||
}
|
||||
|
||||
|
||||
|
@ -91,7 +83,7 @@ public class MercuryConnectionManager {
|
|||
}
|
||||
|
||||
public MercuryConnection getConnection(UUID id) {
|
||||
return connections.get(id);
|
||||
return connectionsMap.get(id);
|
||||
}
|
||||
|
||||
public MercuryConnection createConnection(Account account) {
|
||||
|
@ -100,7 +92,7 @@ public class MercuryConnectionManager {
|
|||
|
||||
public void registerConnections(List<Account> accounts) {
|
||||
for (Account account : accounts) {
|
||||
if (!connections.containsKey(account.getId())) {
|
||||
if (!connectionsMap.containsKey(account.getId())) {
|
||||
MercuryConnection connection = createConnection(account);
|
||||
registerConnection(connection);
|
||||
}
|
||||
|
@ -119,9 +111,9 @@ public class MercuryConnectionManager {
|
|||
}
|
||||
|
||||
private void putConnection(MercuryConnection connection) {
|
||||
connections.put(connection.getAccountId(), connection);
|
||||
connectionsMap.put(connection.getAccountId(), connection);
|
||||
connectionDisposables.put(connection.getAccountId(), connection.observeConnection().subscribe(s ->
|
||||
stateObservable.onNext(updatePoolState(stateObservable.getValue(), s))));
|
||||
connectionPoolObservable.onNext(updatePoolState(connectionPoolObservable.getValue(), s))));
|
||||
bindConnection(connection);
|
||||
}
|
||||
|
||||
|
@ -195,14 +187,14 @@ public class MercuryConnectionManager {
|
|||
|
||||
private void removeConnection(MercuryConnection connection) {
|
||||
LOGGER.log(Level.FINER, "Remove Connection: " + connection.getAccountId());
|
||||
connections.remove(connection.getAccountId());
|
||||
connectionsMap.remove(connection.getAccountId());
|
||||
connectionDisposables.remove(connection.getAccountId()).dispose();
|
||||
stateObservable.onNext(updatePoolState(stateObservable.getValue()));
|
||||
connectionPoolObservable.onNext(updatePoolState(connectionPoolObservable.getValue()));
|
||||
}
|
||||
|
||||
private ConnectionPoolState updatePoolState(ConnectionPoolState value) {
|
||||
Map<UUID, ConnectionState> states = value.getConnectionStates();
|
||||
for (UUID id : connections.keySet()) {
|
||||
for (UUID id : connectionsMap.keySet()) {
|
||||
if (!states.containsKey(id)) {
|
||||
states.remove(id);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package org.mercury_im.messenger.xmpp;
|
||||
|
||||
import org.jivesoftware.smack.ReconnectionManager;
|
||||
import org.jivesoftware.smackx.iqversion.VersionManager;
|
||||
import org.jivesoftware.smackx.receipts.DeliveryReceiptManager;
|
||||
import org.jivesoftware.smackx.sid.StableUniqueStanzaIdManager;
|
||||
|
||||
public class SmackConfig {
|
||||
|
||||
static void staticConfiguration() {
|
||||
ReconnectionManager.setEnabledPerDefault(true);
|
||||
ReconnectionManager.setDefaultReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.RANDOM_INCREASING_DELAY);
|
||||
|
||||
VersionManager.setAutoAppendSmackVersion(false);
|
||||
VersionManager.setDefaultVersion("Mercury-IM", "0.0.1-little-joe");
|
||||
|
||||
DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.ifIsSubscribed);
|
||||
|
||||
StableUniqueStanzaIdManager.setEnabledByDefault(true);
|
||||
}
|
||||
}
|
|
@ -15,4 +15,8 @@ public class Account {
|
|||
String host;
|
||||
int port;
|
||||
boolean enabled;
|
||||
|
||||
public Account() {
|
||||
this.id = UUID.randomUUID();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit f00acbff891ba0edd0a51e7147e0e07d0de7e4b5
|
||||
Subproject commit 5bfe789e08ebb251b3c4302cb653c715eee363ea
|
Loading…
Reference in New Issue