[go: nahoru, domu]

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();