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

Commit a7703540 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Implement support for device-aware RECORD_AUDIO permission" into main

parents ee5a9300 e5a122de
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ cc_library {
        "audiopolicy-aidl-cpp",
        "audiopolicy-types-aidl-cpp",
        "capture_state_listener-aidl-cpp",
        "framework-permission-aidl-cpp",
        "libaudiofoundation",
        "libaudioclient_aidl_conversion",
        "libaudioutils",
@@ -367,6 +368,7 @@ aidl_interface {
    ],
    imports: [
        "audioclient-types-aidl",
        "framework-permission-aidl",
    ],
    backend: {
        cpp: {
+2 −0
Original line number Diff line number Diff line
@@ -243,6 +243,7 @@ aidl2legacy_AudioMix(const media::AudioMix& aidl) {
    legacy.mAllowPrivilegedMediaPlaybackCapture = aidl.allowPrivilegedMediaPlaybackCapture;
    legacy.mVoiceCommunicationCaptureAllowed = aidl.voiceCommunicationCaptureAllowed;
    legacy.mToken = aidl.mToken;
    legacy.mVirtualDeviceId = aidl.mVirtualDeviceId;
    return legacy;
}

@@ -267,6 +268,7 @@ legacy2aidl_AudioMix(const AudioMix& legacy) {
    aidl.allowPrivilegedMediaPlaybackCapture = legacy.mAllowPrivilegedMediaPlaybackCapture;
    aidl.voiceCommunicationCaptureAllowed = legacy.mVoiceCommunicationCaptureAllowed;
    aidl.mToken = legacy.mToken;
    aidl.mVirtualDeviceId = legacy.mVirtualDeviceId;
    return aidl;
}

+2 −0
Original line number Diff line number Diff line
@@ -41,4 +41,6 @@ parcelable AudioMix {
    boolean voiceCommunicationCaptureAllowed;
    /** Identifies the owner of the AudioPolicy that this AudioMix belongs to */
    IBinder mToken;
    /** Indicates the Id of the VirtualDevice this AudioMix was registered for */
    int mVirtualDeviceId;
}
+1 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ public:
    String8         mDeviceAddress;
    uint32_t        mCbFlags; // flags indicating which callbacks to use, see kCbFlag*
    sp<IBinder>     mToken;
    uint32_t        mVirtualDeviceId;
    /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */
    bool            mAllowPrivilegedMediaPlaybackCapture = false;
    /** Indicates if the caller can capture voice communication output */
+19 −6
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ std::optional<AttributionSourceState> resolveAttributionSource(
}

    static bool checkRecordingInternal(const AttributionSourceState &attributionSource,
                                       const uint32_t virtualDeviceId,
                                       const String16 &msg, bool start, audio_source_t source) {
    // Okay to not track in app ops as audio server or media server is us and if
    // device is rooted security model is considered compromised.
@@ -127,7 +128,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour
    // We specify a pid and uid here as mediaserver (aka MediaRecorder or StageFrightRecorder)
    // may open a record track on behalf of a client. Note that pid may be a tid.
    // IMPORTANT: DON'T USE PermissionCache - RUNTIME PERMISSIONS CHANGE.
    const std::optional<AttributionSourceState> resolvedAttributionSource =
    std::optional<AttributionSourceState> resolvedAttributionSource =
            resolveAttributionSource(attributionSource);
    if (!resolvedAttributionSource.has_value()) {
        return false;
@@ -136,6 +137,7 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour
    const int32_t attributedOpCode = getOpForSource(source);

    permission::PermissionChecker permissionChecker;
    resolvedAttributionSource.value().deviceId = virtualDeviceId;
    bool permitted = false;
    if (start) {
        permitted = (permissionChecker.checkPermissionForStartDataDeliveryFromDatasource(
@@ -150,13 +152,24 @@ static bool checkRecordingInternal(const AttributionSourceState& attributionSour
    return permitted;
}

static constexpr int DEVICE_ID_DEFAULT = 0;

bool recordingAllowed(const AttributionSourceState &attributionSource, audio_source_t source) {
    return checkRecordingInternal(attributionSource, String16(), /*start*/ false, source);
    return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, String16(), /*start*/ false,
                                  source);
}

bool recordingAllowed(const AttributionSourceState &attributionSource,
                      const uint32_t virtualDeviceId,
                      audio_source_t source) {
    return checkRecordingInternal(attributionSource, virtualDeviceId,
                                  String16(), /*start*/ false, source);
}

bool startRecording(const AttributionSourceState& attributionSource, const String16& msg,
        audio_source_t source) {
    return checkRecordingInternal(attributionSource, msg, /*start*/ true, source);
    return checkRecordingInternal(attributionSource, DEVICE_ID_DEFAULT, msg, /*start*/ true,
                                  source);
}

void finishRecording(const AttributionSourceState& attributionSource, audio_source_t source) {
Loading