aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-prod (mdb) <android-build-team-robot@google.com>2020-11-17 05:27:38 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2020-11-17 05:27:38 +0000
commit6fcc150559bd8159f78ff76452f3a0931a90743a (patch)
tree5bdcb212cd96d67019c2f1113275bf12e7022114
parent6ef753a402ba1c39ef91b36493df7bd0accfe85f (diff)
parent6971d15ed9c643ad78061088234346dacf25f8e1 (diff)
downloadsupport-snap-temp-L31900000748495797.tar.gz
Merge "Merge cherrypicks of [1501296] into androidx-navigation-release" into androidx-navigation-releasesnap-temp-L31900000748495797
-rw-r--r--navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt24
-rw-r--r--navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java11
2 files changed, 35 insertions, 0 deletions
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
index 25b37009d71..0acdadaca76 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
@@ -23,6 +23,8 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import androidx.fragment.app.FragmentManager
+import androidx.navigation.NavController
+import androidx.navigation.Navigation
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
@@ -83,6 +85,28 @@ class DialogFragmentNavigatorTest {
@UiThreadTest
@Test
+ fun testFindNavController() {
+ val dialogFragment = EmptyDialogFragment()
+ // Fake using a NavHostFragment and instead just manually show the DialogFragment
+ dialogFragment.showNow(fragmentManager, null)
+ assertWithMessage("Dialog should be shown")
+ .that(dialogFragment.requireDialog().isShowing)
+ .isTrue()
+
+ // And set a NavController on the root view
+ val navController = NavController(emptyActivity)
+ Navigation.setViewNavController(
+ dialogFragment.requireDialog().window!!.decorView,
+ navController
+ )
+
+ val returnedNavController = NavHostFragment.findNavController(dialogFragment)
+ assertThat(returnedNavController)
+ .isEqualTo(navController)
+ }
+
+ @UiThreadTest
+ @Test
fun testPop() {
lateinit var dialogFragment: DialogFragment
fragmentManager.fragmentFactory = object : FragmentFactory() {
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
index 97be486c9c6..c8d466d683e 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
@@ -16,6 +16,7 @@
package androidx.navigation.fragment;
+import android.app.Dialog;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
@@ -28,6 +29,7 @@ import androidx.annotation.CallSuper;
import androidx.annotation.NavigationRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentContainerView;
import androidx.navigation.NavController;
@@ -117,6 +119,15 @@ public class NavHostFragment extends Fragment implements NavHost {
if (view != null) {
return Navigation.findNavController(view);
}
+
+ // For DialogFragments, look at the dialog's decor view
+ Dialog dialog = fragment instanceof DialogFragment
+ ? ((DialogFragment) fragment).getDialog()
+ : null;
+ if (dialog != null && dialog.getWindow() != null) {
+ return Navigation.findNavController(dialog.getWindow().getDecorView());
+ }
+
throw new IllegalStateException("Fragment " + fragment
+ " does not have a NavController set");
}