From 6590572d4f11e2aaabaa7f237ae606e2f4c8df88 Mon Sep 17 00:00:00 2001 From: Riley Jones Date: Fri, 6 Jan 2023 02:51:56 +0000 Subject: [PATCH] Button functionality to properly open & close the A11yMenu Bug: 261252772 Test: adb install the APK, then enable the menu from the Settings Accessibility page Change-Id: Ifeca738268eeff2051bce5bb72ee67caaad86bdd --- .../AccessibilityMenuService.java | 62 ++++++++++++++++++- .../view/A11yMenuAdapter.java | 2 +- .../view/A11yMenuViewPager.java | 2 +- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java index ed54f08b2b3d4..9016db7926bc5 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java +++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java @@ -16,10 +16,12 @@ package com.android.systemui.accessibility.accessibilitymenu; +import android.accessibilityservice.AccessibilityButtonController; import android.accessibilityservice.AccessibilityService; import android.content.res.Configuration; import android.hardware.display.DisplayManager; import android.os.Handler; +import android.os.SystemClock; import android.view.Display; import android.view.MotionEvent; import android.view.View; @@ -28,11 +30,17 @@ import android.view.accessibility.AccessibilityEvent; import com.android.systemui.accessibility.accessibilitymenu.view.A11yMenuOverlayLayout; /** @hide */ -public class AccessibilityMenuService extends AccessibilityService implements View.OnTouchListener { +public class AccessibilityMenuService extends AccessibilityService + implements View.OnTouchListener { private static final String TAG = "A11yMenuService"; private static final long BUFFER_MILLISECONDS_TO_PREVENT_UPDATE_FAILURE = 100L; + private long mLastTimeTouchedOutside = 0L; + // Timeout used to ignore the A11y button onClick() when ACTION_OUTSIDE is also received on + // clicking on the A11y button. + public static final long BUTTON_CLICK_TIMEOUT = 200; + private A11yMenuOverlayLayout mA11yMenuLayout; private static boolean sInitialized = false; @@ -80,6 +88,44 @@ public class AccessibilityMenuService extends AccessibilityService implements Vi @Override public void onCreate() { super.onCreate(); + + getAccessibilityButtonController().registerAccessibilityButtonCallback( + new AccessibilityButtonController.AccessibilityButtonCallback() { + /** + * Called when the accessibility button in the system's navigation + * area is clicked. + * + * @param controller the controller used to register for this + * callback + */ + @Override + public void onClicked(AccessibilityButtonController controller) { + if (SystemClock.uptimeMillis() - mLastTimeTouchedOutside + > BUTTON_CLICK_TIMEOUT) { + mA11yMenuLayout.toggleVisibility(); + } + } + + /** + * Called when the availability of the accessibility button in the + * system's + * navigation area has changed. The accessibility button may become + * unavailable + * because the device shopped showing the button, the button was + * assigned to another + * service, or for other reasons. + * + * @param controller the controller used to register for this + * callback + * @param available {@code true} if the accessibility button is + * available to this + * service, {@code false} otherwise + */ + @Override + public void onAvailabilityChanged(AccessibilityButtonController controller, + boolean available) {} + } + ); } @Override @@ -124,12 +170,26 @@ public class AccessibilityMenuService extends AccessibilityService implements Vi mOnConfigChangedRunnable, BUFFER_MILLISECONDS_TO_PREVENT_UPDATE_FAILURE); } + /** + * Handles click events of shortcuts. + * + * @param view the shortcut button being clicked. + */ + public void handleClick(View view) { + mA11yMenuLayout.hideMenu(); + } + @Override public void onInterrupt() { } @Override public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { + if (mA11yMenuLayout.hideMenu()) { + mLastTimeTouchedOutside = SystemClock.uptimeMillis(); + } + } return false; } } diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java index e3401a9a79151..337814e84368f 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java +++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java @@ -116,7 +116,7 @@ public class A11yMenuAdapter extends BaseAdapter { shortcutIconButton.setOnClickListener( (View v) -> { // Handles shortcut click event by AccessibilityMenuService. - // service.handleClick(v); + mService.handleClick(v); }); } diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java index c510b876e8470..cec503c39cbaa 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java +++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java @@ -66,7 +66,7 @@ public class A11yMenuViewPager { public static final int LARGE_GRID_COLUMN_COUNT = 2; /** Temporary measure to test both item types. */ - private static final boolean USE_LARGE_ITEMS = true; + private static final boolean USE_LARGE_ITEMS = false; /** * Returns the number of items in the grid view.