blob: ea7cc3dcd119fc5a54d840d9a8d8ab2496bf0894 [file] [log] [blame]
/*
* 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()
}
}