From cb5dcf9b79ac2a8b23170f8030419e10d8ddf65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 13 Mar 2025 16:11:21 +0100 Subject: [PATCH] Use a feature flag to decide whether logs should be printed to logcat or not This is done so it can be temporarily enabled on release builds for quick debugging sessions, then disabled again. --- .../main/kotlin/io/element/android/x/di/AppBindings.kt | 3 +++ .../android/x/initializer/TracingInitializer.kt | 4 +++- .../android/libraries/featureflag/api/FeatureFlags.kt | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 3d1838ea33..4a7e12863e 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -16,6 +16,7 @@ import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.di.AppScope +import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.matrix.api.tracing.TracingService import io.element.android.libraries.preferences.api.store.AppPreferencesStore import io.element.android.services.analytics.api.AnalyticsService @@ -40,5 +41,7 @@ interface AppBindings { fun enterpriseService(): EnterpriseService + fun featureFlagService(): FeatureFlagService + fun buildMeta(): BuildMeta } diff --git a/app/src/main/kotlin/io/element/android/x/initializer/TracingInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/TracingInitializer.kt index 826f21f57c..ac225db2b0 100644 --- a/app/src/main/kotlin/io/element/android/x/initializer/TracingInitializer.kt +++ b/app/src/main/kotlin/io/element/android/x/initializer/TracingInitializer.kt @@ -12,6 +12,7 @@ import android.system.Os import androidx.startup.Initializer import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.tracing.TracingConfiguration import io.element.android.libraries.matrix.api.tracing.WriteToFilesConfiguration import io.element.android.x.di.AppBindings @@ -28,9 +29,10 @@ class TracingInitializer : Initializer { val bugReporter = appBindings.bugReporter() Timber.plant(tracingService.createTimberTree(ELEMENT_X_TARGET)) val preferencesStore = appBindings.preferencesStore() + val featureFlagService = appBindings.featureFlagService() val logLevel = runBlocking { preferencesStore.getTracingLogLevelFlow().first() } val tracingConfiguration = TracingConfiguration( - writesToLogcat = true, + writesToLogcat = runBlocking { featureFlagService.isFeatureEnabled(FeatureFlags.PrintLogsToLogcat) }, writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter), logLevel = logLevel, extraTargets = listOf(ELEMENT_X_TARGET), diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 9a683d49d9..f8e0d3405a 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -168,4 +168,14 @@ enum class FeatureFlags( defaultValue = { true }, isFinished = false, ), + PrintLogsToLogcat( + key = "feature.print_logs_to_logcat", + title = "Print logs to logcat", + description = "Print logs to logcat in addition to log files. Requires an app restart to take effect." + + "\n\nWARNING: this will make the logs visible in the device logs and may affect performance. " + + "It's not intended for daily usage in release builds.", + defaultValue = { buildMeta -> buildMeta.buildType != BuildType.RELEASE }, + // False so it's displayed in the developer options screen + isFinished = false, + ) }