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