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

  public class MediaRouteActionProvider extends androidx.core.view.ActionProvider {
    ctor public MediaRouteActionProvider(android.content.Context!);
    method public void enableDynamicGroup();
    method public androidx.mediarouter.app.MediaRouteDialogFactory getDialogFactory();
    method public androidx.mediarouter.app.MediaRouteButton? getMediaRouteButton();
    method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
    method public android.view.View! onCreateActionView();
    method public androidx.mediarouter.app.MediaRouteButton! onCreateMediaRouteButton();
    method public void setAlwaysVisible(boolean);
    method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
    method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
  }

  public class MediaRouteButton extends android.view.View {
    ctor public MediaRouteButton(android.content.Context!);
    ctor public MediaRouteButton(android.content.Context!, android.util.AttributeSet!);
    ctor public MediaRouteButton(android.content.Context!, android.util.AttributeSet!, int);
    method public void enableDynamicGroup();
    method public androidx.mediarouter.app.MediaRouteDialogFactory getDialogFactory();
    method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
    method public void onAttachedToWindow();
    method public void onDetachedFromWindow();
    method public void setAlwaysVisible(boolean);
    method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable!);
    method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
    method public boolean showDialog();
  }

  public class MediaRouteChooserDialog extends androidx.appcompat.app.AppCompatDialog {
    ctor public MediaRouteChooserDialog(android.content.Context!);
    ctor public MediaRouteChooserDialog(android.content.Context!, int);
    method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
    method public boolean onFilterRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
    method public void onFilterRoutes(java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo!>);
    method public void refreshRoutes();
    method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
  }

  public class MediaRouteChooserDialogFragment extends androidx.fragment.app.DialogFragment {
    ctor public MediaRouteChooserDialogFragment();
    method public androidx.mediarouter.media.MediaRouteSelector! getRouteSelector();
    method public androidx.mediarouter.app.MediaRouteChooserDialog! onCreateChooserDialog(android.content.Context!, android.os.Bundle!);
    method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
  }

  public class MediaRouteControllerDialog extends androidx.appcompat.app.AlertDialog {
    ctor public MediaRouteControllerDialog(android.content.Context!);
    ctor public MediaRouteControllerDialog(android.content.Context!, int);
    method public android.view.View! getMediaControlView();
    method public android.support.v4.media.session.MediaSessionCompat.Token! getMediaSession();
    method public androidx.mediarouter.media.MediaRouter.RouteInfo! getRoute();
    method public boolean isVolumeControlEnabled();
    method public android.view.View! onCreateMediaControlView(android.os.Bundle!);
    method public void setVolumeControlEnabled(boolean);
  }

  public class MediaRouteControllerDialogFragment extends androidx.fragment.app.DialogFragment {
    ctor public MediaRouteControllerDialogFragment();
    method public androidx.mediarouter.app.MediaRouteControllerDialog! onCreateControllerDialog(android.content.Context!, android.os.Bundle!);
  }

  public class MediaRouteDialogFactory {
    ctor public MediaRouteDialogFactory();
    method public static androidx.mediarouter.app.MediaRouteDialogFactory getDefault();
    method public androidx.mediarouter.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
    method public androidx.mediarouter.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
  }

  public class MediaRouteDiscoveryFragment extends androidx.fragment.app.Fragment {
    ctor public MediaRouteDiscoveryFragment();
    method public androidx.mediarouter.media.MediaRouter! getMediaRouter();
    method public androidx.mediarouter.media.MediaRouteSelector! getRouteSelector();
    method public androidx.mediarouter.media.MediaRouter.Callback! onCreateCallback();
    method public int onPrepareCallbackFlags();
    method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
  }

}

