From 4d1ab3a784e463ee10de292922d2a2a343b2877a Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Wed, 19 Mar 2025 15:45:52 +0100 Subject: [PATCH] Fix back button not reacting to accessibility actions Bug: 403184586 Test: Manual, i.e. verified that back button is clickable with TalkBack enabled. Also verified no regressions in kids themed taskbar. Flag: com.android.window.flags.predictive_back_three_button_nav Change-Id: Ie6fd6b7d8a76cdac0389c4dd33f8cb62f689ba61 --- .../taskbar/NavbarButtonsViewController.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 7d2dc71961..f03b7d147b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -72,6 +72,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; import android.graphics.drawable.RotateDrawable; import android.inputmethodservice.InputMethodService; +import android.os.Bundle; import android.os.Handler; import android.os.SystemProperties; import android.util.Property; @@ -84,6 +85,7 @@ import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.accessibility.AccessibilityNodeInfo; import android.view.inputmethod.Flags; import android.widget.FrameLayout; import android.widget.ImageView; @@ -682,12 +684,16 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT /** * Sets the AccessibilityDelegate for the back button. + * + * When setting a back button accessibility delegate, make sure to not dispatch any duplicate + * click events. Click events get injected in the internal accessibility delegate in + * {@link #setupBackButtonAccessibility(View, AccessibilityDelegate)}. */ public void setBackButtonAccessibilityDelegate(AccessibilityDelegate accessibilityDelegate) { if (mBackButton == null) { return; } - mBackButton.setAccessibilityDelegate(accessibilityDelegate); + setupBackButtonAccessibility(mBackButton, accessibilityDelegate); } public void setWallpaperVisible(boolean isVisible) { @@ -879,6 +885,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT navButtonController.getButtonContentDescription(buttonType))); if (predictiveBackThreeButtonNav() && buttonType == BUTTON_BACK) { // set up special touch listener for back button to support predictive back + setupBackButtonAccessibility(buttonView, null); setBackButtonTouchListener(buttonView, navButtonController); // Set this View clickable, so that NearestTouchFrame.java forwards closeby touches to // this View @@ -892,6 +899,28 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT return buttonView; } + private void setupBackButtonAccessibility(View backButton, + AccessibilityDelegate accessibilityDelegate) { + View.AccessibilityDelegate backButtonAccessibilityDelegate = + new View.AccessibilityDelegate() { + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (accessibilityDelegate != null) { + accessibilityDelegate.performAccessibilityAction(host, action, args); + } + if (action == AccessibilityNodeInfo.ACTION_CLICK) { + mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, + /*cancelled*/ false); + mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, + /*cancelled*/ false); + return true; + } + return super.performAccessibilityAction(host, action, args); + } + }; + backButton.setAccessibilityDelegate(backButtonAccessibilityDelegate); + } + private void setBackButtonTouchListener(View buttonView, TaskbarNavButtonController navButtonController) { final RectF rect = new RectF();