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 9401cdeac1..fae6d586aa 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -24,6 +24,7 @@ import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push import dagger.assisted.Assisted @@ -54,6 +55,10 @@ class NotLoggedInFlowNode @AssistedInject constructor( buildContext = buildContext, plugins = plugins, ) { + interface Callback : Plugin { + fun onOpenBugReport() + } + override fun onBuilt() { super.onBuilt() lifecycle.subscribe( @@ -91,6 +96,10 @@ class NotLoggedInFlowNode @AssistedInject constructor( override fun onOpenDeveloperSettings() { backstack.push(NavTarget.ConfigureTracing) } + + override fun onReportProblem() { + plugins().forEach { it.onOpenBugReport() } + } } onBoardingEntryPoint .nodeBuilder(this, buildContext) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index 8a9ea22926..fa7820b5d5 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -210,7 +210,14 @@ class RootFlowNode @AssistedInject constructor( } createNode(buildContext, plugins = listOf(inputs, callback)) } - NavTarget.NotLoggedInFlow -> createNode(buildContext) + NavTarget.NotLoggedInFlow -> { + val callback = object : NotLoggedInFlowNode.Callback { + override fun onOpenBugReport() { + backstack.push(NavTarget.BugReport) + } + } + createNode(buildContext, plugins = listOf(callback)) + } is NavTarget.SignedOutFlow -> { signedOutEntryPoint.nodeBuilder(this, buildContext) .params( diff --git a/changelog.d/2275.misc b/changelog.d/2275.misc new file mode 100644 index 0000000000..ba8eabfebd --- /dev/null +++ b/changelog.d/2275.misc @@ -0,0 +1 @@ +Add "Report a problem" button to the onboarding screen 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 77898ca91f..a70f14dc43 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 { fun onSignUp() fun onSignIn() fun onOpenDeveloperSettings() + fun onReportProblem() } } 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 f8653cc921..f7d829d5fe 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 @@ -49,6 +49,10 @@ class OnBoardingNode @AssistedInject constructor( plugins().forEach { it.onOpenDeveloperSettings() } } + private fun onReportProblem() { + plugins().forEach { it.onReportProblem() } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -59,6 +63,7 @@ class OnBoardingNode @AssistedInject constructor( onCreateAccount = ::onSignUp, onSignInWithQrCode = { /* Not supported yet */ }, onOpenDeveloperSettings = ::onOpenDeveloperSettings, + onReportProblem = ::onReportProblem, ) } } 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 a0d2e2ce7f..c4b4e2d6b4 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 @@ -16,6 +16,7 @@ package io.element.android.features.onboarding.impl +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -65,6 +66,7 @@ fun OnBoardingView( onSignIn: () -> Unit, onCreateAccount: () -> Unit, onOpenDeveloperSettings: () -> Unit, + onReportProblem: () -> Unit, modifier: Modifier = Modifier, ) { OnBoardingPage( @@ -81,6 +83,7 @@ fun OnBoardingView( onSignInWithQrCode = onSignInWithQrCode, onSignIn = onSignIn, onCreateAccount = onCreateAccount, + onReportProblem = onReportProblem, ) } ) @@ -154,6 +157,7 @@ private fun OnBoardingButtons( onSignInWithQrCode: () -> Unit, onSignIn: () -> Unit, onCreateAccount: () -> Unit, + onReportProblem: () -> Unit, modifier: Modifier = Modifier, ) { ButtonColumnMolecule(modifier = modifier) { @@ -187,6 +191,15 @@ private fun OnBoardingButtons( ) } Spacer(modifier = Modifier.height(16.dp)) + // Add a report problem text button. Use a Text since we need a special theme here. + Text( + modifier = Modifier + .padding(8.dp) + .clickable(onClick = onReportProblem), + text = stringResource(id = CommonStrings.common_report_a_problem), + style = ElementTheme.typography.fontBodySmRegular, + color = ElementTheme.colors.textSecondary, + ) } } @@ -200,6 +213,7 @@ internal fun OnBoardingScreenPreview( onSignInWithQrCode = {}, onSignIn = {}, onCreateAccount = {}, - onOpenDeveloperSettings = {} + onOpenDeveloperSettings = {}, + onReportProblem = {}, ) }