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
import android.app.Activity
import android.app.AlertDialog
import android.content.DialogInterface
import android.content.DialogInterface.BUTTON_NEGATIVE
import android.content.DialogInterface.BUTTON_POSITIVE
import android.content.Intent
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.EXTRA_ALL_SENSORS
import android.hardware.SensorPrivacyManager.EXTRA_SENSOR
import android.hardware.SensorPrivacyManager.Sources.DIALOG
import android.os.Bundle
import android.os.Handler
import android.text.Html
import android.view.View.GONE
import android.view.View.VISIBLE
import android.widget.ImageView
import com.android.internal.app.AlertActivity
import com.android.internal.widget.DialogTitle
import com.android.systemui.R
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__CANCEL
import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE
import com.android.internal.util.FrameworkStatsLog.write
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.phone.KeyguardDismissUtil
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
import com.android.systemui.statusbar.policy.KeyguardStateController
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
@@ -55,7 +50,7 @@ class SensorUseStartedActivity @Inject constructor(
private val keyguardStateController: KeyguardStateController,
private val keyguardDismissUtil: KeyguardDismissUtil,
@Background private val bgHandler: Handler
) : AlertActivity(), DialogInterface.OnClickListener {
) : Activity(), DialogInterface.OnClickListener {
companion object {
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 UNLOCK_DELAY_MILLIS = 200L
private const val CAMERA = SensorPrivacyManager.Sensors.CAMERA
private const val MICROPHONE = SensorPrivacyManager.Sensors.MICROPHONE
private const val ALL_SENSORS = Integer.MAX_VALUE
internal const val CAMERA = SensorPrivacyManager.Sensors.CAMERA
internal const val MICROPHONE = SensorPrivacyManager.Sensors.MICROPHONE
internal const val ALL_SENSORS = Integer.MAX_VALUE
}
private var sensor = -1
@@ -74,6 +69,8 @@ class SensorUseStartedActivity @Inject constructor(
private lateinit var sensorPrivacyListener: IndividualSensorPrivacyController.Callback
private var mDialog: AlertDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -91,7 +88,7 @@ class SensorUseStartedActivity @Inject constructor(
IndividualSensorPrivacyController.Callback { _, _ ->
if (!sensorPrivacyController.isSensorBlocked(MICROPHONE) &&
!sensorPrivacyController.isSensorBlocked(CAMERA)) {
dismiss()
finish()
}
}
@@ -109,71 +106,22 @@ class SensorUseStartedActivity @Inject constructor(
}
}
sensorPrivacyListener =
IndividualSensorPrivacyController.Callback {
whichSensor: Int, isBlocked: Boolean ->
IndividualSensorPrivacyController.Callback { whichSensor: Int,
isBlocked: Boolean ->
if (whichSensor == sensor && !isBlocked) {
dismiss()
finish()
}
}
sensorPrivacyController.addCallback(sensorPrivacyListener)
sensorPrivacyController.addCallback { _, isBlocked ->
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) {
if (!sensorPrivacyController.isSensorBlocked(sensor)) {
finish()
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() {
@@ -212,7 +160,7 @@ class SensorUseStartedActivity @Inject constructor(
}
}
dismiss()
finish()
}
override fun onStop() {
@@ -229,6 +177,7 @@ class SensorUseStartedActivity @Inject constructor(
override fun onDestroy() {
super.onDestroy()
mDialog?.dismiss()
sensorPrivacyController.removeCallback(sensorPrivacyListener)
}
@@ -263,4 +212,4 @@ class SensorUseStartedActivity @Inject constructor(
.suppressSensorPrivacyReminders(sensor, suppressed)
}
}
}
}

View File

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

View File

@@ -708,6 +708,16 @@ public final class SensorPrivacyService extends SystemService {
@Override
public void setIndividualSensorPrivacy(@UserIdInt int userId,
@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();
if (userId == UserHandle.USER_CURRENT) {
userId = mCurrentUser;
@@ -892,6 +902,14 @@ public final class SensorPrivacyService extends SystemService {
@Override
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();
if (userId == UserHandle.USER_CURRENT) {
userId = mCurrentUser;