From 3311d9c227392f5c3de6f7aa655c3d0981796d34 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Tue, 6 Apr 2021 14:54:48 +0800 Subject: [PATCH] Fix the GAR issue of Switch Access user can not move the FAB to the edge to hide it in half. Root cause: Not set and export the corresponding Accessibility actions. Solution: Add two Accessibility actions related to move to the edge to hide and move out the edge to show. Bug: 184597649 Test: atest AccessibilityFloatingMenuViewTest Change-Id: Icd98087d6c43f07ba2b8ec7050386a0573938dd9 --- packages/SystemUI/res/values/ids.xml | 2 + packages/SystemUI/res/values/strings.xml | 4 ++ .../AccessibilityFloatingMenuView.java | 24 ++++++++++ .../AccessibilityFloatingMenuViewTest.java | 44 ++++++++++++++++--- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 9665c89cffba4..bb9d331520438 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -173,5 +173,7 @@ + + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f5357d7a2ec96..9d8fb89c9e874 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2689,6 +2689,10 @@ Move bottom left Move bottom right + + Move to edge and hide + + Move out edge and show diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java index 57be4e8477b27..d89dff5027a72 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java @@ -303,25 +303,39 @@ public class AccessibilityFloatingMenuView extends FrameLayout final Rect bounds = getAvailableBounds(); if (action == R.id.action_move_top_left) { + setShapeType(ShapeType.OVAL); snapToLocation(bounds.left, bounds.top); return true; } if (action == R.id.action_move_top_right) { + setShapeType(ShapeType.OVAL); snapToLocation(bounds.right, bounds.top); return true; } if (action == R.id.action_move_bottom_left) { + setShapeType(ShapeType.OVAL); snapToLocation(bounds.left, bounds.bottom); return true; } if (action == R.id.action_move_bottom_right) { + setShapeType(ShapeType.OVAL); snapToLocation(bounds.right, bounds.bottom); return true; } + if (action == R.id.action_move_to_edge_and_hide) { + setShapeType(ShapeType.HALF_OVAL); + return true; + } + + if (action == R.id.action_move_out_edge_and_show) { + setShapeType(ShapeType.OVAL); + return true; + } + return false; } @@ -446,6 +460,16 @@ public class AccessibilityFloatingMenuView extends FrameLayout res.getString( R.string.accessibility_floating_button_action_move_bottom_right)); info.addAction(moveBottomRight); + + final int moveEdgeId = mShapeType == ShapeType.OVAL + ? R.id.action_move_to_edge_and_hide + : R.id.action_move_out_edge_and_show; + final int moveEdgeTextResId = mShapeType == ShapeType.OVAL + ? R.string.accessibility_floating_button_action_move_to_edge_and_hide_to_half + : R.string.accessibility_floating_button_action_move_out_edge_and_show; + final AccessibilityAction moveToOrOutEdge = + new AccessibilityAction(moveEdgeId, res.getString(moveEdgeTextResId)); + info.addAction(moveToOrOutEdge); } private boolean onTouched(MotionEvent event) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java index 814f073edbb05..28cc580546bea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java @@ -348,61 +348,95 @@ public class AccessibilityFloatingMenuViewTest extends SysuiTestCase { final AccessibilityNodeInfo infos = new AccessibilityNodeInfo(); mMenuView.onInitializeAccessibilityNodeInfo(infos); - assertThat(infos.getActionList().size()).isEqualTo(4); + assertThat(infos.getActionList().size()).isEqualTo(5); } @Test - public void accessibilityActionMove_moveTopLeft_success() { + public void accessibilityActionMove_halfOval_moveTopLeft_success() { final AccessibilityFloatingMenuView menuView = spy(new AccessibilityFloatingMenuView(mContext)); doReturn(mAvailableBounds).when(menuView).getAvailableBounds(); + menuView.setShapeType(/* halfOvalShape */ 1); final boolean isActionPerformed = menuView.performAccessibilityAction(R.id.action_move_top_left, null); assertThat(isActionPerformed).isTrue(); + assertThat(menuView.mShapeType).isEqualTo(/* ovalShape */ 0); verify(menuView).snapToLocation(mAvailableBounds.left, mAvailableBounds.top); } @Test - public void accessibilityActionMove_moveTopRight_success() { + public void accessibilityActionMove_halfOval_moveTopRight_success() { final AccessibilityFloatingMenuView menuView = spy(new AccessibilityFloatingMenuView(mContext)); doReturn(mAvailableBounds).when(menuView).getAvailableBounds(); + menuView.setShapeType(/* halfOvalShape */ 1); final boolean isActionPerformed = menuView.performAccessibilityAction(R.id.action_move_top_right, null); assertThat(isActionPerformed).isTrue(); + assertThat(menuView.mShapeType).isEqualTo(/* ovalShape */ 0); verify(menuView).snapToLocation(mAvailableBounds.right, mAvailableBounds.top); } @Test - public void accessibilityActionMove_moveBottomLeft_success() { + public void accessibilityActionMove_halfOval_moveBottomLeft_success() { final AccessibilityFloatingMenuView menuView = spy(new AccessibilityFloatingMenuView(mContext)); doReturn(mAvailableBounds).when(menuView).getAvailableBounds(); + menuView.setShapeType(/* halfOvalShape */ 1); final boolean isActionPerformed = menuView.performAccessibilityAction(R.id.action_move_bottom_left, null); assertThat(isActionPerformed).isTrue(); + assertThat(menuView.mShapeType).isEqualTo(/* ovalShape */ 0); verify(menuView).snapToLocation(mAvailableBounds.left, mAvailableBounds.bottom); } @Test - public void accessibilityActionMove_moveBottomRight_success() { + public void accessibilityActionMove_halfOval_moveBottomRight_success() { final AccessibilityFloatingMenuView menuView = spy(new AccessibilityFloatingMenuView(mContext)); doReturn(mAvailableBounds).when(menuView).getAvailableBounds(); + menuView.setShapeType(/* halfOvalShape */ 1); final boolean isActionPerformed = menuView.performAccessibilityAction(R.id.action_move_bottom_right, null); assertThat(isActionPerformed).isTrue(); + assertThat(menuView.mShapeType).isEqualTo(/* ovalShape */ 0); verify(menuView).snapToLocation(mAvailableBounds.right, mAvailableBounds.bottom); } + @Test + public void accessibilityActionMove_halfOval_moveOutEdgeAndShow_success() { + final AccessibilityFloatingMenuView menuView = + spy(new AccessibilityFloatingMenuView(mContext)); + doReturn(mAvailableBounds).when(menuView).getAvailableBounds(); + menuView.setShapeType(/* halfOvalShape */ 1); + + final boolean isActionPerformed = + menuView.performAccessibilityAction(R.id.action_move_out_edge_and_show, null); + + assertThat(isActionPerformed).isTrue(); + assertThat(menuView.mShapeType).isEqualTo(/* ovalShape */ 0); + } + + @Test + public void setupAccessibilityActions_oval_hasActionMoveToEdgeAndHide() { + final AccessibilityFloatingMenuView menuView = new AccessibilityFloatingMenuView(mContext); + menuView.setShapeType(/* ovalShape */ 0); + + final AccessibilityNodeInfo infos = new AccessibilityNodeInfo(); + menuView.onInitializeAccessibilityNodeInfo(infos); + + assertThat(infos.getActionList().stream().anyMatch( + action -> action.getId() == R.id.action_move_to_edge_and_hide)).isTrue(); + } + @After public void tearDown() { mInterceptMotionEvent = null;