package androidx.mediarouter.media {

  public final class MediaControlIntent {
    field public static final String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
    field public static final String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
    field public static final String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
    field public static final String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
    field public static final String ACTION_PAUSE = "android.media.intent.action.PAUSE";
    field public static final String ACTION_PLAY = "android.media.intent.action.PLAY";
    field public static final String ACTION_REMOVE = "android.media.intent.action.REMOVE";
    field public static final String ACTION_RESUME = "android.media.intent.action.RESUME";
    field public static final String ACTION_SEEK = "android.media.intent.action.SEEK";
    field public static final String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
    field public static final String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
    field public static final String ACTION_STOP = "android.media.intent.action.STOP";
    field public static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
    field public static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
    field public static final String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
    field public static final int ERROR_UNKNOWN = 0; // 0x0
    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
    field public static final String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
    field public static final String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
    field public static final String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
    field public static final String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
    field public static final String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
    field public static final String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
    field public static final String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
    field public static final String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
    field public static final String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_RECEIVER";
    field public static final String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
    field public static final String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
    field public static final String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
  }

  public final class MediaItemMetadata {
    field public static final String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
    field public static final String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
    field public static final String KEY_ARTIST = "android.media.metadata.ARTIST";
    field public static final String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
    field public static final String KEY_AUTHOR = "android.media.metadata.AUTHOR";
    field public static final String KEY_COMPOSER = "android.media.metadata.COMPOSER";
    field public static final String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
    field public static final String KEY_DURATION = "android.media.metadata.DURATION";
    field public static final String KEY_TITLE = "android.media.metadata.TITLE";
    field public static final String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
    field public static final String KEY_YEAR = "android.media.metadata.YEAR";
  }

  public final class MediaItemStatus {
    method public android.os.Bundle! asBundle();
    method public static androidx.mediarouter.media.MediaItemStatus! fromBundle(android.os.Bundle!);
    method public long getContentDuration();
    method public long getContentPosition();
    method public android.os.Bundle! getExtras();
    method public int getPlaybackState();
    method public long getTimestamp();
    field public static final String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
    field public static final String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
  }

  public static final class MediaItemStatus.Builder {
    ctor public MediaItemStatus.Builder(int);
    ctor public MediaItemStatus.Builder(androidx.mediarouter.media.MediaItemStatus!);
    method public androidx.mediarouter.media.MediaItemStatus! build();
    method public androidx.mediarouter.media.MediaItemStatus.Builder! setContentDuration(long);
    method public androidx.mediarouter.media.MediaItemStatus.Builder! setContentPosition(long);
    method public androidx.mediarouter.media.MediaItemStatus.Builder! setExtras(android.os.Bundle!);
    method public androidx.mediarouter.media.MediaItemStatus.Builder! setPlaybackState(int);
    method public androidx.mediarouter.media.MediaItemStatus.Builder! setTimestamp(long);
  }

  public final class MediaRouteDescriptor {
    method public android.os.Bundle! asBundle();
    method public boolean canDisconnectAndKeepPlaying();
    method public static androidx.mediarouter.media.MediaRouteDescriptor! fromBundle(android.os.Bundle!);
    method public int getConnectionState();
    method public java.util.List<android.content.IntentFilter!>! getControlFilters();
    method public String! getDescription();
    method public int getDeviceType();
    method public android.os.Bundle! getExtras();
    method public android.net.Uri! getIconUri();
    method public String! getId();
    method public String! getName();
    method public int getPlaybackStream();
    method public int getPlaybackType();
    method public int getPresentationDisplayId();
    method public android.content.IntentSender! getSettingsActivity();
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method @Deprecated public boolean isConnecting();
    method public boolean isDynamicGroupRoute();
    method public boolean isEnabled();
    method public boolean isValid();
  }

  public static final class MediaRouteDescriptor.Builder {
    ctor public MediaRouteDescriptor.Builder(String!, String!);
    ctor public MediaRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteDescriptor!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! addControlFilter(android.content.IntentFilter!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! addControlFilters(java.util.Collection<android.content.IntentFilter!>!);
    method public androidx.mediarouter.media.MediaRouteDescriptor! build();
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setCanDisconnect(boolean);
    method @Deprecated public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setConnecting(boolean);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setConnectionState(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setDescription(String!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setDeviceType(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setEnabled(boolean);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setExtras(android.os.Bundle!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setIconUri(android.net.Uri!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setId(String!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setIsDynamicGroupRoute(boolean);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setName(String!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPlaybackStream(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPlaybackType(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPresentationDisplayId(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setSettingsActivity(android.content.IntentSender!);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolume(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolumeHandling(int);
    method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolumeMax(int);
  }

  public final class MediaRouteDiscoveryRequest {
    ctor public MediaRouteDiscoveryRequest(androidx.mediarouter.media.MediaRouteSelector!, boolean);
    method public android.os.Bundle! asBundle();
    method public static androidx.mediarouter.media.MediaRouteDiscoveryRequest! fromBundle(android.os.Bundle!);
    method public androidx.mediarouter.media.MediaRouteSelector! getSelector();
    method public boolean isActiveScan();
    method public boolean isValid();
  }

  public abstract class MediaRouteProvider {
    ctor public MediaRouteProvider(android.content.Context);
    method public final android.content.Context! getContext();
    method public final androidx.mediarouter.media.MediaRouteProviderDescriptor? getDescriptor();
    method public final androidx.mediarouter.media.MediaRouteDiscoveryRequest? getDiscoveryRequest();
    method public final android.os.Handler! getHandler();
    method public final androidx.mediarouter.media.MediaRouteProvider.ProviderMetadata! getMetadata();
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController? onCreateDynamicGroupRouteController(String);
    method public androidx.mediarouter.media.MediaRouteProvider.RouteController? onCreateRouteController(String);
    method public void onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest?);
    method public final void setCallback(androidx.mediarouter.media.MediaRouteProvider.Callback?);
    method public final void setDescriptor(androidx.mediarouter.media.MediaRouteProviderDescriptor?);
    method public final void setDiscoveryRequest(androidx.mediarouter.media.MediaRouteDiscoveryRequest!);
  }

  public abstract static class MediaRouteProvider.Callback {
    ctor public MediaRouteProvider.Callback();
    method public void onDescriptorChanged(androidx.mediarouter.media.MediaRouteProvider, androidx.mediarouter.media.MediaRouteProviderDescriptor?);
  }

  public abstract static class MediaRouteProvider.DynamicGroupRouteController extends androidx.mediarouter.media.MediaRouteProvider.RouteController {
    ctor public MediaRouteProvider.DynamicGroupRouteController();
    method public String? getGroupableSelectionTitle();
    method public String? getTransferableSectionTitle();
    method public final void notifyDynamicRoutesChanged(java.util.Collection<androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor!>!);
    method public abstract void onAddMemberRoute(String);
    method public abstract void onRemoveMemberRoute(String!);
    method public abstract void onUpdateMemberRoutes(java.util.List<java.lang.String!>?);
  }

  public static final class MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor {
    method public androidx.mediarouter.media.MediaRouteDescriptor getRouteDescriptor();
    method public int getSelectionState();
    method public boolean isGroupable();
    method public boolean isTransferable();
    method public boolean isUnselectable();
    field public static final int SELECTED = 3; // 0x3
    field public static final int SELECTING = 2; // 0x2
    field public static final int UNSELECTED = 1; // 0x1
    field public static final int UNSELECTING = 0; // 0x0
  }

  public static final class MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder {
    ctor public MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteDescriptor!);
    ctor public MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor!);
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor! build();
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsGroupable(boolean);
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsTransferable(boolean);
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsUnselectable(boolean);
    method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setSelectionState(int);
  }

  public static final class MediaRouteProvider.ProviderMetadata {
    method public android.content.ComponentName! getComponentName();
    method public String! getPackageName();
  }

  public abstract static class MediaRouteProvider.RouteController {
    ctor public MediaRouteProvider.RouteController();
    method public boolean onControlRequest(android.content.Intent!, androidx.mediarouter.media.MediaRouter.ControlRequestCallback?);
    method public void onRelease();
    method public void onSelect();
    method public void onSetVolume(int);
    method public void onUnselect();
    method public void onUnselect(int);
    method public void onUpdateVolume(int);
  }

  public final class MediaRouteProviderDescriptor {
    method public android.os.Bundle! asBundle();
    method public static androidx.mediarouter.media.MediaRouteProviderDescriptor! fromBundle(android.os.Bundle!);
    method public java.util.List<androidx.mediarouter.media.MediaRouteDescriptor!> getRoutes();
    method public boolean isValid();
    method public boolean supportsDynamicGroupRoute();
  }

  public static final class MediaRouteProviderDescriptor.Builder {
    ctor public MediaRouteProviderDescriptor.Builder();
    ctor public MediaRouteProviderDescriptor.Builder(androidx.mediarouter.media.MediaRouteProviderDescriptor!);
    method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! addRoute(androidx.mediarouter.media.MediaRouteDescriptor!);
    method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor!>!);
    method public androidx.mediarouter.media.MediaRouteProviderDescriptor! build();
    method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! setSupportsDynamicGroupRoute(boolean);
  }

  public abstract class MediaRouteProviderService extends android.app.Service {
    ctor public MediaRouteProviderService();
    method public androidx.mediarouter.media.MediaRouteProvider! getMediaRouteProvider();
    method public android.os.IBinder! onBind(android.content.Intent!);
    method public abstract androidx.mediarouter.media.MediaRouteProvider! onCreateMediaRouteProvider();
    field public static final String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
  }

  public final class MediaRouteSelector {
    method public android.os.Bundle! asBundle();
    method public boolean contains(androidx.mediarouter.media.MediaRouteSelector!);
    method public static androidx.mediarouter.media.MediaRouteSelector! fromBundle(android.os.Bundle?);
    method public java.util.List<java.lang.String!>! getControlCategories();
    method public boolean hasControlCategory(String!);
    method public boolean isEmpty();
    method public boolean isValid();
    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter!>!);
    field public static final androidx.mediarouter.media.MediaRouteSelector! EMPTY;
  }

  public static final class MediaRouteSelector.Builder {
    ctor public MediaRouteSelector.Builder();
    ctor public MediaRouteSelector.Builder(androidx.mediarouter.media.MediaRouteSelector);
    method public androidx.mediarouter.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String!>);
    method public androidx.mediarouter.media.MediaRouteSelector.Builder addControlCategory(String);
    method public androidx.mediarouter.media.MediaRouteSelector.Builder addSelector(androidx.mediarouter.media.MediaRouteSelector);
    method public androidx.mediarouter.media.MediaRouteSelector build();
  }

  public final class MediaRouter {
    method public void addCallback(androidx.mediarouter.media.MediaRouteSelector!, androidx.mediarouter.media.MediaRouter.Callback!);
    method public void addCallback(androidx.mediarouter.media.MediaRouteSelector, androidx.mediarouter.media.MediaRouter.Callback, int);
    method public void addProvider(androidx.mediarouter.media.MediaRouteProvider);
    method public void addRemoteControlClient(Object);
    method public androidx.mediarouter.media.MediaRouter.RouteInfo! getBluetoothRoute();
    method public androidx.mediarouter.media.MediaRouter.RouteInfo getDefaultRoute();
    method public static androidx.mediarouter.media.MediaRouter! getInstance(android.content.Context);
    method public android.support.v4.media.session.MediaSessionCompat.Token! getMediaSessionToken();
    method public java.util.List<androidx.mediarouter.media.MediaRouter.ProviderInfo!>! getProviders();
    method public java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo!>! getRoutes();
    method public androidx.mediarouter.media.MediaRouter.RouteInfo getSelectedRoute();
    method public boolean isRouteAvailable(androidx.mediarouter.media.MediaRouteSelector, int);
    method public void removeCallback(androidx.mediarouter.media.MediaRouter.Callback);
    method public void removeProvider(androidx.mediarouter.media.MediaRouteProvider);
    method public void removeRemoteControlClient(Object);
    method public void selectRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
    method public void setMediaSession(Object!);
    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat!);
    method public void unselect(int);
    method public androidx.mediarouter.media.MediaRouter.RouteInfo updateSelectedRoute(androidx.mediarouter.media.MediaRouteSelector);
    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
  }

  public abstract static class MediaRouter.Callback {
    ctor public MediaRouter.Callback();
    method public void onProviderAdded(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
    method public void onProviderChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
    method public void onProviderRemoved(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
    method public void onRouteAdded(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRouteChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRoutePresentationDisplayChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRouteRemoved(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRouteSelected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRouteUnselected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void onRouteUnselected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!, int);
    method public void onRouteVolumeChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
  }

  public abstract static class MediaRouter.ControlRequestCallback {
    ctor public MediaRouter.ControlRequestCallback();
    method public void onError(String!, android.os.Bundle!);
    method public void onResult(android.os.Bundle!);
  }

  public static final class MediaRouter.ProviderInfo {
    method public android.content.ComponentName! getComponentName();
    method public String! getPackageName();
    method public androidx.mediarouter.media.MediaRouteProvider! getProviderInstance();
    method public java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo!>! getRoutes();
  }

  public static class MediaRouter.RouteInfo {
    method public boolean canDisconnect();
    method public int getConnectionState();
    method public java.util.List<android.content.IntentFilter!>! getControlFilters();
    method public String? getDescription();
    method public int getDeviceType();
    method public android.os.Bundle? getExtras();
    method public android.net.Uri! getIconUri();
    method public String getId();
    method public String! getName();
    method public int getPlaybackStream();
    method public int getPlaybackType();
    method public android.view.Display? getPresentationDisplay();
    method public androidx.mediarouter.media.MediaRouter.ProviderInfo! getProvider();
    method public android.content.IntentSender? getSettingsIntent();
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method public boolean isBluetooth();
    method @Deprecated public boolean isConnecting();
    method public boolean isDefault();
    method public boolean isDeviceSpeaker();
    method public boolean isEnabled();
    method public boolean isSelected();
    method public boolean matchesSelector(androidx.mediarouter.media.MediaRouteSelector);
    method public void requestSetVolume(int);
    method public void requestUpdateVolume(int);
    method public void select();
    method public void sendControlRequest(android.content.Intent, androidx.mediarouter.media.MediaRouter.ControlRequestCallback?);
    method public boolean supportsControlAction(String, String);
    method public boolean supportsControlCategory(String);
    method public boolean supportsControlRequest(android.content.Intent);
    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
    field public static final int DEVICE_TYPE_TV = 1; // 0x1
    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
  }

  public final class MediaSessionStatus {
    method public android.os.Bundle! asBundle();
    method public static androidx.mediarouter.media.MediaSessionStatus! fromBundle(android.os.Bundle!);
    method public android.os.Bundle! getExtras();
    method public int getSessionState();
    method public long getTimestamp();
    method public boolean isQueuePaused();
    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
    field public static final int SESSION_STATE_ENDED = 1; // 0x1
    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
  }

  public static final class MediaSessionStatus.Builder {
    ctor public MediaSessionStatus.Builder(int);
    ctor public MediaSessionStatus.Builder(androidx.mediarouter.media.MediaSessionStatus!);
    method public androidx.mediarouter.media.MediaSessionStatus! build();
    method public androidx.mediarouter.media.MediaSessionStatus.Builder! setExtras(android.os.Bundle!);
    method public androidx.mediarouter.media.MediaSessionStatus.Builder! setQueuePaused(boolean);
    method public androidx.mediarouter.media.MediaSessionStatus.Builder! setSessionState(int);
    method public androidx.mediarouter.media.MediaSessionStatus.Builder! setTimestamp(long);
  }

  public class RemotePlaybackClient {
    ctor public RemotePlaybackClient(android.content.Context!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
    method public void endSession(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void enqueue(android.net.Uri!, String!, android.os.Bundle!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
    method public String! getSessionId();
    method public void getSessionStatus(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void getStatus(String!, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
    method public boolean hasSession();
    method public boolean isMessagingSupported();
    method public boolean isQueuingSupported();
    method public boolean isRemotePlaybackSupported();
    method public boolean isSessionManagementSupported();
    method public void pause(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void play(android.net.Uri!, String!, android.os.Bundle!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
    method public void release();
    method public void remove(String!, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
    method public void resume(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void seek(String!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
    method public void sendMessage(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void setOnMessageReceivedListener(androidx.mediarouter.media.RemotePlaybackClient.OnMessageReceivedListener!);
    method public void setSessionId(String!);
    method public void setStatusCallback(androidx.mediarouter.media.RemotePlaybackClient.StatusCallback!);
    method public void startSession(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
    method public void stop(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
  }

  public abstract static class RemotePlaybackClient.ActionCallback {
    ctor public RemotePlaybackClient.ActionCallback();
    method public void onError(String!, int, android.os.Bundle!);
  }

  public abstract static class RemotePlaybackClient.ItemActionCallback extends androidx.mediarouter.media.RemotePlaybackClient.ActionCallback {
    ctor public RemotePlaybackClient.ItemActionCallback();
    method public void onResult(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!, String!, androidx.mediarouter.media.MediaItemStatus!);
  }

  public static interface RemotePlaybackClient.OnMessageReceivedListener {
    method public void onMessageReceived(String!, android.os.Bundle!);
  }

  public abstract static class RemotePlaybackClient.SessionActionCallback extends androidx.mediarouter.media.RemotePlaybackClient.ActionCallback {
    ctor public RemotePlaybackClient.SessionActionCallback();
    method public void onResult(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!);
  }

  public abstract static class RemotePlaybackClient.StatusCallback {
    ctor public RemotePlaybackClient.StatusCallback();
    method public void onItemStatusChanged(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!, String!, androidx.mediarouter.media.MediaItemStatus!);
    method public void onSessionChanged(String!);
    method public void onSessionStatusChanged(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!);
  }

}

