1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.keyguard.ui.viewmodel 18 19 import androidx.test.ext.junit.runners.AndroidJUnit4 20 import androidx.test.filters.SmallTest 21 import com.android.systemui.RoboPilotTest 22 import com.android.systemui.SysuiTestCase 23 import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository 24 import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository 25 import com.android.systemui.coroutines.collectLastValue 26 import com.android.systemui.doze.util.BurnInHelperWrapper 27 import com.android.systemui.flags.FakeFeatureFlags 28 import com.android.systemui.flags.Flags 29 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository 30 import com.android.systemui.keyguard.domain.interactor.BurnInInteractor 31 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor 32 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory 33 import com.android.systemui.keyguard.domain.interactor.UdfpsKeyguardInteractor 34 import com.android.systemui.shade.data.repository.FakeShadeRepository 35 import com.android.systemui.statusbar.phone.SystemUIDialogManager 36 import com.google.common.truth.Truth.assertThat 37 import kotlinx.coroutines.ExperimentalCoroutinesApi 38 import kotlinx.coroutines.test.TestScope 39 import kotlinx.coroutines.test.runCurrent 40 import kotlinx.coroutines.test.runTest 41 import org.junit.Before 42 import org.junit.Test 43 import org.junit.runner.RunWith 44 import org.mockito.Mock 45 import org.mockito.MockitoAnnotations 46 47 @ExperimentalCoroutinesApi 48 @SmallTest 49 @RoboPilotTest 50 @RunWith(AndroidJUnit4::class) 51 class UdfpsAodViewModelTest : SysuiTestCase() { 52 private val defaultPadding = 12 53 private lateinit var underTest: UdfpsAodViewModel 54 55 private lateinit var testScope: TestScope 56 private lateinit var configRepository: FakeConfigurationRepository 57 private lateinit var bouncerRepository: KeyguardBouncerRepository 58 private lateinit var keyguardRepository: FakeKeyguardRepository 59 private lateinit var featureFlags: FakeFeatureFlags 60 private lateinit var shadeRepository: FakeShadeRepository 61 private lateinit var keyguardInteractor: KeyguardInteractor 62 63 @Mock private lateinit var dialogManager: SystemUIDialogManager 64 @Mock private lateinit var burnInHelper: BurnInHelperWrapper 65 66 @Before 67 fun setUp() { 68 MockitoAnnotations.initMocks(this) 69 overrideResource(com.android.systemui.R.dimen.lock_icon_padding, defaultPadding) 70 testScope = TestScope() 71 shadeRepository = FakeShadeRepository() 72 featureFlags = 73 FakeFeatureFlags().apply { 74 set(Flags.REFACTOR_UDFPS_KEYGUARD_VIEWS, true) 75 set(Flags.FACE_AUTH_REFACTOR, false) 76 } 77 KeyguardInteractorFactory.create( 78 featureFlags = featureFlags, 79 ) 80 .also { 81 keyguardInteractor = it.keyguardInteractor 82 keyguardRepository = it.repository 83 configRepository = it.configurationRepository 84 bouncerRepository = it.bouncerRepository 85 } 86 val udfpsKeyguardInteractor = 87 UdfpsKeyguardInteractor( 88 configRepository, 89 BurnInInteractor( 90 context, 91 burnInHelper, 92 testScope.backgroundScope, 93 configRepository, 94 keyguardInteractor, 95 ), 96 keyguardInteractor, 97 shadeRepository, 98 dialogManager, 99 ) 100 101 underTest = 102 UdfpsAodViewModel( 103 udfpsKeyguardInteractor, 104 context, 105 ) 106 } 107 108 @Test 109 fun alphaAndVisibleUpdates_onDozeAmountChanges() = 110 testScope.runTest { 111 val alpha by collectLastValue(underTest.alpha) 112 val visible by collectLastValue(underTest.isVisible) 113 114 keyguardRepository.setDozeAmount(0f) 115 runCurrent() 116 assertThat(alpha).isEqualTo(0f) 117 assertThat(visible).isFalse() 118 119 keyguardRepository.setDozeAmount(.65f) 120 runCurrent() 121 assertThat(alpha).isEqualTo(.65f) 122 assertThat(visible).isTrue() 123 124 keyguardRepository.setDozeAmount(.23f) 125 runCurrent() 126 assertThat(alpha).isEqualTo(.23f) 127 assertThat(visible).isTrue() 128 129 keyguardRepository.setDozeAmount(1f) 130 runCurrent() 131 assertThat(alpha).isEqualTo(1f) 132 assertThat(visible).isTrue() 133 } 134 135 @Test 136 fun paddingUpdates_onScaleForResolutionChanges() = 137 testScope.runTest { 138 val padding by collectLastValue(underTest.padding) 139 140 configRepository.setScaleForResolution(1f) 141 runCurrent() 142 assertThat(padding).isEqualTo(defaultPadding) 143 144 configRepository.setScaleForResolution(2f) 145 runCurrent() 146 assertThat(padding).isEqualTo(defaultPadding * 2) 147 148 configRepository.setScaleForResolution(.5f) 149 runCurrent() 150 assertThat(padding).isEqualTo((defaultPadding * .5f).toInt()) 151 } 152 } 153