mirror of
https://github.com/thunderbird/thunderbird-android.git
synced 2024-09-19 19:52:14 +02:00
Merge pull request #8134 from thunderbird/integrate_glean_sdk
Integrate Glean SDK
This commit is contained in:
commit
89381dbedb
@ -23,7 +23,7 @@ dependencies {
|
|||||||
implementation(projects.feature.widget.messageList)
|
implementation(projects.feature.widget.messageList)
|
||||||
implementation(projects.feature.widget.shortcut)
|
implementation(projects.feature.widget.shortcut)
|
||||||
implementation(projects.feature.widget.unread)
|
implementation(projects.feature.widget.unread)
|
||||||
implementation(projects.feature.telemetry.api)
|
implementation(projects.feature.telemetry.noop)
|
||||||
|
|
||||||
implementation(libs.androidx.work.runtime)
|
implementation(libs.androidx.work.runtime)
|
||||||
|
|
||||||
|
@ -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.FeatureThemeProvider
|
||||||
import app.k9mail.core.ui.theme.api.ThemeProvider
|
import app.k9mail.core.ui.theme.api.ThemeProvider
|
||||||
import app.k9mail.dev.developmentModuleAdditions
|
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.feature.widget.shortcut.LauncherShortcutActivity
|
||||||
import app.k9mail.featureflag.K9FeatureFlagFactory
|
import app.k9mail.featureflag.K9FeatureFlagFactory
|
||||||
import app.k9mail.provider.K9AppNameProvider
|
import app.k9mail.provider.K9AppNameProvider
|
||||||
import app.k9mail.provider.K9FeatureThemeProvider
|
import app.k9mail.provider.K9FeatureThemeProvider
|
||||||
import app.k9mail.telemetry.K9TelemetryManager
|
|
||||||
import app.k9mail.widget.appWidgetModule
|
import app.k9mail.widget.appWidgetModule
|
||||||
import com.fsck.k9.AppConfig
|
import com.fsck.k9.AppConfig
|
||||||
import com.fsck.k9.BuildConfig
|
import com.fsck.k9.BuildConfig
|
||||||
@ -26,6 +25,7 @@ import org.koin.dsl.module
|
|||||||
|
|
||||||
val appModule = module {
|
val appModule = module {
|
||||||
includes(appWidgetModule)
|
includes(appWidgetModule)
|
||||||
|
includes(telemetryModule)
|
||||||
|
|
||||||
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
|
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
|
||||||
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
|
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
|
||||||
@ -35,7 +35,6 @@ val appModule = module {
|
|||||||
single<ThemeProvider> { K9ThemeProvider() }
|
single<ThemeProvider> { K9ThemeProvider() }
|
||||||
single<FeatureThemeProvider> { K9FeatureThemeProvider() }
|
single<FeatureThemeProvider> { K9FeatureThemeProvider() }
|
||||||
single<FeatureFlagFactory> { K9FeatureFlagFactory() }
|
single<FeatureFlagFactory> { K9FeatureFlagFactory() }
|
||||||
single<TelemetryManager> { K9TelemetryManager() }
|
|
||||||
|
|
||||||
developmentModuleAdditions()
|
developmentModuleAdditions()
|
||||||
}
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package app.k9mail.telemetry
|
|
||||||
|
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
|
||||||
|
|
||||||
class K9TelemetryManager : TelemetryManager {
|
|
||||||
override fun isTelemetryFeatureIncluded(): Boolean = false
|
|
||||||
}
|
|
@ -9,35 +9,6 @@ if (testCoverageEnabled) {
|
|||||||
apply(plugin = "jacoco")
|
apply(plugin = "jacoco")
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation(projects.appCommon)
|
|
||||||
implementation(projects.core.ui.compose.theme2.thunderbird)
|
|
||||||
implementation(projects.core.ui.legacy.theme2.thunderbird)
|
|
||||||
implementation(projects.feature.launcher)
|
|
||||||
|
|
||||||
implementation(projects.legacy.core)
|
|
||||||
implementation(projects.legacy.ui.legacy)
|
|
||||||
|
|
||||||
implementation(projects.core.featureflags)
|
|
||||||
|
|
||||||
implementation(projects.feature.widget.messageList)
|
|
||||||
implementation(projects.feature.widget.shortcut)
|
|
||||||
implementation(projects.feature.widget.unread)
|
|
||||||
implementation(projects.feature.telemetry.glean)
|
|
||||||
|
|
||||||
implementation(libs.androidx.work.runtime)
|
|
||||||
|
|
||||||
implementation(projects.feature.autodiscovery.api)
|
|
||||||
debugImplementation(projects.backend.demo)
|
|
||||||
debugImplementation(projects.feature.autodiscovery.demo)
|
|
||||||
|
|
||||||
testImplementation(libs.robolectric)
|
|
||||||
|
|
||||||
// Required for DependencyInjectionTest to be able to resolve OpenPgpApiManager
|
|
||||||
testImplementation(projects.plugins.openpgpApiLib.openpgpApi)
|
|
||||||
testImplementation(projects.feature.account.setup)
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "net.thunderbird.android"
|
namespace = "net.thunderbird.android"
|
||||||
|
|
||||||
@ -198,6 +169,39 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(projects.appCommon)
|
||||||
|
implementation(projects.core.ui.compose.theme2.thunderbird)
|
||||||
|
implementation(projects.core.ui.legacy.theme2.thunderbird)
|
||||||
|
implementation(projects.feature.launcher)
|
||||||
|
|
||||||
|
implementation(projects.legacy.core)
|
||||||
|
implementation(projects.legacy.ui.legacy)
|
||||||
|
|
||||||
|
implementation(projects.core.featureflags)
|
||||||
|
|
||||||
|
implementation(projects.feature.widget.messageList)
|
||||||
|
implementation(projects.feature.widget.shortcut)
|
||||||
|
implementation(projects.feature.widget.unread)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
implementation(projects.feature.autodiscovery.api)
|
||||||
|
debugImplementation(projects.backend.demo)
|
||||||
|
debugImplementation(projects.feature.autodiscovery.demo)
|
||||||
|
|
||||||
|
testImplementation(libs.robolectric)
|
||||||
|
|
||||||
|
// Required for DependencyInjectionTest to be able to resolve OpenPgpApiManager
|
||||||
|
testImplementation(projects.plugins.openpgpApiLib.openpgpApi)
|
||||||
|
testImplementation(projects.feature.account.setup)
|
||||||
|
}
|
||||||
|
|
||||||
dependencyGuard {
|
dependencyGuard {
|
||||||
configuration("releaseRuntimeClasspath")
|
configuration("releaseRuntimeClasspath")
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ androidx.core:core:1.13.1
|
|||||||
androidx.cursoradapter:cursoradapter:1.0.0
|
androidx.cursoradapter:cursoradapter:1.0.0
|
||||||
androidx.customview:customview-poolingcontainer:1.0.0
|
androidx.customview:customview-poolingcontainer:1.0.0
|
||||||
androidx.customview:customview:1.1.0
|
androidx.customview:customview:1.1.0
|
||||||
|
androidx.databinding:viewbinding:8.4.0
|
||||||
androidx.documentfile:documentfile:1.0.0
|
androidx.documentfile:documentfile:1.0.0
|
||||||
androidx.drawerlayout:drawerlayout:1.1.1
|
androidx.drawerlayout:drawerlayout:1.1.1
|
||||||
androidx.dynamicanimation:dynamicanimation:1.0.0
|
androidx.dynamicanimation:dynamicanimation:1.0.0
|
||||||
@ -125,6 +126,7 @@ androidx.versionedparcelable:versionedparcelable:1.1.1
|
|||||||
androidx.viewpager2:viewpager2:1.1.0-beta02
|
androidx.viewpager2:viewpager2:1.1.0-beta02
|
||||||
androidx.viewpager:viewpager:1.0.0
|
androidx.viewpager:viewpager:1.0.0
|
||||||
androidx.window:window:1.0.0
|
androidx.window:window:1.0.0
|
||||||
|
androidx.work:work-runtime-ktx:2.9.1
|
||||||
androidx.work:work-runtime:2.9.1
|
androidx.work:work-runtime:2.9.1
|
||||||
co.touchlab:stately-concurrency-jvm:2.0.6
|
co.touchlab:stately-concurrency-jvm:2.0.6
|
||||||
co.touchlab:stately-concurrency: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:fastadapter:5.7.0
|
||||||
com.mikepenz:materialdrawer:9.0.2
|
com.mikepenz:materialdrawer:9.0.2
|
||||||
com.squareup.moshi:moshi:1.15.1
|
com.squareup.moshi:moshi:1.15.1
|
||||||
|
com.squareup.okhttp3:okhttp-urlconnection:4.12.0
|
||||||
com.squareup.okhttp3:okhttp:4.12.0
|
com.squareup.okhttp3:okhttp:4.12.0
|
||||||
com.squareup.okio:okio-jvm:3.9.0
|
com.squareup.okio:okio-jvm:3.9.0
|
||||||
com.squareup.okio:okio: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-compose:1.1.5
|
||||||
io.insert-koin:koin-core-jvm:3.5.6
|
io.insert-koin:koin-core-jvm:3.5.6
|
||||||
io.insert-koin:koin-core: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.jcip:jcip-annotations:1.0
|
||||||
net.openid:appauth:0.11.1
|
net.openid:appauth:0.11.1
|
||||||
org.apache.commons:commons-lang3:3.7
|
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-bom:1.6.3
|
||||||
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm: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-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.jetbrains:annotations:24.1.0
|
||||||
org.jsoup:jsoup:1.17.2
|
org.jsoup:jsoup:1.17.2
|
||||||
org.minidns:minidns-client:1.0.5
|
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-dnssec:1.0.5
|
||||||
org.minidns:minidns-hla:1.0.5
|
org.minidns:minidns-hla:1.0.5
|
||||||
org.minidns:minidns-iterative-resolver: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
|
org.slf4j:slf4j-api:1.7.36
|
||||||
|
@ -1,8 +1,28 @@
|
|||||||
package net.thunderbird.android
|
package net.thunderbird.android
|
||||||
|
|
||||||
|
import app.k9mail.feature.telemetry.api.TelemetryManager
|
||||||
import com.fsck.k9.CommonApp
|
import com.fsck.k9.CommonApp
|
||||||
|
import com.fsck.k9.K9
|
||||||
|
import org.koin.android.ext.android.inject
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
|
|
||||||
class ThunderbirdApp : CommonApp() {
|
class ThunderbirdApp : CommonApp() {
|
||||||
|
private val telemetryManager: TelemetryManager by inject()
|
||||||
|
|
||||||
override fun provideAppModule(): Module = appModule
|
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,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,7 @@ import app.k9mail.core.common.provider.AppNameProvider
|
|||||||
import app.k9mail.core.featureflag.FeatureFlagFactory
|
import app.k9mail.core.featureflag.FeatureFlagFactory
|
||||||
import app.k9mail.core.ui.theme.api.FeatureThemeProvider
|
import app.k9mail.core.ui.theme.api.FeatureThemeProvider
|
||||||
import app.k9mail.core.ui.theme.api.ThemeProvider
|
import app.k9mail.core.ui.theme.api.ThemeProvider
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
import app.k9mail.feature.telemetry.telemetryModule
|
||||||
import app.k9mail.feature.telemetry.glean.GleanTelemetryManager
|
|
||||||
import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity
|
import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity
|
||||||
import com.fsck.k9.AppConfig
|
import com.fsck.k9.AppConfig
|
||||||
import com.fsck.k9.activity.MessageCompose
|
import com.fsck.k9.activity.MessageCompose
|
||||||
@ -25,6 +24,7 @@ import org.koin.dsl.module
|
|||||||
|
|
||||||
val appModule = module {
|
val appModule = module {
|
||||||
includes(appWidgetModule)
|
includes(appWidgetModule)
|
||||||
|
includes(telemetryModule)
|
||||||
|
|
||||||
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
|
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
|
||||||
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
|
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
|
||||||
@ -34,7 +34,6 @@ val appModule = module {
|
|||||||
single<ThemeProvider> { TbThemeProvider() }
|
single<ThemeProvider> { TbThemeProvider() }
|
||||||
single<FeatureThemeProvider> { TbFeatureThemeProvider() }
|
single<FeatureThemeProvider> { TbFeatureThemeProvider() }
|
||||||
single<FeatureFlagFactory> { TbFeatureFlagFactory() }
|
single<FeatureFlagFactory> { TbFeatureFlagFactory() }
|
||||||
single<TelemetryManager> { GleanTelemetryManager() }
|
|
||||||
|
|
||||||
developmentModuleAdditions()
|
developmentModuleAdditions()
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,10 @@ import org.mockito.kotlin.mock
|
|||||||
import org.openintents.openpgp.OpenPgpApiManager
|
import org.openintents.openpgp.OpenPgpApiManager
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
import org.robolectric.RuntimeEnvironment
|
import org.robolectric.RuntimeEnvironment
|
||||||
|
import org.robolectric.annotation.Config
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
|
@Config(application = TestApp::class)
|
||||||
class DependencyInjectionTest : AutoCloseKoinTest() {
|
class DependencyInjectionTest : AutoCloseKoinTest() {
|
||||||
private val lifecycleOwner = mock<LifecycleOwner> {
|
private val lifecycleOwner = mock<LifecycleOwner> {
|
||||||
on { lifecycle } doReturn mock()
|
on { lifecycle } doReturn mock()
|
||||||
|
@ -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
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id(ThunderbirdPlugins.Library.jvm)
|
id(ThunderbirdPlugins.Library.jvm)
|
||||||
|
alias(libs.plugins.android.lint)
|
||||||
}
|
}
|
||||||
|
@ -5,4 +5,14 @@ interface TelemetryManager {
|
|||||||
* Returns `true` if the app has a telemetry feature included.
|
* Returns `true` if the app has a telemetry feature included.
|
||||||
*/
|
*/
|
||||||
fun isTelemetryFeatureIncluded(): Boolean
|
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)
|
||||||
}
|
}
|
||||||
|
@ -9,4 +9,8 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(projects.feature.telemetry.api)
|
api(projects.feature.telemetry.api)
|
||||||
|
api(libs.okhttp)
|
||||||
|
|
||||||
|
implementation(libs.mozilla.components.glean)
|
||||||
|
implementation(libs.mozilla.components.fetch.okhttp)
|
||||||
}
|
}
|
||||||
|
@ -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<TelemetryManager> {
|
||||||
|
GleanTelemetryManager(
|
||||||
|
context = get(),
|
||||||
|
okHttpClient = lazy { get() },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,46 @@
|
|||||||
package app.k9mail.feature.telemetry.glean
|
package app.k9mail.feature.telemetry.glean
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
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<okhttp3.OkHttpClient>,
|
||||||
|
) : TelemetryManager {
|
||||||
override fun isTelemetryFeatureIncluded(): Boolean = true
|
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,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
8
feature/telemetry/noop/build.gradle.kts
Normal file
8
feature/telemetry/noop/build.gradle.kts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
plugins {
|
||||||
|
id(ThunderbirdPlugins.Library.jvm)
|
||||||
|
alias(libs.plugins.android.lint)
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api(projects.feature.telemetry.api)
|
||||||
|
}
|
@ -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<TelemetryManager> { NoOpTelemetryManager() }
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
@ -83,6 +83,7 @@ minidns = "1.0.5"
|
|||||||
mockito = "5.13.0"
|
mockito = "5.13.0"
|
||||||
mockitoKotlin = "5.4.0"
|
mockitoKotlin = "5.4.0"
|
||||||
moshi = "1.15.1"
|
moshi = "1.15.1"
|
||||||
|
mozillaAndroidComponents = "130.0"
|
||||||
okhttp = "4.12.0"
|
okhttp = "4.12.0"
|
||||||
okio = "3.9.0"
|
okio = "3.9.0"
|
||||||
preferencesFix = "1.1.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" }
|
mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" }
|
||||||
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
|
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
|
||||||
moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", 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 = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
||||||
okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" }
|
okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" }
|
||||||
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
|
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
|
||||||
|
@ -38,6 +38,7 @@ dependencies {
|
|||||||
|
|
||||||
testApi(projects.core.testing)
|
testApi(projects.core.testing)
|
||||||
testApi(projects.core.android.testing)
|
testApi(projects.core.android.testing)
|
||||||
|
testImplementation(projects.feature.telemetry.noop)
|
||||||
testImplementation(projects.mail.testing)
|
testImplementation(projects.mail.testing)
|
||||||
testImplementation(projects.backend.imap)
|
testImplementation(projects.backend.imap)
|
||||||
testImplementation(projects.mail.protocols.smtp)
|
testImplementation(projects.mail.protocols.smtp)
|
||||||
|
@ -2,7 +2,7 @@ package com.fsck.k9
|
|||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
import app.k9mail.feature.telemetry.telemetryModule
|
||||||
import app.k9mail.legacy.di.DI
|
import app.k9mail.legacy.di.DI
|
||||||
import com.fsck.k9.backend.BackendManager
|
import com.fsck.k9.backend.BackendManager
|
||||||
import com.fsck.k9.controller.ControllerExtension
|
import com.fsck.k9.controller.ControllerExtension
|
||||||
@ -24,7 +24,7 @@ class TestApp : Application() {
|
|||||||
super.onCreate()
|
super.onCreate()
|
||||||
DI.start(
|
DI.start(
|
||||||
application = this,
|
application = this,
|
||||||
modules = coreModules + storageModule + testModule,
|
modules = coreModules + storageModule + telemetryModule + testModule,
|
||||||
allowOverride = true,
|
allowOverride = true,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -44,9 +44,4 @@ val testModule = module {
|
|||||||
single { mock<NotificationStrategy>() }
|
single { mock<NotificationStrategy>() }
|
||||||
single(named("controllerExtensions")) { emptyList<ControllerExtension>() }
|
single(named("controllerExtensions")) { emptyList<ControllerExtension>() }
|
||||||
single { mock<WorkManager>() }
|
single { mock<WorkManager>() }
|
||||||
single<TelemetryManager> {
|
|
||||||
object : TelemetryManager {
|
|
||||||
override fun isTelemetryFeatureIncluded(): Boolean = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ dependencies {
|
|||||||
|
|
||||||
testImplementation(projects.mail.testing)
|
testImplementation(projects.mail.testing)
|
||||||
testImplementation(projects.legacy.testing)
|
testImplementation(projects.legacy.testing)
|
||||||
testImplementation(projects.feature.telemetry.api)
|
testImplementation(projects.feature.telemetry.noop)
|
||||||
testImplementation(libs.robolectric)
|
testImplementation(libs.robolectric)
|
||||||
testImplementation(libs.commons.io)
|
testImplementation(libs.commons.io)
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.fsck.k9.storage
|
package com.fsck.k9.storage
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
import app.k9mail.feature.telemetry.telemetryModule
|
||||||
import app.k9mail.legacy.di.DI
|
import app.k9mail.legacy.di.DI
|
||||||
import com.fsck.k9.AppConfig
|
import com.fsck.k9.AppConfig
|
||||||
import com.fsck.k9.Core
|
import com.fsck.k9.Core
|
||||||
@ -20,7 +20,7 @@ class TestApp : Application() {
|
|||||||
Core.earlyInit()
|
Core.earlyInit()
|
||||||
|
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
DI.start(this, coreModules + storageModule + testModule)
|
DI.start(this, coreModules + storageModule + telemetryModule + testModule)
|
||||||
|
|
||||||
K9.init(this)
|
K9.init(this)
|
||||||
Core.init(this)
|
Core.init(this)
|
||||||
@ -33,9 +33,4 @@ val testModule = module {
|
|||||||
single { mock<EncryptionExtractor>() }
|
single { mock<EncryptionExtractor>() }
|
||||||
single<StoragePersister> { K9StoragePersister(get()) }
|
single<StoragePersister> { K9StoragePersister(get()) }
|
||||||
single { mock<BackendManager>() }
|
single { mock<BackendManager>() }
|
||||||
single<TelemetryManager> {
|
|
||||||
object : TelemetryManager {
|
|
||||||
override fun isTelemetryFeatureIncluded(): Boolean = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,7 @@ dependencies {
|
|||||||
testImplementation(projects.mail.testing)
|
testImplementation(projects.mail.testing)
|
||||||
testImplementation(projects.legacy.storage)
|
testImplementation(projects.legacy.storage)
|
||||||
testImplementation(projects.legacy.testing)
|
testImplementation(projects.legacy.testing)
|
||||||
|
testImplementation(projects.feature.telemetry.noop)
|
||||||
testImplementation(libs.robolectric)
|
testImplementation(libs.robolectric)
|
||||||
testImplementation(libs.androidx.test.core)
|
testImplementation(libs.androidx.test.core)
|
||||||
testImplementation(libs.kotlin.test)
|
testImplementation(libs.kotlin.test)
|
||||||
|
@ -16,7 +16,14 @@ val settingsUiModule = module {
|
|||||||
viewModel { SettingsViewModel(accountManager = get()) }
|
viewModel { SettingsViewModel(accountManager = get()) }
|
||||||
|
|
||||||
viewModel { GeneralSettingsViewModel(logFileWriter = 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")) {
|
single(named("SaveSettingsExecutorService")) {
|
||||||
Executors.newSingleThreadExecutor(NamedThreadFactory("SaveSettings"))
|
Executors.newSingleThreadExecutor(NamedThreadFactory("SaveSettings"))
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.fsck.k9.ui.settings.general
|
package com.fsck.k9.ui.settings.general
|
||||||
|
|
||||||
import androidx.preference.PreferenceDataStore
|
import androidx.preference.PreferenceDataStore
|
||||||
|
import app.k9mail.feature.telemetry.api.TelemetryManager
|
||||||
import app.k9mail.legacy.preferences.AppTheme
|
import app.k9mail.legacy.preferences.AppTheme
|
||||||
import app.k9mail.legacy.preferences.GeneralSettingsManager
|
import app.k9mail.legacy.preferences.GeneralSettingsManager
|
||||||
import app.k9mail.legacy.preferences.SubTheme
|
import app.k9mail.legacy.preferences.SubTheme
|
||||||
@ -16,6 +17,7 @@ class GeneralSettingsDataStore(
|
|||||||
private val jobManager: K9JobManager,
|
private val jobManager: K9JobManager,
|
||||||
private val appLanguageManager: AppLanguageManager,
|
private val appLanguageManager: AppLanguageManager,
|
||||||
private val generalSettingsManager: GeneralSettingsManager,
|
private val generalSettingsManager: GeneralSettingsManager,
|
||||||
|
private val telemetryManager: TelemetryManager,
|
||||||
) : PreferenceDataStore() {
|
) : PreferenceDataStore() {
|
||||||
|
|
||||||
private var skipSaveSettings = false
|
private var skipSaveSettings = false
|
||||||
@ -75,7 +77,7 @@ class GeneralSettingsDataStore(
|
|||||||
"debug_logging" -> K9.isDebugLoggingEnabled = value
|
"debug_logging" -> K9.isDebugLoggingEnabled = value
|
||||||
"sensitive_logging" -> K9.isSensitiveDebugLoggingEnabled = value
|
"sensitive_logging" -> K9.isSensitiveDebugLoggingEnabled = value
|
||||||
"volume_navigation" -> K9.isUseVolumeKeysForNavigation = value
|
"volume_navigation" -> K9.isUseVolumeKeysForNavigation = value
|
||||||
"enable_telemetry" -> K9.isTelemetryEnabled = value
|
"enable_telemetry" -> setTelemetryEnabled(value)
|
||||||
else -> return
|
else -> return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,4 +309,9 @@ class GeneralSettingsDataStore(
|
|||||||
"move" -> SwipeAction.Move
|
"move" -> SwipeAction.Move
|
||||||
else -> throw AssertionError()
|
else -> throw AssertionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setTelemetryEnabled(enable: Boolean) {
|
||||||
|
K9.isTelemetryEnabled = enable
|
||||||
|
telemetryManager.setEnabled(enable)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.fsck.k9
|
package com.fsck.k9
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import app.k9mail.feature.telemetry.api.TelemetryManager
|
import app.k9mail.feature.telemetry.telemetryModule
|
||||||
import app.k9mail.legacy.di.DI
|
import app.k9mail.legacy.di.DI
|
||||||
import com.fsck.k9.preferences.InMemoryStoragePersister
|
import com.fsck.k9.preferences.InMemoryStoragePersister
|
||||||
import com.fsck.k9.preferences.StoragePersister
|
import com.fsck.k9.preferences.StoragePersister
|
||||||
@ -14,7 +14,7 @@ class TestApp : Application() {
|
|||||||
super.onCreate()
|
super.onCreate()
|
||||||
DI.start(
|
DI.start(
|
||||||
application = this,
|
application = this,
|
||||||
modules = coreModules + commonAppModules + uiModules + testModule,
|
modules = coreModules + commonAppModules + uiModules + telemetryModule + testModule,
|
||||||
allowOverride = true,
|
allowOverride = true,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,9 +27,4 @@ val testModule = module {
|
|||||||
single { AppConfig(emptyList()) }
|
single { AppConfig(emptyList()) }
|
||||||
single<CoreResourceProvider> { TestCoreResourceProvider() }
|
single<CoreResourceProvider> { TestCoreResourceProvider() }
|
||||||
single<StoragePersister> { InMemoryStoragePersister() }
|
single<StoragePersister> { InMemoryStoragePersister() }
|
||||||
single<TelemetryManager> {
|
|
||||||
object : TelemetryManager {
|
|
||||||
override fun isTelemetryFeatureIncluded(): Boolean = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ dependencyResolutionManagement {
|
|||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven(url = "https://maven.mozilla.org/maven2")
|
||||||
maven(url = "https://jitpack.io")
|
maven(url = "https://jitpack.io")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,6 +78,7 @@ include(
|
|||||||
|
|
||||||
include(
|
include(
|
||||||
":feature:telemetry:api",
|
":feature:telemetry:api",
|
||||||
|
":feature:telemetry:noop",
|
||||||
":feature:telemetry:glean",
|
":feature:telemetry:glean",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user