Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24ed9e30 authored by Austin Delgado's avatar Austin Delgado
Browse files

Fix Biometric Prompt icon acting as button for a11y

Biometric Prompt icon should only act as a button for a11y when coex is
enabled and auth confirmation is needed.

Fixes: 373535676
Fixes: 373791333
Fixes: 374003773
Flag: EXEMPT bugfix
Test: atest SystemUITests:com.android.systemui.biometrics
Change-Id: I25290c0239ca97354d5f91e084ed78c091d0ae1e
parent 11f37474
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -3,16 +3,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"
+22 −34
Original line number Diff line number Diff line
@@ -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,30 +326,29 @@ object BiometricViewBinder {

                // reuse the icon as a confirm button
                launch {
                    if (bpIconA11y()) {
                    viewModel.isIconConfirmButton.collect { isButton ->
                            if (isButton) {
                        if (isButton && !accessibilityManager.isEnabled) {
                            iconView.onTouchListener { _: View, event: MotionEvent ->
                                viewModel.onOverlayTouch(event)
                            }
                                iconView.setOnClickListener { viewModel.confirmAuthenticated() }
                        } else {
                            iconView.setOnTouchListener(null)
                                iconView.setOnClickListener(null)
                        }
                    }
                    } else {
                        viewModel.isIconConfirmButton
                            .map { isPending ->
                                when {
                                    isPending && modalities.hasFaceAndFingerprint ->
                                        View.OnTouchListener { _: View, event: MotionEvent ->
                                            viewModel.onOverlayTouch(event)
                                        }
                                    else -> null
                }

                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() }
                            }
                            .collect { onTouch -> iconView.setOnTouchListener(onTouch) }
                        }
                }

@@ -365,16 +363,6 @@ 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(