Latest non-working version

This commit is contained in:
Paul Schaub 2020-05-23 12:01:31 +02:00
parent 10ed534876
commit 272924643c
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
7 changed files with 57 additions and 34 deletions

View file

@ -1,6 +1,7 @@
package org.mercury_im.messenger.ui.account; package org.mercury_im.messenger.ui.account;
import android.app.Application; import android.app.Application;
import android.util.Log;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
@ -63,11 +64,12 @@ public class AccountsViewModel extends AndroidViewModel {
MercuryConnection connection = messenger.getConnectionManager().getConnection(accountModel); MercuryConnection connection = messenger.getConnectionManager().getConnection(accountModel);
if (connection != null) { if (connection != null) {
if (enabled) { if (enabled) {
connection.connect() compositeDisposable.add(connection.connect()
.andThen(connection.login()) .andThen(connection.login())
.subscribeOn(Schedulers.newThread()) .subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(); .subscribe(() -> Log.d("Mercury-IM", "Login successful for " + accountModel.getAddress()),
e -> Log.e("Mercury-IM", "Connecting failed.", e)));
} else { } else {
connection.shutdown(); connection.shutdown();
} }

View file

@ -1,6 +1,7 @@
package org.mercury_im.messenger.ui.account; package org.mercury_im.messenger.ui.account;
import android.app.Application; import android.app.Application;
import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -95,7 +96,8 @@ public class LoginViewModel extends AndroidViewModel {
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.doOnComplete(this::signalLoginSuccessful) .doOnComplete(this::signalLoginSuccessful)
.doOnError(this::signalLoginError) .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() { private void signalLoginSuccessful() {

View file

@ -13,6 +13,7 @@ import org.mercury_im.messenger.xmpp.state.ConnectionState;
import org.mercury_im.messenger.xmpp.state.ConnectivityState; import org.mercury_im.messenger.xmpp.state.ConnectivityState;
import java.io.IOException; import java.io.IOException;
import java.rmi.server.ExportException;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -39,6 +40,7 @@ public class MercuryConnection {
this.state = BehaviorSubject.createDefault(new ConnectionState(account.getId(), this, this.state = BehaviorSubject.createDefault(new ConnectionState(account.getId(), this,
ConnectivityState.disconnected, false, false)); ConnectivityState.disconnected, false, false));
connection.addConnectionListener(connectionListener);
} }
public UUID getAccountId() { public UUID getAccountId() {
@ -75,7 +77,7 @@ public class MercuryConnection {
return Completable.fromAction(this::doLogin); return Completable.fromAction(this::doLogin);
} }
private void doLogin() throws InvalidCredentialsException, ServerUnreachableException { private void doLogin() throws InvalidCredentialsException {
try { try {
((AbstractXMPPConnection) getConnection()).login(); ((AbstractXMPPConnection) getConnection()).login();
} catch (SASLErrorException e) { } catch (SASLErrorException e) {

View file

@ -3,11 +3,7 @@ package org.mercury_im.messenger.xmpp;
import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ReconnectionListener; import org.jivesoftware.smack.ReconnectionListener;
import org.jivesoftware.smack.ReconnectionManager; import org.jivesoftware.smack.ReconnectionManager;
import org.jivesoftware.smack.sm.packet.StreamManagement;
import org.jivesoftware.smackx.caps.EntityCapsManager; 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.AccountRepository;
import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.data.repository.Repositories;
import org.mercury_im.messenger.entity.Account; 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 Logger LOGGER = Logger.getLogger("ConnectionManager");
private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); 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 AccountRepository accountRepository;
private final RosterStoreBinder rosterStoreBinder; private final RosterStoreBinder rosterStoreBinder;
private final MercuryEntityCapsStore entityCapsStore; 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(); private final CompositeDisposable disposable = new CompositeDisposable();
static { static {
ReconnectionManager.setEnabledPerDefault(true); SmackConfig.staticConfiguration();
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);
} }
@Inject @Inject
@ -75,14 +61,20 @@ public class MercuryConnectionManager {
this.entityCapsStore = entityCapsStore; this.entityCapsStore = entityCapsStore;
EntityCapsManager.setPersistentCache(entityCapsStore); EntityCapsManager.setPersistentCache(entityCapsStore);
start();
}
public void start() {
accountRepository.observeAllAccounts()
.subscribe(accounts -> registerConnections(accounts));
} }
public List<MercuryConnection> getConnections() { public List<MercuryConnection> getConnections() {
return new ArrayList<>(connections.values()); return new ArrayList<>(connectionsMap.values());
} }
public Observable<ConnectionPoolState> observeConnectionPool() { public Observable<ConnectionPoolState> observeConnectionPool() {
return stateObservable; return connectionPoolObservable;
} }
@ -91,7 +83,7 @@ public class MercuryConnectionManager {
} }
public MercuryConnection getConnection(UUID id) { public MercuryConnection getConnection(UUID id) {
return connections.get(id); return connectionsMap.get(id);
} }
public MercuryConnection createConnection(Account account) { public MercuryConnection createConnection(Account account) {
@ -100,7 +92,7 @@ public class MercuryConnectionManager {
public void registerConnections(List<Account> accounts) { public void registerConnections(List<Account> accounts) {
for (Account account : accounts) { for (Account account : accounts) {
if (!connections.containsKey(account.getId())) { if (!connectionsMap.containsKey(account.getId())) {
MercuryConnection connection = createConnection(account); MercuryConnection connection = createConnection(account);
registerConnection(connection); registerConnection(connection);
} }
@ -119,9 +111,9 @@ public class MercuryConnectionManager {
} }
private void putConnection(MercuryConnection connection) { private void putConnection(MercuryConnection connection) {
connections.put(connection.getAccountId(), connection); connectionsMap.put(connection.getAccountId(), connection);
connectionDisposables.put(connection.getAccountId(), connection.observeConnection().subscribe(s -> connectionDisposables.put(connection.getAccountId(), connection.observeConnection().subscribe(s ->
stateObservable.onNext(updatePoolState(stateObservable.getValue(), s)))); connectionPoolObservable.onNext(updatePoolState(connectionPoolObservable.getValue(), s))));
bindConnection(connection); bindConnection(connection);
} }
@ -195,14 +187,14 @@ public class MercuryConnectionManager {
private void removeConnection(MercuryConnection connection) { private void removeConnection(MercuryConnection connection) {
LOGGER.log(Level.FINER, "Remove Connection: " + connection.getAccountId()); LOGGER.log(Level.FINER, "Remove Connection: " + connection.getAccountId());
connections.remove(connection.getAccountId()); connectionsMap.remove(connection.getAccountId());
connectionDisposables.remove(connection.getAccountId()).dispose(); connectionDisposables.remove(connection.getAccountId()).dispose();
stateObservable.onNext(updatePoolState(stateObservable.getValue())); connectionPoolObservable.onNext(updatePoolState(connectionPoolObservable.getValue()));
} }
private ConnectionPoolState updatePoolState(ConnectionPoolState value) { private ConnectionPoolState updatePoolState(ConnectionPoolState value) {
Map<UUID, ConnectionState> states = value.getConnectionStates(); Map<UUID, ConnectionState> states = value.getConnectionStates();
for (UUID id : connections.keySet()) { for (UUID id : connectionsMap.keySet()) {
if (!states.containsKey(id)) { if (!states.containsKey(id)) {
states.remove(id); states.remove(id);
} }

View file

@ -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);
}
}

View file

@ -15,4 +15,8 @@ public class Account {
String host; String host;
int port; int port;
boolean enabled; boolean enabled;
public Account() {
this.id = UUID.randomUUID();
}
} }

@ -1 +1 @@
Subproject commit f00acbff891ba0edd0a51e7147e0e07d0de7e4b5 Subproject commit 5bfe789e08ebb251b3c4302cb653c715eee363ea