Commit 0d0e4556 authored by Leonardo Aramaki's avatar Leonardo Aramaki

Some refactoring

parent 692cd67f
package chat.rocket.android.service; package chat.rocket.android.service;
import android.annotation.SuppressLint;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.ServiceConnection; import android.content.ServiceConnection;
...@@ -68,6 +69,7 @@ import io.reactivex.subjects.PublishSubject; ...@@ -68,6 +69,7 @@ import io.reactivex.subjects.PublishSubject;
} }
} }
@SuppressLint("RxLeakedSubscription")
@DebugLog @DebugLog
@Override @Override
public void ensureConnections() { public void ensureConnections() {
...@@ -84,6 +86,7 @@ import io.reactivex.subjects.PublishSubject; ...@@ -84,6 +86,7 @@ import io.reactivex.subjects.PublishSubject;
}); });
} }
@SuppressLint("RxLeakedSubscription")
@Override @Override
public void addOrUpdateServer(String hostname, @Nullable String name, boolean insecure) { public void addOrUpdateServer(String hostname, @Nullable String name, boolean insecure) {
RealmBasedServerInfo.addOrUpdate(hostname, name, insecure); RealmBasedServerInfo.addOrUpdate(hostname, name, insecure);
...@@ -95,6 +98,7 @@ import io.reactivex.subjects.PublishSubject; ...@@ -95,6 +98,7 @@ import io.reactivex.subjects.PublishSubject;
}, RCLog::e); }, RCLog::e);
} }
@SuppressLint("RxLeakedSubscription")
@Override @Override
public void removeServer(String hostname) { public void removeServer(String hostname) {
RealmBasedServerInfo.remove(hostname); RealmBasedServerInfo.remove(hostname);
......
...@@ -72,8 +72,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -72,8 +72,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
private final RealmHelper realmHelper; private final RealmHelper realmHelper;
private final ConnectivityManagerInternal connectivityManager; private final ConnectivityManagerInternal connectivityManager;
private final ArrayList<Registrable> listeners = new ArrayList<>(); private final ArrayList<Registrable> listeners = new ArrayList<>();
private final CompositeDisposable hearbeatDisposable = new CompositeDisposable(); private final CompositeDisposable heartbeatDisposable = new CompositeDisposable();
private final CompositeDisposable reconnectSubscription = new CompositeDisposable(); private final CompositeDisposable reconnectDisposable = new CompositeDisposable();
private boolean listenersRegistered; private boolean listenersRegistered;
private static class KeepAliveTimer { private static class KeepAliveTimer {
...@@ -109,14 +109,13 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -109,14 +109,13 @@ public class RocketChatWebSocketThread extends HandlerThread {
*/ */
@DebugLog @DebugLog
public static Single<RocketChatWebSocketThread> getStarted(Context appContext, String hostname) { public static Single<RocketChatWebSocketThread> getStarted(Context appContext, String hostname) {
return Single.<RocketChatWebSocketThread>fromPublisher(objectSingleEmitter -> { return Single.<RocketChatWebSocketThread>create(objectSingleEmitter -> {
new RocketChatWebSocketThread(appContext, hostname) { new RocketChatWebSocketThread(appContext, hostname) {
@Override @Override
protected void onLooperPrepared() { protected void onLooperPrepared() {
try { try {
super.onLooperPrepared(); super.onLooperPrepared();
objectSingleEmitter.onNext(this); objectSingleEmitter.onSuccess(this);
objectSingleEmitter.onComplete();
} catch (Exception exception) { } catch (Exception exception) {
objectSingleEmitter.onError(exception); objectSingleEmitter.onError(exception);
} }
...@@ -129,6 +128,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -129,6 +128,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
@Override @Override
protected void onLooperPrepared() { protected void onLooperPrepared() {
super.onLooperPrepared(); super.onLooperPrepared();
forceInvalidateTokens();
} }
private void forceInvalidateTokens() { private void forceInvalidateTokens() {
...@@ -150,15 +150,14 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -150,15 +150,14 @@ public class RocketChatWebSocketThread extends HandlerThread {
@DebugLog @DebugLog
public Single<Boolean> terminate() { public Single<Boolean> terminate() {
if (isAlive()) { if (isAlive()) {
return Single.fromPublisher(emitter -> { return Single.create(emitter -> {
new Handler(getLooper()).post(() -> { new Handler(getLooper()).post(() -> {
RCLog.d("thread %s: terminated()", Thread.currentThread().getId()); RCLog.d("thread %s: terminated()", Thread.currentThread().getId());
unregisterListenersAndClose(); unregisterListenersAndClose();
connectivityManager.notifyConnectionLost(hostname, connectivityManager.notifyConnectionLost(hostname,
DDPClient.REASON_CLOSED_BY_USER); DDPClient.REASON_CLOSED_BY_USER);
RocketChatWebSocketThread.super.quit(); RocketChatWebSocketThread.super.quit();
emitter.onNext(true); emitter.onSuccess(true);
emitter.onComplete();
}); });
}); });
} else { } else {
...@@ -198,7 +197,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -198,7 +197,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
} }
keepAliveTimer.update(); keepAliveTimer.update();
return Single.fromPublisher(emitter -> { return Single.create(emitter -> {
new Thread() { new Thread() {
@Override @Override
public void run() { public void run() {
...@@ -211,8 +210,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -211,8 +210,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
emitter.onError(error); emitter.onError(error);
} else { } else {
keepAliveTimer.update(); keepAliveTimer.update();
emitter.onNext(true); emitter.onSuccess(true);
emitter.onComplete();
} }
return null; return null;
}); });
...@@ -239,24 +237,11 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -239,24 +237,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
}); });
} }
private Single<Boolean> prepareDDPClient() {
// TODO: temporarily replaced checkIfConnectionAlive() call for this single checking if ddpClient is
// null or not. In case it is, build a new client, otherwise just keep connecting with existing one.
return Single.just(DDPClient.get() != null)
.doOnSuccess(alive -> {
if (!alive) {
RCLog.d("DDPClient#build");
}
});
}
private Single<Boolean> connectDDPClient() { private Single<Boolean> connectDDPClient() {
return prepareDDPClient() return Single.create(emitter -> {
.flatMap(_val -> Single.fromPublisher(emitter -> {
ServerInfo info = connectivityManager.getServerInfoForHost(hostname); ServerInfo info = connectivityManager.getServerInfoForHost(hostname);
if (info == null) { if (info == null) {
emitter.onNext(false); emitter.onSuccess(false);
emitter.onComplete();
return; return;
} }
RCLog.d("DDPClient#connect"); RCLog.d("DDPClient#connect");
...@@ -294,31 +279,29 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -294,31 +279,29 @@ public class RocketChatWebSocketThread extends HandlerThread {
if (task.isFaulted()) { if (task.isFaulted()) {
emitter.onError(task.getError()); emitter.onError(task.getError());
} else { } else {
emitter.onNext(true); emitter.onSuccess(true);
emitter.onComplete();
} }
return null; return null;
}); });
})); });
} }
private void reconnect() { private void reconnect() {
// if we are already trying to reconnect then return. // if we are already trying to reconnect then return.
if (reconnectSubscription.size() > 0) { if (reconnectDisposable.size() > 0) {
return; return;
} }
forceInvalidateTokens();
connectivityManager.notifyConnecting(hostname); connectivityManager.notifyConnecting(hostname);
reconnectSubscription.add( reconnectDisposable.add(
connectWithExponentialBackoff() connectWithExponentialBackoff()
.subscribe( .subscribe(connected -> {
connected -> {
if (!connected) { if (!connected) {
connectivityManager.notifyConnecting(hostname); connectivityManager.notifyConnecting(hostname);
} }
reconnectSubscription.clear(); reconnectDisposable.clear();
}, }, error -> {
error -> { logErrorAndUnsubscribe(reconnectDisposable, error);
logErrorAndUnsubscribe(reconnectSubscription, error);
connectivityManager.notifyConnectionLost(hostname, connectivityManager.notifyConnectionLost(hostname,
DDPClient.REASON_NETWORK_ERROR); DDPClient.REASON_NETWORK_ERROR);
} }
...@@ -338,12 +321,11 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -338,12 +321,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
@DebugLog @DebugLog
private Single<Boolean> connect() { private Single<Boolean> connect() {
return connectDDPClient() return connectDDPClient()
.flatMap(_val -> Single.fromPublisher(emitter -> { .flatMap(_val -> Single.create(emitter -> {
fetchPublicSettings(); fetchPublicSettings();
fetchPermissions(); fetchPermissions();
registerListeners(); registerListeners();
emitter.onNext(true); emitter.onSuccess(true);
emitter.onComplete();
})); }));
} }
...@@ -387,7 +369,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -387,7 +369,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
} else { } else {
return Completable.complete(); return Completable.complete();
} }
}).retryWhen(RxHelper.exponentialBackoff(Integer.MAX_VALUE, 500, TimeUnit.MILLISECONDS)) }).retryWhen(RxHelper.exponentialBackoff(3, 500, TimeUnit.MILLISECONDS))
.subscribe( .subscribe(
() -> { () -> {
createObserversAndRegister(); createObserversAndRegister();
...@@ -423,8 +405,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -423,8 +405,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
} }
private void startHeartBeat() { private void startHeartBeat() {
hearbeatDisposable.clear(); heartbeatDisposable.clear();
hearbeatDisposable.add( heartbeatDisposable.add(
heartbeat(HEARTBEAT_PERIOD_MS) heartbeat(HEARTBEAT_PERIOD_MS)
.subscribe( .subscribe(
ponged -> { ponged -> {
...@@ -435,7 +417,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -435,7 +417,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
error -> { error -> {
RCLog.e(error); RCLog.e(error);
// Stop pinging // Stop pinging
hearbeatDisposable.clear(); heartbeatDisposable.clear();
if (error instanceof DDPClientCallback.Closed || error instanceof TimeoutException) { if (error instanceof DDPClientCallback.Closed || error instanceof TimeoutException) {
RCLog.d("Hearbeat failure: retrying connection..."); RCLog.d("Hearbeat failure: retrying connection...");
reconnect(); reconnect();
...@@ -459,7 +441,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -459,7 +441,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
registrable.unregister(); registrable.unregister();
iterator.remove(); iterator.remove();
} }
hearbeatDisposable.clear(); heartbeatDisposable.clear();
listenersRegistered = false; listenersRegistered = false;
} }
} }
...@@ -7,6 +7,7 @@ import com.hadisatrio.optional.Optional; ...@@ -7,6 +7,7 @@ import com.hadisatrio.optional.Optional;
import chat.rocket.core.models.Session; import chat.rocket.core.models.Session;
import chat.rocket.core.repositories.SessionRepository; import chat.rocket.core.repositories.SessionRepository;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore; import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.persistence.realm.models.internal.RealmSession; import chat.rocket.persistence.realm.models.internal.RealmSession;
import hu.akarnokd.rxjava.interop.RxJavaInterop; import hu.akarnokd.rxjava.interop.RxJavaInterop;
...@@ -35,7 +36,7 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe ...@@ -35,7 +36,7 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe
return RxJavaInterop.toV2Flowable(pair.first.where(RealmSession.class) return RxJavaInterop.toV2Flowable(pair.first.where(RealmSession.class)
.equalTo(RealmSession.ID, id) .equalTo(RealmSession.ID, id)
.findAll() .findAll()
.<RealmSession>asObservable()); .<RealmSession>asObservable().first());
}, },
pair -> close(pair.first, pair.second) pair -> close(pair.first, pair.second)
) )
...@@ -74,14 +75,9 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe ...@@ -74,14 +75,9 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe
realmSession.setTokenVerified(session.isTokenVerified()); realmSession.setTokenVerified(session.isTokenVerified());
realmSession.setError(session.getError()); realmSession.setError(session.getError());
realm.beginTransaction(); return RealmHelper.copyToRealmOrUpdate(realm, realmSession)
return RxJavaInterop.toV2Flowable(realm.copyToRealmOrUpdate(realmSession)
.asObservable())
.filter(it -> it != null && it.isLoaded() && it.isValid()) .filter(it -> it != null && it.isLoaded() && it.isValid())
.firstElement() .firstElement()
.doOnSuccess(it -> realm.commitTransaction())
.doOnError(throwable -> realm.cancelTransaction())
.doOnEvent((realmObject, throwable) -> close(realm, looper)) .doOnEvent((realmObject, throwable) -> close(realm, looper))
.toSingle() .toSingle()
.map(realmObject -> true); .map(realmObject -> true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment