Loading packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseDialog.kt 0 → 100644 +74 −0 Original line number Diff line number Diff line 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) } } packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt +24 −75 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading @@ -91,7 +88,7 @@ class SensorUseStartedActivity @Inject constructor( IndividualSensorPrivacyController.Callback { _, _ -> if (!sensorPrivacyController.isSensorBlocked(MICROPHONE) && !sensorPrivacyController.isSensorBlocked(CAMERA)) { dismiss() finish() } } Loading @@ -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() { Loading Loading @@ -212,7 +160,7 @@ class SensorUseStartedActivity @Inject constructor( } } dismiss() finish() } override fun onStop() { Loading @@ -229,6 +177,7 @@ class SensorUseStartedActivity @Inject constructor( override fun onDestroy() { super.onDestroy() mDialog?.dismiss() sensorPrivacyController.removeCallback(sensorPrivacyListener) } Loading packages/SystemUI/src/com/android/systemui/sensorprivacy/television/TvUnblockSensorActivity.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading services/core/java/com/android/server/SensorPrivacyService.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading
packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseDialog.kt 0 → 100644 +74 −0 Original line number Diff line number Diff line 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) } }
packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt +24 −75 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading @@ -91,7 +88,7 @@ class SensorUseStartedActivity @Inject constructor( IndividualSensorPrivacyController.Callback { _, _ -> if (!sensorPrivacyController.isSensorBlocked(MICROPHONE) && !sensorPrivacyController.isSensorBlocked(CAMERA)) { dismiss() finish() } } Loading @@ -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() { Loading Loading @@ -212,7 +160,7 @@ class SensorUseStartedActivity @Inject constructor( } } dismiss() finish() } override fun onStop() { Loading @@ -229,6 +177,7 @@ class SensorUseStartedActivity @Inject constructor( override fun onDestroy() { super.onDestroy() mDialog?.dismiss() sensorPrivacyController.removeCallback(sensorPrivacyListener) } Loading
packages/SystemUI/src/com/android/systemui/sensorprivacy/television/TvUnblockSensorActivity.java +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
services/core/java/com/android/server/SensorPrivacyService.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading