audio policy: receive assistant and a11y service UIDs
Add APIs to communicate assistant and accessibility service UIDs
to audio policy service in order to implement the new concurrent
capture policy.
Bug: 111438757
Test: enable and disable Google Assistant and Voice Access.
Change-Id: Ia804613051edab2ebd57d317b5b7509c98e7c6b4
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index e260fd8..ec36ed7 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -1298,6 +1298,24 @@
return aps->setSurroundFormatEnabled(audioFormat, enabled);
}
+
+status_t AudioSystem::setAssistantUid(uid_t uid)
+{
+ const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ return aps->setAssistantUid(uid);
+}
+
+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;
+
+ return aps->setA11yServicesUids(uids);
+}
+
+
// ---------------------------------------------------------------------------
int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 32a71f3..a406658 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -85,7 +85,9 @@
ADD_STREAM_DEFAULT_EFFECT,
REMOVE_STREAM_DEFAULT_EFFECT,
ADD_SOURCE_DEFAULT_EFFECT,
- REMOVE_SOURCE_DEFAULT_EFFECT
+ REMOVE_SOURCE_DEFAULT_EFFECT,
+ SET_ASSISTANT_UID,
+ SET_A11Y_SERVICES_UIDS,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -941,6 +943,33 @@
return static_cast <status_t> (reply.readInt32());
}
+ virtual status_t setAssistantUid(uid_t uid)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uid);
+ status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
+ virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uids.size());
+ for (auto uid : uids) {
+ data.writeInt32(uid);
+ }
+ status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
};
IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
@@ -997,7 +1026,9 @@
case START_AUDIO_SOURCE:
case STOP_AUDIO_SOURCE:
case GET_SURROUND_FORMATS:
- case SET_SURROUND_FORMAT_ENABLED: {
+ case SET_SURROUND_FORMAT_ENABLED:
+ case SET_ASSISTANT_UID:
+ case SET_A11Y_SERVICES_UIDS: {
if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
__func__, code, IPCThreadState::self()->getCallingPid(),
@@ -1710,6 +1741,42 @@
return NO_ERROR;
}
+ case SET_ASSISTANT_UID: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ int32_t uid;
+ status_t status = data.readInt32(&uid);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ status = setAssistantUid(uid);
+ reply->writeInt32(static_cast <int32_t>(status));
+ return NO_ERROR;
+ }
+
+ case SET_A11Y_SERVICES_UIDS: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ std::vector<uid_t> uids;
+ int32_t size;
+ status_t status = data.readInt32(&size);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ if (size > MAX_ITEMS_PER_LIST) {
+ size = MAX_ITEMS_PER_LIST;
+ }
+ for (int32_t i = 0; i < size; i++) {
+ int32_t uid;
+ status = data.readInt32(&uid);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ uids.push_back(uid);
+ }
+ status = setA11yServicesUids(uids);
+ reply->writeInt32(static_cast <int32_t>(status));
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index adfee8b..76a79c9 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -343,6 +343,9 @@
bool reported);
static status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
+ static status_t setAssistantUid(uid_t uid);
+ static status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+
// ----------------------------------------------------------------------------
class AudioPortCallback : public RefBase
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index fdd8d57..a246df6 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -20,15 +20,14 @@
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
-
#include <utils/RefBase.h>
#include <utils/Errors.h>
#include <binder/IInterface.h>
#include <media/AudioSystem.h>
#include <media/AudioPolicy.h>
#include <media/IAudioPolicyServiceClient.h>
-
#include <system/audio_policy.h>
+#include <vector>
namespace android {
@@ -180,6 +179,9 @@
bool *surroundFormatsEnabled,
bool reported) = 0;
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0;
+
+ virtual status_t setAssistantUid(uid_t uid) = 0;
+ virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids) = 0;
};