From ffffffc42242cf06c433e4e4958d7991a7e2848c Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Tue, 24 Mar 2020 16:13:59 -0700 Subject: [PATCH] Add isUidActiveOrForeground() for camera/audio to use. When start/resume activity, WindowManagerService start/resume the activity, then post a runnable to DiaplayThread and ActivityManagerService to update UidRecord's proc state, because the thread switch, the latency before proc state update is undetermined. When CameraService calls ActivityManagerService.isUidActive(), the proc state may not have been updated and camera access is denied. isUidActiveOrForeground() will check isUidActive() first, if false, check isUidForeground() which is actually to check with WindowManagerService if the uid is foreground, which is equivalent to ActivityManagerService's uid active, just updated earlier. Bug: 151185692, 151777097, 109950150 Test: manual test. Change-Id: I3685e0c8d2e69ca7ff3c4de4bef4ec754c400015 --- services/audiopolicy/service/AudioPolicyService.cpp | 4 ++-- services/camera/libcameraservice/CameraService.cpp | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index bf38477a58..1d61acfa76 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -945,7 +945,7 @@ bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) { } } ActivityManager am; - bool active = am.isUidActive(uid, String16("audioserver")); + bool active = am.isUidActiveOrForeground(uid, String16("audioserver")); { Mutex::Autolock _l(mLock); mCachedUids.insert(std::pair