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 
18 package com.android.systemui.keyguard.ui.view.layout.sections
19 
20 import android.graphics.Point
21 import android.view.WindowManager
22 import androidx.constraintlayout.widget.ConstraintLayout
23 import androidx.constraintlayout.widget.ConstraintSet
24 import androidx.test.ext.junit.runners.AndroidJUnit4
25 import androidx.test.filters.SmallTest
26 import com.android.keyguard.LegacyLockIconViewController
27 import com.android.systemui.Flags as AConfigFlags
28 import com.android.systemui.SysuiTestCase
29 import com.android.systemui.biometrics.AuthController
30 import com.android.systemui.flags.FakeFeatureFlags
31 import com.android.systemui.flags.FakeFeatureFlagsClassic
32 import com.android.systemui.flags.Flags
33 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryBackgroundViewModel
34 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryForegroundViewModel
35 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryIconViewModel
36 import com.android.systemui.plugins.FalsingManager
37 import com.android.systemui.res.R
38 import com.android.systemui.shade.NotificationPanelView
39 import com.android.systemui.statusbar.VibratorHelper
40 import com.android.systemui.util.mockito.whenever
41 import com.google.common.truth.Truth.assertThat
42 import kotlinx.coroutines.ExperimentalCoroutinesApi
43 import kotlinx.coroutines.flow.MutableStateFlow
44 import kotlinx.coroutines.test.TestScope
45 import org.junit.Before
46 import org.junit.Test
47 import org.junit.runner.RunWith
48 import org.mockito.Answers
49 import org.mockito.Mock
50 import org.mockito.Mockito.mock
51 import org.mockito.MockitoAnnotations
52 
53 @ExperimentalCoroutinesApi
54 @RunWith(AndroidJUnit4::class)
55 @SmallTest
56 class DefaultDeviceEntrySectionTest : SysuiTestCase() {
57     @Mock private lateinit var authController: AuthController
58     @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var windowManager: WindowManager
59     @Mock private lateinit var notificationPanelView: NotificationPanelView
60     private lateinit var featureFlags: FakeFeatureFlags
61     @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
62     @Mock private lateinit var falsingManager: FalsingManager
63     @Mock private lateinit var deviceEntryIconViewModel: DeviceEntryIconViewModel
64     private lateinit var underTest: DefaultDeviceEntrySection
65 
66     @Before
setupnull67     fun setup() {
68         MockitoAnnotations.initMocks(this)
69 
70         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
71 
72         featureFlags =
73             FakeFeatureFlagsClassic().apply { set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false) }
74         underTest =
75             DefaultDeviceEntrySection(
76                 TestScope().backgroundScope,
77                 authController,
78                 windowManager,
79                 context,
80                 notificationPanelView,
81                 featureFlags,
82                 { lockIconViewController },
83                 { deviceEntryIconViewModel },
84                 { mock(DeviceEntryForegroundViewModel::class.java) },
85                 { mock(DeviceEntryBackgroundViewModel::class.java) },
86                 { falsingManager },
87                 { mock(VibratorHelper::class.java) },
88             )
89     }
90 
91     @Test
addViewsConditionally_migrateFlagOnnull92     fun addViewsConditionally_migrateFlagOn() {
93         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
94         val constraintLayout = ConstraintLayout(context, null)
95         underTest.addViews(constraintLayout)
96         assertThat(constraintLayout.childCount).isGreaterThan(0)
97     }
98 
99     @Test
addViewsConditionally_migrateAndRefactorFlagsOnnull100     fun addViewsConditionally_migrateAndRefactorFlagsOn() {
101         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
102         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
103         val constraintLayout = ConstraintLayout(context, null)
104         underTest.addViews(constraintLayout)
105         assertThat(constraintLayout.childCount).isGreaterThan(0)
106     }
107 
108     @Test
addViewsConditionally_migrateFlagOffnull109     fun addViewsConditionally_migrateFlagOff() {
110         mSetFlagsRule.disableFlags(AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
111         mSetFlagsRule.disableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
112         mSetFlagsRule.disableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
113         val constraintLayout = ConstraintLayout(context, null)
114         underTest.addViews(constraintLayout)
115         assertThat(constraintLayout.childCount).isEqualTo(0)
116     }
117 
118     @Test
applyConstraints_udfps_refactor_offnull119     fun applyConstraints_udfps_refactor_off() {
120         mSetFlagsRule.disableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
121         val cs = ConstraintSet()
122         underTest.applyConstraints(cs)
123 
124         val constraint = cs.getConstraint(R.id.lock_icon_view)
125 
126         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
127         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
128     }
129 
130     @Test
applyConstraints_udfps_refactor_onnull131     fun applyConstraints_udfps_refactor_on() {
132         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
133         whenever(deviceEntryIconViewModel.isUdfpsSupported).thenReturn(MutableStateFlow(false))
134         val cs = ConstraintSet()
135         underTest.applyConstraints(cs)
136 
137         val constraint = cs.getConstraint(R.id.device_entry_icon_view)
138 
139         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
140         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
141     }
142 
143     @Test
testCenterIcon_udfps_refactor_offnull144     fun testCenterIcon_udfps_refactor_off() {
145         mSetFlagsRule.disableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
146         val cs = ConstraintSet()
147         underTest.centerIcon(Point(5, 6), 1F, cs)
148 
149         val constraint = cs.getConstraint(R.id.lock_icon_view)
150 
151         assertThat(constraint.layout.mWidth).isEqualTo(2)
152         assertThat(constraint.layout.mHeight).isEqualTo(2)
153         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
154         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
155         assertThat(constraint.layout.topMargin).isEqualTo(5)
156         assertThat(constraint.layout.startMargin).isEqualTo(4)
157     }
158 
159     @Test
testCenterIcon_udfps_refactor_onnull160     fun testCenterIcon_udfps_refactor_on() {
161         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
162         val cs = ConstraintSet()
163         underTest.centerIcon(Point(5, 6), 1F, cs)
164 
165         val constraint = cs.getConstraint(R.id.device_entry_icon_view)
166 
167         assertThat(constraint.layout.mWidth).isEqualTo(2)
168         assertThat(constraint.layout.mHeight).isEqualTo(2)
169         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
170         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
171         assertThat(constraint.layout.topMargin).isEqualTo(5)
172         assertThat(constraint.layout.startMargin).isEqualTo(4)
173     }
174 }
175