Add routes to dynamic nav dsl
Now that routes are part of navigation, they should also be part of
dynamic navigation.
RelNote: "The DynamicNavigation Kotlin DSL now supports routes."
Test: added all same route test as ids
Bug: 188901565
Change-Id: I22f963d5b533066670384c1af7fc7556f57b4163
diff --git a/navigation/navigation-dynamic-features-fragment/api/current.txt b/navigation/navigation-dynamic-features-fragment/api/current.txt
index 73124fc8..e6dd027 100644
--- a/navigation/navigation-dynamic-features-fragment/api/current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/current.txt
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+ ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
method public String? getModuleName();
method public void setModuleName(String? p);
@@ -24,8 +25,11 @@
public final class DynamicFragmentNavigatorDestinationBuilderKt {
method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
}
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
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 73124fc8..e6dd027 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
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+ ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
method public String? getModuleName();
method public void setModuleName(String? p);
@@ -24,8 +25,11 @@
public final class DynamicFragmentNavigatorDestinationBuilderKt {
method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
}
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
index 73124fc8..e6dd027 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+ ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
method public String? getModuleName();
method public void setModuleName(String? p);
@@ -24,8 +25,11 @@
public final class DynamicFragmentNavigatorDestinationBuilderKt {
method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
}
public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
index 46dabd6..dd0b7f2 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
@@ -60,14 +60,63 @@
)
/**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
+ route: String
+): Unit = fragment<F>(route) {}
+
+/**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
+ route: String,
+ builder: DynamicFragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = fragment(route, F::class.java.name, builder)
+
+/**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ * @param fragmentClassName Fully qualified class name of destination Fragment.
+ */
+public inline fun DynamicNavGraphBuilder.fragment(
+ route: String,
+ fragmentClassName: String,
+ builder: DynamicFragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+ DynamicFragmentNavigatorDestinationBuilder(
+ provider[DynamicFragmentNavigator::class],
+ route,
+ fragmentClassName
+ ).apply(builder)
+)
+
+/**
* DSL for constructing a new [DynamicFragmentNavigator.Destination]
*/
@NavDestinationDsl
-public class DynamicFragmentNavigatorDestinationBuilder(
- navigator: DynamicFragmentNavigator,
- @IdRes id: Int,
- private val fragmentClassName: String
-) : NavDestinationBuilder<FragmentNavigator.Destination>(navigator, id) {
+public class DynamicFragmentNavigatorDestinationBuilder :
+ NavDestinationBuilder<FragmentNavigator.Destination> {
+
+ private var fragmentClassName: String
+
+ public constructor(
+ navigator: DynamicFragmentNavigator,
+ @IdRes id: Int,
+ fragmentClassName: String
+ ) : super(navigator, id) {
+ this.fragmentClassName = fragmentClassName
+ }
+
+ public constructor(
+ navigator: DynamicFragmentNavigator,
+ route: String,
+ fragmentClassName: String
+ ) : super(navigator, route) {
+ this.fragmentClassName = fragmentClassName
+ }
public var moduleName: String? = null
diff --git a/navigation/navigation-dynamic-features-runtime/api/current.txt b/navigation/navigation-dynamic-features-runtime/api/current.txt
index 3dd9850..9807b58 100644
--- a/navigation/navigation-dynamic-features-runtime/api/current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/current.txt
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+ ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
method public String? getAction();
method public String? getActivityClassName();
@@ -39,6 +40,7 @@
public final class DynamicActivityNavigatorDestinationBuilderKt {
method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
}
public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -86,6 +88,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+ ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
method public String? getGraphPackage();
method public void setGraphPackage(String? p);
@@ -95,6 +98,8 @@
public final class DynamicIncludeNavGraphBuilderKt {
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
}
public class DynamicInstallManager {
@@ -116,21 +121,28 @@
@androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
method public String? getModuleName();
method public int getProgressDestination();
+ method public String? getProgressDestinationRoute();
method public void setModuleName(String? p);
method public void setProgressDestination(int p);
+ method public void setProgressDestinationRoute(String? progDestRoute);
property public final String? moduleName;
property public final int progressDestination;
+ property public final String? progressDestinationRoute;
}
public final class DynamicNavGraphBuilderKt {
method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavControllerKt {
method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavHostKt {
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
index 3dd9850..9807b58 100644
--- a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+ ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
method public String? getAction();
method public String? getActivityClassName();
@@ -39,6 +40,7 @@
public final class DynamicActivityNavigatorDestinationBuilderKt {
method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
}
public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -86,6 +88,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+ ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
method public String? getGraphPackage();
method public void setGraphPackage(String? p);
@@ -95,6 +98,8 @@
public final class DynamicIncludeNavGraphBuilderKt {
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
}
public class DynamicInstallManager {
@@ -116,21 +121,28 @@
@androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
method public String? getModuleName();
method public int getProgressDestination();
+ method public String? getProgressDestinationRoute();
method public void setModuleName(String? p);
method public void setProgressDestination(int p);
+ method public void setProgressDestinationRoute(String? progDestRoute);
property public final String? moduleName;
property public final int progressDestination;
+ property public final String? progressDestinationRoute;
}
public final class DynamicNavGraphBuilderKt {
method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavControllerKt {
method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavHostKt {
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
index 3dd9850..9807b58 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
@@ -16,6 +16,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+ ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
method public String? getAction();
method public String? getActivityClassName();
@@ -39,6 +40,7 @@
public final class DynamicActivityNavigatorDestinationBuilderKt {
method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
}
public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -86,6 +88,7 @@
@androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+ ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
method public String? getGraphPackage();
method public void setGraphPackage(String? p);
@@ -95,6 +98,8 @@
public final class DynamicIncludeNavGraphBuilderKt {
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+ method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
}
public class DynamicInstallManager {
@@ -116,21 +121,28 @@
@androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
method public String? getModuleName();
method public int getProgressDestination();
+ method public String? getProgressDestinationRoute();
method public void setModuleName(String? p);
method public void setProgressDestination(int p);
+ method public void setProgressDestinationRoute(String? progDestRoute);
property public final String? moduleName;
property public final int progressDestination;
+ property public final String? progressDestinationRoute;
}
public final class DynamicNavGraphBuilderKt {
method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavControllerKt {
method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
}
public final class NavHostKt {
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
index b2abbe1..5fd5b65 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
@@ -114,9 +114,79 @@
val destination = graph.findNode(DESTINATION_ID) as DynamicActivityNavigator.Destination
assertThat(destination.component).isEqualTo(ComponentName(PACKAGE_NAME, CLASS_NAME))
}
+
+ @Test
+ fun moduleRoute() {
+ val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+ activity(DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ }
+ }
+
+ assertThat(
+ (graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination).moduleName
+ )
+ .isEqualTo(MODULE_NAME)
+ }
+
+ @Test
+ fun noModuleRoute() {
+ val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+ activity(DESTINATION_ROUTE) {
+ }
+ }
+ assertThat(
+ (graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination).moduleName
+ ).isNull()
+ }
+
+ @Test
+ fun activityRoute() {
+ val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+ activity(DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ activityClassName = CLASS_NAME
+ }
+ }
+ val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+ assertThat(
+ destination.component
+ ).isEqualTo(
+ ComponentName(
+ context,
+ CLASS_NAME
+ )
+ )
+ }
+
+ @Test
+ fun noActivityRoute() {
+ val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+ activity(DESTINATION_ROUTE) {
+ }
+ }
+ val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+ assertThat(
+ destination.component
+ ).isNull()
+ }
+
+ @Test
+ fun modulePackageRoute() {
+ val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+ activity(DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ activityClassName = CLASS_NAME
+ targetPackage = PACKAGE_NAME
+ }
+ }
+ val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+ assertThat(destination.component).isEqualTo(ComponentName(PACKAGE_NAME, CLASS_NAME))
+ }
}
private const val CLASS_NAME = "com.example.DynamicDestination"
private const val PACKAGE_NAME = "com.example.myPackage"
private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "route"
private const val MODULE_NAME = "myModule"
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
index dfa5c5b..aa3b07d 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
@@ -112,9 +112,81 @@
}
}
}
+
+ @Test
+ fun includeDynamicRoute() {
+ val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+ includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME) {
+ graphPackage = GRAPH_PACKAGE
+ }
+ }
+ val includeDynamic = graph[GRAPH_ROUTE]
+ as DynamicIncludeGraphNavigator.DynamicIncludeNavGraph
+ assertWithMessage("Module should be set in the graph")
+ .that(includeDynamic.moduleName)
+ .isEqualTo(MODULE_NAME)
+
+ assertWithMessage("graphPackage has to be set")
+ .that(includeDynamic.graphPackage)
+ .isEqualTo(GRAPH_PACKAGE)
+
+ assertWithMessage("graphResourceName has to be set")
+ .that(includeDynamic.graphResourceName)
+ .isEqualTo(GRAPH_RESOURCE_NAME)
+ }
+
+ fun includeDynamic_emptyModuleNameRoute() {
+ navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+ try {
+ includeDynamic(GRAPH_ROUTE, "", GRAPH_RESOURCE_NAME)
+ fail("includeDynamic should fail with an empty module name")
+ } catch (e: IllegalStateException) {
+ assertThat(e).hasMessageThat().isEqualTo("Module name cannot be empty")
+ }
+ }
+ }
+
+ @Test
+ fun includeDynamic_graphPackage_nullRoute() {
+ val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+ includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME)
+ }
+ val includeDynamic = graph[GRAPH_ROUTE]
+ as DynamicIncludeGraphNavigator.DynamicIncludeNavGraph
+
+ assertWithMessage("graphPackage should be filled in from package name and module name")
+ .that(includeDynamic.graphPackage).isEqualTo("${context.packageName}.$MODULE_NAME")
+ }
+
+ @Test
+ fun includeDynamic_graphPackage_emptyRoute() {
+ navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+ try {
+ includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME) {
+ graphPackage = ""
+ }
+ fail("includeDynamic should fail with an empty graph package")
+ } catch (e: IllegalStateException) {
+ assertThat(e).hasMessageThat().isEqualTo("Graph package name cannot be empty")
+ }
+ }
+ }
+
+ @Test
+ fun includeDynamic_graphResourceName_emptyRoute() {
+ navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+ try {
+ includeDynamic(GRAPH_ROUTE, MODULE_NAME, "")
+ fail("includeDynamic should fail with an empty graph resource name")
+ } catch (e: IllegalStateException) {
+ assertThat(e).hasMessageThat().isEqualTo("Graph resource name cannot be empty")
+ }
+ }
+ }
}
private const val GRAPH_ID = 1
+private const val GRAPH_ROUTE = "graph"
private const val MODULE_NAME = "myModule"
private const val GRAPH_PACKAGE = "com.example.mypackage"
private const val GRAPH_RESOURCE_NAME = "graphName"
\ No newline at end of file
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
index 3dbbd65..de954ca 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
@@ -93,10 +93,62 @@
.that(graph.progressDestination)
.isEqualTo(0)
}
+
+ @Test
+ fun navigationRoute() {
+ val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ navDestination(DESTINATION_ROUTE) {}
+ } as DynamicGraphNavigator.DynamicNavGraph
+
+ assertWithMessage("Destination should be added to the graph")
+ .that(DESTINATION_ROUTE in graph)
+ .isTrue()
+ assertWithMessage("Module should be set in the graph")
+ .that(graph.moduleName)
+ .isEqualTo(MODULE_NAME)
+ }
+
+ fun navigation_emptyModuleNameRoute() {
+ val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+ }
+ assertWithMessage("Without a moduleName the graph should be a NavGraph")
+ .that(graph !is DynamicGraphNavigator.DynamicNavGraph)
+ }
+
+ @Test
+ fun progressDestinationRoute() {
+ val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ progressDestinationRoute = PROGRESS_DESTINATION_ROUTE
+ navDestination(DESTINATION_ROUTE) {}
+ navDestination(PROGRESS_DESTINATION_ROUTE) {}
+ }
+
+ assertWithMessage("Destination should be added to the graph")
+ .that(DESTINATION_ROUTE in graph)
+ .isTrue()
+ assertWithMessage("ProgressDestination should be added to the graph")
+ .that(PROGRESS_DESTINATION_ROUTE in graph)
+ .isTrue()
+ }
+
+ @Test
+ fun progressDestination_notSetRoute() {
+ val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+ moduleName = MODULE_NAME
+ } as DynamicGraphNavigator.DynamicNavGraph
+
+ assertWithMessage("ProgressDestination should default to 0")
+ .that(graph.progressDestination)
+ .isEqualTo(0)
+ }
}
private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination"
private const val PROGRESS_DESTINATION_ID = 2
+private const val PROGRESS_DESTINATION_ROUTE = "progress_destination"
private const val MODULE_NAME = "myModule"
/**
@@ -107,3 +159,12 @@
@IdRes id: Int,
builder: NavDestinationBuilder<NavDestination>.() -> Unit
) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], id).apply(builder))
+
+/**
+ * Create a base NavDestination. Generally, only subtypes of NavDestination should be
+ * added to a NavGraph (hence why this is not in the common-ktx library)
+ */
+fun DynamicNavGraphBuilder.navDestination(
+ route: String,
+ builder: NavDestinationBuilder<NavDestination>.() -> Unit
+) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], route).apply(builder))
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
index 96fb64a..67dde4b 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
@@ -41,13 +41,40 @@
)
/**
+ * Construct a new [DynamicActivityNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun DynamicNavGraphBuilder.activity(
+ route: String,
+ builder: DynamicActivityNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+ DynamicActivityNavigatorDestinationBuilder(
+ provider[DynamicActivityNavigator::class],
+ route
+ ).apply(builder)
+)
+
+/**
* DSL for constructing a new [DynamicActivityNavigator.Destination]
*/
@NavDestinationDsl
-public class DynamicActivityNavigatorDestinationBuilder(
- private val activityNavigator: DynamicActivityNavigator,
- @IdRes id: Int
-) : NavDestinationBuilder<ActivityNavigator.Destination>(activityNavigator, id) {
+public class DynamicActivityNavigatorDestinationBuilder :
+ NavDestinationBuilder<ActivityNavigator.Destination> {
+ private var activityNavigator: DynamicActivityNavigator
+
+ public constructor(
+ activityNavigator: DynamicActivityNavigator,
+ @IdRes id: Int
+ ) : super(activityNavigator, id) {
+ this.activityNavigator = activityNavigator
+ }
+
+ public constructor(
+ activityNavigator: DynamicActivityNavigator,
+ route: String
+ ) : super(activityNavigator, route) {
+ this.activityNavigator = activityNavigator
+ }
public var moduleName: String? = null
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
index b926b54..4b8cc85 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
@@ -64,22 +64,75 @@
)
/**
- * DSL for constructing a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph]
+ * Construct a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph].
*
- * @param dynamicIncludeGraphNavigator [DynamicIncludeGraphNavigator] to use.
- * @param id NavGraph id.
+ * @param route NavGraph route.
* @param moduleName Dynamic feature module name as defined in the module's `AndroidManifest`.
* This must not be an empty string.
* @param graphResourceName Graph's resource name without the `navigation` qualifier. This
* must not be an empty string.
*/
+public inline fun DynamicNavGraphBuilder.includeDynamic(
+ route: String,
+ moduleName: String,
+ graphResourceName: String
+): Unit = includeDynamic(route, moduleName, graphResourceName) {}
+
+/**
+ * Construct a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph].
+ *
+ * @param route NavGraph route.
+ * @param moduleName Dynamic feature module name as defined in the module's `AndroidManifest`.
+ * This must not be an empty string.
+ * @param graphResourceName Graph's resource name without the `navigation` qualifier. This
+ * must not be an empty string.
+ * @param builder Another builder for chaining.
+ */
+public inline fun DynamicNavGraphBuilder.includeDynamic(
+ route: String,
+ moduleName: String,
+ graphResourceName: String,
+ builder: DynamicIncludeNavGraphBuilder.() -> Unit
+): Unit = destination(
+ DynamicIncludeNavGraphBuilder(
+ provider[DynamicIncludeGraphNavigator::class],
+ route,
+ moduleName,
+ graphResourceName
+ ).apply(builder)
+)
+
+/**
+ * DSL for constructing a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph]
+ */
@NavDestinationDsl
-public class DynamicIncludeNavGraphBuilder(
- private val dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
- @IdRes id: Int,
- private val moduleName: String,
- private val graphResourceName: String
-) : NavDestinationBuilder<DynamicIncludeNavGraph>(dynamicIncludeGraphNavigator, id) {
+public class DynamicIncludeNavGraphBuilder : NavDestinationBuilder<DynamicIncludeNavGraph> {
+
+ private var dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator
+ private var moduleName: String
+ private var graphResourceName: String
+
+ public constructor(
+ dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
+ @IdRes id: Int,
+ moduleName: String,
+ graphResourceName: String
+ ) : super(dynamicIncludeGraphNavigator, id) {
+ this.dynamicIncludeGraphNavigator = dynamicIncludeGraphNavigator
+ this.moduleName = moduleName
+ this.graphResourceName = graphResourceName
+ }
+
+ public constructor(
+ dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
+ route: String,
+ moduleName: String,
+ graphResourceName: String
+ ) : super(dynamicIncludeGraphNavigator, route) {
+ this.dynamicIncludeGraphNavigator = dynamicIncludeGraphNavigator
+ this.moduleName = moduleName
+ this.graphResourceName = graphResourceName
+ }
/**
* Destination NavGraph's resource package as defined in the module's
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
index 60d5040..1919a1f 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
@@ -17,6 +17,7 @@
package androidx.navigation.dynamicfeatures
import androidx.annotation.IdRes
+import androidx.navigation.NavDestination
import androidx.navigation.NavDestinationDsl
import androidx.navigation.NavGraph
import androidx.navigation.NavGraphBuilder
@@ -61,18 +62,64 @@
)
/**
- * DSL for constructing a new [DynamicGraphNavigator.DynamicNavGraph]
+ * Construct a new [DynamicGraphNavigator.DynamicNavGraph]
*
- * @param provider [NavigatorProvider] to use.
- * @param id NavGraph id.
- * @param startDestination Id start destination in the graph
+ * @param route NavGraph route.
+ * @param startDestination route start destination in the graph
+ * @param builder Another builder for chaining.
+ */
+public inline fun NavigatorProvider.navigation(
+ startDestination: String,
+ route: String? = null,
+ builder: DynamicNavGraphBuilder.() -> Unit
+): NavGraph = DynamicNavGraphBuilder(
+ this,
+ startDestination,
+ route
+).apply(builder).build()
+
+/**
+ * Construct a nested [DynamicGraphNavigator.DynamicNavGraph]
+ *
+ * @param route NavGraph route.
+ * @param startDestination route start destination in the graph
+ * @param builder Another builder for chaining.
+ */
+public inline fun DynamicNavGraphBuilder.navigation(
+ startDestination: String,
+ route: String,
+ builder: DynamicNavGraphBuilder.() -> Unit
+): Unit = destination(
+ DynamicNavGraphBuilder(
+ provider,
+ startDestination,
+ route
+ ).apply(builder)
+)
+
+/**
+ * DSL for constructing a new [DynamicGraphNavigator.DynamicNavGraph]
*/
@NavDestinationDsl
-public class DynamicNavGraphBuilder(
- provider: NavigatorProvider,
- @IdRes id: Int,
- @IdRes private var startDestination: Int
-) : NavGraphBuilder(provider, id, startDestination) {
+public class DynamicNavGraphBuilder : NavGraphBuilder {
+ @IdRes private var startDestinationId: Int = 0
+ private var startDestinationRoute: String? = null
+
+ public constructor(
+ provider: NavigatorProvider,
+ @IdRes id: Int,
+ @IdRes startDestination: Int
+ ) : super(provider, id, startDestination) {
+ this.startDestinationId = startDestination
+ }
+
+ public constructor(
+ provider: NavigatorProvider,
+ startDestination: String,
+ route: String? = null
+ ) : super(provider, startDestination, route) {
+ this.startDestinationRoute = startDestination
+ }
/**
* The module name of this [Destination]'s dynamic feature module. This has to be the
@@ -80,12 +127,42 @@
*/
public var moduleName: String? = null
+ private var _progressDestination: Int = 0
/**
* ID of the destination displayed during module installation. This generally does
* not need to be set, but is instead filled in by the NavHost via
* [DynamicGraphNavigator.installDefaultProgressDestination].
+ *
+ * Setting this clears any previously set [progressDestinationRoute].
*/
- public var progressDestination: Int = 0
+ public var progressDestination: Int
+ get() = _progressDestination
+ set(p) {
+ if (progressDestinationRoute != null) {
+ progressDestinationRoute = null
+ }
+ _progressDestination = p
+ }
+
+ /**
+ * Route of the destination displayed during module installation. This generally does
+ * not need to be set, but is instead filled in by the NavHost via
+ * [DynamicGraphNavigator.installDefaultProgressDestination].
+ *
+ * Setting this overrides any previously set [progressDestination].
+ */
+ public var progressDestinationRoute: String? = null
+ set(progDestRoute) {
+ _progressDestination = if (progDestRoute == null) {
+ 0
+ } else {
+ require(progDestRoute.isNotBlank()) {
+ "Cannot have an empty progress destination route"
+ }
+ NavDestination.createRoute(progressDestinationRoute).hashCode()
+ }
+ field = progDestRoute
+ }
/**
* @return The [DynamicGraphNavigator.DynamicNavGraph].
@@ -94,7 +171,12 @@
super.build().also { navGraph ->
if (navGraph is DynamicGraphNavigator.DynamicNavGraph) {
navGraph.moduleName = moduleName
- navGraph.progressDestination = progressDestination
+ if (navGraph.route != null) {
+ navGraph.progressDestination =
+ NavDestination.createRoute(progressDestinationRoute).hashCode()
+ } else {
+ navGraph.progressDestination = progressDestination
+ }
if (progressDestination == 0) {
val navGraphNavigator: DynamicGraphNavigator =
provider[DynamicGraphNavigator::class]
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
index f84b675..f9e3d8f 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
@@ -28,3 +28,12 @@
@IdRes startDestination: Int,
builder: DynamicNavGraphBuilder.() -> Unit
): NavGraph = navigatorProvider.navigation(id, startDestination, builder)
+
+/**
+ * Construct a new [androidx.navigation.NavGraph] that supports dynamic navigation destinations
+ */
+public inline fun NavController.createGraph(
+ startDestination: String,
+ route: String? = null,
+ builder: DynamicNavGraphBuilder.() -> Unit
+): NavGraph = navigatorProvider.navigation(startDestination, route, builder)