Loading media/java/android/media/AudioService.java +47 −43 Original line number Diff line number Diff line Loading @@ -2638,7 +2638,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } else { Loading Loading @@ -2681,7 +2681,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading Loading @@ -2785,7 +2785,7 @@ public class AudioService extends IAudioService.Stub { // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } }//synchronized(mAudioFocusLock) Loading Loading @@ -3183,7 +3183,7 @@ public class AudioService extends IAudioService.Stub { * Helper function: * Called synchronized on mRCStack */ private void clearRemoteControlDisplay_syncRcs() { private void clearRemoteControlDisplay_syncAfRcs() { synchronized(mCurrentRcLock) { mCurrentRcClient = null; } Loading @@ -3192,18 +3192,21 @@ public class AudioService extends IAudioService.Stub { } /** * Helper function: * Called synchronized on mRCStack * mRCStack.isEmpty() is false * Helper function for code readability: only to be called from * checkUpdateRemoteControlDisplay_syncAfRcs() which checks the preconditions for * this method. * Preconditions: * - called synchronized mAudioFocusLock then on mRCStack * - mRCStack.isEmpty() is false */ private void updateRemoteControlDisplay_syncRcs(int infoChangedFlags) { private void updateRemoteControlDisplay_syncAfRcs(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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } synchronized(mCurrentRcLock) { Loading @@ -3220,17 +3223,17 @@ public class AudioService extends IAudioService.Stub { /** * Helper function: * Called synchronized on mFocusLock, then mRCStack * Called synchronized on mAudioFocusLock, 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_syncRcs(int infoChangedFlags) { private void checkUpdateRemoteControlDisplay_syncAfRcs(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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } // if the top of the two stacks belong to different packages, there is a mismatch, clear Loading @@ -3238,18 +3241,18 @@ public class AudioService extends IAudioService.Stub { && (mFocusStack.peek().mPackageName != null) && !(mRCStack.peek().mCallingPackageName.compareTo( mFocusStack.peek().mPackageName) == 0)) { clearRemoteControlDisplay_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); 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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } // refresh conditions were verified: update the remote controls // ok to call, mRCStack is not empty updateRemoteControlDisplay_syncRcs(infoChangedFlags); // ok to call: synchronized mAudioFocusLock then on mRCStack, mRCStack is not empty updateRemoteControlDisplay_syncAfRcs(infoChangedFlags); } /** see AudioManager.registerMediaButtonEventReceiver(ComponentName eventReceiver) */ Loading @@ -3260,7 +3263,7 @@ public class AudioService extends IAudioService.Stub { synchronized(mRCStack) { pushMediaButtonReceiver(eventReceiver); // new RC client, assume every type of information shall be queried checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading @@ -3275,7 +3278,7 @@ public class AudioService extends IAudioService.Stub { removeMediaButtonReceiver(eventReceiver); if (topOfStackWillChange) { // current RC client will change, assume every type of info needs to be queried checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading @@ -3284,6 +3287,7 @@ public class AudioService extends IAudioService.Stub { /** see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...) */ public void registerRemoteControlClient(ComponentName eventReceiver, IRemoteControlClient rcClient, String clientName, String callingPackageName) { if (DEBUG_RC) Log.i(TAG, "Register remote control client rcClient="+rcClient); synchronized(mAudioFocusLock) { synchronized(mRCStack) { // store the new display information Loading Loading @@ -3331,7 +3335,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_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading Loading @@ -3436,6 +3440,7 @@ public class AudioService extends IAudioService.Stub { */ public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")"); synchronized(mAudioFocusLock) { synchronized(mRCStack) { if ((mRcDisplay == rcd) || (rcd == null)) { return; Loading @@ -3462,9 +3467,8 @@ public class AudioService extends IAudioService.Stub { } } if (!mRCStack.isEmpty()) { // we have a new display, of which all the clients are now aware: have it be updated updateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading Loading
media/java/android/media/AudioService.java +47 −43 Original line number Diff line number Diff line Loading @@ -2638,7 +2638,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } else { Loading Loading @@ -2681,7 +2681,7 @@ public class AudioService extends IAudioService.Stub { notifyTopOfAudioFocusStack(); // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading Loading @@ -2785,7 +2785,7 @@ public class AudioService extends IAudioService.Stub { // there's a new top of the stack, let the remote control know synchronized(mRCStack) { checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } }//synchronized(mAudioFocusLock) Loading Loading @@ -3183,7 +3183,7 @@ public class AudioService extends IAudioService.Stub { * Helper function: * Called synchronized on mRCStack */ private void clearRemoteControlDisplay_syncRcs() { private void clearRemoteControlDisplay_syncAfRcs() { synchronized(mCurrentRcLock) { mCurrentRcClient = null; } Loading @@ -3192,18 +3192,21 @@ public class AudioService extends IAudioService.Stub { } /** * Helper function: * Called synchronized on mRCStack * mRCStack.isEmpty() is false * Helper function for code readability: only to be called from * checkUpdateRemoteControlDisplay_syncAfRcs() which checks the preconditions for * this method. * Preconditions: * - called synchronized mAudioFocusLock then on mRCStack * - mRCStack.isEmpty() is false */ private void updateRemoteControlDisplay_syncRcs(int infoChangedFlags) { private void updateRemoteControlDisplay_syncAfRcs(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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } synchronized(mCurrentRcLock) { Loading @@ -3220,17 +3223,17 @@ public class AudioService extends IAudioService.Stub { /** * Helper function: * Called synchronized on mFocusLock, then mRCStack * Called synchronized on mAudioFocusLock, 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_syncRcs(int infoChangedFlags) { private void checkUpdateRemoteControlDisplay_syncAfRcs(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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } // if the top of the two stacks belong to different packages, there is a mismatch, clear Loading @@ -3238,18 +3241,18 @@ public class AudioService extends IAudioService.Stub { && (mFocusStack.peek().mPackageName != null) && !(mRCStack.peek().mCallingPackageName.compareTo( mFocusStack.peek().mPackageName) == 0)) { clearRemoteControlDisplay_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); 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_syncRcs(); clearRemoteControlDisplay_syncAfRcs(); return; } // refresh conditions were verified: update the remote controls // ok to call, mRCStack is not empty updateRemoteControlDisplay_syncRcs(infoChangedFlags); // ok to call: synchronized mAudioFocusLock then on mRCStack, mRCStack is not empty updateRemoteControlDisplay_syncAfRcs(infoChangedFlags); } /** see AudioManager.registerMediaButtonEventReceiver(ComponentName eventReceiver) */ Loading @@ -3260,7 +3263,7 @@ public class AudioService extends IAudioService.Stub { synchronized(mRCStack) { pushMediaButtonReceiver(eventReceiver); // new RC client, assume every type of information shall be queried checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading @@ -3275,7 +3278,7 @@ public class AudioService extends IAudioService.Stub { removeMediaButtonReceiver(eventReceiver); if (topOfStackWillChange) { // current RC client will change, assume every type of info needs to be queried checkUpdateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading @@ -3284,6 +3287,7 @@ public class AudioService extends IAudioService.Stub { /** see AudioManager.registerRemoteControlClient(ComponentName eventReceiver, ...) */ public void registerRemoteControlClient(ComponentName eventReceiver, IRemoteControlClient rcClient, String clientName, String callingPackageName) { if (DEBUG_RC) Log.i(TAG, "Register remote control client rcClient="+rcClient); synchronized(mAudioFocusLock) { synchronized(mRCStack) { // store the new display information Loading Loading @@ -3331,7 +3335,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_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading Loading @@ -3436,6 +3440,7 @@ public class AudioService extends IAudioService.Stub { */ public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")"); synchronized(mAudioFocusLock) { synchronized(mRCStack) { if ((mRcDisplay == rcd) || (rcd == null)) { return; Loading @@ -3462,9 +3467,8 @@ public class AudioService extends IAudioService.Stub { } } if (!mRCStack.isEmpty()) { // we have a new display, of which all the clients are now aware: have it be updated updateRemoteControlDisplay_syncRcs(RC_INFO_ALL); checkUpdateRemoteControlDisplay_syncAfRcs(RC_INFO_ALL); } } } Loading