// 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();
    ctor @ContentView public AppCompatActivity(@LayoutRes int);
    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 protected void onNightModeChanged(int);
    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 void attachBaseContext(android.content.Context!);
    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 static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, 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 int getLocalNightMode();
    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 void setTheme(@StyleRes int);
    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 @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 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_UNSPECIFIED = -100; // 0xffffff9c
    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 androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
  }

}

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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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 androidx.core.widget.TintableCompoundDrawablesView {
    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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
    method public void setTextAppearance(android.content.Context!, int);
  }

  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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.view.TintableBackgroundView 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
  }

  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
    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_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) 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_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(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 android.graphics.Rect? getEpicenterBounds();
    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 setEpicenterBounds(android.graphics.Rect?);
    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 setSubtitleTextColor(android.content.res.ColorStateList);
    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 void setTitleTextColor(android.content.res.ColorStateList);
    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?);
  }

}

