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

Commit 3cf3c640 authored by andychou's avatar andychou
Browse files

Fix thirt party app security exception when call to AudioManager.setMicrophoneMute()

In the current master code, AudioManager.ACTION_MICROPHONE_MUTE_CHANGED
is broadcasted too all users inside setMicrophoneMuteNoCallerCheck().
This causes the third party application needs system permission
android.permission.INTERACT_ACROSS_USERS_FULL or
android.permission.INTERACT_ACROSS_USERS.
Third party application just want to turn on/off microphone but not
about broadcast intent. So we should move broadcast intent code to
AudioService itself.
Therefore, broadcast message to main thread handler to broadcast intent
to avoid security exception.

Bug: 145388173
Test: Write a simple test APP to call to
AudioManager.AudioManager.setMicrophoneMute().

Change-Id: I44cebc9e6e21c1ee0c59125ee702b7093ad38a63
parent 3ef13e04
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ public class AudioService extends IAudioService.Stub
    private static final int MSG_OBSERVE_DEVICES_FOR_ALL_STREAMS = 27;
    private static final int MSG_HDMI_VOLUME_CHECK = 28;
    private static final int MSG_PLAYBACK_CONFIG_CHANGE = 29;
    private static final int MSG_BROADCAST_MICROPHONE_MUTE = 30;
    // start of messages handled under wakelock
    //   these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
    //   and not with sendMsg(..., ..., SENDMSG_QUEUE, ...)
@@ -2925,9 +2926,8 @@ public class AudioService extends IAudioService.Stub
            AudioSystem.muteMicrophone(muted);
            try {
                if (muted != currentMute) {
                    mContext.sendBroadcastAsUser(
                        new Intent(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED)
                                .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL);
                    sendMsg(mAudioHandler, MSG_BROADCAST_MICROPHONE_MUTE,
                                SENDMSG_NOOP, 0, 0, null, 0);
                }
            } finally {
                Binder.restoreCallingIdentity(identity);
@@ -5236,6 +5236,13 @@ public class AudioService extends IAudioService.Stub
                case MSG_PLAYBACK_CONFIG_CHANGE:
                    onPlaybackConfigChange((List<AudioPlaybackConfiguration>) msg.obj);
                    break;

                case MSG_BROADCAST_MICROPHONE_MUTE:
                    mContext.sendBroadcastAsUser(
                            new Intent(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED)
                                    .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
                                    UserHandle.ALL);
                    break;
            }
        }
    }