1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui 16 17 import android.graphics.Point 18 import android.hardware.display.DisplayManagerGlobal 19 import android.testing.AndroidTestingRunner 20 import android.testing.TestableLooper.RunWithLooper 21 import android.view.Display 22 import android.view.DisplayAdjustments 23 import android.view.DisplayInfo 24 import androidx.test.filters.SmallTest 25 import com.android.internal.R 26 import com.android.keyguard.KeyguardUpdateMonitor 27 import com.android.systemui.biometrics.AuthController 28 import com.android.systemui.decor.FaceScanningProviderFactory 29 import com.android.systemui.dump.logcatLogBuffer 30 import com.android.systemui.flags.FakeFeatureFlags 31 import com.android.systemui.flags.Flags 32 import com.android.systemui.log.ScreenDecorationsLogger 33 import com.android.systemui.plugins.statusbar.StatusBarStateController 34 import com.android.systemui.util.mockito.whenever 35 import com.google.common.truth.Truth.assertThat 36 import java.util.concurrent.Executor 37 import org.junit.Before 38 import org.junit.Test 39 import org.junit.runner.RunWith 40 import org.mockito.ArgumentMatchers.eq 41 import org.mockito.Mock 42 import org.mockito.Mockito.mock 43 import org.mockito.MockitoAnnotations 44 45 @RunWithLooper 46 @RunWith(AndroidTestingRunner::class) 47 @SmallTest 48 class FaceScanningProviderFactoryTest : SysuiTestCase() { 49 50 private lateinit var underTest: FaceScanningProviderFactory 51 52 @Mock private lateinit var authController: AuthController 53 54 @Mock private lateinit var statusBarStateController: StatusBarStateController 55 56 @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor 57 58 @Mock private lateinit var display: Display 59 60 private val displayId = 2 61 62 @Before 63 fun setup() { 64 MockitoAnnotations.initMocks(this) 65 66 val displayInfo = DisplayInfo() 67 val dmGlobal = mock(DisplayManagerGlobal::class.java) 68 val display = 69 Display( 70 dmGlobal, 71 displayId, 72 displayInfo, 73 DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS 74 ) 75 whenever(dmGlobal.getDisplayInfo(eq(displayId))).thenReturn(displayInfo) 76 val displayContext = context.createDisplayContext(display) as SysuiTestableContext 77 displayContext.orCreateTestableResources.addOverride( 78 R.array.config_displayUniqueIdArray, 79 arrayOf(displayId) 80 ) 81 displayContext.orCreateTestableResources.addOverride( 82 R.bool.config_fillMainBuiltInDisplayCutout, 83 true 84 ) 85 val featureFlags = FakeFeatureFlags() 86 featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true) 87 underTest = 88 FaceScanningProviderFactory( 89 authController, 90 displayContext, 91 statusBarStateController, 92 keyguardUpdateMonitor, 93 mock(Executor::class.java), 94 ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")), 95 featureFlags, 96 ) 97 98 whenever(authController.faceSensorLocation).thenReturn(Point(10, 10)) 99 } 100 101 @Test 102 fun shouldNotShowFaceScanningAnimationIfFaceIsNotEnrolled() { 103 whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(false) 104 whenever(authController.isShowing).thenReturn(true) 105 106 assertThat(underTest.shouldShowFaceScanningAnim()).isFalse() 107 } 108 109 @Test 110 fun shouldShowFaceScanningAnimationIfBiometricPromptIsShowing() { 111 whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) 112 whenever(authController.isShowing).thenReturn(true) 113 114 assertThat(underTest.shouldShowFaceScanningAnim()).isTrue() 115 } 116 117 @Test 118 fun shouldShowFaceScanningAnimationIfKeyguardFaceDetectionIsShowing() { 119 whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) 120 whenever(keyguardUpdateMonitor.isFaceDetectionRunning).thenReturn(true) 121 122 assertThat(underTest.shouldShowFaceScanningAnim()).isTrue() 123 } 124 } 125