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

  public final class BackgroundManager {
    method public void attach(android.view.Window!);
    method public void attachToView(android.view.View!);
    method public void clearDrawable();
    method @ColorInt public int getColor();
    method @Deprecated public android.graphics.drawable.Drawable! getDefaultDimLayer();
    method @Deprecated public android.graphics.drawable.Drawable! getDimLayer();
    method public android.graphics.drawable.Drawable! getDrawable();
    method public static androidx.leanback.app.BackgroundManager! getInstance(android.app.Activity!);
    method public boolean isAttached();
    method public boolean isAutoReleaseOnStop();
    method public void release();
    method public void setAutoReleaseOnStop(boolean);
    method public void setBitmap(android.graphics.Bitmap!);
    method public void setColor(@ColorInt int);
    method @Deprecated public void setDimLayer(android.graphics.drawable.Drawable!);
    method public void setDrawable(android.graphics.drawable.Drawable!);
    method public void setThemeDrawableResourceId(int);
  }

  @Deprecated public class BaseFragment extends androidx.leanback.app.BrandedFragment {
    method @Deprecated protected Object! createEntranceTransition();
    method @Deprecated public final androidx.leanback.app.ProgressBarManager! getProgressBarManager();
    method @Deprecated public void onCreate(android.os.Bundle!);
    method @Deprecated protected void onEntranceTransitionEnd();
    method @Deprecated protected void onEntranceTransitionPrepare();
    method @Deprecated protected void onEntranceTransitionStart();
    method @Deprecated public void prepareEntranceTransition();
    method @Deprecated protected void runEntranceTransition(Object!);
    method @Deprecated public void startEntranceTransition();
  }

  public class BaseSupportFragment extends androidx.leanback.app.BrandedSupportFragment {
    method protected Object! createEntranceTransition();
    method public final androidx.leanback.app.ProgressBarManager! getProgressBarManager();
    method protected void onEntranceTransitionEnd();
    method protected void onEntranceTransitionPrepare();
    method protected void onEntranceTransitionStart();
    method public void prepareEntranceTransition();
    method protected void runEntranceTransition(Object!);
    method public void startEntranceTransition();
  }

  @Deprecated public class BrandedFragment extends android.app.Fragment {
    ctor @Deprecated public BrandedFragment();
    method @Deprecated public android.graphics.drawable.Drawable! getBadgeDrawable();
    method @Deprecated public int getSearchAffordanceColor();
    method @Deprecated public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
    method @Deprecated public CharSequence! getTitle();
    method @Deprecated public android.view.View! getTitleView();
    method @Deprecated public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
    method @Deprecated public void installTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public final boolean isShowingTitle();
    method @Deprecated public void onDestroyView();
    method @Deprecated public android.view.View! onInflateTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onPause();
    method @Deprecated public void onResume();
    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
    method @Deprecated public void onStart();
    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
    method @Deprecated public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method @Deprecated public void setOnSearchClickedListener(android.view.View.OnClickListener!);
    method @Deprecated public void setSearchAffordanceColor(int);
    method @Deprecated public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method @Deprecated public void setTitle(CharSequence!);
    method @Deprecated public void setTitleView(android.view.View!);
    method @Deprecated public void showTitle(boolean);
    method @Deprecated public void showTitle(int);
  }

  public class BrandedSupportFragment extends androidx.fragment.app.Fragment {
    ctor public BrandedSupportFragment();
    method public android.graphics.drawable.Drawable! getBadgeDrawable();
    method public int getSearchAffordanceColor();
    method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
    method public CharSequence! getTitle();
    method public android.view.View! getTitleView();
    method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
    method public void installTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method public final boolean isShowingTitle();
    method public android.view.View! onInflateTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
    method public void setSearchAffordanceColor(int);
    method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setTitle(CharSequence!);
    method public void setTitleView(android.view.View!);
    method public void showTitle(boolean);
    method public void showTitle(int);
  }

  @Deprecated public class BrowseFragment extends androidx.leanback.app.BaseFragment {
    method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!, int);
    method @Deprecated public void enableMainFragmentScaling(boolean);
    method @Deprecated public void enableRowScaling(boolean);
    method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated @ColorInt public int getBrandColor();
    method @Deprecated public androidx.leanback.app.HeadersFragment! getHeadersFragment();
    method @Deprecated public int getHeadersState();
    method @Deprecated public android.app.Fragment! getMainFragment();
    method @Deprecated public final androidx.leanback.app.BrowseFragment.MainFragmentAdapterRegistry! getMainFragmentRegistry();
    method @Deprecated public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
    method @Deprecated public androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
    method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
    method @Deprecated public int getSelectedPosition();
    method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! getSelectedRowViewHolder();
    method @Deprecated public final boolean isHeadersTransitionOnBackEnabled();
    method @Deprecated public boolean isInHeadersTransition();
    method @Deprecated public boolean isShowingHeaders();
    method @Deprecated public androidx.leanback.app.HeadersFragment! onCreateHeadersFragment();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroy();
    method @Deprecated public void onStop();
    method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setBrandColor(@ColorInt int);
    method @Deprecated public void setBrowseTransitionListener(androidx.leanback.app.BrowseFragment.BrowseTransitionListener!);
    method @Deprecated public void setHeaderPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method @Deprecated public void setHeadersState(int);
    method @Deprecated public final void setHeadersTransitionOnBackEnabled(boolean);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method @Deprecated public void setSelectedPosition(int);
    method @Deprecated public void setSelectedPosition(int, boolean);
    method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method @Deprecated public void startHeadersTransition(boolean);
    field @Deprecated public static final int HEADERS_DISABLED = 3; // 0x3
    field @Deprecated public static final int HEADERS_ENABLED = 1; // 0x1
    field @Deprecated public static final int HEADERS_HIDDEN = 2; // 0x2
  }

  @Deprecated public static class BrowseFragment.BrowseTransitionListener {
    ctor @Deprecated public BrowseFragment.BrowseTransitionListener();
    method @Deprecated public void onHeadersTransitionStart(boolean);
    method @Deprecated public void onHeadersTransitionStop(boolean);
  }

  @Deprecated public abstract static class BrowseFragment.FragmentFactory<T extends android.app.Fragment> {
    ctor @Deprecated public BrowseFragment.FragmentFactory();
    method @Deprecated public abstract T! createFragment(Object!);
  }

  @Deprecated public static interface BrowseFragment.FragmentHost {
    method @Deprecated public void notifyDataReady(androidx.leanback.app.BrowseFragment.MainFragmentAdapter!);
    method @Deprecated public void notifyViewCreated(androidx.leanback.app.BrowseFragment.MainFragmentAdapter!);
    method @Deprecated public void showTitleView(boolean);
  }

  @Deprecated public static class BrowseFragment.ListRowFragmentFactory extends androidx.leanback.app.BrowseFragment.FragmentFactory<androidx.leanback.app.RowsFragment> {
    ctor @Deprecated public BrowseFragment.ListRowFragmentFactory();
    method @Deprecated public androidx.leanback.app.RowsFragment! createFragment(Object!);
  }

  @Deprecated public static class BrowseFragment.MainFragmentAdapter<T extends android.app.Fragment> {
    ctor @Deprecated public BrowseFragment.MainFragmentAdapter(T!);
    method @Deprecated public final T! getFragment();
    method @Deprecated public final androidx.leanback.app.BrowseFragment.FragmentHost! getFragmentHost();
    method @Deprecated public boolean isScalingEnabled();
    method @Deprecated public boolean isScrolling();
    method @Deprecated public void onTransitionEnd();
    method @Deprecated public boolean onTransitionPrepare();
    method @Deprecated public void onTransitionStart();
    method @Deprecated public void setAlignment(int);
    method @Deprecated public void setEntranceTransitionState(boolean);
    method @Deprecated public void setExpand(boolean);
    method @Deprecated public void setScalingEnabled(boolean);
  }

  @Deprecated public static interface BrowseFragment.MainFragmentAdapterProvider {
    method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentAdapter! getMainFragmentAdapter();
  }

  @Deprecated public static final class BrowseFragment.MainFragmentAdapterRegistry {
    ctor @Deprecated public BrowseFragment.MainFragmentAdapterRegistry();
    method @Deprecated public android.app.Fragment! createFragment(Object!);
    method @Deprecated public void registerFragment(Class<?>!, androidx.leanback.app.BrowseFragment.FragmentFactory!);
  }

  @Deprecated public static class BrowseFragment.MainFragmentRowsAdapter<T extends android.app.Fragment> {
    ctor @Deprecated public BrowseFragment.MainFragmentRowsAdapter(T!);
    method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
    method @Deprecated public final T! getFragment();
    method @Deprecated public int getSelectedPosition();
    method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method @Deprecated public void setSelectedPosition(int, boolean);
  }

  @Deprecated public static interface BrowseFragment.MainFragmentRowsAdapterProvider {
    method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
  }

  public class BrowseSupportFragment extends androidx.leanback.app.BaseSupportFragment {
    method public static android.os.Bundle! createArgs(android.os.Bundle!, String!, int);
    method public void enableMainFragmentScaling(boolean);
    method @Deprecated public void enableRowScaling(boolean);
    method public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @ColorInt public int getBrandColor();
    method public int getHeadersState();
    method public androidx.leanback.app.HeadersSupportFragment! getHeadersSupportFragment();
    method public androidx.fragment.app.Fragment! getMainFragment();
    method public final androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry! getMainFragmentRegistry();
    method public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
    method public androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
    method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
    method public int getSelectedPosition();
    method public androidx.leanback.widget.RowPresenter.ViewHolder! getSelectedRowViewHolder();
    method public final boolean isHeadersTransitionOnBackEnabled();
    method public boolean isInHeadersTransition();
    method public boolean isShowingHeaders();
    method public androidx.leanback.app.HeadersSupportFragment! onCreateHeadersSupportFragment();
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setBrandColor(@ColorInt int);
    method public void setBrowseTransitionListener(androidx.leanback.app.BrowseSupportFragment.BrowseTransitionListener!);
    method public void setHeaderPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method public void setHeadersState(int);
    method public final void setHeadersTransitionOnBackEnabled(boolean);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, boolean);
    method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method public void startHeadersTransition(boolean);
    field public static final int HEADERS_DISABLED = 3; // 0x3
    field public static final int HEADERS_ENABLED = 1; // 0x1
    field public static final int HEADERS_HIDDEN = 2; // 0x2
  }

  public static class BrowseSupportFragment.BrowseTransitionListener {
    ctor public BrowseSupportFragment.BrowseTransitionListener();
    method public void onHeadersTransitionStart(boolean);
    method public void onHeadersTransitionStop(boolean);
  }

  public abstract static class BrowseSupportFragment.FragmentFactory<T extends androidx.fragment.app.Fragment> {
    ctor public BrowseSupportFragment.FragmentFactory();
    method public abstract T! createFragment(Object!);
  }

  public static interface BrowseSupportFragment.FragmentHost {
    method public void notifyDataReady(androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter!);
    method public void notifyViewCreated(androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter!);
    method public void showTitleView(boolean);
  }

  public static class BrowseSupportFragment.ListRowFragmentFactory extends androidx.leanback.app.BrowseSupportFragment.FragmentFactory<androidx.leanback.app.RowsSupportFragment> {
    ctor public BrowseSupportFragment.ListRowFragmentFactory();
    method public androidx.leanback.app.RowsSupportFragment! createFragment(Object!);
  }

  public static class BrowseSupportFragment.MainFragmentAdapter<T extends androidx.fragment.app.Fragment> {
    ctor public BrowseSupportFragment.MainFragmentAdapter(T!);
    method public final T! getFragment();
    method public final androidx.leanback.app.BrowseSupportFragment.FragmentHost! getFragmentHost();
    method public boolean isScalingEnabled();
    method public boolean isScrolling();
    method public void onTransitionEnd();
    method public boolean onTransitionPrepare();
    method public void onTransitionStart();
    method public void setAlignment(int);
    method public void setEntranceTransitionState(boolean);
    method public void setExpand(boolean);
    method public void setScalingEnabled(boolean);
  }

  public static interface BrowseSupportFragment.MainFragmentAdapterProvider {
    method public androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter! getMainFragmentAdapter();
  }

  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
    method public androidx.fragment.app.Fragment! createFragment(Object!);
    method public void registerFragment(Class<?>!, androidx.leanback.app.BrowseSupportFragment.FragmentFactory!);
  }

  public static class BrowseSupportFragment.MainFragmentRowsAdapter<T extends androidx.fragment.app.Fragment> {
    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T!);
    method public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
    method public final T! getFragment();
    method public int getSelectedPosition();
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method public void setSelectedPosition(int, boolean);
  }

  public static interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
    method public androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
  }

  @Deprecated public class DetailsFragment extends androidx.leanback.app.BaseFragment {
    method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
    method @Deprecated public androidx.leanback.widget.DetailsParallax! getParallax();
    method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
    method @Deprecated protected android.view.View! inflateTitle(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated protected void onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, int, int);
    method @Deprecated protected void onSetRowStatus(androidx.leanback.widget.RowPresenter!, androidx.leanback.widget.RowPresenter.ViewHolder!, int, int, int);
    method @Deprecated public void onStop();
    method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method @Deprecated public void setSelectedPosition(int);
    method @Deprecated public void setSelectedPosition(int, boolean);
    method @Deprecated protected void setupDetailsOverviewRowPresenter(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
    method @Deprecated protected void setupPresenter(androidx.leanback.widget.Presenter!);
  }

  @Deprecated public class DetailsFragmentBackgroundController {
    ctor @Deprecated public DetailsFragmentBackgroundController(androidx.leanback.app.DetailsFragment!);
    method @Deprecated public boolean canNavigateToVideoFragment();
    method @Deprecated public void enableParallax();
    method @Deprecated public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, androidx.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget?);
    method @Deprecated public final android.app.Fragment! findOrCreateVideoFragment();
    method @Deprecated public final android.graphics.drawable.Drawable! getBottomDrawable();
    method @Deprecated public final android.graphics.Bitmap! getCoverBitmap();
    method @Deprecated public final android.graphics.drawable.Drawable! getCoverDrawable();
    method @Deprecated public final int getParallaxDrawableMaxOffset();
    method @Deprecated public final androidx.leanback.media.PlaybackGlue! getPlaybackGlue();
    method @Deprecated @ColorInt public final int getSolidColor();
    method @Deprecated public androidx.leanback.media.PlaybackGlueHost! onCreateGlueHost();
    method @Deprecated public android.app.Fragment! onCreateVideoFragment();
    method @Deprecated public final void setCoverBitmap(android.graphics.Bitmap!);
    method @Deprecated public final void setParallaxDrawableMaxOffset(int);
    method @Deprecated public final void setSolidColor(@ColorInt int);
    method @Deprecated public void setupVideoPlayback(androidx.leanback.media.PlaybackGlue);
    method @Deprecated public final void switchToRows();
    method @Deprecated public final void switchToVideo();
  }

  public class DetailsSupportFragment extends androidx.leanback.app.BaseSupportFragment {
    method public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
    method public androidx.leanback.widget.DetailsParallax! getParallax();
    method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
    method @Deprecated protected android.view.View! inflateTitle(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method protected void onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, int, int);
    method protected void onSetRowStatus(androidx.leanback.widget.RowPresenter!, androidx.leanback.widget.RowPresenter.ViewHolder!, int, int, int);
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, boolean);
    method protected void setupDetailsOverviewRowPresenter(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
    method protected void setupPresenter(androidx.leanback.widget.Presenter!);
  }

  public class DetailsSupportFragmentBackgroundController {
    ctor public DetailsSupportFragmentBackgroundController(androidx.leanback.app.DetailsSupportFragment!);
    method public boolean canNavigateToVideoSupportFragment();
    method public void enableParallax();
    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, androidx.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget?);
    method public final androidx.fragment.app.Fragment! findOrCreateVideoSupportFragment();
    method public final android.graphics.drawable.Drawable! getBottomDrawable();
    method public final android.graphics.Bitmap! getCoverBitmap();
    method public final android.graphics.drawable.Drawable! getCoverDrawable();
    method public final int getParallaxDrawableMaxOffset();
    method public final androidx.leanback.media.PlaybackGlue! getPlaybackGlue();
    method @ColorInt public final int getSolidColor();
    method public androidx.leanback.media.PlaybackGlueHost! onCreateGlueHost();
    method public androidx.fragment.app.Fragment! onCreateVideoSupportFragment();
    method public final void setCoverBitmap(android.graphics.Bitmap!);
    method public final void setParallaxDrawableMaxOffset(int);
    method public final void setSolidColor(@ColorInt int);
    method public void setupVideoPlayback(androidx.leanback.media.PlaybackGlue);
    method public final void switchToRows();
    method public final void switchToVideo();
  }

  @Deprecated public class ErrorFragment extends androidx.leanback.app.BrandedFragment {
    ctor @Deprecated public ErrorFragment();
    method @Deprecated public android.graphics.drawable.Drawable! getBackgroundDrawable();
    method @Deprecated public android.view.View.OnClickListener! getButtonClickListener();
    method @Deprecated public String! getButtonText();
    method @Deprecated public android.graphics.drawable.Drawable! getImageDrawable();
    method @Deprecated public CharSequence! getMessage();
    method @Deprecated public boolean isBackgroundTranslucent();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method @Deprecated public void setButtonClickListener(android.view.View.OnClickListener!);
    method @Deprecated public void setButtonText(String!);
    method @Deprecated public void setDefaultBackground(boolean);
    method @Deprecated public void setImageDrawable(android.graphics.drawable.Drawable!);
    method @Deprecated public void setMessage(CharSequence!);
  }

  public class ErrorSupportFragment extends androidx.leanback.app.BrandedSupportFragment {
    ctor public ErrorSupportFragment();
    method public android.graphics.drawable.Drawable! getBackgroundDrawable();
    method public android.view.View.OnClickListener! getButtonClickListener();
    method public String! getButtonText();
    method public android.graphics.drawable.Drawable! getImageDrawable();
    method public CharSequence! getMessage();
    method public boolean isBackgroundTranslucent();
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
    method public void setButtonClickListener(android.view.View.OnClickListener!);
    method public void setButtonText(String!);
    method public void setDefaultBackground(boolean);
    method public void setImageDrawable(android.graphics.drawable.Drawable!);
    method public void setMessage(CharSequence!);
  }

  @Deprecated public class GuidedStepFragment extends android.app.Fragment {
    ctor @Deprecated public GuidedStepFragment();
    method @Deprecated public static int add(android.app.FragmentManager!, androidx.leanback.app.GuidedStepFragment!);
    method @Deprecated public static int add(android.app.FragmentManager!, androidx.leanback.app.GuidedStepFragment!, int);
    method @Deprecated public static int addAsRoot(android.app.Activity!, androidx.leanback.app.GuidedStepFragment!, int);
    method @Deprecated public void collapseAction(boolean);
    method @Deprecated public void collapseSubActions();
    method @Deprecated public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
    method @Deprecated public void expandSubActions(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public androidx.leanback.widget.GuidedAction! findActionById(long);
    method @Deprecated public int findActionPositionById(long);
    method @Deprecated public androidx.leanback.widget.GuidedAction! findButtonActionById(long);
    method @Deprecated public int findButtonActionPositionById(long);
    method @Deprecated public void finishGuidedStepFragments();
    method @Deprecated public android.view.View! getActionItemView(int);
    method @Deprecated public java.util.List<androidx.leanback.widget.GuidedAction!>! getActions();
    method @Deprecated public android.view.View! getButtonActionItemView(int);
    method @Deprecated public java.util.List<androidx.leanback.widget.GuidedAction!>! getButtonActions();
    method @Deprecated public static androidx.leanback.app.GuidedStepFragment! getCurrentGuidedStepFragment(android.app.FragmentManager!);
    method @Deprecated public androidx.leanback.widget.GuidanceStylist! getGuidanceStylist();
    method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! getGuidedActionsStylist();
    method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! getGuidedButtonActionsStylist();
    method @Deprecated public int getSelectedActionPosition();
    method @Deprecated public int getSelectedButtonActionPosition();
    method @Deprecated public int getUiStyle();
    method @Deprecated public boolean isExpanded();
    method @Deprecated public boolean isFocusOutEndAllowed();
    method @Deprecated public boolean isFocusOutStartAllowed();
    method @Deprecated public boolean isSubActionsExpanded();
    method @Deprecated public void notifyActionChanged(int);
    method @Deprecated public void notifyButtonActionChanged(int);
    method @Deprecated protected void onAddSharedElementTransition(android.app.FragmentTransaction!, androidx.leanback.app.GuidedStepFragment!);
    method @Deprecated public void onCreate(android.os.Bundle!);
    method @Deprecated public void onCreateActions(java.util.List<androidx.leanback.widget.GuidedAction!>, android.os.Bundle!);
    method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! onCreateActionsStylist();
    method @Deprecated public android.view.View! onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onCreateButtonActions(java.util.List<androidx.leanback.widget.GuidedAction!>, android.os.Bundle!);
    method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! onCreateButtonActionsStylist();
    method @Deprecated public androidx.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle!);
    method @Deprecated public androidx.leanback.widget.GuidanceStylist! onCreateGuidanceStylist();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroyView();
    method @Deprecated public void onGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void onGuidedActionEditCanceled(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void onGuidedActionEdited(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public long onGuidedActionEditedAndProceed(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void onGuidedActionFocused(androidx.leanback.widget.GuidedAction!);
    method @Deprecated protected void onProvideFragmentTransitions();
    method @Deprecated public int onProvideTheme();
    method @Deprecated public void onResume();
    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
    method @Deprecated public boolean onSubGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void openInEditMode(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void popBackStackToGuidedStepFragment(Class<?>!, int);
    method @Deprecated public void setActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method @Deprecated public void setActionsDiffCallback(androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction!>!);
    method @Deprecated public void setButtonActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method @Deprecated public void setSelectedActionPosition(int);
    method @Deprecated public void setSelectedButtonActionPosition(int);
    method @Deprecated public void setUiStyle(int);
    field @Deprecated public static final String EXTRA_UI_STYLE = "uiStyle";
    field @Deprecated public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
    field @Deprecated public static final int UI_STYLE_DEFAULT = 0; // 0x0
    field @Deprecated public static final int UI_STYLE_ENTRANCE = 1; // 0x1
    field @Deprecated public static final int UI_STYLE_REPLACE = 0; // 0x0
  }

  public class GuidedStepSupportFragment extends androidx.fragment.app.Fragment {
    ctor public GuidedStepSupportFragment();
    method public static int add(androidx.fragment.app.FragmentManager!, androidx.leanback.app.GuidedStepSupportFragment!);
    method public static int add(androidx.fragment.app.FragmentManager!, androidx.leanback.app.GuidedStepSupportFragment!, int);
    method public static int addAsRoot(androidx.fragment.app.FragmentActivity!, androidx.leanback.app.GuidedStepSupportFragment!, int);
    method public void collapseAction(boolean);
    method public void collapseSubActions();
    method public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
    method public void expandSubActions(androidx.leanback.widget.GuidedAction!);
    method public androidx.leanback.widget.GuidedAction! findActionById(long);
    method public int findActionPositionById(long);
    method public androidx.leanback.widget.GuidedAction! findButtonActionById(long);
    method public int findButtonActionPositionById(long);
    method public void finishGuidedStepSupportFragments();
    method public android.view.View! getActionItemView(int);
    method public java.util.List<androidx.leanback.widget.GuidedAction!>! getActions();
    method public android.view.View! getButtonActionItemView(int);
    method public java.util.List<androidx.leanback.widget.GuidedAction!>! getButtonActions();
    method public static androidx.leanback.app.GuidedStepSupportFragment! getCurrentGuidedStepSupportFragment(androidx.fragment.app.FragmentManager!);
    method public androidx.leanback.widget.GuidanceStylist! getGuidanceStylist();
    method public androidx.leanback.widget.GuidedActionsStylist! getGuidedActionsStylist();
    method public androidx.leanback.widget.GuidedActionsStylist! getGuidedButtonActionsStylist();
    method public int getSelectedActionPosition();
    method public int getSelectedButtonActionPosition();
    method public int getUiStyle();
    method public boolean isExpanded();
    method public boolean isFocusOutEndAllowed();
    method public boolean isFocusOutStartAllowed();
    method public boolean isSubActionsExpanded();
    method public void notifyActionChanged(int);
    method public void notifyButtonActionChanged(int);
    method protected void onAddSharedElementTransition(androidx.fragment.app.FragmentTransaction!, androidx.leanback.app.GuidedStepSupportFragment!);
    method public void onCreateActions(java.util.List<androidx.leanback.widget.GuidedAction!>, android.os.Bundle!);
    method public androidx.leanback.widget.GuidedActionsStylist! onCreateActionsStylist();
    method public android.view.View! onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method public void onCreateButtonActions(java.util.List<androidx.leanback.widget.GuidedAction!>, android.os.Bundle!);
    method public androidx.leanback.widget.GuidedActionsStylist! onCreateButtonActionsStylist();
    method public androidx.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle!);
    method public androidx.leanback.widget.GuidanceStylist! onCreateGuidanceStylist();
    method public void onGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
    method public void onGuidedActionEditCanceled(androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void onGuidedActionEdited(androidx.leanback.widget.GuidedAction!);
    method public long onGuidedActionEditedAndProceed(androidx.leanback.widget.GuidedAction!);
    method public void onGuidedActionFocused(androidx.leanback.widget.GuidedAction!);
    method protected void onProvideFragmentTransitions();
    method public int onProvideTheme();
    method public boolean onSubGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
    method public void openInEditMode(androidx.leanback.widget.GuidedAction!);
    method public void popBackStackToGuidedStepSupportFragment(Class<?>!, int);
    method public void setActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method public void setActionsDiffCallback(androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction!>!);
    method public void setButtonActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method public void setSelectedActionPosition(int);
    method public void setSelectedButtonActionPosition(int);
    method public void setUiStyle(int);
    field public static final String EXTRA_UI_STYLE = "uiStyle";
    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
    field @Deprecated public static final int UI_STYLE_DEFAULT = 0; // 0x0
    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
    field public static final int UI_STYLE_REPLACE = 0; // 0x0
  }

  @Deprecated public class HeadersFragment extends android.app.Fragment {
    ctor @Deprecated public HeadersFragment();
    method @Deprecated public final androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
    method @Deprecated public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
    method @Deprecated public int getSelectedPosition();
    method @Deprecated public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
    method @Deprecated public boolean isScrolling();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroyView();
    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
    method @Deprecated public void onTransitionEnd();
    method @Deprecated public boolean onTransitionPrepare();
    method @Deprecated public void onTransitionStart();
    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
    method @Deprecated public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setAlignment(int);
    method @Deprecated public void setOnHeaderClickedListener(androidx.leanback.app.HeadersFragment.OnHeaderClickedListener!);
    method @Deprecated public void setOnHeaderViewSelectedListener(androidx.leanback.app.HeadersFragment.OnHeaderViewSelectedListener!);
    method @Deprecated public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method @Deprecated public void setSelectedPosition(int);
    method @Deprecated public void setSelectedPosition(int, boolean);
  }

  @Deprecated public static interface HeadersFragment.OnHeaderClickedListener {
    method @Deprecated public void onHeaderClicked(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
  }

  @Deprecated public static interface HeadersFragment.OnHeaderViewSelectedListener {
    method @Deprecated public void onHeaderSelected(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
  }

  public class HeadersSupportFragment extends androidx.fragment.app.Fragment {
    ctor public HeadersSupportFragment();
    method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
    method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
    method public int getSelectedPosition();
    method public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
    method public boolean isScrolling();
    method public void onTransitionEnd();
    method public boolean onTransitionPrepare();
    method public void onTransitionStart();
    method public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setAlignment(int);
    method public void setOnHeaderClickedListener(androidx.leanback.app.HeadersSupportFragment.OnHeaderClickedListener!);
    method public void setOnHeaderViewSelectedListener(androidx.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener!);
    method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, boolean);
  }

  public static interface HeadersSupportFragment.OnHeaderClickedListener {
    method public void onHeaderClicked(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
  }

  public static interface HeadersSupportFragment.OnHeaderViewSelectedListener {
    method public void onHeaderSelected(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
  }

  @Deprecated public abstract class OnboardingFragment extends android.app.Fragment {
    ctor @Deprecated public OnboardingFragment();
    method @Deprecated @ColorInt public final int getArrowBackgroundColor();
    method @Deprecated @ColorInt public final int getArrowColor();
    method @Deprecated protected final int getCurrentPageIndex();
    method @Deprecated @ColorInt public final int getDescriptionViewTextColor();
    method @Deprecated @ColorInt public final int getDotBackgroundColor();
    method @Deprecated public final int getIconResourceId();
    method @Deprecated public final int getLogoResourceId();
    method @Deprecated protected abstract int getPageCount();
    method @Deprecated protected abstract CharSequence! getPageDescription(int);
    method @Deprecated protected abstract CharSequence! getPageTitle(int);
    method @Deprecated public final CharSequence! getStartButtonText();
    method @Deprecated @ColorInt public final int getTitleViewTextColor();
    method @Deprecated protected final boolean isLogoAnimationFinished();
    method @Deprecated protected void moveToNextPage();
    method @Deprecated protected void moveToPreviousPage();
    method @Deprecated protected abstract android.view.View? onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method @Deprecated protected abstract android.view.View? onCreateContentView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method @Deprecated protected android.animation.Animator! onCreateDescriptionAnimator();
    method @Deprecated protected android.animation.Animator? onCreateEnterAnimation();
    method @Deprecated protected abstract android.view.View? onCreateForegroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method @Deprecated protected android.animation.Animator? onCreateLogoAnimation();
    method @Deprecated protected android.animation.Animator! onCreateTitleAnimator();
    method @Deprecated public android.view.View? onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated protected void onFinishFragment();
    method @Deprecated protected void onLogoAnimationFinished();
    method @Deprecated protected void onPageChanged(int, int);
    method @Deprecated public int onProvideTheme();
    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
    method @Deprecated public void setArrowBackgroundColor(@ColorInt int);
    method @Deprecated public void setArrowColor(@ColorInt int);
    method @Deprecated public void setDescriptionViewTextColor(@ColorInt int);
    method @Deprecated public void setDotBackgroundColor(@ColorInt int);
    method @Deprecated public final void setIconResouceId(int);
    method @Deprecated public final void setLogoResourceId(int);
    method @Deprecated public void setStartButtonText(CharSequence!);
    method @Deprecated public void setTitleViewTextColor(@ColorInt int);
    method @Deprecated protected final void startEnterAnimation(boolean);
  }

  public abstract class OnboardingSupportFragment extends androidx.fragment.app.Fragment {
    ctor public OnboardingSupportFragment();
    method @ColorInt public final int getArrowBackgroundColor();
    method @ColorInt public final int getArrowColor();
    method protected final int getCurrentPageIndex();
    method @ColorInt public final int getDescriptionViewTextColor();
    method @ColorInt public final int getDotBackgroundColor();
    method public final int getIconResourceId();
    method public final int getLogoResourceId();
    method protected abstract int getPageCount();
    method protected abstract CharSequence! getPageDescription(int);
    method protected abstract CharSequence! getPageTitle(int);
    method public final CharSequence! getStartButtonText();
    method @ColorInt public final int getTitleViewTextColor();
    method protected final boolean isLogoAnimationFinished();
    method protected void moveToNextPage();
    method protected void moveToPreviousPage();
    method protected abstract android.view.View? onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method protected abstract android.view.View? onCreateContentView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method protected android.animation.Animator! onCreateDescriptionAnimator();
    method protected android.animation.Animator? onCreateEnterAnimation();
    method protected abstract android.view.View? onCreateForegroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method protected android.animation.Animator? onCreateLogoAnimation();
    method protected android.animation.Animator! onCreateTitleAnimator();
    method protected void onFinishFragment();
    method protected void onLogoAnimationFinished();
    method protected void onPageChanged(int, int);
    method public int onProvideTheme();
    method public void setArrowBackgroundColor(@ColorInt int);
    method public void setArrowColor(@ColorInt int);
    method public void setDescriptionViewTextColor(@ColorInt int);
    method public void setDotBackgroundColor(@ColorInt int);
    method public final void setIconResouceId(int);
    method public final void setLogoResourceId(int);
    method public void setStartButtonText(CharSequence!);
    method public void setTitleViewTextColor(@ColorInt int);
    method protected final void startEnterAnimation(boolean);
  }

  @Deprecated public class PlaybackFragment extends android.app.Fragment {
    ctor @Deprecated public PlaybackFragment();
    method @Deprecated public void fadeOut();
    method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated public int getBackgroundType();
    method @Deprecated public androidx.leanback.app.ProgressBarManager! getProgressBarManager();
    method @Deprecated public void hideControlsOverlay(boolean);
    method @Deprecated public boolean isControlsOverlayAutoHideEnabled();
    method @Deprecated public boolean isControlsOverlayVisible();
    method @Deprecated public boolean isFadingEnabled();
    method @Deprecated public boolean isShowOrHideControlsOverlayOnUserInteraction();
    method @Deprecated public void notifyPlaybackRowChanged();
    method @Deprecated protected void onBufferingStateChanged(boolean);
    method @Deprecated public void onCreate(android.os.Bundle!);
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroy();
    method @Deprecated public void onDestroyView();
    method @Deprecated protected void onError(int, CharSequence!);
    method @Deprecated public void onPause();
    method @Deprecated public void onResume();
    method @Deprecated public void onStart();
    method @Deprecated public void onStop();
    method @Deprecated protected void onVideoSizeChanged(int, int);
    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
    method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setBackgroundType(int);
    method @Deprecated public void setControlsOverlayAutoHideEnabled(boolean);
    method @Deprecated public void setFadingEnabled(boolean);
    method @Deprecated public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method @Deprecated public final void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
    method @Deprecated public void setOnPlaybackItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method @Deprecated public void setPlaybackRow(androidx.leanback.widget.Row!);
    method @Deprecated public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
    method @Deprecated public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
    method @Deprecated public void setSelectedPosition(int);
    method @Deprecated public void setSelectedPosition(int, boolean);
    method @Deprecated public void setShowOrHideControlsOverlayOnUserInteraction(boolean);
    method @Deprecated public void showControlsOverlay(boolean);
    method @Deprecated public void tickle();
    field @Deprecated public static final int BG_DARK = 1; // 0x1
    field @Deprecated public static final int BG_LIGHT = 2; // 0x2
    field @Deprecated public static final int BG_NONE = 0; // 0x0
  }

  @Deprecated public class PlaybackFragmentGlueHost extends androidx.leanback.media.PlaybackGlueHost implements androidx.leanback.widget.PlaybackSeekUi {
    ctor @Deprecated public PlaybackFragmentGlueHost(androidx.leanback.app.PlaybackFragment!);
    method @Deprecated public void fadeOut();
    method @Deprecated public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
  }

  public class PlaybackSupportFragment extends androidx.fragment.app.Fragment {
    ctor public PlaybackSupportFragment();
    method @Deprecated public void fadeOut();
    method public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public int getBackgroundType();
    method public androidx.leanback.app.ProgressBarManager! getProgressBarManager();
    method public void hideControlsOverlay(boolean);
    method public boolean isControlsOverlayAutoHideEnabled();
    method public boolean isControlsOverlayVisible();
    method @Deprecated public boolean isFadingEnabled();
    method public boolean isShowOrHideControlsOverlayOnUserInteraction();
    method public void notifyPlaybackRowChanged();
    method protected void onBufferingStateChanged(boolean);
    method protected void onError(int, CharSequence!);
    method protected void onVideoSizeChanged(int, int);
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setBackgroundType(int);
    method public void setControlsOverlayAutoHideEnabled(boolean);
    method @Deprecated public void setFadingEnabled(boolean);
    method public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
    method public void setOnPlaybackItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method public void setPlaybackRow(androidx.leanback.widget.Row!);
    method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
    method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, boolean);
    method public void setShowOrHideControlsOverlayOnUserInteraction(boolean);
    method public void showControlsOverlay(boolean);
    method public void tickle();
    field public static final int BG_DARK = 1; // 0x1
    field public static final int BG_LIGHT = 2; // 0x2
    field public static final int BG_NONE = 0; // 0x0
  }

  public class PlaybackSupportFragmentGlueHost extends androidx.leanback.media.PlaybackGlueHost implements androidx.leanback.widget.PlaybackSeekUi {
    ctor public PlaybackSupportFragmentGlueHost(androidx.leanback.app.PlaybackSupportFragment!);
    method public void fadeOut();
    method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
  }

  public final class ProgressBarManager {
    ctor public ProgressBarManager();
    method public void disableProgressBar();
    method public void enableProgressBar();
    method public long getInitialDelay();
    method public void hide();
    method public void setInitialDelay(long);
    method public void setProgressBarView(android.view.View!);
    method public void setRootView(android.view.ViewGroup!);
    method public void show();
  }

  @Deprecated public class RowsFragment extends android.app.Fragment implements androidx.leanback.app.BrowseFragment.MainFragmentAdapterProvider androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
    ctor @Deprecated public RowsFragment();
    method @Deprecated public void enableRowScaling(boolean);
    method @Deprecated protected androidx.leanback.widget.VerticalGridView! findGridViewFromRoot(android.view.View!);
    method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
    method @Deprecated public final androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
    method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentAdapter! getMainFragmentAdapter();
    method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
    method @Deprecated public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
    method @Deprecated public androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
    method @Deprecated public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
    method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(int);
    method @Deprecated public int getSelectedPosition();
    method @Deprecated public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
    method @Deprecated public boolean isScrolling();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroyView();
    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
    method @Deprecated public void onTransitionEnd();
    method @Deprecated public boolean onTransitionPrepare();
    method @Deprecated public void onTransitionStart();
    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
    method @Deprecated public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setAlignment(int);
    method @Deprecated public void setEntranceTransitionState(boolean);
    method @Deprecated public void setExpand(boolean);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method @Deprecated public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method @Deprecated public void setSelectedPosition(int);
    method @Deprecated public void setSelectedPosition(int, boolean);
  }

  @Deprecated public static class RowsFragment.MainFragmentAdapter extends androidx.leanback.app.BrowseFragment.MainFragmentAdapter<androidx.leanback.app.RowsFragment> {
    ctor @Deprecated public RowsFragment.MainFragmentAdapter(androidx.leanback.app.RowsFragment!);
  }

  @Deprecated public static class RowsFragment.MainFragmentRowsAdapter extends androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter<androidx.leanback.app.RowsFragment> {
    ctor @Deprecated public RowsFragment.MainFragmentRowsAdapter(androidx.leanback.app.RowsFragment!);
  }

  public class RowsSupportFragment extends androidx.fragment.app.Fragment implements androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
    ctor public RowsSupportFragment();
    method @Deprecated public void enableRowScaling(boolean);
    method protected androidx.leanback.widget.VerticalGridView! findGridViewFromRoot(android.view.View!);
    method public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
    method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
    method public androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter! getMainFragmentAdapter();
    method public androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
    method public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
    method public androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
    method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
    method public androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(int);
    method public int getSelectedPosition();
    method public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
    method public boolean isScrolling();
    method public void onTransitionEnd();
    method public boolean onTransitionPrepare();
    method public void onTransitionStart();
    method public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setAlignment(int);
    method public void setEntranceTransitionState(boolean);
    method public void setExpand(boolean);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, boolean);
  }

  public static class RowsSupportFragment.MainFragmentAdapter extends androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter<androidx.leanback.app.RowsSupportFragment> {
    ctor public RowsSupportFragment.MainFragmentAdapter(androidx.leanback.app.RowsSupportFragment!);
  }

  public static class RowsSupportFragment.MainFragmentRowsAdapter extends androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter<androidx.leanback.app.RowsSupportFragment> {
    ctor public RowsSupportFragment.MainFragmentRowsAdapter(androidx.leanback.app.RowsSupportFragment!);
  }

  @Deprecated public class SearchFragment extends android.app.Fragment {
    ctor @Deprecated public SearchFragment();
    method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!);
    method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!, String!);
    method @Deprecated public void displayCompletions(java.util.List<java.lang.String!>!);
    method @Deprecated public void displayCompletions(android.view.inputmethod.CompletionInfo![]!);
    method @Deprecated public android.graphics.drawable.Drawable! getBadgeDrawable();
    method @Deprecated public android.content.Intent! getRecognizerIntent();
    method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
    method @Deprecated public String! getTitle();
    method @Deprecated public static androidx.leanback.app.SearchFragment! newInstance(String!);
    method @Deprecated public void onCreate(android.os.Bundle!);
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void onDestroy();
    method @Deprecated public void onPause();
    method @Deprecated public void onRequestPermissionsResult(int, String![]!, int[]!);
    method @Deprecated public void onResume();
    method @Deprecated public void onStart();
    method @Deprecated public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method @Deprecated public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method @Deprecated public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
    method @Deprecated public void setSearchQuery(String!, boolean);
    method @Deprecated public void setSearchQuery(android.content.Intent!, boolean);
    method @Deprecated public void setSearchResultProvider(androidx.leanback.app.SearchFragment.SearchResultProvider!);
    method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
    method @Deprecated public void setTitle(String!);
    method @Deprecated public void startRecognition();
  }

  @Deprecated public static interface SearchFragment.SearchResultProvider {
    method @Deprecated public androidx.leanback.widget.ObjectAdapter! getResultsAdapter();
    method @Deprecated public boolean onQueryTextChange(String!);
    method @Deprecated public boolean onQueryTextSubmit(String!);
  }

  public class SearchSupportFragment extends androidx.fragment.app.Fragment {
    ctor public SearchSupportFragment();
    method public static android.os.Bundle! createArgs(android.os.Bundle!, String!);
    method public static android.os.Bundle! createArgs(android.os.Bundle!, String!, String!);
    method public void displayCompletions(java.util.List<java.lang.String!>!);
    method public void displayCompletions(android.view.inputmethod.CompletionInfo![]!);
    method public android.graphics.drawable.Drawable! getBadgeDrawable();
    method public android.content.Intent! getRecognizerIntent();
    method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
    method public String! getTitle();
    method public static androidx.leanback.app.SearchSupportFragment! newInstance(String!);
    method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setSearchQuery(String!, boolean);
    method public void setSearchQuery(android.content.Intent!, boolean);
    method public void setSearchResultProvider(androidx.leanback.app.SearchSupportFragment.SearchResultProvider!);
    method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
    method public void setTitle(String!);
    method public void startRecognition();
  }

  public static interface SearchSupportFragment.SearchResultProvider {
    method public androidx.leanback.widget.ObjectAdapter! getResultsAdapter();
    method public boolean onQueryTextChange(String!);
    method public boolean onQueryTextSubmit(String!);
  }

  @Deprecated public class VerticalGridFragment extends androidx.leanback.app.BaseFragment {
    method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method @Deprecated public androidx.leanback.widget.VerticalGridPresenter! getGridPresenter();
    method @Deprecated public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
    method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setGridPresenter(androidx.leanback.widget.VerticalGridPresenter!);
    method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method @Deprecated public void setSelectedPosition(int);
  }

  public class VerticalGridSupportFragment extends androidx.leanback.app.BaseSupportFragment {
    method public androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public androidx.leanback.widget.VerticalGridPresenter! getGridPresenter();
    method public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setGridPresenter(androidx.leanback.widget.VerticalGridPresenter!);
    method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method public void setSelectedPosition(int);
  }

  @Deprecated public class VideoFragment extends androidx.leanback.app.PlaybackFragment {
    ctor @Deprecated public VideoFragment();
    method @Deprecated public android.view.SurfaceView! getSurfaceView();
    method @Deprecated public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
  }

  @Deprecated public class VideoFragmentGlueHost extends androidx.leanback.app.PlaybackFragmentGlueHost implements androidx.leanback.media.SurfaceHolderGlueHost {
    ctor @Deprecated public VideoFragmentGlueHost(androidx.leanback.app.VideoFragment!);
    method @Deprecated public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
  }

  public class VideoSupportFragment extends androidx.leanback.app.PlaybackSupportFragment {
    ctor public VideoSupportFragment();
    method public android.view.SurfaceView! getSurfaceView();
    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
  }

  public class VideoSupportFragmentGlueHost extends androidx.leanback.app.PlaybackSupportFragmentGlueHost implements androidx.leanback.media.SurfaceHolderGlueHost {
    ctor public VideoSupportFragmentGlueHost(androidx.leanback.app.VideoSupportFragment!);
    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
  }

}

