From 1af26bd238845211dc6a13002c4ce39d0e19fced Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 3 Mar 2021 14:53:49 -0800 Subject: [PATCH] Mute microphone when the mic privacy toggle is enabled If the mic is only known to be muted for the reasons of the toggle we don't expose it in the isMicrophoneMuted api. Test: Test with user switching and changing the toggle Bug: 162549680 Change-Id: Iea794fee4d6d232e0bd5697eb8ed38c6a9f65208 --- .../android/server/audio/AudioService.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 68f10a5106ef9..1950710a36e0a 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -61,6 +61,8 @@ import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Configuration; import android.database.ContentObserver; +import android.hardware.SensorPrivacyManager; +import android.hardware.SensorPrivacyManagerInternal; import android.hardware.hdmi.HdmiAudioSystemClient; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient; @@ -520,6 +522,7 @@ public class AudioService extends IAudioService.Stub /** Interface for UserManagerService. */ private final UserManagerInternal mUserManagerInternal; private final ActivityManagerInternal mActivityManagerInternal; + private final SensorPrivacyManagerInternal mSensorPrivacyManagerInternal; private final UserRestrictionsListener mUserRestrictionsListener = new AudioServiceUserRestrictionsListener(); @@ -720,9 +723,12 @@ public class AudioService extends IAudioService.Stub private String mEnabledSurroundFormats; private boolean mSurroundModeChanged; + private boolean mSupportsMicPrivacyToggle; + private boolean mMicMuteFromSwitch; private boolean mMicMuteFromApi; private boolean mMicMuteFromRestrictions; + private boolean mMicMuteFromPrivacyToggle; // caches the value returned by AudioSystem.isMicrophoneMuted() private boolean mMicMuteFromSystemCached; @@ -822,6 +828,8 @@ public class AudioService extends IAudioService.Stub mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); + mSensorPrivacyManagerInternal = + LocalServices.getService(SensorPrivacyManagerInternal.class); PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent"); @@ -831,6 +839,9 @@ public class AudioService extends IAudioService.Stub mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); + mSupportsMicPrivacyToggle = mContext.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_MICROPHONE_TOGGLE); + // Initialize volume // Priority 1 - Android Property // Priority 2 - Audio Policy Service @@ -1106,6 +1117,16 @@ public class AudioService extends IAudioService.Stub } } + if (mSupportsMicPrivacyToggle) { + mSensorPrivacyManagerInternal.addSensorPrivacyListenerForAllUsers( + SensorPrivacyManager.Sensors.MICROPHONE, (userId, enabled) -> { + if (userId == getCurrentUserId()) { + mMicMuteFromPrivacyToggle = enabled; + setMicrophoneMuteNoCallerCheck(getCurrentUserId()); + } + }); + } + mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); sendMsg(mAudioHandler, @@ -3840,11 +3861,12 @@ public class AudioService extends IAudioService.Stub * @return true if microphone is reported as muted by primary HAL */ public boolean isMicrophoneMuted() { - return mMicMuteFromSystemCached; + return mMicMuteFromSystemCached && !mMicMuteFromPrivacyToggle; } private boolean isMicrophoneSupposedToBeMuted() { - return mMicMuteFromSwitch || mMicMuteFromRestrictions || mMicMuteFromApi; + return mMicMuteFromSwitch || mMicMuteFromRestrictions || mMicMuteFromApi + || mMicMuteFromPrivacyToggle; } private void setMicrophoneMuteNoCallerCheck(int userId) { @@ -7474,6 +7496,13 @@ public class AudioService extends IAudioService.Stub // the current audio focus owner is no longer valid mMediaFocusControl.discardAudioFocusOwner(); + if (mSupportsMicPrivacyToggle) { + mMicMuteFromPrivacyToggle = mSensorPrivacyManagerInternal + .isSensorPrivacyEnabled(getCurrentUserId(), + SensorPrivacyManager.Sensors.MICROPHONE); + setMicrophoneMuteNoCallerCheck(getCurrentUserId()); + } + // load volume settings for new user readAudioSettings(true /*userSwitch*/); // preserve STREAM_MUSIC volume from one user to the next.