Ensure we never call posthog.identify if user did not consent, because it sends request <server>/decide/?v=2 to the analytic server.

This commit is contained in:
Benoit Marty 2023-01-30 10:49:36 +01:00
parent 3ab465ea93
commit 5de386c3c9

View File

@ -31,6 +31,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.extensions.orFalse
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@ -60,6 +61,9 @@ class DefaultVectorAnalytics @Inject constructor(
private var userConsent: Boolean? = null
private var analyticsId: String? = null
// Cache for the properties to send
private var pendingUserProperties: UserProperties? = null
override fun init() {
observeUserConsent()
observeAnalyticsId()
@ -112,6 +116,7 @@ class DefaultVectorAnalytics @Inject constructor(
private suspend fun identifyPostHog() {
val id = analyticsId ?: return
if (!userConsent.orFalse()) return
if (id.isEmpty()) {
Timber.tag(analyticsTag.value).d("reset")
posthog?.reset()
@ -126,7 +131,7 @@ class DefaultVectorAnalytics @Inject constructor(
.onEach { consent ->
Timber.tag(analyticsTag.value).d("User consent updated to $consent")
userConsent = consent
optOutPostHog()
initOrStopPostHog()
initOrStopSentry()
}
.launchIn(globalScope)
@ -141,8 +146,20 @@ class DefaultVectorAnalytics @Inject constructor(
}
}
private fun optOutPostHog() {
userConsent?.let { posthog?.optOut(!it) }
private suspend fun initOrStopPostHog() {
userConsent?.let { _userConsent ->
when (_userConsent) {
true -> {
posthog?.optOut(false)
identifyPostHog()
pendingUserProperties?.let { doUpdateUserProperties(it) }
pendingUserProperties = null
}
false -> {
posthog?.optOut(true)
}
}
}
}
override fun capture(event: VectorAnalyticsEvent) {
@ -160,7 +177,17 @@ class DefaultVectorAnalytics @Inject constructor(
}
override fun updateUserProperties(userProperties: UserProperties) {
posthog?.identify(REUSE_EXISTING_ID, userProperties.getProperties()?.toPostHogUserProperties(), IGNORED_OPTIONS)
if (userConsent == true) {
doUpdateUserProperties(userProperties)
} else {
pendingUserProperties = userProperties
}
}
private fun doUpdateUserProperties(userProperties: UserProperties) {
posthog
?.takeIf { userConsent == true }
?.identify(REUSE_EXISTING_ID, userProperties.getProperties()?.toPostHogUserProperties(), IGNORED_OPTIONS)
}
private fun Map<String, Any?>?.toPostHogProperties(): Properties? {