package androidx.leanback.database {

  public abstract class CursorMapper {
    ctor public CursorMapper();
    method protected abstract Object! bind(android.database.Cursor!);
    method protected abstract void bindColumns(android.database.Cursor!);
    method public Object! convert(android.database.Cursor!);
  }

}

package androidx.leanback.graphics {

  public class BoundsRule {
    ctor public BoundsRule();
    ctor public BoundsRule(androidx.leanback.graphics.BoundsRule!);
    method public void calculateBounds(android.graphics.Rect!, android.graphics.Rect!);
    field public androidx.leanback.graphics.BoundsRule.ValueRule! bottom;
    field public androidx.leanback.graphics.BoundsRule.ValueRule! left;
    field public androidx.leanback.graphics.BoundsRule.ValueRule! right;
    field public androidx.leanback.graphics.BoundsRule.ValueRule! top;
  }

  public static final class BoundsRule.ValueRule {
    method public static androidx.leanback.graphics.BoundsRule.ValueRule! absoluteValue(int);
    method public int getAbsoluteValue();
    method public float getFraction();
    method public static androidx.leanback.graphics.BoundsRule.ValueRule! inheritFromParent(float);
    method public static androidx.leanback.graphics.BoundsRule.ValueRule! inheritFromParentWithOffset(float, int);
    method public void setAbsoluteValue(int);
    method public void setFraction(float);
  }

  public final class ColorFilterCache {
    method public static androidx.leanback.graphics.ColorFilterCache! getColorFilterCache(int);
    method public android.graphics.ColorFilter! getFilterForLevel(float);
  }

  public final class ColorFilterDimmer {
    method public void applyFilterToView(android.view.View!);
    method public static androidx.leanback.graphics.ColorFilterDimmer! create(androidx.leanback.graphics.ColorFilterCache!, float, float);
    method public static androidx.leanback.graphics.ColorFilterDimmer! createDefault(android.content.Context!);
    method public android.graphics.ColorFilter! getColorFilter();
    method public android.graphics.Paint! getPaint();
    method public void setActiveLevel(float);
  }

  public final class ColorOverlayDimmer {
    method public int applyToColor(int);
    method public static androidx.leanback.graphics.ColorOverlayDimmer! createColorOverlayDimmer(int, float, float);
    method public static androidx.leanback.graphics.ColorOverlayDimmer! createDefault(android.content.Context!);
    method public void drawColorOverlay(android.graphics.Canvas!, android.view.View!, boolean);
    method public int getAlpha();
    method public float getAlphaFloat();
    method public android.graphics.Paint! getPaint();
    method public boolean needsDraw();
    method public void setActiveLevel(float);
  }

  public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public CompositeDrawable();
    method public void addChildDrawable(android.graphics.drawable.Drawable!);
    method public void draw(android.graphics.Canvas!);
    method public androidx.leanback.graphics.CompositeDrawable.ChildDrawable! getChildAt(int);
    method public int getChildCount();
    method public android.graphics.drawable.Drawable! getDrawable(int);
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
    method public void removeChild(int);
    method public void removeDrawable(android.graphics.drawable.Drawable!);
    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
    method public void setAlpha(int);
    method public void setChildDrawableAt(int, android.graphics.drawable.Drawable!);
    method public void setColorFilter(android.graphics.ColorFilter!);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
  }

  public static final class CompositeDrawable.ChildDrawable {
    ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable!, androidx.leanback.graphics.CompositeDrawable!);
    method public androidx.leanback.graphics.BoundsRule! getBoundsRule();
    method public android.graphics.drawable.Drawable! getDrawable();
    method public void recomputeBounds();
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Integer!>! BOTTOM_ABSOLUTE;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Float!>! BOTTOM_FRACTION;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Integer!>! LEFT_ABSOLUTE;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Float!>! LEFT_FRACTION;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Integer!>! RIGHT_ABSOLUTE;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Float!>! RIGHT_FRACTION;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Integer!>! TOP_ABSOLUTE;
    field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable!,java.lang.Float!>! TOP_FRACTION;
  }

  public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
    ctor public FitWidthBitmapDrawable();
    method public void draw(android.graphics.Canvas!);
    method public android.graphics.Bitmap! getBitmap();
    method public int getOpacity();
    method public android.graphics.Rect! getSource();
    method public int getVerticalOffset();
    method public void setAlpha(int);
    method public void setBitmap(android.graphics.Bitmap!);
    method public void setColorFilter(android.graphics.ColorFilter!);
    method public void setSource(android.graphics.Rect!);
    method public void setVerticalOffset(int);
    field public static final android.util.Property<androidx.leanback.graphics.FitWidthBitmapDrawable!,java.lang.Integer!>! PROPERTY_VERTICAL_OFFSET;
  }

}

