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

Commit 6178607a authored by Beverly Tai's avatar Beverly Tai Committed by Android (Google) Code Review
Browse files

Merge "Add face help message deferral logic to BiometricMessageInteractor" into main

parents fc52b142 560fa5f2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ class FaceHelpMessageDeferralTest : SysuiTestCase() {
            threshold,
            logger,
            dumpManager,
            "0",
        )
    }
}
+0 −10
Original line number Diff line number Diff line
@@ -16,18 +16,8 @@

package com.android.keyguard.logging

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel.DEBUG
import com.android.systemui.log.dagger.BiometricLog
import javax.inject.Inject

/** Helper class for logging for [com.android.systemui.biometrics.FaceHelpMessageDeferral] */
@SysUISingleton
class FaceMessageDeferralLogger
@Inject
constructor(@BiometricLog private val logBuffer: LogBuffer) :
    BiometricMessageDeferralLogger(logBuffer, "FaceMessageDeferralLogger")

open class BiometricMessageDeferralLogger(
    private val logBuffer: LogBuffer,
+18 −8
Original line number Diff line number Diff line
@@ -18,14 +18,16 @@ package com.android.systemui.biometrics

import android.content.res.Resources
import com.android.keyguard.logging.BiometricMessageDeferralLogger
import com.android.keyguard.logging.FaceMessageDeferralLogger
import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.dagger.BiometricLog
import com.android.systemui.res.R
import java.io.PrintWriter
import java.util.Objects
import java.util.UUID
import javax.inject.Inject

@SysUISingleton
@@ -33,14 +35,16 @@ class FaceHelpMessageDeferralFactory
@Inject
constructor(
    @Main private val resources: Resources,
    private val logBuffer: FaceMessageDeferralLogger,
    @BiometricLog private val logBuffer: LogBuffer,
    private val dumpManager: DumpManager
) {
    fun create(): FaceHelpMessageDeferral {
        val id = UUID.randomUUID().toString()
        return FaceHelpMessageDeferral(
            resources = resources,
            logBuffer = logBuffer,
            logBuffer = BiometricMessageDeferralLogger(logBuffer, "FaceHelpMessageDeferral[$id]"),
            dumpManager = dumpManager,
            id = id,
        )
    }
}
@@ -51,15 +55,17 @@ constructor(
 */
class FaceHelpMessageDeferral(
    resources: Resources,
    logBuffer: FaceMessageDeferralLogger,
    dumpManager: DumpManager
    logBuffer: BiometricMessageDeferralLogger,
    dumpManager: DumpManager,
    val id: String,
) :
    BiometricMessageDeferral(
        resources.getIntArray(R.array.config_face_help_msgs_defer_until_timeout).toHashSet(),
        resources.getIntArray(R.array.config_face_help_msgs_ignore).toHashSet(),
        resources.getFloat(R.dimen.config_face_help_msgs_defer_until_timeout_threshold),
        logBuffer,
        dumpManager
        dumpManager,
        id,
    )

/**
@@ -72,7 +78,8 @@ open class BiometricMessageDeferral(
    private val acquiredInfoToIgnore: Set<Int>,
    private val threshold: Float,
    private val logBuffer: BiometricMessageDeferralLogger,
    dumpManager: DumpManager
    dumpManager: DumpManager,
    id: String,
) : Dumpable {
    private val acquiredInfoToFrequency: MutableMap<Int, Int> = HashMap()
    private val acquiredInfoToHelpString: MutableMap<Int, String> = HashMap()
@@ -80,7 +87,10 @@ open class BiometricMessageDeferral(
    private var totalFrames = 0

    init {
        dumpManager.registerDumpable(this.javaClass.name, this)
        dumpManager.registerNormalDumpable(
            "${this.javaClass.name}[$id]",
            this,
        )
    }

    override fun dump(pw: PrintWriter, args: Array<out String>) {
+27 −15
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.systemui.deviceentry.shared.model.FingerprintMessage
import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus
import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.Utils.Companion.toTriple
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -41,9 +42,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge

/**
 * BiometricMessage business logic. Filters biometric error/acquired/fail/success events for
 * authentication events that should never surface a message to the user at the current device
 * state.
 * BiometricMessage business logic. Filters biometric error/fail/success events for authentication
 * events that should never surface a message to the user at the current device state.
 */
@ExperimentalCoroutinesApi
@SysUISingleton
@@ -54,7 +54,8 @@ constructor(
    fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
    fingerprintPropertyInteractor: FingerprintPropertyInteractor,
    faceAuthInteractor: DeviceEntryFaceAuthInteractor,
    biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor,
    private val biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor,
    faceHelpMessageDeferralInteractor: FaceHelpMessageDeferralInteractor,
) {
    private val faceHelp: Flow<HelpFaceAuthenticationStatus> =
        faceAuthInteractor.authenticationStatus.filterIsInstance<HelpFaceAuthenticationStatus>()
@@ -130,19 +131,24 @@ constructor(
        )

    private val faceHelpMessage: Flow<FaceMessage> =
        biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled
            .flatMapLatest { fingerprintAndFaceEnrolledAndEnabled ->
        faceHelp
            .filterNot {
                // Message deferred to potentially show at face timeout error instead
                faceHelpMessageDeferralInteractor.shouldDefer(it.msgId)
            }
            .sample(biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled, ::Pair)
            .filter { (faceAuthHelpStatus, fingerprintAndFaceEnrolledAndEnabled) ->
                if (fingerprintAndFaceEnrolledAndEnabled) {
                    faceHelp.filter { faceAuthHelpStatus ->
                    // Show only some face help messages if fingerprint is also enrolled
                    coExFaceAcquisitionMsgIdsToShow.contains(faceAuthHelpStatus.msgId)
                    }
                } else {
                    faceHelp
                    // Show all face help messages if only face is enrolled
                    true
                }
            }
            .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::Pair)
            .filter { (_, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed }
            .map { (status, _) -> FaceMessage(status.msg) }
            .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::toTriple)
            .filter { (_, _, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed }
            .map { (status, _, _) -> FaceMessage(status.msg) }

    private val faceFailureMessage: Flow<FaceMessage> =
        faceFailure
@@ -159,12 +165,18 @@ constructor(
            }
            .map { (status, _) ->
                when {
                    status.isTimeoutError() -> FaceTimeoutMessage(status.msg)
                    status.isTimeoutError() -> {
                        val deferredMessage = faceHelpMessageDeferralInteractor.getDeferredMessage()
                        if (deferredMessage != null) {
                            FaceMessage(deferredMessage.toString())
                        } else {
                            FaceTimeoutMessage(status.msg)
                        }
                    }
                    else -> FaceMessage(status.msg)
                }
            }

    // TODO(b/317215391): support showing face acquired messages on timeout + face lockout errors
    val faceMessage: Flow<FaceMessage> =
        merge(
            faceHelpMessage,
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ constructor(
) {
    val fingerprintAuthCurrentlyAllowed: Flow<Boolean> =
        repository.isFingerprintAuthCurrentlyAllowed
    val faceAuthEnrolledAndEnabled: Flow<Boolean> = repository.isFaceAuthEnrolledAndEnabled
    val faceAuthCurrentlyAllowed: Flow<Boolean> = repository.isFaceAuthCurrentlyAllowed

    /** Whether both fingerprint and face are enrolled and enabled for device entry. */
Loading