From fe8c7d468a913d0b1a1cf1de0c12690fe3c05267 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sun, 17 Jul 2022 15:56:44 +0200 Subject: [PATCH 01/11] Migrate server selection from requery to room Signed-off-by: Andy Scherzinger --- .../controllers/ServerSelectionController.kt | 21 +++++++++---------- .../com/nextcloud/talk/utils/AccountUtils.kt | 8 ++----- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.kt index a85e0009e..14ca85082 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.kt @@ -3,8 +3,8 @@ * * @author Andy Scherzinger * @author Mario Danic - * Copyright (C) 2021 Andy Scherzinger (info@andy-scherzinger.de) - * Copyright (C) 2017 Mario Danic (mario@lovelyhq.com) + * Copyright (C) 2021 Andy Scherzinger + * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,15 +44,14 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.databinding.ControllerServerSelectionBinding -import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.generic.Status -import com.nextcloud.talk.utils.AccountUtils.findAccounts +import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.utils.AccountUtils.findAccountsForUsers import com.nextcloud.talk.utils.AccountUtils.getAppNameBasedOnPackage import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.UriUtils import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_ACCOUNT_IMPORT -import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -70,7 +69,7 @@ class ServerSelectionController : lateinit var ncApi: NcApi @Inject - lateinit var userUtils: UserUtils + lateinit var userManager: UserManager private var statusQueryDisposable: Disposable? = null @@ -119,9 +118,9 @@ class ServerSelectionController : if ( ( TextUtils.isEmpty(resources!!.getString(R.string.nc_import_account_type)) || - findAccounts(userUtils.users as List).isEmpty() + findAccountsForUsers(userManager.users.blockingGet()).isEmpty() ) && - userUtils.users.size == 0 + userManager.users.blockingGet().isEmpty() ) { binding.helperTextView.setText(R.string.nc_get_from_provider) binding.helperTextView.setOnClickListener { @@ -134,12 +133,12 @@ class ServerSelectionController : ) startActivity(browserIntent) } - } else if (findAccounts(userUtils.users as List).size > 0) { + } else if (findAccountsForUsers(userManager.users.blockingGet()).isNotEmpty()) { if (!TextUtils.isEmpty( getAppNameBasedOnPackage(resources!!.getString(R.string.nc_import_accounts_from)) ) ) { - if (findAccounts(userUtils.users as List).size > 1) { + if (findAccountsForUsers(userManager.users.blockingGet()).size > 1) { binding.helperTextView.setText( String.format( resources!!.getString(R.string.nc_server_import_accounts), @@ -155,7 +154,7 @@ class ServerSelectionController : ) } } else { - if (findAccounts(userUtils.users as List).size > 1) { + if (findAccountsForUsers(userManager.users.blockingGet()).size > 1) { binding.helperTextView.text = resources!!.getString(R.string.nc_server_import_accounts_plain) } else { binding.helperTextView.text = resources!!.getString(R.string.nc_server_import_account_plain) diff --git a/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt index 3cc5fde3f..dbdb27577 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt @@ -1,7 +1,9 @@ /* * Nextcloud Talk application * + * @author Andy Scherzinger * @author Mario Danic + * Copyright (C) 2021 Andy Scherzinger * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify @@ -32,7 +34,6 @@ import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.ImportAccount -import com.nextcloud.talk.models.database.UserEntity import java.util.Arrays object AccountUtils { @@ -40,11 +41,6 @@ object AccountUtils { private const val TAG = "AccountUtils" private const val MIN_SUPPORTED_FILES_APP_VERSION = 30060151 - @Deprecated("Migrate to findAccountsForUsers") - fun findAccounts(userEntitiesList: List): List { - return findAccountsForUsers(LegacyUserEntityMapper.toModel(userEntitiesList)) - } - fun findAccountsForUsers(users: List): List { val context = NextcloudTalkApplication.sharedApplication!!.applicationContext val accMgr = AccountManager.get(context) From 036e67027ca1dd5af88a30055ef7ac4f6b792faa Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sun, 17 Jul 2022 18:11:23 +0200 Subject: [PATCH 02/11] Migrate web view login from requery to room Signed-off-by: Andy Scherzinger --- .../controllers/WebViewLoginController.kt | 81 ++++++++----------- 1 file changed, 34 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt index af6ed0adc..ec1f1c9fc 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt @@ -57,18 +57,16 @@ import com.nextcloud.talk.databinding.ControllerWebViewLoginBinding import com.nextcloud.talk.events.CertificateEvent import com.nextcloud.talk.jobs.PushRegistrationWorker import com.nextcloud.talk.models.LoginData +import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_BASE_URL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ORIGINAL_PROTOCOL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USERNAME -import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder import com.nextcloud.talk.utils.ssl.MagicTrustManager import de.cotech.hw.fido.WebViewFidoBridge -import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers import io.requery.Persistable import io.requery.reactivex.ReactiveEntityStore import org.greenrobot.eventbus.EventBus @@ -89,7 +87,7 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( private val binding: ControllerWebViewLoginBinding by viewBinding(ControllerWebViewLoginBinding::bind) @Inject - lateinit var userUtils: UserUtils + lateinit var userManager: UserManager @Inject lateinit var dataStore: ReactiveEntityStore @@ -223,13 +221,13 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( } override fun onReceivedClientCertRequest(view: WebView, request: ClientCertRequest) { - val userEntity = userUtils.currentUser + val user = userManager.currentUser.blockingGet() var alias: String? = null if (!isPasswordUpdate) { alias = appPreferences!!.temporaryClientCertAlias } - if (TextUtils.isEmpty(alias) && userEntity != null) { - alias = userEntity.clientCertificate + if (TextUtils.isEmpty(alias) && user != null) { + alias = user.clientCertificate } if (!TextUtils.isEmpty(alias)) { val finalAlias = alias @@ -327,15 +325,16 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( val loginData = parseLoginData(assembledPrefix, dataString) if (loginData != null) { dispose() - val currentUser = userUtils.currentUser + val currentUser = userManager.currentUser.blockingGet() var messageType: ApplicationWideMessageHolder.MessageType? = null - if (!isPasswordUpdate && userUtils.getIfUserWithUsernameAndServer(loginData.username, baseUrl)) { + if (!isPasswordUpdate && + userManager.getIfUserWithUsernameAndServer(loginData.username!!, baseUrl!!).blockingGet() + ) { messageType = ApplicationWideMessageHolder.MessageType.ACCOUNT_UPDATED_NOT_ADDED } - if (userUtils.checkIfUserIsScheduledForDeletion(loginData.username, baseUrl)) { - ApplicationWideMessageHolder.getInstance().setMessageType( + if (userManager.checkIfUserIsScheduledForDeletion(loginData.username!!, baseUrl!!).blockingGet()) { + ApplicationWideMessageHolder.getInstance().messageType = ApplicationWideMessageHolder.MessageType.ACCOUNT_SCHEDULED_FOR_DELETION - ) if (!isPasswordUpdate) { router.popToRoot() } else { @@ -366,47 +365,35 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( } else { if (isPasswordUpdate) { if (currentUser != null) { - userQueryDisposable = userUtils.createOrUpdateUser( - null, - loginData.token, - null, - null, - "", - java.lang.Boolean.TRUE, - null, - currentUser.id, - null, - appPreferences!!.temporaryClientCertAlias, - null + currentUser.clientCertificate = appPreferences!!.temporaryClientCertAlias + currentUser.token = loginData.token + val rowsUpdated = userManager.updateUser(currentUser).blockingGet() + Log.d(TAG, "User rows updated: $rowsUpdated") + + if (finalMessageType != null) { + ApplicationWideMessageHolder.getInstance().messageType = finalMessageType + } + + val data = Data.Builder().putString( + PushRegistrationWorker.ORIGIN, + "WebViewLoginController#parseAndLoginFromWebView" + ).build() + + val pushRegistrationWork = OneTimeWorkRequest.Builder( + PushRegistrationWorker::class.java ) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { - if (finalMessageType != null) { - ApplicationWideMessageHolder.getInstance().setMessageType(finalMessageType) - } - val data = Data.Builder().putString( - PushRegistrationWorker.ORIGIN, - "WebViewLoginController#parseAndLoginFromWebView" - ).build() - val pushRegistrationWork = OneTimeWorkRequest.Builder( - PushRegistrationWorker::class.java - ) - .setInputData(data) - .build() - WorkManager.getInstance().enqueue(pushRegistrationWork) - router.popCurrentController() - }, - { dispose() } - ) { dispose() } + .setInputData(data) + .build() + + WorkManager.getInstance().enqueue(pushRegistrationWork) + router.popCurrentController() } } else { if (finalMessageType != null) { // FIXME when the user registers a new account that was setup before (aka // ApplicationWideMessageHolder.MessageType.ACCOUNT_UPDATED_NOT_ADDED) - // The token is not updated in the database and therefor the account not visible/usable - ApplicationWideMessageHolder.getInstance().setMessageType(finalMessageType) + // The token is not updated in the database and therefore the account not visible/usable + ApplicationWideMessageHolder.getInstance().messageType = finalMessageType } router.popToRoot() } From 8d87d5486b2b7582c7acb942410fdaa607122506 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Mon, 18 Jul 2022 19:28:31 +0200 Subject: [PATCH 03/11] update to latest API changes for storing users Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/controllers/WebViewLoginController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt index ec1f1c9fc..adf8f8582 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt @@ -367,7 +367,7 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( if (currentUser != null) { currentUser.clientCertificate = appPreferences!!.temporaryClientCertAlias currentUser.token = loginData.token - val rowsUpdated = userManager.updateUser(currentUser).blockingGet() + val rowsUpdated = userManager.updateOrCreateUser(currentUser).blockingGet() Log.d(TAG, "User rows updated: $rowsUpdated") if (finalMessageType != null) { From 6e05056b2eb538fa919c0225dd768f335eff5183 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Mon, 18 Jul 2022 21:45:57 +0200 Subject: [PATCH 04/11] Migrate AccountVerificationController from requery to room Signed-off-by: Andy Scherzinger --- .../AccountVerificationController.kt | 60 ++++++------ .../com/nextcloud/talk/data/user/UsersDao.kt | 5 +- .../talk/data/user/UsersRepository.kt | 2 +- .../talk/data/user/UsersRepositoryImpl.kt | 4 +- .../com/nextcloud/talk/users/UserManager.kt | 91 +++++++++++++++---- 5 files changed, 111 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt index a0cc4cc18..a887748ed 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt @@ -26,6 +26,7 @@ import android.content.pm.ActivityInfo import android.os.Bundle import android.os.Handler import android.text.TextUtils +import android.util.Log import android.view.View import androidx.work.Data import androidx.work.OneTimeWorkRequest @@ -39,15 +40,16 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding +import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerAccountVerificationBinding import com.nextcloud.talk.events.EventStatus import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.PushRegistrationWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker -import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.generic.Status import com.nextcloud.talk.models.json.userprofile.UserProfileOverall +import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.UriUtils @@ -57,9 +59,8 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_ACCOUNT_IMPORT import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ORIGINAL_PROTOCOL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USERNAME -import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder -import io.reactivex.CompletableObserver +import io.reactivex.MaybeObserver import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -68,7 +69,6 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import java.net.CookieManager -import java.util.ArrayList import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -83,7 +83,7 @@ class AccountVerificationController(args: Bundle? = null) : lateinit var ncApi: NcApi @Inject - lateinit var userUtils: UserUtils + lateinit var userManager: UserManager @Inject lateinit var cookieManager: CookieManager @@ -248,21 +248,30 @@ class AccountVerificationController(args: Bundle? = null) : } private fun storeProfile(displayName: String?, userId: String) { - userUtils.createOrUpdateUser( - username, token, - baseUrl, displayName, null, java.lang.Boolean.TRUE, - userId, null, null, - appPreferences!!.temporaryClientCertAlias, null + userManager.storeProfile( + username, + UserManager.UserAttributes( + id = null, + serverUrl = baseUrl, + currentUser = true, + userId = userId, + token = token, + displayName = displayName, + pushConfigurationState = null, + capabilities = null, + certificateAlias = appPreferences!!.temporaryClientCertAlias, + externalSignalingServer = null + ) ) .subscribeOn(Schedulers.io()) - .subscribe(object : Observer { + .subscribe(object : MaybeObserver { override fun onSubscribe(d: Disposable) { disposables.add(d) } @SuppressLint("SetTextI18n") - override fun onNext(userEntity: UserEntity) { - internalAccountId = userEntity.id + override fun onSuccess(user: User) { + internalAccountId = user.id!! if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) { registerForPush() } else { @@ -283,7 +292,7 @@ class AccountVerificationController(args: Bundle? = null) : """ ${binding.progressText.text} """.trimIndent() + - resources!!.getString(R.string.nc_display_name_not_stored) + resources!!.getString(R.string.nc_display_name_not_stored) abortVerification() } @@ -431,10 +440,11 @@ class AccountVerificationController(args: Bundle? = null) : private fun proceedWithLogin() { cookieManager.cookieStore.removeAll() - userUtils.disableAllUsersWithoutId(internalAccountId) + val userDisabledCount = userManager.disableAllUsersWithoutId(internalAccountId).blockingGet() + Log.d(TAG, "Disabled $userDisabledCount users that had no id") if (activity != null) { activity!!.runOnUiThread { - if (userUtils.users.size == 1) { + if (userManager.users.blockingGet().size == 1) { router.setRoot( RouterTransaction.with(ConversationsListController(Bundle())) .pushChangeHandler(HorizontalChangeHandler()) @@ -472,18 +482,10 @@ class AccountVerificationController(args: Bundle? = null) : private fun abortVerification() { if (!isAccountImport) { if (internalAccountId != -1L) { - userUtils.deleteUserWithId(internalAccountId).subscribe(object : CompletableObserver { - override fun onSubscribe(d: Disposable) { - // unused atm - } - override fun onComplete() { + val count = userManager.deleteUser(internalAccountId) + if (count > 0) { activity?.runOnUiThread { Handler().postDelayed({ router.popToRoot() }, DELAY_IN_MILLIS) } - } - - override fun onError(e: Throwable) { - // unused atm - } - }) + } } else { activity?.runOnUiThread { Handler().postDelayed({ router.popToRoot() }, DELAY_IN_MILLIS) } } @@ -498,7 +500,7 @@ class AccountVerificationController(args: Bundle? = null) : router.popToRoot() } } else { - if (userUtils.anyUserExists()) { + if (userManager.users.blockingGet().isNotEmpty()) { router.setRoot( RouterTransaction.with(ConversationsListController(Bundle())) .pushChangeHandler(HorizontalChangeHandler()) @@ -518,7 +520,7 @@ class AccountVerificationController(args: Bundle? = null) : } companion object { - const val TAG = "AccountVerificationController" + const val TAG = "AccountVerification" const val DELAY_IN_MILLIS: Long = 7500 } 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 e1826f5ce..1bb2e99cb 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 @@ -24,6 +24,7 @@ package com.nextcloud.talk.data.user import android.util.Log import androidx.room.Dao +import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query @@ -45,8 +46,8 @@ abstract class UsersDao { @Query("SELECT * FROM User where current = 1") abstract fun getActiveUserSynchronously(): UserEntity? - @Query("DELETE FROM User WHERE id = :id") - abstract fun deleteUserWithId(id: Long) + @Delete + abstract fun deleteUser(user: UserEntity): Int @Update abstract fun updateUser(user: UserEntity): Int 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 afe903527..c3d4cab2b 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 @@ -40,7 +40,7 @@ interface UsersRepository { fun updateUser(user: User): Int fun insertUser(user: User): Long fun setUserAsActiveWithId(id: Long): Single - fun deleteUserWithId(id: Long) + fun deleteUser(user: User): Int fun setAnyUserAsActive(): Boolean fun markUserForDeletion(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 07957cda2..6d564eee7 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 @@ -77,8 +77,8 @@ class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { return Single.just(usersDao.setUserAsActiveWithId(id)) } - override fun deleteUserWithId(id: Long) { - usersDao.deleteUserWithId(id) + override fun deleteUser(user: User): Int { + return usersDao.deleteUser(UserMapper.toEntity(user)) } override fun setAnyUserAsActive(): Boolean { 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 2262da0ac..7d73c8a9c 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.users import android.text.TextUtils +import android.util.Log import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.data.user.UsersRepository import com.nextcloud.talk.data.user.model.User @@ -31,6 +32,7 @@ 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.FALSE import java.lang.Boolean.TRUE @Suppress("TooManyFunctions") @@ -41,9 +43,10 @@ class UserManager internal constructor(private val userRepository: UsersReposito val usersScheduledForDeletion: Single> get() = userRepository.getUsersScheduledForDeletion() - private fun setAnyUserAndSetAsActive(): Single { + private fun getAnyUserAndSetAsActive(): Single { val results = userRepository.getUsersNotScheduledForDeletion() + // TODO needs to return Empty in case no user was found (and set active) return results.map { users -> users .firstOrNull() @@ -60,12 +63,8 @@ class UserManager internal constructor(private val userRepository: UsersReposito return userRepository.getActiveUser() } - fun deleteUser(internalId: Long) { - userRepository.deleteUserWithId(internalId) - } - - fun deleteUserWithId(internalId: Long) { - userRepository.deleteUserWithId(internalId) + fun deleteUser(internalId: Long): Int { + return userRepository.deleteUser(userRepository.getUserWithId(internalId).blockingGet()) } fun getUserById(userId: String): Maybe { @@ -93,7 +92,15 @@ class UserManager internal constructor(private val userRepository: UsersReposito } fun checkIfUserIsScheduledForDeletion(username: String, server: String): Maybe { - return userRepository.getUserWithUsernameAndServer(username, server).map { it.scheduledForDeletion } + return userRepository + .getUserWithUsernameAndServer(username, server) + .switchIfEmpty(Maybe.empty()) + .map { user: User? -> + when (user) { + null -> FALSE + else -> user.scheduledForDeletion + } + } } fun getUserWithInternalId(id: Long): Maybe { @@ -101,10 +108,19 @@ class UserManager internal constructor(private val userRepository: UsersReposito } fun getIfUserWithUsernameAndServer(username: String, server: String): Maybe { - return userRepository.getUserWithUsernameAndServer(username, server).map { TRUE } + return userRepository + .getUserWithUsernameAndServer(username, server) + .map { user: User? -> + when (user) { + null -> FALSE + else -> TRUE + } + } } fun scheduleUserForDeletionWithId(id: Long): Single { + // TODO needs to return false in case getAnyUserAndSetAsActive doesn't return a user + // or getUserWithId(id) doesn't return a user return userRepository.getUserWithId(id).map { user -> user.scheduledForDeletion = true user.current = false @@ -112,7 +128,7 @@ class UserManager internal constructor(private val userRepository: UsersReposito } .toSingle() .flatMap { - setAnyUserAndSetAsActive() + getAnyUserAndSetAsActive() }.map { TRUE } } @@ -136,19 +152,50 @@ class UserManager internal constructor(private val userRepository: UsersReposito return userRepository.setUserAsActiveWithId(user.id!!) } + fun storeProfile(username: String?, userAttributes: UserAttributes): Maybe { + val userMaybe: Maybe = findUser(null, userAttributes) + + return userMaybe + .map { user: User? -> + when (user) { + null -> createUser( + username, + userAttributes + ) + else -> { + user.token = userAttributes.token + user.baseUrl = userAttributes.serverUrl + user.current = true + user.userId = userAttributes.userId + user.token = userAttributes.token + user.displayName = userAttributes.displayName + user.clientCertificate = userAttributes.certificateAlias + + updateUserData( + user, + userAttributes + ) + + user + } + } + } + .switchIfEmpty(Maybe.just(createUser(username, userAttributes))) + .map { user -> + userRepository.insertUser(user) + } + .flatMap { id -> + userRepository.getUserWithId(id) + } + } + @Deprecated("Only available for migration, use updateExternalSignalingServer or create new methods") fun createOrUpdateUser( username: String?, userAttributes: UserAttributes, ): Maybe { - val userMaybe: Maybe = if (userAttributes.id != null) { - userRepository.getUserWithId(userAttributes.id) - } else if (username != null && userAttributes.serverUrl != null) { - userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl) - } else { - Maybe.empty() - } + val userMaybe: Maybe = findUser(username, userAttributes) return userMaybe .map { user: User? -> @@ -175,6 +222,16 @@ class UserManager internal constructor(private val userRepository: UsersReposito } } + private fun findUser(username: String?, userAttributes: UserAttributes): Maybe { + return if (userAttributes.id != null) { + userRepository.getUserWithId(userAttributes.id) + } else if (username != null && userAttributes.serverUrl != null) { + userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl) + } else { + Maybe.empty() + } + } + fun getUserWithUsernameAndServer(username: String, server: String): Maybe { return userRepository.getUserWithUsernameAndServer(username, server) } From 9bdd0c7a4e004de0a321cd8b91885ad21c304fdd Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Jul 2022 14:01:51 +0200 Subject: [PATCH 05/11] Fix user manager db result processing Signed-off-by: Andy Scherzinger --- .../controllers/WebViewLoginController.kt | 2 +- .../com/nextcloud/talk/users/UserManager.kt | 57 ++++++++----------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt index adf8f8582..83252e813 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.kt @@ -328,7 +328,7 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController( val currentUser = userManager.currentUser.blockingGet() var messageType: ApplicationWideMessageHolder.MessageType? = null if (!isPasswordUpdate && - userManager.getIfUserWithUsernameAndServer(loginData.username!!, baseUrl!!).blockingGet() + userManager.checkIfUserExists(loginData.username!!, baseUrl!!).blockingGet() ) { messageType = ApplicationWideMessageHolder.MessageType.ACCOUNT_UPDATED_NOT_ADDED } 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 7d73c8a9c..59511a5f9 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -22,7 +22,6 @@ package com.nextcloud.talk.users import android.text.TextUtils -import android.util.Log import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.data.user.UsersRepository import com.nextcloud.talk.data.user.model.User @@ -47,15 +46,16 @@ class UserManager internal constructor(private val userRepository: UsersReposito val results = userRepository.getUsersNotScheduledForDeletion() // TODO needs to return Empty in case no user was found (and set active) - return results.map { users -> - users - .firstOrNull() - ?.apply { - current = true - }.also { user -> - userRepository.updateUser(user!!) - } - } + return results + .map { users -> + users + .firstOrNull() + ?.apply { + current = true + }.also { user -> + userRepository.updateUser(user!!) + } + } } override val currentUser: Maybe @@ -91,45 +91,36 @@ class UserManager internal constructor(private val userRepository: UsersReposito } } - fun checkIfUserIsScheduledForDeletion(username: String, server: String): Maybe { + fun checkIfUserIsScheduledForDeletion(username: String, server: String): Single { return userRepository .getUserWithUsernameAndServer(username, server) - .switchIfEmpty(Maybe.empty()) - .map { user: User? -> - when (user) { - null -> FALSE - else -> user.scheduledForDeletion - } - } + .map { it.scheduledForDeletion } + .switchIfEmpty(Single.just(false)) } fun getUserWithInternalId(id: Long): Maybe { return userRepository.getUserWithIdNotScheduledForDeletion(id) } - fun getIfUserWithUsernameAndServer(username: String, server: String): Maybe { + fun checkIfUserExists(username: String, server: String): Single { return userRepository .getUserWithUsernameAndServer(username, server) - .map { user: User? -> - when (user) { - null -> FALSE - else -> TRUE - } - } + .map { true } + .switchIfEmpty(Single.just(false)) } fun scheduleUserForDeletionWithId(id: Long): Single { // TODO needs to return false in case getAnyUserAndSetAsActive doesn't return a user // or getUserWithId(id) doesn't return a user - return userRepository.getUserWithId(id).map { user -> - user.scheduledForDeletion = true - user.current = false - userRepository.updateUser(user) - } + return userRepository.getUserWithId(id) + .map { user -> + user.scheduledForDeletion = true + user.current = false + userRepository.updateUser(user) + } .toSingle() - .flatMap { - getAnyUserAndSetAsActive() - }.map { TRUE } + .flatMap { getAnyUserAndSetAsActive() } + .map { true } } fun updateExternalSignalingServer(id: Long, externalSignalingServer: ExternalSignalingServer): Single { From e7c258e2f8180803397db35436b8ace370d701dd Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Jul 2022 14:16:59 +0200 Subject: [PATCH 06/11] fix detekt issues Signed-off-by: Andy Scherzinger --- .../talk/controllers/AccountVerificationController.kt | 10 ++++------ .../main/java/com/nextcloud/talk/users/UserManager.kt | 2 -- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt index a887748ed..eb3efc898 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt @@ -277,8 +277,7 @@ class AccountVerificationController(args: Bundle? = null) : } else { activity!!.runOnUiThread { binding.progressText.text = - """ - ${binding.progressText.text} + """ ${binding.progressText.text} ${resources!!.getString(R.string.nc_push_disabled)} """.trimIndent() } @@ -289,10 +288,9 @@ class AccountVerificationController(args: Bundle? = null) : @SuppressLint("SetTextI18n") override fun onError(e: Throwable) { binding.progressText.text = + """ ${binding.progressText.text} """ - ${binding.progressText.text} - """.trimIndent() + - resources!!.getString(R.string.nc_display_name_not_stored) + .trimIndent() + resources!!.getString(R.string.nc_display_name_not_stored) abortVerification() } @@ -484,7 +482,7 @@ class AccountVerificationController(args: Bundle? = null) : if (internalAccountId != -1L) { val count = userManager.deleteUser(internalAccountId) if (count > 0) { - activity?.runOnUiThread { Handler().postDelayed({ router.popToRoot() }, DELAY_IN_MILLIS) } + activity?.runOnUiThread { Handler().postDelayed({ router.popToRoot() }, DELAY_IN_MILLIS) } } } else { activity?.runOnUiThread { Handler().postDelayed({ router.popToRoot() }, DELAY_IN_MILLIS) } 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 59511a5f9..8f685b8a4 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -31,8 +31,6 @@ 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.FALSE -import java.lang.Boolean.TRUE @Suppress("TooManyFunctions") class UserManager internal constructor(private val userRepository: UsersRepository) : CurrentUserProviderNew { From a3b99e9010a0c98cbb1c860b952109ac5ea97fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Tue, 19 Jul 2022 17:46:32 +0200 Subject: [PATCH 07/11] UserManager: fix rx logic for scheduleUserForDeletionWithId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../com/nextcloud/talk/users/UserManager.kt | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) 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 8f685b8a4..7c4453f95 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -40,22 +40,6 @@ class UserManager internal constructor(private val userRepository: UsersReposito val usersScheduledForDeletion: Single> get() = userRepository.getUsersScheduledForDeletion() - private fun getAnyUserAndSetAsActive(): Single { - val results = userRepository.getUsersNotScheduledForDeletion() - - // TODO needs to return Empty in case no user was found (and set active) - return results - .map { users -> - users - .firstOrNull() - ?.apply { - current = true - }.also { user -> - userRepository.updateUser(user!!) - } - } - } - override val currentUser: Maybe get() { return userRepository.getActiveUser() @@ -107,18 +91,40 @@ class UserManager internal constructor(private val userRepository: UsersReposito .switchIfEmpty(Single.just(false)) } + /** + * Don't ask + * + * @return `true` if the user was updated **AND** there is another user to set as active, `false` otherwise + */ fun scheduleUserForDeletionWithId(id: Long): Single { - // TODO needs to return false in case getAnyUserAndSetAsActive doesn't return a user - // or getUserWithId(id) doesn't return a user return userRepository.getUserWithId(id) .map { user -> user.scheduledForDeletion = true user.current = false userRepository.updateUser(user) } - .toSingle() .flatMap { getAnyUserAndSetAsActive() } .map { true } + .switchIfEmpty(Single.just(false)) + } + + private fun getAnyUserAndSetAsActive(): Maybe { + val results = userRepository.getUsersNotScheduledForDeletion() + + return results + .flatMapMaybe { + if (it.isNotEmpty()) { + val user = it.first() + user.apply { + current = true + }.also { user -> + userRepository.updateUser(user) + } + Maybe.just(user) + } else { + Maybe.empty() + } + } } fun updateExternalSignalingServer(id: Long, externalSignalingServer: ExternalSignalingServer): Single { @@ -181,9 +187,8 @@ class UserManager internal constructor(private val userRepository: UsersReposito @Deprecated("Only available for migration, use updateExternalSignalingServer or create new methods") fun createOrUpdateUser( username: String?, - userAttributes: UserAttributes, + userAttributes: UserAttributes ): Maybe { - val userMaybe: Maybe = findUser(username, userAttributes) return userMaybe From e7756003d7b4bd304ecdf17885db91b99408253f Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Jul 2022 18:54:19 +0200 Subject: [PATCH 08/11] remove variable shadowing Signed-off-by: Andy Scherzinger --- app/src/main/java/com/nextcloud/talk/users/UserManager.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 7c4453f95..e803e33ed 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -117,8 +117,8 @@ class UserManager internal constructor(private val userRepository: UsersReposito val user = it.first() user.apply { current = true - }.also { user -> - userRepository.updateUser(user) + }.also { currentUser -> + userRepository.updateUser(currentUser) } Maybe.just(user) } else { From dac99a5db83176452a9f708bcf6d25071a781ac4 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Jul 2022 21:47:23 +0200 Subject: [PATCH 09/11] Remove unused (legacy) UserUtils Signed-off-by: Andy Scherzinger --- .../talk/controllers/ChatController.kt | 31 +++++++------------ .../talk/controllers/GeocodingController.kt | 4 --- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index d0f24beeb..15c506670 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -168,7 +168,6 @@ 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_USER_ENTITY import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew -import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.rx.DisposableSet import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder @@ -222,16 +221,10 @@ class ChatController(args: Bundle) : private val binding: ControllerChatBinding by viewBinding(ControllerChatBinding::bind) @Inject - @JvmField - var ncApi: NcApi? = null + lateinit var ncApi: NcApi @Inject - @JvmField - var userUtils: UserUtils? = null - - @Inject - @JvmField - var eventBus: EventBus? = null + lateinit var eventBus: EventBus @Inject lateinit var permissionUtil: PlatformPermissionUtil @@ -332,7 +325,7 @@ class ChatController(args: Bundle) : val startNanoTime = System.nanoTime() Log.d(TAG, "getRoomInfo - getRoom - calling: " + startNanoTime) - ncApi?.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, conversationUser.baseUrl, roomToken)) + ncApi.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, conversationUser.baseUrl, roomToken)) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer { @@ -399,7 +392,7 @@ class ChatController(args: Bundle) : } Log.d(TAG, "handleFromNotification - getRooms - calling") - ncApi?.getRooms(credentials, ApiUtils.getUrlForRooms(apiVersion, conversationUser?.baseUrl)) + ncApi.getRooms(credentials, ApiUtils.getUrlForRooms(apiVersion, conversationUser?.baseUrl)) ?.subscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer { override fun onSubscribe(d: Disposable) { @@ -1687,7 +1680,7 @@ class ChatController(args: Bundle) : "onAttach: Controller: " + System.identityHashCode(this).toString() + " Activity: " + System.identityHashCode(activity).toString() ) - eventBus?.register(this) + eventBus.register(this) if (conversationUser?.userId != "?" && CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "mention-flag") ?: false && @@ -1777,7 +1770,7 @@ class ChatController(args: Bundle) : " Activity: " + System.identityHashCode(activity).toString() ) - eventBus?.unregister(this) + eventBus.unregister(this) if (activity != null) { activity?.findViewById(R.id.toolbar)?.setOnClickListener(null) @@ -1849,7 +1842,7 @@ class ChatController(args: Bundle) : val startNanoTime = System.nanoTime() Log.d(TAG, "joinRoomWithPassword - joinRoom - calling: " + startNanoTime) - ncApi?.joinRoom( + ncApi.joinRoom( credentials, ApiUtils.getUrlForParticipantsActive(apiVersion, conversationUser?.baseUrl, roomToken), roomPassword @@ -1935,7 +1928,7 @@ class ChatController(args: Bundle) : val startNanoTime = System.nanoTime() Log.d(TAG, "leaveRoom - leaveRoom - calling: " + startNanoTime) - ncApi?.leaveRoom( + ncApi.leaveRoom( credentials, ApiUtils.getUrlForParticipantsActive( apiVersion, @@ -2150,7 +2143,7 @@ class ChatController(args: Bundle) : if (lookIntoFuture > 0) { val finalTimeout = timeout Log.d(TAG, "pullChatMessages - pullChatMessages[lookIntoFuture > 0] - calling") - ncApi?.pullChatMessages( + ncApi.pullChatMessages( credentials, ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), fieldMap ) @@ -2192,7 +2185,7 @@ class ChatController(args: Bundle) : }) } else { Log.d(TAG, "pullChatMessages - pullChatMessages[lookIntoFuture <= 0] - calling") - ncApi?.pullChatMessages( + ncApi.pullChatMessages( credentials, ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), fieldMap ) @@ -2700,7 +2693,7 @@ class ChatController(args: Bundle) : apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) } - ncApi?.deleteChatMessage( + ncApi.deleteChatMessage( credentials, ApiUtils.getUrlForChatMessage( apiVersion, @@ -3066,7 +3059,7 @@ class ChatController(args: Bundle) : null ) - ncApi?.createRoom( + ncApi.createRoom( credentials, retrofitBucket.url, retrofitBucket.queryMap ) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt b/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt index 332c69051..7d29ae162 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/GeocodingController.kt @@ -45,7 +45,6 @@ import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.databinding.ControllerGeocodingBinding import com.nextcloud.talk.utils.bundle.BundleKeys -import com.nextcloud.talk.utils.database.user.UserUtils import fr.dudie.nominatim.client.TalkJsonNominatimClient import fr.dudie.nominatim.model.Address import kotlinx.coroutines.CoroutineScope @@ -69,9 +68,6 @@ class GeocodingController(args: Bundle) : @Inject lateinit var ncApi: NcApi - @Inject - lateinit var userUtils: UserUtils - @Inject lateinit var okHttpClient: OkHttpClient From 6a8cafec2287d3d987abe03545e077ca7414f0b4 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Jul 2022 21:51:08 +0200 Subject: [PATCH 10/11] migrate location picker from requery to room Signed-off-by: Andy Scherzinger --- .../talk/controllers/LocationPickerController.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt b/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt index 6ba4803da..3efcbe349 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/LocationPickerController.kt @@ -53,11 +53,11 @@ import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.databinding.ControllerLocationBinding import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN -import com.nextcloud.talk.utils.database.user.UserUtils import fr.dudie.nominatim.client.TalkJsonNominatimClient import fr.dudie.nominatim.model.Address import io.reactivex.Observer @@ -96,7 +96,7 @@ class LocationPickerController(args: Bundle) : lateinit var ncApi: NcApi @Inject - lateinit var userUtils: UserUtils + lateinit var userManager: UserManager @Inject lateinit var okHttpClient: OkHttpClient @@ -135,11 +135,13 @@ class LocationPickerController(args: Bundle) : @Suppress("Detekt.TooGenericExceptionCaught") override fun onDetach(view: View) { super.onDetach(view) + try { locationManager!!.removeUpdates(this) } catch (e: Exception) { Log.e(TAG, "error when trying to remove updates for location Manager", e) } + locationOverlay.disableMyLocation() } @@ -404,11 +406,12 @@ class LocationPickerController(args: Bundle) : "{\"type\":\"geo-location\",\"id\":\"geo:$selectedLat,$selectedLon\",\"latitude\":\"$selectedLat\"," + "\"longitude\":\"$selectedLon\",\"name\":\"$locationNameToShare\"}" - val apiVersion = ApiUtils.getChatApiVersion(userUtils.currentUser, intArrayOf(1)) + val currentUser = userManager.currentUser.blockingGet() + val apiVersion = ApiUtils.getChatApiVersion(currentUser, intArrayOf(1)) ncApi.sendLocation( - ApiUtils.getCredentials(userUtils.currentUser?.username, userUtils.currentUser?.token), - ApiUtils.getUrlToSendLocation(apiVersion, userUtils.currentUser?.baseUrl, roomToken), + ApiUtils.getCredentials(currentUser?.username, currentUser?.token), + ApiUtils.getUrlToSendLocation(apiVersion, currentUser?.baseUrl, roomToken), "geo-location", objectId, metaData From 00f55f1949be3ef93d03a6cee7f1472d8a0007ef Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 22 Jul 2022 14:50:08 +0200 Subject: [PATCH 11/11] use correct primary key to search for any other users in the DB and use current value from user attributes object Signed-off-by: Andy Scherzinger --- app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt | 4 ++-- .../java/com/nextcloud/talk/data/user/UsersRepository.kt | 2 +- .../com/nextcloud/talk/data/user/UsersRepositoryImpl.kt | 4 ++-- app/src/main/java/com/nextcloud/talk/users/UserManager.kt | 6 +++--- app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt | 2 +- 5 files changed, 9 insertions(+), 9 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 1bb2e99cb..121bc13ff 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 @@ -71,8 +71,8 @@ abstract class UsersDao { @Query("SELECT * FROM User where userId = :userId") abstract fun getUserWithUserId(userId: String): Maybe - @Query("SELECT * FROM User where userId != :userId") - abstract fun getUsersWithoutUserId(userId: Long): Single> + @Query("SELECT * FROM User where id != :id") + abstract fun getUsersWithoutId(id: Long): Single> @Query("SELECT * FROM User where scheduledForDeletion = 1") abstract fun getUsersScheduledForDeletion(): Single> 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 c3d4cab2b..40cd5a602 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 @@ -33,7 +33,7 @@ interface UsersRepository { fun getUserWithId(id: Long): Maybe fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe fun getUserWithUserId(userId: String): Maybe - fun getUsersWithoutUserId(userId: Long): Single> + fun getUsersWithoutUserId(id: Long): Single> fun getUsersScheduledForDeletion(): Single> fun getUsersNotScheduledForDeletion(): Single> fun getUserWithUsernameAndServer(username: String, server: String): Maybe 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 6d564eee7..7ef3ebbcc 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 @@ -49,8 +49,8 @@ class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { return usersDao.getUserWithUserId(userId).map { UserMapper.toModel(it) } } - override fun getUsersWithoutUserId(userId: Long): Single> { - return usersDao.getUsersWithoutUserId(userId).map { UserMapper.toModel(it) } + override fun getUsersWithoutUserId(id: Long): Single> { + return usersDao.getUsersWithoutId(id).map { UserMapper.toModel(it) } } override fun getUsersScheduledForDeletion(): Single> { 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 e803e33ed..0f88b5e55 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -57,8 +57,8 @@ class UserManager internal constructor(private val userRepository: UsersReposito return userRepository.getUserWithId(id) } - fun disableAllUsersWithoutId(userId: Long): Single { - val results = userRepository.getUsersWithoutUserId(userId) + fun disableAllUsersWithoutId(id: Long): Single { + val results = userRepository.getUsersWithoutUserId(id) return results.map { users -> var count = 0 @@ -275,7 +275,7 @@ class UserManager internal constructor(private val userRepository: UsersReposito user.externalSignalingServer = LoganSquare .parse(userAttributes.externalSignalingServer, ExternalSignalingServer::class.java) } - user.current = true + user.current = userAttributes.currentUser == true return user } diff --git a/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt index dbdb27577..f21244b1f 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AccountUtils.kt @@ -3,7 +3,7 @@ * * @author Andy Scherzinger * @author Mario Danic - * Copyright (C) 2021 Andy Scherzinger + * Copyright (C) 2022 Andy Scherzinger * Copyright (C) 2017 Mario Danic * * This program is free software: you can redistribute it and/or modify