diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4bb1a8c530a..9929f8b27a5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2958,6 +2958,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index aa43f12f4b6..9e3bc4b9094 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9769,6 +9769,9 @@
Winscope Trace
+
+ Sensors Off
+
Work profile settings
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index 5edbc7031ff..bb791abef81 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -16,9 +16,12 @@
package com.android.settings.development.qstile;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.hardware.SensorPrivacyManager;
+import android.app.KeyguardManager;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
@@ -38,6 +41,8 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.app.LocalePicker;
import com.android.internal.statusbar.IStatusBarService;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.development.SystemPropPoker;
@@ -273,4 +278,45 @@ public abstract class DevelopmentTiles extends TileService {
}
}
}
-}
\ No newline at end of file
+
+ /**
+ * Tile to toggle sensors off to control camera, mic, and sensors managed by the SensorManager.
+ */
+ public static class SensorsOff extends DevelopmentTiles {
+ private Context mContext;
+ private SensorPrivacyManager mSensorPrivacyManager;
+ private KeyguardManager mKeyguardManager;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private boolean mIsEnabled;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mContext = getApplicationContext();
+ mSensorPrivacyManager = (SensorPrivacyManager) mContext.getSystemService(
+ Context.SENSOR_PRIVACY_SERVICE);
+ mIsEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled();
+ mMetricsFeatureProvider = FeatureFactory.getFactory(
+ mContext).getMetricsFeatureProvider();
+ mKeyguardManager = (KeyguardManager) mContext.getSystemService(
+ Context.KEYGUARD_SERVICE);
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public void setIsEnabled(boolean isEnabled) {
+ // Don't allow sensors to be reenabled from the lock screen.
+ if (mIsEnabled && mKeyguardManager.isKeyguardLocked()) {
+ return;
+ }
+ mMetricsFeatureProvider.action(getApplicationContext(), SettingsEnums.QS_SENSOR_PRIVACY,
+ isEnabled);
+ mIsEnabled = isEnabled;
+ mSensorPrivacyManager.setSensorPrivacy(isEnabled);
+ }
+ }
+}