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)