From 54845866a63fdeedbb73e4556da4d0ffa1ce40a0 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 12 Jun 2024 12:20:43 +0200 Subject: [PATCH] Fix tracing configuration in debug and nightlies (#3019) * Fix tracing configuration in debug and nightlies: - Debug will now write the logs to disk too. - Nightly will be able to customise tracing filters. - Improved the configure tracing and bug report screens. * Update screenshots * Add changelog --------- Co-authored-by: ElementBot --- .../x/initializer/TracingInitializer.kt | 50 +++++++++++-------- changelog.d/3016.bugfix | 5 ++ .../developer/tracing/ConfigureTracingView.kt | 8 ++- .../tracing/TargetLogLevelMapBuilder.kt | 5 +- .../tracing/ConfigureTracingPresenterTest.kt | 9 ++-- .../rageshake/impl/bugreport/BugReportView.kt | 13 ++++- .../matrix/impl/di/TracingMatrixModule.kt | 39 +++++++++++++++ ...ingView-Day-5_6_null_0,NEXUS_5,1.0,en].png | 4 +- ...gView-Night-5_7_null_0,NEXUS_5,1.0,en].png | 4 +- 9 files changed, 101 insertions(+), 36 deletions(-) create mode 100644 changelog.d/3016.bugfix create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/TracingMatrixModule.kt 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 3c938e2a6d..7c94af4619 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 @@ -22,7 +22,9 @@ import androidx.preference.PreferenceManager import androidx.startup.Initializer import io.element.android.features.preferences.impl.developer.tracing.SharedPreferencesTracingConfigurationStore import io.element.android.features.preferences.impl.developer.tracing.TargetLogLevelMapBuilder +import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.libraries.architecture.bindings +import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.matrix.api.tracing.TracingConfiguration import io.element.android.libraries.matrix.api.tracing.TracingFilterConfigurations import io.element.android.libraries.matrix.api.tracing.WriteToFilesConfiguration @@ -36,31 +38,27 @@ class TracingInitializer : Initializer { val tracingService = appBindings.tracingService() val bugReporter = appBindings.bugReporter() Timber.plant(tracingService.createTimberTree()) - val tracingConfiguration = if (BuildConfig.DEBUG) { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - val store = SharedPreferencesTracingConfigurationStore(prefs) - val builder = TargetLogLevelMapBuilder(store) + val tracingConfiguration = if (BuildConfig.BUILD_TYPE == BuildType.RELEASE.name) { TracingConfiguration( - filterConfiguration = TracingFilterConfigurations.custom(builder.getCurrentMap()), - writesToLogcat = true, - writesToFilesConfiguration = WriteToFilesConfiguration.Disabled + filterConfiguration = TracingFilterConfigurations.release, + writesToLogcat = false, + writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter), ) } else { - val config = if (BuildConfig.BUILD_TYPE == "nightly") { - TracingFilterConfigurations.nightly - } else { - TracingFilterConfigurations.release - } + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val store = SharedPreferencesTracingConfigurationStore(prefs) + val builder = TargetLogLevelMapBuilder( + tracingConfigurationStore = store, + defaultConfig = if (BuildConfig.BUILD_TYPE == BuildType.NIGHTLY.name) { + TracingFilterConfigurations.nightly + } else { + TracingFilterConfigurations.debug + } + ) TracingConfiguration( - filterConfiguration = config, - writesToLogcat = false, - writesToFilesConfiguration = WriteToFilesConfiguration.Enabled( - directory = bugReporter.logDirectory().absolutePath, - filenamePrefix = "logs", - filenameSuffix = null, - // Keep a minimum of 1 week of log files. - numberOfFiles = 7 * 24, - ) + filterConfiguration = TracingFilterConfigurations.custom(builder.getCurrentMap()), + writesToLogcat = BuildConfig.DEBUG, + writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter), ) } bugReporter.setCurrentTracingFilter(tracingConfiguration.filterConfiguration.filter) @@ -69,5 +67,15 @@ class TracingInitializer : Initializer { Os.setenv("RUST_BACKTRACE", "1", true) } + private fun defaultWriteToDiskConfiguration(bugReporter: BugReporter): WriteToFilesConfiguration.Enabled { + return WriteToFilesConfiguration.Enabled( + directory = bugReporter.logDirectory().absolutePath, + filenamePrefix = "logs", + filenameSuffix = null, + // Keep a minimum of 1 week of log files. + numberOfFiles = 7 * 24, + ) + } + override fun dependencies(): List>> = mutableListOf() } diff --git a/changelog.d/3016.bugfix b/changelog.d/3016.bugfix new file mode 100644 index 0000000000..df7b7da7dd --- /dev/null +++ b/changelog.d/3016.bugfix @@ -0,0 +1,5 @@ +Fix tracing configuration in debug and nightlies: + +- Debug will now write the logs to disk too. +- Nightly will be able to customise tracing filters. +- Improved the configure tracing and bug report screens. diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingView.kt index c44b9e4ad5..f3d1d946c4 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingView.kt @@ -16,6 +16,7 @@ package io.element.android.features.preferences.impl.developer.tracing +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets @@ -48,6 +49,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.aliasScreenTitle import io.element.android.libraries.designsystem.theme.components.DropdownMenu import io.element.android.libraries.designsystem.theme.components.DropdownMenuItem +import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.ListItem @@ -124,15 +126,17 @@ fun ConfigureTracingView( .consumeWindowInsets(it) .verticalScroll(state = rememberScrollState()) ) { - CrateListContent(state) ListItem( headlineContent = { Text( - text = "Kill and restart the app for the change to take effect.", + modifier = Modifier.clickable { Runtime.getRuntime().exit(0) }, + text = "Tap here to kill the app and apply the changes. You'll have to re-open the app manually.", style = ElementTheme.typography.fontHeadingSmMedium, ) }, ) + HorizontalDivider() + CrateListContent(state) } } ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/TargetLogLevelMapBuilder.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/TargetLogLevelMapBuilder.kt index b851c15279..8451955c9c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/TargetLogLevelMapBuilder.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/tracing/TargetLogLevelMapBuilder.kt @@ -18,14 +18,13 @@ package io.element.android.features.preferences.impl.developer.tracing import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.Target -import io.element.android.libraries.matrix.api.tracing.TracingFilterConfigurations +import io.element.android.libraries.matrix.api.tracing.TracingFilterConfiguration import javax.inject.Inject class TargetLogLevelMapBuilder @Inject constructor( private val tracingConfigurationStore: TracingConfigurationStore, + private val defaultConfig: TracingFilterConfiguration, ) { - private val defaultConfig = TracingFilterConfigurations.debug - fun getDefaultMap(): Map { return Target.entries.associateWith { target -> defaultConfig.getLogLevel(target) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingPresenterTest.kt index 4dd0c01e56..14123a359b 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/tracing/ConfigureTracingPresenterTest.kt @@ -22,6 +22,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.tracing.LogLevel import io.element.android.libraries.matrix.api.tracing.Target +import io.element.android.libraries.matrix.api.tracing.TracingFilterConfigurations import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.waitForPredicate import kotlinx.coroutines.test.runTest @@ -37,7 +38,7 @@ class ConfigureTracingPresenterTest { val store = InMemoryTracingConfigurationStore() val presenter = ConfigureTracingPresenter( store, - TargetLogLevelMapBuilder(store), + TargetLogLevelMapBuilder(store, TracingFilterConfigurations.debug), ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -54,7 +55,7 @@ class ConfigureTracingPresenterTest { store.givenLogLevel(LogLevel.ERROR) val presenter = ConfigureTracingPresenter( store, - TargetLogLevelMapBuilder(store), + TargetLogLevelMapBuilder(store, TracingFilterConfigurations.debug), ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -70,7 +71,7 @@ class ConfigureTracingPresenterTest { val store = InMemoryTracingConfigurationStore() val presenter = ConfigureTracingPresenter( store, - TargetLogLevelMapBuilder(store), + TargetLogLevelMapBuilder(store, TracingFilterConfigurations.debug), ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -89,7 +90,7 @@ class ConfigureTracingPresenterTest { val store = InMemoryTracingConfigurationStore() val presenter = ConfigureTracingPresenter( store, - TargetLogLevelMapBuilder(store), + TargetLogLevelMapBuilder(store, TracingFilterConfigurations.debug), ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt index 599a48025e..f5cd06a4fb 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -28,6 +29,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization @@ -51,6 +54,7 @@ import io.element.android.libraries.designsystem.preview.debugPlaceholderBackgro import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.OutlinedTextField import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.onTabOrEnterKeyFocusNext import io.element.android.libraries.ui.strings.CommonStrings @Composable @@ -68,6 +72,7 @@ fun BugReportView( title = stringResource(id = CommonStrings.common_report_a_problem), onBackClick = onBackClick ) { + val keyboardController = LocalSoftwareKeyboardController.current val isFormEnabled = state.sending !is AsyncAction.Loading var descriptionFieldState by textFieldState( stateValue = state.formState.description @@ -76,7 +81,8 @@ fun BugReportView( PreferenceRow { OutlinedTextField( value = descriptionFieldState, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth() + .onTabOrEnterKeyFocusNext(LocalFocusManager.current), enabled = isFormEnabled, label = { Text(text = stringResource(id = R.string.screen_bug_report_editor_placeholder)) @@ -91,8 +97,11 @@ fun BugReportView( keyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.Sentences, keyboardType = KeyboardType.Text, - imeAction = ImeAction.Next + imeAction = ImeAction.Next, ), + keyboardActions = KeyboardActions(onNext = { + keyboardController?.hide() + }), minLines = 3, isError = state.isDescriptionInError, ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/TracingMatrixModule.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/TracingMatrixModule.kt new file mode 100644 index 0000000000..9623afe470 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/TracingMatrixModule.kt @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.di + +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.tracing.TracingFilterConfiguration +import io.element.android.libraries.matrix.api.tracing.TracingFilterConfigurations + +@Module +@ContributesTo(AppScope::class) +object TracingMatrixModule { + @Provides + fun providesTracingFilterConfiguration(buildMeta: BuildMeta): TracingFilterConfiguration { + return when (buildMeta.buildType) { + BuildType.DEBUG -> TracingFilterConfigurations.debug + BuildType.NIGHTLY -> TracingFilterConfigurations.nightly + BuildType.RELEASE -> TracingFilterConfigurations.release + } + } +} diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Day-5_6_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Day-5_6_null_0,NEXUS_5,1.0,en].png index 4b939a9f3d..474693b596 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Day-5_6_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Day-5_6_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:958e7d5c11e25cfc4936299e743c2d5a3fd3edfa79b8d89f6d426aa3978a503d -size 32802 +oid sha256:fe4b464a9962ad28f50e0f5d3de149c7d0ceedc60c01ab1ac733556d15de7079 +size 38637 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Night-5_7_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Night-5_7_null_0,NEXUS_5,1.0,en].png index fd3f7f2e9c..d4e07cc52a 100644 --- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Night-5_7_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.preferences.impl.developer.tracing_ConfigureTracingView_null_ConfigureTracingView-Night-5_7_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4eaa277cbed0296a58ef6282ea9cd92739d363cd7e57fdac96f6ca1d7eaa15f4 -size 31669 +oid sha256:a7366935aa7e4b5d4da7760a2f492dffc7c8b9e6d2d574c7bbd7fe5ae830be7f +size 37200