// Signature format: 3.0
package androidx.appcompat.app {

  public abstract class ActionBar {
    ctor public ActionBar();
    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
    method public abstract android.view.View! getCustomView();
    method public abstract int getDisplayOptions();
    method public float getElevation();
    method public abstract int getHeight();
    method public int getHideOffset();
    method @Deprecated public abstract int getNavigationItemCount();
    method @Deprecated public abstract int getNavigationMode();
    method @Deprecated public abstract int getSelectedNavigationIndex();
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
    method public abstract CharSequence? getSubtitle();
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
    method @Deprecated public abstract int getTabCount();
    method public android.content.Context! getThemedContext();
    method public abstract CharSequence? getTitle();
    method public abstract void hide();
    method public boolean isHideOnContentScrollEnabled();
    method public abstract boolean isShowing();
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
    method @Deprecated public abstract void removeAllTabs();
    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
    method @Deprecated public abstract void removeTabAt(int);
    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
    method public abstract void setCustomView(android.view.View!);
    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
    method public abstract void setCustomView(int);
    method public abstract void setDisplayHomeAsUpEnabled(boolean);
    method public abstract void setDisplayOptions(int);
    method public abstract void setDisplayOptions(int, int);
    method public abstract void setDisplayShowCustomEnabled(boolean);
    method public abstract void setDisplayShowHomeEnabled(boolean);
    method public abstract void setDisplayShowTitleEnabled(boolean);
    method public abstract void setDisplayUseLogoEnabled(boolean);
    method public void setElevation(float);
    method public void setHideOffset(int);
    method public void setHideOnContentScrollEnabled(boolean);
    method public void setHomeActionContentDescription(CharSequence?);
    method public void setHomeActionContentDescription(@StringRes int);
    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
    method public void setHomeAsUpIndicator(@DrawableRes int);
    method public void setHomeButtonEnabled(boolean);
    method public abstract void setIcon(@DrawableRes int);
    method public abstract void setIcon(android.graphics.drawable.Drawable!);
    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
    method public abstract void setLogo(@DrawableRes int);
    method public abstract void setLogo(android.graphics.drawable.Drawable!);
    method @Deprecated public abstract void setNavigationMode(int);
    method @Deprecated public abstract void setSelectedNavigationItem(int);
    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
    method public abstract void setSubtitle(CharSequence!);
    method public abstract void setSubtitle(int);
    method public abstract void setTitle(CharSequence!);
    method public abstract void setTitle(@StringRes int);
    method public abstract void show();
    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
  }

  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
    ctor public ActionBar.LayoutParams(int, int);
    ctor public ActionBar.LayoutParams(int, int, int);
    ctor public ActionBar.LayoutParams(int);
    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
    field public int gravity;
  }

  public static interface ActionBar.OnMenuVisibilityListener {
    method public void onMenuVisibilityChanged(boolean);
  }

  @Deprecated public static interface ActionBar.OnNavigationListener {
    method @Deprecated public boolean onNavigationItemSelected(int, long);
  }

  @Deprecated public abstract static class ActionBar.Tab {
    ctor @Deprecated public ActionBar.Tab();
    method @Deprecated public abstract CharSequence! getContentDescription();
    method @Deprecated public abstract android.view.View! getCustomView();
    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
    method @Deprecated public abstract int getPosition();
    method @Deprecated public abstract Object! getTag();
    method @Deprecated public abstract CharSequence! getText();
    method @Deprecated public abstract void select();
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
  }

  @Deprecated public static interface ActionBar.TabListener {
    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
  }

  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
    method public boolean isDrawerIndicatorEnabled();
    method public boolean isDrawerSlideAnimationEnabled();
    method public void onConfigurationChanged(android.content.res.Configuration!);
    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);
    method public boolean onOptionsItemSelected(android.view.MenuItem!);
    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
    method public void setDrawerIndicatorEnabled(boolean);
    method public void setDrawerSlideAnimationEnabled(boolean);
    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
    method public void setHomeAsUpIndicator(int);
    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
    method public void syncState();
  }

  public static interface ActionBarDrawerToggle.Delegate {
    method public android.content.Context! getActionBarThemedContext();
    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
    method public boolean isNavigationVisible();
    method public void setActionBarDescription(@StringRes int);
    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
  }

  public static interface ActionBarDrawerToggle.DelegateProvider {
    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
  }

  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
    ctor protected AlertDialog(android.content.Context);
    ctor protected AlertDialog(android.content.Context, @StyleRes int);
    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
    method public android.widget.Button! getButton(int);
    method public android.widget.ListView! getListView();
    method public void setButton(int, CharSequence!, android.os.Message!);
    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
    method public void setCustomTitle(android.view.View!);
    method public void setIcon(int);
    method public void setIcon(android.graphics.drawable.Drawable!);
    method public void setIconAttribute(int);
    method public void setMessage(CharSequence!);
    method public void setView(android.view.View!);
    method public void setView(android.view.View!, int, int, int, int);
  }

  public static class AlertDialog.Builder {
    ctor public AlertDialog.Builder(android.content.Context);
    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
    method public androidx.appcompat.app.AlertDialog! create();
    method public android.content.Context getContext();
    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence[]!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence[]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence[]!, int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
    method public androidx.appcompat.app.AlertDialog! show();
  }

  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
    ctor public AppCompatActivity();
    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
    method public android.content.Intent? getSupportParentActivityIntent();
    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
    method public final boolean onMenuItemSelected(int, android.view.MenuItem!);
    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
    method @Deprecated public void onSupportContentChanged();
    method public boolean onSupportNavigateUp();
    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
    method @Deprecated public void setSupportProgress(int);
    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
    method @Deprecated public void setSupportProgressBarVisibility(boolean);
    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
    method public void supportInvalidateOptionsMenu();
    method public void supportNavigateUpTo(android.content.Intent);
    method public boolean supportRequestWindowFeature(int);
    method public boolean supportShouldUpRecreateTask(android.content.Intent);
  }

  public interface AppCompatCallback {
    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
  }

  public abstract class AppCompatDelegate {
    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
    method public abstract boolean applyDayNight();
    method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Activity!, androidx.appcompat.app.AppCompatCallback!);
    method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Dialog!, androidx.appcompat.app.AppCompatCallback!);
    method public static androidx.appcompat.app.AppCompatDelegate! create(android.content.Context!, android.view.Window!, androidx.appcompat.app.AppCompatCallback!);
    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
    method public static int getDefaultNightMode();
    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
    method public abstract android.view.MenuInflater! getMenuInflater();
    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
    method public abstract boolean hasWindowFeature(int);
    method public abstract void installViewFactory();
    method public abstract void invalidateOptionsMenu();
    method public static boolean isCompatVectorFromResourcesEnabled();
    method public abstract boolean isHandleNativeActionModesEnabled();
    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
    method public abstract void onCreate(android.os.Bundle!);
    method public abstract void onDestroy();
    method public abstract void onPostCreate(android.os.Bundle!);
    method public abstract void onPostResume();
    method public abstract void onSaveInstanceState(android.os.Bundle!);
    method public abstract void onStart();
    method public abstract void onStop();
    method public abstract boolean requestWindowFeature(int);
    method public static void setCompatVectorFromResourcesEnabled(boolean);
    method public abstract void setContentView(android.view.View!);
    method public abstract void setContentView(@LayoutRes int);
    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
    method public static void setDefaultNightMode(int);
    method public abstract void setHandleNativeActionModesEnabled(boolean);
    method public abstract void setLocalNightMode(int);
    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
    method public abstract void setTitle(CharSequence?);
    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
    field public static final int MODE_NIGHT_AUTO = 0; // 0x0
    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
    field public static final int MODE_NIGHT_NO = 1; // 0x1
    field public static final int MODE_NIGHT_YES = 2; // 0x2
  }

  public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
    ctor public AppCompatDialog(android.content.Context!);
    ctor public AppCompatDialog(android.content.Context!, int);
    ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
    method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
    method public boolean supportRequestWindowFeature(int);
  }

  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
    ctor public AppCompatDialogFragment();
  }

  public class AppCompatViewInflater {
    ctor public AppCompatViewInflater();
    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
  }

}

