Add factory functions for DynamicNavHostFragment
Bug: 175222619
Test: updateApi and cAT
RelNote: Add factory functions for DynamicNavHostFragment
Change-Id: Icd51523a8f3cc3f93fffc1796c6a270bc28eaede
diff --git a/navigation/navigation-dynamic-features-fragment/api/current.txt b/navigation/navigation-dynamic-features-fragment/api/current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/current.txt
@@ -30,7 +30,15 @@
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
ctor public DynamicNavHostFragment();
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+ field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+ }
+
+ public static final class DynamicNavHostFragment.Companion {
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
}
}
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
@@ -30,7 +30,15 @@
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
ctor public DynamicNavHostFragment();
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+ field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+ }
+
+ public static final class DynamicNavHostFragment.Companion {
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
}
}
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
@@ -30,7 +30,15 @@
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
ctor public DynamicNavHostFragment();
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+ field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+ }
+
+ public static final class DynamicNavHostFragment.Companion {
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+ method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
}
}
diff --git a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
index 7c33183..ee291df 100644
--- a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
@@ -21,8 +21,10 @@
import androidx.navigation.dynamicfeatures.createGraph
import androidx.navigation.get
import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
+import androidx.testutils.withActivity
import com.google.common.truth.Truth.assertWithMessage
import org.junit.Rule
import org.junit.Test
@@ -30,14 +32,17 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
-class DynamicFragmentNavigatorDestinationBuilderTest {
+public class DynamicFragmentNavigatorDestinationBuilderTest {
@Suppress("DEPRECATION")
@get:Rule
- val activityRule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
- private val fragmentManager get() = activityRule.activity.supportFragmentManager
+ public val rule: ActivityScenarioRule<TestActivity> = ActivityScenarioRule(
+ TestActivity::class.java
+ )
+ private val fragmentManager get() = rule.scenario.withActivity { supportFragmentManager }
@UiThreadTest
- @Test fun reified() {
+ @Test
+ public fun reified() {
val navHostFragment = DynamicNavHostFragment()
fragmentManager.beginTransaction()
.add(android.R.id.content, navHostFragment)
@@ -52,7 +57,8 @@
}
@UiThreadTest
- @Test fun moduleName() {
+ @Test
+ public fun moduleName() {
val navHostFragment = DynamicNavHostFragment()
fragmentManager.beginTransaction()
.add(android.R.id.content, navHostFragment)
@@ -72,7 +78,8 @@
}
@UiThreadTest
- @Test fun no_moduleName() {
+ @Test
+ public fun no_moduleName() {
val navHostFragment = DynamicNavHostFragment()
fragmentManager.beginTransaction()
.add(android.R.id.content, navHostFragment)
@@ -94,5 +101,5 @@
private const val MODULE_NAME = "module"
private const val FRAGMENT_CLASS_NAME = "androidx.navigation.dynamicfeatures.fragment.TestFragment"
-class TestActivity : FragmentActivity()
-class TestFragment : Fragment()
+public class TestActivity : FragmentActivity()
+private class TestFragment : Fragment()
diff --git a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
index 59e061f..e1fa686 100644
--- a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
@@ -20,9 +20,11 @@
import androidx.fragment.app.FragmentActivity
import androidx.navigation.dynamicfeatures.fragment.test.R
import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import androidx.testutils.withActivity
+import com.google.android.play.core.splitinstall.SplitInstallManager
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
@@ -30,14 +32,16 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
-class DynamicNavHostFragmentTest {
+public class DynamicNavHostFragmentTest {
@Suppress("DEPRECATION")
@get:Rule
- val activityTestRule = androidx.test.rule.ActivityTestRule(NavigationActivity::class.java)
+ public val activityTestRule: ActivityScenarioRule<NavigationActivity> = ActivityScenarioRule(
+ NavigationActivity::class.java
+ )
@Test
- fun createSplitInstallManager() {
+ public fun createSplitInstallManager() {
val fragment = TestDynamicNavHostFragment()
with(ActivityScenario.launch(NavigationActivity::class.java)) {
withActivity {
@@ -49,15 +53,33 @@
}
assertEquals(fragment.createSplitInstallManager(), fragment.createSplitInstallManager())
}
+
+ @Test
+ public fun create_noArgs() {
+ val fragment = DynamicNavHostFragment.create(R.id.nav_host)
+ assertEquals(fragment.arguments!!.size(), 1)
+ }
+
+ @Test
+ public fun create_withArgs() {
+ val fragment = DynamicNavHostFragment.create(
+ R.id.nav_host,
+ Bundle().apply {
+ putInt("Test", 1)
+ }
+ )
+ assertEquals(fragment.arguments!!.size(), 2)
+ }
}
-class NavigationActivity : FragmentActivity() {
+public class NavigationActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.dynamic_activity_layout)
super.onCreate(savedInstanceState)
}
}
-class TestDynamicNavHostFragment : DynamicNavHostFragment() {
- public override fun createSplitInstallManager() = super.createSplitInstallManager()
+public class TestDynamicNavHostFragment : DynamicNavHostFragment() {
+ public override fun createSplitInstallManager(): SplitInstallManager =
+ super.createSplitInstallManager()
}
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
index 35b8ac7..b062ef3 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
@@ -16,6 +16,8 @@
package androidx.navigation.dynamicfeatures.fragment
+import android.os.Bundle
+import androidx.annotation.NavigationRes
import androidx.navigation.NavHostController
import androidx.navigation.dynamicfeatures.DynamicActivityNavigator
import androidx.navigation.dynamicfeatures.DynamicGraphNavigator
@@ -69,4 +71,35 @@
*/
protected open fun createSplitInstallManager(): SplitInstallManager =
SplitInstallManagerFactory.create(requireContext())
+
+ /** Companion object for DynamicNavHostFragment */
+ public companion object {
+
+ /**
+ * Create a new [DynamicNavHostFragment] instance with an inflated {@link NavGraph} resource.
+ *
+ * @param graphResId Resource id of the navigation graph to inflate.
+ * @param startDestinationArgs Arguments to send to the start destination of the graph.
+ * @return A new DynamicNavHostFragment instance.
+ */
+ @JvmStatic
+ @JvmOverloads
+ public fun create(
+ @NavigationRes graphResId: Int,
+ startDestinationArgs: Bundle? = null
+ ): DynamicNavHostFragment {
+ return DynamicNavHostFragment().apply {
+ arguments = if (graphResId != 0 || startDestinationArgs != null) {
+ Bundle().apply {
+ if (graphResId != 0) {
+ putInt(KEY_GRAPH_ID, graphResId)
+ }
+ if (startDestinationArgs != null) {
+ putBundle(KEY_START_DESTINATION_ARGS, startDestinationArgs)
+ }
+ }
+ } else null
+ }
+ }
+ }
}
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 2d0bbea..e76bed7 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
@@ -31,6 +31,7 @@
import androidx.annotation.NavigationRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentContainerView;
@@ -80,8 +81,12 @@
* coupling to the navigation host.</p>
*/
public class NavHostFragment extends Fragment implements NavHost {
- private static final String KEY_GRAPH_ID = "android-support-nav:fragment:graphId";
- private static final String KEY_START_DESTINATION_ARGS =
+ /** @hide */
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ protected static final String KEY_GRAPH_ID = "android-support-nav:fragment:graphId";
+ /** @hide */
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ protected static final String KEY_START_DESTINATION_ARGS =
"android-support-nav:fragment:startDestinationArgs";
private static final String KEY_NAV_CONTROLLER_STATE =
"android-support-nav:fragment:navControllerState";
@@ -156,9 +161,9 @@
/**
* Create a new NavHostFragment instance with an inflated {@link NavGraph} resource.
*
- * @param graphResId resource id of the navigation graph to inflate
- * @param startDestinationArgs arguments to send to the start destination of the graph
- * @return a new NavHostFragment instance
+ * @param graphResId Resource id of the navigation graph to inflate.
+ * @param startDestinationArgs Arguments to send to the start destination of the graph.
+ * @return A new NavHostFragment instance.
*/
@NonNull
public static NavHostFragment create(@NavigationRes int graphResId,