Fix popBackStack() and DialogFragmentNavigator
Ensure that DialogFragmentNavigator correctly
finds and dismisses the appropriate dialog when
it gets a callback to popBackStack().
Test: new DialogFragmentNavigatorTest
Fixes: 132576764
Change-Id: I3b5f7e5a8599e255dd2a0820040ff95a33a98e4a
diff --git a/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
index 0403fe2..25b3700 100644
--- a/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
+++ b/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
@@ -80,6 +80,39 @@
.that(dialogFragment.requireDialog().isShowing)
.isTrue()
}
+
+ @UiThreadTest
+ @Test
+ fun testPop() {
+ lateinit var dialogFragment: DialogFragment
+ fragmentManager.fragmentFactory = object : FragmentFactory() {
+ override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
+ return super.instantiate(classLoader, className).also { fragment ->
+ if (fragment is DialogFragment) {
+ dialogFragment = fragment
+ }
+ }
+ }
+ }
+ val dialogNavigator = DialogFragmentNavigator(emptyActivity, fragmentManager)
+ val destination = dialogNavigator.createDestination().apply {
+ id = INITIAL_FRAGMENT
+ className = EmptyDialogFragment::class.java.name
+ }
+
+ assertThat(dialogNavigator.navigate(destination, null, null, null))
+ .isEqualTo(destination)
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dialog should be shown")
+ .that(dialogFragment.requireDialog().isShowing)
+ .isTrue()
+ assertWithMessage("DialogNavigator should pop dialog off the back stack")
+ .that(dialogNavigator.popBackStack())
+ .isTrue()
+ assertWithMessage("Pop should dismiss the DialogFragment")
+ .that(dialogFragment.requireDialog().isShowing)
+ .isFalse()
+ }
}
class EmptyDialogFragment : DialogFragment() {
diff --git a/navigation/fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.java b/navigation/fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.java
index 38da7ab..0fd7840 100644
--- a/navigation/fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.java
+++ b/navigation/fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.java
@@ -81,7 +81,7 @@
return false;
}
Fragment existingFragment = mFragmentManager
- .findFragmentByTag(DIALOG_TAG + mDialogCount--);
+ .findFragmentByTag(DIALOG_TAG + --mDialogCount);
if (existingFragment != null) {
existingFragment.getLifecycle().removeObserver(mObserver);
((DialogFragment) existingFragment).dismiss();