From 2757d3e3cb7a2fa12212f2b879af735f72aaeea6 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Fri, 29 Jan 2021 17:41:07 -0800 Subject: [PATCH] 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 --- .../systemui/qs/tiles/CameraToggleTile.java | 6 ++- .../qs/tiles/MicrophoneToggleTile.java | 6 ++- .../qs/tiles/SensorPrivacyToggleTile.java | 13 +++++- .../sensorprivacy/SensorUseStartedActivity.kt | 41 +++++++++++++++++-- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java index b6e07b1f85306..3841daca7ebe5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java index 9cc6f09f543c1..2f0071a1f198d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java index 12205d6483a8a..00703e7f84038 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java @@ -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 implements IndividualSensorPrivacyController.Callback { + private final KeyguardStateController mKeyguard; private IndividualSensorPrivacyController mSensorPrivacyController; /** @@ -61,10 +63,12 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl { + mSensorPrivacyController.setSensorBlocked(getSensorId(), + !mSensorPrivacyController.isSensorBlocked(getSensorId())); + }); + return; + } mSensorPrivacyController.setSensorBlocked(getSensorId(), !mSensorPrivacyController.isSensorBlocked(getSensorId())); } diff --git a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt index c1161f1a08635..d707bca0383eb 100644 --- a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt @@ -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 *

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 + } } \ No newline at end of file