diff options
| author | 2021-02-01 13:28:03 +0100 | |
|---|---|---|
| committer | 2021-02-01 15:12:55 +0100 | |
| commit | ead5142af0da2ff525935ec6daa115c9a9e80334 (patch) | |
| tree | 93ebf8347f2f3fabf663f97ee449a1836e74618f | |
| parent | cd347c4bd01cc8db065e4c1979121631ee523f0b (diff) | |
AudioService: make setAccessibilityServiceUids async
Call AudioSystem.setA11yServicesUids() in the AudioService message
handler thread to avoid potential cross deadlock with AccessibilityService.
Bug: 156421041
Test: atest AudioManagerTest
Change-Id: I1608bd613d97661083d3a72f61dbc0fc2e9d4414
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d5759633bf2d..c88b49dac813 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -300,6 +300,7 @@ public class AudioService extends IAudioService.Stub private static final int MSG_STREAM_DEVICES_CHANGED = 32; private static final int MSG_UPDATE_VOLUME_STATES_FOR_DEVICE = 33; private static final int MSG_REINIT_VOLUMES = 34; + private static final int MSG_UPDATE_A11Y_SERVICE_UIDS = 35; // start of messages handled under wakelock // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) @@ -699,8 +700,9 @@ public class AudioService extends IAudioService.Stub private long mLoweredFromNormalToVibrateTime; // Array of Uids of valid accessibility services to check if caller is one of them - private int[] mAccessibilityServiceUids; private final Object mAccessibilityServiceUidsLock = new Object(); + @GuardedBy("mAccessibilityServiceUidsLock") + private int[] mAccessibilityServiceUids; // Uid of the active input method service to check if caller is the one or not. private int mInputMethodServiceUid = android.os.Process.INVALID_UID; @@ -7082,6 +7084,10 @@ public class AudioService extends IAudioService.Stub case MSG_REINIT_VOLUMES: onReinitVolumes((String) msg.obj); break; + case MSG_UPDATE_A11Y_SERVICE_UIDS: + onUpdateAccessibilityServiceUids(); + break; + } } } @@ -8153,6 +8159,9 @@ public class AudioService extends IAudioService.Stub + " FromRestrictions=" + mMicMuteFromRestrictions + " FromApi=" + mMicMuteFromApi + " from system=" + mMicMuteFromSystemCached); + pw.print("\n mAssistantUid="); pw.println(mAssistantUid); + pw.print(" mCurrentImeUid="); pw.println(mCurrentImeUid); + dumpAccessibilityServiceUids(pw); dumpAudioPolicies(pw); mDynPolicyLogger.dump(pw); @@ -8186,6 +8195,19 @@ public class AudioService extends IAudioService.Stub } } + private void dumpAccessibilityServiceUids(PrintWriter pw) { + synchronized (mSupportedSystemUsagesLock) { + if (mAccessibilityServiceUids != null && mAccessibilityServiceUids.length > 0) { + pw.println(" Accessibility service Uids:"); + for (int uid : mAccessibilityServiceUids) { + pw.println(" - " + uid); + } + } else { + pw.println(" No accessibility service Uids."); + } + } + } + /** * Audio Analytics ids. */ @@ -8489,7 +8511,8 @@ public class AudioService extends IAudioService.Stub mAccessibilityServiceUids = uids.toArray(); } } - AudioSystem.setA11yServicesUids(mAccessibilityServiceUids); + sendMsg(mAudioHandler, MSG_UPDATE_A11Y_SERVICE_UIDS, SENDMSG_REPLACE, + 0, 0, null, 0); } } @@ -8507,6 +8530,14 @@ public class AudioService extends IAudioService.Stub } } + private void onUpdateAccessibilityServiceUids() { + int[] accessibilityServiceUids; + synchronized (mAccessibilityServiceUidsLock) { + accessibilityServiceUids = mAccessibilityServiceUids; + } + AudioSystem.setA11yServicesUids(accessibilityServiceUids); + } + //========================================================================================== // Audio policy management //========================================================================================== |