package android.support.v7.app {

  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
    ctor public MediaRouteActionProvider(android.content.Context);
    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
    method public android.view.View onCreateActionView();
    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
    method public void setRouteSelector(android.support.v7.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 android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
    method public void onAttachedToWindow();
    method public void onDetachedFromWindow();
    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
    method public boolean showDialog();
  }

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

  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
    ctor public MediaRouteChooserDialogFragment();
    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
  }

  public class MediaRouteControllerDialog extends android.app.Dialog {
    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 android.support.v7.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 android.support.v4.app.DialogFragment {
    ctor public MediaRouteControllerDialogFragment();
    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
  }

  public class MediaRouteDialogFactory {
    ctor public MediaRouteDialogFactory();
    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
  }

  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
    ctor public MediaRouteDiscoveryFragment();
    method public android.support.v7.media.MediaRouter getMediaRouter();
    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
    method public int onPrepareCallbackFlags();
    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
  }

}

package android.support.v7.media {

  public final class MediaControlIntent {
    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
    field public static final java.lang.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 java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
  }

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

  public final class MediaItemStatus {
    method public android.os.Bundle asBundle();
    method public static android.support.v7.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 java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
    field public static final java.lang.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(android.support.v7.media.MediaItemStatus);
    method public android.support.v7.media.MediaItemStatus build();
    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
  }

  public final class MediaRouteDescriptor {
    method public android.os.Bundle asBundle();
    method public boolean canDisconnectAndKeepPlaying();
    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
    method public java.util.List<android.content.IntentFilter> getControlFilters();
    method public java.lang.String getDescription();
    method public android.os.Bundle getExtras();
    method public java.lang.String getId();
    method public java.lang.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 public boolean isConnecting();
    method public boolean isEnabled();
    method public boolean isValid();
  }

  public static final class MediaRouteDescriptor.Builder {
    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
    method public android.support.v7.media.MediaRouteDescriptor build();
    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
  }

  public final class MediaRouteDiscoveryRequest {
    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
    method public android.os.Bundle asBundle();
    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
    method public android.support.v7.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 android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
    method public final android.os.Handler getHandler();
    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
  }

  public static abstract class MediaRouteProvider.Callback {
    ctor public MediaRouteProvider.Callback();
    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
  }

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

  public static abstract class MediaRouteProvider.RouteController {
    ctor public MediaRouteProvider.RouteController();
    method public boolean onControlRequest(android.content.Intent, android.support.v7.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 android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
    method public boolean isValid();
  }

  public static final class MediaRouteProviderDescriptor.Builder {
    ctor public MediaRouteProviderDescriptor.Builder();
    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
    method public android.support.v7.media.MediaRouteProviderDescriptor build();
  }

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

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

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

  public final class MediaRouter {
    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
    method public void addProvider(android.support.v7.media.MediaRouteProvider);
    method public void addRemoteControlClient(java.lang.Object);
    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
    method public void removeRemoteControlClient(java.lang.Object);
    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
    method public void setMediaSession(java.lang.Object);
    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
    method public void unselect(int);
    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.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 static abstract class MediaRouter.Callback {
    ctor public MediaRouter.Callback();
    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
  }

  public static abstract class MediaRouter.ControlRequestCallback {
    ctor public MediaRouter.ControlRequestCallback();
    method public void onError(java.lang.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 java.lang.String getPackageName();
    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
  }

  public static final class MediaRouter.RouteInfo {
    method public boolean canDisconnect();
    method public java.util.List<android.content.IntentFilter> getControlFilters();
    method public java.lang.String getDescription();
    method public android.os.Bundle getExtras();
    method public java.lang.String getId();
    method public java.lang.String getName();
    method public int getPlaybackStream();
    method public int getPlaybackType();
    method public android.view.Display getPresentationDisplay();
    method public android.support.v7.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 isConnecting();
    method public boolean isDefault();
    method public boolean isEnabled();
    method public boolean isSelected();
    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
    method public void requestSetVolume(int);
    method public void requestUpdateVolume(int);
    method public void select();
    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
    method public boolean supportsControlAction(java.lang.String, java.lang.String);
    method public boolean supportsControlCategory(java.lang.String);
    method public boolean supportsControlRequest(android.content.Intent);
    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 android.support.v7.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(android.support.v7.media.MediaSessionStatus);
    method public android.support.v7.media.MediaSessionStatus build();
    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
  }

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

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

  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
    ctor public RemotePlaybackClient.ItemActionCallback();
    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
  }

  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
    ctor public RemotePlaybackClient.SessionActionCallback();
    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
  }

  public static abstract class RemotePlaybackClient.StatusCallback {
    ctor public RemotePlaybackClient.StatusCallback();
    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
    method public void onSessionChanged(java.lang.String);
    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
  }

}

