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.systemui.Flags as AConfigFlags
27 import com.android.systemui.SysuiTestCase
28 import com.android.systemui.biometrics.AuthController
29 import com.android.systemui.flags.FakeFeatureFlags
30 import com.android.systemui.flags.FakeFeatureFlagsClassic
31 import com.android.systemui.flags.Flags
32 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryBackgroundViewModel
33 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryForegroundViewModel
34 import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryIconViewModel
35 import com.android.systemui.log.logcatLogBuffer
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 falsingManager: FalsingManager
62     @Mock private lateinit var deviceEntryIconViewModel: DeviceEntryIconViewModel
63     private lateinit var underTest: DefaultDeviceEntrySection
64 
65     @Before
setupnull66     fun setup() {
67         MockitoAnnotations.initMocks(this)
68 
69         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
70 
71         featureFlags =
72             FakeFeatureFlagsClassic().apply { set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false) }
73         underTest =
74             DefaultDeviceEntrySection(
75                 TestScope().backgroundScope,
76                 authController,
77                 windowManager,
78                 context,
79                 notificationPanelView,
80                 featureFlags,
81                 { deviceEntryIconViewModel },
82                 { mock(DeviceEntryForegroundViewModel::class.java) },
83                 { mock(DeviceEntryBackgroundViewModel::class.java) },
84                 { falsingManager },
85                 { mock(VibratorHelper::class.java) },
86                 logcatLogBuffer(),
87             )
88     }
89 
90     @Test
addViewsConditionally_migrateFlagOnnull91     fun addViewsConditionally_migrateFlagOn() {
92         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
93         val constraintLayout = ConstraintLayout(context, null)
94         underTest.addViews(constraintLayout)
95         assertThat(constraintLayout.childCount).isGreaterThan(0)
96     }
97 
98     @Test
addViewsConditionally_migrateAndRefactorFlagsOnnull99     fun addViewsConditionally_migrateAndRefactorFlagsOn() {
100         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
101         val constraintLayout = ConstraintLayout(context, null)
102         underTest.addViews(constraintLayout)
103         assertThat(constraintLayout.childCount).isGreaterThan(0)
104     }
105 
106     @Test
applyConstraintsnull107     fun applyConstraints() {
108         whenever(deviceEntryIconViewModel.isUdfpsSupported).thenReturn(MutableStateFlow(false))
109         val cs = ConstraintSet()
110         underTest.applyConstraints(cs)
111 
112         val constraint = cs.getConstraint(R.id.device_entry_icon_view)
113 
114         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
115         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
116     }
117 
118     @Test
testCenterIconnull119     fun testCenterIcon() {
120         val cs = ConstraintSet()
121         underTest.centerIcon(Point(5, 6), 1F, cs)
122 
123         val constraint = cs.getConstraint(R.id.device_entry_icon_view)
124 
125         assertThat(constraint.layout.mWidth).isEqualTo(2)
126         assertThat(constraint.layout.mHeight).isEqualTo(2)
127         assertThat(constraint.layout.topToTop).isEqualTo(ConstraintSet.PARENT_ID)
128         assertThat(constraint.layout.startToStart).isEqualTo(ConstraintSet.PARENT_ID)
129         assertThat(constraint.layout.topMargin).isEqualTo(5)
130         assertThat(constraint.layout.startMargin).isEqualTo(4)
131     }
132 }
133