Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dbb80328 authored by Eric Laurent's avatar Eric Laurent Committed by Atneya Nair
Browse files

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
parent 1f99bd67
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -37,5 +37,6 @@ enum PermissionEnum {
    CAPTURE_TUNER_AUDIO_INPUT = 11,
    CAPTURE_VOICE_COMMUNICATION_OUTPUT = 12,
    BLUETOOTH_CONNECT = 13,
    ENUM_SIZE = 14, // Not for actual usage, used by Java
    BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION = 14,
    ENUM_SIZE = 15, // Not for actual usage, used by Java
}
+15 −0
Original line number Diff line number Diff line
@@ -291,6 +291,21 @@ bool captureVoiceCommunicationOutputAllowed(const AttributionSourceState& attrib
    return ok;
}

bool bypassConcurrentPolicyAllowed(const AttributionSourceState& attributionSource) {
    uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(attributionSource.uid));
    uid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(attributionSource.pid));
    if (isAudioServerOrRootUid(uid)) return true;
    static const String16 sBypassConcurrentPolicy(
            "android.permission.BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION ");
    // Use PermissionChecker, which includes some logic for allowing the isolated
    // HotwordDetectionService to hold certain permissions.
    bool ok = PermissionCache::checkPermission(sBypassConcurrentPolicy, pid, uid);
    if (!ok) {
        ALOGV("Request requires android.permission.BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION");
    }
    return ok;
}

bool accessUltrasoundAllowed(const AttributionSourceState& attributionSource) {
    uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(attributionSource.uid));
    uid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(attributionSource.pid));
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ bool captureAudioOutputAllowed(const AttributionSourceState& attributionSource);
bool captureMediaOutputAllowed(const AttributionSourceState& attributionSource);
bool captureTunerAudioInputAllowed(const AttributionSourceState& attributionSource);
bool captureVoiceCommunicationOutputAllowed(const AttributionSourceState& attributionSource);
bool bypassConcurrentPolicyAllowed(const AttributionSourceState& attributionSource) ;
bool accessUltrasoundAllowed(const AttributionSourceState& attributionSource);
bool captureHotwordAllowed(const AttributionSourceState& attributionSource);
bool settingsAllowed();
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ cc_defaults {
    ],

    shared_libs: [
        "android.media.audio-aconfig-cc",
        "android.media.audiopolicy-aconfig-cc",
        "audio-permission-aidl-cpp",
        "audioclient-types-aidl-cpp",
+16 −1
Original line number Diff line number Diff line
@@ -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 android {
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_DEFAULT_AUDIO_EFFE
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 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr
    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 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr
        sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
                                                             selectedDeviceIds, attributionSource,
                                                             virtualDeviceId,
                                                             canCaptureOutput, canCaptureHotword,
                                                             canBypassConcurrentPolicy,
                                                             canCaptureHotword,
                                                             mOutputCommandThread);
        mAudioRecordClients.add(portId, client);
    }
Loading