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

Commit 2757d3e3 authored by Evan Severson's avatar Evan Severson
Browse files

Make some small fixes to sensor privacy ui

Allow dialog to show on lock screen.
Force the user to make a decision so they can't accidentally leave the
dialog and miss the opportunity.
Protect the changing of state using quicksettings by the keyguard.
Protect disabling sensor privacy with the dialog by the keybguard.

Test: Manual
Bug: 162549680
Fixes: 178759375
Change-Id: I481eea900b2a9a25c700b847c5090ea64855d55d
parent cd347c4b
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;

import javax.inject.Inject;

@@ -49,9 +50,10 @@ public class CameraToggleTile extends SensorPrivacyToggleTile {
            StatusBarStateController statusBarStateController,
            ActivityStarter activityStarter,
            QSLogger qsLogger,
            IndividualSensorPrivacyController sensorPrivacyController) {
            IndividualSensorPrivacyController sensorPrivacyController,
            KeyguardStateController keyguardStateController) {
        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
                activityStarter, qsLogger, sensorPrivacyController);
                activityStarter, qsLogger, sensorPrivacyController, keyguardStateController);
    }

    @Override
+4 −2
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;

import javax.inject.Inject;

@@ -49,9 +50,10 @@ public class MicrophoneToggleTile extends SensorPrivacyToggleTile {
            StatusBarStateController statusBarStateController,
            ActivityStarter activityStarter,
            QSLogger qsLogger,
            IndividualSensorPrivacyController sensorPrivacyController) {
            IndividualSensorPrivacyController sensorPrivacyController,
            KeyguardStateController keyguardStateController) {
        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
                activityStarter, qsLogger, sensorPrivacyController);
                activityStarter, qsLogger, sensorPrivacyController, keyguardStateController);
    }

    @Override
+12 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.KeyguardStateController;

/**
 * Superclass to toggle individual sensor privacy via quick settings tiles
@@ -42,6 +43,7 @@ import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanState> implements
        IndividualSensorPrivacyController.Callback {

    private final KeyguardStateController mKeyguard;
    private IndividualSensorPrivacyController mSensorPrivacyController;

    /**
@@ -61,10 +63,12 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanS
            StatusBarStateController statusBarStateController,
            ActivityStarter activityStarter,
            QSLogger qsLogger,
            IndividualSensorPrivacyController sensorPrivacyController) {
            IndividualSensorPrivacyController sensorPrivacyController,
            KeyguardStateController keyguardStateController) {
        super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController,
                activityStarter, qsLogger);
        mSensorPrivacyController = sensorPrivacyController;
        mKeyguard = keyguardStateController;
        mSensorPrivacyController.observe(getLifecycle(), this);
    }

@@ -75,6 +79,13 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanS

    @Override
    protected void handleClick() {
        if (mKeyguard.isMethodSecure() && mKeyguard.isShowing()) {
            mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
                mSensorPrivacyController.setSensorBlocked(getSensorId(),
                        !mSensorPrivacyController.isSensorBlocked(getSensorId()));
            });
            return;
        }
        mSensorPrivacyController.setSensorBlocked(getSensorId(),
                !mSensorPrivacyController.isSensorBlocked(getSensorId()));
    }
+38 −3
Original line number Diff line number Diff line
@@ -17,14 +17,19 @@
package com.android.systemui.sensorprivacy

import android.app.AppOpsManager
import android.app.KeyguardManager
import android.app.KeyguardManager.KeyguardDismissCallback
import android.content.DialogInterface
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_SENSOR
import android.hardware.SensorPrivacyManager.INDIVIDUAL_SENSOR_CAMERA
import android.hardware.SensorPrivacyManager.INDIVIDUAL_SENSOR_MICROPHONE
import android.os.Bundle
import android.text.Html
import android.util.Log
import com.android.internal.app.AlertActivity
import com.android.systemui.R

@@ -35,18 +40,29 @@ import com.android.systemui.R
 * <p>The dialog is started for the user the app is running for which might be a secondary users.
 */
class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListener {

    companion object {
        private val LOG_TAG = SensorUseStartedActivity::class.java.simpleName
    }

    private var sensor = -1
    private lateinit var sensorUsePackageName: String

    private lateinit var sensorPrivacyManager: SensorPrivacyManager
    private lateinit var appOpsManager: AppOpsManager
    private lateinit var keyguardManager: KeyguardManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setShowWhenLocked(true)

        setFinishOnTouchOutside(false)

        setResult(RESULT_CANCELED)
        sensorPrivacyManager = getSystemService(SensorPrivacyManager::class.java)!!
        appOpsManager = getSystemService(AppOpsManager::class.java)!!
        keyguardManager = getSystemService(KeyguardManager::class.java)!!

        sensorUsePackageName = intent.getStringExtra(EXTRA_PACKAGE_NAME) ?: return
        sensor = intent.getIntExtra(EXTRA_SENSOR, -1).also {
@@ -107,10 +123,25 @@ class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListene
    override fun onClick(dialog: DialogInterface?, which: Int) {
        when (which) {
            BUTTON_POSITIVE -> {
                if (keyguardManager.isDeviceLocked) {
                    keyguardManager
                            .requestDismissKeyguard(this, object : KeyguardDismissCallback() {
                        override fun onDismissError() {
                            Log.e(LOG_TAG, "Cannot dismiss keyguard")
                        }

                        override fun onDismissSucceeded() {
                            sensorPrivacyManager
                                    .setIndividualSensorPrivacyForProfileGroup(sensor, false)
                            setResult(RESULT_OK)
                        }
                    })
                } else {
                    sensorPrivacyManager.setIndividualSensorPrivacyForProfileGroup(sensor, false)
                    setResult(RESULT_OK)
                }
            }
        }

        dismiss()
    }
@@ -120,4 +151,8 @@ class SensorUseStartedActivity : AlertActivity(), DialogInterface.OnClickListene

        sensorPrivacyManager.suppressIndividualSensorPrivacyReminders(sensorUsePackageName, false)
    }

    override fun onBackPressed() {
        // do not allow backing out
    }
}
 No newline at end of file