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

Commit 2c5b6d7e authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes I9983f370,I6e962ff0 into main

* changes:
  Update the face auth locked out state only if face auth is enrolled,
  Fixes the issue of UDFPS icon background being white when the device is in DOZE_PULSING state
parents 184f9fa4 795e61c4
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                TransitionStep(
                    KeyguardState.OFF,
                    KeyguardState.LOCKSCREEN,
                    transitionState = TransitionState.STARTED
                    transitionState = TransitionState.STARTED,
                )
            )

@@ -181,7 +181,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                TransitionStep(
                    KeyguardState.AOD,
                    KeyguardState.LOCKSCREEN,
                    transitionState = TransitionState.STARTED
                    transitionState = TransitionState.STARTED,
                )
            )

@@ -206,7 +206,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                TransitionStep(
                    KeyguardState.DOZING,
                    KeyguardState.LOCKSCREEN,
                    transitionState = TransitionState.STARTED
                    transitionState = TransitionState.STARTED,
                )
            )

@@ -229,7 +229,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                TransitionStep(
                    KeyguardState.DOZING,
                    KeyguardState.LOCKSCREEN,
                    transitionState = TransitionState.STARTED
                    transitionState = TransitionState.STARTED,
                )
            )

@@ -244,12 +244,14 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
    fun faceAuthLockedOutStateIsUpdatedAfterUserSwitch() =
        testScope.runTest {
            underTest.start()
            runCurrent()
            fakeBiometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)

            // User switching has started
            fakeUserRepository.setSelectedUserInfo(primaryUser, SelectionStatus.SELECTION_COMPLETE)
            fakeUserRepository.setSelectedUserInfo(
                primaryUser,
                SelectionStatus.SELECTION_IN_PROGRESS
                SelectionStatus.SELECTION_IN_PROGRESS,
            )
            runCurrent()

@@ -258,7 +260,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
            facePropertyRepository.setLockoutMode(secondaryUser.id, LockoutMode.NONE)
            fakeUserRepository.setSelectedUserInfo(
                secondaryUser,
                SelectionStatus.SELECTION_COMPLETE
                SelectionStatus.SELECTION_COMPLETE,
            )
            runCurrent()

@@ -316,7 +318,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
                .isEqualTo(
                    Pair(
                        FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN,
                        false
                        false,
                    )
                )
        }
@@ -600,7 +602,7 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {

            faceAuthRepository.requestAuthenticate(
                FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
                true
                true,
            )
            facePropertyRepository.setCameraIno(CameraInfo("0", "1", null))

+90 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.keyguard.ui.viewmodel

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@ExperimentalCoroutinesApi
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceEntryBackgroundViewModelTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val underTest: DeviceEntryBackgroundViewModel by lazy {
        kosmos.deviceEntryBackgroundViewModel
    }

    @Test
    fun lockscreenToDozingTransitionChangesBackgroundViewAlphaToZero() =
        testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsUdfps()
            val alpha by collectLastValue(underTest.alpha)

            kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                listOf(dozingToLockscreen(0f, STARTED), dozingToLockscreen(0.1f)),
                testScope,
            )
            runCurrent()
            assertThat(alpha).isEqualTo(1.0f)

            kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                listOf(lockscreenToDozing(0f, STARTED)),
                testScope,
            )
            runCurrent()

            assertThat(alpha).isEqualTo(0.0f)
        }

    private fun lockscreenToDozing(value: Float, state: TransitionState = RUNNING): TransitionStep {
        return TransitionStep(
            from = KeyguardState.LOCKSCREEN,
            to = KeyguardState.DOZING,
            value = value,
            transitionState = state,
            ownerName = "DeviceEntryBackgroundViewModelTest",
        )
    }

    private fun dozingToLockscreen(value: Float, state: TransitionState = RUNNING): TransitionStep {
        return TransitionStep(
            from = KeyguardState.DOZING,
            to = KeyguardState.LOCKSCREEN,
            value = value,
            transitionState = state,
            ownerName = "DeviceEntryBackgroundViewModelTest",
        )
    }
}
+9 −6
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ constructor(
                faceAuthenticationLogger.bouncerVisibilityChanged()
                runFaceAuth(
                    FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN,
                    fallbackToDetect = false
                    fallbackToDetect = false,
                )
            }
            .launchIn(applicationScope)
