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