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

Commit b7429925 authored by Hayden Gomes's avatar Hayden Gomes
Browse files

Updating MediaRecorderClient to use CAPTURE_TUNER_AUDIO_INPUT

Updating recording FM_TUNER to use CAPTURE_TUNER_AUDIO_INPUT
in addition to CAPTURE_MEDIA_OUTPUT.

Bug: 165921316
Test: atest AudioServiceHostTest#testRadioTunerRecord
Change-Id: I3e41cab65154835296f9e0d965f9bba4598050d1
parent 9b95dd2f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -127,7 +127,8 @@ status_t MediaRecorderClient::setAudioSource(int as)
    pid_t pid = IPCThreadState::self()->getCallingPid();
    uid_t uid = IPCThreadState::self()->getCallingUid();

    if ((as == AUDIO_SOURCE_FM_TUNER && !captureAudioOutputAllowed(pid, uid))
    if ((as == AUDIO_SOURCE_FM_TUNER
            && !(captureAudioOutputAllowed(pid, uid) || captureTunerAudioInputAllowed(pid, uid)))
            || !recordingAllowed(String16(""), pid, uid)) {
        return PERMISSION_DENIED;
    }
+8 −0
Original line number Diff line number Diff line
@@ -145,6 +145,14 @@ bool captureMediaOutputAllowed(pid_t pid, uid_t uid) {
    return ok;
}

bool captureTunerAudioInputAllowed(pid_t pid, uid_t uid) {
    if (isAudioServerOrRootUid(uid)) return true;
    static const String16 sCaptureTunerAudioInput("android.permission.CAPTURE_TUNER_AUDIO_INPUT");
    bool ok = PermissionCache::checkPermission(sCaptureTunerAudioInput, pid, uid);
    if (!ok) ALOGV("Request requires android.permission.CAPTURE_TUNER_AUDIO_INPUT");
    return ok;
}

bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid) {
    if (isAudioServerOrRootUid(uid)) return true;
    static const String16 sCaptureVoiceCommOutput(
+1 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid);
void finishRecording(const String16& opPackageName, uid_t uid);
bool captureAudioOutputAllowed(pid_t pid, uid_t uid);
bool captureMediaOutputAllowed(pid_t pid, uid_t uid);
bool captureTunerAudioInputAllowed(pid_t pid, uid_t uid);
bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid);
bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid);
bool settingsAllowed();
+11 −5
Original line number Diff line number Diff line
@@ -454,8 +454,9 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
    }

    // check calling permissions.
    // Capturing from FM_TUNER source is controlled by captureAudioOutputAllowed() only as this
    // does not affect users privacy as does capturing from an actual microphone.
    // Capturing from FM_TUNER source is controlled by captureTunerAudioInputAllowed() and
    // captureAudioOutputAllowed() (deprecated) as this does not affect users privacy
    // as does capturing from an actual microphone.
    if (!(recordingAllowed(opPackageName, pid, uid) || attr->source == AUDIO_SOURCE_FM_TUNER)) {
        ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
                __func__, uid, pid);
@@ -466,9 +467,14 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
    if ((inputSource == AUDIO_SOURCE_VOICE_UPLINK ||
        inputSource == AUDIO_SOURCE_VOICE_DOWNLINK ||
        inputSource == AUDIO_SOURCE_VOICE_CALL ||
        inputSource == AUDIO_SOURCE_ECHO_REFERENCE||
        inputSource == AUDIO_SOURCE_FM_TUNER) &&
        !canCaptureOutput) {
        inputSource == AUDIO_SOURCE_ECHO_REFERENCE)
        && !canCaptureOutput) {
        return PERMISSION_DENIED;
    }

    if (inputSource == AUDIO_SOURCE_FM_TUNER
        && !captureTunerAudioInputAllowed(pid, uid)
        && !canCaptureOutput) {
        return PERMISSION_DENIED;
    }