diff --git a/core/api/current.txt b/core/api/current.txt index c8241066b2584..5dc21604e908f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52339,6 +52339,7 @@ package android.view.accessibility { method public CharSequence getClassName(); method public android.view.accessibility.AccessibilityNodeInfo.CollectionInfo getCollectionInfo(); method public android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo getCollectionItemInfo(); + method @Nullable public CharSequence getContainerTitle(); method public CharSequence getContentDescription(); method public int getDrawingOrder(); method public CharSequence getError(); @@ -52415,6 +52416,7 @@ package android.view.accessibility { method public void setClickable(boolean); method public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionInfo); method public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo); + method public void setContainerTitle(@Nullable CharSequence); method public void setContentDescription(CharSequence); method public void setContentInvalid(boolean); method public void setContextClickable(boolean); diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index d07a7977b2abb..9dbababb4de84 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -897,6 +897,7 @@ public class AccessibilityNodeInfo implements Parcelable { private CharSequence mTooltipText; private String mViewIdResourceName; private String mUniqueId; + private CharSequence mContainerTitle; private ArrayList mExtraDataKeys; @UnsupportedAppUsage @@ -3630,6 +3631,47 @@ public class AccessibilityNodeInfo implements Parcelable { return mUniqueId; } + /** + * Sets the container title for app-developer-defined container which can be any type of + * ViewGroup or layout. + * Container title will be used to group together related controls, similar to HTML fieldset. + * Or container title may identify a large piece of the UI that is visibly grouped together, + * such as a toolbar or a card, etc. + *

+ * Container title helps to assist in navigation across containers and other groups. + * For example, a screen reader may use this to determine where to put accessibility focus. + *

+ *

+ * Container title is different from pane title{@link #setPaneTitle} which indicates that the + * node represents a window or activity. + *

+ * + *

+ * Example: An app can set container titles on several non-modal menus, containing TextViews + * or ImageButtons that have content descriptions, text, etc. Screen readers can quickly + * switch accessibility focus among menus instead of child views. Other accessibility-services + * can easily find the menu. + *

+ * + * @param containerTitle The container title that is associated with a ViewGroup/Layout on the + * screen. + */ + public void setContainerTitle(@Nullable CharSequence containerTitle) { + enforceNotSealed(); + mContainerTitle = (containerTitle == null) ? null + : containerTitle.subSequence(0, containerTitle.length()); + } + + /** + * Returns the container title. + * + * @see #setContainerTitle for details. + */ + @Nullable + public CharSequence getContainerTitle() { + return mContainerTitle; + } + /** * Sets the token and node id of the leashed parent. * @@ -3963,6 +4005,10 @@ public class AccessibilityNodeInfo implements Parcelable { nonDefaultFields |= bitAt(fieldIndex); } fieldIndex++; + if (!Objects.equals(mContainerTitle, DEFAULT.mContainerTitle)) { + nonDefaultFields |= bitAt(fieldIndex); + } + fieldIndex++; if (!Objects.equals(mViewIdResourceName, DEFAULT.mViewIdResourceName)) { nonDefaultFields |= bitAt(fieldIndex); } @@ -4108,10 +4154,10 @@ public class AccessibilityNodeInfo implements Parcelable { } if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeCharSequence(mPaneTitle); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeCharSequence(mTooltipText); + if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeCharSequence(mContainerTitle); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeString(mViewIdResourceName); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeString(mUniqueId); - if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeInt(mTextSelectionStart); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeInt(mTextSelectionEnd); if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeInt(mInputType); @@ -4204,6 +4250,7 @@ public class AccessibilityNodeInfo implements Parcelable { mContentDescription = other.mContentDescription; mPaneTitle = other.mPaneTitle; mTooltipText = other.mTooltipText; + mContainerTitle = other.mContainerTitle; mViewIdResourceName = other.mViewIdResourceName; if (mActions != null) mActions.clear(); @@ -4347,6 +4394,7 @@ public class AccessibilityNodeInfo implements Parcelable { } if (isBitSet(nonDefaultFields, fieldIndex++)) mPaneTitle = parcel.readCharSequence(); if (isBitSet(nonDefaultFields, fieldIndex++)) mTooltipText = parcel.readCharSequence(); + if (isBitSet(nonDefaultFields, fieldIndex++)) mContainerTitle = parcel.readCharSequence(); if (isBitSet(nonDefaultFields, fieldIndex++)) mViewIdResourceName = parcel.readString(); if (isBitSet(nonDefaultFields, fieldIndex++)) mUniqueId = parcel.readString(); @@ -4675,6 +4723,7 @@ public class AccessibilityNodeInfo implements Parcelable { builder.append("; stateDescription: ").append(mStateDescription); builder.append("; contentDescription: ").append(mContentDescription); builder.append("; tooltipText: ").append(mTooltipText); + builder.append("; containerTitle: ").append(mContainerTitle); builder.append("; viewIdResName: ").append(mViewIdResourceName); builder.append("; uniqueId: ").append(mUniqueId); diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java index 99670d98bb84d..32085c1cfbebb 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java @@ -46,7 +46,7 @@ public class AccessibilityNodeInfoTest { // The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest: // See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo, // and assertAccessibilityNodeInfoCleared in that class. - private static final int NUM_MARSHALLED_PROPERTIES = 40; + private static final int NUM_MARSHALLED_PROPERTIES = 41; /** * The number of properties that are purposely not marshalled