Merge "Refactor sensor use dialog to show above applications" into sc-dev am: 10670dd872
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15851330 Change-Id: I405e3f435e8339eb4984a7fa70541e20f0439a9d
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -711,6 +711,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;
|
||||
@@ -895,6 +905,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;
|
||||
|
||||
Reference in New Issue
Block a user