// 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 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 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 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 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 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 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 @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 @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 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 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);
  }

}

