Merge "Refactor sensor use dialog to show above applications" into sc-dev

This commit is contained in:
Evan Severson
2021-10-01 23:46:07 +00:00
committed by Android (Google) Code Review
4 changed files with 119 additions and 75 deletions

View File

@@ -0,0 +1,74 @@
package com.android.systemui.sensorprivacy
import android.content.Context
import android.content.DialogInterface
import android.content.res.Resources
import android.text.Html
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import com.android.internal.widget.DialogTitle
import com.android.systemui.R
import com.android.systemui.statusbar.phone.SystemUIDialog
class SensorUseDialog(
context: Context,
val sensor: Int,
val clickListener: DialogInterface.OnClickListener
) : SystemUIDialog(context) {
// TODO move to onCreate (b/200815309)
init {
window!!.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)
window!!.addSystemFlags(
WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
val layoutInflater = LayoutInflater.from(context)
val customTitleView = layoutInflater.inflate(R.layout.sensor_use_started_title, null)
customTitleView.requireViewById<DialogTitle>(R.id.sensor_use_started_title_message)
.setText(when (sensor) {
SensorUseStartedActivity.MICROPHONE ->
R.string.sensor_privacy_start_use_mic_dialog_title
SensorUseStartedActivity.CAMERA ->
R.string.sensor_privacy_start_use_camera_dialog_title
SensorUseStartedActivity.ALL_SENSORS ->
R.string.sensor_privacy_start_use_mic_camera_dialog_title
else -> Resources.ID_NULL
})
customTitleView.requireViewById<ImageView>(R.id.sensor_use_microphone_icon).visibility =
if (sensor == SensorUseStartedActivity.MICROPHONE ||
sensor == SensorUseStartedActivity.ALL_SENSORS) {
View.VISIBLE
} else {
View.GONE
}
customTitleView.requireViewById<ImageView>(R.id.sensor_use_camera_icon).visibility =
if (sensor == SensorUseStartedActivity.CAMERA ||
sensor == SensorUseStartedActivity.ALL_SENSORS) {
View.VISIBLE
} else {
View.GONE
}
setCustomTitle(customTitleView)
setMessage(Html.fromHtml(context.getString(when (sensor) {
SensorUseStartedActivity.MICROPHONE ->
R.string.sensor_privacy_start_use_mic_dialog_content
SensorUseStartedActivity.CAMERA ->
R.string.sensor_privacy_start_use_camera_dialog_content
SensorUseStartedActivity.ALL_SENSORS ->
R.string.sensor_privacy_start_use_mic_camera_dialog_content
else -> Resources.ID_NULL
}), 0))
setButton(BUTTON_POSITIVE,
context.getString(com.android.internal.R.string
.sensor_privacy_start_use_dialog_turn_on_button), clickListener)
setButton(BUTTON_NEGATIVE,
context.getString(com.android.internal.R.string
.cancel), clickListener)
setCancelable(false)
}
}

View File