package androidx.appcompat.content.res {

  public final class AppCompatResources {
    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
  }

}

package androidx.appcompat.graphics.drawable {

  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
    ctor public DrawerArrowDrawable(android.content.Context!);
    method public void draw(android.graphics.Canvas!);
    method public float getArrowHeadLength();
    method public float getArrowShaftLength();
    method public float getBarLength();
    method public float getBarThickness();
    method @ColorInt public int getColor();
    method public int getDirection();
    method public float getGapSize();
    method public int getOpacity();
    method public final android.graphics.Paint! getPaint();
    method @FloatRange(from=0.0, to=1.0) public float getProgress();
    method public boolean isSpinEnabled();
    method public void setAlpha(int);
    method public void setArrowHeadLength(float);
    method public void setArrowShaftLength(float);
    method public void setBarLength(float);
    method public void setBarThickness(float);
    method public void setColor(@ColorInt int);
    method public void setColorFilter(android.graphics.ColorFilter!);
    method public void setDirection(int);
    method public void setGapSize(float);
    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
    method public void setSpinEnabled(boolean);
    method public void setVerticalMirror(boolean);
    field public static final int ARROW_DIRECTION_END = 3; // 0x3
    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
    field public static final int ARROW_DIRECTION_START = 2; // 0x2
  }

}

