From 1d59f48e7c21f5ea102800edf3305bc430a7741c Mon Sep 17 00:00:00 2001 From: Zeyin Wu Date: Fri, 19 Aug 2022 16:49:08 +0000 Subject: [PATCH] Add accessibility expand/collapse action to node info Bug: 213940323 Test: ran atest android.widget.cts.ExpandableListViewTest and manually verified through talkback tests. Change-Id: I8e9523781edd0dfd76c422da219beccf1a39a298 --- .../android/widget/ExpandableListView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java index e243aae81da4e..efe3fd468e37e 100644 --- a/core/java/android/widget/ExpandableListView.java +++ b/core/java/android/widget/ExpandableListView.java @@ -31,6 +31,7 @@ import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.SoundEffectConstants; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ExpandableListConnector.PositionMetadata; import com.android.internal.R; @@ -1144,6 +1145,24 @@ public class ExpandableListView extends ListView { return new ExpandableListContextMenuInfo(view, packedPosition, id); } + /** @hide */ + @Override + public void onInitializeAccessibilityNodeInfoForItem( + View view, int position, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfoForItem(view, position, info); + + final PositionMetadata metadata = mConnector.getUnflattenedPos(position); + if (metadata.position.type == ExpandableListPosition.GROUP) { + if (isGroupExpanded(metadata.position.groupPos)) { + info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_COLLAPSE); + } else { + info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND); + } + } + + metadata.recycle(); + } + /** * Gets the ID of the group or child at the given position. * This is useful since there is no ListAdapter ID -> ExpandableListAdapter