CurrentUserProviderImpl: ensure only one observer is set up for all threads

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-12-14 12:13:57 +01:00 committed by Andy Scherzinger
parent 25dd46f95a
commit 2e2d4a9ca3
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B

View File

@ -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<User>
@ -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()