forked from dsutanto/bChot-android
First Commit
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import extension.setupDependencyInjection
|
||||
import extension.testCommonDependencies
|
||||
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
* Copyright 2023, 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
plugins {
|
||||
id("io.element.android-compose-library")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "io.element.android.services.analytics.noop"
|
||||
}
|
||||
|
||||
setupDependencyInjection()
|
||||
|
||||
dependencies {
|
||||
implementation(projects.libraries.architecture)
|
||||
implementation(projects.libraries.di)
|
||||
api(projects.services.analytics.api)
|
||||
testCommonDependencies(libs)
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
* Copyright 2023-2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop
|
||||
|
||||
import dev.zacsweers.metro.AppScope
|
||||
import dev.zacsweers.metro.ContributesBinding
|
||||
import dev.zacsweers.metro.SingleIn
|
||||
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.services.analytics.api.AnalyticsLongRunningTransaction
|
||||
import io.element.android.services.analytics.api.AnalyticsService
|
||||
import io.element.android.services.analytics.api.NoopAnalyticsTransaction
|
||||
import io.element.android.services.analyticsproviders.api.AnalyticsProvider
|
||||
import io.element.android.services.analyticsproviders.api.AnalyticsTransaction
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
|
||||
@SingleIn(AppScope::class)
|
||||
@ContributesBinding(AppScope::class)
|
||||
class NoopAnalyticsService : AnalyticsService {
|
||||
override fun getAvailableAnalyticsProviders(): Set<AnalyticsProvider> = emptySet()
|
||||
override val userConsentFlow: Flow<Boolean> = flowOf(false)
|
||||
override suspend fun setUserConsent(userConsent: Boolean) = Unit
|
||||
override val didAskUserConsentFlow: Flow<Boolean> = flowOf(true)
|
||||
override suspend fun setDidAskUserConsent() = Unit
|
||||
override val analyticsIdFlow: Flow<String> = flowOf("")
|
||||
override suspend fun setAnalyticsId(analyticsId: String) = Unit
|
||||
override fun capture(event: VectorAnalyticsEvent) = Unit
|
||||
override fun screen(screen: VectorAnalyticsScreen) = Unit
|
||||
override fun updateUserProperties(userProperties: UserProperties) = Unit
|
||||
override fun trackError(throwable: Throwable) = Unit
|
||||
override fun updateSuperProperties(updatedProperties: SuperProperties) = Unit
|
||||
override fun startTransaction(name: String, operation: String?): AnalyticsTransaction = NoopAnalyticsTransaction
|
||||
override fun startLongRunningTransaction(
|
||||
longRunningTransaction: AnalyticsLongRunningTransaction,
|
||||
parentTransaction: AnalyticsTransaction?,
|
||||
): AnalyticsTransaction = NoopAnalyticsTransaction
|
||||
override fun getLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? = null
|
||||
override fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) = NoopAnalyticsTransaction
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
* Copyright 2024, 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import dev.zacsweers.metro.AppScope
|
||||
import dev.zacsweers.metro.ContributesBinding
|
||||
import im.vector.app.features.analytics.plan.MobileScreen
|
||||
import io.element.android.services.analytics.api.ScreenTracker
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
class NoopScreenTracker : ScreenTracker {
|
||||
@Composable
|
||||
override fun TrackScreen(screen: MobileScreen.ScreenName) = Unit
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop.watchers
|
||||
|
||||
import dev.zacsweers.metro.AppScope
|
||||
import dev.zacsweers.metro.ContributesBinding
|
||||
import io.element.android.services.analytics.api.watchers.AnalyticsColdStartWatcher
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
class NoopAnalyticsColdStartWatcher : AnalyticsColdStartWatcher {
|
||||
override fun start() {}
|
||||
override fun whenLoggingIn() {}
|
||||
override fun onRoomListVisible() {}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop.watchers
|
||||
|
||||
import dev.zacsweers.metro.ContributesBinding
|
||||
import io.element.android.libraries.di.SessionScope
|
||||
import io.element.android.services.analytics.api.watchers.AnalyticsRoomListStateWatcher
|
||||
|
||||
@ContributesBinding(SessionScope::class)
|
||||
class NoopAnalyticsRoomListStateWatcher : AnalyticsRoomListStateWatcher {
|
||||
override fun start() {}
|
||||
override fun stop() {}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
* Copyright 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop
|
||||
|
||||
import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import im.vector.app.features.analytics.plan.CallStarted
|
||||
import im.vector.app.features.analytics.plan.MobileScreen
|
||||
import im.vector.app.features.analytics.plan.SuperProperties
|
||||
import im.vector.app.features.analytics.plan.UserProperties
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
|
||||
class NoopAnalyticsServiceTest {
|
||||
@Test
|
||||
fun `getAvailableAnalyticsProviders returns emptySet`() {
|
||||
val sut = NoopAnalyticsService()
|
||||
assertThat(sut.getAvailableAnalyticsProviders()).isEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `didAskUserConsentFlow emits only true`() = runTest {
|
||||
val sut = NoopAnalyticsService()
|
||||
sut.didAskUserConsentFlow.test {
|
||||
assertThat(awaitItem()).isTrue()
|
||||
awaitComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `analyticsIdFlow emits only empty string`() = runTest {
|
||||
val sut = NoopAnalyticsService()
|
||||
sut.analyticsIdFlow.test {
|
||||
assertThat(awaitItem()).isEmpty()
|
||||
sut.setAnalyticsId("anId")
|
||||
awaitComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `userConsentFlow emits only false`() = runTest {
|
||||
val sut = NoopAnalyticsService()
|
||||
sut.userConsentFlow.test {
|
||||
assertThat(awaitItem()).isFalse()
|
||||
awaitComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `test no op methods`() = runTest {
|
||||
val sut = NoopAnalyticsService()
|
||||
sut.setUserConsent(false)
|
||||
sut.setUserConsent(true)
|
||||
sut.setDidAskUserConsent()
|
||||
sut.setAnalyticsId("anId")
|
||||
sut.capture(CallStarted(true, 1, true))
|
||||
sut.screen(MobileScreen(screenName = MobileScreen.ScreenName.RoomMembers))
|
||||
sut.updateUserProperties(UserProperties())
|
||||
sut.trackError(Exception("an_error"))
|
||||
sut.updateSuperProperties(SuperProperties())
|
||||
}
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Element Creations Ltd.
|
||||
* Copyright 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.services.analytics.noop
|
||||
|
||||
import app.cash.molecule.RecompositionMode
|
||||
import app.cash.molecule.moleculeFlow
|
||||
import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import im.vector.app.features.analytics.plan.MobileScreen
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
|
||||
class NoopScreenTrackerTest {
|
||||
@Test
|
||||
fun `TrackScreen is no op`() = runTest {
|
||||
val sut = NoopScreenTracker()
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
sut.TrackScreen(MobileScreen.ScreenName.RoomMembers)
|
||||
}.test {
|
||||
assertThat(awaitItem()).isEqualTo(Unit)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user