change(flow) : remove developer entry point from OnBoarding

This commit is contained in:
ganfra 2025-01-16 18:07:09 +01:00
parent 2ae511ee33
commit d5b5439db1
9 changed files with 7 additions and 87 deletions

View file

@ -24,7 +24,6 @@ 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.login.api.LoginFlowType import io.element.android.features.login.api.LoginFlowType
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.BackstackView import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.designsystem.utils.ForceOrientationInMobileDevices import io.element.android.libraries.designsystem.utils.ForceOrientationInMobileDevices
@ -38,7 +37,6 @@ 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,
) : BaseFlowNode<NotLoggedInFlowNode.NavTarget>( ) : BaseFlowNode<NotLoggedInFlowNode.NavTarget>(
@ -68,9 +66,6 @@ class NotLoggedInFlowNode @AssistedInject constructor(
@Parcelize @Parcelize
data class LoginFlow(val type: LoginFlowType) : NavTarget data class LoginFlow(val type: LoginFlowType) : NavTarget
@Parcelize
data object ConfigureTracing : NavTarget
} }
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@ -89,10 +84,6 @@ class NotLoggedInFlowNode @AssistedInject constructor(
backstack.push(NavTarget.LoginFlow(type = LoginFlowType.SIGN_IN_QR_CODE)) backstack.push(NavTarget.LoginFlow(type = LoginFlowType.SIGN_IN_QR_CODE))
} }
override fun onOpenDeveloperSettings() {
backstack.push(NavTarget.ConfigureTracing)
}
override fun onReportProblem() { override fun onReportProblem() {
plugins<Callback>().forEach { it.onOpenBugReport() } plugins<Callback>().forEach { it.onOpenBugReport() }
} }
@ -107,9 +98,6 @@ class NotLoggedInFlowNode @AssistedInject constructor(
.params(LoginEntryPoint.Params(flowType = navTarget.type)) .params(LoginEntryPoint.Params(flowType = navTarget.type))
.build() .build()
} }
NavTarget.ConfigureTracing -> {
configureTracingEntryPoint.createNode(this, buildContext)
}
} }
} }

View file

@ -24,7 +24,6 @@ interface OnBoardingEntryPoint : FeatureEntryPoint {
fun onSignUp() fun onSignUp()
fun onSignIn() fun onSignIn()
fun onSignInWithQrCode() fun onSignInWithQrCode()
fun onOpenDeveloperSettings()
fun onReportProblem() fun onReportProblem()
} }
} }

View file

@ -40,10 +40,6 @@ class OnBoardingNode @AssistedInject constructor(
plugins<OnBoardingEntryPoint.Callback>().forEach { it.onSignInWithQrCode() } plugins<OnBoardingEntryPoint.Callback>().forEach { it.onSignInWithQrCode() }
} }
private fun onOpenDeveloperSettings() {
plugins<OnBoardingEntryPoint.Callback>().forEach { it.onOpenDeveloperSettings() }
}
private fun onReportProblem() { private fun onReportProblem() {
plugins<OnBoardingEntryPoint.Callback>().forEach { it.onReportProblem() } plugins<OnBoardingEntryPoint.Callback>().forEach { it.onReportProblem() }
} }
@ -57,7 +53,6 @@ class OnBoardingNode @AssistedInject constructor(
onSignIn = ::onSignIn, onSignIn = ::onSignIn,
onCreateAccount = ::onSignUp, onCreateAccount = ::onSignUp,
onSignInWithQrCode = ::onSignInWithQrCode, onSignInWithQrCode = ::onSignInWithQrCode,
onOpenDeveloperSettings = ::onOpenDeveloperSettings,
onReportProblem = ::onReportProblem, onReportProblem = ::onReportProblem,
) )
} }

View file

