From ab2e9563601a1b066d9a86d2aa6b07015accf9d3 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 21 Dec 2017 18:09:21 -0800 Subject: [PATCH] New intent for microphone mute change notification AudioManager: define ACTION_MICROPHONE_MUTE_CHANGED. AudioService: - broadcast intent when setMicrophoneMute() is called with FLAG_RECEIVER_REGISTERED_ONLY. - remove outdated (invalid) comments. Bug: 70857126 Test: m -j ; make -j offline-sdk-docs ; make -j cts ; \ cts-tradefed run cts-dev -m CtsMediaTestCases -t android.media.cts.AudioManagerTest#testMicrophoneMuteIntent Change-Id: I7391522f0195d06592e4f853e9b672fdec66d37a Merged-In: I7391522f0195d06592e4f853e9b672fdec66d37a --- api/current.txt | 1 + media/java/android/media/AudioManager.java | 15 +++++++++++++++ .../com/android/server/audio/AudioService.java | 9 ++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/api/current.txt b/api/current.txt index 2f669e91631d4..bc12d2b9e8e2c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -21435,6 +21435,7 @@ package android.media { field public static final java.lang.String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY"; field public static final java.lang.String ACTION_HDMI_AUDIO_PLUG = "android.media.action.HDMI_AUDIO_PLUG"; field public static final java.lang.String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG"; + field public static final java.lang.String ACTION_MICROPHONE_MUTE_CHANGED = "android.media.action.MICROPHONE_MUTE_CHANGED"; field public static final deprecated java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED"; field public static final java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED"; field public static final int ADJUST_LOWER = -1; // 0xffffffff diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index ede172c225ef0..a80c74197de25 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1551,6 +1551,21 @@ public class AudioManager { return AudioSystem.isMicrophoneMuted(); } + /** + * Broadcast Action: microphone muting state changed. + * + * You cannot receive this through components declared + * in manifests, only by explicitly registering for it with + * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter) + * Context.registerReceiver()}. + * + *

The intent has no extra values, use {@link #isMicrophoneMute} to check whether the + * microphone is muted. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_MICROPHONE_MUTE_CHANGED = + "android.media.action.MICROPHONE_MUTE_CHANGED"; + /** * Sets the audio mode. *

diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index cb96bacac9142..9e37c78017e53 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2240,12 +2240,15 @@ public class AudioService extends IAudioService.Stub if (DEBUG_VOL) { Log.d(TAG, String.format("Mic mute %s, user=%d", on, userId)); } - // If mute is for current user actually mute, else just persist the setting - // which will be loaded on user switch. + // only mute for the current user if (getCurrentUserId() == userId) { + final boolean currentMute = AudioSystem.isMicrophoneMuted(); AudioSystem.muteMicrophone(on); + if (on != currentMute) { + mContext.sendBroadcast(new Intent(AudioManager.ACTION_MICROPHONE_MUTE_CHANGED) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)); + } } - // Post a persist microphone msg. } @Override