package androidx.leanback.media {

  public class MediaControllerAdapter extends androidx.leanback.media.PlayerAdapter {
    ctor public MediaControllerAdapter(android.support.v4.media.session.MediaControllerCompat!);
    method public android.graphics.drawable.Drawable! getMediaArt(android.content.Context!);
    method public android.support.v4.media.session.MediaControllerCompat! getMediaController();
    method public CharSequence! getMediaSubtitle();
    method public CharSequence! getMediaTitle();
    method public void pause();
    method public void play();
  }

  @Deprecated public abstract class MediaControllerGlue extends androidx.leanback.media.PlaybackControlGlue {
    ctor @Deprecated public MediaControllerGlue(android.content.Context!, int[]!, int[]!);
    method @Deprecated public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat!);
    method @Deprecated public void detach();
    method @Deprecated public int getCurrentPosition();
    method @Deprecated public int getCurrentSpeedId();
    method @Deprecated public android.graphics.drawable.Drawable! getMediaArt();
    method @Deprecated public final android.support.v4.media.session.MediaControllerCompat! getMediaController();
    method @Deprecated public int getMediaDuration();
    method @Deprecated public CharSequence! getMediaSubtitle();
    method @Deprecated public CharSequence! getMediaTitle();
    method @Deprecated public long getSupportedActions();
    method @Deprecated public boolean hasValidMedia();
    method @Deprecated public boolean isMediaPlaying();
  }

  public class MediaPlayerAdapter extends androidx.leanback.media.PlayerAdapter {
    ctor public MediaPlayerAdapter(android.content.Context!);
    method public final android.media.MediaPlayer! getMediaPlayer();
    method public int getProgressUpdatingInterval();
    method protected boolean onError(int, int);
    method protected boolean onInfo(int, int);
    method protected void onSeekComplete();
    method public void pause();
    method public void play();
    method public void release();
    method public void reset();
    method public boolean setDataSource(android.net.Uri!);
  }

  public class PlaybackBannerControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackBaseControlGlue<T> {
    ctor public PlaybackBannerControlGlue(android.content.Context!, int[]!, T!);
    ctor public PlaybackBannerControlGlue(android.content.Context!, int[]!, int[]!, T!);
    method public int[] getFastForwardSpeeds();
    method public int[] getRewindSpeeds();
    method public void onActionClicked(androidx.leanback.widget.Action!);
    method protected androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
    method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
    field public static final int ACTION_REWIND = 32; // 0x20
    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
  }

  public abstract class PlaybackBaseControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackGlue implements androidx.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
    ctor public PlaybackBaseControlGlue(android.content.Context!, T!);
    method public android.graphics.drawable.Drawable! getArt();
    method public final long getBufferedPosition();
    method public androidx.leanback.widget.PlaybackControlsRow! getControlsRow();
    method public long getCurrentPosition();
    method public final long getDuration();
    method public androidx.leanback.widget.PlaybackRowPresenter! getPlaybackRowPresenter();
    method public final T! getPlayerAdapter();
    method public CharSequence! getSubtitle();
    method public long getSupportedActions();
    method public CharSequence! getTitle();
    method public boolean isControlsOverlayAutoHideEnabled();
    method public final boolean isPlaying();
    method public final boolean isPrepared();
    method protected static void notifyItemChanged(androidx.leanback.widget.ArrayObjectAdapter!, Object!);
    method protected void onCreatePrimaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
    method protected abstract androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
    method protected void onCreateSecondaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
    method protected void onMetadataChanged();
    method @CallSuper protected void onPlayCompleted();
    method @CallSuper protected void onPlayStateChanged();
    method @CallSuper protected void onPreparedStateChanged();
    method @CallSuper protected void onUpdateBufferedProgress();
    method @CallSuper protected void onUpdateDuration();
    method @CallSuper protected void onUpdateProgress();
    method public final void seekTo(long);
    method public void setArt(android.graphics.drawable.Drawable!);
    method public void setControlsOverlayAutoHideEnabled(boolean);
    method public void setControlsRow(androidx.leanback.widget.PlaybackControlsRow!);
    method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
    method public void setSubtitle(CharSequence!);
    method public void setTitle(CharSequence!);
    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
    field public static final int ACTION_REPEAT = 512; // 0x200
    field public static final int ACTION_REWIND = 32; // 0x20
    field public static final int ACTION_SHUFFLE = 1024; // 0x400
    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
  }

  public abstract class PlaybackControlGlue extends androidx.leanback.media.PlaybackGlue implements androidx.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
    ctor public PlaybackControlGlue(android.content.Context!, int[]!);
    ctor public PlaybackControlGlue(android.content.Context!, int[]!, int[]!);
    method public void enableProgressUpdating(boolean);
    method public androidx.leanback.widget.PlaybackControlsRow! getControlsRow();
    method @Deprecated public androidx.leanback.widget.PlaybackControlsRowPresenter! getControlsRowPresenter();
    method public abstract int getCurrentPosition();
    method public abstract int getCurrentSpeedId();
    method public int[]! getFastForwardSpeeds();
    method public abstract android.graphics.drawable.Drawable! getMediaArt();
    method public abstract int getMediaDuration();
    method public abstract CharSequence! getMediaSubtitle();
    method public abstract CharSequence! getMediaTitle();
    method public androidx.leanback.widget.PlaybackRowPresenter! getPlaybackRowPresenter();
    method public int[]! getRewindSpeeds();
    method public abstract long getSupportedActions();
    method public int getUpdatePeriod();
    method public abstract boolean hasValidMedia();
    method public boolean isFadingEnabled();
    method public abstract boolean isMediaPlaying();
    method public void onActionClicked(androidx.leanback.widget.Action!);
    method protected void onCreateControlsRowAndPresenter();
    method protected void onCreatePrimaryActions(androidx.leanback.widget.SparseArrayObjectAdapter!);
    method protected void onCreateSecondaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
    method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
    method protected void onMetadataChanged();
    method protected void onStateChanged();
    method public void play(int);
    method public final void play();
    method public void setControlsRow(androidx.leanback.widget.PlaybackControlsRow!);
    method @Deprecated public void setControlsRowPresenter(androidx.leanback.widget.PlaybackControlsRowPresenter!);
    method public void setFadingEnabled(boolean);
    method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
    method public void updateProgress();
    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
    field public static final int ACTION_REWIND = 32; // 0x20
    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
  }

  public abstract class PlaybackGlue {
    ctor public PlaybackGlue(android.content.Context!);
    method public void addPlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback!);
    method public android.content.Context! getContext();
    method public androidx.leanback.media.PlaybackGlueHost! getHost();
    method protected java.util.List<androidx.leanback.media.PlaybackGlue.PlayerCallback!>! getPlayerCallbacks();
    method public boolean isPlaying();
    method public boolean isPrepared();
    method public void next();
    method @CallSuper protected void onAttachedToHost(androidx.leanback.media.PlaybackGlueHost!);
    method @CallSuper protected void onDetachedFromHost();
    method protected void onHostPause();
    method protected void onHostResume();
    method protected void onHostStart();
    method protected void onHostStop();
    method public void pause();
    method public void play();
    method public void playWhenPrepared();
    method public void previous();
    method public void removePlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback!);
    method public final void setHost(androidx.leanback.media.PlaybackGlueHost!);
  }

  public abstract static class PlaybackGlue.PlayerCallback {
    ctor public PlaybackGlue.PlayerCallback();
    method public void onPlayCompleted(androidx.leanback.media.PlaybackGlue!);
    method public void onPlayStateChanged(androidx.leanback.media.PlaybackGlue!);
    method public void onPreparedStateChanged(androidx.leanback.media.PlaybackGlue!);
  }

  public abstract class PlaybackGlueHost {
    ctor public PlaybackGlueHost();
    method @Deprecated public void fadeOut();
    method public androidx.leanback.media.PlaybackGlueHost.PlayerCallback! getPlayerCallback();
    method public void hideControlsOverlay(boolean);
    method public boolean isControlsOverlayAutoHideEnabled();
    method public boolean isControlsOverlayVisible();
    method public void notifyPlaybackRowChanged();
    method public void setControlsOverlayAutoHideEnabled(boolean);
    method @Deprecated public void setFadingEnabled(boolean);
    method public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
    method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
    method public void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
    method public void setPlaybackRow(androidx.leanback.widget.Row!);
    method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
    method public void showControlsOverlay(boolean);
  }

  public abstract static class PlaybackGlueHost.HostCallback {
    ctor public PlaybackGlueHost.HostCallback();
    method public void onHostDestroy();
    method public void onHostPause();
    method public void onHostResume();
    method public void onHostStart();
    method public void onHostStop();
  }

  public static class PlaybackGlueHost.PlayerCallback {
    ctor public PlaybackGlueHost.PlayerCallback();
    method public void onBufferingStateChanged(boolean);
    method public void onError(int, CharSequence!);
    method public void onVideoSizeChanged(int, int);
  }

  public class PlaybackTransportControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackBaseControlGlue<T> {
    ctor public PlaybackTransportControlGlue(android.content.Context!, T!);
    method public final androidx.leanback.widget.PlaybackSeekDataProvider! getSeekProvider();
    method public final boolean isSeekEnabled();
    method public void onActionClicked(androidx.leanback.widget.Action!);
    method protected androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
    method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
    method public final void setSeekEnabled(boolean);
    method public final void setSeekProvider(androidx.leanback.widget.PlaybackSeekDataProvider!);
  }

  public abstract class PlayerAdapter {
    ctor public PlayerAdapter();
    method public void fastForward();
    method public long getBufferedPosition();
    method public final androidx.leanback.media.PlayerAdapter.Callback! getCallback();
    method public long getCurrentPosition();
    method public long getDuration();
    method public long getSupportedActions();
    method public boolean isPlaying();
    method public boolean isPrepared();
    method public void next();
    method public void onAttachedToHost(androidx.leanback.media.PlaybackGlueHost!);
    method public void onDetachedFromHost();
    method public abstract void pause();
    method public abstract void play();
    method public void previous();
    method public void rewind();
    method public void seekTo(long);
    method public final void setCallback(androidx.leanback.media.PlayerAdapter.Callback!);
    method public void setProgressUpdatingEnabled(boolean);
    method public void setRepeatAction(int);
    method public void setShuffleAction(int);
  }

  public static class PlayerAdapter.Callback {
    ctor public PlayerAdapter.Callback();
    method public void onBufferedPositionChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onBufferingStateChanged(androidx.leanback.media.PlayerAdapter!, boolean);
    method public void onCurrentPositionChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onDurationChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onError(androidx.leanback.media.PlayerAdapter!, int, String!);
    method public void onMetadataChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onPlayCompleted(androidx.leanback.media.PlayerAdapter!);
    method public void onPlayStateChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onPreparedStateChanged(androidx.leanback.media.PlayerAdapter!);
    method public void onVideoSizeChanged(androidx.leanback.media.PlayerAdapter!, int, int);
  }

  public interface SurfaceHolderGlueHost {
    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
  }

}

