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

Commit 301e3ae6 authored by Chandru S's avatar Chandru S
Browse files

Ignore aod/dozing/off -> lockscreen transitions if the power manager wake up...

Ignore aod/dozing/off -> lockscreen transitions if the power manager wake up reason is not allowlisted

Fixes: 301271023
Test: atest KeyguardFaceAuthInteractorTest
Test: manually,
   1. Disable AOD
   2. Put device to sleep
   3. Plug in device without moving it or touching the screen
   4. Device should wake up and show the lockscreen
   5. Face auth should not be triggered
Change-Id: Ia9b65b4dab87afd19e233d46ee3511a8bbf4eef9
parent 576099b9
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