From 6f7b1db3d121c33e7d2b93b58d83f4913b4c0816 Mon Sep 17 00:00:00 2001 From: newmskywalker <3849278+newmskywalker@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:44:14 -0400 Subject: [PATCH] Identifies feature flags using name and email --- .../src/main/java/io/newm/AppLaunchGhostActivity.kt | 13 ++++++++++--- .../java/io/newm/utils/AndroidFeatureFlagManager.kt | 8 ++++++-- .../public/featureflags/FeatureFlagManager.kt | 4 +++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/android/app-newm/src/main/java/io/newm/AppLaunchGhostActivity.kt b/android/app-newm/src/main/java/io/newm/AppLaunchGhostActivity.kt index 8dc567bc..3ba809fe 100644 --- a/android/app-newm/src/main/java/io/newm/AppLaunchGhostActivity.kt +++ b/android/app-newm/src/main/java/io/newm/AppLaunchGhostActivity.kt @@ -9,10 +9,14 @@ import io.newm.shared.NewmAppLogger import io.newm.shared.public.featureflags.FeatureFlagManager import io.newm.shared.public.usecases.UserDetailsUseCase import io.newm.shared.public.usecases.UserSessionUseCase +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.timeout import kotlinx.coroutines.launch import org.koin.android.ext.android.inject +import kotlin.time.Duration.Companion.seconds class AppLaunchGhostActivity : ComponentActivity() { private val tag = "AppLaunchGhostActivity" @@ -21,6 +25,7 @@ class AppLaunchGhostActivity : ComponentActivity() { private val featureFlagMager: FeatureFlagManager by inject() private val logger: NewmAppLogger by inject() + @OptIn(FlowPreview::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) installSplashScreen().apply { @@ -30,9 +35,11 @@ class AppLaunchGhostActivity : ComponentActivity() { if (userSession.isLoggedIn()) { lifecycleScope.launch { try { - val user = - userDetailsUseCase.fetchLoggedInUserDetailsFlow().filterNotNull().first() - featureFlagMager.setUserId(user.id) + userDetailsUseCase.fetchLoggedInUserDetailsFlow() + .filterNotNull() + .onEach(featureFlagMager::setUser) + .timeout(3.seconds) + .first() } catch (e: Exception) { logger.error( tag, diff --git a/android/app-newm/src/main/java/io/newm/utils/AndroidFeatureFlagManager.kt b/android/app-newm/src/main/java/io/newm/utils/AndroidFeatureFlagManager.kt index e932178c..dba60a0b 100644 --- a/android/app-newm/src/main/java/io/newm/utils/AndroidFeatureFlagManager.kt +++ b/android/app-newm/src/main/java/io/newm/utils/AndroidFeatureFlagManager.kt @@ -9,6 +9,7 @@ import com.launchdarkly.sdk.android.LDConfig.Builder.AutoEnvAttributes import io.newm.shared.config.NewmSharedBuildConfig import io.newm.shared.public.featureflags.FeatureFlag import io.newm.shared.public.featureflags.FeatureFlagManager +import io.newm.shared.public.models.User import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers @@ -38,8 +39,11 @@ class AndroidFeatureFlagManager( return client.boolVariation(flag.key, default) } - override suspend fun setUserId(id: String) { - val ldContext = LDContext.builder(ContextKind.DEFAULT, id).build() + override suspend fun setUser(user: User) { + val ldContext = LDContext.builder(ContextKind.DEFAULT, user.id) + .set("email", user.email) + .name(user.nickname ?: user.email) + .build() client.identify(ldContext) .asDeferred() diff --git a/shared/src/commonMain/kotlin/io.newm.shared/public/featureflags/FeatureFlagManager.kt b/shared/src/commonMain/kotlin/io.newm.shared/public/featureflags/FeatureFlagManager.kt index 4672bd0f..f696320d 100644 --- a/shared/src/commonMain/kotlin/io.newm.shared/public/featureflags/FeatureFlagManager.kt +++ b/shared/src/commonMain/kotlin/io.newm.shared/public/featureflags/FeatureFlagManager.kt @@ -1,6 +1,8 @@ package io.newm.shared.public.featureflags +import io.newm.shared.public.models.User + interface FeatureFlagManager { fun isEnabled(flag: FeatureFlag, default: Boolean = false): Boolean - suspend fun setUserId(id: String) + suspend fun setUser(user: User) } \ No newline at end of file