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

Commit c63f402b 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: 10670dd8

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

Change-Id: Ic80120829cf42a4ea58d7519c17d952ad24cc2ba
parents 7db30132 10670dd8
Loading
Loading
Loading
Loading
+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)
    }
}
+24 −75
Original line number Diff line number Diff line
@@ -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)
    }

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