// Signature format: 4.0
package androidx.navigation.dynamicfeatures {

  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
  }

  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
    method public String? getModuleName();
    method public void setModuleName(String? moduleName);
    property public final String? moduleName;
  }

  @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);
    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
    method public String? getAction();
    method public String? getActivityClassName();
    method public android.net.Uri? getData();
    method public String? getDataPattern();
    method public String? getModuleName();
    method public String? getTargetPackage();
    method public void setAction(String? action);
    method public void setActivityClassName(String? activityClassName);
    method public void setData(android.net.Uri? data);
    method public void setDataPattern(String? dataPattern);
    method public void setModuleName(String? moduleName);
    method public void setTargetPackage(String? targetPackage);
    property public final String? action;
    property public final String? activityClassName;
    property public final android.net.Uri? data;
    property public final String? dataPattern;
    property public final String? moduleName;
    property public final String? targetPackage;
  }

  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);
  }

  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
    property public final androidx.navigation.Navigator.Extras? destinationExtras;
    property public final androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor;
  }

  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
  }

  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
    ctor public DynamicGraphNavigator.DynamicNavGraph(androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, androidx.navigation.NavigatorProvider navigatorProvider);
    method public String? getModuleName();
    method public int getProgressDestination();
    method public void setModuleName(String? moduleName);
    method public void setProgressDestination(int progressDestination);
    property public final String? moduleName;
    property public final int progressDestination;
  }

  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
    method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
    method public boolean popBackStack();
  }

  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
    method public String? getGraphPackage();
    method public String? getGraphResourceName();
    method public String? getModuleName();
    method public void setGraphPackage(String? graphPackage);
    method public void setGraphResourceName(String? graphResourceName);
    method public void setModuleName(String? moduleName);
    property public final String? graphPackage;
    property public final String? graphResourceName;
    property public final String? moduleName;
  }

  @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);
    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
    method public String? getGraphPackage();
    method public void setGraphPackage(String? graphPackage);
    property public final String? graphPackage;
  }

  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);
  }

  public class DynamicInstallManager {
    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
  }

  public final class DynamicInstallMonitor {
    ctor public DynamicInstallMonitor();
    method public void cancelInstall();
    method public Exception? getException();
    method public int getSessionId();
    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
    method public boolean isInstallRequired();
    property public final Exception? exception;
    property public final boolean isInstallRequired;
    property public final int sessionId;
    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
  }

  @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
    method public String? getModuleName();
    method public int getProgressDestination();
    method public void setModuleName(String? moduleName);
    method public void setProgressDestination(int progressDestination);
    property public final String? moduleName;
    property public final int progressDestination;
  }

  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);
  }

  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);
  }

  public final class NavHostKt {
    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
  }

}