@@ -16,33 +16,28 @@
package com.android.systemui.sensorprivacy package com.android.systemui.sensorprivacy
import android.app.Activity
import android.app.AlertDialog
import android.content.DialogInterface import android.content.DialogInterface
import android.content.DialogInterface.BUTTON_NEGATIVE
import android.content.DialogInterface.BUTTON_POSITIVE
import android.content.Intent import android.content.Intent
import android.content.Intent.EXTRA_PACKAGE_NAME 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_ALL_SENSORS import android.hardware.SensorPrivacyManager.EXTRA_ALL_SENSORS
import android.hardware.SensorPrivacyManager.EXTRA_SENSOR import android.hardware.SensorPrivacyManager.EXTRA_SENSOR
import android.hardware.SensorPrivacyManager.Sources.DIALOG import android.hardware.SensorPrivacyManager.Sources.DIALOG
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.text.Html import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION
import android.view.View.GONE import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__CANCEL
import android.view.View.VISIBLE import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE
import android.widget.ImageView import com.android.internal.util.FrameworkStatsLog.write
import com.android.internal.app.AlertActivity
import com.android.internal.widget.DialogTitle
import com.android.systemui.R
import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.phone.KeyguardDismissUtil
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import javax.inject.Inject import javax.inject.Inject
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__CANCEL
import com.android.internal.util.FrameworkStatsLog.write
/** /**
* Dialog to be shown on top of apps that are attempting to use a sensor (e.g. microphone) which is * Dialog to be shown on top of apps that are attempting to use a sensor (e.g. microphone) which is
@@ -55,7 +50,7 @@ class SensorUseStartedActivity @Inject constructor(
private val keyguardStateController: KeyguardStateController, private val keyguardStateController: KeyguardStateController,
private val keyguardDismissUtil: KeyguardDismissUtil, private val keyguardDismissUtil: KeyguardDismissUtil,
@Background private val bgHandler: Handler @Background private val bgHandler: Handler
) : AlertActivity(), DialogInterface.OnClickListener { ) : Activity(), DialogInterface.OnClickListener {
companion object { companion object {
private val LOG_TAG = SensorUseStartedActivity::class.java.simpleName private val LOG_TAG = SensorUseStartedActivity::class.java.simpleName
@@ -63,9 +58,9 @@ class SensorUseStartedActivity @Inject constructor(
private const val SUPPRESS_REMINDERS_REMOVAL_DELAY_MILLIS = 2000L private const val SUPPRESS_REMINDERS_REMOVAL_DELAY_MILLIS = 2000L
private const val UNLOCK_DELAY_MILLIS = 200L private const val UNLOCK_DELAY_MILLIS = 200L
private const val CAMERA = SensorPrivacyManager.Sensors.CAMERA internal const val CAMERA = SensorPrivacyManager.Sensors.CAMERA
private const val MICROPHONE = SensorPrivacyManager.Sensors.MICROPHONE internal const val MICROPHONE = SensorPrivacyManager.Sensors.MICROPHONE
private const val ALL_SENSORS = Integer.MAX_VALUE internal const val ALL_SENSORS = Integer.MAX_VALUE
} }
private var sensor = -1 private var sensor = -1
@@ -74,6 +69,8 @@ class SensorUseStartedActivity @Inject constructor(
private lateinit var sensorPrivacyListener: IndividualSensorPrivacyController.Callback private lateinit var sensorPrivacyListener: IndividualSensorPrivacyController.Callback
private var mDialog: AlertDialog? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -91,7 +88,7 @@ class SensorUseStartedActivity @Inject constructor(
IndividualSensorPrivacyController.Callback { _, _ -> IndividualSensorPrivacyController.Callback { _, _ ->
if (!sensorPrivacyController.isSensorBlocked(MICROPHONE) && if (!sensorPrivacyController.isSensorBlocked(MICROPHONE) &&
!sensorPrivacyController.isSensorBlocked(CAMERA)) { !sensorPrivacyController.isSensorBlocked(CAMERA)) {
dismiss() finish()
} }
} }
@@ -109,71 +106,22 @@ class SensorUseStartedActivity @Inject constructor(
} }
} }
sensorPrivacyListener = sensorPrivacyListener =
IndividualSensorPrivacyController.Callback { IndividualSensorPrivacyController.Callback { whichSensor: Int,
whichSensor: Int, isBlocked: Boolean -> isBlocked: Boolean ->
if (whichSensor == sensor && !isBlocked) { if (whichSensor == sensor && !isBlocked) {
dismiss() finish()
} }
} }
sensorPrivacyController.addCallback(sensorPrivacyListener) sensorPrivacyController.addCallback(sensorPrivacyListener)
sensorPrivacyController.addCallback { _, isBlocked -> if (!sensorPrivacyController.isSensorBlocked(sensor)) {
if (!isBlocked) {
dismiss()
}
}
}
mAlertParams.apply {
try {
mCustomTitleView = mInflater.inflate(R.layout.sensor_use_started_title, null)
mCustomTitleView.findViewById<DialogTitle>(R.id.sensor_use_started_title_message)!!
.setText(when (sensor) {
MICROPHONE ->
R.string.sensor_privacy_start_use_mic_dialog_title
CAMERA ->
R.string.sensor_privacy_start_use_camera_dialog_title
ALL_SENSORS ->
R.string.sensor_privacy_start_use_mic_camera_dialog_title
else -> Resources.ID_NULL
})
mCustomTitleView.findViewById<ImageView>(R.id.sensor_use_microphone_icon)!!
.visibility = if (sensor == MICROPHONE || sensor == ALL_SENSORS) {
VISIBLE
} else {
GONE
}
mCustomTitleView.findViewById<ImageView>(R.id.sensor_use_camera_icon)!!
.visibility = if (sensor == CAMERA || sensor == ALL_SENSORS) {
VISIBLE
} else {
GONE
}
mMessage = Html.fromHtml(getString(when (sensor) {
MICROPHONE ->
R.string.sensor_privacy_start_use_mic_dialog_content
CAMERA ->
R.string.sensor_privacy_start_use_camera_dialog_content
ALL_SENSORS ->
R.string.sensor_privacy_start_use_mic_camera_dialog_content
else -> Resources.ID_NULL
}, packageManager.getApplicationInfo(sensorUsePackageName, 0)
.loadLabel(packageManager)), 0)
} catch (e: PackageManager.NameNotFoundException) {
finish() finish()
return return
} }
mPositiveButtonText = getString(
com.android.internal.R.string.sensor_privacy_start_use_dialog_turn_on_button)
mNegativeButtonText = getString(android.R.string.cancel)
mPositiveButtonListener = this@SensorUseStartedActivity
mNegativeButtonListener = this@SensorUseStartedActivity
} }
setupAlert() mDialog = SensorUseDialog(this, sensor, this)
mDialog!!.show()
} }
override fun onStart() { override fun onStart() {
@@ -212,7 +160,7 @@ class SensorUseStartedActivity @Inject constructor(
} }
} }
dismiss() finish()
} }
override fun onStop() { override fun onStop() {
@@ -229,6 +177,7 @@ class SensorUseStartedActivity @Inject constructor(
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
mDialog?.dismiss()
sensorPrivacyController.removeCallback(sensorPrivacyListener) sensorPrivacyController.removeCallback(sensorPrivacyListener)
} }
@@ -263,4 +212,4 @@ class SensorUseStartedActivity @Inject constructor(
.suppressSensorPrivacyReminders(sensor, suppressed) .suppressSensorPrivacyReminders(sensor, suppressed)
} }
} }
} }

View File

@@ -24,6 +24,7 @@ import android.hardware.SensorPrivacyManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@@ -57,6 +58,8 @@ public class TvUnblockSensorActivity extends TvBottomSheetActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getWindow().addSystemFlags(
WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
boolean allSensors = getIntent().getBooleanExtra(SensorPrivacyManager.EXTRA_ALL_SENSORS, boolean allSensors = getIntent().getBooleanExtra(SensorPrivacyManager.EXTRA_ALL_SENSORS,
false); false);

View File

@@ -708,6 +708,16 @@ public final class SensorPrivacyService extends SystemService {
@Override @Override
public void setIndividualSensorPrivacy(@UserIdInt int userId, public void setIndividualSensorPrivacy(@UserIdInt int userId,
@SensorPrivacyManager.Sources.Source int source, int sensor, boolean enable) { @SensorPrivacyManager.Sources.Source int source, int sensor, boolean enable) {
if (DEBUG) {
Log.d(TAG, "callingUid=" + Binder.getCallingUid()
+ " callingPid=" + Binder.getCallingPid()
+ " setIndividualSensorPrivacy("
+ "userId=" + userId
+ " source=" + source
+ " sensor=" + sensor
+ " enable=" + enable
+ ")");
}
enforceManageSensorPrivacyPermission(); enforceManageSensorPrivacyPermission();
if (userId == UserHandle.USER_CURRENT) { if (userId == UserHandle.USER_CURRENT) {
userId = mCurrentUser; userId = mCurrentUser;
@@ -892,6 +902,14 @@ public final class SensorPrivacyService extends SystemService {
@Override @Override
public boolean isIndividualSensorPrivacyEnabled(@UserIdInt int userId, int sensor) { public boolean isIndividualSensorPrivacyEnabled(@UserIdInt int userId, int sensor) {
if (DEBUG) {
Log.d(TAG, "callingUid=" + Binder.getCallingUid()
+ " callingPid=" + Binder.getCallingPid()
+ " isIndividualSensorPrivacyEnabled("
+ "userId=" + userId
+ " sensor=" + sensor
+ ")");
}
enforceObserveSensorPrivacyPermission(); enforceObserveSensorPrivacyPermission();
if (userId == UserHandle.USER_CURRENT) { if (userId == UserHandle.USER_CURRENT) {
userId = mCurrentUser; userId = mCurrentUser;