From 9704e1275af5840e38d61283955f09bc6879ca80 Mon Sep 17 00:00:00 2001 From: Francois Gaffie Date: Tue, 14 Apr 2020 14:14:02 +0200 Subject: [PATCH] AudioService: Focus: cleanup FocusOwner upon requestAudioFocus failure When the focus is owned by an external audio policy, and when a client's request fails, the FocusRequester dedicated Map is not cleared. As the client app may not call AudioManager#abandonAudioFocus (since the requestAudioFocus failed), it leads to not only dumpsys side effects but also it triggers upon client's focus binder died event, the call of notifyExtFocusPolicyFocusAbandon_syncAf. This CL fixes this issue by removing the FocusRequester when the request fails, the same way it is already done on permanent loss of focus. Test: build & boot Signed-off-by: Francois Gaffie Change-Id: I4d1b216b606c8f73c9b68353723284d9e178297d --- .../java/com/android/server/audio/MediaFocusControl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index c845981fea7e2..3ac37713a130b 100644 --- a/services/core/java/com/android/server/audio/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -625,7 +625,12 @@ public class MediaFocusControl implements PlayerFocusEnforcer { return; } } - final FocusRequester fr = mFocusOwnersForFocusPolicy.get(afi.getClientId()); + final FocusRequester fr; + if (requestResult == AudioManager.AUDIOFOCUS_REQUEST_FAILED) { + fr = mFocusOwnersForFocusPolicy.remove(afi.getClientId()); + } else { + fr = mFocusOwnersForFocusPolicy.get(afi.getClientId()); + } if (fr != null) { fr.dispatchFocusResultFromExtPolicy(requestResult); }