Analytics | Add support for SuperProperties

This commit is contained in:
Valere 2024-05-30 17:25:28 +02:00
parent e29f919abc
commit bf6ad4c5ca
8 changed files with 187 additions and 15 deletions

View file

@ -19,6 +19,7 @@ package io.element.android.services.analytics.impl
import com.squareup.anvil.annotations.ContributesBinding
import im.vector.app.features.analytics.itf.VectorAnalyticsEvent
import im.vector.app.features.analytics.itf.VectorAnalyticsScreen
import im.vector.app.features.analytics.plan.SuperProperties
import im.vector.app.features.analytics.plan.UserProperties
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn
@ -148,6 +149,10 @@ class DefaultAnalyticsService @Inject constructor(
}
}
override fun updateSuperProperties(updatedProperties: SuperProperties) {
this.analyticsProviders.onEach { it.updateSuperProperties(updatedProperties) }
}
override fun trackError(throwable: Throwable) {
if (userConsent.get()) {
analyticsProviders.onEach { it.trackError(throwable) }

View file

@ -23,6 +23,7 @@ import im.vector.app.features.analytics.itf.VectorAnalyticsEvent
import im.vector.app.features.analytics.itf.VectorAnalyticsScreen
import im.vector.app.features.analytics.plan.MobileScreen
import im.vector.app.features.analytics.plan.PollEnd
import im.vector.app.features.analytics.plan.SuperProperties
import im.vector.app.features.analytics.plan.UserProperties
import io.element.android.libraries.sessionstorage.api.observer.SessionObserver
import io.element.android.libraries.sessionstorage.test.observer.NoOpSessionObserver
@ -255,6 +256,23 @@ class DefaultAnalyticsServiceTest {
updateUserPropertiesLambda.assertions().isCalledOnce().with(value(aUserProperty))
}
@Test
fun `when super properties are updated, updateSuperProperties is sent to the provider`() = runCancellableScopeTest {
val updateSuperPropertiesLambda = lambdaRecorder<SuperProperties, Unit> { _ -> }
val sut = createDefaultAnalyticsService(
coroutineScope = it,
analyticsProviders = setOf(
FakeAnalyticsProvider(
initLambda = { },
updateSuperPropertiesLambda = updateSuperPropertiesLambda,
)
),
analyticsStore = FakeAnalyticsStore(defaultUserConsent = true),
)
sut.updateSuperProperties(aSuperProperty)
updateSuperPropertiesLambda.assertions().isCalledOnce().with(value(aSuperProperty))
}
private suspend fun createDefaultAnalyticsService(
coroutineScope: CoroutineScope,
analyticsProviders: Set<@JvmSuppressWildcards AnalyticsProvider> = setOf(
@ -280,6 +298,11 @@ class DefaultAnalyticsServiceTest {
private val aUserProperty = UserProperties(
ftueUseCaseSelection = UserProperties.FtueUseCaseSelection.WorkMessaging,
)
private val aSuperProperty = SuperProperties(
appPlatform = SuperProperties.AppPlatform.EXA,
cryptoSDK = SuperProperties.CryptoSDK.Rust,
cryptoSDKVersion = "0.0"
)
private val anError = Exception("a reason")
private const val AN_ID = "anId"
}