From e89877245fc6dd359e435b5202901f9042819c51 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 7 Jul 2016 15:38:32 -0700 Subject: [PATCH] Audio focus: clean up FocusRequester early For audio focus client death: - call release on stack entry, - fix logs messages. Bug 28781809 Change-Id: I2d3e2b0635f7db2c52fcae0d6f5d6d3a773c6549 --- .../java/com/android/server/audio/FocusRequester.java | 17 ++++++++++------- .../com/android/server/audio/MediaFocusControl.java | 16 +++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/audio/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java index 49be879b93c7..cc18114120eb 100644 --- a/services/core/java/com/android/server/audio/FocusRequester.java +++ b/services/core/java/com/android/server/audio/FocusRequester.java @@ -40,9 +40,9 @@ public class FocusRequester { private static final String TAG = "MediaFocusControl"; private static final boolean DEBUG = false; - private AudioFocusDeathHandler mDeathHandler; - private final IAudioFocusDispatcher mFocusDispatcher; // may be null - private final IBinder mSourceRef; + private AudioFocusDeathHandler mDeathHandler; // may be null + private IAudioFocusDispatcher mFocusDispatcher; // may be null + private final IBinder mSourceRef; // may be null private final String mClientId; private final String mPackageName; private final int mCallingUid; @@ -205,6 +205,7 @@ public class FocusRequester { if (mSourceRef != null && mDeathHandler != null) { mSourceRef.unlinkToDeath(mDeathHandler, 0); mDeathHandler = null; + mFocusDispatcher = null; } } catch (java.util.NoSuchElementException e) { Log.e(TAG, "FocusRequester.release() hit ", e); @@ -275,12 +276,13 @@ public class FocusRequester { mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE; mFocusController.notifyExtPolicyFocusGrant_syncAf(toAudioFocusInfo(), AudioManager.AUDIOFOCUS_REQUEST_GRANTED); - if (mFocusDispatcher != null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd != null) { if (DEBUG) { Log.v(TAG, "dispatching " + focusChangeToString(focusGain) + " to " + mClientId); } - mFocusDispatcher.dispatchAudioFocusChange(focusGain, mClientId); + fd.dispatchAudioFocusChange(focusGain, mClientId); } } catch (android.os.RemoteException e) { Log.e(TAG, "Failure to signal gain of audio focus due to: ", e); @@ -311,14 +313,15 @@ public class FocusRequester { toAudioFocusInfo(), false /* wasDispatched */); return; } - if (mFocusDispatcher != null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd != null) { if (DEBUG) { Log.v(TAG, "dispatching " + focusChangeToString(mFocusLossReceived) + " to " + mClientId); } mFocusController.notifyExtPolicyFocusLoss_syncAf( toAudioFocusInfo(), true /* wasDispatched */); - mFocusDispatcher.dispatchAudioFocusChange(mFocusLossReceived, mClientId); + fd.dispatchAudioFocusChange(mFocusLossReceived, mClientId); } } } catch (android.os.RemoteException e) { diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index 278d70b2226d..206834e9adc4 100644 --- a/services/core/java/com/android/server/audio/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -160,6 +160,7 @@ public class MediaFocusControl { Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for " + clientToRemove); stackIterator.remove(); + // stack entry not used anymore, clear references fr.release(); } } @@ -171,7 +172,7 @@ public class MediaFocusControl { * Called synchronized on mAudioFocusLock * Remove focus listeners from the focus stack for a particular client when it has died. */ - private void removeFocusStackEntryForClient(IBinder cb) { + private void removeFocusStackEntryOnDeath(IBinder cb) { // is the owner of the audio focus part of the client to remove? boolean isTopOfStackForClientToRemove = !mFocusStack.isEmpty() && mFocusStack.peek().hasSameBinder(cb); @@ -181,9 +182,10 @@ public class MediaFocusControl { while(stackIterator.hasNext()) { FocusRequester fr = stackIterator.next(); if(fr.hasSameBinder(cb)) { - Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for " + cb); + Log.i(TAG, "AudioFocus removeFocusStackEntryOnDeath(): removing entry for " + cb); stackIterator.remove(); - // the client just died, no need to unlink to its death + // stack entry not used anymore, clear references + fr.release(); } } if (isTopOfStackForClientToRemove) { @@ -257,14 +259,9 @@ public class MediaFocusControl { public void binderDied() { synchronized(mAudioFocusLock) { - Log.w(TAG, " AudioFocus audio focus client died"); - removeFocusStackEntryForClient(mCb); + removeFocusStackEntryOnDeath(mCb); } } - - public IBinder getBinder() { - return mCb; - } } /** @@ -420,6 +417,7 @@ public class MediaFocusControl { // (premature death == death before abandoning focus) // Register for client death notification AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb); + try { cb.linkToDeath(afdh, 0); } catch (RemoteException e) { -- 2.11.0