diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2011-08-09 19:12:36 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2011-08-11 10:50:43 -0700 |
commit | b5f04d6dbf5106140df367ae07f0e7708e1b650e (patch) | |
tree | 18cc3deda2348252ef3efc1c700baaf935a0f120 /media/java | |
parent | 27dca78ec1bd7b789226524dcda4fa5a5a2a8544 (diff) | |
download | frameworks_base-b5f04d6dbf5106140df367ae07f0e7708e1b650e.zip frameworks_base-b5f04d6dbf5106140df367ae07f0e7708e1b650e.tar.gz frameworks_base-b5f04d6dbf5106140df367ae07f0e7708e1b650e.tar.bz2 |
Pass flags on remote control client information change in intent
Pass the flags about what information changed in the remote
control client in the intent used by the remote control display.
Also pass the IRemoteControlClient to verify it is still current
before sending the intent.
Marked some logs as to be removed before release.
Change-Id: Ib3aa22d061e5dfaf80a9c4c78774c931a2cf0fbd
Diffstat (limited to 'media/java')
-rw-r--r-- | media/java/android/media/AudioManager.java | 30 | ||||
-rw-r--r-- | media/java/android/media/AudioService.java | 73 | ||||
-rw-r--r-- | media/java/android/media/IAudioService.aidl | 2 |
3 files changed, 35 insertions, 70 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index e613523..da7a050 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1777,27 +1777,6 @@ public class AudioManager { /** * @hide - * Returns the current remote control client flags describing what information has changed. - * The flags are reset everytime this method is called with a valid rcClientId. - * @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 "information changed" flags from the current IRemoteControlClient from - * which information to display on the remote control can be retrieved, - * or 0 if rcClientId doesn't match the current generation counter. - */ - public int getRemoteControlClientInformationChangedFlags(int rcClientId) { - IAudioService service = getService(); - try { - return service.getRemoteControlClientInformationChangedFlags(rcClientId); - } catch (RemoteException e) { - Log.e(TAG, "Dead object in getRemoteControlClientInformationChangedFlags "+e); - return 0; - } - } - - /** - * @hide * Definitions of constants to be used in {@link android.media.IRemoteControlClient}. */ public final class RemoteControlParameters { @@ -1848,6 +1827,15 @@ public class AudioManager { /** * @hide + * The flags describing what information has changed in the current remote control client. + * + * @see #REMOTE_CONTROL_CLIENT_CHANGED_ACTION + */ + public static final String EXTRA_REMOTE_CONTROL_CLIENT_INFO_CHANGED = + "android.media.EXTRA_REMOTE_CONTROL_CLIENT_INFO_CHANGED"; + + /** + * @hide * Notifies the users of the associated remote control client that the information to display * has changed. @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index b1b11a2..8ebb07c 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -2157,6 +2157,7 @@ public class AudioService extends IAudioService.Stub { break; case MSG_RCDISPLAY_CLEAR: + // TODO remove log before release Log.i(TAG, "Clear remote control display"); Intent clearIntent = new Intent(AudioManager.REMOTE_CONTROL_CLIENT_CHANGED); // no extra means no IRemoteControlClient, which is a request to clear @@ -2166,17 +2167,22 @@ public class AudioService extends IAudioService.Stub { case MSG_RCDISPLAY_UPDATE: synchronized(mCurrentRcLock) { - if (mCurrentRcClient == null) { + if ((mCurrentRcClient == null) || + (!mCurrentRcClient.equals((IRemoteControlClient)msg.obj))) { // the remote control display owner has changed between the // the message to update the display was sent, and the time it // gets to be processed (now) } else { mCurrentRcClientGen++; + // TODO remove log before release Log.i(TAG, "Display/update remote control "); Intent rcClientIntent = new Intent( AudioManager.REMOTE_CONTROL_CLIENT_CHANGED); rcClientIntent.putExtra(AudioManager.EXTRA_REMOTE_CONTROL_CLIENT, mCurrentRcClientGen); + rcClientIntent.putExtra( + AudioManager.EXTRA_REMOTE_CONTROL_CLIENT_INFO_CHANGED, + msg.arg1); rcClientIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); mContext.sendBroadcast(rcClientIntent); } @@ -2630,7 +2636,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { - checkUpdateRemoteControlDisplay(); + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } } } else { @@ -2672,7 +2678,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { - checkUpdateRemoteControlDisplay(); + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } } } @@ -2764,7 +2770,7 @@ public class AudioService extends IAudioService.Stub { // there's a new top of the stack, let the remote control know synchronized(mRCStack) { - checkUpdateRemoteControlDisplay(); + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } }//synchronized(mAudioFocusLock) @@ -2868,12 +2874,6 @@ public class AudioService extends IAudioService.Stub { AudioManager.RemoteControlParameters.FLAG_INFORMATION_CHANGED_PLAYSTATE; /** - * The flags indicating what type of information changed since the last time it was queried. - * Access protected by mCurrentRcLock. - */ - private int mCurrentRcClientInfoFlags = RC_INFO_ALL; - - /** * A monotonically increasing generation counter for mCurrentRcClient. * Only accessed with a lock on mCurrentRcLock. * No value wrap-around issues as we only act on equal values. @@ -2900,27 +2900,6 @@ public class AudioService extends IAudioService.Stub { } /** - * Returns the current flags of information that changed on the current remote control client. - * Requesting this information clears it. - * @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 flags indicating which type of information changed since the client notified - * that its information had changed. - */ - public int getRemoteControlClientInformationChangedFlags(int rcClientId) { - synchronized(mCurrentRcLock) { - if (rcClientId == mCurrentRcClientGen) { - int flags = mCurrentRcClientInfoFlags; - mCurrentRcClientInfoFlags = RC_INFO_NONE; - return flags; - } else { - return RC_INFO_NONE; - } - } - } - - /** * Inner class to monitor remote control client deaths, and remove the client for the * remote control stack if necessary. */ @@ -3113,7 +3092,6 @@ public class AudioService extends IAudioService.Stub { private void clearRemoteControlDisplay() { synchronized(mCurrentRcLock) { mCurrentRcClient = null; - mCurrentRcClientInfoFlags = RC_INFO_NONE; } mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_CLEAR) ); } @@ -3123,8 +3101,9 @@ public class AudioService extends IAudioService.Stub { * Called synchronized on mRCStack * mRCStack.empty() is false */ - private void updateRemoteControlDisplay() { + private void updateRemoteControlDisplay(int infoChangedFlags) { RemoteControlStackEntry rcse = mRCStack.peek(); + int infoFlagsAboutToBeUsed = infoChangedFlags; // this is where we enforce opt-in for information display on the remote controls // with the new AudioManager.registerRemoteControlClient() API if (rcse.mRcClient == null) { @@ -3135,19 +3114,23 @@ public class AudioService extends IAudioService.Stub { synchronized(mCurrentRcLock) { if (!rcse.mRcClient.equals(mCurrentRcClient)) { // new RC client, assume every type of information shall be queried - mCurrentRcClientInfoFlags = RC_INFO_ALL; + infoFlagsAboutToBeUsed = RC_INFO_ALL; } mCurrentRcClient = rcse.mRcClient; } - mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_UPDATE, 0, 0, rcse) ); + mAudioHandler.sendMessage( mAudioHandler.obtainMessage(MSG_RCDISPLAY_UPDATE, + infoFlagsAboutToBeUsed /* arg1 */, 0, rcse.mRcClient /* obj */) ); } /** * Helper function: * Called synchronized on mFocusLock, then mRCStack * Check whether the remote control display should be updated, triggers the update if required + * @param infoChangedFlags the flags corresponding to the remote control client information + * that has changed, if applicable (checking for the update conditions might trigger a + * clear, rather than an update event). */ - private void checkUpdateRemoteControlDisplay() { + private void checkUpdateRemoteControlDisplay(int infoChangedFlags) { // determine whether the remote control display should be refreshed // if either stack is empty, there is a mismatch, so clear the RC display if (mRCStack.isEmpty() || mFocusStack.isEmpty()) { @@ -3169,7 +3152,7 @@ public class AudioService extends IAudioService.Stub { return; } // refresh conditions were verified: update the remote controls - updateRemoteControlDisplay(); + updateRemoteControlDisplay(infoChangedFlags); } /** see AudioManager.registerMediaButtonEventReceiver(ComponentName eventReceiver) */ @@ -3179,7 +3162,8 @@ public class AudioService extends IAudioService.Stub { synchronized(mAudioFocusLock) { synchronized(mRCStack) { pushMediaButtonReceiver(eventReceiver); - checkUpdateRemoteControlDisplay(); + // new RC client, assume every type of information shall be queried + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } } } @@ -3193,7 +3177,8 @@ public class AudioService extends IAudioService.Stub { boolean topOfStackWillChange = isCurrentRcController(eventReceiver); removeMediaButtonReceiver(eventReceiver); if (topOfStackWillChange) { - checkUpdateRemoteControlDisplay(); + // current RC client will change, assume every type of info needs to be queried + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } } } @@ -3239,7 +3224,7 @@ public class AudioService extends IAudioService.Stub { // if the eventReceiver is at the top of the stack // then check for potential refresh of the remote controls if (isCurrentRcController(eventReceiver)) { - checkUpdateRemoteControlDisplay(); + checkUpdateRemoteControlDisplay(RC_INFO_ALL); } } } @@ -3251,13 +3236,7 @@ public class AudioService extends IAudioService.Stub { synchronized(mRCStack) { // only refresh if the eventReceiver is at the top of the stack if (isCurrentRcController(eventReceiver)) { - // there is a refresh request for the current event receiver: it might not be - // displayed on the remote control display, but we can cache what new - // information has changed. - synchronized(mCurrentRcLock) { - mCurrentRcClientInfoFlags |= infoFlag; - } - checkUpdateRemoteControlDisplay(); + checkUpdateRemoteControlDisplay(infoFlag); } } } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 1061f13..c259aa3 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -95,8 +95,6 @@ interface IAudioService { IRemoteControlClient getRemoteControlClient(in int rcClientId); - int getRemoteControlClientInformationChangedFlags(in int rcClientId); - void notifyRemoteControlInformationChanged(in ComponentName eventReceiver, int infoFlag); void startBluetoothSco(IBinder cb); |