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

Commit ea09b29b authored by Chandru S's avatar Chandru S Committed by Android (Google) Code Review
Browse files

Merge "Ignore aod/dozing/off -> lockscreen transitions if the power manager...

Merge "Ignore aod/dozing/off -> lockscreen transitions if the power manager wake up reason is not allowlisted" into main
parents d07dd03c 301e3ae6
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.shared.model.WakeSleepReason
import com.android.systemui.util.settings.GlobalSettings
import java.io.PrintWriter
import java.util.stream.Collectors
@@ -38,6 +39,7 @@ constructor(@Main resources: Resources, globalSettings: GlobalSettings, dumpMana
    private val defaultTriggerFaceAuthOnWakeUpFrom: Set<Int> =
        resources.getIntArray(R.array.config_face_auth_wake_up_triggers).toSet()
    private val triggerFaceAuthOnWakeUpFrom: Set<Int>
    private val wakeSleepReasonsToTriggerFaceAuth: Set<WakeSleepReason>

    init {
        triggerFaceAuthOnWakeUpFrom =
@@ -52,6 +54,14 @@ constructor(@Main resources: Resources, globalSettings: GlobalSettings, dumpMana
            } else {
                defaultTriggerFaceAuthOnWakeUpFrom
            }
        wakeSleepReasonsToTriggerFaceAuth =
            triggerFaceAuthOnWakeUpFrom
                .map {
                    val enumVal = WakeSleepReason.fromPowerManagerWakeReason(it)
                    assert(enumVal != WakeSleepReason.OTHER)
                    enumVal
                }
                .toSet()
        dumpManager.registerDumpable(this)
    }

@@ -59,6 +69,9 @@ constructor(@Main resources: Resources, globalSettings: GlobalSettings, dumpMana
        return triggerFaceAuthOnWakeUpFrom.contains(pmWakeReason)
    }

    fun shouldTriggerFaceAuthOnWakeUpFrom(wakeReason: WakeSleepReason): Boolean =
        wakeSleepReasonsToTriggerFaceAuth.contains(wakeReason)

    override fun dump(pw: PrintWriter, args: Array<out String>) {
        pw.println("FaceWakeUpTriggers:")
        for (pmWakeReason in triggerFaceAuthOnWakeUpFrom) {
+11 −5
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.keyguard.data.repository

import android.app.StatusBarManager
import android.content.Context
import android.hardware.face.FaceAuthenticateOptions
import android.hardware.face.FaceManager
import android.os.CancellationSignal
import com.android.internal.logging.InstanceId
@@ -47,6 +46,7 @@ import com.android.systemui.keyguard.shared.model.FailedFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.HelpFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.SuccessFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.SysUiFaceAuthenticateOptions
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.log.FaceAuthenticationLogger
import com.android.systemui.log.SessionTracker
@@ -578,7 +578,12 @@ constructor(
                    authCancellationSignal,
                    faceAuthCallback,
                    null,
                    FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
                    SysUiFaceAuthenticateOptions(
                            currentUserId,
                            uiEvent,
                            wakeReason = uiEvent.extraInfo
                        )
                        .toFaceAuthenticateOptions()
                )
            }
        } else if (canRunDetection.value) {
@@ -587,7 +592,7 @@ constructor(
                    uiEvent,
                    "face auth gating check is false, falling back to detection."
                )
                detect()
                detect(uiEvent)
            } else {
                faceAuthLogger.ignoredFaceAuthTrigger(
                    uiEvent = uiEvent,
@@ -602,7 +607,7 @@ constructor(
        }
    }

    suspend fun detect() {
    suspend fun detect(uiEvent: FaceAuthUiEvent) {
        if (!isDetectionSupported) {
            faceAuthLogger.detectionNotSupported(faceManager, faceManager?.sensorPropertiesInternal)
            return
@@ -619,7 +624,8 @@ constructor(
            faceManager?.detectFace(
                checkNotNull(detectCancellationSignal),
                detectionCallback,
                FaceAuthenticateOptions.Builder().setUserId(currentUserId).build()
                SysUiFaceAuthenticateOptions(currentUserId, uiEvent, uiEvent.extraInfo)
                    .toFaceAuthenticateOptions()
            )
        }
    }
+19 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.content.Context
import android.hardware.biometrics.BiometricFaceConstants
import com.android.keyguard.FaceAuthUiEvent
import com.android.keyguard.FaceWakeUpTriggersConfig
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.CoreStartable
import com.android.systemui.R
@@ -31,8 +32,10 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.FaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.TransitionState
@@ -40,6 +43,7 @@ import com.android.systemui.log.FaceAuthenticationLogger
import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.pairwise
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@@ -75,6 +79,8 @@ constructor(
    private val deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
    private val userRepository: UserRepository,
    private val facePropertyRepository: FacePropertyRepository,
    private val keyguardRepository: KeyguardRepository,
    private val faceWakeUpTriggersConfig: FaceWakeUpTriggersConfig,
) : CoreStartable, KeyguardFaceAuthInteractor {

    private val listeners: MutableList<FaceAuthenticationListener> = mutableListOf()
@@ -117,8 +123,21 @@ constructor(
                keyguardTransitionInteractor.dozingToLockscreenTransition
            )
            .filter { it.transitionState == TransitionState.STARTED }
            .sample(keyguardRepository.wakefulness)
            .filter { wakefulnessModel ->
                val validWakeupReason =
                    faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom(
                        wakefulnessModel.lastWakeReason
                    )
                if (!validWakeupReason) {
                    faceAuthenticationLogger.ignoredWakeupReason(wakefulnessModel.lastWakeReason)
                }
                validWakeupReason
            }
            .onEach {
                faceAuthenticationLogger.lockscreenBecameVisible(it)
                FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED.extraInfo =
                    it.lastWakeReason.powerManagerWakeReason
                runFaceAuth(
                    FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
                    fallbackToDetect = true
+29 −4
Original line number Diff line number Diff line
@@ -21,18 +21,37 @@ import android.os.PowerManager
/** The reason we're waking up or going to sleep, such as pressing the power button. */
enum class WakeSleepReason(
    val isTouch: Boolean,
    @PowerManager.WakeReason val powerManagerWakeReason: Int,
) {
    /** The physical power button was pressed to wake up or sleep the device. */
    POWER_BUTTON(isTouch = false),
    POWER_BUTTON(isTouch = false, PowerManager.WAKE_REASON_POWER_BUTTON),

    /** The user has tapped or double tapped to wake the screen. */
    TAP(isTouch = true),
    TAP(isTouch = true, PowerManager.WAKE_REASON_TAP),

    /** The user performed some sort of gesture to wake the screen. */
    GESTURE(isTouch = true),
    GESTURE(isTouch = true, PowerManager.WAKE_REASON_GESTURE),

    /** Waking up because a wake key other than power was pressed. */
    KEY(isTouch = false, PowerManager.WAKE_REASON_WAKE_KEY),

    /** Waking up because a wake motion was performed */
    MOTION(isTouch = false, PowerManager.WAKE_REASON_WAKE_MOTION),

    /** Waking due to the lid being opened. */
    LID(isTouch = false, PowerManager.WAKE_REASON_LID),

    /** Waking the device due to unfolding of a foldable device. */
    UNFOLD(isTouch = false, PowerManager.WAKE_REASON_UNFOLD_DEVICE),

    /** Waking up due to a user performed lift gesture. */
    LIFT(isTouch = false, PowerManager.WAKE_REASON_LIFT),

    /** Waking up due to a user interacting with a biometric. */
    BIOMETRIC(isTouch = false, PowerManager.WAKE_REASON_BIOMETRIC),

    /** Something else happened to wake up or sleep the device. */
    OTHER(isTouch = false);
    OTHER(isTouch = false, PowerManager.WAKE_REASON_UNKNOWN);

    companion object {
        fun fromPowerManagerWakeReason(reason: Int): WakeSleepReason {
@@ -40,6 +59,12 @@ enum class WakeSleepReason(
                PowerManager.WAKE_REASON_POWER_BUTTON -> POWER_BUTTON
                PowerManager.WAKE_REASON_TAP -> TAP
                PowerManager.WAKE_REASON_GESTURE -> GESTURE
                PowerManager.WAKE_REASON_WAKE_KEY -> KEY
                PowerManager.WAKE_REASON_WAKE_MOTION -> MOTION
                PowerManager.WAKE_REASON_LID -> LID
                PowerManager.WAKE_REASON_UNFOLD_DEVICE -> UNFOLD
                PowerManager.WAKE_REASON_LIFT -> LIFT
                PowerManager.WAKE_REASON_BIOMETRIC -> BIOMETRIC
                else -> OTHER
            }
        }
+17 −4
Original line number Diff line number Diff line
@@ -5,7 +5,8 @@ import android.hardware.face.FaceSensorPropertiesInternal
import com.android.keyguard.FaceAuthUiEvent
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.keyguard.shared.model.WakeSleepReason
import com.android.systemui.keyguard.shared.model.WakefulnessModel
import com.android.systemui.log.core.LogLevel.DEBUG
import com.android.systemui.log.dagger.FaceAuthLog
import com.google.errorprone.annotations.CompileTimeConstant
@@ -29,6 +30,18 @@ class FaceAuthenticationLogger
constructor(
    @FaceAuthLog private val logBuffer: LogBuffer,
) {

    fun ignoredWakeupReason(lastWakeReason: WakeSleepReason) {
        logBuffer.log(
            TAG,
            DEBUG,
            { str1 = "$lastWakeReason" },
            {
                "Ignoring off/aod/dozing -> Lockscreen transition " +
                    "because the last wake up reason is not allow-listed: $str1"
            }
        )
    }
    fun ignoredFaceAuthTrigger(uiEvent: FaceAuthUiEvent?, ignoredReason: String) {
        logBuffer.log(
            TAG,
@@ -175,12 +188,12 @@ constructor(
        logBuffer.log(TAG, DEBUG, "Triggering face auth because alternate bouncer is visible")
    }

    fun lockscreenBecameVisible(transitionStep: TransitionStep?) {
    fun lockscreenBecameVisible(wake: WakefulnessModel?) {
        logBuffer.log(
            TAG,
            DEBUG,
            { str1 = "$transitionStep" },
            { "Triggering face auth because lockscreen became visible due to transition: $str1" }
            { str1 = "${wake?.lastWakeReason}" },
            { "Triggering face auth because lockscreen became visible due to wake reason: $str1" }
        )
    }

Loading