aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-01-29 21:53:51 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-01-29 21:53:51 +0000
commitac8c84b6a2138a6755bafc2b2e56dbddbaf45542 (patch)
treecb723815587079e0ffa8d03fbaf52564eee4842c
parent0d7cf764d03cdb757f2b9eba55d0871a61833fbb (diff)
parente62cf1e0e3ca9c4e36aa73bd785c8ac286ea099e (diff)
downloadsupport-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
-rw-r--r--libraryversions.toml2
-rw-r--r--navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt3
-rw-r--r--navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt58
-rw-r--r--navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt8
-rw-r--r--navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt27
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?,