// Signature format: 3.0
package androidx.drawerlayout.widget {

  public class DrawerLayout extends android.view.ViewGroup implements androidx.customview.widget.Openable {
    ctor public DrawerLayout(android.content.Context);
    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet?);
    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet?, int);
    method public void addDrawerListener(androidx.drawerlayout.widget.DrawerLayout.DrawerListener);
    method public void close();
    method public void closeDrawer(android.view.View);
    method public void closeDrawer(android.view.View, boolean);
    method public void closeDrawer(int);
    method public void closeDrawer(int, boolean);
    method public void closeDrawers();
    method public float getDrawerElevation();
    method public int getDrawerLockMode(int);
    method public int getDrawerLockMode(android.view.View);
    method public CharSequence? getDrawerTitle(int);
    method public android.graphics.drawable.Drawable? getStatusBarBackgroundDrawable();
    method public boolean isDrawerOpen(android.view.View);
    method public boolean isDrawerOpen(int);
    method public boolean isDrawerVisible(android.view.View);
    method public boolean isDrawerVisible(int);
    method public boolean isOpen();
    method public void onDraw(android.graphics.Canvas!);
    method public void open();
    method public void openDrawer(android.view.View);
    method public void openDrawer(android.view.View, boolean);
    method public void openDrawer(int);
    method public void openDrawer(int, boolean);
    method public void removeDrawerListener(androidx.drawerlayout.widget.DrawerLayout.DrawerListener);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setChildInsets(androidx.core.view.WindowInsetsCompat!, boolean);
    method public void setDrawerElevation(float);
    method @Deprecated public void setDrawerListener(androidx.drawerlayout.widget.DrawerLayout.DrawerListener!);
    method public void setDrawerLockMode(int);
    method public void setDrawerLockMode(int, int);
    method public void setDrawerLockMode(int, android.view.View);
    method public void setDrawerShadow(android.graphics.drawable.Drawable!, int);
    method public void setDrawerShadow(@DrawableRes int, int);
    method public void setDrawerTitle(int, CharSequence?);
    method public void setScrimColor(@ColorInt int);
    method public void setStatusBarBackground(android.graphics.drawable.Drawable?);
    method public void setStatusBarBackground(int);
    method public void setStatusBarBackgroundColor(@ColorInt int);
    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
    field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
    field public static final int STATE_DRAGGING = 1; // 0x1
    field public static final int STATE_IDLE = 0; // 0x0
    field public static final int STATE_SETTLING = 2; // 0x2
  }

  public static interface DrawerLayout.DrawerListener {
    method public void onDrawerClosed(android.view.View);
    method public void onDrawerOpened(android.view.View);
    method public void onDrawerSlide(android.view.View, float);
    method public void onDrawerStateChanged(int);
  }

  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
    ctor public DrawerLayout.LayoutParams(int, int);
    ctor public DrawerLayout.LayoutParams(int, int, int);
    ctor public DrawerLayout.LayoutParams(androidx.drawerlayout.widget.DrawerLayout.LayoutParams);
    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    field public int gravity;
  }

  protected static class DrawerLayout.SavedState extends androidx.customview.view.AbsSavedState {
    ctor public DrawerLayout.SavedState(android.os.Parcel, ClassLoader?);
    ctor public DrawerLayout.SavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<androidx.drawerlayout.widget.DrawerLayout.SavedState!>! CREATOR;
  }

  public abstract static class DrawerLayout.SimpleDrawerListener implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
    ctor public DrawerLayout.SimpleDrawerListener();
    method public void onDrawerClosed(android.view.View!);
    method public void onDrawerOpened(android.view.View!);
    method public void onDrawerSlide(android.view.View!, float);
    method public void onDrawerStateChanged(int);
  }

}

