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