Commit 6f9e4848 authored by Lucio Maciel's avatar Lucio Maciel

Fix realm threading on RealmUserRepository

parent 36955585
...@@ -2,22 +2,23 @@ package chat.rocket.persistence.realm.repositories; ...@@ -2,22 +2,23 @@ package chat.rocket.persistence.realm.repositories;
import android.os.Looper; import android.os.Looper;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
import com.hadisatrio.optional.Optional;
import io.reactivex.Flowable; import com.hadisatrio.optional.Optional;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.realm.Case;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import chat.rocket.core.models.User; import chat.rocket.core.models.User;
import chat.rocket.core.repositories.UserRepository; import chat.rocket.core.repositories.UserRepository;
import chat.rocket.persistence.realm.RealmStore; import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.persistence.realm.models.ddp.RealmUser; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import hu.akarnokd.rxjava.interop.RxJavaInterop; import hu.akarnokd.rxjava.interop.RxJavaInterop;
import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.realm.Case;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
public class RealmUserRepository extends RealmRepository implements UserRepository { public class RealmUserRepository extends RealmRepository implements UserRepository {
private final String hostname; private final String hostname;
...@@ -28,7 +29,8 @@ public class RealmUserRepository extends RealmRepository implements UserReposito ...@@ -28,7 +29,8 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
@Override @Override
public Flowable<Optional<User>> getCurrent() { public Flowable<Optional<User>> getCurrent() {
return Flowable.defer(this::realmGetCurrent) return Flowable.defer(() ->
realmGetCurrent()
.unsubscribeOn(AndroidSchedulers.from(Looper.myLooper())) .unsubscribeOn(AndroidSchedulers.from(Looper.myLooper()))
.filter(it -> it != null && it.isLoaded() && it.isValid()) .filter(it -> it != null && it.isLoaded() && it.isValid())
.map(realmUsers -> { .map(realmUsers -> {
...@@ -37,7 +39,7 @@ public class RealmUserRepository extends RealmRepository implements UserReposito ...@@ -37,7 +39,7 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
} }
return Optional.<User>absent(); return Optional.<User>absent();
}); }));
} }
private Flowable<RealmResults<RealmUser>> realmGetCurrent() { private Flowable<RealmResults<RealmUser>> realmGetCurrent() {
...@@ -53,7 +55,8 @@ public class RealmUserRepository extends RealmRepository implements UserReposito ...@@ -53,7 +55,8 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
@Override @Override
public Flowable<Optional<User>> getByUsername(String username) { public Flowable<Optional<User>> getByUsername(String username) {
return Flowable.defer(() -> realmGetByUsername(username)) return Flowable.defer(() ->
realmGetByUsername(username)
.unsubscribeOn(AndroidSchedulers.from(Looper.myLooper())) .unsubscribeOn(AndroidSchedulers.from(Looper.myLooper()))
.map(optional -> { .map(optional -> {
if (optional.isPresent()) { if (optional.isPresent()) {
...@@ -61,7 +64,7 @@ public class RealmUserRepository extends RealmRepository implements UserReposito ...@@ -61,7 +64,7 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
} }
return Optional.absent(); return Optional.absent();
}); }));
} }
private Flowable<Optional<RealmUser>> realmGetByUsername(String username) { private Flowable<Optional<RealmUser>> realmGetByUsername(String username) {
...@@ -89,11 +92,12 @@ public class RealmUserRepository extends RealmRepository implements UserReposito ...@@ -89,11 +92,12 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
@Override @Override
public Flowable<List<User>> getSortedLikeName(String name, int limit) { public Flowable<List<User>> getSortedLikeName(String name, int limit) {
return Flowable.defer(() -> realmGetSortedLikeName(name)) return Flowable.defer(() ->
realmGetSortedLikeName(name)
.unsubscribeOn(AndroidSchedulers.from(Looper.myLooper())) .unsubscribeOn(AndroidSchedulers.from(Looper.myLooper()))
.filter(realmUsers -> realmUsers != null && realmUsers.isLoaded() .filter(realmUsers -> realmUsers != null && realmUsers.isLoaded()
&& realmUsers.isValid()) && realmUsers.isValid())
.map(realmUsers -> toList(safeSubList(realmUsers, 0, limit))); .map(realmUsers -> toList(safeSubList(realmUsers, 0, limit))));
} }
private Flowable<RealmResults<RealmUser>> realmGetSortedLikeName(String name) { private Flowable<RealmResults<RealmUser>> realmGetSortedLikeName(String name) {
......
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