Apply Assistant AudioPolicy to HotwordDetectionService
The HotwordDetectionService is part of the Assistant package but runs
with a separate (isolated) uid.
This change follows the pattern of how the Assistant and IME UIDs are
set.
Fix: 194368677
Test: manual - hotword works when another app is using the mic and in
Auto projection mode
Test: atest HotwordDetectionServiceBasicTest
Change-Id: I76a7930431db226c7e502f8993dfeaa4bc133bea
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 88e752b..f1eeaa3 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -1922,6 +1922,14 @@
return statusTFromBinderStatus(aps->setAssistantUid(uidAidl));
}
+status_t AudioSystem::setHotwordDetectionServiceUid(uid_t uid) {
+ const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
+ return statusTFromBinderStatus(aps->setHotwordDetectionServiceUid(uidAidl));
+}
+
status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
diff --git a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
index 65bcd82..4c3955a 100644
--- a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
@@ -299,6 +299,8 @@
void setAssistantUid(int /* uid_t */ uid);
+ void setHotwordDetectionServiceUid(int /* uid_t */ uid);
+
void setA11yServicesUids(in int[] /* uid_t[] */ uids);
void setCurrentImeUid(int /* uid_t */ uid);
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index a9109c8..8ba23ad 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -429,6 +429,7 @@
static status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
static status_t setAssistantUid(uid_t uid);
+ static status_t setHotwordDetectionServiceUid(uid_t uid);
static status_t setA11yServicesUids(const std::vector<uid_t>& uids);
static status_t setCurrentImeUid(uid_t uid);
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 9987252..77223b6 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1916,6 +1916,14 @@
return Status::ok();
}
+Status AudioPolicyService::setHotwordDetectionServiceUid(int32_t uidAidl)
+{
+ uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
+ Mutex::Autolock _l(mLock);
+ mUidPolicy->setHotwordDetectionServiceUid(uid);
+ return Status::ok();
+}
+
Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
{
size_t size = uidsAidl.size();
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 3b77ed8..7ed829c 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -199,6 +199,7 @@
binder::Status setSurroundFormatEnabled(media::audio::common::AudioFormat audioFormat,
bool enabled) override;
binder::Status setAssistantUid(int32_t uid) override;
+ binder::Status setHotwordDetectionServiceUid(int32_t uid) override;
binder::Status setA11yServicesUids(const std::vector<int32_t>& uids) override;
binder::Status setCurrentImeUid(int32_t uid) override;
binder::Status isHapticPlaybackSupported(bool* _aidl_return) override;
@@ -376,7 +377,8 @@
public:
explicit UidPolicy(wp<AudioPolicyService> service)
: mService(service), mObserverRegistered(false),
- mAssistantUid(0), mCurrentImeUid(0), mRttEnabled(false) {}
+ mAssistantUid(0), mHotwordDetectionServiceUid(0), mCurrentImeUid(0),
+ mRttEnabled(false) {}
void registerSelf();
void unregisterSelf();
@@ -386,8 +388,13 @@
bool isUidActive(uid_t uid);
int getUidState(uid_t uid);
- void setAssistantUid(uid_t uid) { mAssistantUid = uid; }
- bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
+ void setAssistantUid(uid_t uid) { mAssistantUid = uid; };
+ void setHotwordDetectionServiceUid(uid_t uid) { mHotwordDetectionServiceUid = uid; }
+ bool isAssistantUid(uid_t uid) const {
+ // The HotwordDetectionService is part of the Assistant package but runs with a separate
+ // (isolated) uid, so we check for either uid here.
+ return uid == mAssistantUid || uid == mHotwordDetectionServiceUid;
+ }
void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
bool isA11yUid(uid_t uid);
bool isA11yOnTop();
@@ -423,6 +430,7 @@
std::unordered_map<uid_t, std::pair<bool, int>> mOverrideUids;
std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
uid_t mAssistantUid = -1;
+ uid_t mHotwordDetectionServiceUid = -1;
std::vector<uid_t> mA11yUids;
uid_t mCurrentImeUid = -1;
bool mRttEnabled = false;