From f142b5a368edaf8393d093393708b62fa4d87f94 Mon Sep 17 00:00:00 2001 From: mincheli Date: Tue, 1 Jun 2021 11:54:28 +0800 Subject: [PATCH] Adds accessibility actions for magnification switch button to move layout position To fulfill the need of GAR, switch access users may need the support of accessibility actions to move the switch button position. Bug: 189096761 Test: atest MagnificationModeSwitchTest Change-Id: Ia2b63c439f1b0e18cddcd0444dc3fa5971795d8c --- .../MagnificationModeSwitch.java | 29 +++++++++++++++++-- .../MagnificationModeSwitchTest.java | 28 +++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index 99cf095ef61d8..2e6c9e48d61a5 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -108,16 +108,41 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL R.string.magnification_mode_switch_click_label)); info.addAction(clickAction); info.setClickable(true); + info.addAction(new AccessibilityAction(R.id.accessibility_action_move_up, + mContext.getString(R.string.accessibility_control_move_up))); + info.addAction(new AccessibilityAction(R.id.accessibility_action_move_down, + mContext.getString(R.string.accessibility_control_move_down))); + info.addAction(new AccessibilityAction(R.id.accessibility_action_move_left, + mContext.getString(R.string.accessibility_control_move_left))); + info.addAction(new AccessibilityAction(R.id.accessibility_action_move_right, + mContext.getString(R.string.accessibility_control_move_right))); } @Override public boolean performAccessibilityAction(View host, int action, Bundle args) { - if (action == AccessibilityAction.ACTION_CLICK.getId()) { - handleSingleTap(); + if (performA11yAction(action)) { return true; } return super.performAccessibilityAction(host, action, args); } + + private boolean performA11yAction(int action) { + final Rect windowBounds = mWindowManager.getCurrentWindowMetrics().getBounds(); + if (action == AccessibilityAction.ACTION_CLICK.getId()) { + handleSingleTap(); + } else if (action == R.id.accessibility_action_move_up) { + moveButton(0, -windowBounds.height()); + } else if (action == R.id.accessibility_action_move_down) { + moveButton(0, windowBounds.height()); + } else if (action == R.id.accessibility_action_move_left) { + moveButton(-windowBounds.width(), 0); + } else if (action == R.id.accessibility_action_move_right) { + moveButton(windowBounds.width(), 0); + } else { + return false; + } + return true; + } }); mWindowInsetChangeRunnable = this::onWindowInsetChanged; mImageView.setOnApplyWindowInsetsListener((v, insets) -> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index ab5bdf4835da8..49604ff498383 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -394,10 +394,26 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { hasItems(new AccessibilityNodeInfo.AccessibilityAction( ACTION_CLICK.getId(), mContext.getResources().getString( R.string.magnification_mode_switch_click_label)))); + assertThat(nodeInfo.getActionList(), + hasItems(new AccessibilityNodeInfo.AccessibilityAction( + R.id.accessibility_action_move_up, mContext.getResources().getString( + R.string.accessibility_control_move_up)))); + assertThat(nodeInfo.getActionList(), + hasItems(new AccessibilityNodeInfo.AccessibilityAction( + R.id.accessibility_action_move_down, mContext.getResources().getString( + R.string.accessibility_control_move_down)))); + assertThat(nodeInfo.getActionList(), + hasItems(new AccessibilityNodeInfo.AccessibilityAction( + R.id.accessibility_action_move_left, mContext.getResources().getString( + R.string.accessibility_control_move_left)))); + assertThat(nodeInfo.getActionList(), + hasItems(new AccessibilityNodeInfo.AccessibilityAction( + R.id.accessibility_action_move_right, mContext.getResources().getString( + R.string.accessibility_control_move_right)))); } @Test - public void performA11yActions_showWindowModeButton_verifyTapAction() { + public void performClickA11yActions_showWindowModeButton_verifyTapAction() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); resetAndStubMockImageViewAndAnimator(); @@ -407,6 +423,16 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { verifyTapAction(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); } + @Test + public void performMoveLeftA11yAction_showButtonAtRightEdge_moveToLeftEdge() { + mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + + mSpyImageView.performAccessibilityAction( + R.id.accessibility_action_move_left, null); + + assertLayoutPosition(/* toLeftScreenEdge= */true); + } + @Test public void showButton_showFadeOutAnimation_fadeOutAnimationCanceled() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);