diff options
| author | 2019-06-11 18:58:21 -0700 | |
|---|---|---|
| committer | 2019-06-11 18:58:21 -0700 | |
| commit | 08de63ea45d1916ac551855b4a74a27d3462e5a6 (patch) | |
| tree | ed4c4ee6e4cb668a48f6d6cdda17eeb8a198ad20 | |
| parent | 3d87a9920e7b791ad29b1f7f63185b5a738aad7d (diff) | |
Disabled items shouldn't also be marked as unactionable.
Something can be clickable and disabled. Returning early here prevents that state to be reflected in ListView items.
The reported bug was happening because the items were disabled, but they weren't being reported as clickable.
Talkback doesn't read "disabled" for disabled items unless they are also actionable in certain ways.
Test: CTSAccessibility*, CTS AbsListViewTest, CTS ListViewTest, tried UI with sample app.
Fix: 131281972
Change-Id: Ic9b8c995398151f084d194e272ce082ec345e517
| -rw-r--r-- | core/java/android/widget/AbsListView.java | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4cb552d29c32..85e9e4950cba 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2553,34 +2553,42 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te final boolean isItemEnabled; final ViewGroup.LayoutParams lp = view.getLayoutParams(); if (lp instanceof AbsListView.LayoutParams) { - isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled; + isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled && isEnabled(); } else { isItemEnabled = false; } - if (!isEnabled() || !isItemEnabled) { - info.setEnabled(false); - return; - } + info.setEnabled(isItemEnabled); if (position == getSelectedItemPosition()) { info.setSelected(true); - info.addAction(AccessibilityAction.ACTION_CLEAR_SELECTION); - } else { - info.addAction(AccessibilityAction.ACTION_SELECT); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_CLEAR_SELECTION); + } else { + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_SELECT); } if (isItemClickable(view)) { - info.addAction(AccessibilityAction.ACTION_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, AccessibilityAction.ACTION_CLICK); info.setClickable(true); } if (isLongClickable()) { - info.addAction(AccessibilityAction.ACTION_LONG_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_LONG_CLICK); info.setLongClickable(true); } } + + private void addAccessibilityActionIfEnabled(AccessibilityNodeInfo info, boolean enabled, + AccessibilityAction action) { + if (enabled) { + info.addAction(action); + } + } + private boolean isItemClickable(View view) { return !view.hasExplicitFocusable(); } |