diff options
Diffstat (limited to 'media/java/android/media/session/MediaController.java')
-rw-r--r-- | media/java/android/media/session/MediaController.java | 113 |
1 files changed, 74 insertions, 39 deletions
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 181ee5327547..a1b8170cf4c3 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -21,17 +21,19 @@ import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.app.PendingIntent; import android.content.Context; -import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; +import android.media.session.MediaSession.QueueItem; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.Parcel; +import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.text.TextUtils; @@ -70,7 +72,8 @@ public final class MediaController { private final MediaSession.Token mToken; private final Context mContext; - private final CallbackStub mCbStub = new CallbackStub(this); + private final ControllerCallbackLink mCbStub = + new ControllerCallbackLink(new CallbackStub(this)); private final ArrayList<MessageHandler> mCallbacks = new ArrayList<MessageHandler>(); private final Object mLock = new Object(); @@ -249,10 +252,7 @@ public final class MediaController { */ public @Nullable List<MediaSession.QueueItem> getQueue() { try { - ParceledListSlice queue = mSessionBinder.getQueue(); - if (queue != null) { - return queue.getList(); - } + return mSessionBinder.getQueue(); } catch (RemoteException e) { Log.wtf(TAG, "Error calling getQueue.", e); } @@ -327,10 +327,7 @@ public final class MediaController { */ public @Nullable PlaybackInfo getPlaybackInfo() { try { - ParcelableVolumeInfo result = mSessionBinder.getVolumeAttributes(); - return new PlaybackInfo(result.volumeType, result.audioAttrs, result.controlType, - result.maxVolume, result.currentVolume); - + return mSessionBinder.getVolumeAttributes(); } catch (RemoteException e) { Log.wtf(TAG, "Error calling getAudioInfo.", e); } @@ -986,15 +983,15 @@ public final class MediaController { * Holds information about the current playback and how audio is handled for * this session. */ - public static final class PlaybackInfo { - /** - * The session uses remote playback. - */ - public static final int PLAYBACK_TYPE_REMOTE = 2; + public static final class PlaybackInfo implements Parcelable { /** * The session uses local playback. */ public static final int PLAYBACK_TYPE_LOCAL = 1; + /** + * The session uses remote playback. + */ + public static final int PLAYBACK_TYPE_REMOTE = 2; private final int mVolumeType; private final int mVolumeControl; @@ -1005,12 +1002,20 @@ public final class MediaController { /** * @hide */ - public PlaybackInfo(int type, AudioAttributes attrs, int control, int max, int current) { + public PlaybackInfo(int type, int control, int max, int current, AudioAttributes attrs) { mVolumeType = type; - mAudioAttrs = attrs; mVolumeControl = control; mMaxVolume = max; mCurrentVolume = current; + mAudioAttrs = attrs; + } + + PlaybackInfo(Parcel in) { + mVolumeType = in.readInt(); + mVolumeControl = in.readInt(); + mMaxVolume = in.readInt(); + mCurrentVolume = in.readInt(); + mAudioAttrs = in.readParcelable(null); } /** @@ -1027,18 +1032,6 @@ public final class MediaController { } /** - * Get the audio attributes for this session. The attributes will affect - * volume handling for the session. When the volume type is - * {@link PlaybackInfo#PLAYBACK_TYPE_REMOTE} these may be ignored by the - * remote volume handler. - * - * @return The attributes for this session. - */ - public AudioAttributes getAudioAttributes() { - return mAudioAttrs; - } - - /** * Get the type of volume control that can be used. One of: * <ul> * <li>{@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}</li> @@ -1070,12 +1063,58 @@ public final class MediaController { public int getCurrentVolume() { return mCurrentVolume; } + + /** + * Get the audio attributes for this session. The attributes will affect + * volume handling for the session. When the volume type is + * {@link PlaybackInfo#PLAYBACK_TYPE_REMOTE} these may be ignored by the + * remote volume handler. + * + * @return The attributes for this session. + */ + public AudioAttributes getAudioAttributes() { + return mAudioAttrs; + } + + @Override + public String toString() { + return "volumeType=" + mVolumeType + ", volumeControl=" + mVolumeControl + + ", maxVolume=" + mMaxVolume + ", currentVolume=" + mCurrentVolume + + ", audioAttrs=" + mAudioAttrs; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mVolumeType); + dest.writeInt(mVolumeControl); + dest.writeInt(mMaxVolume); + dest.writeInt(mCurrentVolume); + dest.writeParcelable(mAudioAttrs, flags); + } + + public static final Parcelable.Creator<PlaybackInfo> CREATOR = + new Parcelable.Creator<PlaybackInfo>() { + @Override + public PlaybackInfo createFromParcel(Parcel in) { + return new PlaybackInfo(in); + } + + @Override + public PlaybackInfo[] newArray(int size) { + return new PlaybackInfo[size]; + } + }; } - private final static class CallbackStub extends ISessionControllerCallback.Stub { + private static final class CallbackStub extends ControllerCallbackLink.CallbackStub { private final WeakReference<MediaController> mController; - public CallbackStub(MediaController controller) { + CallbackStub(MediaController controller) { mController = new WeakReference<MediaController>(controller); } @@ -1112,9 +1151,7 @@ public final class MediaController { } @Override - public void onQueueChanged(ParceledListSlice parceledQueue) { - List<MediaSession.QueueItem> queue = parceledQueue == null ? null : parceledQueue - .getList(); + public void onQueueChanged(List<QueueItem> queue) { MediaController controller = mController.get(); if (controller != null) { controller.postMessage(MSG_UPDATE_QUEUE, queue, null); @@ -1138,15 +1175,12 @@ public final class MediaController { } @Override - public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) { + public void onVolumeInfoChanged(PlaybackInfo info) { MediaController controller = mController.get(); if (controller != null) { - PlaybackInfo info = new PlaybackInfo(pvi.volumeType, pvi.audioAttrs, - pvi.controlType, pvi.maxVolume, pvi.currentVolume); controller.postMessage(MSG_UPDATE_VOLUME, info, null); } } - } private final static class MessageHandler extends Handler { @@ -1154,7 +1188,7 @@ public final class MediaController { private boolean mRegistered = false; public MessageHandler(Looper looper, MediaController.Callback cb) { - super(looper, null, true); + super(looper); mCallback = cb; } @@ -1193,6 +1227,7 @@ public final class MediaController { public void post(int what, Object obj, Bundle data) { Message msg = obtainMessage(what, obj); + msg.setAsynchronous(true); msg.setData(data); msg.sendToTarget(); } |