summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Evan Severson <evanseverson@google.com> 2021-03-16 04:07:45 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-03-16 04:07:45 +0000
commitc7a5fdd81c2d6da97bd98b46be7451f5f062f2a5 (patch)
tree1fa7f0889990297f67edd006ffc13a6fe8da2b9a
parentac40826ea923d2b7612a7506bb98b252dc770971 (diff)
parent1af26bd238845211dc6a13002c4ce39d0e19fced (diff)
Merge "Mute microphone when the mic privacy toggle is enabled" into sc-dev
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java33
1 files 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 68f10a5106ef..1950710a36e0 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.