package androidx.appcompat.view {

  public abstract class ActionMode {
    ctor public ActionMode();
    method public abstract void finish();
    method public abstract android.view.View! getCustomView();
    method public abstract android.view.Menu! getMenu();
    method public abstract android.view.MenuInflater! getMenuInflater();
    method public abstract CharSequence! getSubtitle();
    method public Object! getTag();
    method public abstract CharSequence! getTitle();
    method public boolean getTitleOptionalHint();
    method public abstract void invalidate();
    method public boolean isTitleOptional();
    method public abstract void setCustomView(android.view.View!);
    method public abstract void setSubtitle(CharSequence!);
    method public abstract void setSubtitle(int);
    method public void setTag(Object!);
    method public abstract void setTitle(CharSequence!);
    method public abstract void setTitle(int);
    method public void setTitleOptionalHint(boolean);
  }

  public static interface ActionMode.Callback {
    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
  }

  public interface CollapsibleActionView {
    method public void onActionViewCollapsed();
    method public void onActionViewExpanded();
  }

  public class ContextThemeWrapper extends android.content.ContextWrapper {
    ctor public ContextThemeWrapper();
    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
    method public void applyOverrideConfiguration(android.content.res.Configuration!);
    method public int getThemeResId();
    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
  }

}

package androidx.appcompat.widget {

  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
    ctor public ActionMenuView(android.content.Context!);
    ctor public ActionMenuView(android.content.Context!, android.util.AttributeSet!);
    method public void dismissPopupMenus();
    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
    method public android.view.Menu! getMenu();
    method public android.graphics.drawable.Drawable? getOverflowIcon();
    method public int getPopupTheme();
    method public boolean hideOverflowMenu();
    method public boolean isOverflowMenuShowing();
    method public void onConfigurationChanged(android.content.res.Configuration!);
    method public void onDetachedFromWindow();
    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
    method public void setPopupTheme(@StyleRes int);
    method public boolean showOverflowMenu();
  }

  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
    ctor public ActionMenuView.LayoutParams(int, int);
    field @android.view.ViewDebug.ExportedProperty public int cellsUsed;
    field @android.view.ViewDebug.ExportedProperty public boolean expandable;
    field @android.view.ViewDebug.ExportedProperty public int extraPixels;
    field @android.view.ViewDebug.ExportedProperty public boolean isOverflowButton;
    field @android.view.ViewDebug.ExportedProperty public boolean preventEdgeOffset;
  }

  public static interface ActionMenuView.OnMenuItemClickListener {
    method public boolean onMenuItemClick(android.view.MenuItem!);
  }

  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
    ctor public AppCompatAutoCompleteTextView(android.content.Context!);
    ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView {
    ctor public AppCompatButton(android.content.Context!);
    ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method public void setSupportAllCaps(boolean);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.widget.TintableCompoundButton {
    ctor public AppCompatCheckBox(android.content.Context!);
    ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
    ctor public AppCompatCheckedTextView(android.content.Context!);
    ctor public AppCompatCheckedTextView(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatCheckedTextView(android.content.Context!, android.util.AttributeSet!, int);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.TintableBackgroundView {
    ctor public AppCompatEditText(android.content.Context!);
    ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
    ctor public AppCompatImageButton(android.content.Context!);
    ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
    ctor public AppCompatImageView(android.content.Context!);
    ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!);
    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.widget.TintableCompoundButton {
    ctor public AppCompatRadioButton(android.content.Context!);
    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatRatingBar extends android.widget.RatingBar {
    ctor public AppCompatRatingBar(android.content.Context!);
    ctor public AppCompatRatingBar(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatRatingBar(android.content.Context!, android.util.AttributeSet!, int);
  }

  public class AppCompatSeekBar extends android.widget.SeekBar {
    ctor public AppCompatSeekBar(android.content.Context!);
    ctor public AppCompatSeekBar(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatSeekBar(android.content.Context!, android.util.AttributeSet!, int);
  }

  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
    ctor public AppCompatSpinner(android.content.Context!);
    ctor public AppCompatSpinner(android.content.Context!, int);
    ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int);
    ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int);
    ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int, android.content.res.Resources.Theme!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView {
    ctor public AppCompatTextView(android.content.Context!);
    ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!, int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>);
    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
  }

  public class AppCompatToggleButton extends android.widget.ToggleButton {
    ctor public AppCompatToggleButton(android.content.Context!);
    ctor public AppCompatToggleButton(android.content.Context!, android.util.AttributeSet!);
    ctor public AppCompatToggleButton(android.content.Context!, android.util.AttributeSet!, int);
  }

  public class LinearLayoutCompat extends android.view.ViewGroup {
    ctor public LinearLayoutCompat(android.content.Context!);
    ctor public LinearLayoutCompat(android.content.Context!, android.util.AttributeSet!);
    ctor public LinearLayoutCompat(android.content.Context!, android.util.AttributeSet!, int);
    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
    method public int getBaselineAlignedChildIndex();
    method public android.graphics.drawable.Drawable! getDividerDrawable();
    method public int getDividerPadding();
    method public int getGravity();
    method public int getOrientation();
    method public int getShowDividers();
    method public float getWeightSum();
    method public boolean isBaselineAligned();
    method public boolean isMeasureWithLargestChildEnabled();
    method public void setBaselineAligned(boolean);
    method public void setBaselineAlignedChildIndex(int);
    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
    method public void setDividerPadding(int);
    method public void setGravity(int);
    method public void setHorizontalGravity(int);
    method public void setMeasureWithLargestChildEnabled(boolean);
    method public void setOrientation(int);
    method public void setShowDividers(int);
    method public void setVerticalGravity(int);
    method public void setWeightSum(float);
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
    field public static final int SHOW_DIVIDER_END = 4; // 0x4
    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
    field public static final int VERTICAL = 1; // 0x1
  }

  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public LinearLayoutCompat.LayoutParams(int, int);
    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
    ctor public LinearLayoutCompat.LayoutParams(androidx.appcompat.widget.LinearLayoutCompat.LayoutParams!);
    field public int gravity;
    field public float weight;
  }

  public class ListPopupWindow {
    ctor public ListPopupWindow(android.content.Context);
    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
    method public void clearListSelection();
    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
    method public void dismiss();
    method public android.view.View? getAnchorView();
    method @StyleRes public int getAnimationStyle();
    method public android.graphics.drawable.Drawable? getBackground();
    method public int getHeight();
    method public int getHorizontalOffset();
    method public int getInputMethodMode();
    method public android.widget.ListView? getListView();
    method public int getPromptPosition();
    method public Object? getSelectedItem();
    method public long getSelectedItemId();
    method public int getSelectedItemPosition();
    method public android.view.View? getSelectedView();
    method public int getSoftInputMode();
    method public int getVerticalOffset();
    method public int getWidth();
    method public boolean isInputMethodNotNeeded();
    method public boolean isModal();
    method public boolean isShowing();
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyPreIme(int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
    method public boolean performItemClick(int);
    method public void postShow();
    method public void setAdapter(android.widget.ListAdapter?);
    method public void setAnchorView(android.view.View?);
    method public void setAnimationStyle(@StyleRes int);
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
    method public void setContentWidth(int);
    method public void setDropDownGravity(int);
    method public void setHeight(int);
    method public void setHorizontalOffset(int);
    method public void setInputMethodMode(int);
    method public void setListSelector(android.graphics.drawable.Drawable!);
    method public void setModal(boolean);
    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
    method public void setPromptPosition(int);
    method public void setPromptView(android.view.View?);
    method public void setSelection(int);
    method public void setSoftInputMode(int);
    method public void setVerticalOffset(int);
    method public void setWidth(int);
    method public void setWindowLayoutType(int);
    method public void show();
    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
    field public static final int MATCH_PARENT = -1; // 0xffffffff
    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
  }

  public class PopupMenu {
    ctor public PopupMenu(android.content.Context, android.view.View);
    ctor public PopupMenu(android.content.Context, android.view.View, int);
    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
    method public void dismiss();
    method public android.view.View.OnTouchListener getDragToOpenListener();
    method public int getGravity();
    method public android.view.Menu getMenu();
    method public android.view.MenuInflater getMenuInflater();
    method public void inflate(@MenuRes int);
    method public void setGravity(int);
    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
    method public void show();
  }

  public static interface PopupMenu.OnDismissListener {
    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
  }

  public static interface PopupMenu.OnMenuItemClickListener {
    method public boolean onMenuItemClick(android.view.MenuItem!);
  }

  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
    ctor public SearchView(android.content.Context!);
    ctor public SearchView(android.content.Context!, android.util.AttributeSet!);
    ctor public SearchView(android.content.Context!, android.util.AttributeSet!, int);
    method public int getImeOptions();
    method public int getInputType();
    method public int getMaxWidth();
    method public CharSequence! getQuery();
    method public CharSequence? getQueryHint();
    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
    method public boolean isIconfiedByDefault();
    method public boolean isIconified();
    method public boolean isQueryRefinementEnabled();
    method public boolean isSubmitButtonEnabled();
    method public void onActionViewCollapsed();
    method public void onActionViewExpanded();
    method public void setIconified(boolean);
    method public void setIconifiedByDefault(boolean);
    method public void setImeOptions(int);
    method public void setInputType(int);
    method public void setMaxWidth(int);
    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
    method public void setQuery(CharSequence!, boolean);
    method public void setQueryHint(CharSequence?);
    method public void setQueryRefinementEnabled(boolean);
    method public void setSearchableInfo(android.app.SearchableInfo!);
    method public void setSubmitButtonEnabled(boolean);
    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
  }

  public static interface SearchView.OnCloseListener {
    method public boolean onClose();
  }

  public static interface SearchView.OnQueryTextListener {
    method public boolean onQueryTextChange(String!);
    method public boolean onQueryTextSubmit(String!);
  }

  public static interface SearchView.OnSuggestionListener {
    method public boolean onSuggestionClick(int);
    method public boolean onSuggestionSelect(int);
  }

  public class ShareActionProvider extends androidx.core.view.ActionProvider {
    ctor public ShareActionProvider(android.content.Context!);
    method public android.view.View! onCreateActionView();
    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
    method public void setShareHistoryFileName(String!);
    method public void setShareIntent(android.content.Intent!);
    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
  }

  public static interface ShareActionProvider.OnShareTargetSelectedListener {
    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
  }

  public class SwitchCompat extends android.widget.CompoundButton {
    ctor public SwitchCompat(android.content.Context!);
    ctor public SwitchCompat(android.content.Context!, android.util.AttributeSet!);
    ctor public SwitchCompat(android.content.Context!, android.util.AttributeSet!, int);
    method public boolean getShowText();
    method public boolean getSplitTrack();
    method public int getSwitchMinWidth();
    method public int getSwitchPadding();
    method public CharSequence! getTextOff();
    method public CharSequence! getTextOn();
    method public android.graphics.drawable.Drawable! getThumbDrawable();
    method public int getThumbTextPadding();
    method public android.content.res.ColorStateList? getThumbTintList();
    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
    method public android.graphics.drawable.Drawable! getTrackDrawable();
    method public android.content.res.ColorStateList? getTrackTintList();
    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
    method public void onMeasure(int, int);
    method public void setShowText(boolean);
    method public void setSplitTrack(boolean);
    method public void setSwitchMinWidth(int);
    method public void setSwitchPadding(int);
    method public void setSwitchTextAppearance(android.content.Context!, int);
    method public void setSwitchTypeface(android.graphics.Typeface!, int);
    method public void setSwitchTypeface(android.graphics.Typeface!);
    method public void setTextOff(CharSequence!);
    method public void setTextOn(CharSequence!);
    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
    method public void setThumbResource(int);
    method public void setThumbTextPadding(int);
    method public void setThumbTintList(android.content.res.ColorStateList?);
    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
    method public void setTrackResource(int);
    method public void setTrackTintList(android.content.res.ColorStateList?);
    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
  }

  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
    method public android.content.res.Resources.Theme? getDropDownViewTheme();
    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
  }

  public static final class ThemedSpinnerAdapter.Helper {
    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
    method public android.view.LayoutInflater getDropDownViewInflater();
    method public android.content.res.Resources.Theme? getDropDownViewTheme();
    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
  }

  public class Toolbar extends android.view.ViewGroup {
    ctor public Toolbar(android.content.Context!);
    ctor public Toolbar(android.content.Context!, android.util.AttributeSet?);
    ctor public Toolbar(android.content.Context!, android.util.AttributeSet?, int);
    method public void collapseActionView();
    method public void dismissPopupMenus();
    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
    method public CharSequence? getCollapseContentDescription();
    method public android.graphics.drawable.Drawable? getCollapseIcon();
    method public int getContentInsetEnd();
    method public int getContentInsetEndWithActions();
    method public int getContentInsetLeft();
    method public int getContentInsetRight();
    method public int getContentInsetStart();
    method public int getContentInsetStartWithNavigation();
    method public int getCurrentContentInsetEnd();
    method public int getCurrentContentInsetLeft();
    method public int getCurrentContentInsetRight();
    method public int getCurrentContentInsetStart();
    method public android.graphics.drawable.Drawable! getLogo();
    method public CharSequence! getLogoDescription();
    method public android.view.Menu! getMenu();
    method public CharSequence? getNavigationContentDescription();
    method public android.graphics.drawable.Drawable? getNavigationIcon();
    method public android.graphics.drawable.Drawable? getOverflowIcon();
    method public int getPopupTheme();
    method public CharSequence! getSubtitle();
    method public CharSequence! getTitle();
    method public int getTitleMarginBottom();
    method public int getTitleMarginEnd();
    method public int getTitleMarginStart();
    method public int getTitleMarginTop();
    method public boolean hasExpandedActionView();
    method public boolean hideOverflowMenu();
    method public void inflateMenu(@MenuRes int);
    method public boolean isOverflowMenuShowing();
    method public void setCollapseContentDescription(@StringRes int);
    method public void setCollapseContentDescription(CharSequence?);
    method public void setCollapseIcon(@DrawableRes int);
    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
    method public void setContentInsetEndWithActions(int);
    method public void setContentInsetStartWithNavigation(int);
    method public void setContentInsetsAbsolute(int, int);
    method public void setContentInsetsRelative(int, int);
    method public void setLogo(@DrawableRes int);
    method public void setLogo(android.graphics.drawable.Drawable!);
    method public void setLogoDescription(@StringRes int);
    method public void setLogoDescription(CharSequence!);
    method public void setNavigationContentDescription(@StringRes int);
    method public void setNavigationContentDescription(CharSequence?);
    method public void setNavigationIcon(@DrawableRes int);
    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
    method public void setPopupTheme(@StyleRes int);
    method public void setSubtitle(@StringRes int);
    method public void setSubtitle(CharSequence!);
    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
    method public void setSubtitleTextColor(@ColorInt int);
    method public void setTitle(@StringRes int);
    method public void setTitle(CharSequence!);
    method public void setTitleMargin(int, int, int, int);
    method public void setTitleMarginBottom(int);
    method public void setTitleMarginEnd(int);
    method public void setTitleMarginStart(int);
    method public void setTitleMarginTop(int);
    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
    method public void setTitleTextColor(@ColorInt int);
    method public boolean showOverflowMenu();
  }

  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
    ctor public Toolbar.LayoutParams(int, int);
    ctor public Toolbar.LayoutParams(int, int, int);
    ctor public Toolbar.LayoutParams(int);
    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
  }

  public static interface Toolbar.OnMenuItemClickListener {
    method public boolean onMenuItemClick(android.view.MenuItem!);
  }

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

  public class TooltipCompat {
    method public static void setTooltipText(android.view.View, CharSequence?);
  }

}

