Browse Source

Move from Single to Maybe

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Andy Scherzinger 2 years ago
parent
commit
dc83403606

+ 3 - 3
app/src/androidTest/java/com/nextcloud/talk/activities/MainActivityTest.kt

@@ -21,12 +21,12 @@ class MainActivityTest {
         val user = sut.userManager.createOrUpdateUser(
         val user = sut.userManager.createOrUpdateUser(
             "test",
             "test",
             UserManager.UserAttributes(
             UserManager.UserAttributes(
-                id = 0,
+                null,
                 serverUrl = "http://server/nc",
                 serverUrl = "http://server/nc",
-                currentUser = false,
+                currentUser = true,
                 userId = "test",
                 userId = "test",
                 token = "test",
                 token = "test",
-                displayName = null,
+                displayName = "Test Name",
                 pushConfigurationState = null,
                 pushConfigurationState = null,
                 capabilities = null,
                 capabilities = null,
                 certificateAlias = null,
                 certificateAlias = null,

+ 6 - 5
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.Transaction
 import androidx.room.Update
 import androidx.room.Update
 import com.nextcloud.talk.data.user.model.UserEntity
 import com.nextcloud.talk.data.user.model.UserEntity
+import io.reactivex.Maybe
 import io.reactivex.Single
 import io.reactivex.Single
 import io.reactivex.SingleObserver
 import io.reactivex.SingleObserver
 import io.reactivex.disposables.Disposable
 import io.reactivex.disposables.Disposable
@@ -41,7 +42,7 @@ import java.lang.Boolean.TRUE
 abstract class UsersDao {
 abstract class UsersDao {
     // get active user
     // get active user
     @Query("SELECT * FROM User where current = 1")
     @Query("SELECT * FROM User where current = 1")
-    abstract fun getActiveUser(): Single<UserEntity?>
+    abstract fun getActiveUser(): Maybe<UserEntity>
 
 
     @Query("SELECT * FROM User where current = 1")
     @Query("SELECT * FROM User where current = 1")
     abstract fun getActiveUserSynchronously(): UserEntity?
     abstract fun getActiveUserSynchronously(): UserEntity?
@@ -66,13 +67,13 @@ abstract class UsersDao {
     abstract fun getUsers(): Single<List<UserEntity>>
     abstract fun getUsers(): Single<List<UserEntity>>
 
 
     @Query("SELECT * FROM User where id = :id")
     @Query("SELECT * FROM User where id = :id")
-    abstract fun getUserWithId(id: Long): Single<UserEntity?>
+    abstract fun getUserWithId(id: Long): Maybe<UserEntity>
 
 
     @Query("SELECT * FROM User where id = :id AND scheduledForDeletion != 1")
     @Query("SELECT * FROM User where id = :id AND scheduledForDeletion != 1")
-    abstract fun getUserWithIdNotScheduledForDeletion(id: Long): Single<UserEntity?>
+    abstract fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe<UserEntity>
 
 
     @Query("SELECT * FROM User where userId = :userId")
     @Query("SELECT * FROM User where userId = :userId")
-    abstract fun getUserWithUserId(userId: String): Single<UserEntity?>
+    abstract fun getUserWithUserId(userId: String): Maybe<UserEntity>
 
 
     @Query("SELECT * FROM User where userId != :userId")
     @Query("SELECT * FROM User where userId != :userId")
     abstract fun getUsersWithoutUserId(userId: Long): Single<List<UserEntity>>
     abstract fun getUsersWithoutUserId(userId: Long): Single<List<UserEntity>>
@@ -84,7 +85,7 @@ abstract class UsersDao {
     abstract fun getUsersNotScheduledForDeletion(): Single<List<UserEntity>>
     abstract fun getUsersNotScheduledForDeletion(): Single<List<UserEntity>>
 
 
     @Query("SELECT * FROM User WHERE username = :username AND baseUrl = :server")
     @Query("SELECT * FROM User WHERE username = :username AND baseUrl = :server")
-    abstract fun getUserWithUsernameAndServer(username: String, server: String): Single<UserEntity?>
+    abstract fun getUserWithUsernameAndServer(username: String, server: String): Maybe<UserEntity>
 
 
     @Transaction
     @Transaction
     open suspend fun setUserAsActiveWithId(id: Long): Boolean {
     open suspend fun setUserAsActiveWithId(id: Long): Boolean {

+ 6 - 8
app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt

@@ -23,22 +23,20 @@
 package com.nextcloud.talk.data.user
 package com.nextcloud.talk.data.user
 
 
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
+import io.reactivex.Maybe
 import io.reactivex.Single
 import io.reactivex.Single
 
 
 @Suppress("TooManyFunctions")
 @Suppress("TooManyFunctions")
 interface UsersRepository {
 interface UsersRepository {
-    fun getActiveUserLiveData(): Single<User?>
-    fun getActiveUser(): Single<User?>
-    fun getActiveUserSynchronously(): User?
+    fun getActiveUser(): Maybe<User>
     fun getUsers(): Single<List<User>>
     fun getUsers(): Single<List<User>>
-    fun getUserWithId(id: Long): Single<User?>
-    fun getUserWithIdLiveData(id: Long): Single<User?>
-    fun getUserWithIdNotScheduledForDeletion(id: Long): Single<User?>
-    fun getUserWithUserId(userId: String): Single<User?>
+    fun getUserWithId(id: Long): Maybe<User>
+    fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe<User>
+    fun getUserWithUserId(userId: String): Maybe<User>
     fun getUsersWithoutUserId(userId: Long): Single<List<User>>
     fun getUsersWithoutUserId(userId: Long): Single<List<User>>
     fun getUsersScheduledForDeletion(): Single<List<User>>
     fun getUsersScheduledForDeletion(): Single<List<User>>
     fun getUsersNotScheduledForDeletion(): Single<List<User>>
     fun getUsersNotScheduledForDeletion(): Single<List<User>>
-    fun getUserWithUsernameAndServer(username: String, server: String): Single<User?>
+    fun getUserWithUsernameAndServer(username: String, server: String): Maybe<User>
     fun updateUser(user: User): Int
     fun updateUser(user: User): Int
     fun insertUser(user: User): Long
     fun insertUser(user: User): Long
     suspend fun setUserAsActiveWithId(id: Long): Boolean
     suspend fun setUserAsActiveWithId(id: Long): Boolean

+ 6 - 16
app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt

@@ -23,39 +23,29 @@
 package com.nextcloud.talk.data.user
 package com.nextcloud.talk.data.user
 
 
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
+import io.reactivex.Maybe
 import io.reactivex.Single
 import io.reactivex.Single
 
 
 @Suppress("TooManyFunctions")
 @Suppress("TooManyFunctions")
 class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository {
 class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository {
-    override fun getActiveUserLiveData(): Single<User?> {
-        return usersDao.getActiveUser().map { UserMapper.toModel(it) }
-    }
 
 
-    override fun getActiveUser(): Single<User?> {
+    override fun getActiveUser(): Maybe<User> {
         return usersDao.getActiveUser().map { UserMapper.toModel(it) }
         return usersDao.getActiveUser().map { UserMapper.toModel(it) }
     }
     }
 
 
-    override fun getActiveUserSynchronously(): User? {
-        return UserMapper.toModel(usersDao.getActiveUserSynchronously())
-    }
-
     override fun getUsers(): Single<List<User>> {
     override fun getUsers(): Single<List<User>> {
         return usersDao.getUsers().map { UserMapper.toModel(it) }
         return usersDao.getUsers().map { UserMapper.toModel(it) }
     }
     }
 
 
-    override fun getUserWithId(id: Long): Single<User?> {
-        return usersDao.getUserWithId(id).map { UserMapper.toModel(it) }
-    }
-
-    override fun getUserWithIdLiveData(id: Long): Single<User?> {
+    override fun getUserWithId(id: Long): Maybe<User> {
         return usersDao.getUserWithId(id).map { UserMapper.toModel(it) }
         return usersDao.getUserWithId(id).map { UserMapper.toModel(it) }
     }
     }
 
 
-    override fun getUserWithIdNotScheduledForDeletion(id: Long): Single<User?> {
+    override fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe<User> {
         return usersDao.getUserWithIdNotScheduledForDeletion(id).map { UserMapper.toModel(it) }
         return usersDao.getUserWithIdNotScheduledForDeletion(id).map { UserMapper.toModel(it) }
     }
     }
 
 
-    override fun getUserWithUserId(userId: String): Single<User?> {
+    override fun getUserWithUserId(userId: String): Maybe<User> {
         return usersDao.getUserWithUserId(userId).map { UserMapper.toModel(it) }
         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) }
         return usersDao.getUsersNotScheduledForDeletion().map { UserMapper.toModel(it) }
     }
     }
 
 
-    override fun getUserWithUsernameAndServer(username: String, server: String): Single<User?> {
+    override fun getUserWithUsernameAndServer(username: String, server: String): Maybe<User> {
         return usersDao.getUserWithUsernameAndServer(username, server).map { UserMapper.toModel(it) }
         return usersDao.getUserWithUsernameAndServer(username, server).map { UserMapper.toModel(it) }
     }
     }
 
 

+ 35 - 24
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.capabilities.Capabilities
 import com.nextcloud.talk.models.json.push.PushConfigurationState
 import com.nextcloud.talk.models.json.push.PushConfigurationState
 import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
 import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
+import io.reactivex.Maybe
 import io.reactivex.Single
 import io.reactivex.Single
 import java.lang.Boolean.TRUE
 import java.lang.Boolean.TRUE
 
 
@@ -40,7 +41,7 @@ class UserManager internal constructor(private val userRepository: UsersReposito
     val usersScheduledForDeletion: Single<List<User>>
     val usersScheduledForDeletion: Single<List<User>>
         get() = userRepository.getUsersScheduledForDeletion()
         get() = userRepository.getUsersScheduledForDeletion()
 
 
-    private fun setAnyUserAndSetAsActive(): Single<User?> {
+    private fun setAnyUserAndSetAsActive(): Single<User> {
         val results = userRepository.getUsersNotScheduledForDeletion()
         val results = userRepository.getUsersNotScheduledForDeletion()
 
 
         return results.map { users ->
         return results.map { users ->
@@ -48,13 +49,13 @@ class UserManager internal constructor(private val userRepository: UsersReposito
                 .firstOrNull()
                 .firstOrNull()
                 ?.apply {
                 ?.apply {
                     current = true
                     current = true
-                }?.also { user ->
-                    userRepository.updateUser(user)
+                }.also { user ->
+                    userRepository.updateUser(user!!)
                 }
                 }
         }
         }
     }
     }
 
 
-    override val currentUser: Single<User?>
+    override val currentUser: Maybe<User>
         get() {
         get() {
             return userRepository.getActiveUser()
             return userRepository.getActiveUser()
         }
         }
@@ -67,11 +68,11 @@ class UserManager internal constructor(private val userRepository: UsersReposito
         userRepository.deleteUserWithId(internalId)
         userRepository.deleteUserWithId(internalId)
     }
     }
 
 
-    fun getUserById(userId: String): Single<User?> {
+    fun getUserById(userId: String): Maybe<User> {
         return userRepository.getUserWithUserId(userId)
         return userRepository.getUserWithUserId(userId)
     }
     }
 
 
-    fun getUserWithId(id: Long): Single<User?> {
+    fun getUserWithId(id: Long): Maybe<User> {
         return userRepository.getUserWithId(id)
         return userRepository.getUserWithId(id)
     }
     }
 
 
@@ -91,15 +92,15 @@ class UserManager internal constructor(private val userRepository: UsersReposito
         }
         }
     }
     }
 
 
-    fun checkIfUserIsScheduledForDeletion(username: String, server: String): Single<Boolean> {
+    fun checkIfUserIsScheduledForDeletion(username: String, server: String): Maybe<Boolean> {
         return userRepository.getUserWithUsernameAndServer(username, server).map { it.scheduledForDeletion }
         return userRepository.getUserWithUsernameAndServer(username, server).map { it.scheduledForDeletion }
     }
     }
 
 
-    fun getUserWithInternalId(id: Long): Single<User?> {
+    fun getUserWithInternalId(id: Long): Maybe<User> {
         return userRepository.getUserWithIdNotScheduledForDeletion(id)
         return userRepository.getUserWithIdNotScheduledForDeletion(id)
     }
     }
 
 
-    fun getIfUserWithUsernameAndServer(username: String, server: String): Single<Boolean> {
+    fun getIfUserWithUsernameAndServer(username: String, server: String): Maybe<Boolean> {
         return userRepository.getUserWithUsernameAndServer(username, server).map { TRUE }
         return userRepository.getUserWithUsernameAndServer(username, server).map { TRUE }
     }
     }
 
 
@@ -108,22 +109,24 @@ class UserManager internal constructor(private val userRepository: UsersReposito
             user.scheduledForDeletion = true
             user.scheduledForDeletion = true
             user.current = false
             user.current = false
             userRepository.updateUser(user)
             userRepository.updateUser(user)
-        }.flatMap {
-            setAnyUserAndSetAsActive()
-        }.map { TRUE }
+        }
+            .toSingle()
+            .flatMap {
+                setAnyUserAndSetAsActive()
+            }.map { TRUE }
     }
     }
 
 
     fun createOrUpdateUser(
     fun createOrUpdateUser(
         username: String?,
         username: String?,
         userAttributes: UserAttributes,
         userAttributes: UserAttributes,
-    ): Single<User?> {
+    ): Maybe<User?> {
 
 
-        val userObservable: Single<User?> = if (userAttributes.id == null &&
-            username != null && userAttributes.serverUrl != null
-        ) {
+        val userObservable: Maybe<User> = if (userAttributes.id != null) {
+            userRepository.getUserWithId(userAttributes.id)
+        } else if (username != null && userAttributes.serverUrl != null) {
             userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl)
             userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl)
         } else {
         } else {
-            userRepository.getUserWithId(userAttributes.id!!)
+            Maybe.empty()
         }
         }
 
 
         return userObservable
         return userObservable
@@ -141,13 +144,14 @@ class UserManager internal constructor(private val userRepository: UsersReposito
                         user
                         user
                     }
                     }
                 }
                 }
-                userRepository.insertUser(userModel)
+                val id = userRepository.insertUser(userModel)
+                id
             }.flatMap { id ->
             }.flatMap { id ->
                 userRepository.getUserWithId(id)
                 userRepository.getUserWithId(id)
             }
             }
     }
     }
 
 
-    fun getUserWithUsernameAndServer(username: String, server: String): Single<User?> {
+    fun getUserWithUsernameAndServer(username: String, server: String): Maybe<User> {
         return userRepository.getUserWithUsernameAndServer(username, server)
         return userRepository.getUserWithUsernameAndServer(username, server)
     }
     }
 
 
@@ -155,12 +159,19 @@ class UserManager internal constructor(private val userRepository: UsersReposito
         user.userId = userAttributes.userId
         user.userId = userAttributes.userId
         user.token = userAttributes.token
         user.token = userAttributes.token
         user.displayName = userAttributes.displayName
         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.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
         user.current = userAttributes.currentUser == true
     }
     }
 
 

+ 2 - 2
app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt

@@ -21,8 +21,8 @@
 package com.nextcloud.talk.utils.database.user
 package com.nextcloud.talk.utils.database.user
 
 
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
-import io.reactivex.Single
+import io.reactivex.Maybe
 
 
 interface CurrentUserProviderNew {
 interface CurrentUserProviderNew {
-    val currentUser: Single<User?>
+    val currentUser: Maybe<User>
 }
 }