From 7053844db7431ecc66dfbe46d4f4ecb1cd006ce6 Mon Sep 17 00:00:00 2001 From: Hyundo Moon Date: Fri, 4 Jan 2019 03:22:05 +0000 Subject: [PATCH] Revert "Introduce ControllerCallbackLink" This reverts commit e521669b5d7aa6ce32bf965bd0bb9a84a2cdb19b. Reason for revert: Another CL will be uploaded which makes the APIs public, not @SystemApi. Bug: 122169124 Change-Id: Ie9ed1067596fe1724879e81d768ac8252eda7841 --- api/system-current.txt | 28 -- .../src/com/android/commands/media/Media.java | 43 ++- .../media/session/ControllerCallbackLink.aidl | 18 -- .../media/session/ControllerCallbackLink.java | 240 ---------------- .../java/android/media/session/ISession.aidl | 3 +- .../media/session/ISessionCallback.aidl | 46 +-- .../media/session/ISessionController.aidl | 56 ++-- .../session/ISessionControllerCallback.aidl | 21 +- .../media/session/MediaController.java | 26 +- .../android/media/session/MediaSession.java | 49 ++-- .../server/media/MediaSessionRecord.java | 270 ++++++++---------- 11 files changed, 245 insertions(+), 555 deletions(-) delete mode 100644 media/java/android/media/session/ControllerCallbackLink.aidl delete mode 100644 media/java/android/media/session/ControllerCallbackLink.java diff --git a/api/system-current.txt b/api/system-current.txt index aa91a12d02154..6c97c36cdf43e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3163,34 +3163,6 @@ package android.media.audiopolicy { package android.media.session { - public final class ControllerCallbackLink implements android.os.Parcelable { - ctor public ControllerCallbackLink(android.media.session.ControllerCallbackLink.CallbackStub); - method public android.os.IBinder asBinder(); - method public int describeContents(); - method public void notifyEvent(java.lang.String, android.os.Bundle); - method public void notifyExtrasChanged(android.os.Bundle); - method public void notifyMetadataChanged(android.media.MediaMetadata); - method public void notifyPlaybackStateChanged(android.media.session.PlaybackState); - method public void notifyQueueChanged(java.util.List); - method public void notifyQueueTitleChanged(java.lang.CharSequence); - method public void notifySessionDestroyed(); - method public void notifyVolumeInfoChanged(int, android.media.AudioAttributes, int, int, int); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator CREATOR; - } - - public static abstract class ControllerCallbackLink.CallbackStub { - ctor public ControllerCallbackLink.CallbackStub(); - method public void onEvent(java.lang.String, android.os.Bundle); - method public void onExtrasChanged(android.os.Bundle); - method public void onMetadataChanged(android.media.MediaMetadata); - method public void onPlaybackStateChanged(android.media.session.PlaybackState); - method public void onQueueChanged(java.util.List); - method public void onQueueTitleChanged(java.lang.CharSequence); - method public void onSessionDestroyed(); - method public void onVolumeInfoChanged(int, android.media.AudioAttributes, int, int, int); - } - public final class MediaSessionManager { method public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, android.os.Handler); method public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler); diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java index ded20c4b38bf6..c6d2bc891b18e 100644 --- a/cmds/media/src/com/android/commands/media/Media.java +++ b/cmds/media/src/com/android/commands/media/Media.java @@ -19,12 +19,12 @@ package com.android.commands.media; import android.app.ActivityManager; import android.content.Context; -import android.media.AudioAttributes; +import android.content.pm.ParceledListSlice; import android.media.MediaMetadata; -import android.media.session.ControllerCallbackLink; import android.media.session.ISessionController; +import android.media.session.ISessionControllerCallback; import android.media.session.ISessionManager; -import android.media.session.MediaSession.QueueItem; +import android.media.session.ParcelableVolumeInfo; import android.media.session.PlaybackState; import android.os.Bundle; import android.os.HandlerThread; @@ -178,7 +178,13 @@ public class Media extends BaseCommand { KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD)); } - class ControllerCallbackStub extends ControllerCallbackLink.CallbackStub { + class ControllerMonitor extends ISessionControllerCallback.Stub { + private final ISessionController mController; + + public ControllerMonitor(ISessionController controller) { + mController = controller; + } + @Override public void onSessionDestroyed() { System.out.println("onSessionDestroyed. Enter q to quit."); @@ -202,37 +208,24 @@ public class Media extends BaseCommand { } @Override - public void onQueueChanged(List queue) { + public void onQueueChanged(ParceledListSlice queue) throws RemoteException { System.out.println("onQueueChanged, " - + (queue == null ? "null queue" : " size=" + queue.size())); + + (queue == null ? "null queue" : " size=" + queue.getList().size())); } @Override - public void onQueueTitleChanged(CharSequence title) { + public void onQueueTitleChanged(CharSequence title) throws RemoteException { System.out.println("onQueueTitleChange " + title); } @Override - public void onExtrasChanged(Bundle extras) { + public void onExtrasChanged(Bundle extras) throws RemoteException { System.out.println("onExtrasChanged " + extras); } @Override - public void onVolumeInfoChanged(int volumeType, AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume) { - System.out.println("onVolumeInfoChanged " + "volumeType=" + volumeType + ", attrs=" - + attrs + ", controlType=" + controlType + ", maxVolume=" + maxVolume - + ", currentVolume=" + currentVolume); - } - } - - private class ControllerMonitor { - private final ISessionController mController; - private final ControllerCallbackLink mControllerCallbackLink; - - ControllerMonitor(ISessionController controller) { - mController = controller; - mControllerCallbackLink = new ControllerCallbackLink(new ControllerCallbackStub()); + public void onVolumeInfoChanged(ParcelableVolumeInfo info) throws RemoteException { + System.out.println("onVolumeInfoChanged " + info); } void printUsageMessage() { @@ -251,7 +244,7 @@ public class Media extends BaseCommand { @Override protected void onLooperPrepared() { try { - mController.registerCallbackListener(PACKAGE_NAME, mControllerCallbackLink); + mController.registerCallbackListener(PACKAGE_NAME, ControllerMonitor.this); } catch (RemoteException e) { System.out.println("Error registering monitor callback"); } @@ -294,7 +287,7 @@ public class Media extends BaseCommand { } finally { cbThread.getLooper().quit(); try { - mController.unregisterCallbackListener(mControllerCallbackLink); + mController.unregisterCallbackListener(this); } catch (Exception e) { // ignoring } diff --git a/media/java/android/media/session/ControllerCallbackLink.aidl b/media/java/android/media/session/ControllerCallbackLink.aidl deleted file mode 100644 index 788f5d35d72ba..0000000000000 --- a/media/java/android/media/session/ControllerCallbackLink.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.media.session; - -parcelable ControllerCallbackLink; diff --git a/media/java/android/media/session/ControllerCallbackLink.java b/media/java/android/media/session/ControllerCallbackLink.java deleted file mode 100644 index ae7d18faa5e77..0000000000000 --- a/media/java/android/media/session/ControllerCallbackLink.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.media.session; - -import android.annotation.NonNull; -import android.annotation.SystemApi; -import android.media.AudioAttributes; -import android.media.MediaMetadata; -import android.media.session.MediaSession.QueueItem; -import android.os.Bundle; -import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.RemoteException; - -import java.util.List; - -/** - * Handles incoming commands to {@link MediaController.Callback}. - * @hide - */ -@SystemApi -public final class ControllerCallbackLink implements Parcelable { - CallbackStub mCallbackStub; - ISessionControllerCallback mIControllerCallback; - - /** - * Creator for stub (Callee) - */ - public ControllerCallbackLink(@NonNull CallbackStub callbackStub) { - mCallbackStub = callbackStub; - mIControllerCallback = new CallbackStubProxy(); - } - - /** - * Creator for interface (Caller) - */ - ControllerCallbackLink(Parcel in) { - mCallbackStub = null; - mIControllerCallback = ISessionControllerCallback.Stub.asInterface(in.readStrongBinder()); - } - - /** Interface method for ISessionControllerCallback.notifySessionDestroyed */ - public void notifySessionDestroyed() { - try { - mIControllerCallback.notifySessionDestroyed(); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyEvent */ - public void notifyEvent(String event, Bundle extras) { - try { - mIControllerCallback.notifyEvent(event, extras); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyPlaybackStateChanged */ - public void notifyPlaybackStateChanged(PlaybackState state) { - try { - mIControllerCallback.notifyPlaybackStateChanged(state); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyMetadataChanged */ - public void notifyMetadataChanged(MediaMetadata metadata) { - try { - mIControllerCallback.notifyMetadataChanged(metadata); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyQueueChanged */ - public void notifyQueueChanged(List queue) { - try { - mIControllerCallback.notifyQueueChanged(queue); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyQueueTitleChanged */ - public void notifyQueueTitleChanged(CharSequence title) { - try { - mIControllerCallback.notifyQueueTitleChanged(title); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyExtrasChanged */ - public void notifyExtrasChanged(Bundle extras) { - try { - mIControllerCallback.notifyExtrasChanged(extras); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Interface method for ISessionControllerCallback.notifyVolumeInfoChanged */ - public void notifyVolumeInfoChanged(int volumeType, AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume) { - try { - mIControllerCallback.notifyVolumeInfoChanged(volumeType, attrs, controlType, maxVolume, - currentVolume); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } - - /** Gets the binder */ - public IBinder asBinder() { - return mIControllerCallback.asBinder(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeStrongBinder(mIControllerCallback.asBinder()); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public ControllerCallbackLink createFromParcel(Parcel in) { - return new ControllerCallbackLink(in); - } - - @Override - public ControllerCallbackLink[] newArray(int size) { - return new ControllerCallbackLink[size]; - } - }; - - /** - * Class for Stub implementation - */ - public abstract static class CallbackStub { - /** Stub method for ISessionControllerCallback.notifySessionDestroyed */ - public void onSessionDestroyed() { - } - - /** Stub method for ISessionControllerCallback.notifyEvent */ - public void onEvent(String event, Bundle extras) { - } - - /** Stub method for ISessionControllerCallback.notifyPlaybackStateChanged */ - public void onPlaybackStateChanged(PlaybackState state) { - } - - /** Stub method for ISessionControllerCallback.notifyMetadataChanged */ - public void onMetadataChanged(MediaMetadata metadata) { - } - - /** Stub method for ISessionControllerCallback.notifyQueueChanged */ - public void onQueueChanged(List queue) { - } - - /** Stub method for ISessionControllerCallback.notifyQueueTitleChanged */ - public void onQueueTitleChanged(CharSequence title) { - } - - /** Stub method for ISessionControllerCallback.notifyExtrasChanged */ - public void onExtrasChanged(Bundle extras) { - } - - /** Stub method for ISessionControllerCallback.notifyVolumeInfoChanged */ - public void onVolumeInfoChanged(int volumeType, AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume) { - } - } - - private class CallbackStubProxy extends ISessionControllerCallback.Stub { - @Override - public void notifyEvent(String event, Bundle extras) { - mCallbackStub.onEvent(event, extras); - } - - @Override - public void notifySessionDestroyed() { - mCallbackStub.onSessionDestroyed(); - } - - @Override - public void notifyPlaybackStateChanged(PlaybackState state) { - mCallbackStub.onPlaybackStateChanged(state); - } - - @Override - public void notifyMetadataChanged(MediaMetadata metadata) { - mCallbackStub.onMetadataChanged(metadata); - } - - @Override - public void notifyQueueChanged(List queue) { - mCallbackStub.onQueueChanged(queue); - } - - @Override - public void notifyQueueTitleChanged(CharSequence title) { - mCallbackStub.onQueueTitleChanged(title); - } - - @Override - public void notifyExtrasChanged(Bundle extras) { - mCallbackStub.onExtrasChanged(extras); - } - - @Override - public void notifyVolumeInfoChanged(int volumeType, AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume) { - mCallbackStub.onVolumeInfoChanged(volumeType, attrs, controlType, maxVolume, - currentVolume); - } - } -} diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index 5cf6dfee3b148..bfc05fa4e3a41 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -16,6 +16,7 @@ package android.media.session; import android.app.PendingIntent; +import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.MediaMetadata; import android.media.session.ISessionController; @@ -40,7 +41,7 @@ interface ISession { // These commands are for the TransportPerformer void setMetadata(in MediaMetadata metadata, long duration, String metadataDescription); void setPlaybackState(in PlaybackState state); - void setQueue(in List queue); + void setQueue(in ParceledListSlice queue); void setQueueTitle(CharSequence title); void setExtras(in Bundle extras); void setRatingType(int type); diff --git a/media/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl index d5549718bb758..626338d97ccb4 100644 --- a/media/java/android/media/session/ISessionCallback.aidl +++ b/media/java/android/media/session/ISessionCallback.aidl @@ -17,7 +17,7 @@ package android.media.session; import android.content.Intent; import android.media.Rating; -import android.media.session.ControllerCallbackLink; +import android.media.session.ISessionControllerCallback; import android.net.Uri; import android.os.Bundle; import android.os.ResultReceiver; @@ -26,46 +26,46 @@ import android.os.ResultReceiver; * @hide */ oneway interface ISessionCallback { - void onCommand(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onCommand(String packageName, int pid, int uid, ISessionControllerCallback caller, String command, in Bundle args, in ResultReceiver cb); void onMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent, int sequenceNumber, in ResultReceiver cb); void onMediaButtonFromController(String packageName, int pid, int uid, - in ControllerCallbackLink caller, in Intent mediaButtonIntent); + ISessionControllerCallback caller, in Intent mediaButtonIntent); // These callbacks are for the TransportPerformer - void onPrepare(String packageName, int pid, int uid, in ControllerCallbackLink caller); + void onPrepare(String packageName, int pid, int uid, ISessionControllerCallback caller); void onPrepareFromMediaId(String packageName, int pid, int uid, - in ControllerCallbackLink caller, String mediaId, in Bundle extras); + ISessionControllerCallback caller, String mediaId, in Bundle extras); void onPrepareFromSearch(String packageName, int pid, int uid, - in ControllerCallbackLink caller, String query, in Bundle extras); - void onPrepareFromUri(String packageName, int pid, int uid, in ControllerCallbackLink caller, + ISessionControllerCallback caller, String query, in Bundle extras); + void onPrepareFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller, in Uri uri, in Bundle extras); - void onPlay(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onPlayFromMediaId(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onPlay(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onPlayFromMediaId(String packageName, int pid, int uid, ISessionControllerCallback caller, String mediaId, in Bundle extras); - void onPlayFromSearch(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onPlayFromSearch(String packageName, int pid, int uid, ISessionControllerCallback caller, String query, in Bundle extras); - void onPlayFromUri(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onPlayFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller, in Uri uri, in Bundle extras); - void onSkipToTrack(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onSkipToTrack(String packageName, int pid, int uid, ISessionControllerCallback caller, long id); - void onPause(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onStop(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onNext(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onPrevious(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onFastForward(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onRewind(String packageName, int pid, int uid, in ControllerCallbackLink caller); - void onSeekTo(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onPause(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onStop(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onNext(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onPrevious(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onFastForward(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onRewind(String packageName, int pid, int uid, ISessionControllerCallback caller); + void onSeekTo(String packageName, int pid, int uid, ISessionControllerCallback caller, long pos); - void onRate(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller, in Rating rating); - void onCustomAction(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onCustomAction(String packageName, int pid, int uid, ISessionControllerCallback caller, String action, in Bundle args); // These callbacks are for volume handling - void onAdjustVolume(String packageName, int pid, int uid, in ControllerCallbackLink caller, + void onAdjustVolume(String packageName, int pid, int uid, ISessionControllerCallback caller, int direction); void onSetVolumeTo(String packageName, int pid, int uid, - in ControllerCallbackLink caller, int value); + ISessionControllerCallback caller, int value); } diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index f0db1b4c62e36..e61bf5b482238 100644 --- a/media/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl @@ -17,9 +17,10 @@ package android.media.session; import android.app.PendingIntent; import android.content.Intent; +import android.content.pm.ParceledListSlice; import android.media.MediaMetadata; import android.media.Rating; -import android.media.session.ControllerCallbackLink; +import android.media.session.ISessionControllerCallback; import android.media.session.MediaSession; import android.media.session.ParcelableVolumeInfo; import android.media.session.PlaybackState; @@ -35,52 +36,53 @@ import java.util.List; * @hide */ interface ISessionController { - void sendCommand(String packageName, in ControllerCallbackLink caller, + void sendCommand(String packageName, ISessionControllerCallback caller, String command, in Bundle args, in ResultReceiver cb); - boolean sendMediaButton(String packageName, in ControllerCallbackLink caller, + boolean sendMediaButton(String packageName, ISessionControllerCallback caller, boolean asSystemService, in KeyEvent mediaButton); - void registerCallbackListener(String packageName, in ControllerCallbackLink cb); - void unregisterCallbackListener(in ControllerCallbackLink cb); + void registerCallbackListener(String packageName, ISessionControllerCallback cb); + void unregisterCallbackListener(ISessionControllerCallback cb); boolean isTransportControlEnabled(); String getPackageName(); String getTag(); PendingIntent getLaunchPendingIntent(); long getFlags(); ParcelableVolumeInfo getVolumeAttributes(); - void adjustVolume(String packageName, String opPackageName, in ControllerCallbackLink caller, - boolean asSystemService, int direction, int flags); - void setVolumeTo(String packageName, String opPackageName, in ControllerCallbackLink caller, + void adjustVolume(String packageName, String opPackageName, + in ISessionControllerCallback caller, boolean asSystemService, int direction, + int flags); + void setVolumeTo(String packageName, String opPackageName, in ISessionControllerCallback caller, int value, int flags); // These commands are for the TransportControls - void prepare(String packageName, in ControllerCallbackLink caller); - void prepareFromMediaId(String packageName, in ControllerCallbackLink caller, + void prepare(String packageName, ISessionControllerCallback caller); + void prepareFromMediaId(String packageName, ISessionControllerCallback caller, String mediaId, in Bundle extras); - void prepareFromSearch(String packageName, in ControllerCallbackLink caller, + void prepareFromSearch(String packageName, ISessionControllerCallback caller, String string, in Bundle extras); - void prepareFromUri(String packageName, in ControllerCallbackLink caller, + void prepareFromUri(String packageName, ISessionControllerCallback caller, in Uri uri, in Bundle extras); - void play(String packageName, in ControllerCallbackLink caller); - void playFromMediaId(String packageName, in ControllerCallbackLink caller, + void play(String packageName, ISessionControllerCallback caller); + void playFromMediaId(String packageName, ISessionControllerCallback caller, String mediaId, in Bundle extras); - void playFromSearch(String packageName, in ControllerCallbackLink caller, + void playFromSearch(String packageName, ISessionControllerCallback caller, String string, in Bundle extras); - void playFromUri(String packageName, in ControllerCallbackLink caller, + void playFromUri(String packageName, ISessionControllerCallback caller, in Uri uri, in Bundle extras); - void skipToQueueItem(String packageName, in ControllerCallbackLink caller, long id); - void pause(String packageName, in ControllerCallbackLink caller); - void stop(String packageName, in ControllerCallbackLink caller); - void next(String packageName, in ControllerCallbackLink caller); - void previous(String packageName, in ControllerCallbackLink caller); - void fastForward(String packageName, in ControllerCallbackLink caller); - void rewind(String packageName, in ControllerCallbackLink caller); - void seekTo(String packageName, in ControllerCallbackLink caller, long pos); - void rate(String packageName, in ControllerCallbackLink caller, in Rating rating); - void sendCustomAction(String packageName, in ControllerCallbackLink caller, + void skipToQueueItem(String packageName, ISessionControllerCallback caller, long id); + void pause(String packageName, ISessionControllerCallback caller); + void stop(String packageName, ISessionControllerCallback caller); + void next(String packageName, ISessionControllerCallback caller); + void previous(String packageName, ISessionControllerCallback caller); + void fastForward(String packageName, ISessionControllerCallback caller); + void rewind(String packageName, ISessionControllerCallback caller); + void seekTo(String packageName, ISessionControllerCallback caller, long pos); + void rate(String packageName, ISessionControllerCallback caller, in Rating rating); + void sendCustomAction(String packageName, ISessionControllerCallback caller, String action, in Bundle args); MediaMetadata getMetadata(); PlaybackState getPlaybackState(); - List getQueue(); + ParceledListSlice getQueue(); CharSequence getQueueTitle(); Bundle getExtras(); int getRatingType(); diff --git a/media/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl index 2f86c6c8df904..cf3176706d7ed 100644 --- a/media/java/android/media/session/ISessionControllerCallback.aidl +++ b/media/java/android/media/session/ISessionControllerCallback.aidl @@ -15,26 +15,25 @@ package android.media.session; -import android.media.AudioAttributes; +import android.content.pm.ParceledListSlice; import android.media.MediaMetadata; -import android.media.session.MediaSession; import android.media.session.ParcelableVolumeInfo; import android.media.session.PlaybackState; +import android.media.session.MediaSession; import android.os.Bundle; /** * @hide */ oneway interface ISessionControllerCallback { - void notifyEvent(String event, in Bundle extras); - void notifySessionDestroyed(); + void onEvent(String event, in Bundle extras); + void onSessionDestroyed(); // These callbacks are for the TransportController - void notifyPlaybackStateChanged(in PlaybackState state); - void notifyMetadataChanged(in MediaMetadata metadata); - void notifyQueueChanged(in List queue); - void notifyQueueTitleChanged(CharSequence title); - void notifyExtrasChanged(in Bundle extras); - void notifyVolumeInfoChanged(int volumeType, in AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume); + void onPlaybackStateChanged(in PlaybackState state); + void onMetadataChanged(in MediaMetadata metadata); + void onQueueChanged(in ParceledListSlice queue); + void onQueueTitleChanged(CharSequence title); + void onExtrasChanged(in Bundle extras); + void onVolumeInfoChanged(in ParcelableVolumeInfo info); } diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 7b061fe8e546d..181ee53275478 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -21,12 +21,12 @@ 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; @@ -70,8 +70,7 @@ public final class MediaController { private final MediaSession.Token mToken; private final Context mContext; - private final ControllerCallbackLink mCbStub = - new ControllerCallbackLink(new CallbackStub(this)); + private final CallbackStub mCbStub = new CallbackStub(this); private final ArrayList mCallbacks = new ArrayList(); private final Object mLock = new Object(); @@ -250,7 +249,10 @@ public final class MediaController { */ public @Nullable List getQueue() { try { - return mSessionBinder.getQueue(); + ParceledListSlice queue = mSessionBinder.getQueue(); + if (queue != null) { + return queue.getList(); + } } catch (RemoteException e) { Log.wtf(TAG, "Error calling getQueue.", e); } @@ -1070,10 +1072,10 @@ public final class MediaController { } } - private static final class CallbackStub extends ControllerCallbackLink.CallbackStub { + private final static class CallbackStub extends ISessionControllerCallback.Stub { private final WeakReference mController; - CallbackStub(MediaController controller) { + public CallbackStub(MediaController controller) { mController = new WeakReference(controller); } @@ -1110,7 +1112,9 @@ public final class MediaController { } @Override - public void onQueueChanged(List queue) { + public void onQueueChanged(ParceledListSlice parceledQueue) { + List queue = parceledQueue == null ? null : parceledQueue + .getList(); MediaController controller = mController.get(); if (controller != null) { controller.postMessage(MSG_UPDATE_QUEUE, queue, null); @@ -1134,15 +1138,15 @@ public final class MediaController { } @Override - public void onVolumeInfoChanged(int volumeType, AudioAttributes attrs, int controlType, - int maxVolume, int currentVolume) { + public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) { MediaController controller = mController.get(); if (controller != null) { - PlaybackInfo info = new PlaybackInfo(volumeType, attrs, controlType, maxVolume, - currentVolume); + 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 { diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 159738e94a1fe..8962bb7fb4c45 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -24,6 +24,7 @@ import android.app.Activity; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.MediaDescription; import android.media.MediaMetadata; @@ -466,7 +467,7 @@ public final class MediaSession { */ public void setQueue(@Nullable List queue) { try { - mBinder.setQueue(queue); + mBinder.setQueue(queue == null ? null : new ParceledListSlice(queue)); } catch (RemoteException e) { Log.wtf("Dead object in setQueue.", e); } @@ -1070,14 +1071,14 @@ public final class MediaSession { } private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { return new RemoteUserInfo(packageName, pid, uid, caller != null ? caller.asBinder() : null); } @Override public void onCommand(String packageName, int pid, int uid, - ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) { + ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchCommand(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1103,7 +1104,7 @@ public final class MediaSession { @Override public void onMediaButtonFromController(String packageName, int pid, int uid, - ControllerCallbackLink caller, Intent mediaButtonIntent) { + ISessionControllerCallback caller, Intent mediaButtonIntent) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1113,7 +1114,7 @@ public final class MediaSession { @Override public void onPrepare(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1122,7 +1123,7 @@ public final class MediaSession { @Override public void onPrepareFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, + ISessionControllerCallback caller, String mediaId, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { @@ -1133,7 +1134,7 @@ public final class MediaSession { @Override public void onPrepareFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, + ISessionControllerCallback caller, String query, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { @@ -1144,7 +1145,7 @@ public final class MediaSession { @Override public void onPrepareFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { + ISessionControllerCallback caller, Uri uri, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPrepareFromUri(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1154,7 +1155,7 @@ public final class MediaSession { @Override public void onPlay(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPlay(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1163,7 +1164,7 @@ public final class MediaSession { @Override public void onPlayFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, + ISessionControllerCallback caller, String mediaId, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { @@ -1174,7 +1175,7 @@ public final class MediaSession { @Override public void onPlayFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, + ISessionControllerCallback caller, String query, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { @@ -1185,7 +1186,7 @@ public final class MediaSession { @Override public void onPlayFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { + ISessionControllerCallback caller, Uri uri, Bundle extras) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPlayFromUri(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1195,7 +1196,7 @@ public final class MediaSession { @Override public void onSkipToTrack(String packageName, int pid, int uid, - ControllerCallbackLink caller, long id) { + ISessionControllerCallback caller, long id) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchSkipToItem(createRemoteUserInfo(packageName, pid, uid, caller), id); @@ -1204,7 +1205,7 @@ public final class MediaSession { @Override public void onPause(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPause(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1213,7 +1214,7 @@ public final class MediaSession { @Override public void onStop(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchStop(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1222,7 +1223,7 @@ public final class MediaSession { @Override public void onNext(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchNext(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1231,7 +1232,7 @@ public final class MediaSession { @Override public void onPrevious(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1240,7 +1241,7 @@ public final class MediaSession { @Override public void onFastForward(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchFastForward(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1249,7 +1250,7 @@ public final class MediaSession { @Override public void onRewind(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchRewind(createRemoteUserInfo(packageName, pid, uid, caller)); @@ -1258,7 +1259,7 @@ public final class MediaSession { @Override public void onSeekTo(String packageName, int pid, int uid, - ControllerCallbackLink caller, long pos) { + ISessionControllerCallback caller, long pos) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchSeekTo(createRemoteUserInfo(packageName, pid, uid, caller), pos); @@ -1266,7 +1267,7 @@ public final class MediaSession { } @Override - public void onRate(String packageName, int pid, int uid, ControllerCallbackLink caller, + public void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller, Rating rating) { MediaSession session = mMediaSession.get(); if (session != null) { @@ -1276,7 +1277,7 @@ public final class MediaSession { @Override public void onCustomAction(String packageName, int pid, int uid, - ControllerCallbackLink caller, String action, Bundle args) { + ISessionControllerCallback caller, String action, Bundle args) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchCustomAction(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1286,7 +1287,7 @@ public final class MediaSession { @Override public void onAdjustVolume(String packageName, int pid, int uid, - ControllerCallbackLink caller, int direction) { + ISessionControllerCallback caller, int direction) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchAdjustVolume(createRemoteUserInfo(packageName, pid, uid, caller), @@ -1296,7 +1297,7 @@ public final class MediaSession { @Override public void onSetVolumeTo(String packageName, int pid, int uid, - ControllerCallbackLink caller, int value) { + ISessionControllerCallback caller, int value) { MediaSession session = mMediaSession.get(); if (session != null) { session.dispatchSetVolumeTo(createRemoteUserInfo(packageName, pid, uid, caller), diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 1d1f6d211c121..139d8ac6a8d56 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -19,6 +19,7 @@ package com.android.server.media; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManagerInternal; @@ -26,14 +27,13 @@ import android.media.AudioSystem; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; -import android.media.session.ControllerCallbackLink; import android.media.session.ISession; import android.media.session.ISessionCallback; import android.media.session.ISessionController; +import android.media.session.ISessionControllerCallback; import android.media.session.MediaController; import android.media.session.MediaController.PlaybackInfo; import android.media.session.MediaSession; -import android.media.session.MediaSession.QueueItem; import android.media.session.ParcelableVolumeInfo; import android.media.session.PlaybackState; import android.net.Uri; @@ -56,7 +56,6 @@ import com.android.server.LocalServices; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.List; /** * This is the system implementation of a Session. Apps will interact with the @@ -86,7 +85,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private final Context mContext; private final Object mLock = new Object(); - private final ArrayList mControllerCallbackHolders = + private final ArrayList mControllerCallbackHolders = new ArrayList<>(); private long mFlags; @@ -99,7 +98,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { // may result in throwing an exception. private MediaMetadata mMetadata; private PlaybackState mPlaybackState; - private List mQueue; + private ParceledListSlice mQueue; private CharSequence mQueueTitle; private int mRatingType; // End TransportPerformer fields @@ -251,7 +250,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { * @param useSuggested True to use adjustSuggestedStreamVolume instead of */ public void adjustVolume(String packageName, String opPackageName, int pid, int uid, - ControllerCallbackLink caller, boolean asSystemService, int direction, int flags, + ISessionControllerCallback caller, boolean asSystemService, int direction, int flags, boolean useSuggested) { int previousFlagPlaySound = flags & AudioManager.FLAG_PLAY_SOUND; if (isPlaybackActive() || hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY)) { @@ -293,7 +292,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } private void setVolumeTo(String packageName, String opPackageName, int pid, int uid, - ControllerCallbackLink caller, int value, int flags) { + ISessionControllerCallback caller, int value, int flags) { if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) { int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs); final int volumeValue = value; @@ -470,7 +469,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { + ", max=" + mMaxVolume + ", current=" + mCurrentVolume); pw.println(indent + "metadata: " + mMetadataDescription); pw.println(indent + "queueTitle=" + mQueueTitle + ", size=" - + (mQueue == null ? 0 : mQueue.size())); + + (mQueue == null ? 0 : mQueue.getList().size())); } @Override @@ -520,7 +519,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } private void logCallbackException( - String msg, ControllerCallbackLinkHolder holder, Exception e) { + String msg, ISessionControllerCallbackHolder holder, Exception e) { Log.v(TAG, msg + ", this=" + this + ", callback package=" + holder.mPackageName + ", exception=" + e); } @@ -531,18 +530,16 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyPlaybackStateChanged(mPlaybackState); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushPlaybackStateUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushPlaybackStateUpdate", - holder, e); - } + holder.mCallback.onPlaybackStateChanged(mPlaybackState); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removed dead callback in pushPlaybackStateUpdate", + holder, e); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushPlaybackStateUpdate", + holder, e); } } } @@ -554,18 +551,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyMetadataChanged(mMetadata); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushMetadataUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushMetadataUpdate", - holder, e); - } + holder.mCallback.onMetadataChanged(mMetadata); + } catch (DeadObjectException e) { + logCallbackException("Removing dead callback in pushMetadataUpdate", holder, e); + mControllerCallbackHolders.remove(i); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushMetadataUpdate", holder, e); } } } @@ -577,17 +570,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyQueueChanged(mQueue); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushQueueUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushQueueUpdate", holder, e); - } + holder.mCallback.onQueueChanged(mQueue); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removed dead callback in pushQueueUpdate", holder, e); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushQueueUpdate", holder, e); } } } @@ -599,18 +589,16 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyQueueTitleChanged(mQueueTitle); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushQueueTitleUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushQueueTitleUpdate", - holder, e); - } + holder.mCallback.onQueueTitleChanged(mQueueTitle); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removed dead callback in pushQueueTitleUpdate", + holder, e); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushQueueTitleUpdate", + holder, e); } } } @@ -622,17 +610,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyExtrasChanged(mExtras); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushExtrasUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushExtrasUpdate", holder, e); - } + holder.mCallback.onExtrasChanged(mExtras); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removed dead callback in pushExtrasUpdate", holder, e); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushExtrasUpdate", holder, e); } } } @@ -645,18 +630,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } ParcelableVolumeInfo info = mController.getVolumeAttributes(); for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyVolumeInfoChanged(info.volumeType, info.audioAttrs, - info.controlType, info.maxVolume, info.currentVolume); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushVolumeUpdate", - holder, e); - } else { - logCallbackException("unexpected exception in pushVolumeUpdate", holder, e); - } + holder.mCallback.onVolumeInfoChanged(info); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removing dead callback in pushVolumeUpdate", holder, e); + } catch (RemoteException e) { + logCallbackException("Unexpected exception in pushVolumeUpdate", holder, e); } } } @@ -668,16 +649,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifyEvent(event, data); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushEvent", holder, e); - } else { - logCallbackException("unexpected exception in pushEvent", holder, e); - } + holder.mCallback.onEvent(event, data); + } catch (DeadObjectException e) { + mControllerCallbackHolders.remove(i); + logCallbackException("Removing dead callback in pushEvent", holder, e); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushEvent", holder, e); } } } @@ -691,18 +670,14 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return; } for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { - ControllerCallbackLinkHolder holder = mControllerCallbackHolders.get(i); + ISessionControllerCallbackHolder holder = mControllerCallbackHolders.get(i); try { - holder.mCallback.notifySessionDestroyed(); - } catch (RuntimeException e) { - if (e.getCause() instanceof DeadObjectException) { - mControllerCallbackHolders.remove(i); - logCallbackException("Removing dead callback in pushSessionDestroyed", - holder, e); - } else { - logCallbackException("unexpected exception in pushSessionDestroyed", - holder, e); - } + holder.mCallback.onSessionDestroyed(); + } catch (DeadObjectException e) { + logCallbackException("Removing dead callback in pushEvent", holder, e); + mControllerCallbackHolders.remove(i); + } catch (RemoteException e) { + logCallbackException("unexpected exception in pushEvent", holder, e); } } // After notifying clear all listeners @@ -742,7 +717,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return result == null ? state : result; } - private int getControllerHolderIndexForCb(ControllerCallbackLink cb) { + private int getControllerHolderIndexForCb(ISessionControllerCallback cb) { IBinder binder = cb.asBinder(); for (int i = mControllerCallbackHolders.size() - 1; i >= 0; i--) { if (binder.equals(mControllerCallbackHolders.get(i).mCallback.asBinder())) { @@ -869,7 +844,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void setQueue(List queue) { + public void setQueue(ParceledListSlice queue) { synchronized (mLock) { mQueue = queue; } @@ -970,7 +945,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public boolean sendMediaButton(String packageName, int pid, int uid, - ControllerCallbackLink caller, boolean asSystemService, + ISessionControllerCallback caller, boolean asSystemService, KeyEvent keyEvent) { try { if (asSystemService) { @@ -988,7 +963,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void sendCommand(String packageName, int pid, int uid, - ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) { + ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) { try { mCb.onCommand(packageName, pid, uid, caller, command, args, cb); } catch (RemoteException e) { @@ -997,7 +972,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void sendCustomAction(String packageName, int pid, int uid, - ControllerCallbackLink caller, String action, + ISessionControllerCallback caller, String action, Bundle args) { try { mCb.onCustomAction(packageName, pid, uid, caller, action, args); @@ -1007,7 +982,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void prepare(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { try { mCb.onPrepare(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1016,7 +991,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void prepareFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, Bundle extras) { + ISessionControllerCallback caller, String mediaId, Bundle extras) { try { mCb.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras); } catch (RemoteException e) { @@ -1025,7 +1000,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void prepareFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, Bundle extras) { + ISessionControllerCallback caller, String query, Bundle extras) { try { mCb.onPrepareFromSearch(packageName, pid, uid, caller, query, extras); } catch (RemoteException e) { @@ -1034,7 +1009,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void prepareFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { + ISessionControllerCallback caller, Uri uri, Bundle extras) { try { mCb.onPrepareFromUri(packageName, pid, uid, caller, uri, extras); } catch (RemoteException e) { @@ -1042,7 +1017,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void play(String packageName, int pid, int uid, ControllerCallbackLink caller) { + public void play(String packageName, int pid, int uid, ISessionControllerCallback caller) { try { mCb.onPlay(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1051,7 +1026,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void playFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, Bundle extras) { + ISessionControllerCallback caller, String mediaId, Bundle extras) { try { mCb.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras); } catch (RemoteException e) { @@ -1060,7 +1035,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void playFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, Bundle extras) { + ISessionControllerCallback caller, String query, Bundle extras) { try { mCb.onPlayFromSearch(packageName, pid, uid, caller, query, extras); } catch (RemoteException e) { @@ -1069,7 +1044,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void playFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { + ISessionControllerCallback caller, Uri uri, Bundle extras) { try { mCb.onPlayFromUri(packageName, pid, uid, caller, uri, extras); } catch (RemoteException e) { @@ -1078,7 +1053,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void skipToTrack(String packageName, int pid, int uid, - ControllerCallbackLink caller, long id) { + ISessionControllerCallback caller, long id) { try { mCb.onSkipToTrack(packageName, pid, uid, caller, id); } catch (RemoteException e) { @@ -1086,7 +1061,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void pause(String packageName, int pid, int uid, ControllerCallbackLink caller) { + public void pause(String packageName, int pid, int uid, ISessionControllerCallback caller) { try { mCb.onPause(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1094,7 +1069,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void stop(String packageName, int pid, int uid, ControllerCallbackLink caller) { + public void stop(String packageName, int pid, int uid, ISessionControllerCallback caller) { try { mCb.onStop(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1102,7 +1077,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void next(String packageName, int pid, int uid, ControllerCallbackLink caller) { + public void next(String packageName, int pid, int uid, ISessionControllerCallback caller) { try { mCb.onNext(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1111,7 +1086,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void previous(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { try { mCb.onPrevious(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1120,7 +1095,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void fastForward(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { try { mCb.onFastForward(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1129,7 +1104,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void rewind(String packageName, int pid, int uid, - ControllerCallbackLink caller) { + ISessionControllerCallback caller) { try { mCb.onRewind(packageName, pid, uid, caller); } catch (RemoteException e) { @@ -1137,7 +1112,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void seekTo(String packageName, int pid, int uid, ControllerCallbackLink caller, + public void seekTo(String packageName, int pid, int uid, ISessionControllerCallback caller, long pos) { try { mCb.onSeekTo(packageName, pid, uid, caller, pos); @@ -1146,7 +1121,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - public void rate(String packageName, int pid, int uid, ControllerCallbackLink caller, + public void rate(String packageName, int pid, int uid, ISessionControllerCallback caller, Rating rating) { try { mCb.onRate(packageName, pid, uid, caller, rating); @@ -1156,7 +1131,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void adjustVolume(String packageName, int pid, int uid, - ControllerCallbackLink caller, boolean asSystemService, int direction) { + ISessionControllerCallback caller, boolean asSystemService, int direction) { try { if (asSystemService) { mCb.onAdjustVolume(mContext.getPackageName(), Process.myPid(), @@ -1170,7 +1145,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void setVolumeTo(String packageName, int pid, int uid, - ControllerCallbackLink caller, int value) { + ISessionControllerCallback caller, int value) { try { mCb.onSetVolumeTo(packageName, pid, uid, caller, value); } catch (RemoteException e) { @@ -1187,34 +1162,34 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { class ControllerStub extends ISessionController.Stub { @Override - public void sendCommand(String packageName, ControllerCallbackLink caller, + public void sendCommand(String packageName, ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) { mSessionCb.sendCommand(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, command, args, cb); } @Override - public boolean sendMediaButton(String packageName, ControllerCallbackLink cb, + public boolean sendMediaButton(String packageName, ISessionControllerCallback cb, boolean asSystemService, KeyEvent keyEvent) { return mSessionCb.sendMediaButton(packageName, Binder.getCallingPid(), Binder.getCallingUid(), cb, asSystemService, keyEvent); } @Override - public void registerCallbackListener(String packageName, ControllerCallbackLink cb) { + public void registerCallbackListener(String packageName, ISessionControllerCallback cb) { synchronized (mLock) { // If this session is already destroyed tell the caller and // don't add them. if (mDestroyed) { try { - cb.notifySessionDestroyed(); + cb.onSessionDestroyed(); } catch (Exception e) { // ignored } return; } if (getControllerHolderIndexForCb(cb) < 0) { - mControllerCallbackHolders.add(new ControllerCallbackLinkHolder(cb, + mControllerCallbackHolders.add(new ISessionControllerCallbackHolder(cb, packageName, Binder.getCallingUid())); if (DEBUG) { Log.d(TAG, "registering controller callback " + cb + " from controller" @@ -1225,7 +1200,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void unregisterCallbackListener(ControllerCallbackLink cb) { + public void unregisterCallbackListener(ISessionControllerCallback cb) { synchronized (mLock) { int index = getControllerHolderIndexForCb(cb); if (index != -1) { @@ -1279,7 +1254,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { @Override public void adjustVolume(String packageName, String opPackageName, - ControllerCallbackLink caller, boolean asSystemService, int direction, int flags) { + ISessionControllerCallback caller, boolean asSystemService, int direction, + int flags) { int pid = Binder.getCallingPid(); int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); @@ -1293,7 +1269,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { @Override public void setVolumeTo(String packageName, String opPackageName, - ControllerCallbackLink caller, int value, int flags) { + ISessionControllerCallback caller, int value, int flags) { int pid = Binder.getCallingPid(); int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); @@ -1306,110 +1282,110 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void prepare(String packageName, ControllerCallbackLink caller) { + public void prepare(String packageName, ISessionControllerCallback caller) { mSessionCb.prepare(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void prepareFromMediaId(String packageName, ControllerCallbackLink caller, + public void prepareFromMediaId(String packageName, ISessionControllerCallback caller, String mediaId, Bundle extras) { mSessionCb.prepareFromMediaId(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, mediaId, extras); } @Override - public void prepareFromSearch(String packageName, ControllerCallbackLink caller, + public void prepareFromSearch(String packageName, ISessionControllerCallback caller, String query, Bundle extras) { mSessionCb.prepareFromSearch(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, query, extras); } @Override - public void prepareFromUri(String packageName, ControllerCallbackLink caller, + public void prepareFromUri(String packageName, ISessionControllerCallback caller, Uri uri, Bundle extras) { mSessionCb.prepareFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, uri, extras); } @Override - public void play(String packageName, ControllerCallbackLink caller) { + public void play(String packageName, ISessionControllerCallback caller) { mSessionCb.play(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void playFromMediaId(String packageName, ControllerCallbackLink caller, + public void playFromMediaId(String packageName, ISessionControllerCallback caller, String mediaId, Bundle extras) { mSessionCb.playFromMediaId(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, mediaId, extras); } @Override - public void playFromSearch(String packageName, ControllerCallbackLink caller, + public void playFromSearch(String packageName, ISessionControllerCallback caller, String query, Bundle extras) { mSessionCb.playFromSearch(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, query, extras); } @Override - public void playFromUri(String packageName, ControllerCallbackLink caller, + public void playFromUri(String packageName, ISessionControllerCallback caller, Uri uri, Bundle extras) { mSessionCb.playFromUri(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, uri, extras); } @Override - public void skipToQueueItem(String packageName, ControllerCallbackLink caller, + public void skipToQueueItem(String packageName, ISessionControllerCallback caller, long id) { mSessionCb.skipToTrack(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, id); } @Override - public void pause(String packageName, ControllerCallbackLink caller) { + public void pause(String packageName, ISessionControllerCallback caller) { mSessionCb.pause(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void stop(String packageName, ControllerCallbackLink caller) { + public void stop(String packageName, ISessionControllerCallback caller) { mSessionCb.stop(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void next(String packageName, ControllerCallbackLink caller) { + public void next(String packageName, ISessionControllerCallback caller) { mSessionCb.next(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void previous(String packageName, ControllerCallbackLink caller) { + public void previous(String packageName, ISessionControllerCallback caller) { mSessionCb.previous(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void fastForward(String packageName, ControllerCallbackLink caller) { + public void fastForward(String packageName, ISessionControllerCallback caller) { mSessionCb.fastForward(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void rewind(String packageName, ControllerCallbackLink caller) { + public void rewind(String packageName, ISessionControllerCallback caller) { mSessionCb.rewind(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller); } @Override - public void seekTo(String packageName, ControllerCallbackLink caller, long pos) { + public void seekTo(String packageName, ISessionControllerCallback caller, long pos) { mSessionCb.seekTo(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, pos); } @Override - public void rate(String packageName, ControllerCallbackLink caller, Rating rating) { + public void rate(String packageName, ISessionControllerCallback caller, Rating rating) { mSessionCb.rate(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, rating); } @Override - public void sendCustomAction(String packageName, ControllerCallbackLink caller, + public void sendCustomAction(String packageName, ISessionControllerCallback caller, String action, Bundle args) { mSessionCb.sendCustomAction(packageName, Binder.getCallingPid(), Binder.getCallingUid(), caller, action, args); @@ -1428,7 +1404,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public List getQueue() { + public ParceledListSlice getQueue() { synchronized (mLock) { return mQueue; } @@ -1457,12 +1433,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - private class ControllerCallbackLinkHolder { - private final ControllerCallbackLink mCallback; + private class ISessionControllerCallbackHolder { + private final ISessionControllerCallback mCallback; private final String mPackageName; private final int mUid; - ControllerCallbackLinkHolder(ControllerCallbackLink callback, String packageName, + ISessionControllerCallbackHolder(ISessionControllerCallback callback, String packageName, int uid) { mCallback = callback; mPackageName = packageName;