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
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 9665c89..bb9d331 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -173,5 +173,7 @@
<item type="id" name="action_move_top_right"/>
<item type="id" name="action_move_bottom_left"/>
<item type="id" name="action_move_bottom_right"/>
+ <item type="id" name="action_move_to_edge_and_hide"/>
+ <item type="id" name="action_move_out_edge_and_show"/>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index f5357d7..9d8fb89 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2689,6 +2689,10 @@
<string name="accessibility_floating_button_action_move_bottom_left">Move bottom left</string>
<!-- Action in accessibility menu to move the accessibility floating button to the bottom right of the screen. [CHAR LIMIT=30]-->
<string name="accessibility_floating_button_action_move_bottom_right">Move bottom right</string>
+ <!-- Action in accessibility menu to move the accessibility floating button to the edge and hide it to half. [CHAR LIMIT=30]-->
+ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half">Move to edge and hide</string>
+ <!-- Action in accessibility menu to move the accessibility floating button out the edge and show. [CHAR LIMIT=30]-->
+ <string name="accessibility_floating_button_action_move_out_edge_and_show">Move out edge and show</string>
<!-- Device Controls strings -->
<!-- Device Controls empty state, title [CHAR LIMIT=30] -->
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 57be4e8..d89dff5 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 @@
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 @@
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 814f073..28cc580 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 @@
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;