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