diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-01-29 21:53:51 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-01-29 21:53:51 +0000 |
commit | ac8c84b6a2138a6755bafc2b2e56dbddbaf45542 (patch) | |
tree | cb723815587079e0ffa8d03fbaf52564eee4842c | |
parent | 0d7cf764d03cdb757f2b9eba55d0871a61833fbb (diff) | |
parent | e62cf1e0e3ca9c4e36aa73bd785c8ac286ea099e (diff) | |
download | support-androidx-navigation-release.tar.gz |
Merge "Merge cherrypicks of ['android-review.googlesource.com/2874596', 'android-review.googlesource.com/2882895', 'android-review.googlesource.com/2933510'] into androidx-navigation-release." into androidx-navigation-releaseandroidx-navigation-release
5 files changed, 94 insertions, 4 deletions
diff --git a/libraryversions.toml b/libraryversions.toml index 653ab694969..65bf79931a0 100644 --- a/libraryversions.toml +++ b/libraryversions.toml @@ -92,7 +92,7 @@ MEDIA = "1.7.0-alpha02" MEDIA2 = "1.3.0-alpha01" MEDIAROUTER = "1.6.0-beta01" METRICS = "1.0.0-alpha05" -NAVIGATION = "2.7.6" +NAVIGATION = "2.7.7" PAGING = "3.3.0-alpha01" PALETTE = "1.1.0-alpha01" PERCENTLAYOUT = "1.1.0-alpha01" diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt index 740952207cc..ec8c4ed3fc6 100644 --- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt +++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt @@ -641,7 +641,8 @@ public open class NavDestination( val value = context.getString(bundle.getInt(argName)) builder.append(value) } else { - builder.append(bundle.getString(argName)) + @Suppress("DEPRECATION") + builder.append(bundle[argName].toString()) } } else { throw IllegalArgumentException( diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt index c4df0504231..9fa787c19ff 100644 --- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt +++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt @@ -2792,6 +2792,64 @@ class NavControllerTest { @UiThreadTest @Test + fun testNavigateOptionSaveStackNoRestore() { + val backStackStateKey = "android-support-nav:controller:backStackStates" + val navController = createNavController() + navController.setGraph(R.navigation.nav_simple) + val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java) + assertThat(navigator.backStack.size).isEqualTo(1) + val startEntry = navController.currentBackStackEntry + + // save startDestination when it is popped + navController.navigate( + R.id.second_test, + null, + navOptions { + popUpTo(R.id.nav_root) { + inclusive = false + saveState = true + } + } + ) + + val firstSaveState = navController.saveState() + val firstBackStackStateSaved = firstSaveState?.getStringArrayList(backStackStateKey) + assertThat(firstBackStackStateSaved?.size).isEqualTo(1) + assertThat(firstBackStackStateSaved?.get(0)).isEqualTo(startEntry!!.id) + + // go back to start destination + navController.navigate( + R.id.start_test, + null, + navOptions { + popUpTo(R.id.nav_root) { + inclusive = false + saveState = false + } + } + ) + + // save startDestination again when it is popped + navController.navigate( + R.id.second_test, + null, + navOptions { + popUpTo(R.id.nav_root) { + inclusive = false + saveState = true + } + } + ) + + val secondSaveState = navController.saveState() + val secondBackStackStateSaved = secondSaveState?.getStringArrayList(backStackStateKey) + // backStackState should only contain the original startEntry + assertThat(secondBackStackStateSaved?.size).isEqualTo(1) + assertThat(secondBackStackStateSaved?.get(0)).isEqualTo(startEntry.id) + } + + @UiThreadTest + @Test fun testNavigateOptionNestedSaveRestoreStateInclusive() { val navController = createNavController() navController.setViewModelStore(ViewModelStore()) diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt index 6fb24e02319..f3d434086a8 100644 --- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt +++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt @@ -683,8 +683,12 @@ public open class NavController( }.forEach { destination -> backStackMap[destination.id] = firstState.id } - // And finally, store the actual state itself - backStackStates[firstState.id] = savedState + + if (backStackMap.values.contains(firstState.id)) { + // And finally, store the actual state itself if the entry was added + // to backStackMap + backStackStates[firstState.id] = savedState + } } } updateOnBackPressedCallbackEnabled() diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt index 992ee494751..77714ce5ef3 100644 --- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt +++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt @@ -193,6 +193,33 @@ class NavigationUITest { assertThat(toolbar.title.toString()).isEqualTo(labelString) } + @UiThreadTest + @Test + fun navigateWithNonStringArg() { + val context = ApplicationProvider.getApplicationContext<Context>() + val navController = NavHostController(context) + navController.navigatorProvider.addNavigator(TestNavigator()) + + val startDestination = "start_destination" + val endDestination = "end_destination" + + navController.graph = navController.createGraph(startDestination = startDestination) { + test(startDestination) + test("$endDestination/{test}") { + label = "{test}" + argument(name = "test") { + type = NavType.LongType + } + } + } + + val toolbar = Toolbar(context).apply { setupWithNavController(navController) } + navController.navigate("$endDestination/123") + + val expected = "123" + assertThat(toolbar.title.toString()).isEqualTo(expected) + } + private fun createToolbarOnDestinationChangedListener( toolbar: Toolbar, bundle: Bundle?, |