From ced110ec5970c632f523dfc0350b6071461ea9bc Mon Sep 17 00:00:00 2001 From: Neel Parekh Date: Fri, 5 Aug 2011 14:32:49 -0700 Subject: [PATCH] Make retrieving remote control client go through binder interface The way the old way worked relied on the process retrieving the current remote control client to be in the exact same process as the AudioService. This removes that dependency. Change-Id: I1ba8bf32b61ec1e979ef7eee9661ba801aa19690 --- media/java/android/media/AudioManager.java | 20 ++++++++++++++++++++ media/java/android/media/AudioService.java | 8 ++++---- media/java/android/media/IAudioService.aidl | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index e7a306b78028b..ed6d87e423f43 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1755,6 +1755,26 @@ public class AudioManager { } } + /** + * @hide + * Returns the current remote control client. + * @param rcClientId the counter value that matches the extra + * {@link AudioManager#EXTRA_REMOTE_CONTROL_CLIENT} in the + * {@link AudioManager#REMOTE_CONTROL_CLIENT_CHANGED} event + * @return the current IRemoteControlClient from which information to display on the remote + * control can be retrieved, or null if rcClientId doesn't match the current generation + * counter. + */ + public IRemoteControlClient getRemoteControlClient(int rcClientId) { + IAudioService service = getService(); + try { + return service.getRemoteControlClient(rcClientId); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in getRemoteControlClient "+e); + return null; + } + } + /** * @hide * Definitions of constants to be used in {@link android.media.IRemoteControlClient}. diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index bf1585dceed30..cb56bc6a68cf6 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -2845,20 +2845,20 @@ public class AudioService extends IAudioService.Stub { } } - private final static Object mCurrentRcLock = new Object(); + private final Object mCurrentRcLock = new Object(); /** * The one remote control client to be polled for display information. * This object is never null, but its reference might. * Access protected by mCurrentRcLock. */ - private static SoftReference mCurrentRcClientRef = + private SoftReference mCurrentRcClientRef = new SoftReference(null); /** * A monotonically increasing generation counter for mCurrentRcClientRef. * Only accessed with a lock on mCurrentRcLock. */ - private static int mCurrentRcClientGen = 0; + private int mCurrentRcClientGen = 0; /** * Returns the current remote control client. @@ -2869,7 +2869,7 @@ public class AudioService extends IAudioService.Stub { * control can be retrieved, or null if rcClientId doesn't match the current generation * counter. */ - public static IRemoteControlClient getRemoteControlClient(int rcClientId) { + public IRemoteControlClient getRemoteControlClient(int rcClientId) { synchronized(mCurrentRcLock) { if (rcClientId == mCurrentRcClientGen) { return mCurrentRcClientRef.get(); diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 9afe55326e68a..25b9a1b352347 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -93,6 +93,8 @@ interface IAudioService { void registerRemoteControlClient(in ComponentName eventReceiver, in IRemoteControlClient rcClient, in String callingPackageName); + IRemoteControlClient getRemoteControlClient(in int rcClientId); + void notifyRemoteControlInformationChanged(in ComponentName eventReceiver); void startBluetoothSco(IBinder cb);