@ -13,7 +13,6 @@ import androidx.compose.runtime.produceState
import io.element.android.appconfig.OnBoardingConfig import io.element.android.appconfig.OnBoardingConfig
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.BuildMeta
import io.element.android.libraries.core.meta.BuildType
import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.api.FeatureFlags
import javax.inject.Inject import javax.inject.Inject
@ -31,8 +30,7 @@ class OnBoardingPresenter @Inject constructor(
val canLoginWithQrCode by produceState(initialValue = false) { val canLoginWithQrCode by produceState(initialValue = false) {
value = featureFlagService.isFeatureEnabled(FeatureFlags.QrCodeLogin) value = featureFlagService.isFeatureEnabled(FeatureFlags.QrCodeLogin)
} }
return OnBoardingState( return OnBoardingState(
isDebugBuild = buildMeta.buildType != BuildType.RELEASE,
productionApplicationName = buildMeta.productionApplicationName, productionApplicationName = buildMeta.productionApplicationName,
canLoginWithQrCode = canLoginWithQrCode, canLoginWithQrCode = canLoginWithQrCode,
canCreateAccount = OnBoardingConfig.CAN_CREATE_ACCOUNT, canCreateAccount = OnBoardingConfig.CAN_CREATE_ACCOUNT,

View file

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

View file

@ -16,17 +16,14 @@ 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,
productionApplicationName: String = "Element", productionApplicationName: String = "Element",
canLoginWithQrCode: Boolean = false, canLoginWithQrCode: Boolean = false,
canCreateAccount: Boolean = false canCreateAccount: Boolean = false
) = OnBoardingState( ) = OnBoardingState(
isDebugBuild = isDebugBuild,
productionApplicationName = productionApplicationName, productionApplicationName = productionApplicationName,
canLoginWithQrCode = canLoginWithQrCode, canLoginWithQrCode = canLoginWithQrCode,
canCreateAccount = canCreateAccount canCreateAccount = canCreateAccount

View file

@ -18,7 +18,6 @@ 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.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
@ -28,7 +27,6 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtom import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtom
import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtomSize import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtomSize
import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule
@ -36,8 +34,6 @@ import io.element.android.libraries.designsystem.atomic.pages.OnBoardingPage
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
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.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.theme.components.TextButton
@ -56,17 +52,13 @@ fun OnBoardingView(
onSignInWithQrCode: () -> Unit, onSignInWithQrCode: () -> Unit,
onSignIn: () -> Unit, onSignIn: () -> Unit,
onCreateAccount: () -> Unit, onCreateAccount: () -> Unit,
onOpenDeveloperSettings: () -> Unit,
onReportProblem: () -> Unit, onReportProblem: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
OnBoardingPage( OnBoardingPage(
modifier = modifier, modifier = modifier,
content = { content = {
OnBoardingContent( OnBoardingContent(state = state)
state = state,
onOpenDeveloperSettings = onOpenDeveloperSettings
)
}, },
footer = { footer = {
OnBoardingButtons( OnBoardingButtons(
@ -81,10 +73,7 @@ fun OnBoardingView(
} }
@Composable @Composable
private fun OnBoardingContent( private fun OnBoardingContent(state: OnBoardingState) {
state: OnBoardingState,
onOpenDeveloperSettings: () -> Unit,
) {
Box( Box(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { ) {
@ -127,17 +116,6 @@ private fun OnBoardingContent(
) )
} }
} }
if (state.isDebugBuild) {
IconButton(
modifier = Modifier.align(Alignment.TopEnd),
onClick = onOpenDeveloperSettings,
) {
Icon(
imageVector = CompoundIcons.SettingsSolid(),
contentDescription = stringResource(CommonStrings.common_settings)
)
}
}
} }
} }
@ -167,8 +145,8 @@ private fun OnBoardingButtons(
text = stringResource(id = signInButtonStringRes), text = stringResource(id = signInButtonStringRes),
onClick = onSignIn, onClick = onSignIn,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.testTag(TestTags.onBoardingSignIn) .testTag(TestTags.onBoardingSignIn)
) )
if (state.canCreateAccount) { if (state.canCreateAccount) {
TextButton( TextButton(
@ -181,8 +159,8 @@ private fun OnBoardingButtons(
// Add a report problem text button. Use a Text since we need a special theme here. // Add a report problem text button. Use a Text since we need a special theme here.
Text( Text(
modifier = Modifier modifier = Modifier
.padding(16.dp) .padding(16.dp)
.clickable(onClick = onReportProblem), .clickable(onClick = onReportProblem),
text = stringResource(id = CommonStrings.common_report_a_problem), text = stringResource(id = CommonStrings.common_report_a_problem),
style = ElementTheme.typography.fontBodySmRegular, style = ElementTheme.typography.fontBodySmRegular,
color = ElementTheme.colors.textSecondary, color = ElementTheme.colors.textSecondary,
@ -200,7 +178,6 @@ internal fun OnBoardingViewPreview(
onSignInWithQrCode = {}, onSignInWithQrCode = {},
onSignIn = {}, onSignIn = {},
onCreateAccount = {}, onCreateAccount = {},
onOpenDeveloperSettings = {},
onReportProblem = {}, onReportProblem = {},
) )
} }

View file

@ -12,7 +12,6 @@ import app.cash.molecule.moleculeFlow
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.appconfig.OnBoardingConfig import io.element.android.appconfig.OnBoardingConfig
import io.element.android.libraries.core.meta.BuildType
import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.matrix.test.core.aBuildMeta
@ -44,27 +43,10 @@ class OnBoardingPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.isDebugBuild).isTrue()
assertThat(initialState.canLoginWithQrCode).isFalse() assertThat(initialState.canLoginWithQrCode).isFalse()
assertThat(initialState.productionApplicationName).isEqualTo("B") assertThat(initialState.productionApplicationName).isEqualTo("B")
assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT) assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT)
assertThat(awaitItem().canLoginWithQrCode).isTrue() assertThat(awaitItem().canLoginWithQrCode).isTrue()
} }
} }
@Test
fun `present - initial state release`() = runTest {
val presenter = OnBoardingPresenter(
buildMeta = aBuildMeta(buildType = BuildType.RELEASE),
featureFlagService = FakeFeatureFlagService(),
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val initialState = awaitItem()
assertThat(initialState.isDebugBuild).isFalse()
cancelAndIgnoreRemainingEvents()
}
}
} }