package androidx.leanback.system {

  public class Settings {
    method public boolean getBoolean(String!);
    method public static androidx.leanback.system.Settings! getInstance(android.content.Context!);
    method public void setBoolean(String!, boolean);
    field public static final String OUTLINE_CLIPPING_DISABLED = "OUTLINE_CLIPPING_DISABLED";
    field public static final String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
  }

}

package androidx.leanback.widget {

  public abstract class AbstractDetailsDescriptionPresenter extends androidx.leanback.widget.Presenter {
    ctor public AbstractDetailsDescriptionPresenter();
    method protected abstract void onBindDescription(androidx.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder!, Object!);
    method public final void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public final androidx.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
  }

  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View!);
    method public android.widget.TextView! getBody();
    method public android.widget.TextView! getSubtitle();
    method public android.widget.TextView! getTitle();
  }

  public abstract class AbstractMediaItemPresenter extends androidx.leanback.widget.RowPresenter {
    ctor public AbstractMediaItemPresenter();
    ctor public AbstractMediaItemPresenter(int);
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method public androidx.leanback.widget.Presenter! getActionPresenter();
    method protected int getMediaPlayState(Object!);
    method public int getThemeId();
    method public boolean hasMediaRowSeparator();
    method protected abstract void onBindMediaDetails(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!, Object!);
    method public void onBindMediaPlayState(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
    method protected void onBindRowActions(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
    method protected void onUnbindMediaDetails(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
    method public void onUnbindMediaPlayState(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
    method public void setActionPresenter(androidx.leanback.widget.Presenter!);
    method public void setBackgroundColor(int);
    method public void setHasMediaRowSeparator(boolean);
    method public void setThemeId(int);
    field public static final int PLAY_STATE_INITIAL = 0; // 0x0
    field public static final int PLAY_STATE_PAUSED = 1; // 0x1
    field public static final int PLAY_STATE_PLAYING = 2; // 0x2
  }

  public static class AbstractMediaItemPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View!);
    method public android.view.ViewGroup! getMediaItemActionsContainer();
    method public android.view.View! getMediaItemDetailsView();
    method public android.widget.TextView! getMediaItemDurationView();
    method public android.widget.TextView! getMediaItemNameView();
    method public android.widget.TextView! getMediaItemNumberView();
    method public android.widget.ViewFlipper! getMediaItemNumberViewFlipper();
    method public android.view.View! getMediaItemPausedView();
    method public android.view.View! getMediaItemPlayingView();
    method public androidx.leanback.widget.MultiActionsProvider.MultiAction![]! getMediaItemRowActions();
    method public android.view.View! getMediaItemRowSeparator();
    method public android.view.View! getSelectorView();
    method public void notifyActionChanged(androidx.leanback.widget.MultiActionsProvider.MultiAction!);
    method public void notifyDetailsChanged();
    method public void notifyPlayStateChanged();
    method public void onBindRowActions();
    method public void setSelectedMediaItemNumberView(int);
  }

  public abstract class AbstractMediaListHeaderPresenter extends androidx.leanback.widget.RowPresenter {
    ctor public AbstractMediaListHeaderPresenter(android.content.Context!, int);
    ctor public AbstractMediaListHeaderPresenter();
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method protected abstract void onBindMediaListHeaderViewHolder(androidx.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder!, Object!);
    method public void setBackgroundColor(int);
  }

  public static class AbstractMediaListHeaderPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View!);
    method public android.widget.TextView! getHeaderView();
  }

  public class Action {
    ctor public Action(long);
    ctor public Action(long, CharSequence!);
    ctor public Action(long, CharSequence!, CharSequence!);
    ctor public Action(long, CharSequence!, CharSequence!, android.graphics.drawable.Drawable!);
    method public final void addKeyCode(int);
    method public final android.graphics.drawable.Drawable! getIcon();
    method public final long getId();
    method public final CharSequence! getLabel1();
    method public final CharSequence! getLabel2();
    method public final void removeKeyCode(int);
    method public final boolean respondsToKeyCode(int);
    method public final void setIcon(android.graphics.drawable.Drawable!);
    method public final void setId(long);
    method public final void setLabel1(CharSequence!);
    method public final void setLabel2(CharSequence!);
    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
  }

  public class ArrayObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
    ctor public ArrayObjectAdapter(androidx.leanback.widget.PresenterSelector!);
    ctor public ArrayObjectAdapter(androidx.leanback.widget.Presenter!);
    ctor public ArrayObjectAdapter();
    method public void add(Object!);
    method public void add(int, Object!);
    method public void addAll(int, java.util.Collection!);
    method public void clear();
    method public Object! get(int);
    method public int indexOf(Object!);
    method public void move(int, int);
    method public void notifyArrayItemRangeChanged(int, int);
    method public boolean remove(Object!);
    method public int removeItems(int, int);
    method public void replace(int, Object!);
    method public void setItems(java.util.List!, androidx.leanback.widget.DiffCallback!);
    method public int size();
    method public <E> java.util.List<E!>! unmodifiableList();
  }

  public class BaseCardView extends android.widget.FrameLayout {
    ctor public BaseCardView(android.content.Context!);
    ctor public BaseCardView(android.content.Context!, android.util.AttributeSet!);
    ctor public BaseCardView(android.content.Context!, android.util.AttributeSet!, int);
    method protected androidx.leanback.widget.BaseCardView.LayoutParams! generateDefaultLayoutParams();
    method public androidx.leanback.widget.BaseCardView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
    method protected androidx.leanback.widget.BaseCardView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
    method public int getCardType();
    method @Deprecated public int getExtraVisibility();
    method public int getInfoVisibility();
    method public boolean isSelectedAnimationDelayed();
    method public void setCardType(int);
    method @Deprecated public void setExtraVisibility(int);
    method public void setInfoVisibility(int);
    method public void setSelectedAnimationDelayed(boolean);
    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
  }

  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
    ctor public BaseCardView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
    ctor public BaseCardView.LayoutParams(int, int);
    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams!);
    ctor public BaseCardView.LayoutParams(androidx.leanback.widget.BaseCardView.LayoutParams!);
    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
    field public static final int VIEW_TYPE_INFO = 1; // 0x1
    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
    field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_MAIN, to="MAIN"), @android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_INFO, to="INFO"), @android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_EXTRA, to="EXTRA")}) public int viewType;
  }

  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
    method public void animateIn();
    method public void animateOut();
    method public int getChildDrawingOrder(int, int);
    method @Deprecated public int getHorizontalMargin();
    method public int getHorizontalSpacing();
    method public int getInitialPrefetchItemCount();
    method public int getItemAlignmentOffset();
    method public float getItemAlignmentOffsetPercent();
    method public int getItemAlignmentViewId();
    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener! getOnUnhandledKeyListener();
    method public final int getSaveChildrenLimitNumber();
    method public final int getSaveChildrenPolicy();
    method public int getSelectedPosition();
    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
    method public final int getSmoothScrollMaxPendingMoves();
    method public final float getSmoothScrollSpeedFactor();
    method @Deprecated public int getVerticalMargin();
    method public int getVerticalSpacing();
    method public void getViewSelectedOffsets(android.view.View!, int[]!);
    method public int getWindowAlignment();
    method public int getWindowAlignmentOffset();
    method public float getWindowAlignmentOffsetPercent();
    method public boolean hasPreviousViewInSameRow(int);
    method public boolean isChildLayoutAnimated();
    method public boolean isFocusDrawingOrderEnabled();
    method public final boolean isFocusSearchDisabled();
    method public boolean isItemAlignmentOffsetWithPadding();
    method public boolean isScrollEnabled();
    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
    method public void setAnimateChildLayout(boolean);
    method public void setChildrenVisibility(int);
    method public void setFocusDrawingOrderEnabled(boolean);
    method public final void setFocusSearchDisabled(boolean);
    method public void setGravity(int);
    method public void setHasOverlappingRendering(boolean);
    method @Deprecated public void setHorizontalMargin(int);
    method public void setHorizontalSpacing(int);
    method public void setInitialPrefetchItemCount(int);
    method public void setItemAlignmentOffset(int);
    method public void setItemAlignmentOffsetPercent(float);
    method public void setItemAlignmentOffsetWithPadding(boolean);
    method public void setItemAlignmentViewId(int);
    method @Deprecated public void setItemMargin(int);
    method public void setItemSpacing(int);
    method public void setLayoutEnabled(boolean);
    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener!);
    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener!);
    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener!);
    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener!);
    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener!);
    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener!);
    method public void setPruneChild(boolean);
    method public final void setSaveChildrenLimitNumber(int);
    method public final void setSaveChildrenPolicy(int);
    method public void setScrollEnabled(boolean);
    method public void setSelectedPosition(int);
    method public void setSelectedPosition(int, int);
    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask!);
    method public void setSelectedPositionSmooth(int);
    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask!);
    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
    method public final void setSmoothScrollMaxPendingMoves(int);
    method public final void setSmoothScrollSpeedFactor(float);
    method @Deprecated public void setVerticalMargin(int);
    method public void setVerticalSpacing(int);
    method public void setWindowAlignment(int);
    method public void setWindowAlignmentOffset(int);
    method public void setWindowAlignmentOffsetPercent(float);
    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
    field public static final int SAVE_ALL_CHILD = 3; // 0x3
    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
    field public static final int SAVE_NO_CHILD = 0; // 0x0
    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
  }

  public static interface BaseGridView.OnKeyInterceptListener {
    method public boolean onInterceptKeyEvent(android.view.KeyEvent!);
  }

  public static interface BaseGridView.OnMotionInterceptListener {
    method public boolean onInterceptMotionEvent(android.view.MotionEvent!);
  }

  public static interface BaseGridView.OnTouchInterceptListener {
    method public boolean onInterceptTouchEvent(android.view.MotionEvent!);
  }

  public static interface BaseGridView.OnUnhandledKeyListener {
    method public boolean onUnhandledKey(android.view.KeyEvent!);
  }

  public static interface BaseGridView.SmoothScrollByBehavior {
    method public int configSmoothScrollByDuration(int, int);
    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
  }

  public interface BaseOnItemViewClickedListener<T> {
    method public void onItemClicked(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
  }

  public interface BaseOnItemViewSelectedListener<T> {
    method public void onItemSelected(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
  }

  public class BrowseFrameLayout extends android.widget.FrameLayout {
    ctor public BrowseFrameLayout(android.content.Context!);
    ctor public BrowseFrameLayout(android.content.Context!, android.util.AttributeSet!);
    ctor public BrowseFrameLayout(android.content.Context!, android.util.AttributeSet!, int);
    method public androidx.leanback.widget.BrowseFrameLayout.OnChildFocusListener! getOnChildFocusListener();
    method public androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener! getOnFocusSearchListener();
    method public void setOnChildFocusListener(androidx.leanback.widget.BrowseFrameLayout.OnChildFocusListener!);
    method public void setOnDispatchKeyListener(android.view.View.OnKeyListener!);
    method public void setOnFocusSearchListener(androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener!);
  }

  public static interface BrowseFrameLayout.OnChildFocusListener {
    method public void onRequestChildFocus(android.view.View!, android.view.View!);
    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
  }

  public static interface BrowseFrameLayout.OnFocusSearchListener {
    method public android.view.View! onFocusSearch(android.view.View!, int);
  }

  public final class ClassPresenterSelector extends androidx.leanback.widget.PresenterSelector {
    ctor public ClassPresenterSelector();
    method public androidx.leanback.widget.ClassPresenterSelector! addClassPresenter(Class<?>!, androidx.leanback.widget.Presenter!);
    method public androidx.leanback.widget.ClassPresenterSelector! addClassPresenterSelector(Class<?>!, androidx.leanback.widget.PresenterSelector!);
    method public androidx.leanback.widget.Presenter! getPresenter(Object!);
  }

  public class ControlButtonPresenterSelector extends androidx.leanback.widget.PresenterSelector {
    ctor public ControlButtonPresenterSelector();
    method public androidx.leanback.widget.Presenter! getPresenter(Object!);
    method public androidx.leanback.widget.Presenter! getPrimaryPresenter();
    method public androidx.leanback.widget.Presenter! getSecondaryPresenter();
  }

  public class CursorObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
    ctor public CursorObjectAdapter(androidx.leanback.widget.PresenterSelector!);
    ctor public CursorObjectAdapter(androidx.leanback.widget.Presenter!);
    ctor public CursorObjectAdapter();
    method public void changeCursor(android.database.Cursor!);
    method public void close();
    method public Object! get(int);
    method public final android.database.Cursor! getCursor();
    method public final androidx.leanback.database.CursorMapper! getMapper();
    method protected final void invalidateCache(int);
    method protected final void invalidateCache(int, int);
    method public boolean isClosed();
    method protected void onCursorChanged();
    method protected void onMapperChanged();
    method public final void setMapper(androidx.leanback.database.CursorMapper!);
    method public int size();
    method public android.database.Cursor! swapCursor(android.database.Cursor!);
  }

  public class DetailsOverviewLogoPresenter extends androidx.leanback.widget.Presenter {
    ctor public DetailsOverviewLogoPresenter();
    method public boolean isBoundToImage(androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder!, androidx.leanback.widget.DetailsOverviewRow!);
    method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public android.view.View! onCreateView(android.view.ViewGroup!);
    method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void setContext(androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
  }

  public static class DetailsOverviewLogoPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View!);
    method public androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter! getParentPresenter();
    method public androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder! getParentViewHolder();
    method public boolean isSizeFromDrawableIntrinsic();
    method public void setSizeFromDrawableIntrinsic(boolean);
    field protected androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter! mParentPresenter;
    field protected androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder! mParentViewHolder;
  }

  public class DetailsOverviewRow extends androidx.leanback.widget.Row {
    ctor public DetailsOverviewRow(Object!);
    method @Deprecated public final void addAction(androidx.leanback.widget.Action!);
    method @Deprecated public final void addAction(int, androidx.leanback.widget.Action!);
    method public androidx.leanback.widget.Action! getActionForKeyCode(int);
    method @Deprecated public final java.util.List<androidx.leanback.widget.Action!>! getActions();
    method public final androidx.leanback.widget.ObjectAdapter! getActionsAdapter();
    method public final android.graphics.drawable.Drawable! getImageDrawable();
    method public final Object! getItem();
    method public boolean isImageScaleUpAllowed();
    method @Deprecated public final boolean removeAction(androidx.leanback.widget.Action!);
    method public final void setActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public final void setImageBitmap(android.content.Context!, android.graphics.Bitmap!);
    method public final void setImageDrawable(android.graphics.drawable.Drawable!);
    method public void setImageScaleUpAllowed(boolean);
    method public final void setItem(Object!);
  }

  public static class DetailsOverviewRow.Listener {
    ctor public DetailsOverviewRow.Listener();
    method public void onActionsAdapterChanged(androidx.leanback.widget.DetailsOverviewRow!);
    method public void onImageDrawableChanged(androidx.leanback.widget.DetailsOverviewRow!);
    method public void onItemChanged(androidx.leanback.widget.DetailsOverviewRow!);
  }

  @Deprecated public class DetailsOverviewRowPresenter extends androidx.leanback.widget.RowPresenter {
    ctor @Deprecated public DetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!);
    method @Deprecated protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method @Deprecated @ColorInt public int getBackgroundColor();
    method @Deprecated public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
    method @Deprecated public boolean isStyleLarge();
    method @Deprecated public final boolean isUsingDefaultSelectEffect();
    method @Deprecated public void setBackgroundColor(@ColorInt int);
    method @Deprecated public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
    method @Deprecated public final void setSharedElementEnterTransition(android.app.Activity!, String!, long);
    method @Deprecated public final void setSharedElementEnterTransition(android.app.Activity!, String!);
    method @Deprecated public void setStyleLarge(boolean);
  }

  @Deprecated public final class DetailsOverviewRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor @Deprecated public DetailsOverviewRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!);
    field @Deprecated public final androidx.leanback.widget.Presenter.ViewHolder! mDetailsDescriptionViewHolder;
  }

  public class DetailsParallax extends androidx.leanback.widget.RecyclerViewParallax {
    ctor public DetailsParallax();
    method public androidx.leanback.widget.Parallax.IntProperty! getOverviewRowBottom();
    method public androidx.leanback.widget.Parallax.IntProperty! getOverviewRowTop();
  }

  public abstract class DiffCallback<Value> {
    ctor public DiffCallback();
    method public abstract boolean areContentsTheSame(Value, Value);
    method public abstract boolean areItemsTheSame(Value, Value);
    method public Object! getChangePayload(Value, Value);
  }

  public class DividerPresenter extends androidx.leanback.widget.Presenter {
    ctor public DividerPresenter();
    method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
  }

  public class DividerRow extends androidx.leanback.widget.Row {
    ctor public DividerRow();
    method public final boolean isRenderedAsRowView();
  }

  public interface FacetProvider {
    method public Object! getFacet(Class<?>!);
  }

  public interface FacetProviderAdapter {
    method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
  }

  public interface FocusHighlight {
    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
  }

  public class FocusHighlightHelper {
    ctor @Deprecated public FocusHighlightHelper();
    method public static void setupBrowseItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!, int, boolean);
    method @Deprecated public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.VerticalGridView!);
    method @Deprecated public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.VerticalGridView!, boolean);
    method public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!);
    method public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!, boolean);
  }

  public interface FragmentAnimationProvider {
    method public void onImeAppearing(java.util.List<android.animation.Animator!>);
    method public void onImeDisappearing(java.util.List<android.animation.Animator!>);
  }

  public class FullWidthDetailsOverviewRowPresenter extends androidx.leanback.widget.RowPresenter {
    ctor public FullWidthDetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!);
    ctor public FullWidthDetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!, androidx.leanback.widget.DetailsOverviewLogoPresenter!);
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method public final int getActionsBackgroundColor();
    method public final int getAlignmentMode();
    method public final int getBackgroundColor();
    method public final int getInitialState();
    method protected int getLayoutResourceId();
    method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
    method public final boolean isParticipatingEntranceTransition();
    method public final boolean isUsingDefaultSelectEffect();
    method public final void notifyOnBindLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!);
    method protected void onLayoutLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, boolean);
    method protected void onLayoutOverviewFrame(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, boolean);
    method protected void onStateChanged(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int);
    method public final void setActionsBackgroundColor(int);
    method public final void setAlignmentMode(int);
    method public final void setBackgroundColor(int);
    method public final void setInitialState(int);
    method public final void setListener(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener!);
    method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
    method public final void setParticipatingEntranceTransition(boolean);
    method public final void setState(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int);
    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
    field public static final int ALIGN_MODE_START = 0; // 0x0
    field public static final int STATE_FULL = 1; // 0x1
    field public static final int STATE_HALF = 0; // 0x0
    field public static final int STATE_SMALL = 2; // 0x2
    field protected int mInitialState;
  }

  public abstract static class FullWidthDetailsOverviewRowPresenter.Listener {
    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
    method public void onBindLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!);
  }

  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!, androidx.leanback.widget.DetailsOverviewLogoPresenter!);
    method protected androidx.leanback.widget.DetailsOverviewRow.Listener! createRowListener();
    method public final android.view.ViewGroup! getActionsRow();
    method public final android.view.ViewGroup! getDetailsDescriptionFrame();
    method public final androidx.leanback.widget.Presenter.ViewHolder! getDetailsDescriptionViewHolder();
    method public final androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder! getLogoViewHolder();
    method public final android.view.ViewGroup! getOverviewView();
    method public final int getState();
    field protected final androidx.leanback.widget.DetailsOverviewRow.Listener! mRowListener;
  }

  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends androidx.leanback.widget.DetailsOverviewRow.Listener {
    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
  }

  public class FullWidthDetailsOverviewSharedElementHelper extends androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
    ctor public FullWidthDetailsOverviewSharedElementHelper();
    method public boolean getAutoStartSharedElementTransition();
    method public void setAutoStartSharedElementTransition(boolean);
    method public void setSharedElementEnterTransition(android.app.Activity!, String!);
    method public void setSharedElementEnterTransition(android.app.Activity!, String!, long);
    method public void startPostponedEnterTransition();
  }

  public class GuidanceStylist implements androidx.leanback.widget.FragmentAnimationProvider {
    ctor public GuidanceStylist();
    method public android.widget.TextView! getBreadcrumbView();
    method public android.widget.TextView! getDescriptionView();
    method public android.widget.ImageView! getIconView();
    method public android.widget.TextView! getTitleView();
    method public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, androidx.leanback.widget.GuidanceStylist.Guidance!);
    method public void onDestroyView();
    method public void onImeAppearing(java.util.List<android.animation.Animator!>);
    method public void onImeDisappearing(java.util.List<android.animation.Animator!>);
    method public int onProvideLayoutId();
  }

  public static class GuidanceStylist.Guidance {
    ctor public GuidanceStylist.Guidance(String!, String!, String!, android.graphics.drawable.Drawable!);
    method public String! getBreadcrumb();
    method public String! getDescription();
    method public android.graphics.drawable.Drawable! getIconDrawable();
    method public String! getTitle();
  }

  public class GuidedAction extends androidx.leanback.widget.Action {
    ctor protected GuidedAction();
    method public String![]! getAutofillHints();
    method public int getCheckSetId();
    method public CharSequence! getDescription();
    method public int getDescriptionEditInputType();
    method public int getDescriptionInputType();
    method public CharSequence! getEditDescription();
    method public int getEditInputType();
    method public CharSequence! getEditTitle();
    method public int getInputType();
    method public android.content.Intent! getIntent();
    method public java.util.List<androidx.leanback.widget.GuidedAction!>! getSubActions();
    method public CharSequence! getTitle();
    method public boolean hasEditableActivatorView();
    method public boolean hasMultilineDescription();
    method public boolean hasNext();
    method public boolean hasSubActions();
    method public boolean hasTextEditable();
    method public boolean infoOnly();
    method public final boolean isAutoSaveRestoreEnabled();
    method public boolean isChecked();
    method public boolean isDescriptionEditable();
    method public boolean isEditTitleUsed();
    method public boolean isEditable();
    method public boolean isEnabled();
    method public boolean isFocusable();
    method public void onRestoreInstanceState(android.os.Bundle!, String!);
    method public void onSaveInstanceState(android.os.Bundle!, String!);
    method public void setChecked(boolean);
    method public void setDescription(CharSequence!);
    method public void setEditDescription(CharSequence!);
    method public void setEditTitle(CharSequence!);
    method public void setEnabled(boolean);
    method public void setFocusable(boolean);
    method public void setIntent(android.content.Intent!);
    method public void setSubActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method public void setTitle(CharSequence!);
    field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
    field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
    field public static final int NO_CHECK_SET = 0; // 0x0
  }

  public static class GuidedAction.Builder extends androidx.leanback.widget.GuidedAction.BuilderBase<androidx.leanback.widget.GuidedAction.Builder> {
    ctor @Deprecated public GuidedAction.Builder();
    ctor public GuidedAction.Builder(android.content.Context!);
    method public androidx.leanback.widget.GuidedAction! build();
  }

  public abstract static class GuidedAction.BuilderBase<B extends androidx.leanback.widget.GuidedAction.BuilderBase> {
    ctor public GuidedAction.BuilderBase(android.content.Context!);
    method protected final void applyValues(androidx.leanback.widget.GuidedAction!);
    method public B! autoSaveRestoreEnabled(boolean);
    method public B! autofillHints(java.lang.String!...);
    method public B! checkSetId(int);
    method public B! checked(boolean);
    method public B! clickAction(long);
    method public B! description(CharSequence!);
    method public B! description(@StringRes int);
    method public B! descriptionEditInputType(int);
    method public B! descriptionEditable(boolean);
    method public B! descriptionInputType(int);
    method public B! editDescription(CharSequence!);
    method public B! editDescription(@StringRes int);
    method public B! editInputType(int);
    method public B! editTitle(CharSequence!);
    method public B! editTitle(@StringRes int);
    method public B! editable(boolean);
    method public B! enabled(boolean);
    method public B! focusable(boolean);
    method public android.content.Context! getContext();
    method public B! hasEditableActivatorView(boolean);
    method public B! hasNext(boolean);
    method public B! icon(android.graphics.drawable.Drawable!);
    method public B! icon(@DrawableRes int);
    method @Deprecated public B! iconResourceId(@DrawableRes int, android.content.Context!);
    method public B! id(long);
    method public B! infoOnly(boolean);
    method public B! inputType(int);
    method public B! intent(android.content.Intent!);
    method public B! multilineDescription(boolean);
    method public B! subActions(java.util.List<androidx.leanback.widget.GuidedAction!>!);
    method public B! title(CharSequence!);
    method public B! title(@StringRes int);
  }

  public interface GuidedActionAutofillSupport {
    method public void setOnAutofillListener(androidx.leanback.widget.GuidedActionAutofillSupport.OnAutofillListener!);
  }

  public static interface GuidedActionAutofillSupport.OnAutofillListener {
    method public void onAutofill(android.view.View!);
  }

  public class GuidedActionDiffCallback extends androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction> {
    ctor public GuidedActionDiffCallback();
    method public boolean areContentsTheSame(androidx.leanback.widget.GuidedAction, androidx.leanback.widget.GuidedAction);
    method public boolean areItemsTheSame(androidx.leanback.widget.GuidedAction, androidx.leanback.widget.GuidedAction);
    method public static androidx.leanback.widget.GuidedActionDiffCallback! getInstance();
  }

  public class GuidedActionEditText extends android.widget.EditText implements androidx.leanback.widget.GuidedActionAutofillSupport androidx.leanback.widget.ImeKeyMonitor {
    ctor public GuidedActionEditText(android.content.Context!);
    ctor public GuidedActionEditText(android.content.Context!, android.util.AttributeSet!);
    ctor public GuidedActionEditText(android.content.Context!, android.util.AttributeSet!, int);
    method public void setImeKeyListener(androidx.leanback.widget.ImeKeyMonitor.ImeKeyListener!);
    method public void setOnAutofillListener(androidx.leanback.widget.GuidedActionAutofillSupport.OnAutofillListener!);
  }

  public class GuidedActionsStylist implements androidx.leanback.widget.FragmentAnimationProvider {
    ctor public GuidedActionsStylist();
    method public void collapseAction(boolean);
    method public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
    method public androidx.leanback.widget.VerticalGridView! getActionsGridView();
    method public androidx.leanback.widget.GuidedAction! getExpandedAction();
    method public int getItemViewType(androidx.leanback.widget.GuidedAction!);
    method public androidx.leanback.widget.VerticalGridView! getSubActionsGridView();
    method public final boolean isBackKeyToCollapseActivatorView();
    method public final boolean isBackKeyToCollapseSubActions();
    method public boolean isButtonActions();
    method public boolean isExpandTransitionSupported();
    method public boolean isExpanded();
    method public boolean isInExpandTransition();
    method public boolean isSubActionsExpanded();
    method public void onAnimateItemChecked(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
    method public void onAnimateItemFocused(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
    method public void onAnimateItemPressed(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
    method public void onAnimateItemPressedCancelled(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
    method public void onBindActivatorView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method public void onBindCheckMarkView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method public void onBindChevronView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method public void onBindViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!);
    method public androidx.leanback.widget.GuidedActionsStylist.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public androidx.leanback.widget.GuidedActionsStylist.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
    method public void onDestroyView();
    method @Deprecated protected void onEditingModeChange(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!, boolean);
    method @CallSuper protected void onEditingModeChange(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean, boolean);
    method public void onImeAppearing(java.util.List<android.animation.Animator!>);
    method public void onImeDisappearing(java.util.List<android.animation.Animator!>);
    method public int onProvideItemLayoutId();
    method public int onProvideItemLayoutId(int);
    method public int onProvideLayoutId();
    method public boolean onUpdateActivatorView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method public void onUpdateExpandedViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
    method public void openInEditMode(androidx.leanback.widget.GuidedAction!);
    method public void setAsButtonActions();
    method public final void setBackKeyToCollapseActivatorView(boolean);
    method public final void setBackKeyToCollapseSubActions(boolean);
    method @Deprecated public void setEditingMode(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!, boolean);
    method @Deprecated public void setExpandedViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
    method protected void setupImeOptions(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
    method @Deprecated public void startExpandedTransition(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
  }

  public static class GuidedActionsStylist.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.leanback.widget.FacetProvider {
    ctor public GuidedActionsStylist.ViewHolder(android.view.View!);
    ctor public GuidedActionsStylist.ViewHolder(android.view.View!, boolean);
    method public androidx.leanback.widget.GuidedAction! getAction();
    method public android.widget.ImageView! getCheckmarkView();
    method public android.widget.ImageView! getChevronView();
    method public android.view.View! getContentView();
    method public android.widget.TextView! getDescriptionView();
    method public android.widget.EditText! getEditableDescriptionView();
    method public android.widget.EditText! getEditableTitleView();
    method public android.view.View! getEditingView();
    method public Object! getFacet(Class<?>!);
    method public android.widget.ImageView! getIconView();
    method public android.widget.TextView! getTitleView();
    method public boolean isInEditing();
    method public boolean isInEditingActivatorView();
    method public boolean isInEditingDescription();
    method public boolean isInEditingText();
    method public boolean isInEditingTitle();
    method public boolean isSubAction();
  }

  public class GuidedDatePickerAction extends androidx.leanback.widget.GuidedAction {
    ctor public GuidedDatePickerAction();
    method public long getDate();
    method public String! getDatePickerFormat();
    method public long getMaxDate();
    method public long getMinDate();
    method public void setDate(long);
  }

  public static final class GuidedDatePickerAction.Builder extends androidx.leanback.widget.GuidedDatePickerAction.BuilderBase<androidx.leanback.widget.GuidedDatePickerAction.Builder> {
    ctor public GuidedDatePickerAction.Builder(android.content.Context!);
    method public androidx.leanback.widget.GuidedDatePickerAction! build();
  }

  public abstract static class GuidedDatePickerAction.BuilderBase<B extends androidx.leanback.widget.GuidedDatePickerAction.BuilderBase> extends androidx.leanback.widget.GuidedAction.BuilderBase<B> {
    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context!);
    method protected final void applyDatePickerValues(androidx.leanback.widget.GuidedDatePickerAction!);
    method public B! date(long);
    method public B! datePickerFormat(String!);
    method public B! maxDate(long);
    method public B! minDate(long);
  }

  public class HeaderItem {
    ctor public HeaderItem(long, String!);
    ctor public HeaderItem(String!);
    method public CharSequence! getContentDescription();
    method public CharSequence! getDescription();
    method public final long getId();
    method public final String! getName();
    method public void setContentDescription(CharSequence!);
    method public void setDescription(CharSequence!);
  }

  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
    ctor public HorizontalGridView(android.content.Context!);
    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!);
    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!, int);
    method public final boolean getFadingLeftEdge();
    method public final int getFadingLeftEdgeLength();
    method public final int getFadingLeftEdgeOffset();
    method public final boolean getFadingRightEdge();
    method public final int getFadingRightEdgeLength();
    method public final int getFadingRightEdgeOffset();
    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
    method public final void setFadingLeftEdge(boolean);
    method public final void setFadingLeftEdgeLength(int);
    method public final void setFadingLeftEdgeOffset(int);
    method public final void setFadingRightEdge(boolean);
    method public final void setFadingRightEdgeLength(int);
    method public final void setFadingRightEdgeOffset(int);
    method public void setNumRows(int);
    method public void setRowHeight(int);
  }

  public final class HorizontalHoverCardSwitcher extends androidx.leanback.widget.PresenterSwitcher {
    ctor public HorizontalHoverCardSwitcher();
    method protected void insertView(android.view.View!);
    method public void select(androidx.leanback.widget.HorizontalGridView!, android.view.View!, Object!);
  }

  public class ImageCardView extends androidx.leanback.widget.BaseCardView {
    ctor @Deprecated public ImageCardView(android.content.Context!, int);
    ctor public ImageCardView(android.content.Context!, android.util.AttributeSet!, int);
    ctor public ImageCardView(android.content.Context!);
    ctor public ImageCardView(android.content.Context!, android.util.AttributeSet!);
    method public android.graphics.drawable.Drawable! getBadgeImage();
    method public CharSequence! getContentText();
    method public android.graphics.drawable.Drawable! getInfoAreaBackground();
    method public android.graphics.drawable.Drawable! getMainImage();
    method public final android.widget.ImageView! getMainImageView();
    method public CharSequence! getTitleText();
    method public void setBadgeImage(android.graphics.drawable.Drawable!);
    method public void setContentText(CharSequence!);
    method public void setInfoAreaBackground(android.graphics.drawable.Drawable!);
    method public void setInfoAreaBackgroundColor(@ColorInt int);
    method public void setMainImage(android.graphics.drawable.Drawable!);
    method public void setMainImage(android.graphics.drawable.Drawable!, boolean);
    method public void setMainImageAdjustViewBounds(boolean);
    method public void setMainImageDimensions(int, int);
    method public void setMainImageScaleType(android.widget.ImageView.ScaleType!);
    method public void setTitleText(CharSequence!);
    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
  }

  public interface ImeKeyMonitor {
    method public void setImeKeyListener(androidx.leanback.widget.ImeKeyMonitor.ImeKeyListener!);
  }

  public static interface ImeKeyMonitor.ImeKeyListener {
    method public boolean onKeyPreIme(android.widget.EditText!, int, android.view.KeyEvent!);
  }

  public final class ItemAlignmentFacet {
    ctor public ItemAlignmentFacet();
    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]! getAlignmentDefs();
    method public boolean isMultiAlignment();
    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]!);
    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
  }

  public static class ItemAlignmentFacet.ItemAlignmentDef {
    ctor public ItemAlignmentFacet.ItemAlignmentDef();
    method public final int getItemAlignmentFocusViewId();
    method public final int getItemAlignmentOffset();
    method public final float getItemAlignmentOffsetPercent();
    method public final int getItemAlignmentViewId();
    method public boolean isAlignedToTextViewBaseLine();
    method public final boolean isItemAlignmentOffsetWithPadding();
    method public final void setAlignedToTextViewBaseline(boolean);
    method public final void setItemAlignmentFocusViewId(int);
    method public final void setItemAlignmentOffset(int);
    method public final void setItemAlignmentOffsetPercent(float);
    method public final void setItemAlignmentOffsetWithPadding(boolean);
    method public final void setItemAlignmentViewId(int);
  }

  public class ItemBridgeAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter implements androidx.leanback.widget.FacetProviderAdapter {
    ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!, androidx.leanback.widget.PresenterSelector!);
    ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!);
    ctor public ItemBridgeAdapter();
    method public void clear();
    method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
    method public int getItemCount();
    method public java.util.ArrayList<androidx.leanback.widget.Presenter!>! getPresenterMapper();
    method public androidx.leanback.widget.ItemBridgeAdapter.Wrapper! getWrapper();
    method protected void onAddPresenter(androidx.leanback.widget.Presenter!, int);
    method protected void onAttachedToWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method protected void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public final void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int);
    method public final void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, java.util.List!);
    method protected void onCreate(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public final androidx.recyclerview.widget.RecyclerView.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
    method protected void onDetachedFromWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public final boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method protected void onUnbind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public final void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public final void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
    method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public void setAdapterListener(androidx.leanback.widget.ItemBridgeAdapter.AdapterListener!);
    method public void setPresenter(androidx.leanback.widget.PresenterSelector!);
    method public void setPresenterMapper(java.util.ArrayList<androidx.leanback.widget.Presenter!>!);
    method public void setWrapper(androidx.leanback.widget.ItemBridgeAdapter.Wrapper!);
  }

  public static class ItemBridgeAdapter.AdapterListener {
    ctor public ItemBridgeAdapter.AdapterListener();
    method public void onAddPresenter(androidx.leanback.widget.Presenter!, int);
    method public void onAttachedToWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!, java.util.List!);
    method public void onCreate(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public void onDetachedFromWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
    method public void onUnbind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
  }

  public static class ItemBridgeAdapter.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.leanback.widget.FacetProvider {
    method public final Object! getExtraObject();
    method public Object! getFacet(Class<?>!);
    method public final Object! getItem();
    method public final androidx.leanback.widget.Presenter! getPresenter();
    method public final androidx.leanback.widget.Presenter.ViewHolder! getViewHolder();
    method public void setExtraObject(Object!);
  }

  public abstract static class ItemBridgeAdapter.Wrapper {
    ctor public ItemBridgeAdapter.Wrapper();
    method public abstract android.view.View! createWrapper(android.view.View!);
    method public abstract void wrap(android.view.View!, android.view.View!);
  }

  public class ItemBridgeAdapterShadowOverlayWrapper extends androidx.leanback.widget.ItemBridgeAdapter.Wrapper {
    ctor public ItemBridgeAdapterShadowOverlayWrapper(androidx.leanback.widget.ShadowOverlayHelper!);
    method public android.view.View! createWrapper(android.view.View!);
    method public void wrap(android.view.View!, android.view.View!);
  }

  public class ListRow extends androidx.leanback.widget.Row {
    ctor public ListRow(androidx.leanback.widget.HeaderItem!, androidx.leanback.widget.ObjectAdapter!);
    ctor public ListRow(long, androidx.leanback.widget.HeaderItem!, androidx.leanback.widget.ObjectAdapter!);
    ctor public ListRow(androidx.leanback.widget.ObjectAdapter!);
    method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
    method public CharSequence! getContentDescription();
    method public void setContentDescription(CharSequence!);
  }

  public final class ListRowHoverCardView extends android.widget.LinearLayout {
    ctor public ListRowHoverCardView(android.content.Context!);
    ctor public ListRowHoverCardView(android.content.Context!, android.util.AttributeSet!);
    ctor public ListRowHoverCardView(android.content.Context!, android.util.AttributeSet!, int);
    method public CharSequence! getDescription();
    method public CharSequence! getTitle();
    method public void setDescription(CharSequence!);
    method public void setTitle(CharSequence!);
  }

  public class ListRowPresenter extends androidx.leanback.widget.RowPresenter {
    ctor public ListRowPresenter();
    ctor public ListRowPresenter(int);
    ctor public ListRowPresenter(int, boolean);
    method protected void applySelectLevelToChild(androidx.leanback.widget.ListRowPresenter.ViewHolder!, android.view.View!);
    method public final boolean areChildRoundedCornersEnabled();
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method protected androidx.leanback.widget.ShadowOverlayHelper.Options! createShadowOverlayOptions();
    method public final void enableChildRoundedCorners(boolean);
    method public int getExpandedRowHeight();
    method public final int getFocusZoomFactor();
    method public final androidx.leanback.widget.PresenterSelector! getHoverCardPresenterSelector();
    method public int getRecycledPoolSize(androidx.leanback.widget.Presenter!);
    method public int getRowHeight();
    method public final boolean getShadowEnabled();
    method @Deprecated public final int getZoomFactor();
    method public final boolean isFocusDimmerUsed();
    method public final boolean isKeepChildForeground();
    method public boolean isUsingDefaultListSelectEffect();
    method public final boolean isUsingDefaultSelectEffect();
    method public boolean isUsingDefaultShadow();
    method public boolean isUsingOutlineClipping(android.content.Context!);
    method public boolean isUsingZOrder(android.content.Context!);
    method public void setExpandedRowHeight(int);
    method public final void setHoverCardPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method public final void setKeepChildForeground(boolean);
    method public void setNumRows(int);
    method public void setRecycledPoolSize(androidx.leanback.widget.Presenter!, int);
    method public void setRowHeight(int);
    method public final void setShadowEnabled(boolean);
  }

  public static class ListRowPresenter.SelectItemViewHolderTask extends androidx.leanback.widget.Presenter.ViewHolderTask {
    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
    method public int getItemPosition();
    method public androidx.leanback.widget.Presenter.ViewHolderTask! getItemTask();
    method public boolean isSmoothScroll();
    method public void setItemPosition(int);
    method public void setItemTask(androidx.leanback.widget.Presenter.ViewHolderTask!);
    method public void setSmoothScroll(boolean);
  }

  public static class ListRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor public ListRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.HorizontalGridView!, androidx.leanback.widget.ListRowPresenter!);
    method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
    method public final androidx.leanback.widget.HorizontalGridView! getGridView();
    method public androidx.leanback.widget.Presenter.ViewHolder! getItemViewHolder(int);
    method public final androidx.leanback.widget.ListRowPresenter! getListRowPresenter();
    method public int getSelectedPosition();
  }

  public final class ListRowView extends android.widget.LinearLayout {
    ctor public ListRowView(android.content.Context!);
    ctor public ListRowView(android.content.Context!, android.util.AttributeSet!);
    ctor public ListRowView(android.content.Context!, android.util.AttributeSet!, int);
    method public androidx.leanback.widget.HorizontalGridView! getGridView();
  }

  public interface MultiActionsProvider {
    method public androidx.leanback.widget.MultiActionsProvider.MultiAction![]! getActions();
  }

  public static class MultiActionsProvider.MultiAction {
    ctor public MultiActionsProvider.MultiAction(long);
    method public android.graphics.drawable.Drawable! getCurrentDrawable();
    method public android.graphics.drawable.Drawable![]! getDrawables();
    method public long getId();
    method public int getIndex();
    method public void incrementIndex();
    method public void setDrawables(android.graphics.drawable.Drawable![]!);
    method public void setIndex(int);
  }

  public abstract class ObjectAdapter {
    ctor public ObjectAdapter(androidx.leanback.widget.PresenterSelector!);
    ctor public ObjectAdapter(androidx.leanback.widget.Presenter!);
    ctor public ObjectAdapter();
    method public abstract Object! get(int);
    method public long getId(int);
    method public final androidx.leanback.widget.Presenter! getPresenter(Object!);
    method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
    method public final boolean hasStableIds();
    method public boolean isImmediateNotifySupported();
    method protected final void notifyChanged();
    method protected final void notifyItemMoved(int, int);
    method public final void notifyItemRangeChanged(int, int);
    method public final void notifyItemRangeChanged(int, int, Object!);
    method protected final void notifyItemRangeInserted(int, int);
    method protected final void notifyItemRangeRemoved(int, int);
    method protected void onHasStableIdsChanged();
    method protected void onPresenterSelectorChanged();
    method public final void registerObserver(androidx.leanback.widget.ObjectAdapter.DataObserver!);
    method public final void setHasStableIds(boolean);
    method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
    method public abstract int size();
    method public final void unregisterAllObservers();
    method public final void unregisterObserver(androidx.leanback.widget.ObjectAdapter.DataObserver!);
    field public static final int NO_ID = -1; // 0xffffffff
  }

  public abstract static class ObjectAdapter.DataObserver {
    ctor public ObjectAdapter.DataObserver();
    method public void onChanged();
    method public void onItemMoved(int, int);
    method public void onItemRangeChanged(int, int);
    method public void onItemRangeChanged(int, int, Object!);
    method public void onItemRangeInserted(int, int);
    method public void onItemRangeRemoved(int, int);
  }

  public interface OnActionClickedListener {
    method public void onActionClicked(androidx.leanback.widget.Action!);
  }

  public interface OnChildLaidOutListener {
    method public void onChildLaidOut(android.view.ViewGroup!, android.view.View!, int, long);
  }

  @Deprecated public interface OnChildSelectedListener {
    method @Deprecated public void onChildSelected(android.view.ViewGroup!, android.view.View!, int, long);
  }

  public abstract class OnChildViewHolderSelectedListener {
    ctor public OnChildViewHolderSelectedListener();
    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
  }

  public interface OnItemViewClickedListener extends androidx.leanback.widget.BaseOnItemViewClickedListener<androidx.leanback.widget.Row> {
  }

  public interface OnItemViewSelectedListener extends androidx.leanback.widget.BaseOnItemViewSelectedListener<androidx.leanback.widget.Row> {
  }

  public class PageRow extends androidx.leanback.widget.Row {
    ctor public PageRow(androidx.leanback.widget.HeaderItem!);
    method public final boolean isRenderedAsRowView();
  }

  public abstract class Parallax<PropertyT extends android.util.Property> {
    ctor public Parallax();
    method public androidx.leanback.widget.ParallaxEffect! addEffect(androidx.leanback.widget.Parallax.PropertyMarkerValue!...);
    method public final PropertyT! addProperty(String!);
    method public abstract PropertyT! createProperty(String!, int);
    method public java.util.List<androidx.leanback.widget.ParallaxEffect!>! getEffects();
    method public abstract float getMaxValue();
    method public final java.util.List<PropertyT!>! getProperties();
    method public void removeAllEffects();
    method public void removeEffect(androidx.leanback.widget.ParallaxEffect!);
    method @CallSuper public void updateValues();
  }

  public static class Parallax.FloatProperty extends android.util.Property<androidx.leanback.widget.Parallax,java.lang.Float> {
    ctor public Parallax.FloatProperty(String!, int);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! at(float, float);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atAbsolute(float);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atFraction(float);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMax();
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMin();
    method public final Float! get(androidx.leanback.widget.Parallax!);
    method public final int getIndex();
    method public final float getValue(androidx.leanback.widget.Parallax!);
    method public final void set(androidx.leanback.widget.Parallax!, Float!);
    method public final void setValue(androidx.leanback.widget.Parallax!, float);
    field public static final float UNKNOWN_AFTER = 3.4028235E38f;
    field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
  }

  public static class Parallax.IntProperty extends android.util.Property<androidx.leanback.widget.Parallax,java.lang.Integer> {
    ctor public Parallax.IntProperty(String!, int);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! at(int, float);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atAbsolute(int);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atFraction(float);
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMax();
    method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMin();
    method public final Integer! get(androidx.leanback.widget.Parallax!);
    method public final int getIndex();
    method public final int getValue(androidx.leanback.widget.Parallax!);
    method public final void set(androidx.leanback.widget.Parallax!, Integer!);
    method public final void setValue(androidx.leanback.widget.Parallax!, int);
    field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
    field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
  }

  public static class Parallax.PropertyMarkerValue<PropertyT> {
    ctor public Parallax.PropertyMarkerValue(PropertyT!);
    method public PropertyT! getProperty();
  }

  public abstract class ParallaxEffect {
    method public final void addTarget(androidx.leanback.widget.ParallaxTarget!);
    method public final java.util.List<androidx.leanback.widget.Parallax.PropertyMarkerValue!>! getPropertyRanges();
    method public final java.util.List<androidx.leanback.widget.ParallaxTarget!>! getTargets();
    method public final void performMapping(androidx.leanback.widget.Parallax!);
    method public final void removeTarget(androidx.leanback.widget.ParallaxTarget!);
    method public final void setPropertyRanges(androidx.leanback.widget.Parallax.PropertyMarkerValue!...);
    method public final androidx.leanback.widget.ParallaxEffect! target(androidx.leanback.widget.ParallaxTarget!);
    method public final androidx.leanback.widget.ParallaxEffect! target(Object!, android.animation.PropertyValuesHolder!);
    method public final <T, V extends java.lang.Number> androidx.leanback.widget.ParallaxEffect! target(T!, android.util.Property<T!,V!>!);
  }

  public abstract class ParallaxTarget {
    ctor public ParallaxTarget();
    method public void directUpdate(Number!);
    method public boolean isDirectMapping();
    method public void update(float);
  }

  public static final class ParallaxTarget.DirectPropertyTarget<T extends java.lang.Object, V extends java.lang.Number> extends androidx.leanback.widget.ParallaxTarget {
    ctor public ParallaxTarget.DirectPropertyTarget(Object!, android.util.Property<T!,V!>!);
  }

  public static final class ParallaxTarget.PropertyValuesHolderTarget extends androidx.leanback.widget.ParallaxTarget {
    ctor public ParallaxTarget.PropertyValuesHolderTarget(Object!, android.animation.PropertyValuesHolder!);
  }

  public class PlaybackControlsRow extends androidx.leanback.widget.Row {
    ctor public PlaybackControlsRow(Object!);
    ctor public PlaybackControlsRow();
    method public androidx.leanback.widget.Action! getActionForKeyCode(int);
    method public androidx.leanback.widget.Action! getActionForKeyCode(androidx.leanback.widget.ObjectAdapter!, int);
    method public long getBufferedPosition();
    method @Deprecated public int getBufferedProgress();
    method @Deprecated public long getBufferedProgressLong();
    method public long getCurrentPosition();
    method @Deprecated public int getCurrentTime();
    method @Deprecated public long getCurrentTimeLong();
    method public long getDuration();
    method public final android.graphics.drawable.Drawable! getImageDrawable();
    method public final Object! getItem();
    method public final androidx.leanback.widget.ObjectAdapter! getPrimaryActionsAdapter();
    method public final androidx.leanback.widget.ObjectAdapter! getSecondaryActionsAdapter();
    method @Deprecated public int getTotalTime();
    method @Deprecated public long getTotalTimeLong();
    method public void setBufferedPosition(long);
    method @Deprecated public void setBufferedProgress(int);
    method @Deprecated public void setBufferedProgressLong(long);
    method public void setCurrentPosition(long);
    method @Deprecated public void setCurrentTime(int);
    method @Deprecated public void setCurrentTimeLong(long);
    method public void setDuration(long);
    method public final void setImageBitmap(android.content.Context!, android.graphics.Bitmap!);
    method public final void setImageDrawable(android.graphics.drawable.Drawable!);
    method public void setOnPlaybackProgressChangedListener(androidx.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback!);
    method public final void setPrimaryActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
    method public final void setSecondaryActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
    method @Deprecated public void setTotalTime(int);
    method @Deprecated public void setTotalTimeLong(long);
  }

  public static class PlaybackControlsRow.ClosedCaptioningAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context!);
    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context!, int);
    field public static final int INDEX_OFF = 0; // 0x0
    field public static final int INDEX_ON = 1; // 0x1
    field @Deprecated public static final int OFF = 0; // 0x0
    field @Deprecated public static final int ON = 1; // 0x1
  }

  public static class PlaybackControlsRow.FastForwardAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context!);
    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context!, int);
  }

  public static class PlaybackControlsRow.HighQualityAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context!);
    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context!, int);
    field public static final int INDEX_OFF = 0; // 0x0
    field public static final int INDEX_ON = 1; // 0x1
    field @Deprecated public static final int OFF = 0; // 0x0
    field @Deprecated public static final int ON = 1; // 0x1
  }

  public static class PlaybackControlsRow.MoreActions extends androidx.leanback.widget.Action {
    ctor public PlaybackControlsRow.MoreActions(android.content.Context!);
  }

  public abstract static class PlaybackControlsRow.MultiAction extends androidx.leanback.widget.Action {
    ctor public PlaybackControlsRow.MultiAction(int);
    method public int getActionCount();
    method public android.graphics.drawable.Drawable! getDrawable(int);
    method public int getIndex();
    method public String! getLabel(int);
    method public String! getSecondaryLabel(int);
    method public void nextIndex();
    method public void setDrawables(android.graphics.drawable.Drawable![]!);
    method public void setIndex(int);
    method public void setLabels(String![]!);
    method public void setSecondaryLabels(String![]!);
  }

  public static class PlaybackControlsRow.OnPlaybackProgressCallback {
    ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
    method public void onBufferedPositionChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
    method public void onCurrentPositionChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
    method public void onDurationChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
  }

  public static class PlaybackControlsRow.PictureInPictureAction extends androidx.leanback.widget.Action {
    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context!);
  }

  public static class PlaybackControlsRow.PlayPauseAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context!);
    field public static final int INDEX_PAUSE = 1; // 0x1
    field public static final int INDEX_PLAY = 0; // 0x0
    field @Deprecated public static final int PAUSE = 1; // 0x1
    field @Deprecated public static final int PLAY = 0; // 0x0
  }

  public static class PlaybackControlsRow.RepeatAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.RepeatAction(android.content.Context!);
    ctor public PlaybackControlsRow.RepeatAction(android.content.Context!, int);
    ctor public PlaybackControlsRow.RepeatAction(android.content.Context!, int, int);
    field @Deprecated public static final int ALL = 1; // 0x1
    field public static final int INDEX_ALL = 1; // 0x1
    field public static final int INDEX_NONE = 0; // 0x0
    field public static final int INDEX_ONE = 2; // 0x2
    field @Deprecated public static final int NONE = 0; // 0x0
    field @Deprecated public static final int ONE = 2; // 0x2
  }

  public static class PlaybackControlsRow.RewindAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.RewindAction(android.content.Context!);
    ctor public PlaybackControlsRow.RewindAction(android.content.Context!, int);
  }

  public static class PlaybackControlsRow.ShuffleAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context!);
    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context!, int);
    field public static final int INDEX_OFF = 0; // 0x0
    field public static final int INDEX_ON = 1; // 0x1
    field @Deprecated public static final int OFF = 0; // 0x0
    field @Deprecated public static final int ON = 1; // 0x1
  }

  public static class PlaybackControlsRow.SkipNextAction extends androidx.leanback.widget.Action {
    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context!);
  }

  public static class PlaybackControlsRow.SkipPreviousAction extends androidx.leanback.widget.Action {
    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context!);
  }

  public abstract static class PlaybackControlsRow.ThumbsAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context!, int, int);
    field public static final int INDEX_OUTLINE = 1; // 0x1
    field public static final int INDEX_SOLID = 0; // 0x0
    field @Deprecated public static final int OUTLINE = 1; // 0x1
    field @Deprecated public static final int SOLID = 0; // 0x0
  }

  public static class PlaybackControlsRow.ThumbsDownAction extends androidx.leanback.widget.PlaybackControlsRow.ThumbsAction {
    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context!);
  }

  public static class PlaybackControlsRow.ThumbsUpAction extends androidx.leanback.widget.PlaybackControlsRow.ThumbsAction {
    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context!);
  }

  public class PlaybackControlsRowPresenter extends androidx.leanback.widget.PlaybackRowPresenter {
    ctor public PlaybackControlsRowPresenter(androidx.leanback.widget.Presenter!);
    ctor public PlaybackControlsRowPresenter();
    method public boolean areSecondaryActionsHidden();
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method @ColorInt public int getBackgroundColor();
    method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
    method @ColorInt public int getProgressColor();
    method public void setBackgroundColor(@ColorInt int);
    method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
    method public void setProgressColor(@ColorInt int);
    method public void setSecondaryActionsHidden(boolean);
    method public void showBottomSpace(androidx.leanback.widget.PlaybackControlsRowPresenter.ViewHolder!, boolean);
    method public void showPrimaryActions(androidx.leanback.widget.PlaybackControlsRowPresenter.ViewHolder!);
  }

  public class PlaybackControlsRowPresenter.ViewHolder extends androidx.leanback.widget.PlaybackRowPresenter.ViewHolder {
    field public final androidx.leanback.widget.Presenter.ViewHolder! mDescriptionViewHolder;
  }

  public abstract class PlaybackRowPresenter extends androidx.leanback.widget.RowPresenter {
    ctor public PlaybackRowPresenter();
    method public void onReappear(androidx.leanback.widget.RowPresenter.ViewHolder!);
  }

  public static class PlaybackRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
    ctor public PlaybackRowPresenter.ViewHolder(android.view.View!);
  }

  public class PlaybackSeekDataProvider {
    ctor public PlaybackSeekDataProvider();
    method public long[]! getSeekPositions();
    method public void getThumbnail(int, androidx.leanback.widget.PlaybackSeekDataProvider.ResultCallback!);
    method public void reset();
  }

  public static class PlaybackSeekDataProvider.ResultCallback {
    ctor public PlaybackSeekDataProvider.ResultCallback();
    method public void onThumbnailLoaded(android.graphics.Bitmap!, int);
  }

  public interface PlaybackSeekUi {
    method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
  }

  public static class PlaybackSeekUi.Client {
    ctor public PlaybackSeekUi.Client();
    method public androidx.leanback.widget.PlaybackSeekDataProvider! getPlaybackSeekDataProvider();
    method public boolean isSeekEnabled();
    method public void onSeekFinished(boolean);
    method public void onSeekPositionChanged(long);
    method public void onSeekStarted();
  }

  public class PlaybackTransportRowPresenter extends androidx.leanback.widget.PlaybackRowPresenter {
    ctor public PlaybackTransportRowPresenter();
    method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method public float getDefaultSeekIncrement();
    method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
    method @ColorInt public int getProgressColor();
    method @ColorInt public int getSecondaryProgressColor();
    method protected void onProgressBarClicked(androidx.leanback.widget.PlaybackTransportRowPresenter.ViewHolder!);
    method public void setDefaultSeekIncrement(float);
    method public void setDescriptionPresenter(androidx.leanback.widget.Presenter!);
    method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
    method public void setProgressColor(@ColorInt int);
    method public void setSecondaryProgressColor(@ColorInt int);
  }

  public class PlaybackTransportRowPresenter.ViewHolder extends androidx.leanback.widget.PlaybackRowPresenter.ViewHolder implements androidx.leanback.widget.PlaybackSeekUi {
    ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!);
    method public final android.widget.TextView! getCurrentPositionView();
    method public final androidx.leanback.widget.Presenter.ViewHolder! getDescriptionViewHolder();
    method public final android.widget.TextView! getDurationView();
    method protected void onSetCurrentPositionLabel(long);
    method protected void onSetDurationLabel(long);
    method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
  }

  public abstract class Presenter implements androidx.leanback.widget.FacetProvider {
    ctor public Presenter();
    method protected static void cancelAnimationsRecursive(android.view.View!);
    method public final Object! getFacet(Class<?>!);
    method public abstract void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!, java.util.List<java.lang.Object!>!);
    method public abstract androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public abstract void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void onViewAttachedToWindow(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void onViewDetachedFromWindow(androidx.leanback.widget.Presenter.ViewHolder!);
    method public final void setFacet(Class<?>!, Object!);
    method public void setOnClickListener(androidx.leanback.widget.Presenter.ViewHolder!, android.view.View.OnClickListener!);
  }

  public static class Presenter.ViewHolder implements androidx.leanback.widget.FacetProvider {
    ctor public Presenter.ViewHolder(android.view.View!);
    method public final Object! getFacet(Class<?>!);
    method public final void setFacet(Class<?>!, Object!);
    field public final android.view.View! view;
  }

  public abstract static class Presenter.ViewHolderTask {
    ctor public Presenter.ViewHolderTask();
    method public void run(androidx.leanback.widget.Presenter.ViewHolder!);
  }

  public abstract class PresenterSelector {
    ctor public PresenterSelector();
    method public abstract androidx.leanback.widget.Presenter! getPresenter(Object!);
    method public androidx.leanback.widget.Presenter![]! getPresenters();
  }

  public abstract class PresenterSwitcher {
    ctor public PresenterSwitcher();
    method public void clear();
    method public final android.view.ViewGroup! getParentViewGroup();
    method public void init(android.view.ViewGroup!, androidx.leanback.widget.PresenterSelector!);
    method protected abstract void insertView(android.view.View!);
    method protected void onViewSelected(android.view.View!);
    method public void select(Object!);
    method protected void showView(android.view.View!, boolean);
    method public void unselect();
  }

  public class RecyclerViewParallax extends androidx.leanback.widget.Parallax<androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty> {
    ctor public RecyclerViewParallax();
    method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! createProperty(String!, int);
    method public float getMaxValue();
    method public androidx.recyclerview.widget.RecyclerView! getRecyclerView();
    method public void setRecyclerView(androidx.recyclerview.widget.RecyclerView!);
  }

  public static final class RecyclerViewParallax.ChildPositionProperty extends androidx.leanback.widget.Parallax.IntProperty {
    method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! adapterPosition(int);
    method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! fraction(float);
    method public int getAdapterPosition();
    method public float getFraction();
    method public int getOffset();
    method public int getViewId();
    method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! offset(int);
    method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! viewId(int);
  }

  public class Row {
    ctor public Row(long, androidx.leanback.widget.HeaderItem!);
    ctor public Row(androidx.leanback.widget.HeaderItem!);
    ctor public Row();
    method public final androidx.leanback.widget.HeaderItem! getHeaderItem();
    method public final long getId();
    method public boolean isRenderedAsRowView();
    method public final void setHeaderItem(androidx.leanback.widget.HeaderItem!);
    method public final void setId(long);
  }

  public class RowHeaderPresenter extends androidx.leanback.widget.Presenter {
    ctor public RowHeaderPresenter();
    method protected static float getFontDescent(android.widget.TextView!, android.graphics.Paint!);
    method public int getSpaceUnderBaseline(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!);
    method public boolean isNullItemVisibilityGone();
    method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method protected void onSelectLevelChanged(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!);
    method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void setNullItemVisibilityGone(boolean);
    method public final void setSelectLevel(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, float);
  }

  public static class RowHeaderPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
    ctor public RowHeaderPresenter.ViewHolder(android.view.View!);
    method public final float getSelectLevel();
  }

  public final class RowHeaderView extends android.widget.TextView {
    ctor public RowHeaderView(android.content.Context!);
    ctor public RowHeaderView(android.content.Context!, android.util.AttributeSet!);
    ctor public RowHeaderView(android.content.Context!, android.util.AttributeSet!, int);
  }

  public abstract class RowPresenter extends androidx.leanback.widget.Presenter {
    ctor public RowPresenter();
    method protected abstract androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
    method protected void dispatchItemSelectedListener(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
    method public void freeze(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
    method public final androidx.leanback.widget.RowHeaderPresenter! getHeaderPresenter();
    method public final androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public final boolean getSelectEffectEnabled();
    method public final float getSelectLevel(androidx.leanback.widget.Presenter.ViewHolder!);
    method public final int getSyncActivatePolicy();
    method protected void initializeRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!);
    method protected boolean isClippingChildren();
    method public boolean isUsingDefaultSelectEffect();
    method protected void onBindRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!, Object!);
    method public final void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public final androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method protected void onRowViewAttachedToWindow(androidx.leanback.widget.RowPresenter.ViewHolder!);
    method protected void onRowViewDetachedFromWindow(androidx.leanback.widget.RowPresenter.ViewHolder!);
    method protected void onRowViewExpanded(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
    method protected void onRowViewSelected(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
    method protected void onSelectLevelChanged(androidx.leanback.widget.RowPresenter.ViewHolder!);
    method protected void onUnbindRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!);
    method public final void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public final void onViewAttachedToWindow(androidx.leanback.widget.Presenter.ViewHolder!);
    method public final void onViewDetachedFromWindow(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void setEntranceTransitionState(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
    method public final void setHeaderPresenter(androidx.leanback.widget.RowHeaderPresenter!);
    method public final void setRowViewExpanded(androidx.leanback.widget.Presenter.ViewHolder!, boolean);
    method public final void setRowViewSelected(androidx.leanback.widget.Presenter.ViewHolder!, boolean);
    method public final void setSelectEffectEnabled(boolean);
    method public final void setSelectLevel(androidx.leanback.widget.Presenter.ViewHolder!, float);
    method public final void setSyncActivatePolicy(int);
    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
  }

  public static class RowPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
    ctor public RowPresenter.ViewHolder(android.view.View!);
    method public final androidx.leanback.widget.RowHeaderPresenter.ViewHolder! getHeaderViewHolder();
    method public final androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
    method public final androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
    method public android.view.View.OnKeyListener! getOnKeyListener();
    method public final androidx.leanback.widget.Row! getRow();
    method public final Object! getRowObject();
    method public final float getSelectLevel();
    method public Object! getSelectedItem();
    method public androidx.leanback.widget.Presenter.ViewHolder! getSelectedItemViewHolder();
    method public final boolean isExpanded();
    method public final boolean isSelected();
    method public final void setActivated(boolean);
    method public final void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
    method public final void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
    method public void setOnKeyListener(android.view.View.OnKeyListener!);
    method public final void syncActivatedStatus(android.view.View!);
    field protected final androidx.leanback.graphics.ColorOverlayDimmer! mColorDimmer;
  }

  public class SearchBar extends android.widget.RelativeLayout {
    ctor public SearchBar(android.content.Context!);
    ctor public SearchBar(android.content.Context!, android.util.AttributeSet!);
    ctor public SearchBar(android.content.Context!, android.util.AttributeSet!, int);
    method public void displayCompletions(java.util.List<java.lang.String!>!);
    method public void displayCompletions(android.view.inputmethod.CompletionInfo![]!);
    method public android.graphics.drawable.Drawable! getBadgeDrawable();
    method public CharSequence! getHint();
    method public String! getTitle();
    method public boolean isRecognizing();
    method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method public void setPermissionListener(androidx.leanback.widget.SearchBar.SearchBarPermissionListener!);
    method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setSearchBarListener(androidx.leanback.widget.SearchBar.SearchBarListener!);
    method public void setSearchQuery(String!);
    method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
    method public void setSpeechRecognizer(android.speech.SpeechRecognizer!);
    method public void setTitle(String!);
    method public void startRecognition();
    method public void stopRecognition();
  }

  public static interface SearchBar.SearchBarListener {
    method public void onKeyboardDismiss(String!);
    method public void onSearchQueryChange(String!);
    method public void onSearchQuerySubmit(String!);
  }

  public static interface SearchBar.SearchBarPermissionListener {
    method public void requestAudioPermission();
  }

  public class SearchEditText extends android.widget.EditText {
    ctor public SearchEditText(android.content.Context!);
    ctor public SearchEditText(android.content.Context!, android.util.AttributeSet!);
    ctor public SearchEditText(android.content.Context!, android.util.AttributeSet!, int);
    method public static boolean isLayoutRtl(android.view.View!);
    method public void reset();
    method public void setFinalRecognizedText(CharSequence!);
    method public void setOnKeyboardDismissListener(androidx.leanback.widget.SearchEditText.OnKeyboardDismissListener!);
    method public void updateRecognizedText(String!, String!);
    method public void updateRecognizedText(String!, java.util.List<java.lang.Float!>!);
  }

  public static interface SearchEditText.OnKeyboardDismissListener {
    method public void onKeyboardDismiss();
  }

  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
    ctor public SearchOrbView(android.content.Context!);
    ctor public SearchOrbView(android.content.Context!, android.util.AttributeSet!);
    ctor public SearchOrbView(android.content.Context!, android.util.AttributeSet!, int);
    method public void enableOrbColorAnimation(boolean);
    method @ColorInt public int getOrbColor();
    method public androidx.leanback.widget.SearchOrbView.Colors! getOrbColors();
    method public android.graphics.drawable.Drawable! getOrbIcon();
    method public void onClick(android.view.View!);
    method public void setOnOrbClickedListener(android.view.View.OnClickListener!);
    method public void setOrbColor(int);
    method @Deprecated public void setOrbColor(@ColorInt int, @ColorInt int);
    method public void setOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setOrbIcon(android.graphics.drawable.Drawable!);
  }

  public static class SearchOrbView.Colors {
    ctor public SearchOrbView.Colors(@ColorInt int);
    ctor public SearchOrbView.Colors(@ColorInt int, @ColorInt int);
    ctor public SearchOrbView.Colors(@ColorInt int, @ColorInt int, @ColorInt int);
    method public static int getBrightColor(int);
    field @ColorInt public int brightColor;
    field @ColorInt public int color;
    field @ColorInt public int iconColor;
  }

  public class SectionRow extends androidx.leanback.widget.Row {
    ctor public SectionRow(androidx.leanback.widget.HeaderItem!);
    ctor public SectionRow(long, String!);
    ctor public SectionRow(String!);
    method public final boolean isRenderedAsRowView();
  }

  public class ShadowOverlayContainer extends android.widget.FrameLayout {
    ctor public ShadowOverlayContainer(android.content.Context!);
    ctor public ShadowOverlayContainer(android.content.Context!, android.util.AttributeSet!);
    ctor public ShadowOverlayContainer(android.content.Context!, android.util.AttributeSet!, int);
    method public int getShadowType();
    method public android.view.View! getWrappedView();
    method @Deprecated public void initialize(boolean, boolean);
    method @Deprecated public void initialize(boolean, boolean, boolean);
    method public static void prepareParentForShadow(android.view.ViewGroup!);
    method public void setOverlayColor(@ColorInt int);
    method public void setShadowFocusLevel(float);
    method public static boolean supportsDynamicShadow();
    method public static boolean supportsShadow();
    method public void useDynamicShadow();
    method public void useDynamicShadow(float, float);
    method public void useStaticShadow();
    method public void wrap(android.view.View!);
    field public static final int SHADOW_DYNAMIC = 3; // 0x3
    field public static final int SHADOW_NONE = 1; // 0x1
    field public static final int SHADOW_STATIC = 2; // 0x2
  }

  public final class ShadowOverlayHelper {
    method public androidx.leanback.widget.ShadowOverlayContainer! createShadowOverlayContainer(android.content.Context!);
    method public int getShadowType();
    method public boolean needsOverlay();
    method public boolean needsRoundedCorner();
    method public boolean needsWrapper();
    method public void onViewCreated(android.view.View!);
    method public void prepareParentForShadow(android.view.ViewGroup!);
    method public static void setNoneWrapperOverlayColor(android.view.View!, int);
    method public static void setNoneWrapperShadowFocusLevel(android.view.View!, float);
    method public void setOverlayColor(android.view.View!, int);
    method public void setShadowFocusLevel(android.view.View!, float);
    method public static boolean supportsDynamicShadow();
    method public static boolean supportsForeground();
    method public static boolean supportsRoundedCorner();
    method public static boolean supportsShadow();
    field public static final int SHADOW_DYNAMIC = 3; // 0x3
    field public static final int SHADOW_NONE = 1; // 0x1
    field public static final int SHADOW_STATIC = 2; // 0x2
  }

  public static final class ShadowOverlayHelper.Builder {
    ctor public ShadowOverlayHelper.Builder();
    method public androidx.leanback.widget.ShadowOverlayHelper! build(android.content.Context!);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! keepForegroundDrawable(boolean);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsOverlay(boolean);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsRoundedCorner(boolean);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsShadow(boolean);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! options(androidx.leanback.widget.ShadowOverlayHelper.Options!);
    method public androidx.leanback.widget.ShadowOverlayHelper.Builder! preferZOrder(boolean);
  }

  public static final class ShadowOverlayHelper.Options {
    ctor public ShadowOverlayHelper.Options();
    method public androidx.leanback.widget.ShadowOverlayHelper.Options! dynamicShadowZ(float, float);
    method public float getDynamicShadowFocusedZ();
    method public float getDynamicShadowUnfocusedZ();
    method public int getRoundedCornerRadius();
    method public androidx.leanback.widget.ShadowOverlayHelper.Options! roundedCornerRadius(int);
    field public static final androidx.leanback.widget.ShadowOverlayHelper.Options! DEFAULT;
  }

  public final class SinglePresenterSelector extends androidx.leanback.widget.PresenterSelector {
    ctor public SinglePresenterSelector(androidx.leanback.widget.Presenter!);
    method public androidx.leanback.widget.Presenter! getPresenter(Object!);
  }

  public class SparseArrayObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
    ctor public SparseArrayObjectAdapter(androidx.leanback.widget.PresenterSelector!);
    ctor public SparseArrayObjectAdapter(androidx.leanback.widget.Presenter!);
    ctor public SparseArrayObjectAdapter();
    method public void clear(int);
    method public void clear();
    method public Object! get(int);
    method public int indexOf(Object!);
    method public int indexOf(int);
    method public Object! lookup(int);
    method public void notifyArrayItemRangeChanged(int, int);
    method public void set(int, Object!);
    method public int size();
  }

  public class SpeechOrbView extends androidx.leanback.widget.SearchOrbView {
    ctor public SpeechOrbView(android.content.Context!);
    ctor public SpeechOrbView(android.content.Context!, android.util.AttributeSet!);
    ctor public SpeechOrbView(android.content.Context!, android.util.AttributeSet!, int);
    method public void setListeningOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setNotListeningOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setSoundLevel(int);
    method public void showListening();
    method public void showNotListening();
  }

  @Deprecated public interface SpeechRecognitionCallback {
    method @Deprecated public void recognizeSpeech();
  }

  public class TitleHelper {
    ctor public TitleHelper(android.view.ViewGroup!, android.view.View!);
    method public androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener! getOnFocusSearchListener();
    method public android.view.ViewGroup! getSceneRoot();
    method public android.view.View! getTitleView();
    method public void showTitle(boolean);
  }

  public class TitleView extends android.widget.FrameLayout implements androidx.leanback.widget.TitleViewAdapter.Provider {
    ctor public TitleView(android.content.Context!);
    ctor public TitleView(android.content.Context!, android.util.AttributeSet!);
    ctor public TitleView(android.content.Context!, android.util.AttributeSet!, int);
    method public void enableAnimation(boolean);
    method public android.graphics.drawable.Drawable! getBadgeDrawable();
    method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
    method public android.view.View! getSearchAffordanceView();
    method public CharSequence! getTitle();
    method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
    method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
    method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setTitle(CharSequence!);
    method public void updateComponentsVisibility(int);
  }

  public abstract class TitleViewAdapter {
    ctor public TitleViewAdapter();
    method public android.graphics.drawable.Drawable! getBadgeDrawable();
    method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
    method public abstract android.view.View! getSearchAffordanceView();
    method public CharSequence! getTitle();
    method public void setAnimationEnabled(boolean);
    method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
    method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
    method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
    method public void setTitle(CharSequence!);
    method public void updateComponentsVisibility(int);
    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
  }

  public static interface TitleViewAdapter.Provider {
    method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
  }

  public class VerticalGridPresenter extends androidx.leanback.widget.Presenter {
    ctor public VerticalGridPresenter();
    ctor public VerticalGridPresenter(int);
    ctor public VerticalGridPresenter(int, boolean);
    method public final boolean areChildRoundedCornersEnabled();
    method protected androidx.leanback.widget.VerticalGridPresenter.ViewHolder! createGridViewHolder(android.view.ViewGroup!);
    method protected androidx.leanback.widget.ShadowOverlayHelper.Options! createShadowOverlayOptions();
    method public final void enableChildRoundedCorners(boolean);
    method public final int getFocusZoomFactor();
    method public final boolean getKeepChildForeground();
    method public int getNumberOfColumns();
    method public final androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
    method public final androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
    method public final boolean getShadowEnabled();
    method protected void initializeGridViewHolder(androidx.leanback.widget.VerticalGridPresenter.ViewHolder!);
    method public final boolean isFocusDimmerUsed();
    method public boolean isUsingDefaultShadow();
    method public boolean isUsingZOrder(android.content.Context!);
    method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
    method public final androidx.leanback.widget.VerticalGridPresenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
    method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
    method public void setEntranceTransitionState(androidx.leanback.widget.VerticalGridPresenter.ViewHolder!, boolean);
    method public final void setKeepChildForeground(boolean);
    method public void setNumberOfColumns(int);
    method public final void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
    method public final void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
    method public final void setShadowEnabled(boolean);
  }

  public static class VerticalGridPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
    ctor public VerticalGridPresenter.ViewHolder(androidx.leanback.widget.VerticalGridView!);
    method public androidx.leanback.widget.VerticalGridView! getGridView();
  }

  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
    ctor public VerticalGridView(android.content.Context!);
    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!);
    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!, int);
    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
    method public void setColumnWidth(int);
    method public void setNumColumns(int);
  }

  public interface ViewHolderTask {
    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
  }

}

