summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jean-Michel Trivi <jmtrivi@google.com> 2013-07-30 18:31:12 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2013-07-30 18:31:13 +0000
commit783cea46580b69319669a0a354894be4982e996e (patch)
tree1f5f8c2df91002ba2b54468ed39c7d6629eed461
parent39dd5a62ae4348e941c8351635e61dc065b2ced7 (diff)
parent00bf4b18173b8921d7a5cecbd8b8d3745470b5d0 (diff)
Merge "More refactor of audio focus, keep track of focus loss"
-rw-r--r--media/java/android/media/MediaFocusControl.java96
1 files changed, 56 insertions, 40 deletions
diff --git a/media/java/android/media/MediaFocusControl.java b/media/java/android/media/MediaFocusControl.java
index cc60d176687b..2b9d809ef3fd 100644
--- a/media/java/android/media/MediaFocusControl.java
+++ b/media/java/android/media/MediaFocusControl.java
@@ -273,13 +273,7 @@ public class MediaFocusControl implements OnFinished {
if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
// notify the current focus owner it lost focus after removing it from stack
final FocusStackEntry exFocusOwner = mFocusStack.pop();
- try {
- exFocusOwner.mFocusDispatcher.dispatchAudioFocusChange(
- AudioManager.AUDIOFOCUS_LOSS, exFocusOwner.mClientId);
- } catch (RemoteException e) {
- Log.e(TAG, "Failure to signal loss of audio focus due to "+ e);
- e.printStackTrace();
- }
+ exFocusOwner.handleFocusLoss(AudioManager.AUDIOFOCUS_LOSS);
exFocusOwner.unlinkToDeath();
// clear RCD
synchronized(mRCStack) {
@@ -293,32 +287,25 @@ public class MediaFocusControl implements OnFinished {
// notify the top of the stack it gained focus
if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
if (canReassignAudioFocus()) {
- final FocusStackEntry newFocusOwner = mFocusStack.peek();
- try {
- newFocusOwner.mFocusDispatcher.dispatchAudioFocusChange(
- AudioManager.AUDIOFOCUS_GAIN, mFocusStack.peek().mClientId);
- newFocusOwner.mFocusLossReceived = AUDIOFOCUS_NONE;
- } catch (RemoteException e) {
- Log.e(TAG, "Failure to signal gain of audio control focus due to "+ e);
- e.printStackTrace();
- }
+ mFocusStack.peek().handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);
}
}
}
+
private static class FocusStackEntry {
- public int mStreamType = -1;// no stream type
- public IAudioFocusDispatcher mFocusDispatcher = null;
- public IBinder mSourceRef = null;
- public String mClientId;
+ int mStreamType = -1;// no stream type
+ IAudioFocusDispatcher mFocusDispatcher = null;
+ IBinder mSourceRef = null;
+ String mClientId;
/** the audio focus gain request that caused the addition of this entry in the stack */
- public int mFocusGainRequest;
- public int mFocusLossReceived;
- public AudioFocusDeathHandler mHandler;
- public String mPackageName;
- public int mCallingUid;
+ int mFocusGainRequest;
+ int mFocusLossReceived;
+ AudioFocusDeathHandler mHandler;
+ String mPackageName;
+ int mCallingUid;
- private static String focusChangeToString(int focus) {
+ static String focusChangeToString(int focus) {
switch(focus) {
case AudioManager.AUDIOFOCUS_GAIN:
return "GAIN";
@@ -363,7 +350,7 @@ public class MediaFocusControl implements OnFinished {
mCallingUid = uid;
}
- public void unlinkToDeath() {
+ void unlinkToDeath() {
try {
if (mSourceRef != null && mHandler != null) {
mSourceRef.unlinkToDeath(mHandler, 0);
@@ -379,6 +366,44 @@ public class MediaFocusControl implements OnFinished {
unlinkToDeath(); // unlink exception handled inside method
super.finalize();
}
+
+ /**
+ * For a given audio focus gain request, return the audio focus loss type that will result
+ * from it.
+ * @param gainRequest
+ * @return the audio focus loss type that matches the gain request
+ */
+ int focusLossForGainRequest(int gainRequest) {
+ return -1 * gainRequest; // focus loss codes are the inverse of the gain codes
+ }
+
+ void handleExternalFocusGain(int focusGain) {
+ try {
+ int focusLoss = focusLossForGainRequest(focusGain);
+ mFocusDispatcher.dispatchAudioFocusChange(focusLoss, mClientId);
+ mFocusLossReceived = focusLoss;
+ } catch (RemoteException e) {
+ Log.e(TAG, " Failure to signal loss of focus: ", e);
+ }
+ }
+
+ void handleFocusGain(int focusGain) {
+ try {
+ mFocusDispatcher.dispatchAudioFocusChange(focusGain, mClientId);
+ mFocusLossReceived = AUDIOFOCUS_NONE;
+ } catch (RemoteException e) {
+ Log.e(TAG, " Failure to signal gain of audio focus due to: ", e);
+ }
+ }
+
+ void handleFocusLoss(int focusLoss) {
+ try {
+ mFocusDispatcher.dispatchAudioFocusChange(
+ focusLoss, mClientId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failure to signal loss of audio focus due to:", e);
+ }
+ }
}
private final Stack<FocusStackEntry> mFocusStack = new Stack<FocusStackEntry>();
@@ -436,7 +461,7 @@ public class MediaFocusControl implements OnFinished {
while(stackIterator.hasNext()) {
FocusStackEntry fse = (FocusStackEntry)stackIterator.next();
if(fse.mClientId.equals(clientToRemove)) {
- Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for "
+ Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for "
+ fse.mClientId);
stackIterator.remove();
fse.unlinkToDeath();
@@ -460,7 +485,7 @@ public class MediaFocusControl implements OnFinished {
while(stackIterator.hasNext()) {
FocusStackEntry fse = (FocusStackEntry)stackIterator.next();
if(fse.mSourceRef.equals(cb)) {
- Log.i(TAG, " AudioFocus abandonAudioFocus(): removing entry for "
+ Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for "
+ fse.mClientId);
stackIterator.remove();
// the client just died, no need to unlink to its death
@@ -566,16 +591,7 @@ public class MediaFocusControl implements OnFinished {
// notify current top of stack it is losing focus
if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
- final FocusStackEntry exFocusOwner = mFocusStack.peek();
- try {
- exFocusOwner.mFocusDispatcher.dispatchAudioFocusChange(
- -1 * focusChangeHint, // loss and gain codes are inverse of each other
- mFocusStack.peek().mClientId);
- exFocusOwner.mFocusLossReceived = -1 * focusChangeHint;
- } catch (RemoteException e) {
- Log.e(TAG, " Failure to signal loss of focus: ", e);
- e.printStackTrace();
- }
+ mFocusStack.peek().handleExternalFocusGain(focusChangeHint);
}
// focus requester might already be somewhere below in the stack, remove it
@@ -600,7 +616,7 @@ public class MediaFocusControl implements OnFinished {
try {
// this will take care of notifying the new focus owner if needed
synchronized(mAudioFocusLock) {
- removeFocusStackEntry(clientId, true);
+ removeFocusStackEntry(clientId, true /*signal*/);
}
} catch (java.util.ConcurrentModificationException cme) {
// Catching this exception here is temporary. It is here just to prevent