summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Qasid Ahmad Sadiq <qasid@google.com> 2019-06-11 18:58:21 -0700
committer Qasid Ahmad Sadiq <qasid@google.com> 2019-06-11 18:58:21 -0700
commit08de63ea45d1916ac551855b4a74a27d3462e5a6 (patch)
treeed4c4ee6e4cb668a48f6d6cdda17eeb8a198ad20
parent3d87a9920e7b791ad29b1f7f63185b5a738aad7d (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.java28
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();
}