Add a way to configure tracing when the session does not exist yet.

This commit is contained in:
Benoit Marty 2023-09-11 09:58:40 +02:00
parent bb1b1f0253
commit 6864b65962
7 changed files with 62 additions and 6 deletions

View file

@ -32,6 +32,7 @@ import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.login.api.LoginEntryPoint import io.element.android.features.login.api.LoginEntryPoint
import io.element.android.features.onboarding.api.OnBoardingEntryPoint 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.BackstackNode
import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
@ -43,6 +44,7 @@ class NotLoggedInFlowNode @AssistedInject constructor(
@Assisted buildContext: BuildContext, @Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
private val onBoardingEntryPoint: OnBoardingEntryPoint, private val onBoardingEntryPoint: OnBoardingEntryPoint,
private val configureTracingEntryPoint: ConfigureTracingEntryPoint,
private val loginEntryPoint: LoginEntryPoint, private val loginEntryPoint: LoginEntryPoint,
private val notLoggedInImageLoaderFactory: NotLoggedInImageLoaderFactory, private val notLoggedInImageLoaderFactory: NotLoggedInImageLoaderFactory,
) : BackstackNode<NotLoggedInFlowNode.NavTarget>( ) : BackstackNode<NotLoggedInFlowNode.NavTarget>(
@ -70,6 +72,9 @@ class NotLoggedInFlowNode @AssistedInject constructor(
data class LoginFlow( data class LoginFlow(
val isAccountCreation: Boolean, val isAccountCreation: Boolean,
) : NavTarget ) : NavTarget
@Parcelize
data object ConfigureTracing : NavTarget
} }
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@ -83,6 +88,10 @@ class NotLoggedInFlowNode @AssistedInject constructor(
override fun onSignIn() { override fun onSignIn() {
backstack.push(NavTarget.LoginFlow(isAccountCreation = false)) backstack.push(NavTarget.LoginFlow(isAccountCreation = false))
} }
override fun onOpenDeveloperSettings() {
backstack.push(NavTarget.ConfigureTracing)
}
} }
onBoardingEntryPoint onBoardingEntryPoint
.nodeBuilder(this, buildContext) .nodeBuilder(this, buildContext)
@ -94,6 +103,9 @@ class NotLoggedInFlowNode @AssistedInject constructor(
.params(LoginEntryPoint.Params(isAccountCreation = navTarget.isAccountCreation)) .params(LoginEntryPoint.Params(isAccountCreation = navTarget.isAccountCreation))
.build() .build()
} }
NavTarget.ConfigureTracing -> {
configureTracingEntryPoint.createNode(this, buildContext)
}
} }
} }

View file

@ -33,5 +33,6 @@ interface OnBoardingEntryPoint : FeatureEntryPoint {
interface Callback : Plugin { interface Callback : Plugin {
fun onSignUp() fun onSignUp()
fun onSignIn() fun onSignIn()
fun onOpenDeveloperSettings()
} }
} }

View file

@ -46,6 +46,10 @@ class OnBoardingNode @AssistedInject constructor(
plugins<OnBoardingEntryPoint.Callback>().forEach { it.onSignUp() } plugins<OnBoardingEntryPoint.Callback>().forEach { it.onSignUp() }
} }
private fun onOpenDeveloperSettings() {
plugins<OnBoardingEntryPoint.Callback>().forEach { it.onOpenDeveloperSettings() }
}
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
val state = presenter.present() val state = presenter.present()
@ -54,6 +58,8 @@ class OnBoardingNode @AssistedInject constructor(
modifier = modifier, modifier = modifier,
onSignIn = ::onSignIn, onSignIn = ::onSignIn,
onCreateAccount = ::onSignUp, onCreateAccount = ::onSignUp,
onSignInWithQrCode = { /* Not supported yet */ },
onOpenDeveloperSettings = ::onOpenDeveloperSettings,
) )
} }
} }

View file

