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;