diff options
4 files changed, 44 insertions, 2 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 2d1b8a3ab421..15874c8147cf 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52266,6 +52266,7 @@ package android.view.accessibility { method public boolean isSelected(); method public boolean isShowingHintText(); method public boolean isTextEntryKey(); + method public boolean isTextSelectable(); method public boolean isVisibleToUser(); method @Deprecated public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View); method @Deprecated public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View, int); @@ -52329,6 +52330,7 @@ package android.view.accessibility { method public void setStateDescription(@Nullable CharSequence); method public void setText(CharSequence); method public void setTextEntryKey(boolean); + method public void setTextSelectable(boolean); method public void setTextSelection(int, int); method public void setTooltipText(@Nullable CharSequence); method public void setTouchDelegateInfo(@NonNull android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo); diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 0a33d6cd82ea..a31cacfdfd2b 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -710,6 +710,8 @@ public class AccessibilityNodeInfo implements Parcelable { private static final int BOOLEAN_PROPERTY_IS_TEXT_ENTRY_KEY = 0x0400000; + private static final int BOOLEAN_PROPERTY_IS_TEXT_SELECTABLE = 0x0800000; + /** * Bits that provide the id of a virtual descendant of a view. */ @@ -2276,6 +2278,38 @@ public class AccessibilityNodeInfo implements Parcelable { } /** + * Gets if the node has selectable text. + * + * <p> + * Services should use {@link #ACTION_SET_SELECTION} for selection. Editable text nodes must + * also be selectable. But not all UIs will populate this field, so services should consider + * 'isTextSelectable | isEditable' to ensure they don't miss nodes with selectable text. + * </p> + * + * @see #isEditable + * @return True if the node has selectable text. + */ + public boolean isTextSelectable() { + return getBooleanProperty(BOOLEAN_PROPERTY_IS_TEXT_SELECTABLE); + } + + /** + * Sets if the node has selectable text. + * <p> + * <strong>Note:</strong> Cannot be called from an + * {@link android.accessibilityservice.AccessibilityService}. + * This class is made immutable before being delivered to an AccessibilityService. + * </p> + * + * @param selectableText True if the node has selectable text, false otherwise. + * + * @throws IllegalStateException If called from an AccessibilityService. + */ + public void setTextSelectable(boolean selectableText) { + setBooleanProperty(BOOLEAN_PROPERTY_IS_TEXT_SELECTABLE, selectableText); + } + + /** * Gets if the node is editable. * * @return True if the node is editable, false otherwise. @@ -4327,8 +4361,12 @@ public class AccessibilityNodeInfo implements Parcelable { return "ACTION_CANCEL_DRAG"; case R.id.accessibilityActionDragDrop: return "ACTION_DROP"; - default: + default: { + if (action == R.id.accessibilityActionShowSuggestions) { + return "ACTION_SHOW_SUGGESTIONS"; + } return "ACTION_UNKNOWN"; + } } } @@ -4462,6 +4500,7 @@ public class AccessibilityNodeInfo implements Parcelable { builder.append("; importantForAccessibility: ").append(isImportantForAccessibility()); builder.append("; visible: ").append(isVisibleToUser()); builder.append("; actions: ").append(mActions); + builder.append("; isTextSelectable: ").append(isTextSelectable()); return builder.toString(); } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 0fe06befa789..be51240d2a84 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -12197,6 +12197,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener EXTRA_DATA_RENDERING_INFO_KEY, EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY )); + info.setTextSelectable(isTextSelectable()); } else { info.setAvailableExtraData(Arrays.asList( EXTRA_DATA_RENDERING_INFO_KEY diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java index 201883689546..99670d98bb84 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java @@ -58,7 +58,7 @@ public class AccessibilityNodeInfoTest { // The number of flags held in boolean properties. Their values should also be double-checked // in the methods above. - private static final int NUM_BOOLEAN_PROPERTIES = 23; + private static final int NUM_BOOLEAN_PROPERTIES = 24; @Test public void testStandardActions_serializationFlagIsValid() { |