From 2e2d4a9ca3f802a3eddbda15fa604b9b3ba1618c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Wed, 14 Dec 2022 12:13:57 +0100 Subject: [PATCH] CurrentUserProviderImpl: ensure only one observer is set up for all threads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../utils/database/user/CurrentUserProviderImpl.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt index 57848ff47..21aaa8875 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt @@ -31,7 +31,12 @@ import javax.inject.Inject * Listens to changes in the database and provides the current user without needing to query the database everytime. */ class CurrentUserProviderImpl @Inject constructor(private val userManager: UserManager) : CurrentUserProviderNew { + private var _currentUser: User? = null + + // synchronized to avoid multiple observers initialized from different threads + @get:Synchronized + @set:Synchronized private var currentUserObserver: Disposable? = null override val currentUser: Maybe @@ -40,8 +45,10 @@ class CurrentUserProviderImpl @Inject constructor(private val userManager: UserM // immediately get a result synchronously _currentUser = userManager.currentUser.blockingGet() if (currentUserObserver == null) { - // start observable for auto-updates - currentUserObserver = userManager.currentUserObservable.subscribe { _currentUser = it } + currentUserObserver = userManager.currentUserObservable + .subscribe { + _currentUser = it + } } } return _currentUser?.let { Maybe.just(it) } ?: Maybe.empty()