From 42d987f8ef9b1bc49ead319e91a476def8fe6345 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Nov 2021 17:36:03 +0100 Subject: [PATCH] Analytics: Fix a crash, cannot create several time a PostHog client --- .../analytics/impl/DefaultVectorAnalytics.kt | 18 +++++++++++------- .../features/analytics/store/AnalyticsStore.kt | 18 +++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/analytics/impl/DefaultVectorAnalytics.kt b/vector/src/main/java/im/vector/app/features/analytics/impl/DefaultVectorAnalytics.kt index 4c14432906..8558c03f9b 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/impl/DefaultVectorAnalytics.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/impl/DefaultVectorAnalytics.kt @@ -39,7 +39,8 @@ class DefaultVectorAnalytics @Inject constructor( ) : VectorAnalytics { private var posthog: PostHog? = null - private var userConsent: Boolean = false + // Cache for the store values + private var userConsent: Boolean? = null private var analyticsId: String? = null override fun getUserConsent(): Flow { @@ -77,6 +78,7 @@ class DefaultVectorAnalytics @Inject constructor( override fun init() { observeUserConsent() observeAnalyticsId() + createAnalyticsClient() } @Suppress("EXPERIMENTAL_API_USAGE") @@ -107,14 +109,15 @@ class DefaultVectorAnalytics @Inject constructor( .onEach { consent -> Timber.tag(analyticsTag.value).d("User consent updated to $consent") userConsent = consent - if (consent) { - createAnalyticsClient() - } - posthog?.optOut(!consent) + optOutPostHog() } .launchIn(GlobalScope) } + private fun optOutPostHog() { + userConsent?.let { posthog?.optOut(!it) } + } + private fun createAnalyticsClient() { Timber.tag(analyticsTag.value).d("createAnalyticsClient()") @@ -142,6 +145,7 @@ class DefaultVectorAnalytics @Inject constructor( .logLevel(getLogLevel()) .build() + optOutPostHog() identifyPostHog() } @@ -156,14 +160,14 @@ class DefaultVectorAnalytics @Inject constructor( override fun capture(event: String, properties: Map?) { Timber.tag(analyticsTag.value).d("capture($event)") posthog - ?.takeIf { userConsent } + ?.takeIf { userConsent == true } ?.capture(event, properties.toPostHogProperties()) } override fun screen(name: String, properties: Map?) { Timber.tag(analyticsTag.value).d("screen($name)") posthog - ?.takeIf { userConsent } + ?.takeIf { userConsent == true } ?.screen(name, properties.toPostHogProperties()) } diff --git a/vector/src/main/java/im/vector/app/features/analytics/store/AnalyticsStore.kt b/vector/src/main/java/im/vector/app/features/analytics/store/AnalyticsStore.kt index efb824d3db..cd5e204d66 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/store/AnalyticsStore.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/store/AnalyticsStore.kt @@ -24,6 +24,7 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import org.matrix.android.sdk.api.extensions.orFalse import javax.inject.Inject @@ -43,17 +44,16 @@ class AnalyticsStore @Inject constructor( private val didAskUserConsent = booleanPreferencesKey("did_ask_user_consent") private val analyticsId = stringPreferencesKey("analytics_id") - val userConsentFlow: Flow = context.dataStore.data.map { preferences -> - preferences[userConsent].orFalse() - } + val userConsentFlow: Flow = context.dataStore.data + .map { preferences -> preferences[userConsent].orFalse() } + .distinctUntilChanged() - val didAskUserConsentFlow: Flow = context.dataStore.data.map { preferences -> - preferences[didAskUserConsent].orFalse() - } + val didAskUserConsentFlow: Flow = context.dataStore.data + .map { preferences -> preferences[didAskUserConsent].orFalse() } - val analyticsIdFlow: Flow = context.dataStore.data.map { preferences -> - preferences[analyticsId].orEmpty() - } + val analyticsIdFlow: Flow = context.dataStore.data + .map { preferences -> preferences[analyticsId].orEmpty() } + .distinctUntilChanged() suspend fun setUserConsent(newUserConsent: Boolean) { context.dataStore.edit { settings ->