From a37f947eb9222590840822aeb77a283e3e7649a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Wed, 14 Dec 2022 12:15:21 +0100 Subject: [PATCH] PushUtils: update only pushState when updating users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is to work around a race condition where this class would asynchronously overwrite other user attributes with old values after a user switch. Co-authored-by: Marcel Hibbe Signed-off-by: Álvaro Brey --- app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt | 4 ++++ .../java/com/nextcloud/talk/data/user/UsersRepository.kt | 2 ++ .../java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt | 5 +++++ app/src/main/java/com/nextcloud/talk/users/UserManager.kt | 4 ++++ app/src/main/java/com/nextcloud/talk/utils/PushUtils.java | 3 +-- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt index d4e333163..565d980f1 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt @@ -29,6 +29,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update import com.nextcloud.talk.data.user.model.UserEntity +import com.nextcloud.talk.models.json.push.PushConfigurationState import io.reactivex.Maybe import io.reactivex.Observable import io.reactivex.Single @@ -89,6 +90,9 @@ abstract class UsersDao { ) abstract fun setUserAsActiveWithId(id: Long): Int + @Query("Update User SET pushConfigurationState = :state WHERE id == :id") + abstract fun updatePushState(id: Long, state: PushConfigurationState): Single + companion object { const val TAG = "UsersDao" } diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt index e5bdcc3f2..e8470b59f 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.push.PushConfigurationState import io.reactivex.Maybe import io.reactivex.Observable import io.reactivex.Single @@ -42,4 +43,5 @@ interface UsersRepository { fun insertUser(user: User): Long fun setUserAsActiveWithId(id: Long): Single fun deleteUser(user: User): Int + fun updatePushState(id: Long, state: PushConfigurationState): Single } diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt index 35faca8a0..d6723d7ee 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.push.PushConfigurationState import io.reactivex.Maybe import io.reactivex.Observable import io.reactivex.Single @@ -86,4 +87,8 @@ class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { override fun deleteUser(user: User): Int { return usersDao.deleteUser(UserMapper.toEntity(user)) } + + override fun updatePushState(id: Long, state: PushConfigurationState): Single { + return usersDao.updatePushState(id, state) + } } diff --git a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt index 814eeb895..2fb2acd12 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -230,6 +230,10 @@ class UserManager internal constructor(private val userRepository: UsersReposito return user } + fun updatePushState(id: Long, state: PushConfigurationState): Single { + return userRepository.updatePushState(id, state) + } + companion object { const val TAG = "UserManager" } diff --git a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java index 70b2179a1..1032bda91 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/PushUtils.java @@ -338,8 +338,7 @@ public class PushUtils { pushConfigurationState.setUserPublicKey(proxyMap.get("userPublicKey")); pushConfigurationState.setUsesRegularPass(Boolean.FALSE); - user.setPushConfigurationState(pushConfigurationState); - userManager.saveUser(user).subscribe(new SingleObserver() { + userManager.updatePushState(user.getId(), pushConfigurationState).subscribe(new SingleObserver() { @Override public void onSubscribe(Disposable d) { // unused atm