From 3fbafb11a03dfea7f56caf89273017f036268344 Mon Sep 17 00:00:00 2001 From: Austin Delgado Date: Wed, 19 Feb 2025 22:59:51 +0000 Subject: Extend timeout for Biometric Prompt messages when talkback enabled When talkback is enabled, use AccessibilityManager.getRecommenededTimeoutMillis to determine length of time message some remain. Fixes: 373771867 Fixes: 373778537 Test: Verified manually Test: atest PromptViewModelTest Flag: EXEMPT bugfix Change-Id: Ie7b12f586c5ee9f4a5328b1da42ee00720fa7d7c --- .../android/systemui/biometrics/AuthContainerViewTest.kt | 3 +++ .../systemui/biometrics/ui/viewmodel/PromptViewModel.kt | 15 +++++++++++++-- .../biometrics/ui/viewmodel/PromptViewModelTest.kt | 4 ++++ .../biometrics/ui/viewmodel/PromptViewModelKosmos.kt | 3 ++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 88c9e74551fd..0cfb36d58f89 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -36,6 +36,7 @@ import android.testing.ViewUtils import android.view.View import android.view.WindowInsets import android.view.WindowManager +import android.view.accessibility.AccessibilityManager import android.widget.ScrollView import androidx.constraintlayout.widget.ConstraintLayout import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -114,6 +115,7 @@ open class AuthContainerViewTest : SysuiTestCase() { @Mock lateinit var selectedUserInteractor: SelectedUserInteractor @Mock private lateinit var packageManager: PackageManager @Mock private lateinit var activityTaskManager: ActivityTaskManager + @Mock private lateinit var accessibilityManager: AccessibilityManager @Mock private lateinit var lazyViewCapture: Lazy private lateinit var displayRepository: FakeDisplayRepository @@ -678,6 +680,7 @@ open class AuthContainerViewTest : SysuiTestCase() { udfpsUtils, iconProvider, activityTaskManager, + accessibilityManager, ), { credentialViewModel }, fakeExecutor, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt index 4dcf26808a9e..0902d19b6787 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt @@ -34,6 +34,7 @@ import android.util.Log import android.util.RotationUtils import android.view.HapticFeedbackConstants import android.view.MotionEvent +import android.view.accessibility.AccessibilityManager import com.android.app.tracing.coroutines.launchTraced as launch import com.android.keyguard.AuthInteractionProperties import com.android.launcher3.icons.IconProvider @@ -85,7 +86,17 @@ constructor( private val udfpsUtils: UdfpsUtils, private val iconProvider: IconProvider, private val activityTaskManager: ActivityTaskManager, + private val accessibilityManager: AccessibilityManager, ) { + // When a11y enabled, increase message delay to ensure messages get read + private val messageDelay = + accessibilityManager + .getRecommendedTimeoutMillis( + BiometricPrompt.HIDE_DIALOG_DELAY, + AccessibilityManager.FLAG_CONTENT_CONTROLS or AccessibilityManager.FLAG_CONTENT_TEXT, + ) + .toLong() + /** The set of modalities available for this prompt */ val modalities: Flow = promptSelectorInteractor.prompt @@ -692,7 +703,7 @@ constructor( messageJob?.cancel() messageJob = launch { - delay(BiometricPrompt.HIDE_DIALOG_DELAY.toLong()) + delay(messageDelay) if (authenticateAfterError) { showAuthenticating(messageAfterError) } else { @@ -754,7 +765,7 @@ constructor( messageJob?.cancel() messageJob = launch { - delay(BiometricPrompt.HIDE_DIALOG_DELAY.toLong()) + delay(messageDelay) showAuthenticating(messageAfterHelp) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt index b6c63479990e..0e68fce679b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt @@ -28,6 +28,7 @@ import android.graphics.Point import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.hardware.biometrics.BiometricFingerprintConstants +import android.hardware.biometrics.BiometricPrompt import android.hardware.biometrics.PromptContentItemBulletedText import android.hardware.biometrics.PromptContentView import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton @@ -42,6 +43,7 @@ import android.platform.test.annotations.EnableFlags import android.view.HapticFeedbackConstants import android.view.MotionEvent import android.view.Surface +import android.view.accessibility.accessibilityManager import androidx.test.filters.SmallTest import com.android.app.activityTaskManager import com.android.keyguard.AuthInteractionProperties @@ -200,6 +202,8 @@ internal class PromptViewModelTest(private val testCase: TestCase) : SysuiTestCa overrideResource(R.dimen.biometric_dialog_face_icon_size, mockFaceIconSize) kosmos.applicationContext = context + whenever(kosmos.accessibilityManager.getRecommendedTimeoutMillis(anyInt(), anyInt())) + .thenReturn(BiometricPrompt.HIDE_DIALOG_DELAY) if (testCase.fingerprint?.isAnyUdfpsType == true) { kosmos.authController = authController diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt index 43b57de3df9f..d6b625b49fb2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt @@ -17,6 +17,7 @@ package com.android.systemui.biometrics.ui.viewmodel import android.content.applicationContext +import android.view.accessibility.accessibilityManager import com.android.app.activityTaskManager import com.android.launcher3.icons.IconProvider import com.android.systemui.biometrics.domain.interactor.biometricStatusInteractor @@ -27,7 +28,6 @@ import com.android.systemui.biometrics.udfpsUtils import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.util.mockito.mock -import org.mockito.Mockito.mock val Kosmos.promptViewModel by Fixture { PromptViewModel( @@ -39,6 +39,7 @@ val Kosmos.promptViewModel by Fixture { udfpsUtils = udfpsUtils, iconProvider = iconProvider, activityTaskManager = activityTaskManager, + accessibilityManager = accessibilityManager, ) } -- cgit v1.2.3-59-g8ed1b