mirror of
https://codeberg.org/Mercury-IM/Mercury-IM
synced 2024-06-18 09:34:52 +02:00
Latest non-working version
This commit is contained in:
parent
10ed534876
commit
272924643c
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
String host;
|
||||||
int port;
|
int port;
|
||||||
boolean enabled;
|
boolean enabled;
|
||||||
|
|
||||||
|
public Account() {
|
||||||
|
this.id = UUID.randomUUID();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit f00acbff891ba0edd0a51e7147e0e07d0de7e4b5
|
Subproject commit 5bfe789e08ebb251b3c4302cb653c715eee363ea
|
Loading…
Reference in a new issue