diff options
| author | Phil Weaver <pweaver@google.com> | 2018-01-11 21:36:44 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-01-11 21:36:44 +0000 |
| commit | ce35097eb68fd9f3bb2d75507756dc63cfb85521 (patch) | |
| tree | d08dfd1a26ca93c553362bf98307c24c16daa545 /core/java/android | |
| parent | 52c2b9a090c14a8ad083fdf634f9c078e52c33ac (diff) | |
| parent | 9f26b3de4cb4af7106791374ecab48812239bf70 (diff) | |
Merge "A11y support for titles of "panes""
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/View.java | 45 | ||||
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityEvent.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/accessibility/AccessibilityNodeInfo.java | 35 |
3 files changed, 87 insertions, 2 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f62189e4b4a1..71ee7efd71d3 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4045,6 +4045,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private CharSequence mContentDescription; /** + * If this view represents a distinct part of the window, it can have a title that labels the + * area. + */ + private CharSequence mAccessibilityPaneTitle; + + /** * Specifies the id of a view for which this view serves as a label for * accessibility purposes. */ @@ -5409,6 +5415,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, setScreenReaderFocusable(a.getBoolean(attr, false)); } break; + case R.styleable.View_accessibilityPaneTitle: + if (a.peekValue(attr) != null) { + setAccessibilityPaneTitle(a.getString(attr)); + } + break; } } @@ -7218,6 +7229,35 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * If this view is a visually distinct portion of a window, for example the content view of + * a fragment that is replaced, it is considered a pane for accessibility purposes. In order + * for accessibility services to understand the views role, and to announce its title as + * appropriate, such views should have pane titles. + * + * @param accessibilityPaneTitle The pane's title. + * + * {@see AccessibilityNodeInfo#setPaneTitle(CharSequence)} + */ + public void setAccessibilityPaneTitle(CharSequence accessibilityPaneTitle) { + if (!TextUtils.equals(accessibilityPaneTitle, mAccessibilityPaneTitle)) { + mAccessibilityPaneTitle = accessibilityPaneTitle; + notifyViewAccessibilityStateChangedIfNeeded( + AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE); + } + } + + /** + * Get the title of the pane for purposes of accessibility. + * + * @return The current pane title. + * + * {@see #setAccessibilityPaneTitle}. + */ + public CharSequence getAccessibilityPaneTitle() { + return mAccessibilityPaneTitle; + } + + /** * Sends an accessibility event of the given type. If accessibility is * not enabled this method has no effect. The default implementation calls * {@link #onInitializeAccessibilityEvent(AccessibilityEvent)} first @@ -8514,6 +8554,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.addAction(AccessibilityAction.ACTION_SHOW_ON_SCREEN); populateAccessibilityNodeInfoDrawingOrderInParent(info); + info.setPaneTitle(mAccessibilityPaneTitle); } /** @@ -11405,6 +11446,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@link #getAccessibilityLiveRegion()} is not * {@link #ACCESSIBILITY_LIVE_REGION_NONE}. * </ul> + * <li>Has an accessibility pane title, see {@link #setAccessibilityPaneTitle}</li> * </ol> * * @return Whether the view is exposed for accessibility. @@ -11431,7 +11473,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return mode == IMPORTANT_FOR_ACCESSIBILITY_YES || isActionableForAccessibility() || hasListenersForAccessibility() || getAccessibilityNodeProvider() != null - || getAccessibilityLiveRegion() != ACCESSIBILITY_LIVE_REGION_NONE; + || getAccessibilityLiveRegion() != ACCESSIBILITY_LIVE_REGION_NONE + || (mAccessibilityPaneTitle != null); } /** diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java index 56efcdf862c2..aa61926dcedc 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -565,6 +565,12 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 0x00000004; /** + * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: + * The node's pane title changed. + */ + public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 0x00000008; + + /** * Change type for {@link #TYPE_WINDOWS_CHANGED} event: * The window was added. */ @@ -654,7 +660,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par CONTENT_CHANGE_TYPE_UNDEFINED, CONTENT_CHANGE_TYPE_SUBTREE, CONTENT_CHANGE_TYPE_TEXT, - CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION + CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, + CONTENT_CHANGE_TYPE_PANE_TITLE }) public @interface ContentChangeTypes {} diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 28ef6978ac93..311dd4b8b294 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -723,6 +723,7 @@ public class AccessibilityNodeInfo implements Parcelable { private CharSequence mText; private CharSequence mHintText; private CharSequence mError; + private CharSequence mPaneTitle; private CharSequence mContentDescription; private String mViewIdResourceName; private ArrayList<String> mExtraDataKeys; @@ -2033,6 +2034,33 @@ public class AccessibilityNodeInfo implements Parcelable { } /** + * If this node represents a visually distinct region of the screen that may update separately + * from the rest of the window, it is considered a pane. Set the pane title to indicate that + * the node is a pane, and to provide a title for it. + * <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 paneTitle The title of the pane represented by this node. + */ + public void setPaneTitle(@Nullable CharSequence paneTitle) { + enforceNotSealed(); + mPaneTitle = (paneTitle == null) + ? null : paneTitle.subSequence(0, paneTitle.length()); + } + + /** + * Get the title of the pane represented by this node. + * + * @return The title of the pane represented by this node, or {@code null} if this node does + * not represent a pane. + */ + public @Nullable CharSequence getPaneTitle() { + return mPaneTitle; + } + + /** * Get the drawing order of the view corresponding it this node. * <p> * Drawing order is determined only within the node's parent, so this index is only relative @@ -3151,6 +3179,10 @@ public class AccessibilityNodeInfo implements Parcelable { nonDefaultFields |= bitAt(fieldIndex); } fieldIndex++; + if (!Objects.equals(mPaneTitle, DEFAULT.mPaneTitle)) { + nonDefaultFields |= bitAt(fieldIndex); + } + fieldIndex++; if (!Objects.equals(mViewIdResourceName, DEFAULT.mViewIdResourceName)) { nonDefaultFields |= bitAt(fieldIndex); } @@ -3270,6 +3302,7 @@ public class AccessibilityNodeInfo implements Parcelable { if (isBitSet(nonDefaultFields, fieldIndex++)) { parcel.writeCharSequence(mContentDescription); } + if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeCharSequence(mPaneTitle); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeString(mViewIdResourceName); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeInt(mTextSelectionStart); @@ -3341,6 +3374,7 @@ public class AccessibilityNodeInfo implements Parcelable { mHintText = other.mHintText; mError = other.mError; mContentDescription = other.mContentDescription; + mPaneTitle = other.mPaneTitle; mViewIdResourceName = other.mViewIdResourceName; if (mActions != null) mActions.clear(); @@ -3461,6 +3495,7 @@ public class AccessibilityNodeInfo implements Parcelable { if (isBitSet(nonDefaultFields, fieldIndex++)) { mContentDescription = parcel.readCharSequence(); } + if (isBitSet(nonDefaultFields, fieldIndex++)) mPaneTitle = parcel.readString(); if (isBitSet(nonDefaultFields, fieldIndex++)) mViewIdResourceName = parcel.readString(); if (isBitSet(nonDefaultFields, fieldIndex++)) mTextSelectionStart = parcel.readInt(); |
