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

Commit b809a75a authored by Eric Laurent's avatar Eric Laurent
Browse files

Audio policy: fix capture policy for IN_COMMUNICATION mode

If audio mode is IN_COMMUNICATION, favor audio mode owner over another
app also capturing with privacy sensitive flag and with foreground UI or
more recent capture start time.
This avoids silencing both apps in this scenario.

Restore voice communication capture restriction to audio mode owner
removed by commit ffabb495.

Bug: 160260850
Test: VoIP call regression

Change-Id: If4737cb7ffa3123537a13319d5857031f0f48932
parent 6435dd74
Loading
Loading
Loading
Loading
+28 −12
Original line number Diff line number Diff line
@@ -453,7 +453,7 @@ void AudioPolicyService::updateUidStates_l()
    sp<AudioRecordClient> topActive;
    sp<AudioRecordClient> latestActive;
    sp<AudioRecordClient> topSensitiveActive;
    sp<AudioRecordClient> latestSensitiveActive;
    sp<AudioRecordClient> latestSensitiveActiveOrComm;

    nsecs_t topStartNs = 0;
    nsecs_t latestStartNs = 0;
@@ -467,6 +467,7 @@ void AudioPolicyService::updateUidStates_l()
    bool rttCallActive = (isInCall || isInCommunication)
            && mUidPolicy->isRttEnabled();
    bool onlyHotwordActive = true;
    bool isPhoneStateOwnerActive = false;

    // if Sensor Privacy is enabled then all recordings should be silenced.
    if (mSensorPrivacyPolicy->isSensorPrivacyEnabled()) {
@@ -494,6 +495,7 @@ void AudioPolicyService::updateUidStates_l()
            bool isAssistant = mUidPolicy->isAssistantUid(current->uid);
            bool isPrivacySensitive =
                    (current->attributes.flags & AUDIO_FLAG_CAPTURE_PRIVATE) != 0;

            if (appState == APP_STATE_TOP) {
                if (isPrivacySensitive) {
                    if (current->startTimeNs > topSensitiveStartNs) {
@@ -515,10 +517,16 @@ void AudioPolicyService::updateUidStates_l()
            if (!(current->attributes.source == AUDIO_SOURCE_HOTWORD
                    || ((isA11yOnTop || rttCallActive) && isAssistant))) {
                if (isPrivacySensitive) {
                    if (current->startTimeNs > latestSensitiveStartNs) {
                        latestSensitiveActive = current;
                    // if audio mode is IN_COMMUNICATION, make sure the audio mode owner
                    // is marked latest sensitive active even if another app qualifies.
                    if (current->startTimeNs > latestSensitiveStartNs
                            || (isInCommunication && current->uid == mPhoneStateOwnerUid)) {
                        if (!isInCommunication || latestSensitiveActiveOrComm == nullptr
                                || latestSensitiveActiveOrComm->uid != mPhoneStateOwnerUid) {
                            latestSensitiveActiveOrComm = current;
                            latestSensitiveStartNs = current->startTimeNs;
                        }
                    }
                    isSensitiveActive = true;
                } else {
                    if (current->startTimeNs > latestStartNs) {
@@ -531,6 +539,9 @@ void AudioPolicyService::updateUidStates_l()
        if (current->attributes.source != AUDIO_SOURCE_HOTWORD) {
            onlyHotwordActive = false;
        }
        if (current->uid == mPhoneStateOwnerUid) {
            isPhoneStateOwnerActive = true;
        }
    }

    // if no active client with UI on Top, consider latest active as top
@@ -539,8 +550,15 @@ void AudioPolicyService::updateUidStates_l()
        topStartNs = latestStartNs;
    }
    if (topSensitiveActive == nullptr) {
        topSensitiveActive = latestSensitiveActive;
        topSensitiveActive = latestSensitiveActiveOrComm;
        topSensitiveStartNs = latestSensitiveStartNs;
    } else if (latestSensitiveActiveOrComm != nullptr) {
        // if audio mode is IN_COMMUNICATION, favor audio mode owner over an app with
        // foreground UI in case both are capturing with privacy sensitive flag.
        if (isInCommunication && latestSensitiveActiveOrComm->uid == mPhoneStateOwnerUid) {
            topSensitiveActive = latestSensitiveActiveOrComm;
            topSensitiveStartNs = latestSensitiveStartNs;
        }
    }

    // If both privacy sensitive and regular capture are active:
@@ -566,13 +584,11 @@ void AudioPolicyService::updateUidStates_l()

        auto canCaptureIfInCallOrCommunication = [&](const auto &recordClient) REQUIRES(mLock) {
            bool canCaptureCall = recordClient->canCaptureOutput;
            return !(isInCall && !canCaptureCall);
//TODO(b/160260850): restore restriction to mode owner once fix for misbehaving apps is merged
//            bool canCaptureCommunication = recordClient->canCaptureOutput
//                || recordClient->uid == mPhoneStateOwnerUid
//                || isServiceUid(mPhoneStateOwnerUid);
//            return !(isInCall && !canCaptureCall)
//                && !(isInCommunication && !canCaptureCommunication);
            bool canCaptureCommunication = recordClient->canCaptureOutput
                || !isPhoneStateOwnerActive
                || recordClient->uid == mPhoneStateOwnerUid;
            return !(isInCall && !canCaptureCall)
                && !(isInCommunication && !canCaptureCommunication);
        };

        // By default allow capture if: