Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c357a62 authored by Evan Severson's avatar Evan Severson Committed by Automerger Merge Worker
Browse files

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

Merge "Refactor sensor use dialog to show above applications" into sc-dev am: 10670dd8 am: 7ef20c87

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15851330

Change-Id: I6e7204df1ebafc941b91092e6be3aacc17b4645f
parents 3f35c2b2 7ef20c87
Loading
Loading
Loading
Loading
+74 −0
Original line number Original line 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)
    }
}
+24 −75
Original line number Original line Diff line number Diff line
@@ -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)
    }
    }


+3 −0
Original line number Original line Diff line number Diff line
@@ -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);
+18 −0
Original line number Original line Diff line number Diff line
@@ -711,6 +711,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;
@@ -895,6 +905,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;