From 5ed6d8c6298df1b9adaeae111eef4ac09ec9c14a Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 10 Sep 2024 16:19:39 +0200 Subject: [PATCH] Add Glean SDK --- app-k9mail/build.gradle.kts | 2 +- .../main/kotlin/app/k9mail/K9KoinModule.kt | 5 +-- .../k9mail/telemetry/K9TelemetryManager.kt | 7 ---- app-thunderbird/build.gradle.kts | 6 ++- .../dependencies/releaseRuntimeClasspath.txt | 16 ++++++++ .../net/thunderbird/android/ThunderbirdApp.kt | 20 +++++++++ .../android/ThunderbirdKoinModule.kt | 5 +-- .../android/DependencyInjectionTest.kt | 2 + .../kotlin/net/thunderbird/android/TestApp.kt | 9 ++++ feature/telemetry/api/build.gradle.kts | 1 + .../feature/telemetry/api/TelemetryManager.kt | 10 +++++ feature/telemetry/glean/build.gradle.kts | 4 ++ .../feature/telemetry/TelemetryModule.kt | 15 +++++++ .../telemetry/glean/GleanTelemetryManager.kt | 41 ++++++++++++++++++- feature/telemetry/noop/build.gradle.kts | 8 ++++ .../feature/telemetry/TelemetryModule.kt | 10 +++++ .../telemetry/noop/NoOpTelemetryManager.kt | 11 +++++ gradle/libs.versions.toml | 3 ++ legacy/core/build.gradle.kts | 1 + .../core/src/test/java/com/fsck/k9/TestApp.kt | 9 +--- legacy/storage/build.gradle.kts | 2 +- .../test/java/com/fsck/k9/storage/TestApp.kt | 9 +--- legacy/ui/legacy/build.gradle.kts | 1 + .../com/fsck/k9/ui/settings/KoinModule.kt | 9 +++- .../general/GeneralSettingsDataStore.kt | 9 +++- .../src/test/java/com/fsck/k9/TestApp.kt | 9 +--- settings.gradle.kts | 2 + 27 files changed, 186 insertions(+), 40 deletions(-) delete mode 100644 app-k9mail/src/main/kotlin/app/k9mail/telemetry/K9TelemetryManager.kt create mode 100644 app-thunderbird/src/test/kotlin/net/thunderbird/android/TestApp.kt create mode 100644 feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt create mode 100644 feature/telemetry/noop/build.gradle.kts create mode 100644 feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt create mode 100644 feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/noop/NoOpTelemetryManager.kt diff --git a/app-k9mail/build.gradle.kts b/app-k9mail/build.gradle.kts index ca0a7c406b..1b8865b151 100644 --- a/app-k9mail/build.gradle.kts +++ b/app-k9mail/build.gradle.kts @@ -23,7 +23,7 @@ dependencies { implementation(projects.feature.widget.messageList) implementation(projects.feature.widget.shortcut) implementation(projects.feature.widget.unread) - implementation(projects.feature.telemetry.api) + implementation(projects.feature.telemetry.noop) implementation(libs.androidx.work.runtime) diff --git a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt index 96de236791..8e2714ecde 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt @@ -7,12 +7,11 @@ import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.ui.theme.api.FeatureThemeProvider import app.k9mail.core.ui.theme.api.ThemeProvider import app.k9mail.dev.developmentModuleAdditions -import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.telemetryModule import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity import app.k9mail.featureflag.K9FeatureFlagFactory import app.k9mail.provider.K9AppNameProvider import app.k9mail.provider.K9FeatureThemeProvider -import app.k9mail.telemetry.K9TelemetryManager import app.k9mail.widget.appWidgetModule import com.fsck.k9.AppConfig import com.fsck.k9.BuildConfig @@ -26,6 +25,7 @@ import org.koin.dsl.module val appModule = module { includes(appWidgetModule) + includes(telemetryModule) single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME } single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME } @@ -35,7 +35,6 @@ val appModule = module { single { K9ThemeProvider() } single { K9FeatureThemeProvider() } single { K9FeatureFlagFactory() } - single { K9TelemetryManager() } developmentModuleAdditions() } diff --git a/app-k9mail/src/main/kotlin/app/k9mail/telemetry/K9TelemetryManager.kt b/app-k9mail/src/main/kotlin/app/k9mail/telemetry/K9TelemetryManager.kt deleted file mode 100644 index c5e2dd44c0..0000000000 --- a/app-k9mail/src/main/kotlin/app/k9mail/telemetry/K9TelemetryManager.kt +++ /dev/null @@ -1,7 +0,0 @@ -package app.k9mail.telemetry - -import app.k9mail.feature.telemetry.api.TelemetryManager - -class K9TelemetryManager : TelemetryManager { - override fun isTelemetryFeatureIncluded(): Boolean = false -} diff --git a/app-thunderbird/build.gradle.kts b/app-thunderbird/build.gradle.kts index 23f61885ec..47504f38b3 100644 --- a/app-thunderbird/build.gradle.kts +++ b/app-thunderbird/build.gradle.kts @@ -183,7 +183,11 @@ dependencies { implementation(projects.feature.widget.messageList) implementation(projects.feature.widget.shortcut) implementation(projects.feature.widget.unread) - implementation(projects.feature.telemetry.glean) + + debugImplementation(projects.feature.telemetry.noop) + releaseImplementation(projects.feature.telemetry.glean) + "betaImplementation"(projects.feature.telemetry.glean) + "dailyImplementation"(projects.feature.telemetry.glean) implementation(libs.androidx.work.runtime) diff --git a/app-thunderbird/dependencies/releaseRuntimeClasspath.txt b/app-thunderbird/dependencies/releaseRuntimeClasspath.txt index a96a917a6a..7e07dcf289 100644 --- a/app-thunderbird/dependencies/releaseRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/releaseRuntimeClasspath.txt @@ -60,6 +60,7 @@ androidx.core:core:1.13.1 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.databinding:viewbinding:8.4.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 @@ -125,6 +126,7 @@ androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 androidx.window:window:1.0.0 +androidx.work:work-runtime-ktx:2.9.1 androidx.work:work-runtime:2.9.1 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -151,6 +153,7 @@ com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 com.mikepenz:materialdrawer:9.0.2 com.squareup.moshi:moshi:1.15.1 +com.squareup.okhttp3:okhttp-urlconnection:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.9.0 com.squareup.okio:okio:3.9.0 @@ -171,6 +174,7 @@ io.insert-koin:koin-compose-jvm:1.1.5 io.insert-koin:koin-compose:1.1.5 io.insert-koin:koin-core-jvm:3.5.6 io.insert-koin:koin-core:3.5.6 +net.java.dev.jna:jna:5.14.0 net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 @@ -199,6 +203,8 @@ org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3 org.jetbrains:annotations:24.1.0 org.jsoup:jsoup:1.17.2 org.minidns:minidns-client:1.0.5 @@ -206,4 +212,14 @@ org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 org.minidns:minidns-hla:1.0.5 org.minidns:minidns-iterative-resolver:1.0.5 +org.mozilla.components:concept-base:130.0 +org.mozilla.components:concept-fetch:130.0 +org.mozilla.components:lib-fetch-okhttp:130.0 +org.mozilla.components:lib-publicsuffixlist:130.0 +org.mozilla.components:service-glean:130.0 +org.mozilla.components:support-base:130.0 +org.mozilla.components:support-ktx:130.0 +org.mozilla.components:support-utils:130.0 +org.mozilla.telemetry:glean-native:60.4.0 +org.mozilla.telemetry:glean:60.4.0 org.slf4j:slf4j-api:1.7.36 diff --git a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdApp.kt b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdApp.kt index 98999b632d..5ca3bf6d9f 100644 --- a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdApp.kt +++ b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdApp.kt @@ -1,8 +1,28 @@ package net.thunderbird.android +import app.k9mail.feature.telemetry.api.TelemetryManager import com.fsck.k9.CommonApp +import com.fsck.k9.K9 +import org.koin.android.ext.android.inject import org.koin.core.module.Module class ThunderbirdApp : CommonApp() { + private val telemetryManager: TelemetryManager by inject() + override fun provideAppModule(): Module = appModule + + override fun onCreate() { + super.onCreate() + + initializeTelemetry() + } + + private fun initializeTelemetry() { + telemetryManager.init( + uploadEnabled = K9.isTelemetryEnabled, + releaseChannel = BuildConfig.RELEASE_CHANNEL, + versionCode = BuildConfig.VERSION_CODE, + versionName = BuildConfig.VERSION_NAME, + ) + } } diff --git a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt index 61c3e3abd2..966977a7eb 100644 --- a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt +++ b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt @@ -5,8 +5,7 @@ import app.k9mail.core.common.provider.AppNameProvider import app.k9mail.core.featureflag.FeatureFlagFactory import app.k9mail.core.ui.theme.api.FeatureThemeProvider import app.k9mail.core.ui.theme.api.ThemeProvider -import app.k9mail.feature.telemetry.api.TelemetryManager -import app.k9mail.feature.telemetry.glean.GleanTelemetryManager +import app.k9mail.feature.telemetry.telemetryModule import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity import com.fsck.k9.AppConfig import com.fsck.k9.activity.MessageCompose @@ -25,6 +24,7 @@ import org.koin.dsl.module val appModule = module { includes(appWidgetModule) + includes(telemetryModule) single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME } single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME } @@ -34,7 +34,6 @@ val appModule = module { single { TbThemeProvider() } single { TbFeatureThemeProvider() } single { TbFeatureFlagFactory() } - single { GleanTelemetryManager() } developmentModuleAdditions() } diff --git a/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt b/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt index 4d3445fb9b..fce62bdfbb 100644 --- a/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt +++ b/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt @@ -28,8 +28,10 @@ import org.mockito.kotlin.mock import org.openintents.openpgp.OpenPgpApiManager import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) +@Config(application = TestApp::class) class DependencyInjectionTest : AutoCloseKoinTest() { private val lifecycleOwner = mock { on { lifecycle } doReturn mock() diff --git a/app-thunderbird/src/test/kotlin/net/thunderbird/android/TestApp.kt b/app-thunderbird/src/test/kotlin/net/thunderbird/android/TestApp.kt new file mode 100644 index 0000000000..fdc53c8874 --- /dev/null +++ b/app-thunderbird/src/test/kotlin/net/thunderbird/android/TestApp.kt @@ -0,0 +1,9 @@ +package net.thunderbird.android + +import com.fsck.k9.CommonApp +import org.koin.core.module.Module + +// Custom Application class so Glean isn't initialized in tests. +class TestApp : CommonApp() { + override fun provideAppModule(): Module = appModule +} diff --git a/feature/telemetry/api/build.gradle.kts b/feature/telemetry/api/build.gradle.kts index 063b640132..53abed51d1 100644 --- a/feature/telemetry/api/build.gradle.kts +++ b/feature/telemetry/api/build.gradle.kts @@ -1,3 +1,4 @@ plugins { id(ThunderbirdPlugins.Library.jvm) + alias(libs.plugins.android.lint) } diff --git a/feature/telemetry/api/src/main/kotlin/app/k9mail/feature/telemetry/api/TelemetryManager.kt b/feature/telemetry/api/src/main/kotlin/app/k9mail/feature/telemetry/api/TelemetryManager.kt index 5ff30714a6..581fe2c20f 100644 --- a/feature/telemetry/api/src/main/kotlin/app/k9mail/feature/telemetry/api/TelemetryManager.kt +++ b/feature/telemetry/api/src/main/kotlin/app/k9mail/feature/telemetry/api/TelemetryManager.kt @@ -5,4 +5,14 @@ interface TelemetryManager { * Returns `true` if the app has a telemetry feature included. */ fun isTelemetryFeatureIncluded(): Boolean + + /** + * Enable or disable telemetry. + */ + fun setEnabled(enable: Boolean) + + /** + * Initialize the telemetry library. + */ + fun init(uploadEnabled: Boolean, releaseChannel: String?, versionCode: Int, versionName: String) } diff --git a/feature/telemetry/glean/build.gradle.kts b/feature/telemetry/glean/build.gradle.kts index 6979d51245..fe8a84c052 100644 --- a/feature/telemetry/glean/build.gradle.kts +++ b/feature/telemetry/glean/build.gradle.kts @@ -9,4 +9,8 @@ android { dependencies { api(projects.feature.telemetry.api) + api(libs.okhttp) + + implementation(libs.mozilla.components.glean) + implementation(libs.mozilla.components.fetch.okhttp) } diff --git a/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt b/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt new file mode 100644 index 0000000000..f5de973a49 --- /dev/null +++ b/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt @@ -0,0 +1,15 @@ +package app.k9mail.feature.telemetry + +import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.glean.GleanTelemetryManager +import org.koin.core.module.Module +import org.koin.dsl.module + +val telemetryModule: Module = module { + single { + GleanTelemetryManager( + context = get(), + okHttpClient = lazy { get() }, + ) + } +} diff --git a/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/glean/GleanTelemetryManager.kt b/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/glean/GleanTelemetryManager.kt index 1405bc0029..6fdb642a36 100644 --- a/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/glean/GleanTelemetryManager.kt +++ b/feature/telemetry/glean/src/main/kotlin/app/k9mail/feature/telemetry/glean/GleanTelemetryManager.kt @@ -1,7 +1,46 @@ package app.k9mail.feature.telemetry.glean +import android.content.Context import app.k9mail.feature.telemetry.api.TelemetryManager +import java.util.Calendar +import mozilla.components.lib.fetch.okhttp.OkHttpClient +import mozilla.components.service.glean.net.ConceptFetchHttpUploader +import mozilla.telemetry.glean.BuildInfo +import mozilla.telemetry.glean.Glean +import mozilla.telemetry.glean.config.Configuration -class GleanTelemetryManager : TelemetryManager { +class GleanTelemetryManager( + private val context: Context, + private val okHttpClient: Lazy, +) : TelemetryManager { override fun isTelemetryFeatureIncluded(): Boolean = true + + override fun setEnabled(enable: Boolean) { + Glean.setUploadEnabled(enable) + } + + override fun init(uploadEnabled: Boolean, releaseChannel: String?, versionCode: Int, versionName: String) { + val httpClient = lazy { OkHttpClient(okHttpClient.value, context) } + + val configuration = Configuration( + httpClient = ConceptFetchHttpUploader(httpClient), + channel = releaseChannel, + ) + + // We don't care for the build date (and including it would make reproducible builds harder). + val buildDate = Calendar.getInstance().apply { clear() } + + val buildInfo = BuildInfo( + versionCode = versionCode.toString(), + versionName = versionName, + buildDate = buildDate, + ) + + Glean.initialize( + context, + uploadEnabled, + configuration, + buildInfo, + ) + } } diff --git a/feature/telemetry/noop/build.gradle.kts b/feature/telemetry/noop/build.gradle.kts new file mode 100644 index 0000000000..258fc6ae6b --- /dev/null +++ b/feature/telemetry/noop/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id(ThunderbirdPlugins.Library.jvm) + alias(libs.plugins.android.lint) +} + +dependencies { + api(projects.feature.telemetry.api) +} diff --git a/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt b/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt new file mode 100644 index 0000000000..b10c7dc00d --- /dev/null +++ b/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/TelemetryModule.kt @@ -0,0 +1,10 @@ +package app.k9mail.feature.telemetry + +import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.noop.NoOpTelemetryManager +import org.koin.core.module.Module +import org.koin.dsl.module + +val telemetryModule: Module = module { + single { NoOpTelemetryManager() } +} diff --git a/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/noop/NoOpTelemetryManager.kt b/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/noop/NoOpTelemetryManager.kt new file mode 100644 index 0000000000..168ed4187d --- /dev/null +++ b/feature/telemetry/noop/src/main/kotlin/app/k9mail/feature/telemetry/noop/NoOpTelemetryManager.kt @@ -0,0 +1,11 @@ +package app.k9mail.feature.telemetry.noop + +import app.k9mail.feature.telemetry.api.TelemetryManager + +class NoOpTelemetryManager : TelemetryManager { + override fun isTelemetryFeatureIncluded(): Boolean = false + + override fun setEnabled(enable: Boolean) = Unit + + override fun init(uploadEnabled: Boolean, releaseChannel: String?, versionCode: Int, versionName: String) = Unit +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c511d1823f..9d16fbca5f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -83,6 +83,7 @@ minidns = "1.0.5" mockito = "5.13.0" mockitoKotlin = "5.4.0" moshi = "1.15.1" +mozillaAndroidComponents = "130.0" okhttp = "4.12.0" okio = "3.9.0" preferencesFix = "1.1.0" @@ -215,6 +216,8 @@ mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" } moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" } +mozilla-components-glean = { module = "org.mozilla.components:service-glean", version.ref = "mozillaAndroidComponents" } +mozilla-components-fetch-okhttp = { module = "org.mozilla.components:lib-fetch-okhttp", version.ref = "mozillaAndroidComponents" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" } okio = { module = "com.squareup.okio:okio", version.ref = "okio" } diff --git a/legacy/core/build.gradle.kts b/legacy/core/build.gradle.kts index ab6bb7008f..562a0bc078 100644 --- a/legacy/core/build.gradle.kts +++ b/legacy/core/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { testApi(projects.core.testing) testApi(projects.core.android.testing) + testImplementation(projects.feature.telemetry.noop) testImplementation(projects.mail.testing) testImplementation(projects.backend.imap) testImplementation(projects.mail.protocols.smtp) diff --git a/legacy/core/src/test/java/com/fsck/k9/TestApp.kt b/legacy/core/src/test/java/com/fsck/k9/TestApp.kt index dd0a645798..04e2d2e703 100644 --- a/legacy/core/src/test/java/com/fsck/k9/TestApp.kt +++ b/legacy/core/src/test/java/com/fsck/k9/TestApp.kt @@ -2,7 +2,7 @@ package com.fsck.k9 import android.app.Application import androidx.work.WorkManager -import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.telemetryModule import app.k9mail.legacy.di.DI import com.fsck.k9.backend.BackendManager import com.fsck.k9.controller.ControllerExtension @@ -24,7 +24,7 @@ class TestApp : Application() { super.onCreate() DI.start( application = this, - modules = coreModules + storageModule + testModule, + modules = coreModules + storageModule + telemetryModule + testModule, allowOverride = true, ) @@ -44,9 +44,4 @@ val testModule = module { single { mock() } single(named("controllerExtensions")) { emptyList() } single { mock() } - single { - object : TelemetryManager { - override fun isTelemetryFeatureIncluded(): Boolean = true - } - } } diff --git a/legacy/storage/build.gradle.kts b/legacy/storage/build.gradle.kts index 911a183e11..b42e0f6f43 100644 --- a/legacy/storage/build.gradle.kts +++ b/legacy/storage/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { testImplementation(projects.mail.testing) testImplementation(projects.legacy.testing) - testImplementation(projects.feature.telemetry.api) + testImplementation(projects.feature.telemetry.noop) testImplementation(libs.robolectric) testImplementation(libs.commons.io) } diff --git a/legacy/storage/src/test/java/com/fsck/k9/storage/TestApp.kt b/legacy/storage/src/test/java/com/fsck/k9/storage/TestApp.kt index 9d3bf421a1..b9e47b895e 100644 --- a/legacy/storage/src/test/java/com/fsck/k9/storage/TestApp.kt +++ b/legacy/storage/src/test/java/com/fsck/k9/storage/TestApp.kt @@ -1,7 +1,7 @@ package com.fsck.k9.storage import android.app.Application -import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.telemetryModule import app.k9mail.legacy.di.DI import com.fsck.k9.AppConfig import com.fsck.k9.Core @@ -20,7 +20,7 @@ class TestApp : Application() { Core.earlyInit() super.onCreate() - DI.start(this, coreModules + storageModule + testModule) + DI.start(this, coreModules + storageModule + telemetryModule + testModule) K9.init(this) Core.init(this) @@ -33,9 +33,4 @@ val testModule = module { single { mock() } single { K9StoragePersister(get()) } single { mock() } - single { - object : TelemetryManager { - override fun isTelemetryFeatureIncluded(): Boolean = true - } - } } diff --git a/legacy/ui/legacy/build.gradle.kts b/legacy/ui/legacy/build.gradle.kts index 866e3b6e85..3b1a867bf6 100644 --- a/legacy/ui/legacy/build.gradle.kts +++ b/legacy/ui/legacy/build.gradle.kts @@ -67,6 +67,7 @@ dependencies { testImplementation(projects.mail.testing) testImplementation(projects.legacy.storage) testImplementation(projects.legacy.testing) + testImplementation(projects.feature.telemetry.noop) testImplementation(libs.robolectric) testImplementation(libs.androidx.test.core) testImplementation(libs.kotlin.test) diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt index b2e75e25a6..e294aa618a 100644 --- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt +++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/KoinModule.kt @@ -16,7 +16,14 @@ val settingsUiModule = module { viewModel { SettingsViewModel(accountManager = get()) } viewModel { GeneralSettingsViewModel(logFileWriter = get()) } - factory { GeneralSettingsDataStore(jobManager = get(), appLanguageManager = get(), generalSettingsManager = get()) } + factory { + GeneralSettingsDataStore( + jobManager = get(), + appLanguageManager = get(), + generalSettingsManager = get(), + telemetryManager = get(), + ) + } single(named("SaveSettingsExecutorService")) { Executors.newSingleThreadExecutor(NamedThreadFactory("SaveSettings")) } diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt index 1f6ac67eb7..c07ae4725a 100644 --- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt +++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt @@ -1,6 +1,7 @@ package com.fsck.k9.ui.settings.general import androidx.preference.PreferenceDataStore +import app.k9mail.feature.telemetry.api.TelemetryManager import app.k9mail.legacy.preferences.AppTheme import app.k9mail.legacy.preferences.GeneralSettingsManager import app.k9mail.legacy.preferences.SubTheme @@ -16,6 +17,7 @@ class GeneralSettingsDataStore( private val jobManager: K9JobManager, private val appLanguageManager: AppLanguageManager, private val generalSettingsManager: GeneralSettingsManager, + private val telemetryManager: TelemetryManager, ) : PreferenceDataStore() { private var skipSaveSettings = false @@ -75,7 +77,7 @@ class GeneralSettingsDataStore( "debug_logging" -> K9.isDebugLoggingEnabled = value "sensitive_logging" -> K9.isSensitiveDebugLoggingEnabled = value "volume_navigation" -> K9.isUseVolumeKeysForNavigation = value - "enable_telemetry" -> K9.isTelemetryEnabled = value + "enable_telemetry" -> setTelemetryEnabled(value) else -> return } @@ -307,4 +309,9 @@ class GeneralSettingsDataStore( "move" -> SwipeAction.Move else -> throw AssertionError() } + + private fun setTelemetryEnabled(enable: Boolean) { + K9.isTelemetryEnabled = enable + telemetryManager.setEnabled(enable) + } } diff --git a/legacy/ui/legacy/src/test/java/com/fsck/k9/TestApp.kt b/legacy/ui/legacy/src/test/java/com/fsck/k9/TestApp.kt index 884804a96b..63e8058935 100644 --- a/legacy/ui/legacy/src/test/java/com/fsck/k9/TestApp.kt +++ b/legacy/ui/legacy/src/test/java/com/fsck/k9/TestApp.kt @@ -1,7 +1,7 @@ package com.fsck.k9 import android.app.Application -import app.k9mail.feature.telemetry.api.TelemetryManager +import app.k9mail.feature.telemetry.telemetryModule import app.k9mail.legacy.di.DI import com.fsck.k9.preferences.InMemoryStoragePersister import com.fsck.k9.preferences.StoragePersister @@ -14,7 +14,7 @@ class TestApp : Application() { super.onCreate() DI.start( application = this, - modules = coreModules + commonAppModules + uiModules + testModule, + modules = coreModules + commonAppModules + uiModules + telemetryModule + testModule, allowOverride = true, ) @@ -27,9 +27,4 @@ val testModule = module { single { AppConfig(emptyList()) } single { TestCoreResourceProvider() } single { InMemoryStoragePersister() } - single { - object : TelemetryManager { - override fun isTelemetryFeatureIncluded(): Boolean = true - } - } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 8663d84409..7767c4fb4c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven(url = "https://maven.mozilla.org/maven2") maven(url = "https://jitpack.io") } } @@ -77,6 +78,7 @@ include( include( ":feature:telemetry:api", + ":feature:telemetry:noop", ":feature:telemetry:glean", )