diff --git a/app/src/androidTest/java/com/nextcloud/talk/ui/LoginIT.java b/app/src/androidTest/java/com/nextcloud/talk/ui/LoginIT.java index 69128942b..fb849d206 100644 --- a/app/src/androidTest/java/com/nextcloud/talk/ui/LoginIT.java +++ b/app/src/androidTest/java/com/nextcloud/talk/ui/LoginIT.java @@ -143,7 +143,7 @@ public class LoginIT { onView(withId(R.id.user_name)).check(matches(withText("User One"))); activityScenario.onActivity(activity -> { - assertEquals(loginName, Objects.requireNonNull(activity.userManager.getCurrentUser()).getUserId()); + assertEquals(loginName, Objects.requireNonNull(activity.userManager.getCurrentUser().blockingFirst()).getUserId()); }); } } diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 7a8d89ea9..69ca428eb 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -262,7 +262,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { val user = userId.substringBeforeLast("@") val baseUrl = userId.substringAfterLast("@") - if (userManager.currentUser?.baseUrl?.endsWith(baseUrl) == true) { + if (userManager.currentUser.blockingFirst()?.baseUrl?.endsWith(baseUrl) == true) { startConversation(user) } else { Snackbar.make( @@ -279,7 +279,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { private fun startConversation(userId: String) { val roomType = "1" - val currentUser = userManager.currentUser + val currentUser = userManager.currentUser.blockingFirst() val apiVersion = ApiUtils.getConversationApiVersion(currentUser, intArrayOf(ApiUtils.APIv4, 1)) val credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt index a2fae7332..5923aa3e7 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt @@ -98,7 +98,6 @@ import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -import kotlinx.coroutines.runBlocking import net.orange_box.storebox.listeners.OnPreferenceValueChangedListener import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody @@ -140,7 +139,7 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { resources!!.getString(R.string.nc_settings) private fun getCurrentUser() { - currentUser = currentUserProvider.currentUser + currentUser = currentUserProvider.currentUser.firstOrError().blockingGet() credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token) } @@ -151,46 +150,44 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { ViewCompat.setTransitionName((binding.avatarImage), "userAvatar.transitionTag") - runBlocking { - getCurrentUser() + getCurrentUser() - if (saveStateHandler == null) { - saveStateHandler = LovelySaveStateHandler() - } - - registerChangeListeners() - - setupSettingsScreen() - setupLicenceSetting() - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - binding.settingsIncognitoKeyboard.visibility = View.GONE - } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - binding.settingsScreenLock.visibility = View.GONE - binding.settingsScreenLockTimeout.visibility = View.GONE - } else { - binding.settingsScreenLock.setSummary( - String.format( - Locale.getDefault(), - resources!!.getString(R.string.nc_settings_screen_lock_desc), - resources!!.getString(R.string.nc_app_product_name) - ) - ) - } - - setupPrivacyUrl() - setupSourceCodeUrl() - binding.settingsVersion.setSummary("v" + BuildConfig.VERSION_NAME) - - setupSoundSettings() - - setupPhoneBookIntegration() - - setupClientCertView() + if (saveStateHandler == null) { + saveStateHandler = LovelySaveStateHandler() } + registerChangeListeners() + + setupSettingsScreen() + setupLicenceSetting() + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + binding.settingsIncognitoKeyboard.visibility = View.GONE + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + binding.settingsScreenLock.visibility = View.GONE + binding.settingsScreenLockTimeout.visibility = View.GONE + } else { + binding.settingsScreenLock.setSummary( + String.format( + Locale.getDefault(), + resources!!.getString(R.string.nc_settings_screen_lock_desc), + resources!!.getString(R.string.nc_app_product_name) + ) + ) + } + + setupPrivacyUrl() + setupSourceCodeUrl() + binding.settingsVersion.setSummary("v" + BuildConfig.VERSION_NAME) + + setupSoundSettings() + + setupPhoneBookIntegration() + + setupClientCertView() + Log.i(TAG, "Current user: " + currentUser?.displayName) } @@ -472,72 +469,67 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { actionBar?.show() dispose(null) - runBlocking { + binding.settingsVersion.setOnClickListener { + sendLogs() + } - getCurrentUser() + if (!TextUtils.isEmpty(currentUser!!.clientCertificate)) { + binding.settingsClientCert.setTitle(R.string.nc_client_cert_change) + } else { + binding.settingsClientCert.setTitle(R.string.nc_client_cert_setup) + } - binding.settingsVersion.setOnClickListener { - sendLogs() - } + setupCheckables() + setupScreenLockSetting() - if (!TextUtils.isEmpty(currentUser!!.clientCertificate)) { - binding.settingsClientCert.setTitle(R.string.nc_client_cert_change) - } else { - binding.settingsClientCert.setTitle(R.string.nc_client_cert_setup) - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + binding.settingsNotificationsCategory.setTitle( + resources!!.getString(R.string.nc_settings_notification_sounds_post_oreo) + ) + } - setupCheckables() - setupScreenLockSetting() + val callRingtoneUri = getCallRingtoneUri(view.context, (appPreferences)!!) + binding.settingsCallSound.setSummary(getRingtoneName(view.context, callRingtoneUri)) + val messageRingtoneUri = getMessageRingtoneUri(view.context, (appPreferences)!!) + binding.settingsMessageSound.setSummary(getRingtoneName(view.context, messageRingtoneUri)) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - binding.settingsNotificationsCategory.setTitle( - resources!!.getString(R.string.nc_settings_notification_sounds_post_oreo) + setupProxyTypeSettings() + setupProxyCredentialSettings() + + if (currentUser != null) { + binding.baseUrlText.text = Uri.parse(currentUser!!.baseUrl).host + setupServerAgeWarning() + + binding.settingsReauthorize.addPreferenceClickListener { + router.pushController( + RouterTransaction.with(WebViewLoginController(currentUser!!.baseUrl, true)) + .pushChangeHandler(VerticalChangeHandler()) + .popChangeHandler(VerticalChangeHandler()) ) } - val callRingtoneUri = getCallRingtoneUri(view.context, (appPreferences)!!) - binding.settingsCallSound.setSummary(getRingtoneName(view.context, callRingtoneUri)) - val messageRingtoneUri = getMessageRingtoneUri(view.context, (appPreferences)!!) - binding.settingsMessageSound.setSummary(getRingtoneName(view.context, messageRingtoneUri)) - - setupProxyTypeSettings() - setupProxyCredentialSettings() - - if (currentUser != null) { - binding.baseUrlText.text = Uri.parse(currentUser!!.baseUrl).host - setupServerAgeWarning() - - binding.settingsReauthorize.addPreferenceClickListener { - router.pushController( - RouterTransaction.with(WebViewLoginController(currentUser!!.baseUrl, true)) - .pushChangeHandler(VerticalChangeHandler()) - .popChangeHandler(VerticalChangeHandler()) - ) - } - - if (currentUser!!.displayName != null) { - binding.displayNameText.text = currentUser!!.displayName - } - DisplayUtils.loadAvatarImage(currentUser, binding.avatarImage, false) - - setupProfileQueryDisposable() - - binding.settingsRemoveAccount.addPreferenceClickListener { - showLovelyDialog(ID_REMOVE_ACCOUNT_WARNING_DIALOG, null) - } + if (currentUser!!.displayName != null) { + binding.displayNameText.text = currentUser!!.displayName } - setupMessageView() + DisplayUtils.loadAvatarImage(currentUser, binding.avatarImage, false) - binding.avatarContainer.setOnClickListener { - router - .pushController( - RouterTransaction.with(ProfileController()) - .pushChangeHandler(HorizontalChangeHandler()) - .popChangeHandler(HorizontalChangeHandler()) + setupProfileQueryDisposable() - ) + binding.settingsRemoveAccount.addPreferenceClickListener { + showLovelyDialog(ID_REMOVE_ACCOUNT_WARNING_DIALOG, null) } } + setupMessageView() + + binding.avatarContainer.setOnClickListener { + router + .pushController( + RouterTransaction.with(ProfileController()) + .pushChangeHandler(HorizontalChangeHandler()) + .popChangeHandler(HorizontalChangeHandler()) + + ) + } } private fun setupProxyTypeSettings() { 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 b9ea80592..0a4b7e7bd 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 @@ -74,6 +74,7 @@ abstract class UsersDao { @Query("SELECT * FROM User where id = :id") abstract fun getUserWithId(id: Long): Observable + // TODO remove this one, duplicated @Query("SELECT * FROM User where id = :id") abstract fun getUserWithIdLiveData(id: Long): Observable 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 70d0b9e0a..8e10d47e3 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -74,9 +74,9 @@ class UserManager internal constructor(private val userRepository: UsersReposito return Observable.just(result) } - override val currentUser: UserNgEntity? + override val currentUser: Observable get() { - return userRepository.getActiveUserSynchronously() + return userRepository.getActiveUser() } fun deleteUser(internalId: Long) { @@ -245,62 +245,34 @@ class UserManager internal constructor(private val userRepository: UsersReposito username: String?, userAttributes: UserAttributes, ): Observable { - var user: UserNgEntity? = null - if (userAttributes.id == null && username != null && userAttributes.serverUrl != null) { + val userObservable = if (userAttributes.id == null && username != null && userAttributes.serverUrl != null) { userRepository.getUserWithUsernameAndServer(username, userAttributes.serverUrl) - .subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // unused atm - } - - override fun onNext(userEntity: UserNgEntity) { - user = userEntity - } - - override fun onError(e: Throwable) { - // unused atm - } - - override fun onComplete() { - // unused atm - } - }) } else if (userAttributes.id != null) { userRepository.getUserWithId(userAttributes.id) - .subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // unused atm - } - - override fun onNext(userEntity: UserNgEntity) { - user = userEntity - } - - override fun onError(e: Throwable) { - // unused atm - } - - override fun onComplete() { - // unused atm - } - }) - } - - if (user == null) { - user = createUser( - username, - userAttributes - ) } else { - updateUserData( - user!!, - userAttributes - ) + Observable.just(null) } - userRepository.insertUser(user!!) - return userRepository.getUserWithIdLiveData(user!!.id) + return userObservable + .map { user: UserNgEntity? -> + val userEntity = when (user) { + null -> createUser( + username, + userAttributes + ) + else -> { + updateUserData( + user, + userAttributes + ) + user + } + } + userRepository.insertUser(userEntity) + }.flatMap { id -> + userRepository.getUserWithIdLiveData(id) + } } fun getUserWithUsernameAndServer(username: String, server: String): Observable { diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt index 63d0fdf66..ec40c6db8 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt @@ -21,7 +21,8 @@ package com.nextcloud.talk.utils.database.user import com.nextcloud.talk.data.user.model.UserNgEntity +import io.reactivex.Observable interface CurrentUserProviderNew { - val currentUser: UserNgEntity? + val currentUser: Observable }