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