Merge "Bug 5045498 Force display update when display registers"
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index dbe4115..bfc6b5d 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -2637,7 +2637,7 @@
notifyTopOfAudioFocusStack();
// there's a new top of the stack, let the remote control know
synchronized(mRCStack) {
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}
} else {
@@ -2680,7 +2680,7 @@
notifyTopOfAudioFocusStack();
// there's a new top of the stack, let the remote control know
synchronized(mRCStack) {
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}
}
@@ -2784,7 +2784,7 @@
// there's a new top of the stack, let the remote control know
synchronized(mRCStack) {
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}//synchronized(mAudioFocusLock)
@@ -3182,7 +3182,7 @@
* Helper function:
* Called synchronized on mRCStack
*/
- private void clearRemoteControlDisplay() {
+ private void clearRemoteControlDisplay_syncRcs() {
synchronized(mCurrentRcLock) {
mCurrentRcClient = null;
}
@@ -3195,14 +3195,14 @@
* Called synchronized on mRCStack
* mRCStack.empty() is false
*/
- private void updateRemoteControlDisplay(int infoChangedFlags) {
+ private void updateRemoteControlDisplay_syncRcs(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) {
//Log.w(TAG, "Can't update remote control display with null remote control client");
- clearRemoteControlDisplay();
+ clearRemoteControlDisplay_syncRcs();
return;
}
synchronized(mCurrentRcLock) {
@@ -3225,11 +3225,11 @@
* that has changed, if applicable (checking for the update conditions might trigger a
* clear, rather than an update event).
*/
- private void checkUpdateRemoteControlDisplay(int infoChangedFlags) {
+ private void checkUpdateRemoteControlDisplay_syncRcs(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()) {
- clearRemoteControlDisplay();
+ clearRemoteControlDisplay_syncRcs();
return;
}
// if the top of the two stacks belong to different packages, there is a mismatch, clear
@@ -3237,17 +3237,17 @@
&& (mFocusStack.peek().mPackageName != null)
&& !(mRCStack.peek().mCallingPackageName.compareTo(
mFocusStack.peek().mPackageName) == 0)) {
- clearRemoteControlDisplay();
+ clearRemoteControlDisplay_syncRcs();
return;
}
// if the audio focus didn't originate from the same Uid as the one in which the remote
// control information will be retrieved, clear
if (mRCStack.peek().mCallingUid != mFocusStack.peek().mCallingUid) {
- clearRemoteControlDisplay();
+ clearRemoteControlDisplay_syncRcs();
return;
}
// refresh conditions were verified: update the remote controls
- updateRemoteControlDisplay(infoChangedFlags);
+ updateRemoteControlDisplay_syncRcs(infoChangedFlags);
}
/** see AudioManager.registerMediaButtonEventReceiver(ComponentName eventReceiver) */
@@ -3258,7 +3258,7 @@
synchronized(mRCStack) {
pushMediaButtonReceiver(eventReceiver);
// new RC client, assume every type of information shall be queried
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}
}
@@ -3273,7 +3273,7 @@
removeMediaButtonReceiver(eventReceiver);
if (topOfStackWillChange) {
// current RC client will change, assume every type of info needs to be queried
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}
}
@@ -3329,7 +3329,7 @@
// if the eventReceiver is at the top of the stack
// then check for potential refresh of the remote controls
if (isCurrentRcController(eventReceiver)) {
- checkUpdateRemoteControlDisplay(RC_INFO_ALL);
+ checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}
}
@@ -3426,7 +3426,9 @@
}
/**
- * Register an IRemoteControlDisplay and notify all IRemoteControlClient of the new display.
+ * Register an IRemoteControlDisplay.
+ * Notify all IRemoteControlClient of the new display and cause the RemoteControlClient
+ * at the top of the stack to update the new display with its information.
* Since only one IRemoteControlDisplay is supported, this will unregister the previous display.
* @param rcd the IRemoteControlDisplay to register. No effect if null.
*/
@@ -3458,20 +3460,8 @@
}
}
- // we have a new display, tell the current client that it needs to send info
- // (following lock order: mRCStack then mCurrentRcLock)
- synchronized(mCurrentRcLock) {
- if (mCurrentRcClient != null) {
- // tell the current client that it needs to send info
- try {
- mCurrentRcClient.onInformationRequested(mCurrentRcClientGen,
- RC_INFO_ALL, mArtworkExpectedWidth, mArtworkExpectedHeight);
- } catch (RemoteException e) {
- Log.e(TAG, "Current valid remote client is dead: "+e);
- mCurrentRcClient = null;
- }
- }
- }
+ // we have a new display, of which all the clients are now aware: have it be updated
+ updateRemoteControlDisplay_syncRcs(RC_INFO_ALL);
}
}