diff --git a/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt b/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt new file mode 100644 index 00000000000..794cfec1b3a --- /dev/null +++ b/tests/unit/src/com/android/settings/biometrics/fingerprint/feature/SfpsEnrollmentFeatureImplTest.kt @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2024 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.settings.biometrics.fingerprint.feature + +import android.animation.Animator +import android.content.Context +import android.hardware.fingerprint.FingerprintManager +import android.view.View +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_CENTER +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_FINGERTIP +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_LEFT_EDGE +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_NO_ANIMATION +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_RIGHT_EDGE +import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.STAGE_UNKNOWN +import com.google.common.truth.Truth.assertThat +import kotlin.math.roundToInt +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.mock +import org.mockito.Spy +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.mockito.Mockito.`when` as whenever + +@RunWith(AndroidJUnit4::class) +class SfpsEnrollmentFeatureImplTest { + @get:Rule + val mockito: MockitoRule = MockitoJUnit.rule() + + @Spy + private val context: Context = ApplicationProvider.getApplicationContext() + + private val settingsPackageName = "com.android.settings" + + private lateinit var settingsContext: Context + + @Mock + private lateinit var mockFingerprintManager: FingerprintManager + + private val mSfpsEnrollmentFeatureImpl: SfpsEnrollmentFeatureImpl = SfpsEnrollmentFeatureImpl() + + @Before + fun setUp() { + assertThat(mSfpsEnrollmentFeatureImpl).isInstanceOf(SfpsEnrollmentFeatureImpl::class.java) + whenever(context.getSystemService(FingerprintManager::class.java)) + .thenReturn(mockFingerprintManager) + doReturn(0f).`when`(mockFingerprintManager).getEnrollStageThreshold(0) + doReturn(0.36f).`when`(mockFingerprintManager).getEnrollStageThreshold(1) + doReturn(0.52f).`when`(mockFingerprintManager).getEnrollStageThreshold(2) + doReturn(0.76f).`when`(mockFingerprintManager).getEnrollStageThreshold(3) + doReturn(1f).`when`(mockFingerprintManager).getEnrollStageThreshold(4) + settingsContext = context.createPackageContext(settingsPackageName, 0) + } + + @Test + fun testGetEnrollStageThreshold() { + assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 0)).isEqualTo(0f) + assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 1)).isEqualTo(0.36f) + assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 2)).isEqualTo(0.52f) + assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 3)).isEqualTo(0.76f) + assertThat(mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, 4)).isEqualTo(1f) + } + + @Test + fun testGetHelpAnimator() { + val mockView: View = mock(View::class.java) + val animator: Animator = mSfpsEnrollmentFeatureImpl.getHelpAnimator(mockView) + assertThat(animator.duration).isEqualTo(550) + } + + @Test + fun testGetCurrentSfpsEnrollStage() { + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(0, null)) + .isEqualTo(STAGE_UNKNOWN) + val mapper = { i: Int -> + (25 * mSfpsEnrollmentFeatureImpl.getEnrollStageThreshold(context, i)).roundToInt() + } + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(-1, mapper)) + .isEqualTo(SFPS_STAGE_NO_ANIMATION) + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(0, mapper)) + .isEqualTo(SFPS_STAGE_CENTER) + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(9, mapper)) + .isEqualTo(SFPS_STAGE_FINGERTIP) + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(13, mapper)) + .isEqualTo(SFPS_STAGE_LEFT_EDGE) + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(19, mapper)) + .isEqualTo(SFPS_STAGE_RIGHT_EDGE) + assertThat(mSfpsEnrollmentFeatureImpl.getCurrentSfpsEnrollStage(25, mapper)) + .isEqualTo(SFPS_STAGE_RIGHT_EDGE) + } + + @Test + fun testGetFeaturedStageHeaderResource() { + val type = "string" + assertThat( + mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_NO_ANIMATION) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "security_settings_fingerprint_enroll_repeat_title", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_CENTER) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "security_settings_sfps_enroll_finger_center_title", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_FINGERTIP) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "security_settings_sfps_enroll_fingertip_title", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_LEFT_EDGE) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "security_settings_sfps_enroll_left_edge_title", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getFeaturedStageHeaderResource(SFPS_STAGE_RIGHT_EDGE) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "security_settings_sfps_enroll_right_edge_title", + type, + settingsPackageName) + ) + } + + @Test + fun testGetSfpsEnrollLottiePerStage() { + val type = "raw" + assertThat( + mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_NO_ANIMATION) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "sfps_lottie_no_animation", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_CENTER) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "sfps_lottie_pad_center", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_FINGERTIP) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "sfps_lottie_tip", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_LEFT_EDGE) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "sfps_lottie_left_edge", + type, + settingsPackageName) + ) + assertThat( + mSfpsEnrollmentFeatureImpl.getSfpsEnrollLottiePerStage(SFPS_STAGE_RIGHT_EDGE) + ).isEqualTo( + settingsContext.resources.getIdentifier( + "sfps_lottie_right_edge", + type, + settingsPackageName) + ) + } +} \ No newline at end of file