Fix deep linking when using nested start destinations
Ensure that findInvalidDestinationDisplayNameInDeepLink
correctly handles nested start destinations.
Test: new NavControllerTest passes
BUG: 154532067
Change-Id: I95b84ea1ca0f8901c3af5447a3f60fae29daa8d0
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 f7dd01a..de448ce 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -1045,6 +1045,41 @@
}
@Test
+ fun testHandleDeepLinkNestedStartDestination() {
+ val navController = createNavController()
+ navController.setGraph(R.navigation.nav_nested_start_destination)
+ val onDestinationChangedListener =
+ mock(NavController.OnDestinationChangedListener::class.java)
+ navController.addOnDestinationChangedListener(onDestinationChangedListener)
+ val startDestination = navController.findDestination(R.id.nested_test)
+ verify(onDestinationChangedListener).onDestinationChanged(
+ eq(navController),
+ eq(startDestination),
+ any())
+
+ val taskStackBuilder = navController.createDeepLink()
+ .setDestination(R.id.second_test)
+ .createTaskStackBuilder()
+
+ val intent = taskStackBuilder.editIntentAt(0)
+ assertNotNull(intent)
+ assertWithMessage("NavController should handle deep links to its own graph")
+ .that(navController.handleDeepLink(intent))
+ .isTrue()
+
+ // Verify that we navigated down to the deep link
+ verify(onDestinationChangedListener, times(2)).onDestinationChanged(
+ eq(navController),
+ eq(startDestination),
+ any())
+ verify(onDestinationChangedListener).onDestinationChanged(
+ eq(navController),
+ eq(navController.findDestination(R.id.second_test)),
+ any())
+ verifyNoMoreInteractions(onDestinationChangedListener)
+ }
+
+ @Test
fun testHandleDeepLinkInvalid() {
val navController = createNavController()
navController.setGraph(R.navigation.nav_simple)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
index 96b0b0f..ec324d2 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
@@ -758,7 +758,7 @@
int destinationId = deepLink[i];
NavDestination node = i == 0
? (mGraph.getId() == destinationId ? mGraph : null)
- : graph.findNode(destinationId, false);
+ : graph.findNode(destinationId);
if (node == null) {
return NavDestination.getDisplayName(mContext, destinationId);
}