From 5c41f0188a994bbade486988b58c81d6d4326786 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 6 Jul 2023 18:12:45 +0200 Subject: [PATCH] Node: rework LoggedInFlowNode analytics pop --- .../io/element/android/appnav/BackstackExt.kt | 12 ++++++++ .../android/appnav/LoggedInFlowNode.kt | 29 ++++--------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt index a8a4d3f64c..36b267debb 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt @@ -18,6 +18,7 @@ package io.element.android.appnav import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.NewRoot +import com.bumble.appyx.navmodel.backstack.operation.Remove /** * Don't process NewRoot if the nav target already exists in the stack. @@ -29,3 +30,14 @@ fun BackStack.safeRoot(element: T) { if (containsRoot) return accept(NewRoot(element)) } + +/** + * Remove the last element on the backstack equals to the given one. + */ +fun BackStack.removeLast(element: T) { + val lastExpectedNavElement = elements.value.lastOrNull { + it.key.navTarget == element + } ?: return + accept(Remove(lastExpectedNavElement.key)) +} + diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 4d6553f51c..b0de0df3ff 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -56,7 +56,6 @@ import io.element.android.libraries.architecture.animation.rememberDefaultTransi import io.element.android.libraries.architecture.bindings import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs -import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.di.AppScope @@ -92,7 +91,7 @@ class LoggedInFlowNode @AssistedInject constructor( snackbarDispatcher: SnackbarDispatcher, ) : BackstackNode( backstack = BackStack( - initialElement = NavTarget.SplashScreen, + initialElement = NavTarget.RoomList, savedStateMap = buildContext.savedStateMap, ), buildContext = buildContext, @@ -104,22 +103,14 @@ class LoggedInFlowNode @AssistedInject constructor( .distinctUntilChanged() .onEach { isConsentAsked -> if (isConsentAsked) { - switchToRoomList() + backstack.removeLast(NavTarget.AnalyticsOptIn) } else { - switchToAnalytics() + backstack.push(NavTarget.AnalyticsOptIn) } } .launchIn(lifecycleScope) } - private fun switchToRoomList() { - backstack.safeRoot(NavTarget.RoomList) - } - - private fun switchToAnalytics() { - backstack.safeRoot(NavTarget.AnalyticsSettings) - } - interface Callback : Plugin { fun onOpenBugReport() = Unit } @@ -194,9 +185,6 @@ class LoggedInFlowNode @AssistedInject constructor( } sealed interface NavTarget : Parcelable { - @Parcelize - object SplashScreen : NavTarget - @Parcelize object Permanent : NavTarget @@ -222,12 +210,11 @@ class LoggedInFlowNode @AssistedInject constructor( object InviteList : NavTarget @Parcelize - object AnalyticsSettings : NavTarget + object AnalyticsOptIn : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { - NavTarget.SplashScreen -> splashNode(buildContext) NavTarget.Permanent -> { createNode(buildContext) } @@ -330,7 +317,7 @@ class LoggedInFlowNode @AssistedInject constructor( .callback(callback) .build() } - NavTarget.AnalyticsSettings -> { + NavTarget.AnalyticsOptIn -> { analyticsOptInEntryPoint.createNode(this, buildContext) } } @@ -349,12 +336,6 @@ class LoggedInFlowNode @AssistedInject constructor( } } - private fun splashNode(buildContext: BuildContext) = node(buildContext) { - Box(modifier = it.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() - } - } - @Composable override fun View(modifier: Modifier) { Box(modifier = modifier) {