// Signature format: 3.0
package androidx.navigation.ui {

  public final class AppBarConfiguration {
    method public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
    method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
  }

  public static final class AppBarConfiguration.Builder {
    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
    ctor public AppBarConfiguration.Builder(android.view.Menu);
    ctor public AppBarConfiguration.Builder(int...);
    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
    method public androidx.navigation.ui.AppBarConfiguration build();
    method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
  }

  public static interface AppBarConfiguration.OnNavigateUpListener {
    method public boolean onNavigateUp();
  }

  public final class NavigationUI {
    method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
    method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
  }

}