@@ -125,7 +125,7 @@ constructor(
                faceAuthenticationLogger.alternateBouncerVisibilityChanged()
                runFaceAuth(
                    FaceAuthUiEvent.FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN,
                    fallbackToDetect = false
                    fallbackToDetect = false,
                )
            }
            .launchIn(applicationScope)
@@ -153,7 +153,7 @@ constructor(
                    it.lastWakeReason.powerManagerWakeReason
                runFaceAuth(
                    FaceAuthUiEvent.FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED,
                    fallbackToDetect = true
                    fallbackToDetect = true,
                )
            }
            .launchIn(applicationScope)
@@ -193,13 +193,16 @@ constructor(
            .map { (_, curr) -> curr.userInfo.id }
            .sample(isBouncerVisible, ::Pair)
            .onEach { (userId, isBouncerCurrentlyVisible) ->
                if (!isFaceAuthEnabledAndEnrolled()) {
                    return@onEach
                }
                resetLockedOutState(userId)
                yield()
                runFaceAuth(
                    FaceAuthUiEvent.FACE_AUTH_UPDATED_USER_SWITCHING,
                    // Fallback to detection if bouncer is not showing so that we can detect a
                    // face and then show the bouncer to the user if face auth can't run
                    fallbackToDetect = !isBouncerCurrentlyVisible
                    fallbackToDetect = !isBouncerCurrentlyVisible,
                )
            }
            .launchIn(applicationScope)
@@ -210,7 +213,7 @@ constructor(
                    repository.cancel()
                    runFaceAuth(
                        FaceAuthUiEvent.FACE_AUTH_CAMERA_AVAILABLE_CHANGED,
                        fallbackToDetect = true
                        fallbackToDetect = true,
                    )
                }
            }
@@ -321,7 +324,7 @@ constructor(
            faceAuthenticationStatusOverride.value =
                ErrorFaceAuthenticationStatus(
                    BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT,
                    context.resources.getString(R.string.keyguard_face_unlock_unavailable)
                    context.resources.getString(R.string.keyguard_face_unlock_unavailable),
                )
        } else {
            faceAuthenticationStatusOverride.value = null
+4 −1
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ constructor(
    primaryBouncerToAodTransitionViewModel: PrimaryBouncerToAodTransitionViewModel,
    primaryBouncerToDozingTransitionViewModel: PrimaryBouncerToDozingTransitionViewModel,
    primaryBouncerToLockscreenTransitionViewModel: PrimaryBouncerToLockscreenTransitionViewModel,
    lockscreenToDozingTransitionViewModel: LockscreenToDozingTransitionViewModel,
) {
    val color: Flow<Int> =
        deviceEntryIconViewModel.useBackgroundProtection.flatMapLatest { useBackground ->
@@ -103,7 +104,9 @@ constructor(
                        offToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
                        primaryBouncerToAodTransitionViewModel.deviceEntryBackgroundViewAlpha,
                        primaryBouncerToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
                        primaryBouncerToLockscreenTransitionViewModel.deviceEntryBackgroundViewAlpha,
                        primaryBouncerToLockscreenTransitionViewModel
                            .deviceEntryBackgroundViewAlpha,
                        lockscreenToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha,
                    )
                    .merge()
                    .onStart {
+4 −4
Original line number Diff line number Diff line
@@ -55,16 +55,16 @@ constructor(
            onCancel = { 1f },
        )

    val deviceEntryBackgroundViewAlpha: Flow<Float> =
        transitionAnimation.immediatelyTransitionTo(0f)

    override val deviceEntryParentViewAlpha: Flow<Float> =
        deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
            isUdfpsEnrolledAndEnabled ->
            if (isUdfpsEnrolledAndEnabled) {
                transitionAnimation.immediatelyTransitionTo(1f)
            } else {
                transitionAnimation.sharedFlow(
                    duration = 250.milliseconds,
                    onStep = { 1f - it },
                )
                transitionAnimation.sharedFlow(duration = 250.milliseconds, onStep = { 1f - it })
            }
        }
}
Loading