diff options
4 files changed, 94 insertions, 122 deletions
diff --git a/packages/SystemUI/aconfig/biometrics_framework.aconfig b/packages/SystemUI/aconfig/biometrics_framework.aconfig index e3f5378175d2..9692aa5d1a4c 100644 --- a/packages/SystemUI/aconfig/biometrics_framework.aconfig +++ b/packages/SystemUI/aconfig/biometrics_framework.aconfig @@ -4,16 +4,6 @@ container: "system" # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors. flag { - name: "bp_icon_a11y" - namespace: "biometrics_framework" - description: "Fixes biometric prompt icon not working as button with a11y" - bug: "359423579" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "cont_auth_plugin" namespace: "biometrics_framework" description: "Plugin and related API hooks for contextual auth plugins" diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt index ab936590de93..66f44babdf5f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt @@ -158,6 +158,22 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa private val mockFingerprintIconWidth = 300 private val mockFingerprintIconHeight = 300 + private val faceIconAuthingDescription = + R.string.biometric_dialog_face_icon_description_authenticating + private val faceIconAuthedDescription = + R.string.biometric_dialog_face_icon_description_authenticated + private val faceIconConfirmedDescription = + R.string.biometric_dialog_face_icon_description_confirmed + private val faceIconIdleDescription = R.string.biometric_dialog_face_icon_description_idle + private val sfpsFindSensorDescription = + R.string.security_settings_sfps_enroll_find_sensor_message + private val udfpsIconDescription = R.string.accessibility_fingerprint_label + private val faceFailedDescription = R.string.keyguard_face_failed + private val bpTryAgainDescription = R.string.biometric_dialog_try_again + private val bpConfirmDescription = R.string.biometric_dialog_confirm + private val fingerprintIconAuthenticatedDescription = + R.string.fingerprint_dialog_authenticated_confirmation + /** Mock [UdfpsOverlayParams] for a test. */ private fun mockUdfpsOverlayParams(isLandscape: Boolean = false): UdfpsOverlayParams = UdfpsOverlayParams( @@ -337,21 +353,18 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if ((testCase.isCoex && !forceExplicitFlow) || testCase.isFaceOnly) { // Face-only or implicit co-ex auth assertThat(iconAsset).isEqualTo(R.raw.face_dialog_authenticating) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_face_icon_description_authenticating) + assertThat(iconContentDescriptionId).isEqualTo(faceIconAuthingDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else if ((testCase.isCoex && forceExplicitFlow) || testCase.isFingerprintOnly) { // Fingerprint-only or explicit co-ex auth if (testCase.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON) { assertThat(iconAsset).isEqualTo(getSfpsAsset_fingerprintAuthenticating()) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.security_settings_sfps_enroll_find_sensor_message) + assertThat(iconContentDescriptionId).isEqualTo(sfpsFindSensorDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_fingerprint_to_error_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(false) } } @@ -397,26 +410,25 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if (testCase.isFaceOnly) { // Face-only auth assertThat(iconAsset).isEqualTo(R.raw.face_dialog_dark_to_error) - assertThat(iconContentDescriptionId).isEqualTo(R.string.keyguard_face_failed) + assertThat(iconContentDescriptionId).isEqualTo(faceFailedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) // Clear error, go to idle errorJob.join() assertThat(iconAsset).isEqualTo(R.raw.face_dialog_error_to_idle) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_face_icon_description_idle) + assertThat(iconContentDescriptionId).isEqualTo(faceIconIdleDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else if ((testCase.isCoex && forceExplicitFlow) || testCase.isFingerprintOnly) { // Fingerprint-only or explicit co-ex auth if (testCase.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON) { assertThat(iconAsset).isEqualTo(getSfpsAsset_fingerprintToError()) - assertThat(iconContentDescriptionId).isEqualTo(R.string.biometric_dialog_try_again) + assertThat(iconContentDescriptionId).isEqualTo(bpTryAgainDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_fingerprint_to_error_lottie) - assertThat(iconContentDescriptionId).isEqualTo(R.string.biometric_dialog_try_again) + assertThat(iconContentDescriptionId).isEqualTo(bpTryAgainDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } @@ -425,14 +437,12 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if (testCase.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON) { assertThat(iconAsset).isEqualTo(getSfpsAsset_errorToFingerprint()) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.security_settings_sfps_enroll_find_sensor_message) + assertThat(iconContentDescriptionId).isEqualTo(sfpsFindSensorDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_error_to_fingerprint_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } @@ -472,13 +482,12 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa // Covers (1) fingerprint-only (2) co-ex, authenticated by fingerprint if (testCase.authenticatedByFingerprint) { assertThat(iconAsset).isEqualTo(R.raw.biometricprompt_sfps_error_to_success) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.security_settings_sfps_enroll_find_sensor_message) + assertThat(iconContentDescriptionId).isEqualTo(sfpsFindSensorDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { // Covers co-ex, authenticated by face assertThat(iconAsset).isEqualTo(R.raw.biometricprompt_sfps_error_to_unlock) assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_authenticated_confirmation) + .isEqualTo(fingerprintIconAuthenticatedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) // Confirm authentication @@ -486,8 +495,7 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa assertThat(iconAsset) .isEqualTo(R.raw.biometricprompt_sfps_unlock_to_success) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } else { // Non-SFPS (UDFPS / rear-FPS) test cases @@ -495,14 +503,12 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if (testCase.authenticatedByFingerprint) { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_error_to_success_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { // co-ex, authenticated by face assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_error_to_unlock_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_confirm) + assertThat(iconContentDescriptionId).isEqualTo(bpConfirmDescription) assertThat(shouldAnimateIconView).isEqualTo(true) // Confirm authentication @@ -512,8 +518,7 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa .isEqualTo( R.raw.fingerprint_dialogue_unlocked_to_checkmark_success_lottie ) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } @@ -543,22 +548,19 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa // Fingerprint icon asset assertions if (testCase.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON) { assertThat(iconAsset).isEqualTo(getSfpsAsset_fingerprintToSuccess()) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.security_settings_sfps_enroll_find_sensor_message) + assertThat(iconContentDescriptionId).isEqualTo(sfpsFindSensorDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_fingerprint_to_success_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } else if (testCase.isFaceOnly || testCase.isCoex) { // Face icon asset assertions // If co-ex, use implicit flow (explicit flow always requires confirmation) assertThat(iconAsset).isEqualTo(R.raw.face_dialog_dark_to_checkmark) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_face_icon_description_authenticated) + assertThat(iconContentDescriptionId).isEqualTo(faceIconAuthedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) assertThat(message).isEqualTo(PromptMessage.Empty) } @@ -586,20 +588,18 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if (testCase.isFaceOnly) { assertThat(iconAsset).isEqualTo(R.raw.face_dialog_wink_from_dark) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_face_icon_description_authenticated) + assertThat(iconContentDescriptionId).isEqualTo(faceIconAuthedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else if (testCase.isCoex) { // explicit flow, confirmation requested if (testCase.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON) { assertThat(iconAsset).isEqualTo(getSfpsAsset_fingerprintToUnlock()) assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_authenticated_confirmation) + .isEqualTo(fingerprintIconAuthenticatedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } else { assertThat(iconAsset) .isEqualTo(R.raw.fingerprint_dialogue_fingerprint_to_unlock_lottie) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_confirm) + assertThat(iconContentDescriptionId).isEqualTo(bpConfirmDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } @@ -628,8 +628,7 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa if (testCase.isFaceOnly) { assertThat(iconAsset).isEqualTo(R.raw.face_dialog_dark_to_checkmark) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.biometric_dialog_face_icon_description_confirmed) + assertThat(iconContentDescriptionId).isEqualTo(faceIconConfirmedDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } @@ -644,8 +643,7 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa .isEqualTo( R.raw.fingerprint_dialogue_unlocked_to_checkmark_success_lottie ) - assertThat(iconContentDescriptionId) - .isEqualTo(R.string.fingerprint_dialog_touch_sensor) + assertThat(iconContentDescriptionId).isEqualTo(udfpsIconDescription) assertThat(shouldAnimateIconView).isEqualTo(true) } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt index db4b0f2522ed..54c52b533da4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt @@ -43,7 +43,7 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieCompositionFactory -import com.android.systemui.Flags.bpIconA11y +import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.biometrics.Utils.ellipsize import com.android.systemui.biometrics.shared.model.BiometricModalities import com.android.systemui.biometrics.shared.model.BiometricModality @@ -63,7 +63,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import com.android.app.tracing.coroutines.launchTraced as launch private const val TAG = "BiometricViewBinder" @@ -327,33 +326,32 @@ object BiometricViewBinder { // reuse the icon as a confirm button launch { - if (bpIconA11y()) { - viewModel.isIconConfirmButton.collect { isButton -> - if (isButton) { - iconView.onTouchListener { _: View, event: MotionEvent -> - viewModel.onOverlayTouch(event) - } - iconView.setOnClickListener { viewModel.confirmAuthenticated() } - } else { - iconView.setOnTouchListener(null) - iconView.setOnClickListener(null) + viewModel.isIconConfirmButton.collect { isButton -> + if (isButton && !accessibilityManager.isEnabled) { + iconView.onTouchListener { _: View, event: MotionEvent -> + viewModel.onOverlayTouch(event) } + } else { + iconView.setOnTouchListener(null) } - } else { - viewModel.isIconConfirmButton - .map { isPending -> - when { - isPending && modalities.hasFaceAndFingerprint -> - View.OnTouchListener { _: View, event: MotionEvent -> - viewModel.onOverlayTouch(event) - } - else -> null - } - } - .collect { onTouch -> iconView.setOnTouchListener(onTouch) } } } + launch { + combine(viewModel.isIconConfirmButton, viewModel.isAuthenticated, ::Pair) + .collect { (isIconConfirmButton, authState) -> + // Only use the icon as a button for talkback when coex and pending + // confirmation + if ( + accessibilityManager.isEnabled && + isIconConfirmButton && + authState.isAuthenticated + ) { + iconView.setOnClickListener { viewModel.confirmAuthenticated() } + } + } + } + // dismiss prompt when authenticated and confirmed launch { viewModel.isAuthenticated.collect { authState -> @@ -365,22 +363,8 @@ object BiometricViewBinder { backgroundView.setOnClickListener(null) backgroundView.importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO - - // Allow icon to be used as confirmation button with udfps and a11y - // enabled - if ( - !bpIconA11y() && - accessibilityManager.isTouchExplorationEnabled && - modalities.hasUdfps - ) { - iconView.setOnClickListener { viewModel.confirmAuthenticated() } - } } if (authState.isAuthenticatedAndConfirmed) { - view.announceForAccessibility( - view.resources.getString(R.string.biometric_dialog_authenticated) - ) - launch { delay(authState.delay) if (authState.isAuthenticatedAndExplicitlyConfirmed) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt index 574c40da226f..788c792fdd91 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt @@ -43,7 +43,7 @@ class PromptIconViewModel( enum class AuthType { Fingerprint, Face, - Coex + Coex, } /** @@ -53,7 +53,7 @@ class PromptIconViewModel( val activeAuthType: Flow<AuthType> = combine( promptViewModel.modalities.distinctUntilChanged(), - promptViewModel.faceMode.distinctUntilChanged() + promptViewModel.faceMode.distinctUntilChanged(), ) { modalities, faceMode -> if (modalities.hasFaceAndFingerprint && !faceMode) { AuthType.Coex @@ -102,7 +102,7 @@ class PromptIconViewModel( promptSelectorInteractor.fingerprintSensorType, promptViewModel.isAuthenticated, promptViewModel.isAuthenticating, - promptViewModel.showingError + promptViewModel.showingError, ) { rotation: DisplayRotation, isInRearDisplayMode: Boolean, @@ -117,13 +117,13 @@ class PromptIconViewModel( isInRearDisplayMode, authState.isAuthenticated, isAuthenticating, - showingError + showingError, ) else -> getFingerprintIconViewAsset( authState.isAuthenticated, isAuthenticating, - showingError + showingError, ) } } @@ -132,7 +132,7 @@ class PromptIconViewModel( promptViewModel.isAuthenticated.distinctUntilChanged(), promptViewModel.isAuthenticating.distinctUntilChanged(), promptViewModel.isPendingConfirmation.distinctUntilChanged(), - promptViewModel.showingError.distinctUntilChanged() + promptViewModel.showingError.distinctUntilChanged(), ) { authState: PromptAuthState, isAuthenticating: Boolean, @@ -142,7 +142,7 @@ class PromptIconViewModel( authState, isAuthenticating, isPendingConfirmation, - showingError + showingError, ) } AuthType.Coex -> @@ -170,14 +170,14 @@ class PromptIconViewModel( authState, isAuthenticating, isPendingConfirmation, - showingError + showingError, ) else -> getCoexIconViewAsset( authState, isAuthenticating, isPendingConfirmation, - showingError + showingError, ) } } @@ -187,7 +187,7 @@ class PromptIconViewModel( private fun getFingerprintIconViewAsset( isAuthenticated: Boolean, isAuthenticating: Boolean, - showingError: Boolean + showingError: Boolean, ): Int { return if (isAuthenticated) { if (_previousIconWasError.value) { @@ -214,7 +214,7 @@ class PromptIconViewModel( isInRearDisplayMode: Boolean, isAuthenticated: Boolean, isAuthenticating: Boolean, - showingError: Boolean + showingError: Boolean, ): Int { return if (isAuthenticated) { if (_previousIconWasError.value) { @@ -240,7 +240,7 @@ class PromptIconViewModel( authState: PromptAuthState, isAuthenticating: Boolean, isPendingConfirmation: Boolean, - showingError: Boolean + showingError: Boolean, ): Int { return if (authState.isAuthenticated && isPendingConfirmation) { R.raw.face_dialog_wink_from_dark @@ -262,7 +262,7 @@ class PromptIconViewModel( authState: PromptAuthState, isAuthenticating: Boolean, isPendingConfirmation: Boolean, - showingError: Boolean + showingError: Boolean, ): Int { return if (authState.isAuthenticatedAndExplicitlyConfirmed) { R.raw.fingerprint_dialogue_unlocked_to_checkmark_success_lottie @@ -298,7 +298,7 @@ class PromptIconViewModel( authState: PromptAuthState, isAuthenticating: Boolean, isPendingConfirmation: Boolean, - showingError: Boolean + showingError: Boolean, ): Int { return if (authState.isAuthenticatedAndExplicitlyConfirmed) { R.raw.biometricprompt_sfps_unlock_to_success @@ -338,7 +338,7 @@ class PromptIconViewModel( promptViewModel.isAuthenticated, promptViewModel.isAuthenticating, promptViewModel.isPendingConfirmation, - promptViewModel.showingError + promptViewModel.showingError, ) { sensorType: FingerprintSensorType, authState: PromptAuthState, @@ -350,7 +350,7 @@ class PromptIconViewModel( authState.isAuthenticated, isAuthenticating, isPendingConfirmation, - showingError + showingError, ) } AuthType.Face -> @@ -370,7 +370,7 @@ class PromptIconViewModel( isAuthenticated: Boolean, isAuthenticating: Boolean, isPendingConfirmation: Boolean, - showingError: Boolean + showingError: Boolean, ): Int = if (isPendingConfirmation) { when (sensorType) { @@ -381,7 +381,7 @@ class PromptIconViewModel( when (sensorType) { FingerprintSensorType.POWER_BUTTON -> R.string.security_settings_sfps_enroll_find_sensor_message - else -> R.string.fingerprint_dialog_touch_sensor + else -> R.string.accessibility_fingerprint_label } } else if (showingError) { R.string.biometric_dialog_try_again @@ -392,7 +392,7 @@ class PromptIconViewModel( private fun getFaceIconContentDescriptionId( authState: PromptAuthState, isAuthenticating: Boolean, - showingError: Boolean + showingError: Boolean, ): Int = if (authState.isAuthenticatedAndExplicitlyConfirmed) { R.string.biometric_dialog_face_icon_description_confirmed @@ -415,7 +415,7 @@ class PromptIconViewModel( promptSelectorInteractor.fingerprintSensorType, promptViewModel.isAuthenticated, promptViewModel.isAuthenticating, - promptViewModel.showingError + promptViewModel.showingError, ) { sensorType: FingerprintSensorType, authState: PromptAuthState, @@ -427,7 +427,7 @@ class PromptIconViewModel( shouldAnimateFingerprintIconView( authState.isAuthenticated, isAuthenticating, - showingError + showingError, ) } } @@ -435,7 +435,7 @@ class PromptIconViewModel( combine( promptViewModel.isAuthenticated, promptViewModel.isAuthenticating, - promptViewModel.showingError + promptViewModel.showingError, ) { authState: PromptAuthState, isAuthenticating: Boolean, showingError: Boolean -> isAuthenticating || @@ -463,7 +463,7 @@ class PromptIconViewModel( authState.isAuthenticated, isAuthenticating, isPendingConfirmation, - showingError + showingError, ) } } @@ -483,14 +483,14 @@ class PromptIconViewModel( private fun shouldAnimateFingerprintIconView( isAuthenticated: Boolean, isAuthenticating: Boolean, - showingError: Boolean + showingError: Boolean, ) = (isAuthenticating && _previousIconWasError.value) || isAuthenticated || showingError private fun shouldAnimateCoexIconView( isAuthenticated: Boolean, isAuthenticating: Boolean, isPendingConfirmation: Boolean, - showingError: Boolean + showingError: Boolean, ) = (isAuthenticating && _previousIconWasError.value) || isPendingConfirmation || @@ -522,7 +522,7 @@ class PromptIconViewModel( listOf( R.raw.biometricprompt_sfps_fingerprint_authenticating, R.raw.biometricprompt_sfps_rear_display_fingerprint_authenticating, - R.raw.biometricprompt_sfps_rear_display_fingerprint_authenticating + R.raw.biometricprompt_sfps_rear_display_fingerprint_authenticating, ) /** Called on configuration changes */ @@ -579,7 +579,7 @@ class PromptIconViewModel( R.raw.fingerprint_dialogue_error_to_success_lottie, R.raw.fingerprint_dialogue_fingerprint_to_success_lottie, R.raw.fingerprint_dialogue_error_to_fingerprint_lottie, - R.raw.fingerprint_dialogue_fingerprint_to_error_lottie + R.raw.fingerprint_dialogue_fingerprint_to_error_lottie, ) } @@ -620,7 +620,7 @@ class PromptIconViewModel( R.raw.fingerprint_dialogue_error_to_fingerprint_lottie, R.raw.fingerprint_dialogue_error_to_success_lottie, R.raw.fingerprint_dialogue_fingerprint_to_error_lottie, - R.raw.fingerprint_dialogue_fingerprint_to_success_lottie + R.raw.fingerprint_dialogue_fingerprint_to_success_lottie, ) } @@ -632,7 +632,7 @@ class PromptIconViewModel( R.raw.face_dialog_dark_to_error, R.raw.face_dialog_error_to_idle, R.raw.face_dialog_idle_static, - R.raw.face_dialog_authenticating + R.raw.face_dialog_authenticating, ) private fun getSfpsAsset_fingerprintAuthenticating(isInRearDisplayMode: Boolean): Int = @@ -644,7 +644,7 @@ class PromptIconViewModel( private fun getSfpsAsset_fingerprintToError( rotation: DisplayRotation, - isInRearDisplayMode: Boolean + isInRearDisplayMode: Boolean, ): Int = if (isInRearDisplayMode) { when (rotation) { @@ -668,7 +668,7 @@ class PromptIconViewModel( private fun getSfpsAsset_errorToFingerprint( rotation: DisplayRotation, - isInRearDisplayMode: Boolean + isInRearDisplayMode: Boolean, ): Int = if (isInRearDisplayMode) { when (rotation) { @@ -692,7 +692,7 @@ class PromptIconViewModel( private fun getSfpsAsset_fingerprintToUnlock( rotation: DisplayRotation, - isInRearDisplayMode: Boolean + isInRearDisplayMode: Boolean, ): Int = if (isInRearDisplayMode) { when (rotation) { @@ -716,7 +716,7 @@ class PromptIconViewModel( private fun getSfpsAsset_fingerprintToSuccess( rotation: DisplayRotation, - isInRearDisplayMode: Boolean + isInRearDisplayMode: Boolean, ): Int = if (isInRearDisplayMode) { when (rotation) { |