Skip to content

Commit 7b86a97

Browse files
committed
DataConnectAuth.kt: Add authUid property
1 parent 1c3812f commit 7b86a97

File tree

3 files changed

+47
-15
lines changed

3 files changed

+47
-15
lines changed

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectAppCheck.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ internal class DataConnectAppCheck(
4242
private val appCheckTokenListener = AppCheckTokenListenerImpl(logger)
4343

4444
@DeferredApi
45-
override fun addTokenListener(provider: InteropAppCheckTokenProvider) =
45+
override fun registerProvider(provider: InteropAppCheckTokenProvider) =
4646
provider.addAppCheckTokenListener(appCheckTokenListener)
4747

48-
override fun removeTokenListener(provider: InteropAppCheckTokenProvider) =
48+
override fun unregisterProvider(provider: InteropAppCheckTokenProvider) =
4949
provider.removeAppCheckTokenListener(appCheckTokenListener)
5050

5151
override suspend fun getToken(provider: InteropAppCheckTokenProvider, forceRefresh: Boolean) =

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectAuth.kt

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import com.google.firebase.dataconnect.core.DataConnectAuth.GetAuthTokenResult
2323
import com.google.firebase.dataconnect.core.Globals.toScrubbedAccessToken
2424
import com.google.firebase.dataconnect.core.LoggerGlobals.debug
2525
import com.google.firebase.internal.InternalTokenResult
26+
import java.util.concurrent.locks.ReentrantLock
27+
import kotlin.concurrent.withLock
2628
import kotlinx.coroutines.CoroutineDispatcher
2729
import kotlinx.coroutines.CoroutineScope
2830
import kotlinx.coroutines.tasks.await
@@ -39,14 +41,37 @@ internal class DataConnectAuth(
3941
blockingDispatcher = blockingDispatcher,
4042
logger = logger,
4143
) {
42-
private val idTokenListener = IdTokenListenerImpl(logger)
44+
45+
private data class ProviderIdTokenListenerPair(
46+
val provider: InternalAuthProvider,
47+
val idTokenListener: IdTokenListenerImpl,
48+
)
49+
50+
private val providersLock = ReentrantLock()
51+
private val providers = mutableListOf<ProviderIdTokenListenerPair>()
52+
53+
/**
54+
* The Firebase Auth UID of the current user, or `null` if Firebase Auth is not (yet) available or
55+
* if there is no logged-in user.
56+
*/
57+
val authUid: String?
58+
get() = providersLock.withLock { providers.lastOrNull()?.provider?.uid }
4359

4460
@DeferredApi
45-
override fun addTokenListener(provider: InternalAuthProvider) =
61+
override fun registerProvider(provider: InternalAuthProvider) {
62+
val idTokenListener = IdTokenListenerImpl(logger)
4663
provider.addIdTokenListener(idTokenListener)
64+
providersLock.withLock { providers.add(ProviderIdTokenListenerPair(provider, idTokenListener)) }
65+
}
4766

48-
override fun removeTokenListener(provider: InternalAuthProvider) =
49-
provider.removeIdTokenListener(idTokenListener)
67+
override fun unregisterProvider(provider: InternalAuthProvider) {
68+
val idTokenListener =
69+
providersLock.withLock {
70+
val index = providers.indexOfLast { it.provider === provider }
71+
if (index < 0) null else providers.removeAt(index).idTokenListener
72+
}
73+
idTokenListener?.let { provider.removeIdTokenListener(idTokenListener) }
74+
}
5075

5176
override suspend fun getToken(provider: InternalAuthProvider, forceRefresh: Boolean) =
5277
provider.getAccessToken(forceRefresh).await().let { GetAuthTokenResult(it.token) }

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectCredentialsTokenManager.kt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,25 @@ internal sealed class DataConnectCredentialsTokenManager<T : Any, R : GetTokenRe
123123
private val state = MutableStateFlow<State<T, R>>(State.New)
124124

125125
/**
126-
* Adds the token listener to the given provider.
126+
* Registers the given provider [T] instance if, and when, it becomes available.
127127
*
128-
* @see removeTokenListener
128+
* The implementation may want, or need, to register a listener of some sort with the provider in
129+
* order to be notified of provider state changes, such as a user logging in or logging out.
130+
*
131+
* @see unregisterProvider
129132
*/
130-
@DeferredApi protected abstract fun addTokenListener(provider: T)
133+
@DeferredApi protected abstract fun registerProvider(provider: T)
131134

132135
/**
133-
* Removes the token listener from the given provider.
136+
* Registers the given provider [T] instance, which can occur if a new provider becomes available
137+
* of if [close] is called.
138+
*
139+
* The implementation should undo any work done by [registerProvider], such as unregistering
140+
* listeners.
134141
*
135-
* @see addTokenListener
142+
* @see registerProvider
136143
*/
137-
protected abstract fun removeTokenListener(provider: T)
144+
protected abstract fun unregisterProvider(provider: T)
138145

139146
/**
140147
* Starts an asynchronous task to get a new access token from the given provider, forcing a token
@@ -192,7 +199,7 @@ internal sealed class DataConnectCredentialsTokenManager<T : Any, R : GetTokenRe
192199
is State.Initialized -> {}
193200
is State.Closed -> {}
194201
is State.StateWithProvider -> {
195-
removeTokenListener(oldState.provider)
202+
unregisterProvider(oldState.provider)
196203
}
197204
}
198205
}
@@ -398,7 +405,7 @@ internal sealed class DataConnectCredentialsTokenManager<T : Any, R : GetTokenRe
398405
@DeferredApi
399406
private fun onProviderAvailable(newProvider: T) {
400407
logger.debug { "onProviderAvailable(newProvider=$newProvider)" }
401-
addTokenListener(newProvider)
408+
registerProvider(newProvider)
402409

403410
val oldState =
404411
state.getAndUpdate { currentState ->
@@ -422,7 +429,7 @@ internal sealed class DataConnectCredentialsTokenManager<T : Any, R : GetTokenRe
422429
"onProviderAvailable(newProvider=$newProvider)" +
423430
" unregistering token listener that was just added"
424431
}
425-
removeTokenListener(newProvider)
432+
unregisterProvider(newProvider)
426433
}
427434
is State.Initialized -> {}
428435
is State.Idle -> {}

0 commit comments

Comments
 (0)