package androidx.leanback.widget.picker {

  public class DatePicker extends androidx.leanback.widget.picker.Picker {
    ctor public DatePicker(android.content.Context!, android.util.AttributeSet!);
    ctor public DatePicker(android.content.Context!, android.util.AttributeSet!, int);
    method public long getDate();
    method public String! getDatePickerFormat();
    method public long getMaxDate();
    method public long getMinDate();
    method public final void onColumnValueChanged(int, int);
    method public void setDate(long);
    method public void setDate(int, int, int, boolean);
    method public void setDatePickerFormat(String!);
    method public void setMaxDate(long);
    method public void setMinDate(long);
  }

  public class Picker extends android.widget.FrameLayout {
    ctor public Picker(android.content.Context!, android.util.AttributeSet!);
    ctor public Picker(android.content.Context!, android.util.AttributeSet!, int);
    method public void addOnValueChangedListener(androidx.leanback.widget.picker.Picker.PickerValueListener!);
    method public float getActivatedVisibleItemCount();
    method public androidx.leanback.widget.picker.PickerColumn! getColumnAt(int);
    method public int getColumnsCount();
    method protected int getPickerItemHeightPixels();
    method @LayoutRes public final int getPickerItemLayoutId();
    method @IdRes public final int getPickerItemTextViewId();
    method public int getSelectedColumn();
    method @Deprecated public final CharSequence! getSeparator();
    method public final java.util.List<java.lang.CharSequence!>! getSeparators();
    method public float getVisibleItemCount();
    method public void onColumnValueChanged(int, int);
    method public void removeOnValueChangedListener(androidx.leanback.widget.picker.Picker.PickerValueListener!);
    method public void setActivatedVisibleItemCount(float);
    method public void setColumnAt(int, androidx.leanback.widget.picker.PickerColumn!);
    method public void setColumnValue(int, int, boolean);
    method public void setColumns(java.util.List<androidx.leanback.widget.picker.PickerColumn!>!);
    method public final void setPickerItemLayoutId(@LayoutRes int);
    method public final void setPickerItemTextViewId(@IdRes int);
    method public void setSelectedColumn(int);
    method public final void setSeparator(CharSequence!);
    method public final void setSeparators(java.util.List<java.lang.CharSequence!>!);
    method public void setVisibleItemCount(float);
  }

  public static interface Picker.PickerValueListener {
    method public void onValueChanged(androidx.leanback.widget.picker.Picker!, int);
  }

  public class PickerColumn {
    ctor public PickerColumn();
    method public int getCount();
    method public int getCurrentValue();
    method public CharSequence! getLabelFor(int);
    method public String! getLabelFormat();
    method public int getMaxValue();
    method public int getMinValue();
    method public CharSequence![]! getStaticLabels();
    method public void setCurrentValue(int);
    method public void setLabelFormat(String!);
    method public void setMaxValue(int);
    method public void setMinValue(int);
    method public void setStaticLabels(CharSequence![]!);
  }

  public class PinPicker extends androidx.leanback.widget.picker.Picker {
    ctor public PinPicker(android.content.Context!, android.util.AttributeSet!);
    ctor public PinPicker(android.content.Context!, android.util.AttributeSet!, int);
    method public String! getPin();
    method public void resetPin();
    method public void setNumberOfColumns(int);
  }

  public class TimePicker extends androidx.leanback.widget.picker.Picker {
    ctor public TimePicker(android.content.Context!, android.util.AttributeSet!);
    ctor public TimePicker(android.content.Context!, android.util.AttributeSet!, int);
    method public int getHour();
    method public int getMinute();
    method public boolean is24Hour();
    method public boolean isPm();
    method public void setHour(@IntRange(from=0, to=23) int);
    method public void setIs24Hour(boolean);
    method public void setMinute(@IntRange(from=0, to=59) int);
  }

}

