diff options
| author | 2024-02-28 15:58:18 +0000 | |
|---|---|---|
| committer | 2024-03-07 20:12:52 +0000 | |
| commit | f3af2a8f4ddc2d0063e8302de7b33fd5b86d1966 (patch) | |
| tree | 4457d0b193dc8b90995d88055a9eda376e22649c | |
| parent | 7d35bd5f94c0ec070575b55de28f401898bff6d0 (diff) | |
Update keyguardBlueprint if fingerprint property isUdfps changes
Note: updating the DeviceEntryUdfpsInteractor's usage of
fingerprintPropertyRepository to fingerprintPropertyInteractor
caused a bunch of tests to not compile since displayStateRepository
and displayRepository needed to be provided by a TestModule. Therefore,
this CL also updates a lot of tests to provide all the appropriate
modules.
Fixes: 326023271
Test: atest FingerprintPropertyInteractorTest KeyguardBlueprintInteractorTest
Flag: ACONFIG com.android.systemui.device_entry_udfps_refactor STAGING
Change-Id: Ie1ed7b8258bea0c3c7d6c5227d7a2bf71f07888a
31 files changed, 323 insertions, 190 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorTest.kt index 97c407cb9b16..970ce1f09909 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorTest.kt @@ -47,6 +47,17 @@ class FingerprintPropertyInteractorTest : SysuiTestCase() { private val displayRepository by lazy { kosmos.displayRepository } @Test + fun propertiesInitialized() = + testScope.runTest { + val propertiesInitialized by collectLastValue(underTest.propertiesInitialized) + assertThat(propertiesInitialized).isFalse() + + repository.supportsUdfps() + runCurrent() + assertThat(propertiesInitialized).isTrue() + } + + @Test fun sensorLocation_resolution1f() = testScope.runTest { val currSensorLocation by collectLastValue(underTest.sensorLocation) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt index 0c0ed77a65f7..40d38dd83154 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt @@ -51,6 +51,8 @@ import kotlinx.coroutines.withContext * There is never more than one instance of the FingerprintProperty at any given time. */ interface FingerprintPropertyRepository { + /** Whether the fingerprint properties have been initialized yet. */ + val propertiesInitialized: StateFlow<Boolean> /** The id of fingerprint sensor. */ val sensorId: Flow<Int> @@ -59,7 +61,7 @@ interface FingerprintPropertyRepository { val strength: Flow<SensorStrength> /** The types of fingerprint sensor (rear, ultrasonic, optical, etc.). */ - val sensorType: Flow<FingerprintSensorType> + val sensorType: StateFlow<FingerprintSensorType> /** The sensor location relative to each physical display. */ val sensorLocations: Flow<Map<String, SensorLocationInternal>> @@ -105,15 +107,30 @@ constructor( .stateIn( applicationScope, started = SharingStarted.Eagerly, - initialValue = DEFAULT_PROPS, + initialValue = UNINITIALIZED_PROPS, + ) + + override val propertiesInitialized: StateFlow<Boolean> = + props + .map { it != UNINITIALIZED_PROPS } + .stateIn( + applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = props.value != UNINITIALIZED_PROPS, ) override val sensorId: Flow<Int> = props.map { it.sensorId } override val strength: Flow<SensorStrength> = props.map { it.sensorStrength.toSensorStrength() } - override val sensorType: Flow<FingerprintSensorType> = - props.map { it.sensorType.toSensorType() } + override val sensorType: StateFlow<FingerprintSensorType> = + props + .map { it.sensorType.toSensorType() } + .stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = props.value.sensorType.toSensorType(), + ) override val sensorLocations: Flow<Map<String, SensorLocationInternal>> = props.map { @@ -124,6 +141,17 @@ constructor( companion object { private const val TAG = "FingerprintPropertyRepositoryImpl" + private val UNINITIALIZED_PROPS = + FingerprintSensorPropertiesInternal( + -2 /* sensorId */, + SensorProperties.STRENGTH_CONVENIENCE, + 0 /* maxEnrollmentsPerUser */, + listOf<ComponentInfoInternal>(), + FingerprintSensorProperties.TYPE_UNKNOWN, + false /* halControlsIllumination */, + true /* resetLockoutRequiresHardwareAuthToken */, + listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT) + ) private val DEFAULT_PROPS = FingerprintSensorPropertiesInternal( -1 /* sensorId */, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt index ff9cdbd7dc24..5ae2ff0e3108 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt @@ -24,22 +24,35 @@ import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn @SysUISingleton class FingerprintPropertyInteractor @Inject constructor( + @Application private val applicationScope: CoroutineScope, @Application private val context: Context, repository: FingerprintPropertyRepository, configurationInteractor: ConfigurationInteractor, displayStateInteractor: DisplayStateInteractor, ) { - val isUdfps: Flow<Boolean> = repository.sensorType.map { it.isUdfps() } + val propertiesInitialized: StateFlow<Boolean> = repository.propertiesInitialized + val isUdfps: StateFlow<Boolean> = + repository.sensorType + .map { it.isUdfps() } + .stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = repository.sensorType.value.isUdfps(), + ) /** * Devices with multiple physical displays use unique display ids to determine which sensor is diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractor.kt index 72b9da669360..80b52ed0e055 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractor.kt @@ -16,17 +16,17 @@ package com.android.systemui.deviceentry.domain.interactor -import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository +import com.android.systemui.biometrics.domain.interactor.FingerprintPropertyInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map /** Encapsulates business logic for device entry under-display fingerprint state changes. */ @ExperimentalCoroutinesApi @@ -34,14 +34,13 @@ import kotlinx.coroutines.flow.map class DeviceEntryUdfpsInteractor @Inject constructor( + fingerprintPropertyInteractor: FingerprintPropertyInteractor, // TODO (b/309655554): create & use interactors for these repositories - fingerprintPropertyRepository: FingerprintPropertyRepository, fingerprintAuthRepository: DeviceEntryFingerprintAuthRepository, biometricSettingsRepository: BiometricSettingsRepository, ) { /** Whether the device supports an under display fingerprint sensor. */ - val isUdfpsSupported: Flow<Boolean> = - fingerprintPropertyRepository.sensorType.map { it.isUdfps() } + val isUdfpsSupported: StateFlow<Boolean> = fingerprintPropertyInteractor.isUdfps /** Whether the under-display fingerprint sensor is enrolled and enabled for device entry. */ val isUdfpsEnrolledAndEnabled: Flow<Boolean> = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt index 0659c7c7d79c..a49b3ae7b7e3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepository.kt @@ -19,7 +19,6 @@ package com.android.systemui.keyguard.data.repository import android.os.Handler import android.util.Log -import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.shared.model.KeyguardBlueprint @@ -30,7 +29,6 @@ import com.android.systemui.util.ThreadAssert import java.io.PrintWriter import java.util.TreeMap import javax.inject.Inject -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -49,7 +47,6 @@ import kotlinx.coroutines.flow.MutableStateFlow class KeyguardBlueprintRepository @Inject constructor( - configurationRepository: ConfigurationRepository, blueprints: Set<@JvmSuppressWildcards KeyguardBlueprint>, @Main val handler: Handler, val assert: ThreadAssert, @@ -60,7 +57,6 @@ constructor( TreeMap<String, KeyguardBlueprint>().apply { putAll(blueprints.associateBy { it.id }) } val blueprint: MutableStateFlow<KeyguardBlueprint> = MutableStateFlow(blueprintIdMap[DEFAULT]!!) val refreshTransition = MutableSharedFlow<Config>(extraBufferCapacity = 1) - val configurationChange: Flow<Unit> = configurationRepository.onAnyConfigurationChange private var targetTransitionConfig: Config? = null /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt index bc3f0cce2fc7..c877192cd804 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt @@ -20,6 +20,8 @@ package com.android.systemui.keyguard.domain.interactor import android.content.Context +import com.android.systemui.biometrics.domain.interactor.FingerprintPropertyInteractor +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardBlueprintRepository @@ -34,7 +36,9 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch @@ -47,6 +51,8 @@ constructor( private val context: Context, private val splitShadeStateController: SplitShadeStateController, private val clockInteractor: KeyguardClockInteractor, + configurationInteractor: ConfigurationInteractor, + fingerprintPropertyInteractor: FingerprintPropertyInteractor, ) { /** The current blueprint for the lockscreen. */ @@ -58,11 +64,14 @@ constructor( */ val refreshTransition = keyguardBlueprintRepository.refreshTransition + private val configOrPropertyChange = + merge( + configurationInteractor.onAnyConfigurationChange, + fingerprintPropertyInteractor.propertiesInitialized.filter { it }.map {}, // map to Unit + ) init { applicationScope.launch { - keyguardBlueprintRepository.configurationChange - .onStart { emit(Unit) } - .collect { updateBlueprint() } + configOrPropertyChange.onStart { emit(Unit) }.collect { updateBlueprint() } } applicationScope.launch { clockInteractor.currentClock.collect { updateBlueprint() } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt index 3fc9b4200f35..1085f945506a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt @@ -26,7 +26,6 @@ import android.view.WindowManager import androidx.annotation.VisibleForTesting import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet -import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.LockIconView import com.android.keyguard.LockIconViewController import com.android.systemui.Flags.keyguardBottomAreaRefactor @@ -56,7 +55,6 @@ class DefaultDeviceEntrySection @Inject constructor( @Application private val applicationScope: CoroutineScope, - private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val authController: AuthController, private val windowManager: WindowManager, private val context: Context, @@ -111,7 +109,12 @@ constructor( } override fun applyConstraints(constraintSet: ConstraintSet) { - val isUdfpsSupported = keyguardUpdateMonitor.isUdfpsSupported + val isUdfpsSupported = + if (DeviceEntryUdfpsRefactor.isEnabled) { + deviceEntryIconViewModel.get().isUdfpsSupported.value + } else { + authController.isUdfpsSupported + } val scaleFactor: Float = authController.scaleFactor val mBottomPaddingPx = context.resources.getDimensionPixelSize(R.dimen.lock_icon_margin_bottom) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt index 662a77ee7193..4c0a9491b74a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt @@ -20,6 +20,8 @@ package com.android.systemui.keyguard.ui.viewmodel import android.content.Context import com.android.settingslib.Utils import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.shared.model.KeyguardState import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow @@ -30,12 +32,14 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart /** Models the UI state for the device entry icon background view. */ +@Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA") @ExperimentalCoroutinesApi class DeviceEntryBackgroundViewModel @Inject constructor( val context: Context, val deviceEntryIconViewModel: DeviceEntryIconViewModel, + keyguardTransitionInteractor: KeyguardTransitionInteractor, configurationInteractor: ConfigurationInteractor, lockscreenToAodTransitionViewModel: LockscreenToAodTransitionViewModel, aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, @@ -94,6 +98,23 @@ constructor( alternateBouncerToDozingTransitionViewModel.deviceEntryBackgroundViewAlpha, ) .merge() + .onStart { + when ( + keyguardTransitionInteractor.currentKeyguardState.replayCache.last() + ) { + KeyguardState.GLANCEABLE_HUB, + KeyguardState.DREAMING_LOCKSCREEN_HOSTED, + KeyguardState.GONE, + KeyguardState.OCCLUDED, + KeyguardState.OFF, + KeyguardState.DOZING, + KeyguardState.DREAMING, + KeyguardState.PRIMARY_BOUNCER, + KeyguardState.AOD -> emit(0f) + KeyguardState.ALTERNATE_BOUNCER, + KeyguardState.LOCKSCREEN -> emit(1f) + } + } } else { flowOf(0f) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt index bd19c8006e23..1a018977664a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt @@ -36,6 +36,7 @@ import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest @@ -62,6 +63,7 @@ constructor( private val deviceEntryInteractor: DeviceEntryInteractor, private val deviceEntrySourceInteractor: DeviceEntrySourceInteractor, ) { + val isUdfpsSupported: StateFlow<Boolean> = deviceEntryUdfpsInteractor.isUdfpsSupported private val intEvaluator = IntEvaluator() private val floatEvaluator = FloatEvaluator() private val showingAlternateBouncer: Flow<Boolean> = @@ -137,7 +139,7 @@ constructor( ) { alpha, alphaMultiplier -> alpha * alphaMultiplier } - val useBackgroundProtection: Flow<Boolean> = deviceEntryUdfpsInteractor.isUdfpsSupported + val useBackgroundProtection: StateFlow<Boolean> = isUdfpsSupported val burnInOffsets: Flow<BurnInOffsets> = deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest { udfpsEnrolled -> if (udfpsEnrolled) { @@ -211,7 +213,7 @@ constructor( val isLongPressEnabled: Flow<Boolean> = combine( iconType, - deviceEntryUdfpsInteractor.isUdfpsSupported, + isUdfpsSupported, ) { deviceEntryStatus, isUdfps -> when (deviceEntryStatus) { DeviceEntryIconView.IconType.LOCK -> isUdfps diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt index 54d6b53d58f8..67ca9a40dc2a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt @@ -20,6 +20,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysUITestComponent import com.android.systemui.SysUITestModule import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FakeFeatureFlagsClassicModule import com.android.systemui.flags.Flags @@ -45,6 +46,7 @@ class AuthDialogPanelInteractionDetectorTest : SysuiTestCase() { [ SysUITestModule::class, UserDomainLayerModule::class, + BiometricsDomainLayerModule::class, ] ) interface TestComponent : SysUITestComponent<AuthDialogPanelInteractionDetector> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt index dc438d7d80f2..7808c414de00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt @@ -84,8 +84,8 @@ class FingerprintRepositoryImplTest : SysuiTestCase() { val sensorType by collectLastValue(repository.sensorType) val sensorLocations by collectLastValue(repository.sensorLocations) - // Assert default properties. - assertThat(sensorId).isEqualTo(-1) + // Assert non-initialized properties. + assertThat(sensorId).isEqualTo(-2) assertThat(strength).isEqualTo(SensorStrength.CONVENIENCE) assertThat(sensorType).isEqualTo(FingerprintSensorType.UNKNOWN) diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt index fa176728619b..5caa146f6351 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt @@ -21,6 +21,7 @@ import com.android.systemui.SysUITestComponent import com.android.systemui.SysUITestModule import com.android.systemui.SysuiTestCase import com.android.systemui.TestMocksModule +import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule import com.android.systemui.collectLastValue import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FakeFeatureFlagsClassicModule @@ -65,6 +66,7 @@ class DefaultUdfpsTouchOverlayViewModelTest : SysuiTestCase() { [ SysUITestModule::class, UserDomainLayerModule::class, + BiometricsDomainLayerModule::class, ] ) interface TestComponent : SysUITestComponent<DefaultUdfpsTouchOverlayViewModel> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorTest.kt index e8eda8096b1e..d5839b502625 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorTest.kt @@ -21,9 +21,15 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository +import com.android.systemui.biometrics.data.repository.fakeFingerprintPropertyRepository +import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository +import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository +import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository +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.runTest @@ -35,6 +41,8 @@ import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class DeviceEntryUdfpsInteractorTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository private lateinit var fingerprintAuthRepository: FakeDeviceEntryFingerprintAuthRepository private lateinit var biometricsRepository: FakeBiometricSettingsRepository @@ -43,77 +51,85 @@ class DeviceEntryUdfpsInteractorTest : SysuiTestCase() { @Before fun setUp() { - fingerprintPropertyRepository = FakeFingerprintPropertyRepository() - fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository() - biometricsRepository = FakeBiometricSettingsRepository() + fingerprintPropertyRepository = kosmos.fakeFingerprintPropertyRepository + fingerprintAuthRepository = kosmos.fakeDeviceEntryFingerprintAuthRepository + biometricsRepository = kosmos.fakeBiometricSettingsRepository underTest = DeviceEntryUdfpsInteractor( - fingerprintPropertyRepository = fingerprintPropertyRepository, + fingerprintPropertyInteractor = kosmos.fingerprintPropertyInteractor, fingerprintAuthRepository = fingerprintAuthRepository, biometricSettingsRepository = biometricsRepository, ) } @Test - fun udfpsSupported_rearFp_false() = runTest { - val isUdfpsSupported by collectLastValue(underTest.isUdfpsSupported) - fingerprintPropertyRepository.supportsRearFps() - assertThat(isUdfpsSupported).isFalse() - } + fun udfpsSupported_rearFp_false() = + testScope.runTest { + val isUdfpsSupported by collectLastValue(underTest.isUdfpsSupported) + fingerprintPropertyRepository.supportsRearFps() + assertThat(isUdfpsSupported).isFalse() + } @Test - fun udfpsSupoprted() = runTest { - val isUdfpsSupported by collectLastValue(underTest.isUdfpsSupported) - fingerprintPropertyRepository.supportsUdfps() - assertThat(isUdfpsSupported).isTrue() - } + fun udfpsSupoprted() = + testScope.runTest { + val isUdfpsSupported by collectLastValue(underTest.isUdfpsSupported) + fingerprintPropertyRepository.supportsUdfps() + assertThat(isUdfpsSupported).isTrue() + } @Test - fun udfpsEnrolledAndEnabled() = runTest { - val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) - fingerprintPropertyRepository.supportsUdfps() - biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(true) - assertThat(isUdfpsEnrolledAndEnabled).isTrue() - } + fun udfpsEnrolledAndEnabled() = + testScope.runTest { + val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) + fingerprintPropertyRepository.supportsUdfps() + biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(true) + assertThat(isUdfpsEnrolledAndEnabled).isTrue() + } @Test - fun udfpsEnrolledAndEnabled_rearFp_false() = runTest { - val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) - fingerprintPropertyRepository.supportsRearFps() - biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(true) - assertThat(isUdfpsEnrolledAndEnabled).isFalse() - } + fun udfpsEnrolledAndEnabled_rearFp_false() = + testScope.runTest { + val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) + fingerprintPropertyRepository.supportsRearFps() + biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(true) + assertThat(isUdfpsEnrolledAndEnabled).isFalse() + } @Test - fun udfpsEnrolledAndEnabled_notEnrolledOrEnabled_false() = runTest { - val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) - fingerprintPropertyRepository.supportsUdfps() - biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(false) - assertThat(isUdfpsEnrolledAndEnabled).isFalse() - } + fun udfpsEnrolledAndEnabled_notEnrolledOrEnabled_false() = + testScope.runTest { + val isUdfpsEnrolledAndEnabled by collectLastValue(underTest.isUdfpsEnrolledAndEnabled) + fingerprintPropertyRepository.supportsUdfps() + biometricsRepository.setIsFingerprintAuthEnrolledAndEnabled(false) + assertThat(isUdfpsEnrolledAndEnabled).isFalse() + } @Test - fun isListeningForUdfps() = runTest { - val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) - fingerprintPropertyRepository.supportsUdfps() - fingerprintAuthRepository.setIsRunning(true) - assertThat(isListeningForUdfps).isTrue() - } + fun isListeningForUdfps() = + testScope.runTest { + val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) + fingerprintPropertyRepository.supportsUdfps() + fingerprintAuthRepository.setIsRunning(true) + assertThat(isListeningForUdfps).isTrue() + } @Test - fun isListeningForUdfps_rearFp_false() = runTest { - val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) - fingerprintPropertyRepository.supportsRearFps() - fingerprintAuthRepository.setIsRunning(true) - assertThat(isListeningForUdfps).isFalse() - } + fun isListeningForUdfps_rearFp_false() = + testScope.runTest { + val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) + fingerprintPropertyRepository.supportsRearFps() + fingerprintAuthRepository.setIsRunning(true) + assertThat(isListeningForUdfps).isFalse() + } @Test - fun isListeningForUdfps_notRunning_false() = runTest { - val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) - fingerprintPropertyRepository.supportsUdfps() - fingerprintAuthRepository.setIsRunning(false) - assertThat(isListeningForUdfps).isFalse() - } + fun isListeningForUdfps_notRunning_false() = + testScope.runTest { + val isListeningForUdfps by collectLastValue(underTest.isListeningForUdfps) + fingerprintPropertyRepository.supportsUdfps() + fingerprintAuthRepository.setIsRunning(false) + assertThat(isListeningForUdfps).isFalse() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt index 37836a56fdd5..bcaad01f1a24 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt @@ -62,7 +62,6 @@ class KeyguardBlueprintRepositoryTest : SysuiTestCase() { whenever(defaultLockscreenBlueprint.id).thenReturn(DEFAULT) underTest = KeyguardBlueprintRepository( - configurationRepository, setOf(defaultLockscreenBlueprint), fakeExecutorHandler, threadAssert, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt index b0d8de359cd7..170d3486decb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt @@ -21,95 +21,80 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags import com.android.systemui.SysuiTestCase -import com.android.systemui.keyguard.data.repository.KeyguardBlueprintRepository +import com.android.systemui.biometrics.data.repository.fakeFingerprintPropertyRepository +import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor.Companion.SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor.Companion.WEATHER_CLOCK_BLUEPRINT_ID import com.android.systemui.keyguard.ui.view.layout.blueprints.DefaultKeyguardBlueprint import com.android.systemui.keyguard.ui.view.layout.blueprints.SplitShadeKeyguardBlueprint -import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition -import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config -import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Type +import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.clocks.ClockConfig import com.android.systemui.plugins.clocks.ClockController -import com.android.systemui.statusbar.policy.SplitShadeStateController -import com.android.systemui.util.mockito.any +import com.android.systemui.res.R +import com.android.systemui.testKosmos import com.android.systemui.util.mockito.whenever -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.TestScope +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.never -import org.mockito.Mockito.reset -import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +@ExperimentalCoroutinesApi @SmallTest @RunWith(AndroidJUnit4::class) class KeyguardBlueprintInteractorTest : SysuiTestCase() { - private val configurationFlow = MutableSharedFlow<Unit>(extraBufferCapacity = 1) - private lateinit var underTest: KeyguardBlueprintInteractor - private lateinit var testScope: TestScope + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val underTest by lazy { kosmos.keyguardBlueprintInteractor } + private val clockRepository by lazy { kosmos.fakeKeyguardClockRepository } + private val configurationRepository by lazy { kosmos.fakeConfigurationRepository } + private val fingerprintPropertyRepository by lazy { kosmos.fakeFingerprintPropertyRepository } - val refreshTransition: MutableSharedFlow<IntraBlueprintTransition.Config> = - MutableSharedFlow(extraBufferCapacity = 1) - - @Mock private lateinit var splitShadeStateController: SplitShadeStateController - @Mock private lateinit var keyguardBlueprintRepository: KeyguardBlueprintRepository - @Mock private lateinit var clockInteractor: KeyguardClockInteractor @Mock private lateinit var clockController: ClockController @Before fun setup() { MockitoAnnotations.initMocks(this) - testScope = TestScope(StandardTestDispatcher()) - whenever(keyguardBlueprintRepository.configurationChange).thenReturn(configurationFlow) - whenever(keyguardBlueprintRepository.refreshTransition).thenReturn(refreshTransition) - whenever(clockInteractor.currentClock).thenReturn(MutableStateFlow(clockController)) - clockInteractor.currentClock - - underTest = - KeyguardBlueprintInteractor( - keyguardBlueprintRepository, - testScope.backgroundScope, - mContext, - splitShadeStateController, - clockInteractor, - ) } @Test fun testAppliesDefaultBlueprint() { testScope.runTest { - whenever(splitShadeStateController.shouldUseSplitNotificationShade(any())) - .thenReturn(false) - - reset(keyguardBlueprintRepository) - configurationFlow.tryEmit(Unit) + val blueprint by collectLastValue(underTest.blueprint) + overrideResource(R.bool.config_use_split_notification_shade, false) + configurationRepository.onConfigurationChange() runCurrent() - verify(keyguardBlueprintRepository) - .applyBlueprint(DefaultKeyguardBlueprint.Companion.DEFAULT) + assertThat(blueprint?.id).isEqualTo(DefaultKeyguardBlueprint.Companion.DEFAULT) } } @Test fun testAppliesSplitShadeBlueprint() { testScope.runTest { - whenever(splitShadeStateController.shouldUseSplitNotificationShade(any())) - .thenReturn(true) - - reset(keyguardBlueprintRepository) - configurationFlow.tryEmit(Unit) + val blueprint by collectLastValue(underTest.blueprint) + overrideResource(R.bool.config_use_split_notification_shade, true) + configurationRepository.onConfigurationChange() runCurrent() - verify(keyguardBlueprintRepository) - .applyBlueprint(SplitShadeKeyguardBlueprint.Companion.ID) + assertThat(blueprint?.id).isEqualTo(SplitShadeKeyguardBlueprint.Companion.ID) + } + } + + @Test + fun fingerprintPropertyInitialized_updatesBlueprint() { + testScope.runTest { + val blueprint by collectLastValue(underTest.blueprint) + overrideResource(R.bool.config_use_split_notification_shade, true) + fingerprintPropertyRepository.supportsUdfps() // initialize properties + runCurrent() + assertThat(blueprint?.id).isEqualTo(SplitShadeKeyguardBlueprint.Companion.ID) } } @@ -117,6 +102,7 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { fun composeLockscreenOff_DoesAppliesSplitShadeWeatherClockBlueprint() { testScope.runTest { mSetFlagsRule.disableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( ClockConfig( @@ -125,15 +111,12 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { description = "clock", ) ) - whenever(splitShadeStateController.shouldUseSplitNotificationShade(any())) - .thenReturn(true) - - reset(keyguardBlueprintRepository) - configurationFlow.tryEmit(Unit) + clockRepository.setCurrentClock(clockController) + overrideResource(R.bool.config_use_split_notification_shade, true) + configurationRepository.onConfigurationChange() runCurrent() - verify(keyguardBlueprintRepository, never()) - .applyBlueprint(SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID) + assertThat(blueprint?.id).isNotEqualTo(SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID) } } @@ -141,6 +124,7 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { fun testDoesAppliesSplitShadeWeatherClockBlueprint() { testScope.runTest { mSetFlagsRule.enableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( ClockConfig( @@ -149,15 +133,12 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { description = "clock", ) ) - whenever(splitShadeStateController.shouldUseSplitNotificationShade(any())) - .thenReturn(true) - - reset(keyguardBlueprintRepository) - configurationFlow.tryEmit(Unit) + clockRepository.setCurrentClock(clockController) + overrideResource(R.bool.config_use_split_notification_shade, true) + configurationRepository.onConfigurationChange() runCurrent() - verify(keyguardBlueprintRepository) - .applyBlueprint(SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID) + assertThat(blueprint?.id).isEqualTo(SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID) } } @@ -165,6 +146,7 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { fun testAppliesWeatherClockBlueprint() { testScope.runTest { mSetFlagsRule.enableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( ClockConfig( @@ -173,33 +155,12 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { description = "clock", ) ) - whenever(splitShadeStateController.shouldUseSplitNotificationShade(any())) - .thenReturn(false) - - reset(keyguardBlueprintRepository) - configurationFlow.tryEmit(Unit) + clockRepository.setCurrentClock(clockController) + overrideResource(R.bool.config_use_split_notification_shade, false) + configurationRepository.onConfigurationChange() runCurrent() - verify(keyguardBlueprintRepository).applyBlueprint(WEATHER_CLOCK_BLUEPRINT_ID) + assertThat(blueprint?.id).isEqualTo(WEATHER_CLOCK_BLUEPRINT_ID) } } - - @Test - fun testRefreshBlueprint() { - underTest.refreshBlueprint() - verify(keyguardBlueprintRepository).refreshBlueprint() - } - - @Test - fun testTransitionToBlueprint() { - underTest.transitionToBlueprint("abc") - verify(keyguardBlueprintRepository).applyBlueprint("abc") - } - - @Test - fun testRefreshBlueprintWithTransition() { - underTest.refreshBlueprint(Type.DefaultTransition) - verify(keyguardBlueprintRepository) - .refreshBlueprint(Config(Type.DefaultTransition, true, true)) - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt index 699284e29ce3..09c56b09bb91 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt @@ -22,7 +22,6 @@ import android.view.WindowManager import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest -import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.LockIconViewController import com.android.systemui.Flags as AConfigFlags import com.android.systemui.SysuiTestCase @@ -37,8 +36,10 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.res.R import com.android.systemui.shade.NotificationPanelView import com.android.systemui.statusbar.VibratorHelper +import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.TestScope import org.junit.Before import org.junit.Test @@ -53,13 +54,13 @@ import org.mockito.MockitoAnnotations @RunWith(JUnit4::class) @SmallTest class DefaultDeviceEntrySectionTest : SysuiTestCase() { - @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var authController: AuthController @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var windowManager: WindowManager @Mock private lateinit var notificationPanelView: NotificationPanelView private lateinit var featureFlags: FakeFeatureFlags @Mock private lateinit var lockIconViewController: LockIconViewController @Mock private lateinit var falsingManager: FalsingManager + @Mock private lateinit var deviceEntryIconViewModel: DeviceEntryIconViewModel private lateinit var underTest: DefaultDeviceEntrySection @Before @@ -73,14 +74,13 @@ class DefaultDeviceEntrySectionTest : SysuiTestCase() { underTest = DefaultDeviceEntrySection( TestScope().backgroundScope, - keyguardUpdateMonitor, authController, windowManager, context, notificationPanelView, featureFlags, { lockIconViewController }, - { mock(DeviceEntryIconViewModel::class.java) }, + { deviceEntryIconViewModel }, { mock(DeviceEntryForegroundViewModel::class.java) }, { mock(DeviceEntryBackgroundViewModel::class.java) }, { falsingManager }, @@ -129,6 +129,7 @@ class DefaultDeviceEntrySectionTest : SysuiTestCase() { @Test fun applyConstraints_udfps_refactor_on() { mSetFlagsRule.enableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) + whenever(deviceEntryIconViewModel.isUdfpsSupported).thenReturn(MutableStateFlow(false)) val cs = ConstraintSet() underTest.applyConstraints(cs) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index cdff4d1c6561..43fcdf3eeedd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static kotlinx.coroutines.flow.FlowKt.emptyFlow; +import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; import android.annotation.IdRes; import android.content.ContentResolver; @@ -213,7 +214,6 @@ import java.util.List; import java.util.Optional; import kotlinx.coroutines.CoroutineDispatcher; -import kotlinx.coroutines.flow.StateFlowKt; import kotlinx.coroutines.test.TestScope; public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { @@ -409,10 +409,10 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { new ShadeAnimationRepository(), mShadeRepository); mPowerInteractor = keyguardInteractorDeps.getPowerInteractor(); when(mKeyguardTransitionInteractor.isInTransitionToStateWhere(any())).thenReturn( - StateFlowKt.MutableStateFlow(false)); + MutableStateFlow(false)); DeviceEntryUdfpsInteractor deviceEntryUdfpsInteractor = mock(DeviceEntryUdfpsInteractor.class); - when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(emptyFlow()); + when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(MutableStateFlow(false)); mShadeInteractor = new ShadeInteractorImpl( mTestScope.getBackgroundScope(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index 3808d309b02b..c31c625dff50 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -36,7 +36,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import static kotlinx.coroutines.flow.FlowKt.emptyFlow; +import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; import android.app.IActivityManager; import android.content.pm.ActivityInfo; @@ -205,7 +205,7 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { DeviceEntryUdfpsInteractor deviceEntryUdfpsInteractor = mock(DeviceEntryUdfpsInteractor.class); - when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(emptyFlow()); + when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(MutableStateFlow(false)); mShadeInteractor = new ShadeInteractorImpl( mTestScope.getBackgroundScope(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java index 4809a47709c8..a077164ba18e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static kotlinx.coroutines.flow.FlowKt.emptyFlow; +import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; import static kotlinx.coroutines.test.TestCoroutineDispatchersKt.StandardTestDispatcher; import android.content.res.Resources; @@ -234,7 +234,8 @@ public class QuickSettingsControllerImplBaseTest extends SysuiTestCase { DeviceEntryUdfpsInteractor deviceEntryUdfpsInteractor = mock(DeviceEntryUdfpsInteractor.class); - when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(emptyFlow()); + when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn( + MutableStateFlow(false)); mShadeInteractor = new ShadeInteractorImpl( mTestScope.getBackgroundScope(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index 86116a073d9e..6cfbe75171bf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -9,6 +9,7 @@ import com.android.systemui.ExpandHelper import com.android.systemui.SysUITestModule import com.android.systemui.SysuiTestCase import com.android.systemui.TestMocksModule +import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.dagger.SysUISingleton @@ -611,6 +612,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { [ SysUITestModule::class, UserDomainLayerModule::class, + BiometricsDomainLayerModule::class, ] ) interface TestComponent { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt index dfbb6ea08f82..103dcb7dda4b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt @@ -54,6 +54,7 @@ import com.android.systemui.power.data.repository.FakePowerRepository import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -69,7 +70,7 @@ import com.android.systemui.util.kotlin.JavaAdapter import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -85,9 +86,8 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` as whenever -import com.android.systemui.scene.shared.model.Scenes import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @@ -155,7 +155,7 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { { kosmos.sceneInteractor }, ) - whenever(deviceEntryUdfpsInteractor.isUdfpsSupported).thenReturn(emptyFlow()) + whenever(deviceEntryUdfpsInteractor.isUdfpsSupported).thenReturn(MutableStateFlow(false)) shadeInteractor = ShadeInteractorImpl( testScope.backgroundScope, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index fbefb0eedfa8..c84bf37f434c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -50,7 +50,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import static kotlinx.coroutines.flow.FlowKt.emptyFlow; +import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; import android.app.ActivityManager; import android.app.IActivityManager; @@ -450,7 +450,7 @@ public class BubblesTest extends SysuiTestCase { DeviceEntryUdfpsInteractor deviceEntryUdfpsInteractor = mock(DeviceEntryUdfpsInteractor.class); - when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(emptyFlow()); + when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(MutableStateFlow(false)); mShadeInteractor = new ShadeInteractorImpl( diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt index 1b951d95df11..9765d531472c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeDisplayStateRepository.kt @@ -19,12 +19,17 @@ package com.android.systemui.biometrics.data.repository import android.util.Size import com.android.systemui.biometrics.shared.model.DisplayRotation +import com.android.systemui.dagger.SysUISingleton +import dagger.Binds +import dagger.Module +import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -class FakeDisplayStateRepository : DisplayStateRepository { +@SysUISingleton +class FakeDisplayStateRepository @Inject constructor() : DisplayStateRepository { private val _isInRearDisplayMode = MutableStateFlow<Boolean>(false) override val isInRearDisplayMode: StateFlow<Boolean> = _isInRearDisplayMode.asStateFlow() @@ -51,3 +56,8 @@ class FakeDisplayStateRepository : DisplayStateRepository { _currentDisplaySize.value = size } } + +@Module +interface FakeDisplayStateRepositoryModule { + @Binds fun bindFake(fake: FakeDisplayStateRepository): DisplayStateRepository +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt index 005cac490d89..bd30fb4cac2b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.flow.asStateFlow @SysUISingleton class FakeFingerprintPropertyRepository @Inject constructor() : FingerprintPropertyRepository { + override val propertiesInitialized: MutableStateFlow<Boolean> = MutableStateFlow(false) private val _sensorId: MutableStateFlow<Int> = MutableStateFlow(-1) override val sensorId = _sensorId.asStateFlow() @@ -54,6 +55,7 @@ class FakeFingerprintPropertyRepository @Inject constructor() : FingerprintPrope _strength.value = strength _sensorType.value = sensorType _sensorLocations.value = sensorLocations + propertiesInitialized.value = true } /** setProperties as if the device supports UDFPS_OPTICAL. */ diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt index e26206625c6d..34a9c8ab7381 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt @@ -21,9 +21,11 @@ import com.android.systemui.biometrics.data.repository.fingerprintPropertyReposi import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.kosmos.applicationCoroutineScope val Kosmos.fingerprintPropertyInteractor by Fixture { FingerprintPropertyInteractor( + applicationScope = applicationCoroutineScope, context = applicationContext, repository = fingerprintPropertyRepository, configurationInteractor = configurationInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt index 8ff04a63802a..1c8190eee773 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt @@ -15,8 +15,10 @@ package com.android.systemui.deviceentry.data +import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepositoryModule import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepositoryModule import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepositoryModule +import com.android.systemui.display.data.repository.FakeDisplayRepositoryModule import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepositoryModule import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepositoryModule import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepositoryModule @@ -30,6 +32,8 @@ import dagger.Module FakeDeviceEntryRepositoryModule::class, FakeDeviceEntryFaceAuthRepositoryModule::class, FakeDeviceEntryFingerprintAuthRepositoryModule::class, + FakeDisplayRepositoryModule::class, + FakeDisplayStateRepositoryModule::class, FakeFingerprintPropertyRepositoryModule::class, FakeTrustRepositoryModule::class, ] diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt index b04161a7809f..81123d09b43a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryUdfpsInteractorKosmos.kt @@ -18,7 +18,7 @@ package com.android.systemui.deviceentry.domain.interactor -import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository +import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor import com.android.systemui.keyguard.data.repository.biometricSettingsRepository import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository import com.android.systemui.kosmos.Kosmos @@ -27,7 +27,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.deviceEntryUdfpsInteractor by Fixture { DeviceEntryUdfpsInteractor( - fingerprintPropertyRepository = fingerprintPropertyRepository, + fingerprintPropertyInteractor = fingerprintPropertyInteractor, fingerprintAuthRepository = deviceEntryFingerprintAuthRepository, biometricSettingsRepository = biometricSettingsRepository, ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt index d8098b7ffab3..0fc0a3c20f70 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt @@ -16,7 +16,11 @@ package com.android.systemui.display.data.repository import android.view.Display +import com.android.systemui.dagger.SysUISingleton import com.android.systemui.util.mockito.mock +import dagger.Binds +import dagger.Module +import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import org.mockito.Mockito.`when` as whenever @@ -42,8 +46,9 @@ fun display( fun createPendingDisplay(id: Int = 0): DisplayRepository.PendingDisplay = mock<DisplayRepository.PendingDisplay> { whenever(this.id).thenReturn(id) } +@SysUISingleton /** Fake [DisplayRepository] implementation for testing. */ -class FakeDisplayRepository : DisplayRepository { +class FakeDisplayRepository @Inject constructor() : DisplayRepository { private val flow = MutableSharedFlow<Set<Display>>(replay = 1) private val pendingDisplayFlow = MutableSharedFlow<DisplayRepository.PendingDisplay?>(replay = 1) @@ -71,3 +76,8 @@ class FakeDisplayRepository : DisplayRepository { override val displayChangeEvent: Flow<Int> = _displayChangeEvent suspend fun emitDisplayChangeEvent(displayId: Int) = _displayChangeEvent.emit(displayId) } + +@Module +interface FakeDisplayRepositoryModule { + @Binds fun bindFake(fake: FakeDisplayRepository): DisplayRepository +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt index 592fa3892dc9..5b642ea645f5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt @@ -42,7 +42,7 @@ class FakeKeyguardClockRepository @Inject constructor() : KeyguardClockRepositor private val _currentClockId = MutableStateFlow(DEFAULT_CLOCK_ID) override val currentClockId: Flow<ClockId> = _currentClockId - private val _currentClock = MutableStateFlow(null) + private val _currentClock: MutableStateFlow<ClockController?> = MutableStateFlow(null) override val currentClock = _currentClock private val _previewClockPair = @@ -60,6 +60,10 @@ class FakeKeyguardClockRepository @Inject constructor() : KeyguardClockRepositor override fun setClockSize(@ClockSize size: Int) { _clockSize.value = size } + + fun setCurrentClock(clockController: ClockController) { + _currentClock.value = clockController + } } @Module diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt index 8452963ddba1..75489b617120 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryKosmos.kt @@ -17,10 +17,12 @@ package com.android.systemui.keyguard.data.repository import android.os.fakeExecutorHandler -import com.android.systemui.common.ui.data.repository.configurationRepository +import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor.Companion.SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID +import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor.Companion.WEATHER_CLOCK_BLUEPRINT_ID import com.android.systemui.keyguard.shared.model.KeyguardBlueprint import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.view.layout.blueprints.DefaultKeyguardBlueprint.Companion.DEFAULT +import com.android.systemui.keyguard.ui.view.layout.blueprints.SplitShadeKeyguardBlueprint import com.android.systemui.kosmos.Kosmos import com.android.systemui.util.ThreadAssert import com.android.systemui.util.mockito.mock @@ -28,8 +30,13 @@ import com.android.systemui.util.mockito.mock val Kosmos.keyguardBlueprintRepository by Kosmos.Fixture { KeyguardBlueprintRepository( - configurationRepository = configurationRepository, - blueprints = setOf(defaultBlueprint), + blueprints = + setOf( + defaultBlueprint, + splitShadeBlueprint, + weatherClockBlueprint, + splitShadeWeatherClockBlueprint, + ), handler = fakeExecutorHandler, assert = mock<ThreadAssert>(), ) @@ -42,3 +49,27 @@ private val defaultBlueprint = override val sections: List<KeyguardSection> get() = listOf() } + +private val weatherClockBlueprint = + object : KeyguardBlueprint { + override val id: String + get() = WEATHER_CLOCK_BLUEPRINT_ID + override val sections: List<KeyguardSection> + get() = listOf() + } + +private val splitShadeWeatherClockBlueprint = + object : KeyguardBlueprint { + override val id: String + get() = SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID + override val sections: List<KeyguardSection> + get() = listOf() + } + +private val splitShadeBlueprint = + object : KeyguardBlueprint { + override val id: String + get() = SplitShadeKeyguardBlueprint.Companion.ID + override val sections: List<KeyguardSection> + get() = listOf() + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorKosmos.kt index 8b0bba1320e4..87d6c171ad0a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorKosmos.kt @@ -17,6 +17,8 @@ package com.android.systemui.keyguard.domain.interactor import android.content.applicationContext +import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor +import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.keyguard.data.repository.keyguardBlueprintRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope @@ -30,5 +32,7 @@ val Kosmos.keyguardBlueprintInteractor by context = applicationContext, splitShadeStateController = splitShadeStateController, clockInteractor = keyguardClockInteractor, + configurationInteractor = configurationInteractor, + fingerprintPropertyInteractor = fingerprintPropertyInteractor, ) } |