From 272924643ccae364376b6ed98170e6ca8bde10dc Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 23 May 2020 12:01:31 +0200 Subject: [PATCH] Latest non-working version --- .../ui/account/AccountsViewModel.java | 6 ++- .../messenger/ui/account/LoginViewModel.java | 4 +- .../messenger/xmpp/MercuryConnection.java | 4 +- .../xmpp/MercuryConnectionManager.java | 50 ++++++++----------- .../messenger/xmpp/SmackConfig.java | 21 ++++++++ .../mercury_im/messenger/entity/Account.java | 4 ++ libs/Smack | 2 +- 7 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/xmpp/SmackConfig.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index fbdfe34..9cb3860 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -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(); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 1121c74..1ef7973 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -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() { diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index e5a73f3..ea26808 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -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) { diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index 1a2ed35..98ab85b 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -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 connections = new ConcurrentHashMap<>(); - private final Map connectionDisposables = new ConcurrentHashMap<>(); - - private final BehaviorSubject stateObservable = - BehaviorSubject.createDefault(new ConnectionPoolState()); - private final AccountRepository accountRepository; - private final RosterStoreBinder rosterStoreBinder; private final MercuryEntityCapsStore entityCapsStore; + private final Map connectionsMap = new ConcurrentHashMap<>(); + private final Map connectionDisposables = new ConcurrentHashMap<>(); + private final BehaviorSubject 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 getConnections() { - return new ArrayList<>(connections.values()); + return new ArrayList<>(connectionsMap.values()); } public Observable 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 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 states = value.getConnectionStates(); - for (UUID id : connections.keySet()) { + for (UUID id : connectionsMap.keySet()) { if (!states.containsKey(id)) { states.remove(id); } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/SmackConfig.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/SmackConfig.java new file mode 100644 index 0000000..10284b0 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/SmackConfig.java @@ -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); + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index cef9998..cb61cfe 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -15,4 +15,8 @@ public class Account { String host; int port; boolean enabled; + + public Account() { + this.id = UUID.randomUUID(); + } } diff --git a/libs/Smack b/libs/Smack index f00acbf..5bfe789 160000 --- a/libs/Smack +++ b/libs/Smack @@ -1 +1 @@ -Subproject commit f00acbff891ba0edd0a51e7147e0e07d0de7e4b5 +Subproject commit 5bfe789e08ebb251b3c4302cb653c715eee363ea