Replace Observable with Single, let Repositories serve Models

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2022-06-23 20:10:09 +02:00
parent 359104d6ba
commit 74fc56fa7e
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
12 changed files with 284 additions and 472 deletions

View File

@ -46,7 +46,7 @@ import com.nextcloud.talk.controllers.ServerSelectionController
import com.nextcloud.talk.controllers.SettingsController import com.nextcloud.talk.controllers.SettingsController
import com.nextcloud.talk.controllers.WebViewLoginController import com.nextcloud.talk.controllers.WebViewLoginController
import com.nextcloud.talk.controllers.base.providers.ActionBarProvider import com.nextcloud.talk.controllers.base.providers.ActionBarProvider
import com.nextcloud.talk.data.user.model.UserNgEntity import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ActivityMainBinding import com.nextcloud.talk.databinding.ActivityMainBinding
import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.database.UserEntity
import com.nextcloud.talk.models.json.conversations.RoomOverall import com.nextcloud.talk.models.json.conversations.RoomOverall
@ -60,6 +60,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
@ -119,12 +120,12 @@ class MainActivity : BaseActivity(), ActionBarProvider {
appPreferences.isDbRoomMigrated = true appPreferences.isDbRoomMigrated = true
} }
userManager.users.subscribe(object : Observer<List<UserNgEntity>> { userManager.users.subscribe(object : SingleObserver<List<User>> {
override fun onSubscribe(d: Disposable) { override fun onSubscribe(d: Disposable) {
// unused atm // unused atm
} }
override fun onNext(users: List<UserNgEntity>) { override fun onSuccess(users: List<User>) {
if (users.isNotEmpty()) { if (users.isNotEmpty()) {
runOnUiThread { runOnUiThread {
setDefaultRootController() setDefaultRootController()
@ -137,11 +138,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
// unused atm Log.e(TAG, "Error loading existing users", e)
}
override fun onComplete() {
// unused atm
} }
}) })
} else { } else {
@ -203,12 +200,12 @@ class MainActivity : BaseActivity(), ActionBarProvider {
} }
fun resetConversationsList() { fun resetConversationsList() {
userManager.users.subscribe(object : Observer<List<UserNgEntity>> { userManager.users.subscribe(object : SingleObserver<List<User>> {
override fun onSubscribe(d: Disposable) { override fun onSubscribe(d: Disposable) {
// unused atm TODO("Not yet implemented")
} }
override fun onNext(users: List<UserNgEntity>) { override fun onSuccess(users: List<User>) {
if (users.isNotEmpty()) { if (users.isNotEmpty()) {
runOnUiThread { runOnUiThread {
setDefaultRootController() setDefaultRootController()
@ -217,11 +214,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
// unused atm Log.e(TAG, "Error loading existing users", e)
}
override fun onComplete() {
// unused atm
} }
}) })
} }
@ -262,7 +255,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
val user = userId.substringBeforeLast("@") val user = userId.substringBeforeLast("@")
val baseUrl = userId.substringAfterLast("@") val baseUrl = userId.substringAfterLast("@")
if (userManager.currentUser.blockingFirst()?.baseUrl?.endsWith(baseUrl) == true) { if (userManager.currentUser.blockingGet()?.baseUrl?.endsWith(baseUrl) == true) {
startConversation(user) startConversation(user)
} else { } else {
Snackbar.make( Snackbar.make(
@ -279,7 +272,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
private fun startConversation(userId: String) { private fun startConversation(userId: String) {
val roomType = "1" val roomType = "1"
val currentUser = userManager.currentUser.blockingFirst() val currentUser = userManager.currentUser.blockingGet()
val apiVersion = ApiUtils.getConversationApiVersion(currentUser, intArrayOf(ApiUtils.APIv4, 1)) val apiVersion = ApiUtils.getConversationApiVersion(currentUser, intArrayOf(ApiUtils.APIv4, 1))
val credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token) val credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token)
@ -327,7 +320,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
Parcels.wrap(roomOverall.ocs!!.data) Parcels.wrap(roomOverall.ocs!!.data)
) )
remapChatController( remapChatController(
router!!, currentUser!!.id, router!!, currentUser!!.id!!,
roomOverall.ocs!!.data!!.token!!, bundle, true roomOverall.ocs!!.data!!.token!!, bundle, true
) )
} }

View File

@ -69,7 +69,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.setAppT
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.base.NewBaseController
import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.controllers.util.viewBinding
import com.nextcloud.talk.data.user.model.UserNgEntity import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ControllerSettingsBinding import com.nextcloud.talk.databinding.ControllerSettingsBinding
import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.AccountRemovalWorker
import com.nextcloud.talk.jobs.ContactAddressBookWorker import com.nextcloud.talk.jobs.ContactAddressBookWorker
@ -121,7 +121,7 @@ class SettingsController : NewBaseController(R.layout.controller_settings) {
lateinit var currentUserProvider: CurrentUserProviderNew lateinit var currentUserProvider: CurrentUserProviderNew
private var saveStateHandler: LovelySaveStateHandler? = null private var saveStateHandler: LovelySaveStateHandler? = null
private var currentUser: UserNgEntity? = null private var currentUser: User? = null
private var credentials: String? = null private var credentials: String? = null
private var proxyTypeChangeListener: OnPreferenceValueChangedListener<String>? = null private var proxyTypeChangeListener: OnPreferenceValueChangedListener<String>? = null
private var proxyCredentialsChangeListener: OnPreferenceValueChangedListener<Boolean>? = null private var proxyCredentialsChangeListener: OnPreferenceValueChangedListener<Boolean>? = null
@ -139,7 +139,7 @@ class SettingsController : NewBaseController(R.layout.controller_settings) {
resources!!.getString(R.string.nc_settings) resources!!.getString(R.string.nc_settings)
private fun getCurrentUser() { private fun getCurrentUser() {
currentUser = currentUserProvider.currentUser.firstOrError().blockingGet() currentUser = currentUserProvider.currentUser.blockingGet()
credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token) credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
} }
@ -187,8 +187,6 @@ class SettingsController : NewBaseController(R.layout.controller_settings) {
setupPhoneBookIntegration() setupPhoneBookIntegration()
setupClientCertView() setupClientCertView()
Log.i(TAG, "Current user: " + currentUser?.displayName)
} }
private fun setupPhoneBookIntegration() { private fun setupPhoneBookIntegration() {
@ -436,7 +434,7 @@ class SettingsController : NewBaseController(R.layout.controller_settings) {
} }
private fun removeCurrentAccount() { private fun removeCurrentAccount() {
val otherUserExists = userUtils.scheduleUserForDeletionWithId(currentUser!!.id) val otherUserExists = userUtils.scheduleUserForDeletionWithId(currentUser!!.id!!)
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
WorkManager.getInstance().enqueue(accountRemovalWork) WorkManager.getInstance().enqueue(accountRemovalWork)
if (otherUserExists && view != null) { if (otherUserExists && view != null) {

View File

@ -0,0 +1,79 @@
/*
* Nextcloud Talk application
*
* @author Andy Scherzinger
* Copyright (C) 2022 Andy Scherzinger <infoi@andy-scherzinger.de>
*
* model program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* model program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with model program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.data.user
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.data.user.model.UserNgEntity
object UserMapper {
fun toModel(entities: List<UserNgEntity?>?): List<User> {
return if (entities == null) {
ArrayList()
} else {
val users = ArrayList<User>()
for (entity in entities) {
users.add(toModel(entity)!!)
}
users
}
}
fun toModel(entity: UserNgEntity?): User? {
return if (entity == null) {
null
} else {
User(
entity.id,
entity.userId,
entity.username,
entity.baseUrl,
entity.token,
entity.displayName,
entity.pushConfigurationState,
entity.capabilities,
entity.clientCertificate,
entity.externalSignalingServer,
entity.current,
entity.scheduledForDeletion
)
}
}
fun toEntity(model: User): UserNgEntity {
var userNgEntity: UserNgEntity? = null
model.id?.let {
userNgEntity = UserNgEntity(it, model.userId, model.username, model.baseUrl)
} ?: run {
userNgEntity = UserNgEntity(userId = model.userId, username = model.username, baseUrl = model.baseUrl)
}
userNgEntity!!.token = model.token
userNgEntity!!.displayName = model.displayName
userNgEntity!!.pushConfigurationState = model.pushConfigurationState
userNgEntity!!.capabilities = model.capabilities
userNgEntity!!.clientCertificate = model.clientCertificate
userNgEntity!!.externalSignalingServer = model.externalSignalingServer
userNgEntity!!.current = model.current
userNgEntity!!.scheduledForDeletion = model.scheduledForDeletion
return userNgEntity!!
}
}

View File

@ -30,8 +30,8 @@ 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.UserNgEntity import com.nextcloud.talk.data.user.model.UserNgEntity
import io.reactivex.Observable import io.reactivex.Single
import io.reactivex.Observer import io.reactivex.SingleObserver
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import java.lang.Boolean.FALSE import java.lang.Boolean.FALSE
import java.lang.Boolean.TRUE import java.lang.Boolean.TRUE
@ -41,19 +41,13 @@ 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(): Observable<UserNgEntity?> abstract fun getActiveUser(): Single<UserNgEntity?>
@Query("SELECT * FROM User where current = 1") @Query("SELECT * FROM User where current = 1")
abstract fun getActiveUserSynchronously(): UserNgEntity? abstract fun getActiveUserSynchronously(): UserNgEntity?
@Query("SELECT * FROM User WHERE current = 1") @Query("SELECT * FROM User WHERE current = 1")
abstract fun getActiveUserLiveData(): Observable<UserNgEntity?> abstract fun getActiveUserLiveData(): Single<UserNgEntity?>
@Query("SELECT * FROM User ORDER BY current DESC")
abstract fun getUsersLiveData(): Observable<List<UserNgEntity>>
@Query("SELECT * FROM User WHERE current != 1 ORDER BY current DESC")
abstract fun getUsersLiveDataWithoutActive(): Observable<List<UserNgEntity>>
@Query("DELETE FROM User WHERE id = :id") @Query("DELETE FROM User WHERE id = :id")
abstract fun deleteUserWithId(id: Long) abstract fun deleteUserWithId(id: Long)
@ -69,44 +63,36 @@ abstract class UsersDao {
// get all users not scheduled for deletion // get all users not scheduled for deletion
@Query("SELECT * FROM User where current != 0") @Query("SELECT * FROM User where current != 0")
abstract fun getUsers(): Observable<List<UserNgEntity>> abstract fun getUsers(): Single<List<UserNgEntity>>
@Query("SELECT * FROM User where id = :id") @Query("SELECT * FROM User where id = :id")
abstract fun getUserWithId(id: Long): Observable<UserNgEntity?> abstract fun getUserWithId(id: Long): Single<UserNgEntity?>
// TODO remove this one, duplicated
@Query("SELECT * FROM User where id = :id")
abstract fun getUserWithIdLiveData(id: Long): Observable<UserNgEntity?>
@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): Observable<UserNgEntity?> abstract fun getUserWithIdNotScheduledForDeletion(id: Long): Single<UserNgEntity?>
@Query("SELECT * FROM User where userId = :userId") @Query("SELECT * FROM User where userId = :userId")
abstract fun getUserWithUserId(userId: String): Observable<UserNgEntity?> abstract fun getUserWithUserId(userId: String): Single<UserNgEntity?>
@Query("SELECT * FROM User where userId != :userId") @Query("SELECT * FROM User where userId != :userId")
abstract fun getUsersWithoutUserId(userId: Long): Observable<List<UserNgEntity>> abstract fun getUsersWithoutUserId(userId: Long): Single<List<UserNgEntity>>
@Query("SELECT * FROM User where current = 0") @Query("SELECT * FROM User where current = 0")
abstract fun getUsersScheduledForDeletion(): Observable<List<UserNgEntity>> abstract fun getUsersScheduledForDeletion(): Single<List<UserNgEntity>>
@Query("SELECT * FROM User where scheduledForDeletion = 0") @Query("SELECT * FROM User where scheduledForDeletion = 0")
abstract fun getUsersNotScheduledForDeletion(): Observable<List<UserNgEntity>> abstract fun getUsersNotScheduledForDeletion(): Single<List<UserNgEntity>>
@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): Observable<UserNgEntity?> abstract fun getUserWithUsernameAndServer(username: String, server: String): Single<UserNgEntity?>
@Transaction @Transaction
open suspend fun setUserAsActiveWithId(id: Long): Boolean { open suspend fun setUserAsActiveWithId(id: Long): Boolean {
val users = getUsers() val users = getUsers()
var result = TRUE var result = TRUE
users.subscribe(object : Observer<List<UserNgEntity>> { users.subscribe(object : SingleObserver<List<UserNgEntity>> {
override fun onSubscribe(d: Disposable) { override fun onSuccess(users: List<UserNgEntity>) {
// unused atm
}
override fun onNext(users: List<UserNgEntity>) {
for (user in users) { for (user in users) {
// removed from clause: && UserStatus.ACTIVE == user.status // removed from clause: && UserStatus.ACTIVE == user.status
if (user.id != id) { if (user.id != id) {
@ -120,14 +106,14 @@ abstract class UsersDao {
} }
} }
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "Error setting user active", e) Log.e(TAG, "Error setting user active", e)
result = FALSE result = FALSE
} }
override fun onComplete() {
// unused atm
}
}) })
return result return result
@ -135,63 +121,29 @@ abstract class UsersDao {
@Transaction @Transaction
open suspend fun markUserForDeletion(id: Long): Boolean { open suspend fun markUserForDeletion(id: Long): Boolean {
val users = getUsers() val users = getUsers().blockingGet()
users.subscribe(object : Observer<List<UserNgEntity>> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(users: List<UserNgEntity>) {
for (user in users) { for (user in users) {
if (user.id == id) { if (user.id == id) {
// TODO currently we only have a boolean, no intermediate states
user.current = FALSE user.current = FALSE
updateUser(user) updateUser(user)
break
} }
} }
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return setAnyUserAsActive() return setAnyUserAsActive()
} }
@Transaction @Transaction
open suspend fun setAnyUserAsActive(): Boolean { open suspend fun setAnyUserAsActive(): Boolean {
val users = getUsers() val users = getUsers().blockingGet()
var result = FALSE var result = FALSE
users.subscribe(object : Observer<List<UserNgEntity>> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(users: List<UserNgEntity>) {
for (user in users) { for (user in users) {
user.current = TRUE user.current = TRUE
updateUser(user) updateUser(user)
result = TRUE result = TRUE
break break
} }
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return result return result
} }

View File

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

View File

@ -22,73 +22,65 @@
package com.nextcloud.talk.data.user package com.nextcloud.talk.data.user
import com.nextcloud.talk.data.user.model.UserNgEntity import com.nextcloud.talk.data.user.model.User
import io.reactivex.Observable 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(): Observable<UserNgEntity?> { override fun getActiveUserLiveData(): Single<User?> {
return usersDao.getActiveUserLiveData() return usersDao.getActiveUser().map { UserMapper.toModel(it) }
} }
override fun getActiveUser(): Observable<UserNgEntity?> { override fun getActiveUser(): Single<User?> {
return usersDao.getActiveUser() return usersDao.getActiveUser().map { UserMapper.toModel(it) }
} }
override fun getActiveUserSynchronously(): UserNgEntity? { override fun getActiveUserSynchronously(): User? {
return usersDao.getActiveUserSynchronously() return UserMapper.toModel(usersDao.getActiveUserSynchronously())
} }
override fun getUsers(): Observable<List<UserNgEntity>> { override fun getUsers(): Single<List<User>> {
return usersDao.getUsers() return usersDao.getUsers().map { UserMapper.toModel(it) }
} }
override fun getUserWithId(id: Long): Observable<UserNgEntity?> { override fun getUserWithId(id: Long): Single<User?> {
return usersDao.getUserWithId(id) return usersDao.getUserWithId(id).map { UserMapper.toModel(it) }
} }
override fun getUserWithIdLiveData(id: Long): Observable<UserNgEntity?> { override fun getUserWithIdLiveData(id: Long): Single<User?> {
return usersDao.getUserWithIdLiveData(id).distinctUntilChanged() return usersDao.getUserWithId(id).map { UserMapper.toModel(it) }
} }
override fun getUserWithIdNotScheduledForDeletion(id: Long): Observable<UserNgEntity?> { override fun getUserWithIdNotScheduledForDeletion(id: Long): Single<User?> {
return usersDao.getUserWithIdNotScheduledForDeletion(id) return usersDao.getUserWithIdNotScheduledForDeletion(id).map { UserMapper.toModel(it) }
} }
override fun getUserWithUserId(userId: String): Observable<UserNgEntity?> { override fun getUserWithUserId(userId: String): Single<User?> {
return usersDao.getUserWithUserId(userId) return usersDao.getUserWithUserId(userId).map { UserMapper.toModel(it) }
} }
override fun getUsersWithoutUserId(userId: Long): Observable<List<UserNgEntity>> { override fun getUsersWithoutUserId(userId: Long): Single<List<User>> {
return usersDao.getUsersWithoutUserId(userId) return usersDao.getUsersWithoutUserId(userId).map { UserMapper.toModel(it) }
} }
override fun getUsersLiveData(): Observable<List<UserNgEntity>> { override fun getUsersScheduledForDeletion(): Single<List<User>> {
return usersDao.getUsersLiveData().distinctUntilChanged() return usersDao.getUsersScheduledForDeletion().map { UserMapper.toModel(it) }
} }
override fun getUsersLiveDataWithoutActive(): Observable<List<UserNgEntity>> { override fun getUsersNotScheduledForDeletion(): Single<List<User>> {
return usersDao.getUsersLiveDataWithoutActive().distinctUntilChanged() return usersDao.getUsersNotScheduledForDeletion().map { UserMapper.toModel(it) }
} }
override fun getUsersScheduledForDeletion(): Observable<List<UserNgEntity>> { override fun getUserWithUsernameAndServer(username: String, server: String): Single<User?> {
return usersDao.getUsersScheduledForDeletion() return usersDao.getUserWithUsernameAndServer(username, server).map { UserMapper.toModel(it) }
} }
override fun getUsersNotScheduledForDeletion(): Observable<List<UserNgEntity>> { override fun updateUser(user: User): Int {
return usersDao.getUsersNotScheduledForDeletion() return usersDao.updateUser(UserMapper.toEntity(user))
} }
override fun getUserWithUsernameAndServer(username: String, server: String): Observable<UserNgEntity?> { override fun insertUser(user: User): Long {
return usersDao.getUserWithUsernameAndServer(username, server) return usersDao.saveUser(UserMapper.toEntity(user))
}
override fun updateUser(user: UserNgEntity): Int {
return usersDao.updateUser(user)
}
override fun insertUser(user: UserNgEntity): Long {
return usersDao.saveUser(user)
} }
override suspend fun setUserAsActiveWithId(id: Long): Boolean { override suspend fun setUserAsActiveWithId(id: Long): Boolean {

View File

@ -45,21 +45,17 @@ data class User(
var current: Boolean = FALSE, var current: Boolean = FALSE,
var scheduledForDeletion: Boolean = FALSE, var scheduledForDeletion: Boolean = FALSE,
) : Parcelable { ) : Parcelable {
companion object {
const val DEFAULT_CHAT_MESSAGE_LENGTH: Int = 1000
}
}
fun User.getMaxMessageLength(): Int { fun getMaxMessageLength(): Int {
return capabilities?.spreedCapability?.config?.get("chat")?.get("max-length")?.toInt() return capabilities?.spreedCapability?.config?.get("chat")?.get("max-length")?.toInt()
?: DEFAULT_CHAT_MESSAGE_LENGTH ?: DEFAULT_CHAT_MESSAGE_LENGTH
} }
fun User.getAttachmentsConfig(key: String): Any? { fun getAttachmentsConfig(key: String): Any? {
return capabilities?.spreedCapability?.config?.get("attachments")?.get(key) return capabilities?.spreedCapability?.config?.get("attachments")?.get(key)
} }
fun User.canUserCreateGroupConversations(): Boolean { fun canUserCreateGroupConversations(): Boolean {
val canCreateValue = capabilities?.spreedCapability?.config?.get("conversations")?.get("can-create") val canCreateValue = capabilities?.spreedCapability?.config?.get("conversations")?.get("can-create")
canCreateValue?.let { canCreateValue?.let {
return it.toBoolean() return it.toBoolean()
@ -67,28 +63,13 @@ fun User.canUserCreateGroupConversations(): Boolean {
return true return true
} }
fun User.getCredentials(): String = ApiUtils.getCredentials(username, token) fun getCredentials(): String = ApiUtils.getCredentials(username, token)
fun User.hasSpreedFeatureCapability(capabilityName: String): Boolean { fun hasSpreedFeatureCapability(capabilityName: String): Boolean {
return capabilities?.spreedCapability?.features?.contains(capabilityName) ?: false return capabilities?.spreedCapability?.features?.contains(capabilityName) ?: false
} }
fun User.toUserEntity(): UserNgEntity { companion object {
var userNgEntity: UserNgEntity? = null const val DEFAULT_CHAT_MESSAGE_LENGTH: Int = 1000
this.id?.let {
userNgEntity = UserNgEntity(it, userId, username, baseUrl)
} ?: run {
userNgEntity = UserNgEntity(userId = this.userId, username = this.username, baseUrl = this.baseUrl)
} }
userNgEntity!!.token = this.token
userNgEntity!!.displayName = this.displayName
userNgEntity!!.pushConfigurationState = this.pushConfigurationState
userNgEntity!!.capabilities = this.capabilities
userNgEntity!!.clientCertificate = this.clientCertificate
userNgEntity!!.externalSignalingServer = this.externalSignalingServer
userNgEntity!!.current = this.current
userNgEntity!!.scheduledForDeletion = this.scheduledForDeletion
return userNgEntity!!
} }

View File

@ -24,57 +24,39 @@ package com.nextcloud.talk.users
import android.text.TextUtils import android.text.TextUtils
import com.bluelinelabs.logansquare.LoganSquare import com.bluelinelabs.logansquare.LoganSquare
import com.nextcloud.talk.data.user.UsersRepository import com.nextcloud.talk.data.user.UsersRepository
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.data.user.model.UserNgEntity import com.nextcloud.talk.data.user.model.UserNgEntity
import com.nextcloud.talk.models.ExternalSignalingServer 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.Observable import io.reactivex.Single
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
import java.lang.Boolean.FALSE
import java.lang.Boolean.TRUE import java.lang.Boolean.TRUE
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
class UserManager internal constructor(private val userRepository: UsersRepository) : CurrentUserProviderNew { class UserManager internal constructor(private val userRepository: UsersRepository) : CurrentUserProviderNew {
val users: Observable<List<UserNgEntity>> val users: Single<List<User>>
get() = userRepository.getUsers() get() = userRepository.getUsers()
val usersScheduledForDeletion: Observable<List<UserNgEntity>> val usersScheduledForDeletion: Single<List<User>>
get() = userRepository.getUsersScheduledForDeletion() get() = userRepository.getUsersScheduledForDeletion()
private fun setAnyUserAndSetAsActive(): Observable<UserNgEntity?> { private fun setAnyUserAndSetAsActive(): Single<User?> {
val results = userRepository.getUsersNotScheduledForDeletion() val results = userRepository.getUsersNotScheduledForDeletion()
var result: UserNgEntity? = null return results.map { users ->
var result: User? = null
results.subscribe(object : Observer<List<UserNgEntity>> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(users: List<UserNgEntity>) {
if (users.isNotEmpty()) { if (users.isNotEmpty()) {
val user = users[0] val user = users[0]
user.current = true user.current = true
userRepository.updateUser(user) userRepository.updateUser(user)
result = user result = user
} }
result
}
} }
override fun onError(e: Throwable) { override val currentUser: Single<User?>
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return Observable.just(result)
}
override val currentUser: Observable<UserNgEntity?>
get() { get() {
return userRepository.getActiveUser() return userRepository.getActiveUser()
} }
@ -87,176 +69,68 @@ class UserManager internal constructor(private val userRepository: UsersReposito
userRepository.deleteUserWithId(internalId) userRepository.deleteUserWithId(internalId)
} }
fun getUserById(userId: String): Observable<UserNgEntity?> { fun getUserById(userId: String): Single<User?> {
return userRepository.getUserWithUserId(userId) return userRepository.getUserWithUserId(userId)
} }
fun getUserWithId(id: Long): Observable<UserNgEntity?> { fun getUserWithId(id: Long): Single<User?> {
return userRepository.getUserWithId(id) return userRepository.getUserWithId(id)
} }
fun disableAllUsersWithoutId(userId: Long) { fun disableAllUsersWithoutId(userId: Long): Single<Int> {
val results = userRepository.getUsersWithoutUserId(userId) val results = userRepository.getUsersWithoutUserId(userId)
results.subscribe(object : Observer<List<UserNgEntity>> { return results.map { users ->
override fun onSubscribe(d: Disposable) { var count = 0
// unused atm
}
override fun onNext(users: List<UserNgEntity>) {
if (users.isNotEmpty()) { if (users.isNotEmpty()) {
for (entity in users) { for (entity in users) {
entity.current = false entity.current = false
userRepository.updateUser(entity) userRepository.updateUser(entity)
count++
} }
} }
count
}
} }
override fun onError(e: Throwable) { fun checkIfUserIsScheduledForDeletion(username: String, server: String): Single<Boolean> {
// unused atm return userRepository.getUserWithUsernameAndServer(username, server).map { it.scheduledForDeletion }
} }
override fun onComplete() { fun getUserWithInternalId(id: Long): Single<User?> {
// unused atm
}
})
}
fun checkIfUserIsScheduledForDeletion(username: String, server: String): Observable<Boolean> {
val results = userRepository.getUserWithUsernameAndServer(username, server)
var result = FALSE
results.subscribe(object : Observer<UserNgEntity?> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(user: UserNgEntity) {
result = user.scheduledForDeletion
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return Observable.just(result)
}
fun getUserWithInternalId(id: Long): Observable<UserNgEntity?> {
return userRepository.getUserWithIdNotScheduledForDeletion(id) return userRepository.getUserWithIdNotScheduledForDeletion(id)
} }
fun getIfUserWithUsernameAndServer(username: String, server: String): Observable<Boolean> { fun getIfUserWithUsernameAndServer(username: String, server: String): Single<Boolean> {
val results = userRepository.getUserWithUsernameAndServer(username, server) return userRepository.getUserWithUsernameAndServer(username, server).map { TRUE }
var result = FALSE
results.subscribe(object : Observer<UserNgEntity?> {
override fun onSubscribe(d: Disposable) {
// unused atm
} }
override fun onNext(users: UserNgEntity) { fun scheduleUserForDeletionWithId(id: Long): Single<Boolean> {
result = TRUE return userRepository.getUserWithId(id).map { user ->
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return Observable.just(result)
}
suspend fun scheduleUserForDeletionWithId(id: Long): Observable<Boolean> {
val results = userRepository.getUserWithId(id)
var result = FALSE
results.subscribe(object : Observer<UserNgEntity?> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(user: UserNgEntity) {
user.scheduledForDeletion = true user.scheduledForDeletion = true
user.current = false user.current = false
userRepository.updateUser(user) userRepository.updateUser(user)
} }.flatMap {
setAnyUserAndSetAsActive()
override fun onError(e: Throwable) { }.map { TRUE }
// unused atm
}
override fun onComplete() {
// unused atm
}
})
results.subscribe(object : Observer<UserNgEntity?> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(user: UserNgEntity) {
user.scheduledForDeletion = true
user.current = false
userRepository.updateUser(user)
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
setAnyUserAndSetAsActive().subscribe(object : Observer<UserNgEntity?> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(user: UserNgEntity) {
result = TRUE
}
override fun onError(e: Throwable) {
// unused atm
}
override fun onComplete() {
// unused atm
}
})
return Observable.just(result)
} }
fun createOrUpdateUser( fun createOrUpdateUser(
username: String?, username: String?,
userAttributes: UserAttributes, userAttributes: UserAttributes,
): Observable<UserNgEntity?> { ): Single<User?> {
val userObservable = if (userAttributes.id == null && username != null && userAttributes.serverUrl != null) { val userObservable: Single<User?> = if (userAttributes.id == null &&
username != null && userAttributes.serverUrl != null
) {
userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl) userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl)
} else if (userAttributes.id != null) {
userRepository.getUserWithId(userAttributes.id)
} else { } else {
Observable.just(null) userRepository.getUserWithId(userAttributes.id!!)
} }
return userObservable return userObservable
.map { user: UserNgEntity? -> .map { user: User? ->
val userEntity = when (user) { val userModel = when (user) {
null -> createUser( null -> createUser(
username, username,
userAttributes userAttributes
@ -269,88 +143,31 @@ class UserManager internal constructor(private val userRepository: UsersReposito
user user
} }
} }
userRepository.insertUser(userEntity) userRepository.insertUser(userModel)
}.flatMap { id -> }.flatMap { id ->
userRepository.getUserWithIdLiveData(id) userRepository.getUserWithId(id)
} }
} }
fun getUserWithUsernameAndServer(username: String, server: String): Observable<UserNgEntity?> { fun getUserWithUsernameAndServer(username: String, server: String): Single<User?> {
return userRepository.getUserWithUsernameAndServer(username, server) return userRepository.getUserWithUsernameAndServer(username, server)
} }
private fun updateUserData(user: UserNgEntity, userAttributes: UserAttributes) { private fun updateUserData(user: User, userAttributes: UserAttributes) {
updateUserIdIfNeeded(userAttributes, user)
updateTokenIfNeeded(userAttributes, user)
updateDisplayNameIfNeeded(userAttributes, user)
updatePushConfigurationStateIfNeeded(userAttributes, user)
updateCapabilitiesIfNeeded(userAttributes, user)
updateCertificateAliasIfNeeded(userAttributes, user)
updateExternalSignalingServerIfNeeded(userAttributes, user)
updateCurrentUserStatusIfNeeded(userAttributes, user)
}
private fun updateCurrentUserStatusIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.currentUser != null) {
user.current = userAttributes.currentUser
}
}
private fun updateExternalSignalingServerIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.externalSignalingServer != null) {
val newExternalSignalingServer = LoganSquare
.parse(userAttributes.externalSignalingServer, ExternalSignalingServer::class.java)
if (newExternalSignalingServer != user.externalSignalingServer) {
user.externalSignalingServer = newExternalSignalingServer
}
}
}
private fun updateCertificateAliasIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.certificateAlias != null && userAttributes.certificateAlias != user.clientCertificate) {
user.clientCertificate = userAttributes.certificateAlias
}
}
private fun updateCapabilitiesIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.capabilities != null) {
val newCapabilities = LoganSquare.parse(userAttributes.capabilities, Capabilities::class.java)
if (newCapabilities != user.capabilities) {
user.capabilities = newCapabilities
}
}
}
private fun updatePushConfigurationStateIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.pushConfigurationState != null) {
val newPushConfigurationState = LoganSquare
.parse(userAttributes.pushConfigurationState, PushConfigurationState::class.java)
if (newPushConfigurationState != user.pushConfigurationState) {
user.pushConfigurationState = newPushConfigurationState
}
}
}
private fun updateDisplayNameIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (validDisplayName(userAttributes.displayName, user)) {
user.displayName = userAttributes.displayName
}
}
private fun updateTokenIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.token != null && userAttributes.token != user.token) {
user.token = userAttributes.token
}
}
private fun updateUserIdIfNeeded(userAttributes: UserAttributes, user: UserNgEntity) {
if (userAttributes.userId != null && (user.userId == null || user.userId != userAttributes.userId)) {
user.userId = userAttributes.userId 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)
user.clientCertificate = userAttributes.certificateAlias
user.externalSignalingServer = LoganSquare
.parse(userAttributes.externalSignalingServer, ExternalSignalingServer::class.java)
user.current = userAttributes.currentUser == true
} }
private fun createUser(username: String?, userAttributes: UserAttributes): UserNgEntity { private fun createUser(username: String?, userAttributes: UserAttributes): User {
val user = UserNgEntity() val user = User()
user.baseUrl = userAttributes.serverUrl user.baseUrl = userAttributes.serverUrl
user.username = username user.username = username
user.token = userAttributes.token user.token = userAttributes.token

View File

@ -28,6 +28,7 @@ import android.util.Log;
import com.nextcloud.talk.BuildConfig; import com.nextcloud.talk.BuildConfig;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.data.user.model.User;
import com.nextcloud.talk.data.user.model.UserNgEntity; import com.nextcloud.talk.data.user.model.UserNgEntity;
import com.nextcloud.talk.models.RetrofitBucket; import com.nextcloud.talk.models.RetrofitBucket;
import com.nextcloud.talk.models.database.CapabilitiesUtil; import com.nextcloud.talk.models.database.CapabilitiesUtil;
@ -124,7 +125,7 @@ public class ApiUtils {
return getConversationApiVersion(capabilities, versions); return getConversationApiVersion(capabilities, versions);
} }
public static int getConversationApiVersion(UserNgEntity user, int[] versions) throws NoSupportedApiException { public static int getConversationApiVersion(User user, int[] versions) throws NoSupportedApiException {
boolean hasApiV4 = false; boolean hasApiV4 = false;
for (int version : versions) { for (int version : versions) {
hasApiV4 |= version == APIv4; hasApiV4 |= version == APIv4;

View File

@ -79,6 +79,7 @@ import com.facebook.widget.text.span.BetterImageSpan;
import com.google.android.material.chip.ChipDrawable; import com.google.android.material.chip.ChipDrawable;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.data.user.model.User;
import com.nextcloud.talk.data.user.model.UserNgEntity; import com.nextcloud.talk.data.user.model.UserNgEntity;
import com.nextcloud.talk.events.UserMentionClickEvent; import com.nextcloud.talk.events.UserMentionClickEvent;
import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.database.UserEntity;
@ -599,7 +600,7 @@ public class DisplayUtils {
avatarImageView.setController(draweeController); avatarImageView.setController(draweeController);
} }
public static void loadAvatarImage(UserNgEntity user, SimpleDraweeView avatarImageView, boolean deleteCache) { public static void loadAvatarImage(User user, SimpleDraweeView avatarImageView, boolean deleteCache) {
String avatarId; String avatarId;
if (!TextUtils.isEmpty(user.getUserId())) { if (!TextUtils.isEmpty(user.getUserId())) {
avatarId = user.getUserId(); avatarId = user.getUserId();

View File

@ -21,7 +21,7 @@
*/ */
package com.nextcloud.talk.utils.database.user; package com.nextcloud.talk.utils.database.user;
import com.nextcloud.talk.data.user.model.UserNgEntity; import com.nextcloud.talk.data.user.model.User;
import com.nextcloud.talk.models.json.capabilities.Capabilities; import com.nextcloud.talk.models.json.capabilities.Capabilities;
import java.util.HashMap; import java.util.HashMap;
@ -32,7 +32,7 @@ import androidx.annotation.Nullable;
public abstract class CapabilitiesNgUtil { public abstract class CapabilitiesNgUtil {
private static final String TAG = CapabilitiesNgUtil.class.getSimpleName(); private static final String TAG = CapabilitiesNgUtil.class.getSimpleName();
public static boolean hasNotificationsCapability(@Nullable UserNgEntity user, String capabilityName) { public static boolean hasNotificationsCapability(@Nullable User user, String capabilityName) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities.getNotificationsCapability() != null && if (capabilities.getNotificationsCapability() != null &&
@ -43,7 +43,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean hasExternalCapability(@Nullable UserNgEntity user, String capabilityName) { public static boolean hasExternalCapability(@Nullable User user, String capabilityName) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities.getExternalCapability() != null && if (capabilities.getExternalCapability() != null &&
@ -54,21 +54,21 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isServerEOL(@Nullable UserNgEntity user) { public static boolean isServerEOL(@Nullable User user) {
// Capability is available since Talk 4 => Nextcloud 14 => Autmn 2018 // Capability is available since Talk 4 => Nextcloud 14 => Autmn 2018
return !hasSpreedFeatureCapability(user, "no-ping"); return !hasSpreedFeatureCapability(user, "no-ping");
} }
public static boolean isServerAlmostEOL(@Nullable UserNgEntity user) { public static boolean isServerAlmostEOL(@Nullable User user) {
// Capability is available since Talk 8 => Nextcloud 18 => January 2020 // Capability is available since Talk 8 => Nextcloud 18 => January 2020
return !hasSpreedFeatureCapability(user, "chat-replies"); return !hasSpreedFeatureCapability(user, "chat-replies");
} }
public static boolean canSetChatReadMarker(@Nullable UserNgEntity user) { public static boolean canSetChatReadMarker(@Nullable User user) {
return hasSpreedFeatureCapability(user, "chat-read-marker"); return hasSpreedFeatureCapability(user, "chat-read-marker");
} }
public static boolean hasSpreedFeatureCapability(@Nullable UserNgEntity user, String capabilityName) { public static boolean hasSpreedFeatureCapability(@Nullable User user, String capabilityName) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && capabilities.getSpreedCapability() != null && if (capabilities != null && capabilities.getSpreedCapability() != null &&
@ -79,7 +79,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static Integer getMessageMaxLength(@Nullable UserNgEntity user) { public static Integer getMessageMaxLength(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && if (capabilities != null &&
@ -103,7 +103,7 @@ public abstract class CapabilitiesNgUtil {
return 1000; return 1000;
} }
public static boolean isPhoneBookIntegrationAvailable(@Nullable UserNgEntity user) { public static boolean isPhoneBookIntegrationAvailable(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
return capabilities != null && return capabilities != null &&
@ -114,7 +114,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isReadStatusAvailable(@Nullable UserNgEntity user) { public static boolean isReadStatusAvailable(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && if (capabilities != null &&
@ -128,7 +128,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isReadStatusPrivate(@Nullable UserNgEntity user) { public static boolean isReadStatusPrivate(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && if (capabilities != null &&
@ -144,7 +144,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isUserStatusAvailable(@Nullable UserNgEntity user) { public static boolean isUserStatusAvailable(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities.getUserStatusCapability() != null && if (capabilities.getUserStatusCapability() != null &&
@ -156,7 +156,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static String getAttachmentFolder(@Nullable UserNgEntity user) { public static String getAttachmentFolder(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && if (capabilities != null &&
@ -172,7 +172,7 @@ public abstract class CapabilitiesNgUtil {
return "/Talk"; return "/Talk";
} }
public static String getServerName(@Nullable UserNgEntity user) { public static String getServerName(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && capabilities.getThemingCapability() != null) { if (capabilities != null && capabilities.getThemingCapability() != null) {
@ -183,7 +183,7 @@ public abstract class CapabilitiesNgUtil {
} }
// TODO later avatar can also be checked via user fields, for now it is in Talk capability // TODO later avatar can also be checked via user fields, for now it is in Talk capability
public static boolean isAvatarEndpointAvailable(@Nullable UserNgEntity user) { public static boolean isAvatarEndpointAvailable(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
return (capabilities != null && return (capabilities != null &&
@ -194,7 +194,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean canEditScopes(@Nullable UserNgEntity user) { public static boolean canEditScopes(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
return (capabilities != null && return (capabilities != null &&
@ -205,7 +205,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isAbleToCall(@Nullable UserNgEntity user) { public static boolean isAbleToCall(@Nullable User user) {
if (user != null && user.getCapabilities() != null) { if (user != null && user.getCapabilities() != null) {
Capabilities capabilities = user.getCapabilities(); Capabilities capabilities = user.getCapabilities();
if (capabilities != null && if (capabilities != null &&
@ -224,7 +224,7 @@ public abstract class CapabilitiesNgUtil {
return false; return false;
} }
public static boolean isUnifiedSearchAvailable(@Nullable final UserNgEntity user) { public static boolean isUnifiedSearchAvailable(@Nullable final User user) {
return hasSpreedFeatureCapability(user, "unified-search"); return hasSpreedFeatureCapability(user, "unified-search");
} }
} }

View File

@ -20,9 +20,9 @@
*/ */
package com.nextcloud.talk.utils.database.user package com.nextcloud.talk.utils.database.user
import com.nextcloud.talk.data.user.model.UserNgEntity import com.nextcloud.talk.data.user.model.User
import io.reactivex.Observable import io.reactivex.Single
interface CurrentUserProviderNew { interface CurrentUserProviderNew {
val currentUser: Observable<UserNgEntity?> val currentUser: Single<User?>
} }