From a8e74160decff1d1a45e7c6dc6689102c2cd4aa6 Mon Sep 17 00:00:00 2001 From: sallyyuen Date: Mon, 16 Aug 2021 12:38:45 -0700 Subject: Add AccessibilityAction and AccessibilityEvent API for drag & drop go/a11yDragAndDrop Drag & drop in the system has zero accessibility support. Add actions to dragging, cancelingl, and dropingp Add WINDOW_CONTENT_CHANGED subtype events for the start of a drag, the cancellation of a drag, and a drop. Other changes, like when a11y actions change, will be denoted by CONTENT_CHANGE_TYPE_UNDEFINED Test: builds Bug: 26871588 Change-Id: Ie4eeb54dd612fd92c107a267e884498656c1fac8 --- core/api/current.txt | 9 ++++ .../view/accessibility/AccessibilityEvent.java | 30 +++++++++++++ .../view/accessibility/AccessibilityNodeInfo.java | 49 ++++++++++++++++++++++ core/res/res/values/ids.xml | 9 ++++ core/res/res/values/public.xml | 3 ++ 5 files changed, 100 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 03d58350d498..3ddb374c8a05 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -2012,6 +2012,9 @@ package android { public static final class R.id { ctor public R.id(); field public static final int accessibilityActionContextClick = 16908348; // 0x102003c + field public static final int accessibilityActionDragCancel; + field public static final int accessibilityActionDragDrop; + field public static final int accessibilityActionDragStart; field public static final int accessibilityActionHideTooltip = 16908357; // 0x1020045 field public static final int accessibilityActionImeEnter = 16908372; // 0x1020054 field public static final int accessibilityActionMoveWindow = 16908354; // 0x1020042 @@ -50637,6 +50640,9 @@ package android.view.accessibility { method public void setPackageName(CharSequence); method public void writeToParcel(android.os.Parcel, int); field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4 + field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200 + field public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 256; // 0x100 + field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80 field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10 field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20 field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8 @@ -50935,6 +50941,9 @@ package android.view.accessibility { field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_COPY; field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_CUT; field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_DISMISS; + field @NonNull public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_DRAG_CANCEL; + field @NonNull public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_DRAG_DROP; + field @NonNull public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_DRAG_START; field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_EXPAND; field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_FOCUS; field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_HIDE_TOOLTIP; diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java index f6d6fde6435f..52d3612b6f77 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -612,6 +612,36 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par */ public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 0x00000040; + /** + * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: + * A drag has started while accessibility is enabled. This is either via an + * AccessibilityAction, or via touch events. This is sent from the source that initiated the + * drag. + * + * @see AccessibilityNodeInfo.AccessibilityAction#ACTION_DRAG_START + */ + public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 0x00000080; + + /** + * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: + * A drag in with accessibility enabled has ended. This means the content has been + * successfully dropped. This is sent from the target that accepted the dragged content. + * + * @see AccessibilityNodeInfo.AccessibilityAction#ACTION_DRAG_DROP + */ + public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 0x00000100; + + /** + * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: + * A drag in with accessibility enabled has ended. This means the content has been + * unsuccessfully dropped, the user has canceled the action via an AccessibilityAction, or + * no drop has been detected within a timeout and the drag was automatically cancelled. This is + * sent from the source that initiated the drag. + * + * @see AccessibilityNodeInfo.AccessibilityAction#ACTION_DRAG_CANCEL + */ + public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 0x0000200; + /** * Change type for {@link #TYPE_WINDOWS_CHANGED} event: * The window was added. diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 085eb81182f1..587a27074544 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -27,6 +27,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; +import android.content.ClipData; import android.graphics.Rect; import android.graphics.Region; import android.os.Build; @@ -4353,6 +4354,14 @@ public class AccessibilityNodeInfo implements Parcelable { case R.id.accessibilityActionImeEnter: return "ACTION_IME_ENTER"; default: + // TODO(197520937): Use finalized constants in switch + if (action == R.id.accessibilityActionDragStart) { + return "ACTION_DRAG"; + } else if (action == R.id.accessibilityActionDragCancel) { + return "ACTION_CANCEL_DRAG"; + } else if (action == R.id.accessibilityActionDragDrop) { + return "ACTION_DROP"; + } return "ACTION_UNKNOWN"; } } @@ -4995,6 +5004,46 @@ public class AccessibilityNodeInfo implements Parcelable { @NonNull public static final AccessibilityAction ACTION_IME_ENTER = new AccessibilityAction(R.id.accessibilityActionImeEnter); + /** + * Action to start a drag. + *

+ * This action initiates a drag & drop within the system. The source's dragged content is + * prepared before the drag begins. In View, this action should prepare the arguments to + * {@link View#startDragAndDrop(ClipData, View.DragShadowBuilder, Object, int)} and then + * call {@link View#startDragAndDrop(ClipData, View.DragShadowBuilder, Object, int)}. The + * equivalent should be performed for other UI toolkits. + *

+ * + * @see AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_STARTED + */ + @NonNull public static final AccessibilityAction ACTION_DRAG_START = + new AccessibilityAction(R.id.accessibilityActionDragStart); + + /** + * Action to trigger a drop of the content being dragged. + *

+ * This action is added to potential drop targets if the source started a drag with + * {@link #ACTION_DRAG_START}. In View, these targets are Views that accepted + * {@link android.view.DragEvent#ACTION_DRAG_STARTED} and have an + * {@link View.OnDragListener}. + *

+ * + * @see AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_DROPPED + */ + @NonNull public static final AccessibilityAction ACTION_DRAG_DROP = + new AccessibilityAction(R.id.accessibilityActionDragDrop); + + /** + * Action to cancel a drag. + *

+ * This action is added to the source that started a drag with {@link #ACTION_DRAG_START}. + *

+ * + * @see AccessibilityEvent#CONTENT_CHANGE_TYPE_DRAG_CANCELLED + */ + @NonNull public static final AccessibilityAction ACTION_DRAG_CANCEL = + new AccessibilityAction(R.id.accessibilityActionDragCancel); + private final int mActionId; private final CharSequence mLabel; diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml index c4838b83347c..84f82fd5d99d 100644 --- a/core/res/res/values/ids.xml +++ b/core/res/res/values/ids.xml @@ -254,6 +254,15 @@ + + + + + + + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index eb4919b61dc2..b57055ca4338 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3224,6 +3224,9 @@ + + + -- cgit v1.2.3-59-g8ed1b