From 57230517517d077f57e95a917c9313b19d191e37 Mon Sep 17 00:00:00 2001 From: Vinay Gaba Date: Wed, 5 Jun 2024 15:57:27 -0700 Subject: [PATCH] Improve ShowkaseBrowser codebase and update navigation stack --- build.gradle | 9 +- sample-submodule-2/build.gradle | 3 +- sample-submodule/build.gradle | 3 +- sample/build.gradle | 3 +- .../models/ShowkaseBrowserScreenMetadata.kt | 4 - .../android/showkase/ui/CommonComponents.kt | 57 ++--- .../android/showkase/ui/ShowkaseBrowserApp.kt | 199 +++++++++++------- .../showkase/ui/ShowkaseCategoriesScreen.kt | 39 ++-- .../ui/ShowkaseColorsInAGroupScreen.kt | 10 +- .../ui/ShowkaseComponentDetailScreen.kt | 44 ++-- .../ui/ShowkaseComponentStylesScreen.kt | 12 +- .../ui/ShowkaseComponentsInAGroupScreen.kt | 12 +- .../showkase/ui/ShowkaseGroupsScreen.kt | 64 ++++-- .../ui/ShowkaseTypographyInAGroupScreen.kt | 24 ++- 14 files changed, 293 insertions(+), 190 deletions(-) diff --git a/build.gradle b/build.gradle index b2dc516e..3dd74420 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { 'composeCompiler' : '1.5.13', 'composeActivity' : '1.9.0', 'composeConstraintLayout': '1.0.1', - 'composeNavigation' : '2.5.1', + 'composeNavigation' : '2.7.7', 'detekt' : '1.7.4', 'espresso' : '3.2.0', 'gradle' : '8.1.1', @@ -22,10 +22,10 @@ buildscript { 'kotlinXMetadata' : '0.6.0', 'ksp' : "$KSP_VERSION", 'ktx' : '1.1.0', - 'lifecycle' : '2.2.0', + 'lifecycle' : '2.6.2', 'paparazzi' : '1.2.0', 'picasso' : '2.8', - 'appcompat' : '1.4.0', + 'appcompat' : '1.6.1', 'testRunner' : '1.4.0', 'testParameterInjector' : '1.8', 'googleTruth' : '1.1.3', @@ -66,7 +66,8 @@ buildscript { 'support' : [ 'appCompat' : "androidx.appcompat:appcompat:${versions.appcompat}", 'ktx' : "androidx.core:core-ktx:${versions.corektx}", - 'lifecycleExtensions': "androidx.lifecycle:lifecycle-extensions:${versions.lifecycle}" + 'lifecycleComposeViewModel' : "androidx.lifecycle:lifecycle-viewmodel-compose:${versions.lifecycle}", + 'lifecycleComposeRuntime' : "androidx.lifecycle:lifecycle-runtime-compose:${versions.lifecycle}", ], 'test' : [ 'androidXTestCore' : "androidx.test:core:${versions.androidXTestCore}", diff --git a/sample-submodule-2/build.gradle b/sample-submodule-2/build.gradle index e6fc2f5f..ec4800a2 100644 --- a/sample-submodule-2/build.gradle +++ b/sample-submodule-2/build.gradle @@ -61,7 +61,8 @@ dependencies { // Support Libraries implementation deps.support.appCompat implementation deps.support.ktx - implementation deps.support.lifecycleExtensions + implementation deps.support.lifecycleComposeViewModel +implementation deps.support.lifecycleComposeRuntime // Showkase implementation project(':showkase') diff --git a/sample-submodule/build.gradle b/sample-submodule/build.gradle index eb3abd3b..4851f27f 100644 --- a/sample-submodule/build.gradle +++ b/sample-submodule/build.gradle @@ -62,7 +62,8 @@ dependencies { // Support Libraries implementation deps.support.appCompat implementation deps.support.ktx - implementation deps.support.lifecycleExtensions + implementation deps.support.lifecycleComposeViewModel +implementation deps.support.lifecycleComposeRuntime // Showkase implementation project(':showkase') diff --git a/sample/build.gradle b/sample/build.gradle index e2323269..619bd43e 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -94,7 +94,8 @@ dependencies { // Support Libraries implementation deps.support.appCompat implementation deps.support.ktx - implementation deps.support.lifecycleExtensions + implementation deps.support.lifecycleComposeViewModel +implementation deps.support.lifecycleComposeRuntime // Compose implementation deps.compose.activityCompose diff --git a/showkase/src/main/java/com/airbnb/android/showkase/models/ShowkaseBrowserScreenMetadata.kt b/showkase/src/main/java/com/airbnb/android/showkase/models/ShowkaseBrowserScreenMetadata.kt index 2e3b25c7..17b50a0a 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/models/ShowkaseBrowserScreenMetadata.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/models/ShowkaseBrowserScreenMetadata.kt @@ -41,7 +41,3 @@ internal fun ShowkaseBrowserScreenMetadata.clearActiveSearch() = copy( isSearchActive = false, searchQuery = null ) - -internal fun MutableState.update(block: T.() -> T) { - value = this.component1().run(block) -} diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/CommonComponents.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/CommonComponents.kt index 34a2b1ad..a46f2292 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/CommonComponents.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/CommonComponents.kt @@ -1,5 +1,6 @@ package com.airbnb.android.showkase.ui +import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.material.Text import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -12,6 +13,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily @@ -32,10 +34,10 @@ fun SimpleTextCard( onClick = onClick ) { Text( - text = text, + text = text, modifier = Modifier.padding(padding4x), style = TextStyle( - fontSize = 20.sp, + fontSize = 20.sp, fontFamily = FontFamily.Serif, fontWeight = FontWeight.Bold ) @@ -47,8 +49,10 @@ fun SimpleTextCard( internal fun ComponentCardTitle(componentName: String) { Text( text = componentName, - modifier = Modifier.padding(start = padding4x, end = padding4x, top = padding8x, - bottom = padding1x), + modifier = Modifier.padding( + start = padding4x, end = padding4x, top = padding8x, + bottom = padding1x + ), style = TextStyle( fontSize = 16.sp, fontFamily = FontFamily.Serif, @@ -63,30 +67,33 @@ internal fun ComponentCard( onClick: (() -> Unit)? = null, darkMode: Boolean = false, ) { - val composableModifier = Modifier.generateComposableModifier(metadata) - val composableContainerModifier = Modifier.generateContainerModifier(onClick) - MaterialTheme( - colors = if (darkMode) darkColors() else lightColors() - ) { - Card( - shape = MaterialTheme.shapes.large + val backPressedDispatcherOwner = rememberOnBackPressedDispatcherOwner() + CompositionLocalProvider(LocalOnBackPressedDispatcherOwner provides backPressedDispatcherOwner) { + val composableModifier = Modifier.generateComposableModifier(metadata) + val composableContainerModifier = Modifier.generateContainerModifier(onClick) + MaterialTheme( + colors = if (darkMode) darkColors() else lightColors() ) { - Box { - Column(modifier = composableModifier) { - metadata.component() + Card( + shape = MaterialTheme.shapes.large + ) { + Box { + Column(modifier = composableModifier) { + metadata.component() + } + // Need to add this as part of the stack so that we can intercept the touch of the + // component when we are on the "Group components" screen. If + // composableContainerModifier does not have any clickable modifiers, this column has no + // impact and the touches go through to the component(this happens in the "Component + // Detail" screen. + Column( + modifier = Modifier + .matchParentSize() + .then(composableContainerModifier) + ) {} } - // Need to add this as part of the stack so that we can intercept the touch of the - // component when we are on the "Group components" screen. If - // composableContainerModifier does not have any clickable modifiers, this column has no - // impact and the touches go through to the component(this happens in the "Component - // Detail" screen. - Column( - modifier = Modifier - .matchParentSize() - .then(composableContainerModifier) - ) {} - } + } } } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseBrowserApp.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseBrowserApp.kt index 340572fa..399d2867 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseBrowserApp.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseBrowserApp.kt @@ -76,21 +76,12 @@ internal fun ShowkaseBrowserApp( val lightModeConfiguration = Configuration(LocalConfiguration.current).apply { uiMode = Configuration.UI_MODE_NIGHT_NO } - val lifecycleOwner = LocalLifecycleOwner.current - val backPressedDispatcherOwner = remember { - object : OnBackPressedDispatcherOwner { - override val lifecycle: Lifecycle - get() = lifecycleOwner.lifecycle - override val onBackPressedDispatcher: OnBackPressedDispatcher - get() = OnBackPressedDispatcher() - } - } CompositionLocalProvider( LocalConfiguration provides lightModeConfiguration, LocalInspectionMode provides true, // This is added to make sure that the navigation of the ShowkaseBrowser does not break // when one of the previews has a back press handler in the implementation of the component. - LocalOnBackPressedDispatcherOwner provides backPressedDispatcherOwner +// LocalOnBackPressedDispatcherOwner provides backPressedDispatcherOwner ) { val navController = rememberNavController() val navBackStackEntry by navController.currentBackStackEntryAsState() @@ -123,7 +114,7 @@ internal fun ShowkaseBrowserApp( ) }, - ) + ) }, content = { Column( @@ -137,7 +128,10 @@ internal fun ShowkaseBrowserApp( groupedColorsMap, groupedTypographyMap, showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata + onUpdateShowkaseBrowserScreenMetadata, + navigateTo = { + navController.navigate(it.name) + } ) } } @@ -271,21 +265,27 @@ private fun AppBarTitle( currentRoute == ShowkaseCurrentScreen.SHOWKASE_CATEGORIES.name -> { ToolbarTitle(context.getString(R.string.showkase_title), modifier) } + currentRoute == ShowkaseCurrentScreen.COMPONENT_GROUPS.name -> { ToolbarTitle(context.getString(R.string.components_category), modifier) } + currentRoute == ShowkaseCurrentScreen.COLOR_GROUPS.name -> { ToolbarTitle(context.getString(R.string.colors_category), modifier) } + currentRoute == ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS.name -> { ToolbarTitle(context.getString(R.string.typography_category), modifier) } + currentRoute.insideGroup() -> { ToolbarTitle(currentGroup ?: "currentGroup", modifier) } + currentRoute == ShowkaseCurrentScreen.COMPONENT_STYLES.name -> { ToolbarTitle(currentComponentName.orEmpty(), modifier) } + currentRoute == ShowkaseCurrentScreen.COMPONENT_DETAIL.name -> { val styleName = currentComponentStyleName?.let { "[$it]" }.orEmpty() ToolbarTitle( @@ -380,9 +380,11 @@ private fun ShowkaseAppBarActions( when { isActive -> { } + currentRoute == ShowkaseCurrentScreen.COMPONENT_DETAIL.name || currentRoute == ShowkaseCurrentScreen.SHOWKASE_CATEGORIES.name -> { } + else -> { IconButton( modifier = modifier.testTag("SearchIcon"), @@ -403,7 +405,8 @@ internal fun ShowkaseBodyContent( groupedColorsMap: Map>, groupedTypographyMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit + onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val startDestination = startDestination( groupedColorsMap, @@ -420,9 +423,8 @@ internal fun ShowkaseBodyContent( groupedColorsMap, groupedTypographyMap, groupedComponentMap, - { - - } + onRootScreen = navController.currentDestination?.id == navController.graph.startDestinationId, + navigateTo = navigateTo ) } ) @@ -435,36 +437,62 @@ private fun startDestination( ) = when { groupedComponentMap.isOnlyCategory(groupedColorsMap, groupedTypographyMap) -> ShowkaseCurrentScreen.COMPONENT_GROUPS.name + groupedColorsMap.isOnlyCategory(groupedTypographyMap, groupedComponentMap) -> ShowkaseCurrentScreen.COLOR_GROUPS.name + groupedTypographyMap.isOnlyCategory(groupedColorsMap, groupedComponentMap) -> ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS.name + else -> ShowkaseCurrentScreen.SHOWKASE_CATEGORIES.name } private fun NavGraphBuilder.navGraph( - navController: NavHostController, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, groupedColorsMap: Map>, groupedTypographyMap: Map>, - groupedComponentMap: Map> + groupedComponentMap: Map>, + onRootScreen: Boolean, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) = when { groupedComponentMap.isOnlyCategory(groupedColorsMap, groupedTypographyMap) -> - componentsNavGraph(navController, groupedComponentMap, showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata) + componentsNavGraph( + groupedComponentMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, + ) + groupedColorsMap.isOnlyCategory(groupedTypographyMap, groupedComponentMap) -> - colorsNavGraph(navController, groupedColorsMap, showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata) + colorsNavGraph( + groupedColorsMap = groupedColorsMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, + ) + groupedTypographyMap.isOnlyCategory(groupedColorsMap, groupedComponentMap) -> - typographyNavGraph(navController, groupedTypographyMap, showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata) + typographyNavGraph( + groupedTypographyMap = groupedTypographyMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, + ) + else -> fullNavGraph( - navController, - groupedComponentMap, - groupedColorsMap, - groupedTypographyMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata + groupedComponentMap = groupedComponentMap, + groupedColorsMap = groupedColorsMap, + groupedTypographyMap = groupedTypographyMap, + onRootScreen = onRootScreen, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, ) } @@ -474,89 +502,97 @@ private fun Map>.isOnlyCategory( ) = this.values.isNotEmpty() && otherCategoryMap1.isEmpty() && otherCategoryMap2.isEmpty() private fun NavGraphBuilder.componentsNavGraph( - navController: NavHostController, groupedComponentMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit + onRootScreen: Boolean, + onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { composable(ShowkaseCurrentScreen.COMPONENT_GROUPS.name) { ShowkaseComponentGroupsScreen( - groupedComponentMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedComponentMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + navigateTo = navigateTo, ) } composable(ShowkaseCurrentScreen.COMPONENTS_IN_A_GROUP.name) { ShowkaseComponentsInAGroupScreen( - groupedComponentMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedComponentMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, ) } composable(ShowkaseCurrentScreen.COMPONENT_STYLES.name) { ShowkaseComponentStylesScreen( - groupedComponentMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedComponentMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, ) } composable(ShowkaseCurrentScreen.COMPONENT_DETAIL.name) { ShowkaseComponentDetailScreen( - groupedComponentMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedComponentMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo, + ) } } private fun NavGraphBuilder.colorsNavGraph( - navController: NavHostController, groupedColorsMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit + onRootScreen: Boolean, + onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { composable(ShowkaseCurrentScreen.COLOR_GROUPS.name) { ShowkaseColorGroupsScreen( - groupedColorsMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedColorsMap = groupedColorsMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo ) } composable(ShowkaseCurrentScreen.COLORS_IN_A_GROUP.name) { ShowkaseColorsInAGroupScreen( - groupedColorsMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedColorsMap = groupedColorsMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo ) } } private fun NavGraphBuilder.typographyNavGraph( - navController: NavHostController, groupedTypographyMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit + onRootScreen: Boolean, + onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { composable(ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS.name) { ShowkaseTypographyGroupsScreen( - groupedTypographyMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedTypographyMap = groupedTypographyMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateTo = navigateTo ) } composable(ShowkaseCurrentScreen.TYPOGRAPHY_IN_A_GROUP.name) { ShowkaseTypographyInAGroupScreen( - groupedTypographyMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedTypographyMap = groupedTypographyMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + navigateTo = navigateTo, ) } } @@ -565,38 +601,51 @@ private fun NavGraphBuilder.fullNavGraph( groupedComponentMap: Map>, groupedColorsMap: Map>, groupedTypographyMap: Map>, + onRootScreen: Boolean, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit + onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { composable(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES.name) { ShowkaseCategoriesScreen( showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, - navController, getCategoryMetadataMap( groupedComponentMap, groupedColorsMap, - groupedTypographyMap - ) + groupedTypographyMap, + ), + onNavigateToComponentGroups = { + navigateTo(ShowkaseCurrentScreen.COMPONENT_GROUPS) + }, + onNavigateToColorGroups = { + navigateTo(ShowkaseCurrentScreen.COLOR_GROUPS) + }, + onNavigateToTypographyGroups = { + navigateTo(ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS) + } ) } componentsNavGraph( - navController, groupedComponentMap, showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata, + navigateTo ) colorsNavGraph( - navController, groupedColorsMap, showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata, + navigateTo ) typographyNavGraph( - navController, groupedTypographyMap, showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata, + navigateTo ) } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseCategoriesScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseCategoriesScreen.kt index 695fb4ba..40743122 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseCategoriesScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseCategoriesScreen.kt @@ -1,11 +1,11 @@ package com.airbnb.android.showkase.ui +import android.util.Log import androidx.activity.compose.BackHandler import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavHostController import com.airbnb.android.showkase.models.ShowkaseBrowserScreenMetadata @@ -13,15 +13,16 @@ import com.airbnb.android.showkase.models.ShowkaseCategory import com.airbnb.android.showkase.models.ShowkaseCurrentScreen import com.airbnb.android.showkase.models.clear import com.airbnb.android.showkase.models.clearActiveSearch -import com.airbnb.android.showkase.models.update import java.util.Locale @Composable internal fun ShowkaseCategoriesScreen( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController, - categoryMetadataMap: Map + categoryMetadataMap: Map, + onNavigateToComponentGroups: () -> Unit, + onNavigateToColorGroups: () -> Unit, + onNavigateToTypographyGroups: () -> Unit, ) { val activity = LocalContext.current as AppCompatActivity LazyColumn { @@ -44,22 +45,16 @@ internal fun ShowkaseCategoriesScreen( ) ) when (category) { - ShowkaseCategory.COMPONENTS -> navController.navigate( - ShowkaseCurrentScreen.COMPONENT_GROUPS - ) - ShowkaseCategory.COLORS -> navController.navigate( - ShowkaseCurrentScreen.COLOR_GROUPS - ) - ShowkaseCategory.TYPOGRAPHY -> navController.navigate( - ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS - ) + ShowkaseCategory.COMPONENTS -> onNavigateToComponentGroups() + ShowkaseCategory.COLORS -> onNavigateToColorGroups() + ShowkaseCategory.TYPOGRAPHY -> onNavigateToTypographyGroups() } } ) } ) } - BackButtonHandler { + BackHandler { goBackFromCategoriesScreen(activity, showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata) } } @@ -72,26 +67,32 @@ private fun goBackFromCategoriesScreen( val isSearchActive = showkaseBrowserScreenMetadata.isSearchActive when { isSearchActive -> onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clearActiveSearch()) - else -> activity.finish() + else -> { + activity.finish() + } } } internal fun goBackToCategoriesScreen( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController, - onBackPressOnRoot: () -> Unit + onRootScreen: Boolean, + onBackToCategories: () -> Unit, + onBackPressOnRoot: () -> Unit, ) { when { showkaseBrowserScreenMetadata.isSearchActive -> { + Log.e("BackPressed", "isSearchActive") onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clearActiveSearch()) } - navController.currentDestination?.id == navController.graph.startDestinationId -> { + onRootScreen -> { + Log.e("BackPressed", "onRootScreen") onBackPressOnRoot() } else -> { + Log.e("BackPressed", "else") showkaseBrowserScreenMetadata.clear() - navController.navigate(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) + onBackToCategories() } } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseColorsInAGroupScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseColorsInAGroupScreen.kt index aae3429d..fe8cfeac 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseColorsInAGroupScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseColorsInAGroupScreen.kt @@ -34,7 +34,7 @@ internal fun ShowkaseColorsInAGroupScreen( groupedColorsMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val groupColorsList = groupedColorsMap[showkaseBrowserScreenMetadata.currentGroup] @@ -85,11 +85,11 @@ internal fun ShowkaseColorsInAGroupScreen( } ) } - BackButtonHandler { + BackHandler { goBackFromColorsInAGroupScreen( showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, - navController + navigateTo ) } } @@ -97,14 +97,14 @@ internal fun ShowkaseColorsInAGroupScreen( private fun goBackFromColorsInAGroupScreen( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val isSearchActive = showkaseBrowserScreenMetadata.isSearchActive when { isSearchActive -> onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clearActiveSearch()) else -> { onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clear()) - navController.navigate(ShowkaseCurrentScreen.COLOR_GROUPS) + navigateTo(ShowkaseCurrentScreen.COLOR_GROUPS) } } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentDetailScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentDetailScreen.kt index fc395b64..2d773bad 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentDetailScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentDetailScreen.kt @@ -2,7 +2,10 @@ package com.airbnb.android.showkase.ui import android.content.Context import android.content.res.Configuration +import androidx.activity.OnBackPressedDispatcher +import androidx.activity.OnBackPressedDispatcherOwner import androidx.activity.compose.BackHandler +import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -37,6 +40,7 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily @@ -46,7 +50,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.navigation.NavHostController +import androidx.lifecycle.Lifecycle import com.airbnb.android.showkase.R import com.airbnb.android.showkase.models.ShowkaseBrowserComponent import com.airbnb.android.showkase.models.ShowkaseBrowserScreenMetadata @@ -57,7 +61,7 @@ internal fun ShowkaseComponentDetailScreen( groupedComponentMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val componentMetadataList = groupedComponentMap[showkaseBrowserScreenMetadata.currentGroup] ?: return @@ -91,7 +95,7 @@ internal fun ShowkaseComponentDetailScreen( } ) } - BackButtonHandler { + BackHandler { back( onBackPressed = { onUpdateShowkaseBrowserScreenMetadata( @@ -102,7 +106,7 @@ internal fun ShowkaseComponentDetailScreen( ) ) }, - navController = navController + navigateTo = navigateTo ) } @@ -182,12 +186,15 @@ private fun DisplayScaledComponentCard(metadata: ShowkaseBrowserComponent) { @Composable private fun RTLComponentCard(metadata: ShowkaseBrowserComponent) { - ComponentCardTitle("${metadata.componentName} [RTL]") - val updatedModifier = Modifier.generateComposableModifier(metadata) - Card(modifier = Modifier.fillMaxWidth()) { - CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { - Column(modifier = updatedModifier) { - metadata.component() + val backPressedDispatcherOwner = rememberOnBackPressedDispatcherOwner() + CompositionLocalProvider(LocalOnBackPressedDispatcherOwner provides backPressedDispatcherOwner) { + ComponentCardTitle("${metadata.componentName} [RTL]") + val updatedModifier = Modifier.generateComposableModifier(metadata) + Card(modifier = Modifier.fillMaxWidth()) { + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { + Column(modifier = updatedModifier) { + metadata.component() + } } } } @@ -226,8 +233,21 @@ internal fun Modifier.generateComposableModifier(metadata: ShowkaseBrowserCompon private fun back( onBackPressed: () -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { onBackPressed() - navController.navigate(ShowkaseCurrentScreen.COMPONENT_STYLES) + navigateTo(ShowkaseCurrentScreen.COMPONENT_STYLES) +} + +@Composable +internal fun rememberOnBackPressedDispatcherOwner(): OnBackPressedDispatcherOwner { + val lifecycleOwner = LocalLifecycleOwner.current + return remember(lifecycleOwner) { + object : OnBackPressedDispatcherOwner { + override val lifecycle: Lifecycle + get() = lifecycleOwner.lifecycle + override val onBackPressedDispatcher: OnBackPressedDispatcher + get() = OnBackPressedDispatcher() + } + } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentStylesScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentStylesScreen.kt index e7d1ab3b..023be131 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentStylesScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentStylesScreen.kt @@ -16,7 +16,7 @@ internal fun ShowkaseComponentStylesScreen( groupedComponentMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val componentStylesList = groupedComponentMap[showkaseBrowserScreenMetadata.currentGroup] @@ -54,17 +54,17 @@ internal fun ShowkaseComponentStylesScreen( isSearchActive = false ) ) - navController.navigate(ShowkaseCurrentScreen.COMPONENT_DETAIL) + navigateTo(ShowkaseCurrentScreen.COMPONENT_DETAIL) } ) } ) } - BackButtonHandler { + BackHandler { back( showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, - navController + navigateTo ) } } @@ -81,7 +81,7 @@ private fun generatedStyleName( private fun back( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val isSearchActive = showkaseBrowserScreenMetadata.isSearchActive when { @@ -94,7 +94,7 @@ private fun back( searchQuery = null ) ) - navController.navigate(ShowkaseCurrentScreen.COMPONENTS_IN_A_GROUP) + navigateTo(ShowkaseCurrentScreen.COMPONENTS_IN_A_GROUP) } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentsInAGroupScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentsInAGroupScreen.kt index 97ac5640..b4d5ca19 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentsInAGroupScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseComponentsInAGroupScreen.kt @@ -16,7 +16,7 @@ internal fun ShowkaseComponentsInAGroupScreen( groupedComponentMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val groupByComponentName = groupedComponentMap[showkaseBrowserScreenMetadata.currentGroup] @@ -46,28 +46,28 @@ internal fun ShowkaseComponentsInAGroupScreen( isSearchActive = false ) ) - navController.navigate(ShowkaseCurrentScreen.COMPONENT_STYLES) + navigateTo(ShowkaseCurrentScreen.COMPONENT_STYLES) } ) } ) } - BackButtonHandler { - goBackFromComponentsInAGroupScreen(showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, navController) + BackHandler { + goBackFromComponentsInAGroupScreen(showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, navigateTo) } } private fun goBackFromComponentsInAGroupScreen( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val isSearchActive = showkaseBrowserScreenMetadata.isSearchActive when { isSearchActive -> onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clearActiveSearch()) else -> { showkaseBrowserScreenMetadata.clear() - navController.navigate(ShowkaseCurrentScreen.COMPONENT_GROUPS) + navigateTo(ShowkaseCurrentScreen.COMPONENT_GROUPS) } } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseGroupsScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseGroupsScreen.kt index 34d6b9e4..0897d4b2 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseGroupsScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseGroupsScreen.kt @@ -13,15 +13,15 @@ import com.airbnb.android.showkase.models.ShowkaseBrowserComponent import com.airbnb.android.showkase.models.ShowkaseBrowserScreenMetadata import com.airbnb.android.showkase.models.ShowkaseBrowserTypography import com.airbnb.android.showkase.models.ShowkaseCurrentScreen -import com.airbnb.android.showkase.models.update @Composable internal fun ShowkaseGroupsScreen( groupedTypographyMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, + onRootScreen: Boolean, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController, - onClick: () -> Unit + navigateToShowkaseCategories: () -> Unit, + onGroupClicked: () -> Unit, ) { val filteredMap = getFilteredSearchList( groupedTypographyMap.toSortedMap(), @@ -44,15 +44,22 @@ internal fun ShowkaseGroupsScreen( searchQuery = null ) ) - onClick() + onGroupClicked() } ) } ) } val activity = LocalContext.current as AppCompatActivity - BackButtonHandler { - goBackToCategoriesScreen(showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, navController) { + BackHandler { + goBackToCategoriesScreen( + showkaseBrowserScreenMetadata, + onUpdateShowkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onBackToCategories = { + navigateToShowkaseCategories() + } + ) { activity.finish() } } @@ -88,16 +95,20 @@ internal fun getFilteredSearchList( internal fun ShowkaseComponentGroupsScreen( groupedComponentMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, + onRootScreen: Boolean, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { ShowkaseGroupsScreen( - groupedComponentMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedTypographyMap = groupedComponentMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateToShowkaseCategories = { + navigateTo(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) + } ) { - navController.navigate(ShowkaseCurrentScreen.COMPONENTS_IN_A_GROUP) + navigateTo(ShowkaseCurrentScreen.COMPONENTS_IN_A_GROUP) } } @@ -105,16 +116,20 @@ internal fun ShowkaseComponentGroupsScreen( internal fun ShowkaseColorGroupsScreen( groupedColorsMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, + onRootScreen: Boolean, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { ShowkaseGroupsScreen( - groupedColorsMap, - showkaseBrowserScreenMetadata, - onUpdateShowkaseBrowserScreenMetadata, - navController + groupedTypographyMap = groupedColorsMap, + showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, + onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, + navigateToShowkaseCategories = { + navigateTo(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) + } ) { - navController.navigate(ShowkaseCurrentScreen.COLORS_IN_A_GROUP) + navigateTo(ShowkaseCurrentScreen.COLORS_IN_A_GROUP) } } @@ -122,8 +137,9 @@ internal fun ShowkaseColorGroupsScreen( internal fun ShowkaseTypographyGroupsScreen( groupedTypographyMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, + onRootScreen: Boolean, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { if (groupedTypographyMap.size == 1) { onUpdateShowkaseBrowserScreenMetadata( @@ -135,17 +151,21 @@ internal fun ShowkaseTypographyGroupsScreen( ShowkaseTypographyInAGroupScreen( groupedTypographyMap = groupedTypographyMap, showkaseBrowserScreenMetadata = showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, onUpdateShowkaseBrowserScreenMetadata = onUpdateShowkaseBrowserScreenMetadata, - navController = navController + navigateTo = navigateTo ) } else { ShowkaseGroupsScreen( groupedTypographyMap, showkaseBrowserScreenMetadata, + onRootScreen = onRootScreen, onUpdateShowkaseBrowserScreenMetadata, - navController + navigateToShowkaseCategories = { + navigateTo(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) + } ) { - navController.navigate(ShowkaseCurrentScreen.TYPOGRAPHY_IN_A_GROUP) + navigateTo(ShowkaseCurrentScreen.TYPOGRAPHY_IN_A_GROUP) } } } diff --git a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseTypographyInAGroupScreen.kt b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseTypographyInAGroupScreen.kt index 78c3aaad..16448385 100644 --- a/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseTypographyInAGroupScreen.kt +++ b/showkase/src/main/java/com/airbnb/android/showkase/ui/ShowkaseTypographyInAGroupScreen.kt @@ -27,8 +27,9 @@ import java.util.Locale internal fun ShowkaseTypographyInAGroupScreen( groupedTypographyMap: Map>, showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, + onRootScreen: Boolean, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, - navController: NavHostController + navigateTo: (ShowkaseCurrentScreen) -> Unit, ) { val activity = LocalContext.current as AppCompatActivity val groupTypographyList = @@ -58,12 +59,16 @@ internal fun ShowkaseTypographyInAGroupScreen( } ) } - BackButtonHandler { + BackHandler { goBackFromTypographyInAGroupScreen( showkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata, - groupedTypographyMap.size == 1, navController - ) { activity.finish() } + noGroups = groupedTypographyMap.size == 1, + onRootScreen = onRootScreen, + navigateTo = navigateTo, + ) { + activity.finish() + } } } @@ -71,23 +76,24 @@ private fun goBackFromTypographyInAGroupScreen( showkaseBrowserScreenMetadata: ShowkaseBrowserScreenMetadata, onUpdateShowkaseBrowserScreenMetadata: (ShowkaseBrowserScreenMetadata) -> Unit, noGroups: Boolean, - navController: NavHostController, - onBackPressOnRoot: () -> Unit + onRootScreen: Boolean, + navigateTo: (ShowkaseCurrentScreen) -> Unit, + onBackPressOnRoot: () -> Unit, ) { val isSearchActive = showkaseBrowserScreenMetadata.isSearchActive when { isSearchActive -> onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clearActiveSearch()) noGroups -> { onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clear()) - if (navController.currentDestination?.id == navController.graph.startDestinationId) { + if (onRootScreen) { onBackPressOnRoot() } else { - navController.navigate(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) + navigateTo(ShowkaseCurrentScreen.SHOWKASE_CATEGORIES) } } else -> { onUpdateShowkaseBrowserScreenMetadata(showkaseBrowserScreenMetadata.clear()) - navController.navigate(ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS) + navigateTo(ShowkaseCurrentScreen.TYPOGRAPHY_GROUPS) } } }