diff --git a/app/src/androidTest/java/com/nextcloud/talk/activities/MainActivityTest.kt b/app/src/androidTest/java/com/nextcloud/talk/activities/MainActivityTest.kt index ef22238bc..ebbdca247 100644 --- a/app/src/androidTest/java/com/nextcloud/talk/activities/MainActivityTest.kt +++ b/app/src/androidTest/java/com/nextcloud/talk/activities/MainActivityTest.kt @@ -21,12 +21,12 @@ class MainActivityTest { val user = sut.userManager.createOrUpdateUser( "test", UserManager.UserAttributes( - id = 0, + null, serverUrl = "http://server/nc", - currentUser = false, + currentUser = true, userId = "test", token = "test", - displayName = null, + displayName = "Test Name", pushConfigurationState = null, capabilities = null, certificateAlias = null, 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 4a9c89d47..e88fb390d 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 @@ -30,6 +30,7 @@ import androidx.room.Query import androidx.room.Transaction import androidx.room.Update import com.nextcloud.talk.data.user.model.UserEntity +import io.reactivex.Maybe import io.reactivex.Single import io.reactivex.SingleObserver import io.reactivex.disposables.Disposable @@ -41,7 +42,7 @@ import java.lang.Boolean.TRUE abstract class UsersDao { // get active user @Query("SELECT * FROM User where current = 1") - abstract fun getActiveUser(): Single + abstract fun getActiveUser(): Maybe @Query("SELECT * FROM User where current = 1") abstract fun getActiveUserSynchronously(): UserEntity? @@ -66,13 +67,13 @@ abstract class UsersDao { abstract fun getUsers(): Single> @Query("SELECT * FROM User where id = :id") - abstract fun getUserWithId(id: Long): Single + abstract fun getUserWithId(id: Long): Maybe @Query("SELECT * FROM User where id = :id AND scheduledForDeletion != 1") - abstract fun getUserWithIdNotScheduledForDeletion(id: Long): Single + abstract fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe @Query("SELECT * FROM User where userId = :userId") - abstract fun getUserWithUserId(userId: String): Single + abstract fun getUserWithUserId(userId: String): Maybe @Query("SELECT * FROM User where userId != :userId") abstract fun getUsersWithoutUserId(userId: Long): Single> @@ -84,7 +85,7 @@ abstract class UsersDao { abstract fun getUsersNotScheduledForDeletion(): Single> @Query("SELECT * FROM User WHERE username = :username AND baseUrl = :server") - abstract fun getUserWithUsernameAndServer(username: String, server: String): Single + abstract fun getUserWithUsernameAndServer(username: String, server: String): Maybe @Transaction open suspend fun setUserAsActiveWithId(id: Long): Boolean { 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 c74215b62..2f3b1258f 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,22 +23,20 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User +import io.reactivex.Maybe import io.reactivex.Single @Suppress("TooManyFunctions") interface UsersRepository { - fun getActiveUserLiveData(): Single - fun getActiveUser(): Single - fun getActiveUserSynchronously(): User? + fun getActiveUser(): Maybe fun getUsers(): Single> - fun getUserWithId(id: Long): Single - fun getUserWithIdLiveData(id: Long): Single - fun getUserWithIdNotScheduledForDeletion(id: Long): Single - fun getUserWithUserId(userId: String): Single + fun getUserWithId(id: Long): Maybe + fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe + fun getUserWithUserId(userId: String): Maybe fun getUsersWithoutUserId(userId: Long): Single> fun getUsersScheduledForDeletion(): Single> fun getUsersNotScheduledForDeletion(): Single> - fun getUserWithUsernameAndServer(username: String, server: String): Single + fun getUserWithUsernameAndServer(username: String, server: String): Maybe fun updateUser(user: User): Int fun insertUser(user: User): Long suspend fun setUserAsActiveWithId(id: Long): Boolean 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 c0966417d..0a460685a 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,39 +23,29 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User +import io.reactivex.Maybe import io.reactivex.Single @Suppress("TooManyFunctions") class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { - override fun getActiveUserLiveData(): Single { - return usersDao.getActiveUser().map { UserMapper.toModel(it) } - } - override fun getActiveUser(): Single { + override fun getActiveUser(): Maybe { return usersDao.getActiveUser().map { UserMapper.toModel(it) } } - override fun getActiveUserSynchronously(): User? { - return UserMapper.toModel(usersDao.getActiveUserSynchronously()) - } - override fun getUsers(): Single> { return usersDao.getUsers().map { UserMapper.toModel(it) } } - override fun getUserWithId(id: Long): Single { + override fun getUserWithId(id: Long): Maybe { return usersDao.getUserWithId(id).map { UserMapper.toModel(it) } } - override fun getUserWithIdLiveData(id: Long): Single { - return usersDao.getUserWithId(id).map { UserMapper.toModel(it) } - } - - override fun getUserWithIdNotScheduledForDeletion(id: Long): Single { + override fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe { return usersDao.getUserWithIdNotScheduledForDeletion(id).map { UserMapper.toModel(it) } } - override fun getUserWithUserId(userId: String): Single { + override fun getUserWithUserId(userId: String): Maybe { return usersDao.getUserWithUserId(userId).map { UserMapper.toModel(it) } } @@ -71,7 +61,7 @@ class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { return usersDao.getUsersNotScheduledForDeletion().map { UserMapper.toModel(it) } } - override fun getUserWithUsernameAndServer(username: String, server: String): Single { + override fun getUserWithUsernameAndServer(username: String, server: String): Maybe { return usersDao.getUserWithUsernameAndServer(username, server).map { UserMapper.toModel(it) } } 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 a9e8eb469..62551c481 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -29,6 +29,7 @@ import com.nextcloud.talk.models.ExternalSignalingServer import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.push.PushConfigurationState import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import io.reactivex.Maybe import io.reactivex.Single import java.lang.Boolean.TRUE @@ -40,7 +41,7 @@ class UserManager internal constructor(private val userRepository: UsersReposito val usersScheduledForDeletion: Single> get() = userRepository.getUsersScheduledForDeletion() - private fun setAnyUserAndSetAsActive(): Single { + private fun setAnyUserAndSetAsActive(): Single { val results = userRepository.getUsersNotScheduledForDeletion() return results.map { users -> @@ -48,13 +49,13 @@ class UserManager internal constructor(private val userRepository: UsersReposito .firstOrNull() ?.apply { current = true - }?.also { user -> - userRepository.updateUser(user) + }.also { user -> + userRepository.updateUser(user!!) } } } - override val currentUser: Single + override val currentUser: Maybe get() { return userRepository.getActiveUser() } @@ -67,11 +68,11 @@ class UserManager internal constructor(private val userRepository: UsersReposito userRepository.deleteUserWithId(internalId) } - fun getUserById(userId: String): Single { + fun getUserById(userId: String): Maybe { return userRepository.getUserWithUserId(userId) } - fun getUserWithId(id: Long): Single { + fun getUserWithId(id: Long): Maybe { return userRepository.getUserWithId(id) } @@ -91,15 +92,15 @@ class UserManager internal constructor(private val userRepository: UsersReposito } } - fun checkIfUserIsScheduledForDeletion(username: String, server: String): Single { + fun checkIfUserIsScheduledForDeletion(username: String, server: String): Maybe { return userRepository.getUserWithUsernameAndServer(username, server).map { it.scheduledForDeletion } } - fun getUserWithInternalId(id: Long): Single { + fun getUserWithInternalId(id: Long): Maybe { return userRepository.getUserWithIdNotScheduledForDeletion(id) } - fun getIfUserWithUsernameAndServer(username: String, server: String): Single { + fun getIfUserWithUsernameAndServer(username: String, server: String): Maybe { return userRepository.getUserWithUsernameAndServer(username, server).map { TRUE } } @@ -108,22 +109,24 @@ class UserManager internal constructor(private val userRepository: UsersReposito user.scheduledForDeletion = true user.current = false userRepository.updateUser(user) - }.flatMap { - setAnyUserAndSetAsActive() - }.map { TRUE } + } + .toSingle() + .flatMap { + setAnyUserAndSetAsActive() + }.map { TRUE } } fun createOrUpdateUser( username: String?, userAttributes: UserAttributes, - ): Single { + ): Maybe { - val userObservable: Single = if (userAttributes.id == null && - username != null && userAttributes.serverUrl != null - ) { + val userObservable: Maybe = if (userAttributes.id != null) { + userRepository.getUserWithId(userAttributes.id) + } else if (username != null && userAttributes.serverUrl != null) { userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl) } else { - userRepository.getUserWithId(userAttributes.id!!) + Maybe.empty() } return userObservable @@ -141,13 +144,14 @@ class UserManager internal constructor(private val userRepository: UsersReposito user } } - userRepository.insertUser(userModel) + val id = userRepository.insertUser(userModel) + id }.flatMap { id -> userRepository.getUserWithId(id) } } - fun getUserWithUsernameAndServer(username: String, server: String): Single { + fun getUserWithUsernameAndServer(username: String, server: String): Maybe { return userRepository.getUserWithUsernameAndServer(username, server) } @@ -155,12 +159,19 @@ class UserManager internal constructor(private val userRepository: UsersReposito user.userId = userAttributes.userId user.token = userAttributes.token user.displayName = userAttributes.displayName - user.pushConfigurationState = LoganSquare - .parse(userAttributes.pushConfigurationState, PushConfigurationState::class.java) - user.capabilities = LoganSquare.parse(userAttributes.capabilities, Capabilities::class.java) + if (userAttributes.pushConfigurationState != null) { + user.pushConfigurationState = LoganSquare + .parse(userAttributes.pushConfigurationState, PushConfigurationState::class.java) + } + if (userAttributes.capabilities != null) { + user.capabilities = LoganSquare + .parse(userAttributes.capabilities, Capabilities::class.java) + } user.clientCertificate = userAttributes.certificateAlias - user.externalSignalingServer = LoganSquare - .parse(userAttributes.externalSignalingServer, ExternalSignalingServer::class.java) + if (userAttributes.externalSignalingServer != null) { + user.externalSignalingServer = LoganSquare + .parse(userAttributes.externalSignalingServer, ExternalSignalingServer::class.java) + } user.current = userAttributes.currentUser == true } diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt index 0d138648f..b1b457ce5 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt @@ -21,8 +21,8 @@ package com.nextcloud.talk.utils.database.user import com.nextcloud.talk.data.user.model.User -import io.reactivex.Single +import io.reactivex.Maybe interface CurrentUserProviderNew { - val currentUser: Single + val currentUser: Maybe }