diff options
author | android-build-prod (mdb) <android-build-team-robot@google.com> | 2020-11-17 05:27:38 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-11-17 05:27:38 +0000 |
commit | 6fcc150559bd8159f78ff76452f3a0931a90743a (patch) | |
tree | 5bdcb212cd96d67019c2f1113275bf12e7022114 | |
parent | 6ef753a402ba1c39ef91b36493df7bd0accfe85f (diff) | |
parent | 6971d15ed9c643ad78061088234346dacf25f8e1 (diff) | |
download | support-snap-temp-L31900000748495797.tar.gz |
Merge "Merge cherrypicks of [1501296] into androidx-navigation-release" into androidx-navigation-releasesnap-temp-L31900000748495797
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"); } |