Audio policy: use new concurrent record bypass permission
Use either CAPTURE_AUDIO_OUTPUT or
BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION permission to allow
concurrent capture during calls. Use of CAPTURE_AUDIO_OUTPUT will be
removed once all system apps are updated.
Bug: 374751406
Test: make
Flag: android.media.audio.concurrent_audio_record_bypass_permission
Change-Id: I1adc9e6fa6b013cfd40e3c3f5559abd6802716ac
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 3589de1..df7077c 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -23,6 +23,7 @@
#include <android/content/AttributionSourceState.h>
#include <android_media_audiopolicy.h>
+#include <android_media_audio.h>
#include <com_android_media_audio.h>
#include <cutils/properties.h>
#include <error/expected_utils.h>
@@ -56,6 +57,7 @@
namespace audiopolicy_flags = android::media::audiopolicy;
using binder::Status;
using aidl_utils::binderStatusFromStatusT;
+using android::media::audio::concurrent_audio_record_bypass_permission;
using com::android::media::audio::audioserver_permissions;
using com::android::media::permission::NativePermissionController;
using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND;
@@ -71,6 +73,7 @@
using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE;
using com::android::media::permission::PermissionEnum::RECORD_AUDIO;
using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS;
+using com::android::media::permission::PermissionEnum::BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION;
using content::AttributionSourceState;
using media::audio::common::AudioConfig;
using media::audio::common::AudioConfigBase;
@@ -734,6 +737,17 @@
bool canCaptureOutput = audioserver_permissions() ?
CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
: captureAudioOutputAllowed(attributionSource);
+
+ //TODO(b/374751406): remove forcing canBypassConcurrentPolicy to canCaptureOutput
+ // once all system apps using CAPTURE_AUDIO_OUTPUT to capture during calls
+ // are updated to use the new CONCURRENT_AUDIO_RECORD_BYPASS permission.
+ bool canBypassConcurrentPolicy = canCaptureOutput;
+ if (concurrent_audio_record_bypass_permission()) {
+ canBypassConcurrentPolicy = audioserver_permissions() ?
+ CHECK_PERM(BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION,
+ attributionSource.uid)
+ : bypassConcurrentPolicyAllowed(attributionSource);
+ }
bool canInterceptCallAudio = audioserver_permissions() ?
CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
: callAudioInterceptionAllowed(attributionSource);
@@ -874,7 +888,8 @@
sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
selectedDeviceIds, attributionSource,
virtualDeviceId,
- canCaptureOutput, canCaptureHotword,
+ canBypassConcurrentPolicy,
+ canCaptureHotword,
mOutputCommandThread);
mAudioRecordClients.add(portId, client);
}