/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.systemui import android.graphics.Point import android.hardware.display.DisplayManagerGlobal import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import android.view.Display import android.view.DisplayAdjustments import android.view.DisplayInfo import androidx.test.filters.SmallTest import com.android.internal.R import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.biometrics.AuthController import com.android.systemui.decor.FaceScanningProviderFactory import com.android.systemui.dump.logcatLogBuffer import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import java.util.concurrent.Executor import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations @RunWithLooper @RunWith(AndroidTestingRunner::class) @SmallTest class FaceScanningProviderFactoryTest : SysuiTestCase() { private lateinit var underTest: FaceScanningProviderFactory @Mock private lateinit var authController: AuthController @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var display: Display private val displayId = 2 @Before fun setup() { MockitoAnnotations.initMocks(this) val displayInfo = DisplayInfo() val dmGlobal = mock(DisplayManagerGlobal::class.java) val display = Display( dmGlobal, displayId, displayInfo, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS ) whenever(dmGlobal.getDisplayInfo(eq(displayId))).thenReturn(displayInfo) val displayContext = context.createDisplayContext(display) as SysuiTestableContext displayContext.orCreateTestableResources.addOverride( R.array.config_displayUniqueIdArray, arrayOf(displayId) ) displayContext.orCreateTestableResources.addOverride( R.bool.config_fillMainBuiltInDisplayCutout, true ) val featureFlags = FakeFeatureFlags() featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true) underTest = FaceScanningProviderFactory( authController, displayContext, statusBarStateController, keyguardUpdateMonitor, mock(Executor::class.java), ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")), featureFlags, ) whenever(authController.faceSensorLocation).thenReturn(Point(10, 10)) } @Test fun shouldNotShowFaceScanningAnimationIfFaceIsNotEnrolled() { whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(false) whenever(authController.isShowing).thenReturn(true) assertThat(underTest.shouldShowFaceScanningAnim()).isFalse() } @Test fun shouldShowFaceScanningAnimationIfBiometricPromptIsShowing() { whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) whenever(authController.isShowing).thenReturn(true) assertThat(underTest.shouldShowFaceScanningAnim()).isTrue() } @Test fun shouldShowFaceScanningAnimationIfKeyguardFaceDetectionIsShowing() { whenever(keyguardUpdateMonitor.isFaceEnrolled).thenReturn(true) whenever(keyguardUpdateMonitor.isFaceDetectionRunning).thenReturn(true) assertThat(underTest.shouldShowFaceScanningAnim()).isTrue() } }