• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.blueprints
19 
20 import android.testing.TestableLooper.RunWithLooper
21 import androidx.constraintlayout.widget.ConstraintLayout
22 import androidx.constraintlayout.widget.ConstraintSet
23 import androidx.test.ext.junit.runners.AndroidJUnit4
24 import androidx.test.filters.SmallTest
25 import com.android.systemui.SysuiTestCase
26 import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
27 import com.android.systemui.keyguard.shared.model.KeyguardSection
28 import com.android.systemui.keyguard.ui.view.KeyguardRootView
29 import com.android.systemui.keyguard.ui.view.layout.sections.AccessibilityActionsSection
30 import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
31 import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
32 import com.android.systemui.keyguard.ui.view.layout.sections.AodPromotedNotificationSection
33 import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
34 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection
35 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
36 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection
37 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultSettingsPopupMenuSection
38 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultShortcutsSection
39 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultStatusBarSection
40 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultUdfpsAccessibilityOverlaySection
41 import com.android.systemui.keyguard.ui.view.layout.sections.KeyguardSliceViewSection
42 import com.android.systemui.keyguard.ui.view.layout.sections.SmartspaceSection
43 import com.android.systemui.util.mockito.whenever
44 import java.util.Optional
45 import org.junit.Before
46 import org.junit.Test
47 import org.junit.runner.RunWith
48 import org.mockito.Mock
49 import org.mockito.Mockito.mock
50 import org.mockito.Mockito.never
51 import org.mockito.Mockito.verify
52 import org.mockito.MockitoAnnotations
53 
54 @RunWith(AndroidJUnit4::class)
55 @RunWithLooper(setAsMainLooper = true)
56 @SmallTest
57 class DefaultKeyguardBlueprintTest : SysuiTestCase() {
58     private lateinit var underTest: DefaultKeyguardBlueprint
59     private lateinit var rootView: KeyguardRootView
60     @Mock private lateinit var accessibilityActionsSection: AccessibilityActionsSection
61     @Mock private lateinit var defaultIndicationAreaSection: DefaultIndicationAreaSection
62     @Mock private lateinit var mDefaultDeviceEntrySection: DefaultDeviceEntrySection
63     @Mock private lateinit var defaultShortcutsSection: DefaultShortcutsSection
64     @Mock private lateinit var defaultAmbientIndicationAreaSection: Optional<KeyguardSection>
65     @Mock private lateinit var defaultSettingsPopupMenuSection: DefaultSettingsPopupMenuSection
66     @Mock private lateinit var defaultStatusBarViewSection: DefaultStatusBarSection
67     @Mock private lateinit var defaultNSSLSection: DefaultNotificationStackScrollLayoutSection
68     @Mock private lateinit var aodPromotedNotificationSection: AodPromotedNotificationSection
69     @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection
70     @Mock private lateinit var aodBurnInSection: AodBurnInSection
71     @Mock private lateinit var clockSection: ClockSection
72     @Mock private lateinit var smartspaceSection: SmartspaceSection
73     @Mock private lateinit var keyguardSliceViewSection: KeyguardSliceViewSection
74     @Mock
75     private lateinit var udfpsAccessibilityOverlaySection: DefaultUdfpsAccessibilityOverlaySection
76 
77     @Before
setupnull78     fun setup() {
79         MockitoAnnotations.initMocks(this)
80         rootView = KeyguardRootView(context, null)
81         underTest =
82             DefaultKeyguardBlueprint(
83                 accessibilityActionsSection,
84                 defaultIndicationAreaSection,
85                 mDefaultDeviceEntrySection,
86                 defaultShortcutsSection,
87                 defaultAmbientIndicationAreaSection,
88                 defaultSettingsPopupMenuSection,
89                 defaultStatusBarViewSection,
90                 defaultNSSLSection,
91                 aodPromotedNotificationSection,
92                 aodNotificationIconsSection,
93                 aodBurnInSection,
94                 clockSection,
95                 smartspaceSection,
96                 keyguardSliceViewSection,
97                 udfpsAccessibilityOverlaySection,
98             )
99     }
100 
101     @Test
replaceViewsnull102     fun replaceViews() {
103         val constraintLayout = ConstraintLayout(context, null)
104         underTest.replaceViews(constraintLayout)
105         underTest.sections.forEach { verify(it)?.addViews(constraintLayout) }
106     }
107 
108     @Test
replaceViews_withPrevBlueprintnull109     fun replaceViews_withPrevBlueprint() {
110         val prevBlueprint = mock(KeyguardBlueprint::class.java)
111         val removedSection = mock(KeyguardSection::class.java)
112         val addedSection = mDefaultDeviceEntrySection
113         val rebuildSection = clockSection
114         val prevSections = underTest.sections.minus(addedSection).plus(removedSection)
115         val unchangedSections = underTest.sections.subtract(listOf(addedSection, rebuildSection))
116         whenever(prevBlueprint.sections).thenReturn(prevSections)
117 
118         val constraintLayout = ConstraintLayout(context, null)
119         underTest.replaceViews(constraintLayout, prevBlueprint)
120 
121         unchangedSections.forEach {
122             verify(it, never()).addViews(constraintLayout)
123             verify(it, never()).removeViews(constraintLayout)
124         }
125 
126         verify(addedSection).addViews(constraintLayout)
127         verify(removedSection).removeViews(constraintLayout)
128     }
129 
130     @Test
replaceViews_withPrevBlueprint_withRebuildTargetsnull131     fun replaceViews_withPrevBlueprint_withRebuildTargets() {
132         val prevBlueprint = mock(KeyguardBlueprint::class.java)
133         val removedSection = mock(KeyguardSection::class.java)
134         val addedSection = mDefaultDeviceEntrySection
135         val rebuildSection = clockSection
136         val prevSections = underTest.sections.minus(addedSection).plus(removedSection)
137         val unchangedSections = underTest.sections.subtract(listOf(addedSection, rebuildSection))
138         whenever(prevBlueprint.sections).thenReturn(prevSections)
139 
140         val constraintLayout = ConstraintLayout(context, null)
141         underTest.replaceViews(constraintLayout, prevBlueprint, listOf(rebuildSection))
142 
143         unchangedSections.forEach {
144             verify(it, never()).addViews(constraintLayout)
145             verify(it, never()).removeViews(constraintLayout)
146         }
147 
148         verify(addedSection).addViews(constraintLayout)
149         verify(rebuildSection).addViews(constraintLayout)
150         verify(rebuildSection).removeViews(constraintLayout)
151         verify(removedSection).removeViews(constraintLayout)
152     }
153 
154     @Test
rebuildViewsnull155     fun rebuildViews() {
156         val rebuildSections = listOf(mDefaultDeviceEntrySection, clockSection)
157         val unchangedSections = underTest.sections.subtract(rebuildSections)
158 
159         val constraintLayout = ConstraintLayout(context, null)
160         underTest.rebuildViews(constraintLayout, rebuildSections)
161 
162         unchangedSections.forEach {
163             verify(it, never()).addViews(constraintLayout)
164             verify(it, never()).removeViews(constraintLayout)
165         }
166 
167         rebuildSections.forEach {
168             verify(it).addViews(constraintLayout)
169             verify(it).removeViews(constraintLayout)
170         }
171     }
172 
173     @Test
deviceEntryIconIsOnTopnull174     fun deviceEntryIconIsOnTop() {
175         val constraintLayout = ConstraintLayout(context, null)
176         underTest.replaceViews(constraintLayout)
177         underTest.sections.forEach { verify(it)?.addViews(constraintLayout) }
178     }
179 
180     @Test
applyConstraintsnull181     fun applyConstraints() {
182         val cs = ConstraintSet()
183         underTest.applyConstraints(cs)
184         underTest.sections.forEach { verify(it)?.applyConstraints(cs) }
185     }
186 }
187