Unverified Commit 449e639e authored by Leonardo Aramaki's avatar Leonardo Aramaki Committed by GitHub

Merge pull request #677 from RocketChat/fixes

Fix crash when caching username and login failure when LDAP_Enable setting doesn't exist
parents a4fb6a00 9c64b6c2
...@@ -408,7 +408,11 @@ object RocketChatCache { ...@@ -408,7 +408,11 @@ object RocketChatCache {
}, BackpressureStrategy.LATEST) }, BackpressureStrategy.LATEST)
} }
fun setUserId(userId: String) = setString(KEY_USER_ID, userId) fun setUserId(userId: String?) {
userId?.let {
setString(KEY_USER_ID, userId)
}
}
fun getUserId(): String? = getString(KEY_USER_ID, null) fun getUserId(): String? = getString(KEY_USER_ID, null)
...@@ -420,7 +424,11 @@ object RocketChatCache { ...@@ -420,7 +424,11 @@ object RocketChatCache {
fun getUserName(): String? = getString(KEY_USER_NAME, null) fun getUserName(): String? = getString(KEY_USER_NAME, null)
fun setUserUsername(username: String) = setString(KEY_USER_USERNAME, username) fun setUserUsername(username: String?) {
username?.let {
setString(KEY_USER_USERNAME, username)
}
}
fun getUserUsername(): String? = getString(KEY_USER_USERNAME, null) fun getUserUsername(): String? = getString(KEY_USER_USERNAME, null)
} }
\ No newline at end of file
...@@ -20,68 +20,71 @@ import io.realm.RealmResults; ...@@ -20,68 +20,71 @@ import io.realm.RealmResults;
* observe the user with emails. * observe the user with emails.
*/ */
public class CurrentUserObserver extends AbstractModelObserver<RealmUser> { public class CurrentUserObserver extends AbstractModelObserver<RealmUser> {
private final MethodCallHelper methodCall; private final MethodCallHelper methodCall;
private boolean currentUserExists; private boolean currentUserExists;
private ArrayList<Registrable> listeners; private ArrayList<Registrable> listeners;
public CurrentUserObserver(Context context, String hostname, public CurrentUserObserver(Context context, String hostname,
RealmHelper realmHelper) { RealmHelper realmHelper) {
super(context, hostname, realmHelper); super(context, hostname, realmHelper);
methodCall = new MethodCallHelper(realmHelper); methodCall = new MethodCallHelper(realmHelper);
currentUserExists = false; currentUserExists = false;
} }
@Override @Override
public RealmResults<RealmUser> queryItems(Realm realm) { public RealmResults<RealmUser> queryItems(Realm realm) {
return RealmUser.queryCurrentUser(realm).findAll(); return RealmUser.queryCurrentUser(realm).findAll();
} }
@Override @Override
public void onUpdateResults(List<RealmUser> results) { public void onUpdateResults(List<RealmUser> results) {
boolean exists = !results.isEmpty(); boolean exists = !results.isEmpty();
if (currentUserExists != exists) { if (currentUserExists != exists) {
if (exists) { if (exists) {
onLogin(results.get(0)); onLogin(results.get(0));
} else { } else {
onLogout(); onLogout();
} }
currentUserExists = exists; currentUserExists = exists;
}
} }
}
@DebugLog @DebugLog
private void onLogin(RealmUser user) { private void onLogin(RealmUser user) {
if (listeners != null) { if (listeners != null) {
onLogout(); onLogout();
} }
listeners = new ArrayList<>(); listeners = new ArrayList<>();
RocketChatCache.INSTANCE.setUserId(user.getId()); String userId = user.getId();
RocketChatCache.INSTANCE.setUserUsername(user.getUsername()); String username = user.getUsername();
RocketChatCache.INSTANCE.setUserName(user.getName()); String name = user.getName();
final String userId = user.getId();
// get and observe Room subscriptions. RocketChatCache.INSTANCE.setUserId(userId);
methodCall.getRoomSubscriptions().onSuccess(task -> { RocketChatCache.INSTANCE.setUserUsername(username);
if (listeners != null) { RocketChatCache.INSTANCE.setUserName(name);
Registrable listener = new StreamNotifyUserSubscriptionsChanged(
context, hostname, realmHelper, userId); // get and observe Room subscriptions.
listener.register(); methodCall.getRoomSubscriptions().onSuccess(task -> {
listeners.add(listener); if (listeners != null) {
} Registrable listener = new StreamNotifyUserSubscriptionsChanged(
return null; context, hostname, realmHelper, userId);
}).continueWith(new LogIfError()); listener.register();
} listeners.add(listener);
}
return null;
}).continueWith(new LogIfError());
}
@DebugLog @DebugLog
private void onLogout() { private void onLogout() {
if (listeners != null) { if (listeners != null) {
for (Registrable listener : listeners) { for (Registrable listener : listeners) {
listener.unregister(); listener.unregister();
} }
}
listeners = null;
} }
listeners = null;
}
} }
...@@ -65,7 +65,10 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe ...@@ -65,7 +65,10 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe
).continueWith(task -> { ).continueWith(task -> {
if (task.isFaulted()) { if (task.isFaulted()) {
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
GcmPushRegistration.queryDefault(realm).findFirst().setSyncState(SyncState.FAILED); GcmPushRegistration gcmPushRegistration = GcmPushRegistration.queryDefault(realm).findFirst();
if (gcmPushRegistration != null) {
gcmPushRegistration.setSyncState(SyncState.FAILED);
}
return null; return null;
}).continueWith(new LogIfError()); }).continueWith(new LogIfError());
} }
......
...@@ -15,32 +15,46 @@ import io.reactivex.android.schedulers.AndroidSchedulers; ...@@ -15,32 +15,46 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.realm.RealmResults; import io.realm.RealmResults;
public class RealmPublicSettingRepository extends RealmRepository public class RealmPublicSettingRepository extends RealmRepository
implements PublicSettingRepository { implements PublicSettingRepository {
private final String hostname; private final String hostname;
public RealmPublicSettingRepository(String hostname) { public RealmPublicSettingRepository(String hostname) {
this.hostname = hostname; this.hostname = hostname;
} }
@Override @Override
public Single<Optional<PublicSetting>> getById(String id) { public Single<Optional<PublicSetting>> getById(String id) {
return Single.defer(() -> Flowable.using( return Single.defer(() -> Flowable.using(
() -> new Pair<>(RealmStore.getRealm(hostname), Looper.myLooper()), () -> new Pair<>(RealmStore.getRealm(hostname), Looper.myLooper()),
pair -> { pair -> {
if (pair.first == null) { if (pair.first == null) {
return Flowable.empty(); return Flowable.empty();
} }
return pair.first.where(RealmPublicSetting.class)
.equalTo(RealmPublicSetting.ID, id) return pair.first.where(RealmPublicSetting.class)
.findAll() .equalTo(RealmPublicSetting.ID, id)
.<RealmResults<RealmPublicSetting>>asFlowable(); .findAll()
}, .<RealmResults<RealmPublicSetting>>asFlowable();
pair -> close(pair.first, pair.second) },
) pair -> close(pair.first, pair.second)
.unsubscribeOn(AndroidSchedulers.from(Looper.myLooper())) )
.filter(it -> it.isLoaded() && it.isValid() && it.size() > 0) .unsubscribeOn(AndroidSchedulers.from(Looper.myLooper()))
.map(it -> Optional.of(it.get(0).asPublicSetting())) .filter(it -> it.isLoaded() && it.isValid())
.first(Optional.absent())); .map(it -> getPublicSettingOrDefault(id, it))
} .first(Optional.absent()));
}
private Optional<PublicSetting> getPublicSettingOrDefault(String id, RealmResults<RealmPublicSetting> results) {
if (results.size() > 0) {
return Optional.of(results.get(0).asPublicSetting());
}
PublicSetting defaultSetting = PublicSetting.builder()
.setId(id)
.setValue("")
.setUpdatedAt(0L)
.build();
return Optional.of(defaultSetting);
}
} }
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