Loading packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt +53 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.systemui.bouncer.domain.interactor import android.content.pm.UserInfo import android.hardware.biometrics.BiometricFaceConstants import android.hardware.biometrics.BiometricSourceType import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -25,6 +27,7 @@ import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.FaceSensorInfo Loading Loading @@ -58,7 +61,9 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.eq import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading @@ -77,6 +82,8 @@ class BouncerMessageInteractorTest : SysuiTestCase() { @Mock private lateinit var securityModel: KeyguardSecurityModel @Mock private lateinit var countDownTimerUtil: CountDownTimerUtil @Mock private lateinit var systemPropertiesHelper: SystemPropertiesHelper @Captor private lateinit var keyguardUpdateMonitorCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback> private lateinit var underTest: BouncerMessageInteractor Loading Loading @@ -206,6 +213,52 @@ class BouncerMessageInteractorTest : SysuiTestCase() { assertThat(bouncerMessage?.secondaryMessage?.message).isNull() } @Test fun resetMessageBackToDefault_faceAuthRestarts() = testScope.runTest { init() verify(updateMonitor).registerCallback(keyguardUpdateMonitorCaptor.capture()) val bouncerMessage by collectLastValue(underTest.bouncerMessage) underTest.setFaceAcquisitionMessage("not empty") assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") keyguardUpdateMonitorCaptor.value.onBiometricAcquired( BiometricSourceType.FACE, BiometricFaceConstants.FACE_ACQUIRED_START ) assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isNull() } @Test fun faceRestartDoesNotResetFingerprintMessage() = testScope.runTest { init() verify(updateMonitor).registerCallback(keyguardUpdateMonitorCaptor.capture()) val bouncerMessage by collectLastValue(underTest.bouncerMessage) underTest.setFingerprintAcquisitionMessage("not empty") assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") keyguardUpdateMonitorCaptor.value.onBiometricAcquired( BiometricSourceType.FACE, BiometricFaceConstants.FACE_ACQUIRED_START ) assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") } @Test fun setFingerprintMessage_propagateValue() = testScope.runTest { Loading packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt +14 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.bouncer.data.repository import android.hardware.biometrics.BiometricSourceType import com.android.systemui.bouncer.shared.model.BouncerMessageModel import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject Loading @@ -26,7 +27,12 @@ import kotlinx.coroutines.flow.MutableStateFlow interface BouncerMessageRepository { val bouncerMessage: Flow<BouncerMessageModel> fun setMessage(message: BouncerMessageModel) fun setMessage(message: BouncerMessageModel, source: BiometricSourceType? = null) /** * Return the source of the current [bouncerMessage] if it was set from a biometric. Else, null. */ fun getMessageSource(): BiometricSourceType? } @SysUISingleton Loading @@ -34,8 +40,14 @@ class BouncerMessageRepositoryImpl @Inject constructor() : BouncerMessageReposit private val _bouncerMessage = MutableStateFlow(BouncerMessageModel()) override val bouncerMessage: Flow<BouncerMessageModel> = _bouncerMessage private var messageSource: BiometricSourceType? = null override fun setMessage(message: BouncerMessageModel) { override fun setMessage(message: BouncerMessageModel, source: BiometricSourceType?) { _bouncerMessage.value = message messageSource = source } override fun getMessageSource(): BiometricSourceType? { return messageSource } } packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt +14 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.bouncer.domain.interactor import android.hardware.biometrics.BiometricFaceConstants import android.hardware.biometrics.BiometricSourceType import android.os.CountDownTimer import com.android.keyguard.KeyguardSecurityModel Loading Loading @@ -115,7 +116,8 @@ constructor( isFingerprintAuthCurrentlyAllowedOnBouncer.value ) .toMessage() } }, biometricSourceType, ) } Loading @@ -123,7 +125,12 @@ constructor( biometricSourceType: BiometricSourceType?, acquireInfo: Int ) { super.onBiometricAcquired(biometricSourceType, acquireInfo) if ( repository.getMessageSource() == BiometricSourceType.FACE && acquireInfo == BiometricFaceConstants.FACE_ACQUIRED_START ) { repository.setMessage(defaultMessage) } } override fun onBiometricAuthenticated( Loading @@ -131,7 +138,7 @@ constructor( biometricSourceType: BiometricSourceType?, isStrongBiometric: Boolean ) { repository.setMessage(defaultMessage) repository.setMessage(defaultMessage, biometricSourceType) } } Loading Loading @@ -291,7 +298,8 @@ constructor( currentSecurityMode, value, isFingerprintAuthCurrentlyAllowedOnBouncer.value ) ), BiometricSourceType.FINGERPRINT, ) } Loading @@ -302,7 +310,8 @@ constructor( currentSecurityMode, value, isFingerprintAuthCurrentlyAllowedOnBouncer.value ) ), BiometricSourceType.FACE, ) } Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt +53 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.systemui.bouncer.domain.interactor import android.content.pm.UserInfo import android.hardware.biometrics.BiometricFaceConstants import android.hardware.biometrics.BiometricSourceType import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -25,6 +27,7 @@ import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.FaceSensorInfo Loading Loading @@ -58,7 +61,9 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.eq import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations Loading @@ -77,6 +82,8 @@ class BouncerMessageInteractorTest : SysuiTestCase() { @Mock private lateinit var securityModel: KeyguardSecurityModel @Mock private lateinit var countDownTimerUtil: CountDownTimerUtil @Mock private lateinit var systemPropertiesHelper: SystemPropertiesHelper @Captor private lateinit var keyguardUpdateMonitorCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback> private lateinit var underTest: BouncerMessageInteractor Loading Loading @@ -206,6 +213,52 @@ class BouncerMessageInteractorTest : SysuiTestCase() { assertThat(bouncerMessage?.secondaryMessage?.message).isNull() } @Test fun resetMessageBackToDefault_faceAuthRestarts() = testScope.runTest { init() verify(updateMonitor).registerCallback(keyguardUpdateMonitorCaptor.capture()) val bouncerMessage by collectLastValue(underTest.bouncerMessage) underTest.setFaceAcquisitionMessage("not empty") assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") keyguardUpdateMonitorCaptor.value.onBiometricAcquired( BiometricSourceType.FACE, BiometricFaceConstants.FACE_ACQUIRED_START ) assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isNull() } @Test fun faceRestartDoesNotResetFingerprintMessage() = testScope.runTest { init() verify(updateMonitor).registerCallback(keyguardUpdateMonitorCaptor.capture()) val bouncerMessage by collectLastValue(underTest.bouncerMessage) underTest.setFingerprintAcquisitionMessage("not empty") assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") keyguardUpdateMonitorCaptor.value.onBiometricAcquired( BiometricSourceType.FACE, BiometricFaceConstants.FACE_ACQUIRED_START ) assertThat(primaryResMessage(bouncerMessage)) .isEqualTo("Unlock with PIN or fingerprint") assertThat(bouncerMessage?.secondaryMessage?.message).isEqualTo("not empty") } @Test fun setFingerprintMessage_propagateValue() = testScope.runTest { Loading
packages/SystemUI/src/com/android/systemui/bouncer/data/repository/BouncerMessageRepository.kt +14 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.bouncer.data.repository import android.hardware.biometrics.BiometricSourceType import com.android.systemui.bouncer.shared.model.BouncerMessageModel import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject Loading @@ -26,7 +27,12 @@ import kotlinx.coroutines.flow.MutableStateFlow interface BouncerMessageRepository { val bouncerMessage: Flow<BouncerMessageModel> fun setMessage(message: BouncerMessageModel) fun setMessage(message: BouncerMessageModel, source: BiometricSourceType? = null) /** * Return the source of the current [bouncerMessage] if it was set from a biometric. Else, null. */ fun getMessageSource(): BiometricSourceType? } @SysUISingleton Loading @@ -34,8 +40,14 @@ class BouncerMessageRepositoryImpl @Inject constructor() : BouncerMessageReposit private val _bouncerMessage = MutableStateFlow(BouncerMessageModel()) override val bouncerMessage: Flow<BouncerMessageModel> = _bouncerMessage private var messageSource: BiometricSourceType? = null override fun setMessage(message: BouncerMessageModel) { override fun setMessage(message: BouncerMessageModel, source: BiometricSourceType?) { _bouncerMessage.value = message messageSource = source } override fun getMessageSource(): BiometricSourceType? { return messageSource } }
packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt +14 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.bouncer.domain.interactor import android.hardware.biometrics.BiometricFaceConstants import android.hardware.biometrics.BiometricSourceType import android.os.CountDownTimer import com.android.keyguard.KeyguardSecurityModel Loading Loading @@ -115,7 +116,8 @@ constructor( isFingerprintAuthCurrentlyAllowedOnBouncer.value ) .toMessage() } }, biometricSourceType, ) } Loading @@ -123,7 +125,12 @@ constructor( biometricSourceType: BiometricSourceType?, acquireInfo: Int ) { super.onBiometricAcquired(biometricSourceType, acquireInfo) if ( repository.getMessageSource() == BiometricSourceType.FACE && acquireInfo == BiometricFaceConstants.FACE_ACQUIRED_START ) { repository.setMessage(defaultMessage) } } override fun onBiometricAuthenticated( Loading @@ -131,7 +138,7 @@ constructor( biometricSourceType: BiometricSourceType?, isStrongBiometric: Boolean ) { repository.setMessage(defaultMessage) repository.setMessage(defaultMessage, biometricSourceType) } } Loading Loading @@ -291,7 +298,8 @@ constructor( currentSecurityMode, value, isFingerprintAuthCurrentlyAllowedOnBouncer.value ) ), BiometricSourceType.FINGERPRINT, ) } Loading @@ -302,7 +310,8 @@ constructor( currentSecurityMode, value, isFingerprintAuthCurrentlyAllowedOnBouncer.value ) ), BiometricSourceType.FACE, ) } Loading