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

Commit 53f33b8b authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioPolicy: fix AudioMixingRule parceling

Pass full AudioAttributes instead of just usage and capture
preset when parceling AudioMixMatchCriterion to carry AudioAttributes
flags properly from client to server.
Also fix condition in AudioMixingRule.isForCallRedirection().

Bug: 211435595
Test: atest CallAudioInterceptionTest
Test: atest AudioHostTest

Change-Id: I7d0583b867bf1112733dfa929fc72cf236d500c0
parent c02266e2
Loading
Loading
Loading
Loading
+9 −20
Original line number Diff line number Diff line
@@ -145,10 +145,8 @@ public class AudioMixingRule {
            final int match_rule = mRule & ~RULE_EXCLUSION_MASK;
            switch (match_rule) {
                case RULE_MATCH_ATTRIBUTE_USAGE:
                    dest.writeInt(mAttr.getSystemUsage());
                    break;
                case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
                    dest.writeInt(mAttr.getCapturePreset());
                    mAttr.writeToParcel(dest, AudioAttributes.FLATTEN_TAGS/*flags*/);
                    break;
                case RULE_MATCH_UID:
                case RULE_MATCH_USERID:
@@ -266,12 +264,14 @@ public class AudioMixingRule {
    public boolean isForCallRedirection() {
        for (AudioMixMatchCriterion criterion : mCriteria) {
            if (criterion.mAttr != null
                    && (criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE
                        && criterion.mAttr.getUsage() == AudioAttributes.USAGE_VOICE_COMMUNICATION)
                    && criterion.mAttr.isForCallRedirection()
                    && ((criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE
                        && (criterion.mAttr.getUsage() == AudioAttributes.USAGE_VOICE_COMMUNICATION
                            || criterion.mAttr.getUsage()
                                == AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING))
                    || (criterion.mRule == RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET
                        && criterion.mAttr.getCapturePreset()
                            == MediaRecorder.AudioSource.VOICE_COMMUNICATION)
                    && criterion.mAttr.isForCallRedirection()) {
                        && (criterion.mAttr.getCapturePreset()
                            == MediaRecorder.AudioSource.VOICE_COMMUNICATION)))) {
                return true;
            }
        }
@@ -713,19 +713,8 @@ public class AudioMixingRule {
            Integer intProp = null;
            switch (match_rule) {
                case RULE_MATCH_ATTRIBUTE_USAGE:
                    int usage = in.readInt();
                    if (AudioAttributes.isSystemUsage(usage)) {
                        attr = new AudioAttributes.Builder()
                                .setSystemUsage(usage).build();
                    } else {
                        attr = new AudioAttributes.Builder()
                                .setUsage(usage).build();
                    }
                    break;
                case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
                    int preset = in.readInt();
                    attr = new AudioAttributes.Builder()
                            .setInternalCapturePreset(preset).build();
                    attr =  AudioAttributes.CREATOR.createFromParcel(in);
                    break;
                case RULE_MATCH_UID:
                case RULE_MATCH_USERID:
+1 −1
Original line number Diff line number Diff line
@@ -9771,7 +9771,7 @@ public class AudioService extends IAudioService.Stub
                                     projection)) {
            Slog.w(TAG, "Permission denied to register audio policy for pid "
                    + Binder.getCallingPid() + " / uid " + Binder.getCallingUid()
                    + ", need MODIFY_AUDIO_ROUTING or MediaProjection that can project audio");
                    + ", need system permission or a MediaProjection that can project audio");
            return null;
        }