Merge "Limit RemoteControlClient generation ID changes" into klp-dev

This commit is contained in:
Jean-Michel Trivi
2013-10-25 20:41:39 +00:00
committed by Android (Google) Code Review

View File

@@ -1476,16 +1476,17 @@ public class MediaFocusControl implements OnFinished {
* Set the new remote control receiver at the top of the RC focus stack.
* Called synchronized on mAudioFocusLock, then mRCStack
* precondition: mediaIntent != null
* @return true if mRCStack was changed, false otherwise
*/
private void pushMediaButtonReceiver_syncAfRcs(PendingIntent mediaIntent, ComponentName target,
IBinder token) {
private boolean pushMediaButtonReceiver_syncAfRcs(PendingIntent mediaIntent,
ComponentName target, IBinder token) {
// already at top of stack?
if (!mRCStack.empty() && mRCStack.peek().mMediaIntent.equals(mediaIntent)) {
return;
return false;
}
if (mAppOps.noteOp(AppOpsManager.OP_TAKE_MEDIA_BUTTONS, Binder.getCallingUid(),
mediaIntent.getCreatorPackage()) != AppOpsManager.MODE_ALLOWED) {
return;
return false;
}
RemoteControlStackEntry rcse = null;
boolean wasInsideStack = false;
@@ -1513,6 +1514,9 @@ public class MediaFocusControl implements OnFinished {
mEventHandler.sendMessage( mEventHandler.obtainMessage(
MSG_PERSIST_MEDIABUTTONRECEIVER, 0, 0, target/*obj*/) );
}
// RC stack was modified
return true;
}
/**
@@ -1856,9 +1860,10 @@ public class MediaFocusControl implements OnFinished {
synchronized(mAudioFocusLock) {
synchronized(mRCStack) {
pushMediaButtonReceiver_syncAfRcs(mediaIntent, eventReceiver, token);
// new RC client, assume every type of information shall be queried
checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL);
if (pushMediaButtonReceiver_syncAfRcs(mediaIntent, eventReceiver, token)) {
// new RC client, assume every type of information shall be queried
checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL);
}
}
}
}
@@ -1925,6 +1930,7 @@ public class MediaFocusControl implements OnFinished {
int rccId = RemoteControlClient.RCSE_ID_UNREGISTERED;
synchronized(mAudioFocusLock) {
synchronized(mRCStack) {
boolean wasCurrentRcController = isCurrentRcController(mediaIntent);
// store the new display information
try {
for (int index = mRCStack.size()-1; index >= 0; index--) {
@@ -1971,9 +1977,9 @@ public class MediaFocusControl implements OnFinished {
Log.e(TAG, "Wrong index accessing RC stack, lock error? ", e);
}
// if the eventReceiver is at the top of the stack
// if the eventReceiver is now at the top of the stack but wasn't before
// then check for potential refresh of the remote controls
if (isCurrentRcController(mediaIntent)) {
if (isCurrentRcController(mediaIntent) && !wasCurrentRcController) {
checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL);
}
}//synchronized(mRCStack)