From 5059d67238f168a49ca2791e78425ebe2f431089 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 6 Sep 2023 15:04:21 +0200 Subject: [PATCH 1/7] Iterate on tracing configuration - Add targets matrix_sdk, matrix_sdk::client and matrix_sdk::oidc - introduce default log level. --- .../tracing/TargetLogLevelMapBuilder.kt | 2 -- .../api/tracing/TracingFilterConfiguration.kt | 17 ++++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) 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 c70d573430..b851c15279 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 @@ -29,7 +29,6 @@ class TargetLogLevelMapBuilder @Inject constructor( fun getDefaultMap(): Map { return Target.entries.associateWith { target -> defaultConfig.getLogLevel(target) - ?: LogLevel.INFO } } @@ -37,7 +36,6 @@ class TargetLogLevelMapBuilder @Inject constructor( return Target.entries.associateWith { target -> tracingConfigurationStore.getLogLevel(target) ?: defaultConfig.getLogLevel(target) - ?: LogLevel.INFO } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingFilterConfiguration.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingFilterConfiguration.kt index d34911644e..3062fa3aa3 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingFilterConfiguration.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingFilterConfiguration.kt @@ -19,27 +19,25 @@ package io.element.android.libraries.matrix.api.tracing data class TracingFilterConfiguration( val overrides: Map = emptyMap(), ) { + private val defaultLogLevel = LogLevel.INFO // Order should matters private val targetsToLogLevel: Map = mapOf( - Target.COMMON to LogLevel.INFO, Target.HYPER to LogLevel.WARN, Target.MATRIX_SDK_CRYPTO to LogLevel.DEBUG, Target.MATRIX_SDK_HTTP_CLIENT to LogLevel.DEBUG, Target.MATRIX_SDK_SLIDING_SYNC to LogLevel.TRACE, Target.MATRIX_SDK_BASE_SLIDING_SYNC to LogLevel.TRACE, - Target.MATRIX_SDK_UI_TIMELINE to LogLevel.INFO, ) - fun getLogLevel(target: Target): LogLevel? { - return overrides[target] ?: targetsToLogLevel[target] + fun getLogLevel(target: Target): LogLevel { + return overrides[target] ?: targetsToLogLevel[target] ?: defaultLogLevel } val filter: String get() { - val fullMap = targetsToLogLevel.toMutableMap() - overrides.forEach { (target, logLevel) -> - fullMap[target] = logLevel + val fullMap = Target.values().associateWith { + overrides[it] ?: targetsToLogLevel[it] ?: defaultLogLevel } return fullMap.map { if (it.key.filter.isEmpty()) { @@ -58,7 +56,10 @@ enum class Target(open val filter: String) { MATRIX_SDK_FFI("matrix_sdk_ffi"), MATRIX_SDK_UNIFFI_API("matrix_sdk_ffi::uniffi_api"), MATRIX_SDK_CRYPTO("matrix_sdk_crypto"), + MATRIX_SDK("matrix_sdk"), MATRIX_SDK_HTTP_CLIENT("matrix_sdk::http_client"), + MATRIX_SDK_CLIENT("matrix_sdk::client"), + MATRIX_SDK_OIDC("matrix_sdk::oidc"), MATRIX_SDK_SLIDING_SYNC("matrix_sdk::sliding_sync"), MATRIX_SDK_BASE_SLIDING_SYNC("matrix_sdk_base::sliding_sync"), MATRIX_SDK_UI_TIMELINE("matrix_sdk_ui::timeline"), @@ -75,13 +76,11 @@ enum class LogLevel(open val filter: String) { object TracingFilterConfigurations { val release = TracingFilterConfiguration( overrides = mapOf( - Target.COMMON to LogLevel.INFO, Target.ELEMENT to LogLevel.DEBUG ), ) val debug = TracingFilterConfiguration( overrides = mapOf( - Target.COMMON to LogLevel.INFO, Target.ELEMENT to LogLevel.TRACE ) ) From 9f02de45b864a15d542deaa61cb1fb09674a0fba Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 11 Sep 2023 09:17:50 +0200 Subject: [PATCH 2/7] setenv "RUST_BACKTRACE" to "1" to get more info when a Rust stacktrace is printed out. --- .../io/element/android/x/initializer/TracingInitializer.kt | 3 +++ 1 file changed, 3 insertions(+) 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 7b93812d35..853412e403 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 @@ -17,6 +17,7 @@ package io.element.android.x.initializer import android.content.Context +import android.system.Os import androidx.preference.PreferenceManager import androidx.startup.Initializer import io.element.android.features.preferences.impl.developer.tracing.SharedPrefTracingConfigurationStore @@ -57,6 +58,8 @@ class TracingInitializer : Initializer { } bugReporter.cleanLogDirectoryIfNeeded() tracingService.setupTracing(tracingConfiguration) + // Also set env variable for rust back trace + Os.setenv("RUST_BACKTRACE", "1", true) } override fun dependencies(): List>> = mutableListOf() From a30af97ecd8dd9a6de160948f2bf79cd5838f83e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 11 Sep 2023 09:57:45 +0200 Subject: [PATCH 3/7] Add ConfigureTracingEntryPoint to be able to access the screen from outside the Preference screen. --- .../api/ConfigureTracingEntryPoint.kt | 21 ++++++++++++ .../impl/DefaultConfigureTracingEntryPoint.kt | 33 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/ConfigureTracingEntryPoint.kt create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultConfigureTracingEntryPoint.kt diff --git a/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/ConfigureTracingEntryPoint.kt b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/ConfigureTracingEntryPoint.kt new file mode 100644 index 0000000000..803c0c9232 --- /dev/null +++ b/features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/ConfigureTracingEntryPoint.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 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.features.preferences.api + +import io.element.android.libraries.architecture.SimpleFeatureEntryPoint + +interface ConfigureTracingEntryPoint : SimpleFeatureEntryPoint diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultConfigureTracingEntryPoint.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultConfigureTracingEntryPoint.kt new file mode 100644 index 0000000000..372acbd1f4 --- /dev/null +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultConfigureTracingEntryPoint.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 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.features.preferences.impl + +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.preferences.api.ConfigureTracingEntryPoint +import io.element.android.features.preferences.impl.developer.tracing.ConfigureTracingNode +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultConfigureTracingEntryPoint @Inject constructor() : ConfigureTracingEntryPoint { + override fun createNode(parentNode: Node, buildContext: BuildContext): Node { + return parentNode.createNode(buildContext) + } +} From 9c9a6ce7be5388c8299f2d5b1c3dd0995094d3cc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 11 Sep 2023 09:58:40 +0200 Subject: [PATCH 4/7] Add a way to configure tracing when the session does not exist yet. --- .../android/appnav/NotLoggedInFlowNode.kt | 12 ++++++ .../onboarding/api/OnBoardingEntryPoint.kt | 1 + .../onboarding/impl/OnBoardingNode.kt | 6 +++ .../onboarding/impl/OnBoardingPresenter.kt | 4 ++ .../onboarding/impl/OnBoardingState.kt | 1 + .../impl/OnBoardingStateProvider.kt | 3 ++ .../onboarding/impl/OnBoardingView.kt | 41 ++++++++++++++++--- 7 files changed, 62 insertions(+), 6 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index 17f3a44eb8..6c22644658 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -32,6 +32,7 @@ import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode import io.element.android.features.login.api.LoginEntryPoint import io.element.android.features.onboarding.api.OnBoardingEntryPoint +import io.element.android.features.preferences.api.ConfigureTracingEntryPoint import io.element.android.libraries.architecture.BackstackNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler import io.element.android.libraries.di.AppScope @@ -43,6 +44,7 @@ class NotLoggedInFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, private val onBoardingEntryPoint: OnBoardingEntryPoint, + private val configureTracingEntryPoint: ConfigureTracingEntryPoint, private val loginEntryPoint: LoginEntryPoint, private val notLoggedInImageLoaderFactory: NotLoggedInImageLoaderFactory, ) : BackstackNode( @@ -70,6 +72,9 @@ class NotLoggedInFlowNode @AssistedInject constructor( data class LoginFlow( val isAccountCreation: Boolean, ) : NavTarget + + @Parcelize + data object ConfigureTracing : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -83,6 +88,10 @@ class NotLoggedInFlowNode @AssistedInject constructor( override fun onSignIn() { backstack.push(NavTarget.LoginFlow(isAccountCreation = false)) } + + override fun onOpenDeveloperSettings() { + backstack.push(NavTarget.ConfigureTracing) + } } onBoardingEntryPoint .nodeBuilder(this, buildContext) @@ -94,6 +103,9 @@ class NotLoggedInFlowNode @AssistedInject constructor( .params(LoginEntryPoint.Params(isAccountCreation = navTarget.isAccountCreation)) .build() } + NavTarget.ConfigureTracing -> { + configureTracingEntryPoint.createNode(this, buildContext) + } } } diff --git a/features/onboarding/api/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt b/features/onboarding/api/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt index 7be45ce236..d183b05386 100644 --- a/features/onboarding/api/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt +++ b/features/onboarding/api/src/main/kotlin/io/element/android/features/onboarding/api/OnBoardingEntryPoint.kt @@ -33,5 +33,6 @@ interface OnBoardingEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onSignUp() fun onSignIn() + fun onOpenDeveloperSettings() } } diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt index d86623cae2..21322657c1 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt @@ -46,6 +46,10 @@ class OnBoardingNode @AssistedInject constructor( plugins().forEach { it.onSignUp() } } + private fun onOpenDeveloperSettings() { + plugins().forEach { it.onOpenDeveloperSettings() } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -54,6 +58,8 @@ class OnBoardingNode @AssistedInject constructor( modifier = modifier, onSignIn = ::onSignIn, onCreateAccount = ::onSignUp, + onSignInWithQrCode = { /* Not supported yet */ }, + onOpenDeveloperSettings = ::onOpenDeveloperSettings, ) } } diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt index 48a360e6c9..b26752fdbe 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt @@ -18,6 +18,8 @@ package io.element.android.features.onboarding.impl import androidx.compose.runtime.Composable import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.core.meta.BuildType import javax.inject.Inject /** @@ -25,10 +27,12 @@ import javax.inject.Inject * When this presenter get more code in it, please remove the ignore rule in the kover configuration. */ class OnBoardingPresenter @Inject constructor( + private val buildMeta: BuildMeta, ) : Presenter { @Composable override fun present(): OnBoardingState { return OnBoardingState( + isDebugBuild = buildMeta.buildType != BuildType.RELEASE, canLoginWithQrCode = OnBoardingConfig.canLoginWithQrCode, canCreateAccount = OnBoardingConfig.canCreateAccount, ) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt index 88215c0c1e..5bd7718033 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt @@ -17,6 +17,7 @@ package io.element.android.features.onboarding.impl data class OnBoardingState( + val isDebugBuild: Boolean, val canLoginWithQrCode: Boolean, val canCreateAccount: Boolean, ) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt index 1c60a56018..926d2a2303 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt @@ -25,13 +25,16 @@ open class OnBoardingStateProvider : PreviewParameterProvider { anOnBoardingState(canLoginWithQrCode = true), anOnBoardingState(canCreateAccount = true), anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true), + anOnBoardingState(isDebugBuild = true), ) } fun anOnBoardingState( + isDebugBuild: Boolean = false, canLoginWithQrCode: Boolean = false, canCreateAccount: Boolean = false ) = OnBoardingState( + isDebugBuild = isDebugBuild, canLoginWithQrCode = canLoginWithQrCode, canCreateAccount = canCreateAccount ) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt index 1adfe6bd93..875b79d8f2 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt @@ -25,7 +25,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.QrCode +import androidx.compose.material.icons.filled.Settings import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier @@ -41,6 +43,8 @@ import io.element.android.libraries.designsystem.atomic.pages.OnBoardingPage import io.element.android.libraries.designsystem.preview.DayNightPreviews import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.theme.components.Button +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.IconSource import io.element.android.libraries.designsystem.theme.components.OutlinedButton import io.element.android.libraries.designsystem.theme.components.Text @@ -58,14 +62,18 @@ import io.element.android.libraries.ui.strings.CommonStrings fun OnBoardingView( state: OnBoardingState, modifier: Modifier = Modifier, - onSignInWithQrCode: () -> Unit = {}, - onSignIn: () -> Unit = {}, - onCreateAccount: () -> Unit = {}, + onSignInWithQrCode: () -> Unit, + onSignIn: () -> Unit, + onCreateAccount: () -> Unit, + onOpenDeveloperSettings: () -> Unit, ) { OnBoardingPage( modifier = modifier, content = { - OnBoardingContent() + OnBoardingContent( + state = state, + onOpenDeveloperSettings = onOpenDeveloperSettings + ) }, footer = { OnBoardingButtons( @@ -79,7 +87,11 @@ fun OnBoardingView( } @Composable -private fun OnBoardingContent(modifier: Modifier = Modifier) { +private fun OnBoardingContent( + state: OnBoardingState, + onOpenDeveloperSettings: () -> Unit, + modifier: Modifier = Modifier +) { Box( modifier = modifier.fillMaxSize(), ) { @@ -122,6 +134,17 @@ private fun OnBoardingContent(modifier: Modifier = Modifier) { ) } } + if (state.isDebugBuild) { + IconButton( + modifier = Modifier.align(Alignment.TopEnd), + onClick = onOpenDeveloperSettings, + ) { + Icon( + imageVector = Icons.Filled.Settings, + contentDescription = stringResource(CommonStrings.common_settings) + ) + } + } } } @@ -172,5 +195,11 @@ private fun OnBoardingButtons( internal fun OnBoardingScreenPreview( @PreviewParameter(OnBoardingStateProvider::class) state: OnBoardingState ) = ElementPreview { - OnBoardingView(state) + OnBoardingView( + state = state, + onSignInWithQrCode = {}, + onSignIn = {}, + onCreateAccount = {}, + onOpenDeveloperSettings = {} + ) } From eb4fc1d3000d120db1b0db5e031c778624e318a6 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Mon, 11 Sep 2023 08:08:27 +0000 Subject: [PATCH 5/7] Update screenshots --- ...impl_null_OnBoardingScreen-D-0_0_null_4,NEXUS_5,1.0,en].png | 3 +++ ...impl_null_OnBoardingScreen-N-0_1_null_4,NEXUS_5,1.0,en].png | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-D-0_0_null_4,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-N-0_1_null_4,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-D-0_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-D-0_0_null_4,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..63eb2c9cdc --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-D-0_0_null_4,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2c67243e8def6f8d188eb918b0dbd57dec3aae03fe8fca90ef5529658de537b +size 327304 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-N-0_1_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-N-0_1_null_4,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..cfc1433bcd --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.onboarding.impl_null_OnBoardingScreen-N-0_1_null_4,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84e5641cce0113690d0d626bd3b17e8945728b3835a06b06a645418d12a05022 +size 421112 From ac5acd4949c2d970bd2f91ab77fec6030b9fbc25 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 11 Sep 2023 10:40:49 +0200 Subject: [PATCH 6/7] Reorder params. --- .../element/android/features/onboarding/impl/OnBoardingView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt index 875b79d8f2..424c24839a 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt @@ -61,11 +61,11 @@ import io.element.android.libraries.ui.strings.CommonStrings @Composable fun OnBoardingView( state: OnBoardingState, - modifier: Modifier = Modifier, onSignInWithQrCode: () -> Unit, onSignIn: () -> Unit, onCreateAccount: () -> Unit, onOpenDeveloperSettings: () -> Unit, + modifier: Modifier = Modifier, ) { OnBoardingPage( modifier = modifier, From d69728c0ffddf53a1e013c2dbc4a03fdea308fb0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 11 Sep 2023 12:12:48 +0200 Subject: [PATCH 7/7] Fix and add test. --- .../onboarding/impl/OnBoardingPresenterTest.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt index c2db28631c..538fba98d5 100644 --- a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt +++ b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt @@ -20,6 +20,8 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -33,13 +35,25 @@ class OnBoardingPresenterTest { @Test fun `present - initial state`() = runTest { - val presenter = OnBoardingPresenter() + val presenter = OnBoardingPresenter(aBuildMeta()) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { val initialState = awaitItem() + assertThat(initialState.isDebugBuild).isTrue() assertThat(initialState.canLoginWithQrCode).isFalse() assertThat(initialState.canCreateAccount).isFalse() } } + + @Test + fun `present - initial state release`() = runTest { + val presenter = OnBoardingPresenter(aBuildMeta(buildType = BuildType.RELEASE)) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.isDebugBuild).isFalse() + } + } }