Make some small fixes to sensor privacy ui

Allow dialog to show on lock screen.
Force the user to make a decision so they can't accidentally leave the
dialog and miss the opportunity.
Protect the changing of state using quicksettings by the keyguard.
Protect disabling sensor privacy with the dialog by the keybguard.

Test: Manual
Bug: 162549680
Fixes: 178759375
Change-Id: I481eea900b2a9a25c700b847c5090ea64855d55d
This commit is contained in:
Evan Severson
2021-01-29 17:41:07 -08:00
parent cd347c4bd0
commit 2757d3e3cb
4 changed files with 58 additions and 8 deletions

View File

@@ -36,6 +36,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import javax.inject.Inject;
@@ -49,9 +50,10 @@ public class CameraToggleTile extends SensorPrivacyToggleTile {
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger,
IndividualSensorPrivacyController sensorPrivacyController) {
IndividualSensorPrivacyController sensorPrivacyController,
KeyguardStateController keyguardStateController) {
super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
activityStarter, qsLogger, sensorPrivacyController);
activityStarter, qsLogger, sensorPrivacyController, keyguardStateController);
}
@Override

View File

@@ -36,6 +36,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import javax.inject.Inject;
@@ -49,9 +50,10 @@ public class MicrophoneToggleTile extends SensorPrivacyToggleTile {
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger,
IndividualSensorPrivacyController sensorPrivacyController) {
IndividualSensorPrivacyController sensorPrivacyController,
KeyguardStateController keyguardStateController) {
super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
activityStarter, qsLogger, sensorPrivacyController);
activityStarter, qsLogger, sensorPrivacyController, keyguardStateController);
}
@Override

View File

@@ -35,6 +35,7 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
/**
* Superclass to toggle individual sensor privacy via quick settings tiles
@@ -42,6 +43,7 @@ import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanState> implements
IndividualSensorPrivacyController.Callback {
private final KeyguardStateController mKeyguard;
private IndividualSensorPrivacyController mSensorPrivacyController;
/**
@@ -61,10 +63,12 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanS
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger,
IndividualSensorPrivacyController sensorPrivacyController) {
IndividualSensorPrivacyController sensorPrivacyController,
KeyguardStateController keyguardStateController) {
super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
activityStarter, qsLogger);
mSensorPrivacyController = sensorPrivacyController;
mKeyguard = keyguardStateController;
mSensorPrivacyController.observe(getLifecycle(), this);
}
@@ -75,6 +79,13 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanS
@Override
protected void handleClick() {
if (mKeyguard.isMethodSecure() && mKeyguard.isShowing()) {
mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
mSensorPrivacyController.setSensorBlocked(getSensorId(),
!mSensorPrivacyController.isSensorBlocked(getSensorId()));
});
return;
}
mSensorPrivacyController.setSensorBlocked(getSensorId(),
!mSensorPrivacyController.isSensorBlocked(getSensorId()));
}

View File

@@ -17,14 +17,19 @@
package com.android.systemui.sensorprivacy
import android.app.AppOpsManager
import android.app.KeyguardManager
import android.app.KeyguardManager.KeyguardDismissCallback
import android.content.DialogInterface
import android.content.Intent.EXTRA_PACKAGE_NAME
import android.content.pm.PackageManager
import android.content.res.Resources
import android.hardware.SensorPrivacyManager
import android.hardware.SensorPrivacyManager.*
import android.hardware.SensorPrivacyManager.EXTRA_SENSOR
import android.hardware.SensorPrivacyManager.INDIVIDUAL_SENSOR_CAMERA
import android.hardware.SensorPrivacyManager.INDIVIDUAL_SENSOR_MICROPHONE
import android.os.Bundle
import android.text.Html
import android.util.Log
import com.android.internal.app.AlertActivity
import com.android.systemui.R
@@ -35,18 +40,29 @@ import com.android.systemui.R
* <p>The dialog is started for the user the app is running for which might be a secondary users.
*/
class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListener {
companion object {
private val LOG_TAG = SensorUseStartedActivity::class.java.simpleName
}
private var sensor = -1
private lateinit var sensorUsePackageName: String
private lateinit var sensorPrivacyManager: SensorPrivacyManager
private lateinit var appOpsManager: AppOpsManager
private lateinit var keyguardManager: KeyguardManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setShowWhenLocked(true)
setFinishOnTouchOutside(false)
setResult(RESULT_CANCELED)
sensorPrivacyManager = getSystemService(SensorPrivacyManager::class.java)!!
appOpsManager = getSystemService(AppOpsManager::class.java)!!
keyguardManager = getSystemService(KeyguardManager::class.java)!!
sensorUsePackageName = intent.getStringExtra(EXTRA_PACKAGE_NAME) ?: return
sensor = intent.getIntExtra(EXTRA_SENSOR, -1).also {
@@ -107,8 +123,23 @@ class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListene
override fun onClick(dialog: DialogInterface?, which: Int) {
when (which) {
BUTTON_POSITIVE -> {
sensorPrivacyManager.setIndividualSensorPrivacyForProfileGroup(sensor, false)
setResult(RESULT_OK)
if (keyguardManager.isDeviceLocked) {
keyguardManager
.requestDismissKeyguard(this, object : KeyguardDismissCallback() {
override fun onDismissError() {
Log.e(LOG_TAG, "Cannot dismiss keyguard")
}
override fun onDismissSucceeded() {
sensorPrivacyManager
.setIndividualSensorPrivacyForProfileGroup(sensor, false)
setResult(RESULT_OK)
}
})
} else {
sensorPrivacyManager.setIndividualSensorPrivacyForProfileGroup(sensor, false)
setResult(RESULT_OK)
}
}
}
@@ -120,4 +151,8 @@ class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListene
sensorPrivacyManager.suppressIndividualSensorPrivacyReminders(sensorUsePackageName, false)
}
override fun onBackPressed() {
// do not allow backing out
}
}