@ -18,6 +18,8 @@ package io.element.android.features.onboarding.impl
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import io.element.android.libraries.architecture.Presenter 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 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. * When this presenter get more code in it, please remove the ignore rule in the kover configuration.
*/ */
class OnBoardingPresenter @Inject constructor( class OnBoardingPresenter @Inject constructor(
private val buildMeta: BuildMeta,
) : Presenter<OnBoardingState> { ) : Presenter<OnBoardingState> {
@Composable @Composable
override fun present(): OnBoardingState { override fun present(): OnBoardingState {
return OnBoardingState( return OnBoardingState(
isDebugBuild = buildMeta.buildType != BuildType.RELEASE,
canLoginWithQrCode = OnBoardingConfig.canLoginWithQrCode, canLoginWithQrCode = OnBoardingConfig.canLoginWithQrCode,
canCreateAccount = OnBoardingConfig.canCreateAccount, canCreateAccount = OnBoardingConfig.canCreateAccount,
) )

View file

@ -17,6 +17,7 @@
package io.element.android.features.onboarding.impl package io.element.android.features.onboarding.impl
data class OnBoardingState( data class OnBoardingState(
val isDebugBuild: Boolean,
val canLoginWithQrCode: Boolean, val canLoginWithQrCode: Boolean,
val canCreateAccount: Boolean, val canCreateAccount: Boolean,
) )

View file

@ -25,13 +25,16 @@ open class OnBoardingStateProvider : PreviewParameterProvider<OnBoardingState> {
anOnBoardingState(canLoginWithQrCode = true), anOnBoardingState(canLoginWithQrCode = true),
anOnBoardingState(canCreateAccount = true), anOnBoardingState(canCreateAccount = true),
anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true), anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true),
anOnBoardingState(isDebugBuild = true),
) )
} }
fun anOnBoardingState( fun anOnBoardingState(
isDebugBuild: Boolean = false,
canLoginWithQrCode: Boolean = false, canLoginWithQrCode: Boolean = false,
canCreateAccount: Boolean = false canCreateAccount: Boolean = false
) = OnBoardingState( ) = OnBoardingState(
isDebugBuild = isDebugBuild,
canLoginWithQrCode = canLoginWithQrCode, canLoginWithQrCode = canLoginWithQrCode,
canCreateAccount = canCreateAccount canCreateAccount = canCreateAccount
) )

View file

@ -25,7 +25,9 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.QrCode import androidx.compose.material.icons.filled.QrCode
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.BiasAlignment import androidx.compose.ui.BiasAlignment
import androidx.compose.ui.Modifier 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.DayNightPreviews
import io.element.android.libraries.designsystem.preview.ElementPreview 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.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.IconSource
import io.element.android.libraries.designsystem.theme.components.OutlinedButton import io.element.android.libraries.designsystem.theme.components.OutlinedButton
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
@ -58,14 +62,18 @@ import io.element.android.libraries.ui.strings.CommonStrings
fun OnBoardingView( fun OnBoardingView(
state: OnBoardingState, state: OnBoardingState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onSignInWithQrCode: () -> Unit = {}, onSignInWithQrCode: () -> Unit,
onSignIn: () -> Unit = {}, onSignIn: () -> Unit,
onCreateAccount: () -> Unit = {}, onCreateAccount: () -> Unit,
onOpenDeveloperSettings: () -> Unit,
) { ) {
OnBoardingPage( OnBoardingPage(
modifier = modifier, modifier = modifier,
content = { content = {
OnBoardingContent() OnBoardingContent(
state = state,
onOpenDeveloperSettings = onOpenDeveloperSettings
)
}, },
footer = { footer = {
OnBoardingButtons( OnBoardingButtons(
@ -79,7 +87,11 @@ fun OnBoardingView(
} }
@Composable @Composable
private fun OnBoardingContent(modifier: Modifier = Modifier) { private fun OnBoardingContent(
state: OnBoardingState,
onOpenDeveloperSettings: () -> Unit,
modifier: Modifier = Modifier
) {
Box( Box(
modifier = modifier.fillMaxSize(), 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( internal fun OnBoardingScreenPreview(
@PreviewParameter(OnBoardingStateProvider::class) state: OnBoardingState @PreviewParameter(OnBoardingStateProvider::class) state: OnBoardingState
) = ElementPreview { ) = ElementPreview {
OnBoardingView(state) OnBoardingView(
state = state,
onSignInWithQrCode = {},
onSignIn = {},
onCreateAccount = {},
onOpenDeveloperSettings = {}
)
} }