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);
+ }
}