From dae7106100c8863599ff17aac14b38605d04134c Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 18 Nov 2025 20:24:06 +0000 Subject: [PATCH 1/4] Refactor migration recipe to be atomic This commit refactors the step-by-step migration recipe into a more direct, atomic "before and after" example. The previous `start` and `stepX` packages have been removed and replaced with `atomic/begin` and `atomic/end` packages. These new packages demonstrate the initial Navigation 2 state and the final migrated Navigation 3 state, respectively. Key changes include: * Refactoring the screen content into a shared `content` package to reduce duplication. * Deleting the intermediate migration step files and the legacy `Navigator`. * Updating the AndroidManifest to reflect the new activity names. * Renaming the associated instrumented test from `MigrationActivityNavigationTest` to `AtomicMigrationTest`. * Adding a `README.md` to explain the new atomic structure. --- ...vigationTest.kt => AtomicMigrationTest.kt} | 21 +- app/src/main/AndroidManifest.xml | 24 +- .../example/nav3recipes/migration/README.md | 5 - .../nav3recipes/migration/atomic/README.md | 7 + .../begin/BeginAtomicMigrationActivity.kt} | 132 ++------ .../migration/atomic/begin/NavRoutes.kt | 53 ++++ .../atomic/end/EndAtomicMigrationActivity.kt | 140 +++++++++ .../migration/atomic/end/NavRoutes.kt | 50 +++ .../nav3recipes/migration/content/Content.kt | 81 +++++ .../nav3recipes/migration/start/Navigator.kt | 215 ------------- .../migration/step2/Step2MigrationActivity.kt | 272 ----------------- .../migration/step3/Step3MigrationActivity.kt | 266 ---------------- .../migration/step4/Step4MigrationActivity.kt | 278 ----------------- .../migration/step5/Step5MigrationActivity.kt | 275 ----------------- .../migration/step6/Step6MigrationActivity.kt | 289 ------------------ .../nav3recipes/migration/step7/Navigator.kt | 243 --------------- .../migration/step7/Step7MigrationActivity.kt | 213 ------------- .../nav3recipes/multiplestacks/Navigator.kt | 1 - 18 files changed, 359 insertions(+), 2206 deletions(-) rename app/src/androidTest/java/com/example/nav3recipes/{MigrationActivityNavigationTest.kt => AtomicMigrationTest.kt} (83%) delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/README.md create mode 100644 app/src/main/java/com/example/nav3recipes/migration/atomic/README.md rename app/src/main/java/com/example/nav3recipes/migration/{start/StartMigrationActivity.kt => atomic/begin/BeginAtomicMigrationActivity.kt} (54%) create mode 100644 app/src/main/java/com/example/nav3recipes/migration/atomic/begin/NavRoutes.kt create mode 100644 app/src/main/java/com/example/nav3recipes/migration/atomic/end/EndAtomicMigrationActivity.kt create mode 100644 app/src/main/java/com/example/nav3recipes/migration/atomic/end/NavRoutes.kt create mode 100644 app/src/main/java/com/example/nav3recipes/migration/content/Content.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/start/Navigator.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step2/Step2MigrationActivity.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step3/Step3MigrationActivity.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step4/Step4MigrationActivity.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step5/Step5MigrationActivity.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step6/Step6MigrationActivity.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt delete mode 100644 app/src/main/java/com/example/nav3recipes/migration/step7/Step7MigrationActivity.kt diff --git a/app/src/androidTest/java/com/example/nav3recipes/MigrationActivityNavigationTest.kt b/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt similarity index 83% rename from app/src/androidTest/java/com/example/nav3recipes/MigrationActivityNavigationTest.kt rename to app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt index ce57b61c..27af52e1 100644 --- a/app/src/androidTest/java/com/example/nav3recipes/MigrationActivityNavigationTest.kt +++ b/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt @@ -8,13 +8,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.espresso.Espresso -import com.example.nav3recipes.migration.start.StartMigrationActivity -import com.example.nav3recipes.migration.step2.Step2MigrationActivity -import com.example.nav3recipes.migration.step3.Step3MigrationActivity -import com.example.nav3recipes.migration.step4.Step4MigrationActivity -import com.example.nav3recipes.migration.step5.Step5MigrationActivity -import com.example.nav3recipes.migration.step6.Step6MigrationActivity -import com.example.nav3recipes.migration.step7.Step7MigrationActivity +import com.example.nav3recipes.migration.atomic.test.StartAtomicMigrationActivity import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -22,10 +16,10 @@ import org.junit.runners.Parameterized import org.junit.runners.Parameterized.Parameters /** - * Instrumented navigation tests for each of the migration steps. + * Instrumented navigation tests for the start and end states of the atomic migration guide. */ @RunWith(Parameterized::class) -class MigrationActivityNavigationTest(activityClass: Class) { +class AtomicMigrationTest(activityClass: Class) { @get:Rule(order = 0) val composeTestRule = createAndroidComposeRule(activityClass) @@ -35,13 +29,8 @@ class MigrationActivityNavigationTest(activityClass: Class> { return listOf( - arrayOf(StartMigrationActivity::class.java), - arrayOf(Step2MigrationActivity::class.java), - arrayOf(Step3MigrationActivity::class.java), - arrayOf(Step4MigrationActivity::class.java), - arrayOf(Step5MigrationActivity::class.java), - arrayOf(Step6MigrationActivity::class.java), - arrayOf(Step7MigrationActivity::class.java) + arrayOf(StartAtomicMigrationActivity::class.java), + //arrayOf(Step2AtomicMigrationActivity::class.java) ) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0dfbb7c..624191f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -114,31 +114,11 @@ android:label="@string/app_name" android:theme="@style/Theme.Nav3Recipes"/> - - - - - A, A1, E - * B -> B, B1, E - * C -> C, E + * A -> A, A1 + * B -> B, B1 + * C -> C * D * * - The starting destination (or home screen) is A. * - A, B and C are top level destinations that appear in a navigation bar. * - D is a dialog destination. - * - E is a shared destination that can appear under any of the top level destinations. - * - Navigating to a top level destination pops all other top level destinations off the stack, + * - Navigating to a top level destination pops all other top level destinations off the stack, * except for the start destination. * - Navigating back from the start destination exits the app. * * This will be the starting point for migration to Navigation 3. * - * @see `MigrationActivityNavigationTest` for instrumented tests that verify this behavior. + * @see `AtomicMigrationTest` for instrumented tests that verify this behavior. */ - -// Feature module A -@Serializable private data object BaseRouteA -@Serializable private data object RouteA -@Serializable private data object RouteA1 - -// Feature module B -@Serializable private data object BaseRouteB -@Serializable private data object RouteB -@Serializable private data class RouteB1(val id: String) - -// Feature module C -@Serializable private data object BaseRouteC -@Serializable private data object RouteC - -// Common UI modules -@Serializable private data object RouteD -@Serializable private data object RouteE - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -class NavBarItem( - val icon: ImageVector, - val description: String -) - -class StartMigrationActivity : ComponentActivity() { +class BeginAtomicMigrationActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() @@ -150,16 +109,13 @@ class StartMigrationActivity : ComponentActivity() { featureASection( onSubRouteClick = { navController.navigate(RouteA1) }, onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } ) featureBSection( onDetailClick = { id -> navController.navigate(RouteB1(id)) }, onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } ) featureCSection( onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } ) dialog { key -> Text(modifier = Modifier.background(Color.White), text = "Route D title (dialog)") @@ -173,78 +129,32 @@ class StartMigrationActivity : ComponentActivity() { // Feature module A private fun NavGraphBuilder.featureASection( onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, + onDialogClick: () -> Unit ) { navigation(startDestination = RouteA) { - composable { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentPink("Route A1 title") } - composable { ContentBlue("Route E title") } + composable { ScreenA(onSubRouteClick, onDialogClick) } + composable { ScreenA1() } } } + // Feature module B private fun NavGraphBuilder.featureBSection( onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit + onDialogClick: () -> Unit ) { navigation(startDestination = RouteB) { - composable { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { key -> - ContentPurple("Route B1 title. ID: ${key.toRoute().id}") - } - composable { ContentBlue("Route E title") } + composable { ScreenB(onDetailClick, onDialogClick) } + composable { key -> ScreenB1(id = key.toRoute().id) } } } // Feature module C private fun NavGraphBuilder.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, + onDialogClick: () -> Unit ) { navigation(startDestination = RouteC) { - composable { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentBlue("Route E title") } + composable { ScreenC(onDialogClick) } } } diff --git a/app/src/main/java/com/example/nav3recipes/migration/atomic/begin/NavRoutes.kt b/app/src/main/java/com/example/nav3recipes/migration/atomic/begin/NavRoutes.kt new file mode 100644 index 00000000..bf6f5b23 --- /dev/null +++ b/app/src/main/java/com/example/nav3recipes/migration/atomic/begin/NavRoutes.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.nav3recipes.migration.atomic.begin + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Camera +import androidx.compose.material.icons.filled.Face +import androidx.compose.material.icons.filled.Home +import androidx.compose.ui.graphics.vector.ImageVector +import kotlinx.serialization.Serializable + +// Feature module A +@Serializable data object BaseRouteA +@Serializable data object RouteA +@Serializable data object RouteA1 + +// Feature module B +@Serializable data object BaseRouteB +@Serializable data object RouteB +@Serializable data class RouteB1(val id: String) + +// Feature module C +@Serializable data object BaseRouteC +@Serializable data object RouteC + +// Common UI modules +@Serializable data object RouteD + + +val TOP_LEVEL_ROUTES = mapOf( + BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), + BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), + BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), +) + +class NavBarItem( + val icon: ImageVector, + val description: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/atomic/end/EndAtomicMigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/atomic/end/EndAtomicMigrationActivity.kt new file mode 100644 index 00000000..451b5ab5 --- /dev/null +++ b/app/src/main/java/com/example/nav3recipes/migration/atomic/end/EndAtomicMigrationActivity.kt @@ -0,0 +1,140 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.nav3recipes.migration.atomic.end + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.navigation3.runtime.EntryProviderScope +import androidx.navigation3.runtime.NavKey +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.scene.DialogSceneStrategy +import androidx.navigation3.ui.NavDisplay +import com.example.nav3recipes.migration.content.ScreenA +import com.example.nav3recipes.migration.content.ScreenA1 +import com.example.nav3recipes.migration.content.ScreenB +import com.example.nav3recipes.migration.content.ScreenB1 +import com.example.nav3recipes.migration.content.ScreenC +import com.example.nav3recipes.multiplestacks.Navigator +import com.example.nav3recipes.multiplestacks.rememberNavigationState +import com.example.nav3recipes.multiplestacks.toEntries +import com.example.nav3recipes.ui.setEdgeToEdgeConfig + + +class EndAtomicMigrationActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + setEdgeToEdgeConfig() + super.onCreate(savedInstanceState) + + setContent { + + val navigationState = rememberNavigationState( + startRoute = RouteA, + topLevelRoutes = TOP_LEVEL_ROUTES.keys + ) + + val navigator = remember { Navigator(navigationState) } + + val entryProvider = entryProvider { + featureASection( + onSubRouteClick = { navigator.navigate(RouteA1) }, + onDialogClick = { navigator.navigate(RouteD) }, + ) + featureBSection( + onDetailClick = { id -> navigator.navigate(RouteB1(id)) }, + onDialogClick = { navigator.navigate(RouteD) }, + ) + featureCSection( + onDialogClick = { navigator.navigate(RouteD) }, + ) + entry(metadata = DialogSceneStrategy.dialog()) { + Text( + modifier = Modifier.background(Color.White), + text = "Route D title (dialog)" + ) + } + } + + Scaffold(bottomBar = { + NavigationBar { + TOP_LEVEL_ROUTES.forEach { (key, value) -> + val isSelected = key == navigationState.topLevelRoute + NavigationBarItem( + selected = isSelected, + onClick = { + navigator.navigate(key) + }, + icon = { + Icon( + imageVector = value.icon, + contentDescription = value.description + ) + }, + label = { Text(value.description) } + ) + } + } + }) + + { paddingValues -> + NavDisplay( + entries = navigationState.toEntries(entryProvider), + onBack = { navigator.goBack() }, + sceneStrategy = remember { DialogSceneStrategy() }, + modifier = Modifier.padding(paddingValues) + ) + } + } + } +} + +// Feature module A +private fun EntryProviderScope.featureASection( + onSubRouteClick: () -> Unit, + onDialogClick: () -> Unit +) { + entry { ScreenA(onSubRouteClick, onDialogClick) } + entry { ScreenA1() } +} + + +// Feature module B +private fun EntryProviderScope.featureBSection( + onDetailClick: (id: String) -> Unit, + onDialogClick: () -> Unit +) { + entry { ScreenB(onDetailClick, onDialogClick) } + entry { key -> ScreenB1(id = key.id) } +} + +// Feature module C +private fun EntryProviderScope.featureCSection( + onDialogClick: () -> Unit +) { + entry { ScreenC(onDialogClick) } +} diff --git a/app/src/main/java/com/example/nav3recipes/migration/atomic/end/NavRoutes.kt b/app/src/main/java/com/example/nav3recipes/migration/atomic/end/NavRoutes.kt new file mode 100644 index 00000000..bf145b01 --- /dev/null +++ b/app/src/main/java/com/example/nav3recipes/migration/atomic/end/NavRoutes.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.nav3recipes.migration.atomic.end + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Camera +import androidx.compose.material.icons.filled.Face +import androidx.compose.material.icons.filled.Home +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.navigation3.runtime.NavKey +import kotlinx.serialization.Serializable + +// Feature module A +@Serializable data object RouteA : NavKey +@Serializable data object RouteA1 : NavKey + +// Feature module B +@Serializable data object RouteB : NavKey +@Serializable data class RouteB1(val id: String) : NavKey + +// Feature module C +@Serializable data object RouteC : NavKey + +// Common UI modules +@Serializable data object RouteD : NavKey + +val TOP_LEVEL_ROUTES = mapOf( + RouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), + RouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), + RouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), +) + +class NavBarItem( + val icon: ImageVector, + val description: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/content/Content.kt b/app/src/main/java/com/example/nav3recipes/migration/content/Content.kt new file mode 100644 index 00000000..5734b825 --- /dev/null +++ b/app/src/main/java/com/example/nav3recipes/migration/content/Content.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.nav3recipes.migration.content + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import com.example.nav3recipes.content.ContentGreen +import com.example.nav3recipes.content.ContentMauve +import com.example.nav3recipes.content.ContentPink +import com.example.nav3recipes.content.ContentPurple +import com.example.nav3recipes.content.ContentRed + + +@Composable +fun ScreenA(onSubRouteClick: () -> Unit, onDialogClick: () -> Unit) { + ContentRed("Route A title") { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Button(onClick = onSubRouteClick) { + Text("Go to A1") + } + Button(onClick = onDialogClick) { + Text("Open dialog D") + } + } + } +} + +@Composable +fun ScreenA1() { + ContentPink("Route A1 title") +} + +@Composable +fun ScreenB( + onDetailClick: (String) -> Unit, + onDialogClick: () -> Unit +) { + ContentGreen("Route B title") { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Button(onClick = { onDetailClick("ABC") }) { + Text("Go to B1") + } + Button(onClick = onDialogClick) { + Text("Open dialog D") + } + } + } +} + +@Composable +fun ScreenB1(id: String) { + ContentPurple("Route B1 title. ID: $id") +} + +@Composable +fun ScreenC(onDialogClick: () -> Unit) { + ContentMauve("Route C title") { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Button(onClick = onDialogClick) { + Text("Open dialog D") + } + } + } +} diff --git a/app/src/main/java/com/example/nav3recipes/migration/start/Navigator.kt b/app/src/main/java/com/example/nav3recipes/migration/start/Navigator.kt deleted file mode 100644 index cb679312..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/start/Navigator.kt +++ /dev/null @@ -1,215 +0,0 @@ -package com.example.nav3recipes.migration.start - -import android.annotation.SuppressLint -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue -import androidx.navigation.NavBackStackEntry -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavHostController -import androidx.navigation.NavOptions -import androidx.navigation.toRoute -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * Navigator that mirrors `NavController`'s back stack - * - * @param navController - The NavController whose back stack to mirror - * @param coroutineScope - Scope used to collect changes from the NavController - * @param entryToRouteMapper - Lambda that converts an entry in NavController's back stack - * into a route that is stored in the `Navigator`'s back stack. - * - * For example: { entry -> entry.toRouteOrNull() ?: entry.toRouteOrNull() } - * - * @param shouldPrintDebugInfo - Prints debug info to logcat - */ -@SuppressLint("RestrictedApi") -class Navigator( - private val navController: NavHostController, - coroutineScope: CoroutineScope, - entryToRouteMapper: (NavBackStackEntry) -> Any? = { null }, - private val shouldPrintDebugInfo: Boolean = false -) { - - private val startRoute = Unit - - val backStack = mutableStateListOf(startRoute) - var topLevelRoute by mutableStateOf(startRoute) - private set - - // Maintain a stack for each top level route - private lateinit var topLevelStacks : MutableMap> - - // Maintain a map of shared routes to their parent stacks - private var sharedRoutes: MutableMap = mutableMapOf() - - init { - inititalizeTopLevelStacks() - coroutineScope.launch { - navController.currentBackStack.collect { nav2BackStack -> - inititalizeTopLevelStacks() - navlog("Top level stacks reset, parsing Nav2 back stack $nav2BackStack") - printTopLevelStacks() - - nav2BackStack.forEach { entry -> - val destination = entry.destination - - if (destination.navigatorName == "composable" || destination.navigatorName == "dialog"){ - val route = entryToRouteMapper(entry) ?: entry - add(route) - } else { - navlog("Ignoring $entry") - } - } - printTopLevelStacks() - updateBackStack() - } - } - } - - private fun updateBackStack() { - backStack.apply { - clear() - val entries = topLevelStacks.flatMap { it.value } - addAll(entries) - } - printBackStack() - } - - fun navlog(message: String){ - if (shouldPrintDebugInfo){ - println(message) - } - } - - private fun printBackStack() { - navlog("Back stack: ${backStack.getDebugString()}") - } - - private fun printTopLevelStacks() { - - navlog("Top level stacks: ") - topLevelStacks.forEach { topLevelStack -> - navlog(" ${topLevelStack.key} => ${topLevelStack.value.getDebugString()}") - } - } - - private fun List.getDebugString() : String { - val message = StringBuilder("[") - forEach { entry -> - if (entry is NavBackStackEntry){ - message.append("Unmigrated route: ${entry.destination.route}, ") - } else { - message.append("Migrated route: $entry, ") - } - } - message.append("]\n") - return message.toString() - } - - private fun addTopLevel(route: Any) { - if (route == startRoute) { - clearAllExceptStartStack() - } else { - - // Get the existing stack or create a new one. - val topLevelStack = topLevelStacks.remove(route) ?: mutableListOf(route) - clearAllExceptStartStack() - - topLevelStacks.put(route, topLevelStack) - navlog("Added top level route $route") - } - topLevelRoute = route - } - - private fun clearAllExceptStartStack() { - // Remove all other top level stacks, except the start stack - val startStack = topLevelStacks[startRoute] ?: mutableListOf(startRoute) - topLevelStacks.clear() - topLevelStacks.put(startRoute, startStack) - } - - private fun inititalizeTopLevelStacks() { - topLevelStacks = mutableMapOf(startRoute to mutableListOf(startRoute)) - topLevelRoute = startRoute - } - - private fun add(route: Any) { - navlog("Attempting to add $route") - if (route is Route.TopLevel) { - navlog("$route is a top level route") - addTopLevel(route) - } else { - if (route is Route.Shared) { - navlog("$route is a shared route") - // If the key is already in a stack, remove it - val oldParent = sharedRoutes[route] - if (oldParent != null) { - topLevelStacks[oldParent]?.remove(route) - } - sharedRoutes[route] = topLevelRoute - } else { - navlog("$route is a normal route") - } - val hasBeenAdded = topLevelStacks[topLevelRoute]?.add(route) ?: false - navlog("Added $route to $topLevelRoute stack: $hasBeenAdded") - } - } - - /** - * Navigate to the given route. - */ - fun navigate(route: Any, navOptions: NavOptions? = null) { - navController.navigate(route, navOptions) - - // Uncomment the code below and delete the line above as per migration guide - /* - add(route) - updateBackStack() - */ - } - - /** - * Go back to the previous route. - */ - fun goBack() { - navController.popBackStack() - - // Uncomment the code below and delete the line above as per migration guide - /* - if (backStack.size <= 1) { - return - } - val removedKey = topLevelStacks[topLevelRoute]?.removeLastOrNull() - // If the removed key was a top level key, remove the associated top level stack - topLevelStacks.remove(removedKey) - topLevelRoute = topLevelStacks.keys.last() - updateBackStack() - */ - } -} - -/** - * Tries to convert a [NavBackStackEntry] to a route of type [T]. - * Returns the typed route if the entry's destination matches [T], otherwise returns null. - */ -inline fun NavBackStackEntry.toRouteOrNull(): T? = - if (destination.hasRoute()) toRoute() else null - -/** - * A marker interface for navigation routes. - * - * - Implementing the base interface, `Route`, indicates that this is a standard navigation route - * - Implementing the `TopLevel` interface indicates that this is a top level route, and has a - * sub stack of `Route`s - * - Implementing the `Shared` interface indicates that this route can be placed onto any sub stack, - * it is shared between top level stacks. - * - * @see `Navigator` for how these types are handled. - */ -sealed interface Route { - interface TopLevel : Route - interface Shared : Route -} diff --git a/app/src/main/java/com/example/nav3recipes/migration/step2/Step2MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step2/Step2MigrationActivity.kt deleted file mode 100644 index 240aa791..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step2/Step2MigrationActivity.kt +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step2 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog -import androidx.navigation.compose.navigation -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import androidx.navigation.toRoute -import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.migration.start.Navigator -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable -import kotlin.reflect.KClass - -@Serializable -private data object BaseRouteA - -@Serializable -private data object RouteA - -@Serializable -private data object RouteA1 - -@Serializable -private data object BaseRouteB - -@Serializable -private data object RouteB - -@Serializable -private data class RouteB1(val id: String) - -@Serializable -private data object BaseRouteC - -@Serializable -private data object RouteC - -@Serializable -private data object RouteD - -@Serializable -private data object RouteE - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - -class Step2MigrationActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - setContent { - val coroutineScope = rememberCoroutineScope() - val navController = rememberNavController() - val navigator = remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope - ) - } - val currentBackStackEntry by navController.currentBackStackEntryAsState() - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = - currentBackStackEntry?.destination.isRouteInHierarchy(key::class) - NavigationBarItem( - selected = isSelected, - onClick = { - navController.navigate(key, navOptions { - popUpTo(route = RouteA) - }) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - Box(modifier = Modifier.padding(paddingValues)) { - NavHost( - navController = navController, - startDestination = BaseRouteA, - ) { - featureASection( - onSubRouteClick = { navController.navigate(RouteA1) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - featureBSection( - onDetailClick = { id -> navController.navigate(RouteB1(id)) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - featureCSection( - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - dialog { key -> - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - } - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - entryProvider = entryProvider( - fallback = { key -> - NavEntry(key = key) {} - } - ) { - // No nav entries added yet. - } - ) - } - } - } - } -} - -private fun NavGraphBuilder.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteA) { - composable { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentPink("Route A1 title") } - composable { ContentBlue("Route E title") } - } -} - -private fun NavGraphBuilder.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - navigation(startDestination = RouteB) { - composable { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { key -> - ContentPurple("Route B1 title. ID: ${key.toRoute().id}") - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavGraphBuilder.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteC) { - composable { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = - this?.hierarchy?.any { - it.hasRoute(route) - } ?: false \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/step3/Step3MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step3/Step3MigrationActivity.kt deleted file mode 100644 index 728a5a87..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step3/Step3MigrationActivity.kt +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step3 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog -import androidx.navigation.compose.navigation -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import androidx.navigation.toRoute -import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.migration.start.Navigator -import com.example.nav3recipes.migration.start.Route -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable -import kotlin.reflect.KClass - -@Serializable -private data object BaseRouteA -@Serializable -private data object RouteA -@Serializable -private data object RouteA1 - -@Serializable -private data object BaseRouteB -@Serializable -private data object RouteB : Route.TopLevel -@Serializable -private data class RouteB1(val id: String) - -@Serializable -private data object BaseRouteC -@Serializable -private data object RouteC -@Serializable -private data object RouteD -@Serializable -private data object RouteE : Route.Shared - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - -class Step3MigrationActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - setContent { - val coroutineScope = rememberCoroutineScope() - val navController = rememberNavController() - val navigator = remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope - ) - } - val currentBackStackEntry by navController.currentBackStackEntryAsState() - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = - currentBackStackEntry?.destination.isRouteInHierarchy(key::class) - NavigationBarItem( - selected = isSelected, - onClick = { - navController.navigate(key, navOptions { - popUpTo(route = RouteA) - }) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - Box(modifier = Modifier.padding(paddingValues)) { - NavHost( - navController = navController, - startDestination = BaseRouteA - ) { - featureASection( - onSubRouteClick = { navController.navigate(RouteA1) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - featureBSection( - onDetailClick = { id -> navController.navigate(RouteB1(id)) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - featureCSection( - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - dialog { key -> - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - } - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - entryProvider = entryProvider( - fallback = { key -> - NavEntry(key = key) {} - } - ) { - // No nav entries added yet. - } - ) - } - } - } - } -} - -private fun NavGraphBuilder.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteA) { - composable { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentPink("Route A1 title") } - composable { ContentBlue("Route E title") } - } -} - -private fun NavGraphBuilder.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - navigation(startDestination = RouteB) { - composable { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { key -> - ContentPurple("Route B1 title. ID: ${key.toRoute().id}") - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavGraphBuilder.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteC) { - composable { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = - this?.hierarchy?.any { - it.hasRoute(route) - } ?: false \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/step4/Step4MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step4/Step4MigrationActivity.kt deleted file mode 100644 index adb384b0..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step4/Step4MigrationActivity.kt +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step4 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog -import androidx.navigation.compose.navigation -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import androidx.navigation3.runtime.EntryProviderScope -import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.migration.start.Navigator -import com.example.nav3recipes.migration.start.Route -import com.example.nav3recipes.migration.start.toRouteOrNull -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable -import kotlin.reflect.KClass - -@Serializable -private data object BaseRouteA -@Serializable -private data object RouteA -@Serializable -private data object RouteA1 - -@Serializable -private data object BaseRouteB -@Serializable -private data object RouteB : Route.TopLevel -@Serializable -private data class RouteB1(val id: String) - -@Serializable -private data object BaseRouteC -@Serializable -private data object RouteC -@Serializable -private data object RouteD -@Serializable -private data object RouteE : Route.Shared - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - - -class Step4MigrationActivity : ComponentActivity() { - - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - - setContent { - val coroutineScope = rememberCoroutineScope() - val navController = rememberNavController() - val navigator = - remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope, - entryToRouteMapper = { entry -> - entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - } - ) - } - val currentBackStackEntry by navController.currentBackStackEntryAsState() - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = - currentBackStackEntry?.destination.isRouteInHierarchy(key::class) - NavigationBarItem( - selected = isSelected, - onClick = { - navController.navigate(key, navOptions { - popUpTo(route = RouteA) - }) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - Box(modifier = Modifier.padding(paddingValues)) { - NavHost( - navController = navController, - startDestination = BaseRouteA - ) { - featureASection( - onSubRouteClick = { navController.navigate(RouteA1) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - navigation(startDestination = RouteB) { - composable {} - composable {} - composable {} - } - featureCSection( - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - dialog { key -> - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - } - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - entryProvider = entryProvider( - fallback = { key -> - NavEntry(key = key) {} - } - ) { - featureBSection( - onDetailClick = { id -> navController.navigate(RouteB1(id)) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - } - ) - } - } - } - } -} - -private fun NavGraphBuilder.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteA) { - composable { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentPink("Route A1 title") } - composable { ContentBlue("Route E title") } - } -} - -private fun EntryProviderScope.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - entry { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { key -> - ContentPurple("Route B1 title. ID: ${key.id}") - } - entry { ContentBlue("Route E title") } -} - -private fun NavGraphBuilder.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteC) { - composable { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = - this?.hierarchy?.any { - it.hasRoute(route) - } ?: false \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/step5/Step5MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step5/Step5MigrationActivity.kt deleted file mode 100644 index ff5785be..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step5/Step5MigrationActivity.kt +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step5 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog -import androidx.navigation.compose.navigation -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import androidx.navigation3.runtime.EntryProviderScope -import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.migration.start.Navigator -import com.example.nav3recipes.migration.start.Route -import com.example.nav3recipes.migration.start.toRouteOrNull -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable -import kotlin.reflect.KClass - -@Serializable -data object BaseRouteA -@Serializable -data object RouteA -@Serializable -data object RouteA1 - -@Serializable -data object BaseRouteB -@Serializable -data object RouteB : Route.TopLevel -@Serializable -data class RouteB1(val id: String) - -@Serializable -data object BaseRouteC -@Serializable -data object RouteC -@Serializable -data object RouteD -@Serializable -data object RouteE - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - - -class Step5MigrationActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - setContent { - val coroutineScope = rememberCoroutineScope() - val navController = rememberNavController() - val navigator = remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope, - entryToRouteMapper = { entry -> - entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - } - ) - } - val currentBackStackEntry by navController.currentBackStackEntryAsState() - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = - currentBackStackEntry?.destination.isRouteInHierarchy(key::class) - NavigationBarItem( - selected = isSelected, - onClick = { - navController.navigate(key, navOptions { - popUpTo(route = RouteA) - }) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - Box(modifier = Modifier.padding(paddingValues)) { - NavHost( - navController = navController, - startDestination = BaseRouteA - ) { - featureASection( - onSubRouteClick = { navController.navigate(RouteA1) }, - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - navigation(startDestination = RouteB) { - composable {} - composable {} - composable {} - } - featureCSection( - onDialogClick = { navController.navigate(RouteD) }, - onOtherClick = { navController.navigate(RouteE) } - ) - dialog { key -> - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - } - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - entryProvider = entryProvider( - fallback = { key -> - NavEntry(key = key) {} - } - ) { - featureBSection( - onDetailClick = { id -> navigator.navigate(RouteB1(id)) }, - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - } - ) - } - } - } - } -} - -private fun NavGraphBuilder.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteA) { - composable { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentPink("Route A1 title") } - composable { ContentBlue("Route E title") } - } -} - -private fun EntryProviderScope.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - entry { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { key -> - ContentPurple("Route B1 title. ID: ${key.id}") - } - entry { ContentBlue("Route E title") } - } - -private fun NavGraphBuilder.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - navigation(startDestination = RouteC) { - composable { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - composable { ContentBlue("Route E title") } - } -} - -private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = - this?.hierarchy?.any { - it.hasRoute(route) - } ?: false \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/step6/Step6MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step6/Step6MigrationActivity.kt deleted file mode 100644 index b2305bdf..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step6/Step6MigrationActivity.kt +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step6 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation.NavDestination -import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.navigation.NavDestination.Companion.hierarchy -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog -import androidx.navigation.compose.navigation -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import androidx.navigation3.runtime.EntryProviderScope -import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.scene.DialogSceneStrategy -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.migration.start.Navigator -import com.example.nav3recipes.migration.start.Route -import com.example.nav3recipes.migration.start.toRouteOrNull -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable -import kotlin.reflect.KClass - -@Serializable -data object BaseRouteA -@Serializable -data object RouteA : Route.TopLevel -@Serializable -data object RouteA1 - -@Serializable -data object BaseRouteB -@Serializable -data object RouteB : Route.TopLevel -@Serializable -data class RouteB1(val id: String) - -@Serializable -data object BaseRouteC -@Serializable -data object RouteC : Route.TopLevel -@Serializable -data object RouteD -@Serializable -data object RouteE : Route.Shared - -private val TOP_LEVEL_ROUTES = mapOf( - BaseRouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - BaseRouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - BaseRouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - - -class Step6MigrationActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - setContent { - val coroutineScope = rememberCoroutineScope() - val navController = rememberNavController() - val navigator = remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope, - entryToRouteMapper = { entry -> - entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - ?: entry.toRouteOrNull() - } - ) - } - val currentBackStackEntry by navController.currentBackStackEntryAsState() - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = - currentBackStackEntry?.destination.isRouteInHierarchy(key::class) - NavigationBarItem( - selected = isSelected, - onClick = { - navController.navigate(key, navOptions { - popUpTo(route = RouteA) - }) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - Box(modifier = Modifier.padding(paddingValues)) { - // Base Layer: Legacy NavHost is always in the composition tree. - NavHost( - navController = navController, - startDestination = BaseRouteA - ) { - // All routes are now rendered by NavDisplay, so these are all empty. - navigation(startDestination = RouteA) { - composable {} - composable {} - composable {} - } - navigation(startDestination = RouteB) { - composable {} - composable {} - composable {} - } - navigation(startDestination = RouteC) { - composable {} - composable {} - } - dialog {} - } - - // Overlay Layer: NavDisplay for all screens. - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - sceneStrategy = remember { DialogSceneStrategy() }, - entryProvider = entryProvider( - fallback = { key -> - // Should ideally not be called if all routes are migrated. - NavEntry(key = key) {} - } - ) { - featureASection( - onSubRouteClick = { navigator.navigate(RouteA1) }, - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - featureBSection( - onDetailClick = { id -> navigator.navigate(RouteB1(id)) }, - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - featureCSection( - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - entry(metadata = DialogSceneStrategy.dialog()) { - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - } - ) - } - } - } - } -} - -private fun EntryProviderScope.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - entry { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { ContentPink("Route A1 title") } - entry { ContentBlue("Route E title") } -} - -private fun EntryProviderScope.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - entry { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { key -> - ContentPurple("Route B1 title. ID: ${key.id}") - } -} - -private fun EntryProviderScope.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - entry { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } -} - -private fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = - this?.hierarchy?.any { - it.hasRoute(route) - } ?: false \ No newline at end of file diff --git a/app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt b/app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt deleted file mode 100644 index f44fc7fa..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt +++ /dev/null @@ -1,243 +0,0 @@ -package com.example.nav3recipes.migration.step7 - -import android.annotation.SuppressLint -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.Saver -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.savedstate.SavedState -import androidx.savedstate.read -import androidx.savedstate.serialization.decodeFromSavedState -import androidx.savedstate.serialization.encodeToSavedState -import androidx.savedstate.write -import kotlinx.serialization.Serializable -import kotlin.collections.component1 -import kotlin.collections.component2 -import kotlin.collections.iterator - -@SuppressLint("RestrictedApi") -class Navigator ( - private var startRoute: Route, - private var shouldPrintDebugInfo: Boolean = false, -) { - - val backStack = mutableStateListOf(startRoute) - var topLevelRoute by mutableStateOf(startRoute) - private set - - // Maintain a stack for each top level route - private val topLevelStacks = mutableMapOf(startRoute to mutableListOf(startRoute)) - - // Maintain a map of shared routes to their parent stacks - private var sharedRoutes : MutableMap = mutableMapOf() - - private fun updateBackStack() { - backStack.apply { - clear() - val entries = topLevelStacks.flatMap { it.value } - addAll(entries) - } - printBackStack() - } - - fun navlog(message: String){ - if (shouldPrintDebugInfo){ - println(message) - } - } - - private fun printBackStack() { - navlog("Back stack: ${backStack.getDebugString()}") - } - - private fun printTopLevelStacks() { - - navlog("Top level stacks: ") - topLevelStacks.forEach { topLevelStack -> - navlog(" ${topLevelStack.key} => ${topLevelStack.value.getDebugString()}") - } - } - - private fun List.getDebugString() : String { - val message = StringBuilder("[") - forEach { entry -> - message.append("Route: $entry, ") - } - message.append("]") - return message.toString() - } - - private fun addTopLevel(route: Route) { - if (route == startRoute) { - clearAllExceptStartStack() - } else { - - // Get the existing stack or create a new one. - val topLevelStack = topLevelStacks.remove(route) ?: mutableListOf(route) - clearAllExceptStartStack() - - topLevelStacks.put(route, topLevelStack) - navlog("Added top level route $route") - } - topLevelRoute = route - } - - private fun clearAllExceptStartStack() { - // Remove all other top level stacks, except the start stack - val startStack = topLevelStacks[startRoute] ?: mutableListOf(startRoute) - topLevelStacks.clear() - topLevelStacks.put(startRoute, startStack) - } - - private fun add(route: Route) { - navlog("Attempting to add $route") - if (route is Route.TopLevel) { - navlog("$route is a top level route") - addTopLevel(route) - } else { - if (route is Route.Shared) { - navlog("$route is a shared route") - // If the key is already in a stack, remove it - val oldParent = sharedRoutes[route] - if (oldParent != null) { - topLevelStacks[oldParent]?.remove(route) - } - sharedRoutes[route] = topLevelRoute - } else { - navlog("$route is a normal route") - } - val hasBeenAdded = topLevelStacks[topLevelRoute]?.add(route) ?: false - navlog("Added $route to $topLevelRoute stack: $hasBeenAdded") - } - } - - /** - * Navigate to the given route. - */ - fun navigate(route: Route) { - add(route) - updateBackStack() - } - - /** - * Go back to the previous route. - */ - fun goBack() { - if (backStack.size <= 1) { - return - } - val removedKey = topLevelStacks[topLevelRoute]?.removeLastOrNull() - // If the removed key was a top level key, remove the associated top level stack - topLevelStacks.remove(removedKey) - topLevelRoute = topLevelStacks.keys.last() - updateBackStack() - } - - companion object { - private const val KEY_START_ROUTE = "start_route" - private const val KEY_CAN_TOP_LEVEL_ROUTES_EXIST_TOGETHER = "can_top_level_routes_exist_together" - private const val KEY_SHOULD_PRINT_DEBUG_INFO = "should_print_debug_info" - private const val KEY_TOP_LEVEL_ROUTE = "top_level_route" - private const val KEY_TOP_LEVEL_STACK_IDS = "top_level_stack_ids" - private const val KEY_TOP_LEVEL_STACK_KEY_PREFIX = "top_level_stack_key_" - private const val KEY_TOP_LEVEL_STACK_VALUES_PREFIX = "top_level_stack_values_" - private const val KEY_SHARED_ROUTES_KEYS = "shared_routes_keys" - private const val KEY_SHARED_ROUTES_VALUES = "shared_routes_values" - - val Saver = Saver( - save = { navigator -> - val savedState = SavedState() - savedState.write { - - putSavedState(KEY_START_ROUTE, encodeToSavedState(navigator.startRoute)) - putBoolean(KEY_SHOULD_PRINT_DEBUG_INFO, navigator.shouldPrintDebugInfo) - putSavedState(KEY_TOP_LEVEL_ROUTE, encodeToSavedState(navigator.topLevelRoute)) - - // Create lists for each top level stack. Example: - // top_level_stack_ids = [1, 2, 3] - // top_level_stack_key_1 = [encodedStateA] - // top_level_stack_values_1 = [encodedStateA, encodedStateA1] - // top_level_stack_key_2 = ... - - var id = 0 - val ids = mutableListOf() - - for ((key, stackValues) in navigator.topLevelStacks){ - putSavedState("$KEY_TOP_LEVEL_STACK_KEY_PREFIX$id", encodeToSavedState(key)) - putSavedStateList("$KEY_TOP_LEVEL_STACK_VALUES_PREFIX$id", stackValues.map { encodeToSavedState(it) }) - ids.add(id) - id++ - } - - putIntList(KEY_TOP_LEVEL_STACK_IDS, ids) - - val sharedRouteKeys = navigator.sharedRoutes.keys.toList() - val sharedRouteValues = navigator.sharedRoutes.values.toList() - putSavedStateList(KEY_SHARED_ROUTES_KEYS, sharedRouteKeys.map { encodeToSavedState(it) }) - putSavedStateList(KEY_SHARED_ROUTES_VALUES, sharedRouteValues.map { encodeToSavedState(it) }) - } - savedState - }, - restore = { savedState -> - savedState.read { - val restoredStartRoute = decodeFromSavedState(getSavedState(KEY_START_ROUTE)) - val restoredCanTopLevelRoutesExistTogether = getBoolean(KEY_CAN_TOP_LEVEL_ROUTES_EXIST_TOGETHER) - val restoredShouldPrintDebugInfo = getBoolean(KEY_SHOULD_PRINT_DEBUG_INFO) - - val navigator = Navigator( - startRoute = restoredStartRoute, - shouldPrintDebugInfo = restoredShouldPrintDebugInfo - ) - - navigator.topLevelRoute = decodeFromSavedState(getSavedState(KEY_TOP_LEVEL_ROUTE)) - - val ids = getIntList(KEY_TOP_LEVEL_STACK_IDS) - for (id in ids){ - // get the key and the value list - val key : Route = decodeFromSavedState(getSavedState("$KEY_TOP_LEVEL_STACK_KEY_PREFIX$id")) - val stackValues = getSavedStateList("$KEY_TOP_LEVEL_STACK_VALUES_PREFIX$id") - .map { decodeFromSavedState(it)} - navigator.topLevelStacks[key] = stackValues.toMutableList() - } - - val encodedSharedRouteKeys = getSavedStateListOrNull(KEY_SHARED_ROUTES_KEYS) - val encodedSharedRouteValues = getSavedStateListOrNull(KEY_SHARED_ROUTES_VALUES) - - if (encodedSharedRouteKeys != null && - encodedSharedRouteValues != null && - encodedSharedRouteKeys.size == encodedSharedRouteValues.size) { - val restoredKeys = encodedSharedRouteKeys.map { decodeFromSavedState(it) } - val restoredValues = encodedSharedRouteValues.map { decodeFromSavedState(it) } - navigator.sharedRoutes.clear() - for (i in restoredKeys.indices) { - navigator.sharedRoutes[restoredKeys[i]] = restoredValues[i] - } - } - navigator.updateBackStack() - navigator - } - } - ) - } -} - -@Composable -fun rememberNavigator( - startRoute: Route, - canTopLevelRoutesExistTogether: Boolean = false, - shouldPrintDebugInfo: Boolean = false -) = rememberSaveable(saver = Navigator.Saver){ - Navigator( - startRoute = startRoute, - shouldPrintDebugInfo = shouldPrintDebugInfo - ) -} - -@Serializable -sealed class Route { - sealed class TopLevel : Route() - sealed class Shared : Route() -} diff --git a/app/src/main/java/com/example/nav3recipes/migration/step7/Step7MigrationActivity.kt b/app/src/main/java/com/example/nav3recipes/migration/step7/Step7MigrationActivity.kt deleted file mode 100644 index e0fcf6f6..00000000 --- a/app/src/main/java/com/example/nav3recipes/migration/step7/Step7MigrationActivity.kt +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2025 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.nav3recipes.migration.step7 - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.Face -import androidx.compose.material.icons.filled.Home -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.navigation3.runtime.EntryProviderScope -import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.scene.DialogSceneStrategy -import androidx.navigation3.ui.NavDisplay -import com.example.nav3recipes.content.ContentBlue -import com.example.nav3recipes.content.ContentGreen -import com.example.nav3recipes.content.ContentMauve -import com.example.nav3recipes.content.ContentPink -import com.example.nav3recipes.content.ContentPurple -import com.example.nav3recipes.content.ContentRed -import com.example.nav3recipes.ui.setEdgeToEdgeConfig -import kotlinx.serialization.Serializable - - -@Serializable -data object RouteA : Route.TopLevel() -@Serializable -data object RouteA1 : Route() - -@Serializable -data object RouteB : Route.TopLevel() -@Serializable -data class RouteB1(val id: String) : Route() - -@Serializable -data object RouteC : Route.TopLevel() -@Serializable -data object RouteD : Route() -@Serializable -data object RouteE : Route.Shared() - -private val TOP_LEVEL_ROUTES = mapOf( - RouteA to NavBarItem(icon = Icons.Default.Home, description = "Route A"), - RouteB to NavBarItem(icon = Icons.Default.Face, description = "Route B"), - RouteC to NavBarItem(icon = Icons.Default.Camera, description = "Route C"), -) - -data class NavBarItem( - val icon: ImageVector, - val description: String -) - - -class Step7MigrationActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setEdgeToEdgeConfig() - super.onCreate(savedInstanceState) - - setContent { - - val navigator = rememberNavigator(startRoute = RouteA, shouldPrintDebugInfo = true) - - Scaffold(bottomBar = { - NavigationBar { - TOP_LEVEL_ROUTES.forEach { (key, value) -> - val isSelected = key == navigator.topLevelRoute - NavigationBarItem( - selected = isSelected, - onClick = { - navigator.navigate(key) - }, - icon = { - Icon( - imageVector = value.icon, - contentDescription = value.description - ) - }, - label = { Text(value.description) } - ) - } - } - }) - - { paddingValues -> - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - sceneStrategy = remember { DialogSceneStrategy() }, - entryProvider = entryProvider { - featureASection( - onSubRouteClick = { navigator.navigate(RouteA1) }, - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - featureBSection( - onDetailClick = { id -> navigator.navigate(RouteB1(id)) }, - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - featureCSection( - onDialogClick = { navigator.navigate(RouteD) }, - onOtherClick = { navigator.navigate(RouteE) } - ) - entry(metadata = DialogSceneStrategy.dialog()) { - Text( - modifier = Modifier.background(Color.White), - text = "Route D title (dialog)" - ) - } - }, - modifier = Modifier.padding(paddingValues) - ) - } - } - } -} - -private fun EntryProviderScope.featureASection( - onSubRouteClick: () -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - entry { - ContentRed("Route A title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onSubRouteClick) { - Text("Go to A1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { ContentPink("Route A1 title") } - entry { ContentBlue("Route E title") } -} - -private fun EntryProviderScope.featureBSection( - onDetailClick: (id: String) -> Unit, - onDialogClick: () -> Unit, - onOtherClick: () -> Unit -) { - entry { - ContentGreen("Route B title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = { onDetailClick("ABC") }) { - Text("Go to B1") - } - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } - entry { key -> - ContentPurple("Route B1 title. ID: ${key.id}") - } -} - -private fun EntryProviderScope.featureCSection( - onDialogClick: () -> Unit, - onOtherClick: () -> Unit, -) { - entry { - ContentMauve("Route C title") { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Button(onClick = onDialogClick) { - Text("Open dialog D") - } - Button(onClick = onOtherClick) { - Text("Go to E") - } - } - } - } -} diff --git a/app/src/main/java/com/example/nav3recipes/multiplestacks/Navigator.kt b/app/src/main/java/com/example/nav3recipes/multiplestacks/Navigator.kt index 9c463541..01a81a34 100644 --- a/app/src/main/java/com/example/nav3recipes/multiplestacks/Navigator.kt +++ b/app/src/main/java/com/example/nav3recipes/multiplestacks/Navigator.kt @@ -32,7 +32,6 @@ class Navigator(val state: NavigationState){ } fun goBack(){ - val currentStack = state.backStacks[state.topLevelRoute] ?: error("Stack for $state.topLevelRoute not found") val currentRoute = currentStack.last() From 0a13c764fcb775120164e6d24fabe1812e1c8376 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Tue, 18 Nov 2025 20:26:21 +0000 Subject: [PATCH 2/4] docs: Remove Nav2 to Nav3 migration guide This commit removes the "Navigation 2 to 3 migration guide" document and its associated images. It has been removed because it was too complex to be practical. --- docs/MigratingFromNavigation2.md | 560 ---------------------- docs/images/migration/compare_files.png | Bin 36507 -> 0 bytes docs/images/migration/inline.png | Bin 168012 -> 0 bytes docs/images/migration/start_migration.png | Bin 40874 -> 0 bytes 4 files changed, 560 deletions(-) delete mode 100644 docs/MigratingFromNavigation2.md delete mode 100644 docs/images/migration/compare_files.png delete mode 100644 docs/images/migration/inline.png delete mode 100644 docs/images/migration/start_migration.png diff --git a/docs/MigratingFromNavigation2.md b/docs/MigratingFromNavigation2.md deleted file mode 100644 index 88e5bc3c..00000000 --- a/docs/MigratingFromNavigation2.md +++ /dev/null @@ -1,560 +0,0 @@ -# Navigation 2 to 3 migration guide -**IMPORTANT:** This document is a 🚧work in progress🚧 and as such care should be taken when implementing the steps in this guide -in your own app. We welcome your feedback! For details on how to provide feedback see [this discussion](https://github.com/android/nav3-recipes/discussions/91). - -## Overview - -This is intended to be a general guide to [Navigation 2](https://developer.android.com/guide/navigation) to [Navigation 3](https://developer.android.com/guide/navigation/navigation-3) migration which can be applied to any project. It attempts to keep the project in a working state during migration (build succeeds, navigation tests pass) and does this by maintaining interoperability between Nav2 and Nav3. - -The guide assumes that the project is [modularized](https://developer.android.com/topic/modularization), and the suggested approach allows feature modules to adopt Nav3 on an incremental basis. Once all feature modules have migrated, the Nav2 code can be safely removed. If the codebase is not modularized, the steps for specific modules should be applied to the main `app` module. - -### Features - -This guide covers the migration of the following Nav2 features: - -- Nested navigation graphs - single level of nesting only -- Shared destinations - ones that can appear in different navigation graphs -- Dialog destinations - -#### Not supported -The following features are not yet supported: - -- More than one level of nested navigation -- [Custom destination types](https://developer.android.com/guide/navigation/design/kotlin-dsl#custom) -- Deeplinks (hence [`NavController.navigateUp`]([url](https://developer.android.com/reference/androidx/navigation/NavController#navigateUp())) is not supported because the only time that "up" and "back" differ is when working with a synthetic back stack) - -### Prerequisites - -- Familiarity with [navigation terminology](https://developer.android.com/guide/navigation). -- Destinations are Composable functions. Nav3 is designed exclusively for Compose. Fragment destinations can be wrapped with [`AndroidFragment`](https://developer.android.com/reference/kotlin/androidx/fragment/compose/package-summary#AndroidFragment(androidx.compose.ui.Modifier,androidx.fragment.compose.FragmentState,android.os.Bundle,kotlin.Function1)) for interoperability with Compose. -- Routes are strongly typed. If you are using string-based routes, [migrate to type-safe routes](https://medium.com/androiddevelopers/type-safe-navigation-for-compose-105325a97657) first ([example](https://github.com/android/nowinandroid/pull/1413)). -- Optional but highly recommended: test coverage that verifies existing navigation behavior. These will ensure that during migration, navigation behavior is not changed. See [here for an example of navigation tests](https://github.com/android/nav3-recipes/blob/main/app/src/androidTest/java/com/example/nav3recipes/MigrationActivityNavigationTest.kt). -- Your app must have a [minSdk](https://developer.android.com/guide/topics/manifest/uses-sdk-element#min) of 23 or above. - -### Step-by-step code examples - -A [migration recipe](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/migration) exists to accompany this guide. It starts with an activity containing only Nav2 code. The end state of each migration step is represented by another activity. Instrumented tests verify the navigation behavior in every step. - -To use the migration recipe as a guide: - -- Clone the [nav3-recipes repository](https://github.com/android/nav3-recipes), load it into Android Studio and switch to the Android view in the project explorer -- Expand the `com.example.nav3recipes.migration` package -- Open `start.StartMigrationActivity`. Familiarise yourself with the navigation structure and behavior defined in this activity. For simplicity, the recipe codebase is not modularized, however, it is structured in a way that should make it clear where the module boundaries would be in a real app. This is the starting point for migration. - -![Screenshot of Android Studio showing the starting point for migration](images/migration/start_migration.png) - -- Open `MigrationActivityNavigationTest` which is under the `androidTest` source set. This file contains the instrumented tests that verify the navigation behavior. -- Run the tests. Note that the tests are run on every migration step activity. - -Tips for working with the migration recipe: - -- It can be useful to see the differences between migration steps. To do this, highlight both files in Android Studio project explorer then right click and choose "Compare files". The first file to be selected is the one that will appear in the left window pane. - -![Screenshot of Android Studio showing how to compare files](images/migration/compare_files.png) - -- To run the migration tests only on a single activity, uncomment the other activities in the `data` function inside `MigrationActivityNavigationTest`. -- The migration steps introduce a `Navigator` class. Setting its `shouldPrintDebugInfo` parameter to `true` will output lots of debug information to Logcat. - -## Step 1. Add the Nav3 dependencies - -The latest dependencies can be found here: [https://developer.android.com/guide/navigation/navigation-3/get-started](https://developer.android.com/guide/navigation/navigation-3/get-started) - -- Update `lib.versions.toml` to include the Nav3 dependencies. Use the [latest version from here](https://developer.android.com/jetpack/androidx/releases/navigation3). - -``` -androidxNavigation3 = "1.0.0-alpha10" -androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "androidxNavigation3" } -androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "androidxNavigation3" } -``` - -### 1.1 Create a common navigation module - -- If you don't have one already, create a `:core:navigation` module -- Add the Nav3 runtime as a dependency using `api(libs.androidx.navigation3.runtime)`. This allows modules depending on `:core:navigation` to use the Nav3 runtime API. -- Add the Nav2 dependencies. These will be removed once migration is complete. - -Example `build.gradle.kts`: - -``` -dependencies { - api(libs.androidx.navigation3.runtime) - implementation(libs.androidx.navigation2) -} -``` - -**Note**: Nav3 has two libraries: `runtime` and `ui`. Usually only the `app` module needs to depend on `navigation3.ui` which is why it isn't included in the `:core:navigation` dependencies above. - -### 1.2 Update main app module - -- Update the `app` module to depend on `:core:navigation` and on `androidx.navigation3.ui` -- Update compileSdk to 36 or above -- Update minSdk to 23 or above -- Update AGP to 8.9.3 or above - -Ensure that navigation tests pass. - -## Step 2. Create a back stack and use it with NavDisplay - -### 2.1 Add the Navigator class - -Important: A fundamental difference between Nav2 and Nav3 is that **you own the back stack**. This means much of the logic and state that was previously managed by Nav2, must now be managed by you. This gives you greater flexibility and control, but also more responsibility. - -To aid with migration, a class which provides and manages a back stack named `Navigator` is provided for you. It is not part of the Nav3 library and it does not provide all the features of Nav2. Instead, it is intended to be an assistant during migration, and after to be a starting point for you to implement your own navigation behavior and logic. - -Copy the [`Navigator`](https://github.com/android/nav3-recipes/blob/main/app/src/main/java/com/example/nav3recipes/migration/start/Navigator.kt) to the `:core:navigation` module. This class provides `backStack: SnapshotStateList` that can be used with `NavDisplay`. It will mirror `NavController`'s back stack ensuring that Nav2's state remains the source of truth throughout migration. It does this by observing `NavController`'s back stack and converting the entries that have been migrated to Nav3 using the `entryToRouteMapper` lambda parameter. This converts `NavBackStackEntry`s that have been migrated to Nav3 back into a plain route. The `NavBackStackEntry.toRouteOrNull` extension method is provided in `Navigator.kt` to assist with this conversion. - -For example, if `RouteA` and `RouteB` have been migrated, the following lambda should be used for `entryToRouteMapper`: - -``` -entryToRouteMapper = { entry -> - entry.toRouteOrNull() - ?: entry.toRouteOrNull() -} -``` - -After the migration is complete, the NavController mirroring code will be removed. - -### 2.2 Make the Navigator available everywhere that NavController is - -Goal: The `Navigator` class is available everywhere that `NavController` is used. - -- Create a `CoroutineScope` that `Navigator` can use to observe `NavController`'s back stack -- Create the `Navigator` immediately after `NavController` is created - -Example: - -``` -val navController = rememberNavController() -val coroutineScope = rememberCoroutineScope() -val navigator = remember { - Navigator( - navController = navController, - coroutineScope = coroutineScope - ) -} -``` - -- Do a project-wide search for "NavController" and "NavHostController" -- Update any classes or methods that accept a `NavController` or `NavHostController` to also accept `Navigator` as a parameter - -### 2.3 Add a `NavDisplay` on top of `NavHost` - -Goal: `NavDisplay` is displayed transparently on top of your existing `NavHost` - -The idea here is to let `NavHost` render all the legacy routes and `NavDisplay` render migrated routes. When `NavDisplay` encounters a legacy route it will render nothing, allowing the original `NavHost` to render the route instead. - -- Wrap your existing `NavHost` with a `Box` -- Add a `NavDisplay` inside the `Box` under the `NavHost` -- Pass your `Navigator`'s back stack to the `NavDisplay` -- Set `NavDisplay.onBack` to call `navigator.goBack()` -- Create an `entryProvider` with a `fallback` lambda that has no composable content causing the existing `NavHost` to be displayed - -Example: - -``` -Box { - NavHost(...) - NavDisplay( - backStack = navigator.backStack, - onBack = { navigator.goBack() }, - entryProvider = entryProvider( - fallback = { key -> - NavEntry(key = key) {} - } - ) { - // No nav entries added yet. - } - ) -} -``` - -Ensure that navigation tests pass. - -## Step 3. [Single feature] Migrate routes - -Goal: Routes are moved into their own `:feature:api` module and their properties are modelled outside of `NavHost` - -### 3.1 Split feature module into api and impl - -Choose **a single feature module** that does not contain the start destination for your app. The feature module containing the start destination will be migrated last. - -Create the `api` module: - -- Create a new feature module named `::api` -- Move only the navigation routes into it. Typically, these are simple data classes and objects and should be moved into a single file named `Routes.kt`. Everything else should be moved into the `impl` module (see below). -- Apply the KotlinX Serialization plugin to the module by updating `build.gradle.kts` - -Create the `impl` module: - -- Move the remaining contents of `:` into `::impl` -- Add the following dependencies: - - `::api` so it has access to the routes - - `:core:navigation` so it has access to the Nav3 APIs and the `Navigator` class - -Update `:app` dependencies: - -- Update the `:app` module to depend on both `::api` and `::impl`. - -### 3.2 Model nested navigation graphs - -Skip this section if you don't use nested navigation graphs. - -#### 3.2.1 Nested graph migration overview - -In Nav2, you can define nested navigation graphs using the `navigation` builder function inside `NavHost`. `NavController` provides a back stack for each nested graph. This allows you to have several top level destinations, each with sub-destinations. You can also define shared destinations - ones that are accessible from more than one navigation graph - by duplicating the destination in multiple graphs. - -For example, the following code defines two nested navigation graphs, each containing a shared destination defined by `RouteE`. - -``` -@Serializable private data object BaseRouteA -@Serializable private data object RouteA -@Serializable private data object RouteA1 -@Serializable private data object BaseRouteB -@Serializable private data object RouteB -@Serializable private data object RouteB1 -@Serializable private data object RouteE - -NavHost(startDestination = BaseRouteA){ - navigation(startDestination = RouteA) { - composable { ContentRed("Route A title") } - composable { ContentRed("Route A1 title") } - composable { SharedScreen() } - } - navigation(startDestination = RouteB) { - composable { ContentRed("Route B title") } - composable { ContentRed("Route B1 title") } - composable { SharedScreen() } - } -} -``` - -In Nav3, how you model relationships between routes is up to you. In this migration guide, `NavHost` will be removed so it's important that the properties and relationships defined here are captured elsewhere. - -One possible way of modelling these properties (though by no means the only way), is to define marker interfaces for the top level and shared routes. - -``` -@Serializable private data object RouteA : Route.TopLevel -@Serializable private data object RouteA1 -@Serializable private data object RouteB : Route.TopLevel -@Serializable private data object RouteB1 -@Serializable private data object RouteE : Route.Shared - -sealed interface Route { - interface TopLevel : Route - interface Shared : Route -} -``` - -Once modelled, the nested navigation and shared destination behavior can be implemented as follows inside a class that provides a back stack, such as the provided `Navigator`. - -#### For nested navigation - -- Each top level route has its own back stack. -- The first element in that back stack is the top level route - this approach means we no longer need the `BaseRoute` objects to identify each nested navigation graph, the first element is sufficient. -- The current top level route is tracked and sub routes are added to its back stack - there is no explicit definition of parent-child relationships between routes -- When the top level route changes, other top level stacks can be retained or discarded. -- The top level stacks can be flattened into a single list which is observed by `NavDisplay`. - -#### For shared routes - -- When navigating to a route that implements `Route.Shared`, check whether it's already on a top level stack: - - If so, move it to the current top level stack - - If not, add it to the current top level stack - -#### Example - -Taking the code example from above. The starting route is A. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

User action

Current top level route

Top level stacks

Back stack

Notes

Open app

A

A => [A]

A

Tap on A1

A

A => [A, A1]

A, A1

Tap on B

B

A => [A, A1]

B => [B]

A, A1, B

Tap on B1

B

A => [A, A1]

B => [B, B1]

A, A1, B, B1

Tap on E

B

A => [A, A1]

B => [B, B1, E]

A, A1, B, B1, E

Tap on A

A

A => [A, A1]

A, A1

We make the decision to pop all B's routes from the stack, this is similar to using popUpTo(A) when navigating using Nav2

Tap on E

A

A => [A, A1, E]

A, A1, E

- -##### Steps - -Review the provided `Navigator` class to ensure that it can model your app's current navigation behavior. In particular: - -- Review the [`add method`](https://github.com/android/nav3-recipes/blob/main/app/src/main/java/com/example/nav3recipes/migration/step2/Navigator.kt#L142) -- Note that `popUpTo` in the [`navigate`](https://github.com/android/nav3-recipes/blob/main/app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt#L121) will be ignored when switching to Nav3 in the final step. There is no equivalent to `popUpTo` in Nav3 because you control the back stack. The supplied `Navigator` class does, however, include logic to pop all top level stacks up to the starting stack when navigating to a new top level route. - -#### 3.2.2 Update routes to implement marker interfaces - -Steps: - -- Update each top level route within the feature so that it implements the `Route.TopLevel` interface provided by `Navigator.kt` -- Update each shared route so that it implements the `Route.Shared` interface provided by `Navigator.kt` -- Ensure that navigation tests pass - -## Step 4. [Single feature] Move destinations from NavHost to entryProvider - -Goal: When navigating to a migrated route, it is provided using `NavDisplay`'s `entryProvider`. - -### 4.1 Move composable content from NavHost into entryProvider - -Continue only with the feature module being migrated in the previous step. - -#### 4.1.1 Move directly defined destinations, such as composable - -For each destination inside `NavHost`, do the following based the destination type: - -- `navigation` - do nothing -- `composable` - Copy the function into `entryProvider` and rename `composable` to `entry`, retaining the type parameter. Remove the composable content from the old `composable` leaving it empty i.e., `composable{}`. -- `dialog` - Same as composable but add metadata to the entry as follows: `entry(metadata = DialogSceneStrategy.dialog()`) - - If you haven't already, add `DialogSceneStrategy` to `NavDisplay`'s `sceneStrategy` parameter. -- [`bottomSheet`](https://developer.android.com/reference/kotlin/androidx/compose/material/navigation/package-summary#(androidx.navigation.NavGraphBuilder).bottomSheet(kotlin.String,kotlin.collections.List,kotlin.collections.List,kotlin.Function2)) - [Follow the bottom sheet recipe here](https://github.com/android/nav3-recipes/pull/67). This essentially the same as the instructions for `dialog` except that `BottomSheetSceneStrategy` is not part of the core Nav3 library and so should be copied/modified to your individual requirements. - -#### 4.1.2 Obtain navigation arguments - -In Nav2, when navigation arguments are passed using the route instance, you must first obtain the route instance from `NavBackStackEntry` by calling `toRoute`. In Nav3, the route instance is directly accessible with `entry`'s lambda parameter so there's no need to obtain the route instance. - -If using ViewModels to pass navigation arguments, please check the [Nav3 recipes for ViewModels](https://github.com/android/nav3-recipes/blob/main/README.md#passing-navigation-arguments-to-viewmodels) and apply the technique most appropriate to your codebase. - -#### 4.1.3 Code example - -Existing code: - -``` -NavHost(...){ - navigation(startDestination = RouteB) { - composable{ entry -> - val id = entry.toRoute().id - Text("Route B, id: $id") - } - dialog { Text ("Dialog D") } - } -} -``` - -New code: - -``` -NavHost(...){ - navigation(startDestination = RouteB) { - composable{} - dialog {} - } -} - -NavDisplay(..., - sceneStrategy = remember { DialogSceneStrategy() }, - entryProvider = entryProvider { - entry{ route -> Text("Route B, id: ${route.id}") } - entry(metadata = DialogSceneStrategy.dialog()) { Text ("Dialog D") } - } -) -``` - -#### 4.2.1 Move NavGraphBuilder extension functions - -[`NavGraphBuilder`](https://developer.android.com/guide/navigation/design/encapsulate) [extension functions](https://developer.android.com/guide/navigation/design/encapsulate) can be refactored to `EntryProviderScope` extension functions. These functions can then be called inside `entryProvider`. - -Refactoring `NavHost`: - -- Copy the function call into `entryProvider` -- Inline the original function reference and keep the existing function - -![Screenshot of Android Studio showing how to inline functions](images/migration/inline.png) - -- Remove any composable content associated with the entries inside `NavHost`. Keeping blank entries for each route ensures that `NavController`'s back stack is still the source of truth for the navigation state. - -Refactoring the extension function: - -- Change the method signature from `NavGraphBuilder.existingScreen()` to `EntryProviderScope.existingScreen()`. -- Remove `navigation` destinations, leaving only the destinations they contain. -- Replace `composable` and `dialog` destinations with `entry` - - For `dialog` destinations add the dialog metadata following the instructions in the previous step - -#### 4.2.2 Code example - -Existing code: - -``` -NavHost(...) { - featureBSection() -} - -private fun NavGraphBuilder.featureBSection(onDetailClick: () -> Unit) { - navigation(startDestination = RouteB) { - composable { ContentRed("Route B title") } - } -} -``` - -New code: - -``` -NavHost(...) { - navigation(startDestination = RouteB) { - composable { } - } -} - -NavDisplay(..., entryProvider = entryProvider { - featureBSection() -}) - -private fun EntryProviderScope.featureBSection() { - entry { ContentRed("Route B title") } -} -``` - -### 4.3 Convert `NavBackStackEntry` to its route instance using `entryToRouteMapper` - -Steps: - -- If you haven't already, add the lambda parameter `entryToRouteMapper` when creating `Navigator` -- For each migrated route, convert the `NavBackStackEntry` that contains that route back into its route instance using `NavBackStackEntry.toRouteOrNull`. For example: - -``` -Navigator(..., - entryToRouteMapper = { entry -> - entry.toRouteOrNull() ?: - entry.toRouteOrNull() - } -) -``` - -You should now be able to navigate to, and back from, the migrated destinations. These destinations will be displayed directly inside `NavDisplay` rather than by `NavHost`. - -**Note**: When navigating (both forward and back) between destinations handled by `NavHost` and `NavDisplay`, you may see the blank destination until the transition animation has completed. - -Ensure that navigation tests pass. - -## Step 5. [Single feature] Replace NavController with Navigator - -Goal: Within the migrated feature module, navigation events are handled by `Navigator` instead of `NavController` - -Steps: - -- Replace `NavController.popBackStack` with `Navigator.goBack` -- Replace `NavController.navigate` with `Navigator.navigate` - -Note: Take a look at how `navOptions` is handled in `Navigator`, you'll need to modify this behavior if it doesn't suit your requirements. - -For `NavController` extension functions defined by **other modules**: - -- Inline the function, leaving the other module's function in place -- Make the replacements above - -Remove Nav2 imports and module dependencies: - -- Remove all imports starting with `import androidx.navigation` -- Remove feature module dependencies on `androidx.navigation` - -At this point, this feature module has been fully migrated to Nav3. - -Ensure that navigation tests pass. - -## Step 6. Migrate all feature modules - -Goal: Feature modules use Nav3. They don't contain any Nav2 code. - -Complete steps 3-5 for each feature module. Start with the module with the least dependencies and end with the module that contains the start route. - -Ensure that shared entries are not duplicated. - -After each feature module has been migrated, ensure that navigation tests pass. - -## Step 7. Use `Navigator.backStack` as source of truth for navigation state - -### 7.1 Ensure `Navigator` is used instead of `NavController` everywhere - -Replace any remaining instances of: - -- `NavController.navigate` with `Navigator.navigate` -- `NavController.popBackStack` with `Navigator.goBack` - -### 7.2 Update Navigator to modify its back stack directly - -- Open `Navigator` -- In `navigate` and `goBack`: - - Remove the code that calls `NavController` - - Uncomment the code that modifies the back stack directly -- Remove all code which references `NavController` - -The final `Navigator` [should look like this](https://github.com/android/nav3-recipes/blob/main/app/src/main/java/com/example/nav3recipes/migration/step7/Navigator.kt#L15). - -### 7.3 Set the app's start route - -When creating the `Navigator` specify the starting route for your app. - -``` -val navigator = remember { Navigator(navController, startRoute = RouteA) } -``` - -### 7.4 Update common navigation UI components - -If using a common navigation component, such as a `NavBar`, change the logic for when a top level route is selected to use `Navigator.topLevelRoute`. [See example here](https://github.com/android/nav3-recipes/blob/main/app/src/main/java/com/example/nav3recipes/migration/step7/Step7MigrationActivity.kt#L94). - -In Nav2, it was necessary to have a type for both the navigation graph and the start destination of that graph (e.g. `BaseRouteA` and `RouteA`). This is no longer necessary so remove any redundant types for the navigation graph from the `:api` modules. Ensure that the correct types are used to identify top level routes. - -### 7.5 Remove the entryProvider fallback - -Remove the `fallback` parameter from `entryProvider` as there are no longer any unmigrated routes that must be handled by `NavHost`. - -### 7.6. Remove unused dependencies - -- Remove all remaining Nav2 dependencies from the project - -### 7.7 Run navigation tests -Ensure that all navigation tests pass. - -Congratulations! Your project is now migrated to Navigation 3. - -## Next steps - -In the supplied `Navigator`, the type of items in the back stack is `Any`. You may now want to change this to use stronger types, for example the `NavKey` interface provided by Nav3. diff --git a/docs/images/migration/compare_files.png b/docs/images/migration/compare_files.png deleted file mode 100644 index 11a9fd5506f59dc6835ac4ad41dc9eddeaea7e24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36507 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 diff --git a/docs/images/migration/inline.png b/docs/images/migration/inline.png deleted file mode 100644 index 67d267b942fbe4c20775fd608b789b438c6ed0d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168012 zcmd@5g2uEezUTYyUvTf;^P9}nN6IWAUU=kN>3 zGY;c#&SKphhlgZef|phaLl^Yt{UxqsEqAq5M}Z|wK`)lzwMf7JStRl$Qv~qceoFlAEB<~xo6SrFJ|A7|1J8Z?#CU&5Cu-A zd?ng1_*h75<50ATxDumQZ;_>BG{jNa*cJoN8#Ln|>Vfox!3^nX>6Dvnt5{HfxCpA7 zn5A}PEg#4DwA~t$`Vr@dXYw9leuymG$3{%uPg}Xs-I32#V1NII>@8QwDJge~0u$WQ*naZhXBGBqLnnv5-d~^V{DjF3F1j$)+ z8v#`PPCe&WUoiN)s3vfz(O$ekujqUOLt&(S-YxMu46{gFKUVB3ww}bx0gTJQXPI2g zB;lcPw5aqy=ET!7%?i<3LyI$o4y+Ddy1#11^N_^P3b01^#Q}a-<08}k#%qG+{c7af z?@9nADrZpqhN1vI$G3(q3uj*c*N#6pyZJYbbf0wu_N$>tePYR~RkLKq96}?G43}ic z{#@u$NTaXL`iab($bo#mQ#puRKhBIKC2;nc(U%m^4j9s z&>i6W5{@g`RcNmGA^HsoBW8T?VDD=)`47A)(Bn;h4>sN%Du$y>XZ+H8OJ{B|Zrlcyb%9j-w72pkT@8IsV?KE9tT!!v&4&qO!el$$Q zijrLZEUeh_i9)lJ^$ly~YxURR#L+D7ERifjY)j12EajS|sv-r{DKE>hMylS{w zqgtYwzEU2VN)n@TQ90VVo}W&C36(l#Q|Gtq!(;E+Z(MMdaA|O}`oy9X$a7NVQyo)T zQd@Y(?V_zGYroXO^jqpUtlM(grhZ?4^d*CH0~HMnmvszE4f9s>M6=8biHd5}3gq^S zIMkA}(h6G)8YI0GRTMZ?ouZ6_*4_aF#UufGpo)M3gbbQwkaf@~COc-&kD(v$dqjFL zdzhqOzthQ4%(2b!>(e#=;Zh6<*cN82{8=VfEf+HAps_GBmf+O9UhDVPGOOoPSNBoK z?dX7|Vhv>tW=((_!xhR^)E@g@1?eGsxIwL(+J3eZNj-@TNhmwD!H~hdo@1?jjlZ3R zS#MQwWwVu16|~;SY1J0q*EjRS%B^$nJNqc#glCOI=&6pdpYSikoYk|JnGqRS}i_QqM|+Gc5wm5gw|eLqn&Na(j+?y{%7P zKfUfIrM8Mshdj$XfoJ*0eI6w)6lUZ+8YwcrD^}T8q|ORf0loshr8m~MpMCDVNqjtg z2K}Ub6a7T5<{-+Kju+HdRX2L4(`ONoo7>exKX6{xR^^edc>pxP4$koq5AT5w!@*c7 z=wZ*6o^6VEbQ*qF3A_$MmtgOrO(AY&gV}_c%32O^W-Uy_PJ~a8nkJdrbqn>_Y_fG9 z_W(XO%Gk$vQ`)>{i9QL7i_$08BE9*r#M4Z#Pguij=`b>?JF6RDZ%4_&!CKDf=>Ky* zPE-Lid5MGl%TmLL^Wu=jd~ykgia~&5$O$$yJRXt)JAmE8(LWMzQkD59;`Wj!ZZo)Rg za`{T3uIWHS!!}=?drBCU@xQfwBOsLI}kn_3;V4??tfE6Qn2%% zI`XYow|U&_EE}tMEqd^-*LSS?_HQa1+-{v+iI$6!p8Kw~`NnvhTRN#ac^Q9Q4|-5I zSD<#Lc?nSTgYBt}<^1fwQ{hqx&lnPA2j(M6@A`{#Pjp$ctEljv|-ii>`}U z-WvSPu)$Cr_(nv8>g|V)BL5zxRv3jKc?3Go^K2Bsl=Aih>|KuqekF`@bcy=h35)jm zB=5k4j4q}R@fN0dFvYjBvOM#0(u~990;w}*lrydRm!T+wLErr^@PD5kBGqpJys^^o zGz2NfEY6utEQ<4!6&r4$D`%;sgu?n%e~yBVN{)i@R6~8rVyG1VyDp8&jDq$b_%jrg zP#YBV|E5uXD*s)vPx&9uf0bx)KTxoq?g*cYyMd|)SA@o%L2j--s{SS$|ohY5Ik}9pFldAsL!5_0Q7(&Hi*JN@wlv?kvQ~>E-3c;l;z@(cRRW-O=sce>L*I+WBnZX6|a^>~7=aNc*o{Q!^(IcTqaJe;xhr>%X4U z!rSKm^yKLF-(o!p$oUV$`GJFr^MAMf#47R+Dx_-TZDFtX*~Z~%%%1uX`}l!RH^{ELu zC@A76a-StMy-`nqSl<|>5<#c-V=X*s?{MA+e#>Nj9-e}*95G2U*^4aj$`|gv8q*m6 zLsVdL@Cw zt~c4-^fTmGMEkFVm5v2HTRr}POOX$+zSs~BcRs(V%jsFFbr!C^5m^j?f~Y|^ZaLv~ zZe!hAW1b&;5W9ED`^L*P491`d;lC5i#;x*toC7Z8({|jPlCRl~ zt;aRHq%Me?*N^ronOKWXTvsjz)94?M@h;kQTRlh~e`f^nZ-&nKiXoK(9J{TM_+?nB zk1PL3d>;AlnqGk6fLdznOE;nb>#}{w`p!P1KNLCPn>jeH1k0*hvwa*-Z?>IYMT@DvZU z*aQ)Ku;qZqx}W7)WVu+2FpAV5p`F^7!bb-W8;URGelPI^$X|D$IWUex`d((gLJ) zxQO(5T+HR^$FUpZsn;U{?}O7dNXD-4shMMvi$SiBga00i?nT#KcdAR0!`$C}n4Nie zNL%O-qIk;fv8WGhGwu7)@fHg0HI)WbM+Z-l&}t!*?nL5>p|ImyPB zWqGFGpIwa6BuytG_T3sG;vbo*HGCK($Zj`gT{`2rcOTzsU;KRel_hkEL^r~UahcTV zE7IKGxz*&G%U{jD->R3e;j0R6j<^rz{Tk7LKS~$jF?@oEABAZZ0MpMqu%}`(ae_Wc zy2JXq(aH!E@ma?S4iCNW8+mJ!4DaK6Gwo-~X@4hr;v-rItMkX0lT5NSRV^D!(4IJL zW3Ft+WhMckk)(}^w+?-*c_VKKe%XYwTyGrqQQ}F;o!^n;|D-(p?nz|mfK{I~7c4N) zIiCTfDb+Aqu6Lf)V#Bh(2~^|MvA&3%)i}s}Z%ZQb_>-sh&~S^hP~1B;ZcC*G&-8^@ z+0pIRX!W9)NCN!4pR!+t8q~XT!}HwyFFd=RT`d&Vj%{2Vflt3n;wcFg^NJ_WZf|6;~I zYZ_M)j%!^(leBXH_HUtqqoO0#pUxHPOsm*B>*v~pxU~{Xq4j?bY%gr2|EYB?R9qvw z1m3w9WM{{QrdA@Pzl7gKD8k&Uls;>2>i7MHH<2@rL5QNB*LR(upFn8VgruMR3%XJK zp#*bWRJ--=+(ioWjfH&9R*t+4CL@y~1(sBMw&_w4A7*o#S}f|<^}{0aYR%^=E<7q^ zGf9@agYl>4kHp(6_X;n*ON%&DW9~S4%Sw)#0S&znn$3HtrE;W@*sDt0PL)GSwod`o z@S~S;L{ST8Gw=)+T>Iz zQd4LgaDxy0b&unaAc7deUkFevdct}}ve3a^R_5(Obp9&9er$(x*&cJ&sts7dlefXX z((vgW9s>5!dzCz_SIF3dz_GP8BQ>=@DjDw%q^jy=YXmOENlj3@|VfSQxW??i-&zE|alZm3Gr$8kyz|{O>DosxZ z+9^7Kw)=U0BZwpj+1}(x`(Vn#7a1IZemWV@q}|u4KC85*iM6bMEQO(}6qoN>)s2B+ z$mTt%w4sUiK)FMHieu=fVA^IxB9v2}iRDniwtUOM;x9!i4fe6>rNHp}5VQa80T2Tq zV-n(X7e73h6vTXvSVT}P2e_usDZ%`=v{&BCmBQHRZPY;;f5|@-K0MUUEeLWz%)tVpnk)9RY>@?vHn0WOt6N@49|;=Z57G1G9}PdM?rO zBg;hb&;6Y3L*w8RPN%%lfBonhS?l2}Ie@lE!gz3V=sUmoXV7Y74UnpRi}ZdaCbPRr z$e=rh#%mGzXE-ETB%$BaLmLnO1%%$Xy4m~8GMN#(7L)QaPAhpy|**R zJV!e&=M8{bD=zjwoS&UJwiPxkMN;phh0F`kET7*$IGw(>jP?rV6ZGtkynN3Nx_htA z@o8pQtIy+Fj{)P7x9t}{|`00*wh@&M__=DV3~ zHRHc1ev>R}sm!gdriSRWa(SmuY~QfH81+`GA?0Ua9=(*ZKOy>1$TE&omRA=zsNyrM zK<@kv$m0L$rR|UbnS#@QU^3*+i(;bj@NplR7#O50ZNO|y*OzGILsGx7$CpX|wT^3( z#PR7GB=B*3oAV2|po#t*rMVA6Yo8dny-&KTyL)y0PuV5A8T!GVTlhqV3pqHCl2o8f zC$3v00Y&vb{*RX$S7Z#7wd!H!RI!`+E%EymCIiAVx>V0+3bIKQN3YevQj*HN59P0?2-&lT!EV}>1LAOBEHvnOw2|oaQ%W7XbI=}5Qnf&I6yq@FK${lOlew` zdkYI^QK{>DJVpy%`6S|i?y|%#i?et7k1ii)DbiV0>Q%s&$YY=uHRz9s7_s4q3Xe{F zQNifZ%Fq?(i{!-6=f^ew1c=a?@`uN#Y_+|rP!UA@)%~;WG>gWU6d2Buua}}`KH+}Jfc&)QGLtjH*ven z#YY*myU@WE!^G4KtpL|RPrkQ=V7=km>XMB-K3*kEd!Q&>vWlf5A7+4)*TJJC8ut=7 zI9dlZIp4Pm=q=Lu1ZSuxwe3k^LK8Uv)O0dx8hm2tKhj8{?+TgG(X(Iv@^F}d_KJDT z&mQ7x+tP50WC+~>do3OU-cQ9WB6sheckDpsDcuAdF%9p3v$~mNLcg29ubh+& zf`XX3iVL&HLZp2QejHr*;M`=|4R0quq{I^iHvs=c{{o#2EEwhQMv+irTCnLiOHnii=E__`C}< z=Oon5xUS9DKPny~#ka}L6S7YeX?53KYVV#|mB;s~hHr7N4H>6T94u>d?+hZw5&I5b zOCVD(qRdMYU-~@RbK9IT9ojs3ZshygY;u=7|MnLdpfXE&J92IJO~h(|$1k^%M0%g4 zbkOMnJ!~+i z=3M(j-9TxD@(`hW)YMx3=b-pjxzF?HyJ^pA<>tH9wbfJDK$3bZUiQ=HiI%N!ww2_L z$HWA!<=xB$$I6^yf@{qYW5+i;??P!m(%a_V-rErIK4}SxjQ)45F{b{bouW`)&iBNk z6YNNF{yi2xlTpOWfkM8=UcA=Y{Wi_o zGG|Zax-GQP%PFJif7_IQf0gYn@elNQ%PDbFQ}w%fZBHAHcG&dMY_InI$Gp7Lt_)E0 ztAm_qfdKS_>pQgjYgAhL@}nIb;h|H9&w?l(7{4^J(TbfII^^xqk}F?ITye;`D>dID z-M07F=c7_S4tqpV65*R4Uv@O}c07Kzr-|&Wd}Y28Rz*~2=jVCq3}5D_j$9R?1(FLR zKhFa@3Yye3_L^T2SskD+HJ#x#ILrc8@+kt&>e-P7!vVBav+!?LjSw7~4Qb^+XU%3}m+BF~tD6f8GcE zj&ARY=}Gnmm7k&c2R_Z&nDDuX*ZM<7VOLW}$GXF6^QfW6Y~tDFFldXSIVY{o7`Le|8QWMamD>K{TY#?`F-Jm#9OH*9#`_gorr-A(jU$?y=?Syxt36 zjo+Umz8&9t(4L;hm=6j4+e`lcCTIbckequSTtM}9-NSPtS;#-U#zBMvMu;L($b7Ku z4@Fba!*gdW%Y`D@V&+4wGR)oqkG|t2)GGbHPxX{lTK-#5w;SJ1>2VGGMi$3iXXURT z`i@D_tpbGn-S$1+=K5xxRil$#YkwKPFd}uF7!rRH(S)ZIHX$l#K z$SqMFJGy!KL-L~fc?nE6-2j`?x9>0Q3AvJh`$~?-aR5AePw~U&+Q)v!I_skMlQFI; zzEknFfQ^=;;*yoT~cQj0=~;+GfXB0yEP?N$QkU+nZvt?ZcHu_8qI z9|`UozdX*Ola;WlNEEO;Rfv)0ryp*FlD@fSpp=ibL<+0U4G6t44Ekkr)M?_5E6uoE zaocI)FZkxS?{UE1U0Nn%G^^M$zE_^syn7^BBq!Fp>6xmo1M*14dgJr&T`*TJ?wh%* zN1A__c=-PS!Ttl{sYLo+%t|#amM=%PzZXq_4yQVl+#%Lovxa-Geyqv;_WV5!;NH}G z<}ZN#n)98*2Bgw7TucY!PpBx3t_UZvYw5X8Cu_{Cv8j`|JF8nKp<&OD80RZ6l$zfX z`l0IB&&$EBh2d@Y)NO&n%00lSdrv}d-1~3IO2RgE0nos$SE~Bx;26sSaBEeN4~B5_ z-~45gA!^|(cNd;#cj@^WGPj^7bIcY=d$!a##D2F_!uFsT^+#lR6mZ=3VX)5YR=L5U zx9)Oji-g~IY11*cl)zliYnF7Sxuj!YPr^V&=>C;s68)Jf-@0#}0i+Fwn0jRVZw}2F zqj{v9^P>M%#p*o(XvJlV$sR--XohCQQVFwuqwSuEHb3y|-KxRbB?-UB(d)#H-6VsR zhqeB%&c7SlgTx>+(ZGv^_Uagna>_svY9D6j}wm$&kV zr*#Go<>lw6hYrbh%qIJF9sJF&Mmgz zer^%N@M>vIia{tJpMcI^9hc-+Ef-akj?J9gdleJ8YCDy*>x(TZ9NVw^{k<u~P2R;_|GXAR54e^(A|SD}&oUx$l%+hg6HzBKdZ_=ArH7(X3=^F;O-J>1-9IVhZfn zaEO89Xa%5-rVO|22>MKQ*79yvislRT!$N;E&$xde_qIpxZToGT@6|)*7_Fi{`9hnni&~ifv)4=86HHC&1-@)Av0h8iROh=a*K-}F&nXFo zSt+&EJD5%hm!-KAjHmiKEO+O6>GL1bX7JuD)rZKP*E&u~h}a#~IpD;v*{tRUdC$$* zEt4>|O*hM7K}w6}>)9233q0cSw)8YA91K#fm5&*z{?_C_`APmC(*cgRv5{f!9^4TB z+JEvh&Gl6bh-<2ceC0~#$?}uZjtLoVXB$%>GoH8Ix`Cl39aIlSNwU8(S#3UO9dG$n z-SB3pj8t^_bggwP?i_kCBGcZdBnJK9`{x*W4{W&KrzxkrDwTmpq`8m0BVK<9b!x2Z zxKrHe8ft%M1S4LJu{+O5Ka1vU)8x}PranZe+_IZ&0&A?CjoS5&kE_8<5WnG#{7pY2 z#wR$|?xyh@apw^iCTEU$PS5$6`Q$WBv7cYgwKc=~_}jZi(}i_zzIZO;ui^(>pmAcr zQzg4&@Wr$N9``Bw^u+_)L0P0XqBpOH&wWmeX+Os-uwRi%G*s#hOi&+PcbnL-P{s^B zx%ebkIH=U3&Wb^HDTJ>*w1HqQ`S{k%8Hm-xO+b-vb>~EZ2jYFB$Y-P4BUlac7#?>& zS${Y!1kxAl+`;(L4}MykNns^L|Hu?A25|hTKu}Pdu{vOh52(MdGK`hd`tA5XjL$&4 z#P_vh;G&m4-z&Dq5f!%zM>5O#D#wpDcPR0s&i}=@QIY=%Ja@;F_?Gj+<1y$Kv1yz)jSkMIg6=!)0>RSFti4lI2YU)}Hu?5A zyy`kA4#s{F%kI+^t8>esb@?wkq#oMdY7D$S2(Q5DpD?>Y`ux?I{#cN{*|X<1tb zY4u0&M$S7~iR>_t&6>2$VxT}LS({!RY{&Eu?Gk>rju%?uR|2fk>wyH@cE+XEdJ@OZ@ zyIDGBKI+B`y2ep5!!c!^GkO`$5d)lWS=(h)d{cpX8AS7#*>ael2F&CE5nucX_-P9? zQwmJ!t0J&|OAzF!M37MR+%us$a}~Sd(kZj=f+^un235Y~wP{8srsh z{0h(yprCmEFrfaIv>r{gf1MJvElR`ru|5gXosUNqUE&YlRQ!})0l?b2@2T4Vax>dI zMO#;3iPA{b%Xi=GUFGXc zcU>7XMAK6hIV1u7ILl^0^p_-g?^f4T&#zt|*~q`GU}!H@6d+|x@AniJI*8f>6BKy~Y32c2Vtc8(S0@8U^5Xl?hJ zwugoB&eRY>WECMI-w#Cc~gB^>l%BZ78l zV65#b{oLKq(9m(deD$oZ0$8?O)88?r|3P0O0WBUkoTT2YGly%V`qbrR<&^sDF72AT z#J5uR(@VYIXgJC6y$aR?2^WatSxn+h`}-Yr{q%NC>Gy|P?8}^w3ny?cE;Pxb;S*$c z=p5-BxM)21$^YeSu56U^w1S6$+ScymKP=6mWNJ@}6)~_O0A91>}zBfNlO{b+z5oywTtB4#nT!Http%Yp)KKH>n^v^**>E zGjrA*3=#Zt{`ONl&j``q>%v{H`oUlH+jw-esTVmvdqz>7#tKL-w)nLiuh#`_Rjt)H zw3WL1y4a%$oHT*mbA0hMR;XN0g#TjM{JtriA36?*QNKPi2DVnC3Tpd#fFJGiZqHZt znx&%>wG{XVS<82y#UulJl*14UHFe{w_Z{QxR5<9jvtXiVfzi=l6_(ldzba5TkWdQZ zvmL9MnWnSKePen$ZZ-PB#wY!0QsPHs6A?T94W{Ntp5Vh0E$DvEQ#5eEbB>b}eYY(v zRtDs1a@zB?%yn1!&*hwwuLSjds^}b-Q`7QvdR9{OZsVl<-epI(13=4VcX`Ncx>x~H zU5sAtQoF`d|I3mlDD*rjc!DHO{)QW(lWMIGJBb;DC`S0}=KZ+(Id%5s_iX}_@8?Qe zbE@y?c?XFD1P`SsOEzc?pNS(>?01Uf_4AO!<*Z1oz_pY6d+0oo7|OoV$8KTc*eHTk@Z(=MA=4 z5{?9~^1G}&3>agBNh&N)>}JKDJct-`%+xVN)kf?`;kLV1A{V$1=XQy*&TDih-nIg% z_QvpEaGE|{YEVGn!I$wX&c28@m4SY)kFR8QV8=3&?TDS@3go3%JMtS17u%Gei}f0a zxS=%>=NtI`5tmQF?kwT0dmFu;heUSL?qV7vE{0Cr&-vl4Al_knGn%*n_vKa(2e z9E&xz7EFb`Sas~)EGV)lb?-j@VYAr0gI_HOcY5c0@@IRcwV+Lb2v7D?DQr`iQk%Q# zC5`anXkwzexg}K&b8EF%0lkv_WYjdni*JFS=Pu7X*cp4She1{yoaK8G-3QQduv0JF z#Wjx+t1*Rt_?AIgsyxQB-YB0+`zHbAXfli!zslldt9#E}F#Vf_p0oX_RBLCX4{m=N z5|?EQDWYLjSj_|KxcjuSu!>eWGVNrXf$b1eBldut*CT^85jFht{GLI%bK36X7EUA@ zamyz>V}UO>pmUb8#!F-Izr`O$$^(?{^Zbg~g^*@)38R`Cx_X}bDr@JS4!T7S^i#gd z!1mU${ad=8^{yLTq^ph<0gB*xa~5$yzMMO zL)m5AZ|zF+7MFkJK!qKT{-vyTSP$TnZoCi{+*eG5% zXsOv5jMOQLNE5LC;f}YoyU4_PpIKFDRnIs&^I>9|DT&d!ajH;D&0;|`$0*Yu{MhvB zkS?|^df8{SM$mf|t!p)(aSMA&=nP;ss^=P3Yv_Sf62FXa~BP?I{% z=kXyncHj67LvQf#l?tQGW;7+pKQd}E7>#k}Uy%PP1nrf4T(O>GSAjgDbJE_Hn(9MY z1ATb;-0gWPVy$}$7|Fa9)%`QfU&lz#r|p$-l*lE6@w}Gn!Tc!A?F;3jh8tA| zl&tCU6+5BvIp|}}I_JaKs)3qP+QtJu^T-SZEN|UEeYt(Bx$v3X!IM11gIGgsKM1{( z1}PU9{R$QX;oFtAFCpgmaRHm#C}NYnC^hrx{+EMiD{kW+a5((z{up^C2Ca(G<9!z2 zAb#~s4}E~(BU*&K^~~o-HpG#(HM8W0Fl_Q_=D&HBgtvDEzKWx)$KIl2G-*)PfcG?} zGt8TDuT$l5Nnf5b8o9r8iiJP`10@`HFR*9Y!&UW6GQW4H84WBIq|zEw;*9;i1)w|` z1)N2}Xh zK!tE4CJiI*-Q$>MnRD*T8~$|=rO2(ZrzMFT89=}1(PB{Xevdsd3&yU{?3 ziOB#$4DA{8G5ItI+qbC@)ot9?qVw?3f^3;Q?2J9ojyW8dR6H%yOl{FhdfR`}j}e1E zb)8s2oYPgW>?T@XI=x)9O?mlwKH)*Eu3F72ee-pLy!MQJ>zT}}wu6=Nq50dr1Nl;e zue?e~Xw)z1%xjEJ_mIiT&9ebgkXFZ8D9&^okI&Ha5xfJ!^<05Nl|YB|2& zTESNhSV(v)9EWoX7cxvaJNMU5bi@>&{&lIWLBOE_tD^Vm=|Hl-#@GYbD(qoyT%@Gi zZ6~7RtobW31!j9gTWz;Fk)fCWUEq|R>%)mk72o;c`7dDRV;_9D{fe>SCK{l5Kf&?L z&%*<-L5AyRFDDHrzthj57nnASPdi5X7X7J-$$!u7XxY@0aciTbZc04O4i3<^d0arZ zs-RarJ`q1W>2EbMez(F_(yi@(-W^Uwck$~R9V+aF97;f1ZnRyC>-iWMIN<a-H%&~y7{5!QSOun(LnWWNFAsGLt6oW%K4xRdn&}&Dz9s`| zskaCIPAad`_{srPazFPFeme2A4Dc$iPSAFLak`_S>^TlXTxs2U%o~yt8qU&c<0%)< zg@R7iUp<SGMg*rsw^h2`8>;1e~*2mJ;>|jy0W0qqX@T}O$P>1v1 z;`;adEC&?V^XWWWH9!DfH4=XCJ|;&5aq>8J#rg023PTgP0&sW#bP{Dtq%*O`e|6;6 zxKYx<1GyOVIhpGkS~lN&h`?#TiN_Vgu!HnVNinMji~!5mrpX_SBz7>}tS>moN3%PY z)P+6#C2H%#WnL9(gUZCW;XXsBF@rQ9dC9cft6()hE{w;8;s}EfTMN}{Zl2X)h`X{Lbnn+#?w_jIlhB$^t2jj@Ew(AykZh@LL zPwQIb1a_+W-$465$=&*@=RQWJgR;{&E2y&Vlj+gpTB%Y!GSplY#-0p+&r9Wjd%J*qtWo+dh!|f3LVY-s-@I)tt-IAC??0iBuil`~O zf`=58TDIFH|81~BNySvTqQGSro*Pb{qZA$5&@0aSVtZWx#w+PK)A0+r4uazg-f0_r z-|y(T9P>=Z=!WoVd|T)0`p58cuW;`U#)#x0yDH`da6toiCtD>rUTKU z;dJSByER;gg+CjFzSZ=b-<7?DXeTu$#CX16z0{>zZ1?VqEMNq`astXw+8(>%%tM}l z$gQjsBthbdHN;sc>13g5<>`oyhlsWeHE1jA-!Z@%qTbHKFV$}SmAf#`=uM#d5zqZk z@8cdy&|l&7zu*m#SCgNNm-f-SpH2}V3>(VFucj8KSjQ6Q36?Vl0VSj(lNpl|(gS^d zcEluyv^gi0$|5H0YUWA?zcI$i-;?0cNvdXnM4&<**9kibxn)siKqjiJ;!-=j624nS5eU(BD&q@(Bmx%eDf@iyE3zF%c^ zh^8ZrzU=fkbD;&t&wG}b{?=W?olJ1~>pDwP) z996XMY_}Jzo1--SUl!LoS%&RTGiMvnFFx9|SyO-ZB_TCw@`~4Et z*YPVu+!Q=TQUcht-Wr?wXQu`94b#WsUu|nZQG-tI*UA`-=$pp`_bGb~y;g7XbV$3# zJEh-Bu#{(hCw!JnfLh0DgW}LD>|Q$ofbz^0VO+itqf~%H9wMZ3A(?g@jF4w2iI*|` zPLPujH6pmI*yRFwv#PW5k80gC5@m<44{Prhk%t2d4fRxRB+7MrkmPU7Sqs#~46SD(Jj*bM{Eq}1u)U^8-+3!MI)hHN>^7wTi-~ZFWe8i;P^-GrJCR}jo z&$LkA2)yp{8wc_c-r>64PkK3}+^dQqF_@Y<_x`8ATvGjc<-H^x`M4MJb#jQyO5Hf9 zTXR4UOI$x($cP;VMd^4DoeWW0Cry74Je3xvXb-Bo_7G1jMbQ4NGJskyUBrN!ZZ5T2 z-HERL1qyzmfFlndw)t06jX}-XJI;CxdB&|o1*?xmH3}6Cc_TzI0gY+!gLyV`ip&Pz z#L*!R?>;Pxp2r;Gy6ZF~ou3MPHjX$0F@du(LzIzw(Okmed0Y-HX&A8Pr!e<$Bxg)Cq7t2R~CF zPpQftzFa*Ixb@gi_sW=ZY&qq-UAt}PoEj|Py&mqMYb2Gxt#^Py-%er4snU*j(+)!0 zXP4gPWLwvq)B3)N#jj5KkuwFO7?dJlqOm0bJ+?bcKmt{pxzN+={6DePs<%MQ8D*wQ=Co^39ECCmZJj=N;>A1xlaUEu8_}PR@G3@-#gm>ta8FXe>d?ic_b? zqhw6zP=#&nSG;AT)ILx`Z>oYyKlP01rZ>4(T}y$Y;R4~f7LQc0@u=XP!>$v@yI!)v znZz!tbyeXDHfF5Qs%PC5onE7i*G!NgNb&6`7+`HmmZK|KcWBqQmj&} z!TMakDWhq|CKPMF5eJT3N#MWyo1Ajn^b6CaUT>aEmQbHzuA62p)JP1|4r60osExWG z2VGyuxu!NRL5O5LVRxg6Z9AMKCco4D+0!wn0B`W@L-k3{Ov?>7i;hN1X^WB0Z>CvI z&Ujbey5Z(yk3=7JrT-703NDYb3o&I{^2RXFH_h3Hj@+f2QF?2FfCv`fSJdxLwsmN$ zvD6~}Xi(;U@PzC{J5?_MG`*wY*r)AMX zhv){r+u}INImKDkn;~N|MzprYNC}~Jz^_$NdoBOXM+HfUz=)F%?M!W^eu#M2*-u_^#%akDd6=w0o7`5)qrBou zZ$$Luc$Kv^vvU1@vABK%XI)s07ma&~G67`RZ;Yuo=WWxk-mqRK9@^kznhBK#Yq~TRkq=|H@QQjfqkR+VAfcV zfUmD_-QULwT>Z@I%ubBa6O+AL&_;LX;_}z~?YZ%N_bA9Lt3~k^aWO*>R8mUtD?9FO zplr!1MqN?z_C@ z`jDcE|JMK;<|bF!{m6!=Wt=LIL7>JG{O&S~u9-o2!)~237YW%;2-8Z5PD&_(a zR@2|#WtSiX-zwOCy(M^xyL(g%ATHg$h$i>z8zB{kW(_hQ5R3b2I1N(pw|_U^(_&N=f$*Da!Fo^ZPQ;4xxX*NXK% zNd-{jTFL@iqQ(X#5hj6}|CZg&GHLLXKkQfy4mG$DcO2#$4;|Hdea?VHD7(0U4{qg3 zmi;0kr)e$;`L)_te#Qm7m_Cc2%SEG+OrbR<{JhxaA-Sui_CTyy`lkoGxpqM-3@*&q zV!+{B-h=i02pd|S>bn)67_4(YXXxWXWnduC;_5W&B*so-3bRyb>M@2{@SFL^T+&X~ zxoz8qnA0ivR~_7eU3x-fx?@^Sul8*S6H(1iPRv(ZYu4U%6)70mJ+`!LKW%@+Eu!!! z#JZ^VnH_xYO zvGfuMjh3iOa)B^8w2#X()PVsbUtbvME!a6N#iNad{U}eqw~FZ@JP9dcEs$pS3#~lV zl;fVYTUK(Gld#q`%3P36PpUr0W`&eWpuX?DH-3d$QOP|JlZeLQfELP4ur`INFbM5+ z;0=JReGl3J=LN;qf0rbC?sWJq?<>*@xep2bnK|7xo`qtYxNpo`z93)*+qzWHO*_;rx2IAjM2F5}o5s*4dC_4gNJ zRv>2QbSi%tSSTiALXP#Ugn2+q>$5n&2}|BX#kZ@3i{+Jb!nBX2o(kJ;uk0rDyR?(W z%apFB#U!Vzisg?cFehR!BKH_qd}7J+wZ&~E>rmW zte|E+2m zJ)rx{Jd(!C)wxuhenM@dMzHy>eNtY7)oGE_OhL6pfN-qMeF)5=J zX12|nz~Nf-l&VXgu^8US6lJbi7fC1@A;aSmJr$Q5ytQ%)Nm#;@pD(qJ9iCD^bILkz)^C@hB5iam6Gr8)s;$=jwlA<1d?N&pCvQ zp6_m24FmLuI~;XX?5dio$q2mTkpl&)YQ>hVJFth)?Asd^{jFzccdjd4eA1t)mUd`p znRF{uI^?*Iq6EOjJ~{j{<$ba81gEvsS&>lrW3Yx zq56(-bXid%tJr)7WeEu_VtA7nww}te1L#~gxk9lgfP;PFj9@q3LVNevf0U9eE(sqE zSjay_uZKy0Ooiy@ohk0jJX!tMAm6bnZmG?*xUY=G3VZ#T=TTT!?oYKa`EadV9PR5~ zxSQwBsJE-$TW46oD$w%0>U1iav{g4w1E0$zD&6ab!Z6O#bX~a#nwKf{f%hF~SA)PWaXC+Z?>7f6 zn7lSIrSgitoeJ%bhVfF9-qSJbsYHrV6Y&48vFsZO={;&32JulhB5vHya8~Uer@45M z`TjHg#$ri;26%kR(jp=V9Ey$Svn!96uG90<^3E7o>07Wo27svaS{}QlaQ)S_Np}y4 zhM#=%=KIT0OUE|>58%B?(^(m_nL2rNJ@qgyzA3-(U`7_?wVy*t*1BcJAMh$7mq z+HHV-#ZIbn!4CberV!!xW70>Rb>6Rg9-BWIHbqIq{5PL}z{Fj_U*cd+jl*HhO z@p38|s%&FR6iyMdGbys_+EKa0@f7VqP!MZ{mtj9jCs3@MPKndi{+ zeEk>Myt<9f^`8zr^?JQDq5uHTKhFbn!Bm%3O$wO0h3WK;-XU)CK?zBXteVnT1NA*J z1p0uZY%0mhYL!%J?fw^*U2mn7{*ZIprF!q%gVwj$sWde^HX*NZip*1Kl%Pog{$v=j z6lZ(Lestu+YubVEmOl6qAPU@p@!qH&`fBvBIlsZc6nI&-j`XO!QZ;6&5=Tkz;naZL zS)2UXD;I-4%tPL%u}_*JX{>hmE{ybrCcV%jjR||2uZLL`#&H6r~&0gP2S-PJZuIg_TL%=Jd>UYXb*4<_hex)kQuc!$rzBbLR?1`zG%@ z_d-$J!3Td+AB}hyNwrNJQN~SiVjsaTTGz)4!^u)z+F(9yH9mPAr!u`9wYP)J+V|(C zX7#OZjcvTV6Ch{d>Nh@>GEkv|cKZZL0#Cga=

Z-eq@kE(9%h; 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

Okd~HH>$iuy8mQ?Yz_&x$9f)T@&)u&b;U{C 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%0Df9|hjB>uBrl|p&x!z@& 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⪚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 z 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 a?}^?WCr%it{}e(&KB|hE3iWc<5&r{Ntn63- diff --git a/docs/images/migration/start_migration.png b/docs/images/migration/start_migration.png deleted file mode 100644 index 4e90e71c6f8ffe202c2940462c3f301833b30919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40874 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 Date: Tue, 18 Nov 2025 20:30:57 +0000 Subject: [PATCH 3/4] Refactor atomic migration tests The test classes for the atomic migration recipe have been renamed for clarity. `StartAtomicMigrationActivity` is now `BeginAtomicMigrationActivity`, and the test now also includes the newly named `EndAtomicMigrationActivity`. --- .../java/com/example/nav3recipes/AtomicMigrationTest.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt b/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt index 27af52e1..96c67dbb 100644 --- a/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt +++ b/app/src/androidTest/java/com/example/nav3recipes/AtomicMigrationTest.kt @@ -8,7 +8,8 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.espresso.Espresso -import com.example.nav3recipes.migration.atomic.test.StartAtomicMigrationActivity +import com.example.nav3recipes.migration.atomic.begin.BeginAtomicMigrationActivity +import com.example.nav3recipes.migration.atomic.end.EndAtomicMigrationActivity import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -29,8 +30,8 @@ class AtomicMigrationTest(activityClass: Class) { @Parameters(name = "{0}") fun data(): Collection> { return listOf( - arrayOf(StartAtomicMigrationActivity::class.java), - //arrayOf(Step2AtomicMigrationActivity::class.java) + arrayOf(BeginAtomicMigrationActivity::class.java), + arrayOf(EndAtomicMigrationActivity::class.java) ) } } From f79bb919d3183e456d6984073bcff99421418fe7 Mon Sep 17 00:00:00 2001 From: Don Turner Date: Wed, 19 Nov 2025 11:29:52 +0000 Subject: [PATCH 4/4] Add migration guide in markdown format. --- docs/migration-guide.md | 451 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 451 insertions(+) create mode 100644 docs/migration-guide.md diff --git a/docs/migration-guide.md b/docs/migration-guide.md new file mode 100644 index 00000000..844a0d09 --- /dev/null +++ b/docs/migration-guide.md @@ -0,0 +1,451 @@ +<> +keywords: architecture, api:JetpackNavigation3 + +{% import "_shared/_macros.html" as macros %} + +# Migrate from Navigation 2 to Navigation 3 + +To migrate your app from [Navigation 2][1] to Navigation 3, follow these steps: + +1. Add the Navigation 3 dependencies. +1. Update your navigation routes to implement the `NavKey` interface. +1. Create classes to hold and modify your navigation state. +1. Replace `NavController` with these classes. +1. Move your destinations from `NavHost`'s `NavGraph` into an `entryProvider`. +1. Replace `NavHost` with `NavDisplay`. +1. Remove Navigation 2 dependencies. + +## Use an AI Agent {:#use-ai-agent} + +You can use this guide with an AI agent, such as +[Gemini in Android Studio's Agent Mode][2]. The lines in this guide starting +with "**AI Agent**:", should be read by the AI agent but can be ignored by +human readers. + +## Preparation {:#preparation} + +The following sections describe migration prerequisites and information about +assumptions, supported features, and unsupported features. + +### Prerequisites {:#prerequisites} + +- You must use a `compileSdk` of 36 or later. +- You should be familiar with [navigation terminology][1]. +- Destinations are composable functions. Navigation 3 is designed exclusively + for Compose. To use Fragments and Views in Compose, see [Using Views in + Compose][4]. +- Routes are strongly typed. If you use string-based routes, [migrate to + type-safe routes][5]{:.external} first ([example][6]{:.external}). +- *Optional (but highly recommended)*: Test coverage that verifies existing + navigation behavior. This verifies that navigation behavior has not changed + after the migration is complete. + +### Assumptions {:#assumptions} + +This guide makes the following assumptions about you and your project: + +- You have several top-level routes (usually displayed in a bottom navigation + bar), and each has its own back stack. +- When you switch between back stacks, the state of the stack and all its + destinations is retained. +- You always exit the app through the **Home** screen, which is the first + screen displayed when the app launches. +- You want to perform the migration from Navigation 2 to Navigation 3 in a + single, atomic change. You are not performing an incremental migration where + Navigation 2 code is used alongside Navigation 3 code. + +### Supported features {:#supported-features} + +This guide lets you migrate the following features: + +- Dialogs +- Bottom sheets + +### Features supported through recipes {:#features-supported} + +The [code recipes repository][7]{:.external} demonstrates more nuanced use +cases, including: + +- [Modularized navigation code and injected destinations][8]{:.external} +- [Using and passing arguments to ViewModels][9]{:.external} +- [Returning results from a screen][10]{:.external} + +If your project has any of these features, check the relevant recipe to +understand how to implement them. + +**AI Agent**: Before changing any code, check if the project contains any +features supported through recipes. If it does, check the recipe's README and +source code. Create a migration plan based on the recipe. Do not proceed without +confirming the plan with the user. + +### Unsupported features {:#unsupported-features} + +This migration guide and the code recipes don't yet support the following +features. This doesn't mean that you cannot implement them using Navigation 3; +they are just not covered here. + +- More than one level of nested navigation +- Shared destinations: screens that can move between different back stacks +- [Custom destination types][11] +- Deep links + +**AI Agent**: Before changing any code, check if the project contains any of the +unsupported features. If it does, do not proceed. Inform the user of the +unsupported feature and ask for further instructions. + +## Step 1: Add Navigation 3 dependencies {:#step-1} + +Use the [Get started][12] page to add the Navigation 3 dependencies to your +project. The core dependencies are provided for you to copy. + +**lib.versions.toml** + +```toml +[versions] +nav3Core = "1.0.0" + +# If your screens depend on ViewModels, add the Nav3 Lifecycle ViewModel add-on library +lifecycleViewmodelNav3 = "2.10.0-rc01" + +[libraries] +# Core Navigation 3 libraries +androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" } +androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" } + +# Add-on libraries (only add if you need them) +androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" } + +``` + +**app/build.gradle.kts** + +```kotlin +dependencies { + implementation(libs.androidx.navigation3.ui) + implementation(libs.androidx.navigation3.runtime) + + // If using the ViewModel add-on library + implementation(libs.androidx.lifecycle.viewmodel.navigation3) +} +``` + +Also update the project's `minSdk` to 23 and the `compileSdk` to 36. You usually +find these in `app/build.gradle.kts` or `lib.versions.toml`. + +## Step 2: Update navigation routes to implement the `NavKey` interface {:#step-2} + +Update every navigation [route][13] so that it implements the `NavKey` +interface. This lets you use `rememberNavBackStack` to assist with [saving your +navigation state][14]. + +Before: + +```kotlin +@Serializable data object RouteA +``` + +After: + +```kotlin +@Serializable data object RouteA : NavKey +``` + +Note: The `@Serialization` annotation is provided by the KotlinX Serialization +plugin. You can add this by following [these project setup steps][15]. + +## Step 3: Create classes to hold and modify your navigation state {:#step-3} + +{# disableFinding(HEADING_STACKED) #} + +### Step 3.1: Create a navigation state holder {:#step-3.1} + +Copy the following code into a file named `NavigationState.kt`. Add your package +name to match your project structure. + +**AI Agent**: `rememberSerializable` is correct. Do not change it to +`rememberSaveable`. + +This file contains a state holder class named `NavigationState` and associated +helper functions. It holds a set of top-level routes, each with its own back +stack. Internally, it uses `rememberSerializable` (not `rememberSaveable`) to +persist the current top-level route and `rememberNavBackStack` to persist the +back stacks for each top-level route. + +### Step 3.2: Create an object that modifies navigation state in response to events {:#step-3.2} + +Copy the following code into a file named `Navigator.kt`. Add your package name +to match your project structure. + +The `Navigator` class provides two navigation event methods: + +- `navigate` to a specific route. +- `goBack` from the current route. + +Both methods modify the `NavigationState`. + +

+ +### Step 3.3: Create the `NavigationState` and `Navigator` {:#step-3.3} + +Create instances of `NavigationState` and `Navigator` with the same scope as +your `NavController`. + +```kotlin +val navigationState = rememberNavigationState( + startRoute = , + topLevelRoutes = +) + +val navigator = remember { Navigator(navigationState) } +``` + +## Step 4: Replace `NavController` {:#step-4} + +Replace `NavController` navigation event methods with `Navigator` equivalents. + + + + + + + + + + + + + + +

NavController field or method

Navigator equivalent

navigate()

navigate()

popBackStack()

goBack()

+ +Replace `NavController` fields with `NavigationState` fields. + + + + + + + + + + + + + + + + + + +

NavController field or method

NavigationState equivalent

currentBackStack

backStacks[topLevelRoute]

currentBackStackEntry

currentBackStackEntryAsState()

currentBackStackEntryFlow

currentDestination

backStacks[topLevelRoute].last()

Get the top level route: Traverse up the hierarchy from the current back stack entry to find it.

topLevelRoute

+ +Use `NavigationState.topLevelRoute` to determine which item is currently +selected in a navigation bar. + +Before: + +```kotlin +val isSelected = navController.currentBackStackEntryAsState().value?.destination.isRouteInHierarchy(key::class) +``` + +After: + +```kotlin +val isSelected = key == navigationState.topLevelRoute +``` + +Verify that you remove all references to `NavController`, including any imports. + +## Step 5: Move your destinations from `NavHost`'s `NavGraph` into an `entryProvider`Move your navigation graph outside of `NavHost` and into an `entryProvider` {:#step-5} + +In Navigation 2, you [define your destinations](/guide/navigation/design#compose) +using the [NavGraphBuilder DSL](/guide/navigation/design/kotlin-dsl#navgraphbuilder), +usually inside `NavHost`'s trailing lambda. It is common to use extension +functions here as described in [Encapsulate your navigation code][17]. + +In Navigation 3, you define your destinations using an `entryProvider`. This +`entryProvider` resolves a route to a [`NavEntry`][18]. Importantly, the +`entryProvider` does not define parent-child relationships between entries. + +In this migration guide, parent-child relationships are modelled +as follows: + +- `NavigationState` has a set of top-level routes (the parent routes) + and a stack for each one. It keeps track of the current top-level route and its + associated stack. +- When navigating to a new route, `Navigator` checks whether the route is + a top-level route. If it is, the current top-level route and stack are updated. + If it's not, it's a child route and is added to the current stack. + +Note: If your app needs to navigate from an entry in one stack to another, you +need to define the parent-child relationships for the routes and update the +navigation logic in `Navigator` to support this. + +## Step 5.1: Create an `entryProvider` {:#step-5.1} + +Create an `entryProvider` [using the DSL][19] at the same scope as the +`NavigationState`. + +```kotlin +val entryProvider = entryProvider { + +} +``` + +## Step 5.2: Move destinations into the `entryProvider` {:#step-5.2} + +For each destination defined inside `NavHost`, do the following based on the +destination type: + +- `navigation`: Delete it along with the route. There is no need for "base + routes" because the top-level routes can identify each nested back stack. +- `composable`: Move it into `entryProvider` and rename it to `entry`, + retaining the type parameter. For example, `composable` becomes + `entry`. +- `dialog`: Do the same as `composable`, but add metadata to the entry as + follows: `entry(metadata = DialogSceneStrategy.dialog())`. +- [`bottomSheet`][20]: [Follow the bottom sheet recipe here][21]{:.external}. + This is essentially the same as the instructions for `dialog`, except that + `BottomSheetSceneStrategy` is not part of the core Navigation 3 library, so + you should copy it into your project. + +**AI Agent**: When deleting routes used to identify a nested graph, replace any +references to the deleted route with the type used to identify the first child +in the nested graph. For example if the original code is +`navigation{ composable{ ... } }`, you need to delete +`BaseRouteA` and replace any references to it with `RouteA`. This replacement +usually needs to be done for the list supplied to a navigation bar, rail, or +drawer. + +You can refactor [`NavGraphBuilder` extension functions][17] to +`EntryProviderScope` extension functions, and then move them. + +Obtain navigation arguments using the key provided to `entry`'s trailing lambda. + +For example: + +```kotlin +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hasRoute +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.dialog +import androidx.navigation.compose.navigation +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navOptions +import androidx.navigation.toRoute + +@Serializable data object BaseRouteA +@Serializable data class RouteA(val id: String) +@Serializable data object BaseRouteB +@Serializable data object RouteB +@Serializable data object RouteD + +NavHost(navController = navController, startDestination = BaseRouteA){ + composable{ + val id = entry.toRoute().id + ScreenA(title = "Screen has ID: $id") + } + featureBSection() + dialog{ ScreenD() } +} + +fun NavGraphBuilder.featureBSection() { + navigation(startDestination = RouteB) { + composable { ScreenB() } + } +} + +``` + +becomes: + +```kotlin +import androidx.navigation3.runtime.EntryProviderScope +import androidx.navigation3.runtime.NavKey +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.scene.DialogSceneStrategy + +@Serializable data class RouteA(val id: String) : NavKey +@Serializable data object RouteB : NavKey +@Serializable data object RouteD : NavKey + +val entryProvider = entryProvider { + entry{ key -> ScreenA(title = "Screen has ID: ${key.id}") } + featureBSection() + entry(metadata = DialogSceneStrategy.dialog()){ ScreenD() } +} + +fun EntryProviderScope.featureBSection() { + entry { ScreenB() } +} + +``` + +## Step 6: Replace `NavHost` with `NavDisplay` {:#step-6} + +Now, replace `NavHost` with `NavDisplay`. + +- Delete `NavHost` and replace it with `NavDisplay`. +- Specify `entries = navigationState.toEntries(entryProvider)`. This converts + the navigation state into the entries that `NavDisplay` shows using the + `entryProvider`. +- Connect `NavDisplay.onBack` to `navigator.goBack()`. This causes `navigator` + to update the navigation state when `NavDisplay`'s built-in back handler + completes. +- If you have dialog destinations, add `DialogSceneStrategy` to `NavDisplay`'s + `sceneStrategy` parameter. + +For example: + +```kotlin +import androidx.navigation3.ui.NavDisplay + +NavDisplay( + entries = navigationState.toEntries(entryProvider), + onBack = { navigator.goBack() }, + sceneStrategy = remember { DialogSceneStrategy() } +) + +``` + +## Step 7: Remove Navigation 2 dependencies {:#step-7} + +At this point, you should have no Navigation 2 dependencies. Remove all imports +and library dependencies. + +## Summary {:#summary} + +Congratulations! Your project is now migrated to Navigation 3. If you or your AI +agent has run into any problems using this guide, [file a bug +here][22]{:.external}. + +[1]: https://developer.android.com/guide/navigation +[2]: https://developer.android.com/studio/gemini/agent-mode +[4]: https://developer.android.com/develop/ui/compose/migrate/interoperability-apis/views-in-compose +[5]: https://medium.com/androiddevelopers/type-safe-navigation-for-compose-105325a97657 +[6]: https://github.com/android/nowinandroid/pull/1413 +[7]: https://github.com/android/nav3-recipes +[8]: https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/modular/hilt +[9]: https://github.com/android/nav3-recipes?tab=readme-ov-file#passing-navigation-arguments-to-viewmodels +[10]: https://github.com/android/nav3-recipes?tab=readme-ov-file#returning-results +[11]: https://developer.android.com/guide/navigation/design/kotlin-dsl#custom +[12]: https://developer.android.com/guide/navigation/navigation-3/get-started +[13]: https://developer.android.com/guide/navigation#types +[14]: https://developer.android.com/guide/navigation/navigation-3/save-state +[15]: https://developer.android.com/guide/navigation/navigation-3/get-started#project-setup +[17]: https://developer.android.com/guide/navigation/design/encapsulate +[18]: https://developer.android.com/guide/navigation/navigation-3/basics#resolve-keys +[19]: https://developer.android.com/guide/navigation/navigation-3/basics#entry-provider-DSL +[20]: https://developer.android.com/reference/kotlin/androidx/compose/material/navigation/package-summary#(androidx.navigation.NavGraphBuilder).bottomSheet(kotlin.String,kotlin.collections.List,kotlin.collections.List,kotlin.Function2) +[21]: https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/bottomsheet +[22]: https://issuetracker.google.com/issues/new?component=1750212&template=2102223&title=%5BMigration%5D \ No newline at end of file