summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2011-03-08 14:38:59 -0800
committerJean-Michel Trivi <jmtrivi@google.com>2011-03-08 15:12:26 -0800
commit382f4e6ea4dcf39105b36364582ed01642daa93c (patch)
treed21bed6bd137dfb1079f01e9a9f91bbfc41cf84d /media
parentff23352ea70339c4230d628ab294fbf52159da06 (diff)
downloadframeworks_base-382f4e6ea4dcf39105b36364582ed01642daa93c.zip
frameworks_base-382f4e6ea4dcf39105b36364582ed01642daa93c.tar.gz
frameworks_base-382f4e6ea4dcf39105b36364582ed01642daa93c.tar.bz2
Fix bug 4064086 Use a death handler on audio focus changes from mode
Use a death handler when audio focus changes are caused by audio mode changes. The bug comes from the fact that audio focus clients that use the audio mode for automatic focus handling didn't register a death handler, which was set to null. When such a client died, this handler was compared against the one to remove from the audio focus stack, which resulted in an NPE. The fix consists in registering a valid IBinder object in the audio focus stack, even for clients whose focus requests originate from a change in audio mode, as implemented in the handleFocusForCalls() method. Change-Id: Id9e1d3d10afcd99969285f6d60fc4d7dde1e4a10
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/AudioService.java38
1 files changed, 17 insertions, 21 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 5a73d2d..fd12e19 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -805,7 +805,7 @@ public class AudioService extends IAudioService.Stub {
if (mode != mMode) {
// automatically handle audio focus for mode changes
- handleFocusForCalls(mMode, mode);
+ handleFocusForCalls(mMode, mode, cb);
if (AudioSystem.setPhoneState(mode) == AudioSystem.AUDIO_STATUS_OK) {
mMode = mode;
@@ -864,7 +864,7 @@ public class AudioService extends IAudioService.Stub {
}
/** pre-condition: oldMode != newMode */
- private void handleFocusForCalls(int oldMode, int newMode) {
+ private void handleFocusForCalls(int oldMode, int newMode, IBinder cb) {
// if ringing
if (newMode == AudioSystem.MODE_RINGTONE) {
// if not ringing silently
@@ -872,8 +872,8 @@ public class AudioService extends IAudioService.Stub {
if (ringVolume > 0) {
// request audio focus for the communication focus entry
requestAudioFocus(AudioManager.STREAM_RING,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
- null, null /* both allowed to be null only for this clientId */,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, cb,
+ null /* IAudioFocusDispatcher allowed to be null only for this clientId */,
IN_VOICE_COMM_FOCUS_ID /*clientId*/);
}
@@ -884,8 +884,8 @@ public class AudioService extends IAudioService.Stub {
// request audio focus for the communication focus entry
// (it's ok if focus was already requested during ringing)
requestAudioFocus(AudioManager.STREAM_RING,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
- null, null /* both allowed to be null only for this clientId */,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, cb,
+ null /* IAudioFocusDispatcher allowed to be null only for this clientId */,
IN_VOICE_COMM_FOCUS_ID /*clientId*/);
}
// if exiting call
@@ -2547,10 +2547,9 @@ public class AudioService extends IAudioService.Stub {
// the main stream type for the audio focus request is currently not used. It may
// potentially be used to handle multiple stream type-dependent audio focuses.
- // we need a valid binder callback for clients other than the AudioService's phone
- // state listener
- if (!IN_VOICE_COMM_FOCUS_ID.equals(clientId) && ((cb == null) || !cb.pingBinder())) {
- Log.i(TAG, " AudioFocus DOA client for requestAudioFocus(), exiting");
+ // we need a valid binder callback for clients
+ if (!cb.pingBinder()) {
+ Log.e(TAG, " AudioFocus DOA client for requestAudioFocus(), aborting.");
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
}
@@ -2591,17 +2590,14 @@ public class AudioService extends IAudioService.Stub {
}//synchronized(mAudioFocusLock)
// handle the potential premature death of the new holder of the focus
- // (premature death == death before abandoning focus) for a client which is not the
- // AudioService's phone state listener
- if (!IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {
- // Register for client death notification
- AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb);
- try {
- cb.linkToDeath(afdh, 0);
- } catch (RemoteException e) {
- // client has already died!
- Log.w(TAG, "AudioFocus requestAudioFocus() could not link to "+cb+" binder death");
- }
+ // (premature death == death before abandoning focus)
+ // Register for client death notification
+ AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb);
+ try {
+ cb.linkToDeath(afdh, 0);
+ } catch (RemoteException e) {
+ // client has already died!
+ Log.w(TAG, "AudioFocus requestAudioFocus() could not link to "+cb+" binder death");
}
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;