View file

@ -8,10 +8,8 @@
package io.element.android.features.onboarding.impl package io.element.android.features.onboarding.impl
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.ui.test.hasContentDescription
import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.performClick
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled import io.element.android.tests.testutils.EnsureNeverCalled
@ -74,17 +72,6 @@ class OnboardingViewTest {
} }
} }
@Test
fun `when on debug build - clicking on the settings icon opens the developer settings`() {
ensureCalledOnce { callback ->
rule.setOnboardingView(
state = anOnBoardingState(isDebugBuild = true),
onOpenDeveloperSettings = callback
)
rule.onNode(hasContentDescription(rule.activity.getString(CommonStrings.common_settings))).performClick()
}
}
@Test @Test
fun `clicking on report a problem calls the sign in callback`() { fun `clicking on report a problem calls the sign in callback`() {
ensureCalledOnce { callback -> ensureCalledOnce { callback ->
@ -101,7 +88,6 @@ class OnboardingViewTest {
onSignInWithQrCode: () -> Unit = EnsureNeverCalled(), onSignInWithQrCode: () -> Unit = EnsureNeverCalled(),
onSignIn: () -> Unit = EnsureNeverCalled(), onSignIn: () -> Unit = EnsureNeverCalled(),
onCreateAccount: () -> Unit = EnsureNeverCalled(), onCreateAccount: () -> Unit = EnsureNeverCalled(),
onOpenDeveloperSettings: () -> Unit = EnsureNeverCalled(),
onReportProblem: () -> Unit = EnsureNeverCalled(), onReportProblem: () -> Unit = EnsureNeverCalled(),
) { ) {
setContent { setContent {
@ -110,7 +96,6 @@ class OnboardingViewTest {
onSignInWithQrCode = onSignInWithQrCode, onSignInWithQrCode = onSignInWithQrCode,
onSignIn = onSignIn, onSignIn = onSignIn,
onCreateAccount = onCreateAccount, onCreateAccount = onCreateAccount,
onOpenDeveloperSettings = onOpenDeveloperSettings,
onReportProblem = onReportProblem, onReportProblem = onReportProblem,
) )
} }