Accessibility options for a task

The list is:
Close [task]
<items from the task’s popup menu>

Also making a current task in carousel get accessibility focus. This
prevents losing focus after closing a task, and makes sense generally.

Bug: 72409756
Test: Manual
Change-Id: I2cfdfd4693a255f63417d922cb6aa4841db1d3c3
diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml
index 0ac2b11..b8b360a 100644
--- a/quickstep/res/layout/task.xml
+++ b/quickstep/res/layout/task.xml
@@ -28,5 +28,6 @@
         android:id="@+id/icon"
         android:layout_width="@dimen/task_thumbnail_icon_size"
         android:layout_height="@dimen/task_thumbnail_icon_size"
+        android:importantForAccessibility="no"
         android:layout_gravity="top|center_horizontal" />
 </com.android.quickstep.views.TaskView>
\ No newline at end of file
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index bd37a06..7ba91b3 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -35,4 +35,7 @@
 
     <!-- Recents: The empty recents string. [CHAR LIMIT=NONE] -->
     <string name="recents_empty_message">No recent items</string>
+
+    <!-- Content description for the recent apps's accessibility option that closes it. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_close_task">Close</string>
 </resources>
\ No newline at end of file
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 7615e9c..50a32e6 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -49,6 +49,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewDebug;
+import android.view.accessibility.AccessibilityEvent;
 
 import com.android.launcher3.BaseActivity;
 import com.android.launcher3.DeviceProfile;
@@ -943,4 +944,10 @@
         });
         return mPendingAnimation;
     }
+
+    @Override
+    protected void notifyPageSwitchListener(int prevPage) {
+        super.notifyPageSwitchListener(prevPage);
+        getChildAt(mCurrentPage).sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
+    }
 }
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index 30cbcdf..dd90c88 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -51,7 +51,7 @@
     private static final Rect sTempRect = new Rect();
 
     /** Note that these will be shown in order from top to bottom, if available for the task. */
-    private static final TaskSystemShortcut[] MENU_OPTIONS = new TaskSystemShortcut[] {
+    public static final TaskSystemShortcut[] MENU_OPTIONS = new TaskSystemShortcut[] {
             new TaskSystemShortcut.AppInfo(),
             new TaskSystemShortcut.SplitScreen(),
             new TaskSystemShortcut.Pin(),
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index a701862..57516b0 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -22,10 +22,12 @@
 import android.content.res.Resources;
 import android.graphics.Outline;
 import android.graphics.Rect;
+import android.os.Bundle;
 import android.os.Handler;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewOutlineProvider;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
@@ -33,6 +35,7 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.R;
 import com.android.quickstep.RecentsAnimationInterpolator;
+import com.android.quickstep.TaskSystemShortcut;
 import com.android.quickstep.views.RecentsView.PageCallbacks;
 import com.android.quickstep.views.RecentsView.ScrollState;
 import com.android.systemui.shared.recents.model.Task;
@@ -219,4 +222,45 @@
                     view.getHeight(), mRadius);
         }
     }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfo(info);
+
+        info.addAction(
+                new AccessibilityNodeInfo.AccessibilityAction(R.string.accessibility_close_task,
+                        getContext().getText(R.string.accessibility_close_task)));
+
+        final Context context = getContext();
+        final BaseDraggingActivity activity = BaseDraggingActivity.fromContext(context);
+        for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) {
+            OnClickListener onClickListener = menuOption.getOnClickListener(activity, this);
+            if (onClickListener != null) {
+                info.addAction(new AccessibilityNodeInfo.AccessibilityAction(menuOption.labelResId,
+                        context.getText(menuOption.labelResId)));
+            }
+        }
+    }
+
+    @Override
+    public boolean performAccessibilityAction(int action, Bundle arguments) {
+        if (action == R.string.accessibility_close_task) {
+            ((RecentsView) getParent()).dismissTask(this, true /*animateTaskView*/,
+                    true /*removeTask*/);
+            return true;
+        }
+
+        for (TaskSystemShortcut menuOption : TaskMenuView.MENU_OPTIONS) {
+            if (action == menuOption.labelResId) {
+                OnClickListener onClickListener = menuOption.getOnClickListener(
+                        BaseDraggingActivity.fromContext(getContext()), this);
+                if (onClickListener != null) {
+                    onClickListener.onClick(this);
+                }
+                return true;
+            }
+        }
+
+        return super.performAccessibilityAction(action, arguments);
+    }
 }