Skip to content

Commit fb1e80a

Browse files
committed
Exposing some accessiblity actions only for enabled views.
1. Some accessibility actions should not be performed on disabled views. For example, scrolling should not be permitted while accessibility focus should be. Made a quick pass over the actions we expose now. Change-Id: I36626dfbc0d2f480309a910f58f1de64e9e05675
1 parent 6387c8a commit fb1e80a

File tree

8 files changed

+110
-68
lines changed

8 files changed

+110
-68
lines changed

core/java/android/view/View.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4776,11 +4776,11 @@ void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
47764776
info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
47774777
}
47784778

4779-
if (isClickable()) {
4779+
if (isClickable() && isEnabled()) {
47804780
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
47814781
}
47824782

4783-
if (isLongClickable()) {
4783+
if (isLongClickable() && isEnabled()) {
47844784
info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
47854785
}
47864786

core/java/android/widget/AbsListView.java

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,11 +1470,13 @@ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
14701470
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
14711471
super.onInitializeAccessibilityNodeInfo(info);
14721472
info.setClassName(AbsListView.class.getName());
1473-
if (getFirstVisiblePosition() > 0) {
1474-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1475-
}
1476-
if (getLastVisiblePosition() < getCount() - 1) {
1477-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1473+
if (isEnabled()) {
1474+
if (getFirstVisiblePosition() > 0) {
1475+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1476+
}
1477+
if (getLastVisiblePosition() < getCount() - 1) {
1478+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1479+
}
14781480
}
14791481
}
14801482

@@ -1485,14 +1487,14 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
14851487
}
14861488
switch (action) {
14871489
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
1488-
if (getLastVisiblePosition() < getCount() - 1) {
1490+
if (isEnabled() && getLastVisiblePosition() < getCount() - 1) {
14891491
final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom;
14901492
smoothScrollBy(viewportHeight, PositionScroller.SCROLL_DURATION);
14911493
return true;
14921494
}
14931495
} return false;
14941496
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
1495-
if (mFirstPosition > 0) {
1497+
if (isEnabled() && mFirstPosition > 0) {
14961498
final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom;
14971499
smoothScrollBy(-viewportHeight, PositionScroller.SCROLL_DURATION);
14981500
return true;
@@ -2294,17 +2296,19 @@ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo i
22942296
return;
22952297
}
22962298

2297-
if (isClickable()) {
2299+
if (isClickable() && isEnabled()) {
22982300
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
22992301
info.setClickable(true);
23002302
}
23012303

2302-
if (isLongClickable()) {
2304+
if (isLongClickable() && isEnabled()) {
23032305
info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
23042306
info.setLongClickable(true);
23052307
}
23062308

2307-
info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
2309+
if (isEnabled()) {
2310+
info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
2311+
}
23082312

23092313
if (position == getSelectedItemPosition()) {
23102314
info.setSelected(true);
@@ -2313,34 +2317,40 @@ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo i
23132317

23142318
@Override
23152319
public boolean performAccessibilityAction(View host, int action, Bundle arguments) {
2320+
if (super.performAccessibilityAction(host, action, arguments)) {
2321+
return true;
2322+
}
2323+
23162324
final int position = getPositionForView(host);
23172325

23182326
if (position == INVALID_POSITION) {
23192327
return false;
23202328
}
23212329

2330+
if (!isEnabled()) {
2331+
return false;
2332+
}
2333+
23222334
final long id = getItemIdAtPosition(position);
23232335

23242336
switch (action) {
2325-
case AccessibilityNodeInfo.ACTION_SELECT:
2337+
case AccessibilityNodeInfo.ACTION_SELECT: {
23262338
setSelection(position);
23272339
return true;
2328-
case AccessibilityNodeInfo.ACTION_CLICK:
2329-
if (!super.performAccessibilityAction(host, action, arguments)) {
2340+
}
2341+
case AccessibilityNodeInfo.ACTION_CLICK: {
2342+
if (isClickable()) {
23302343
return performItemClick(host, position, id);
23312344
}
2332-
return true;
2333-
case AccessibilityNodeInfo.ACTION_LONG_CLICK:
2334-
if (!super.performAccessibilityAction(host, action, arguments)) {
2345+
} return false;
2346+
case AccessibilityNodeInfo.ACTION_LONG_CLICK: {
2347+
if (isLongClickable()) {
23352348
return performLongPress(host, position, id);
23362349
}
2337-
return true;
2338-
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
2339-
smoothScrollToPosition(position);
2340-
break;
2350+
} return false;
23412351
}
23422352

2343-
return super.performAccessibilityAction(host, action, arguments);
2353+
return false;
23442354
}
23452355
}
23462356

core/java/android/widget/Gallery.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,11 +1369,13 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
13691369
super.onInitializeAccessibilityNodeInfo(info);
13701370
info.setClassName(Gallery.class.getName());
13711371
info.setScrollable(mItemCount > 1);
1372-
if (mItemCount > 0 && mSelectedPosition < mItemCount - 1) {
1373-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1374-
}
1375-
if (mItemCount > 0 && mSelectedPosition > 0) {
1376-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1372+
if (isEnabled()) {
1373+
if (mItemCount > 0 && mSelectedPosition < mItemCount - 1) {
1374+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1375+
}
1376+
if (isEnabled() && mItemCount > 0 && mSelectedPosition > 0) {
1377+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1378+
}
13771379
}
13781380
}
13791381

@@ -1384,13 +1386,13 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
13841386
}
13851387
switch (action) {
13861388
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
1387-
if (mItemCount > 0 && mSelectedPosition < mItemCount - 1) {
1389+
if (isEnabled() && mItemCount > 0 && mSelectedPosition < mItemCount - 1) {
13881390
final int currentChildIndex = mSelectedPosition - mFirstPosition;
13891391
return scrollToChild(currentChildIndex + 1);
13901392
}
13911393
} return false;
13921394
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
1393-
if (mItemCount > 0 && mSelectedPosition > 0) {
1395+
if (isEnabled() && mItemCount > 0 && mSelectedPosition > 0) {
13941396
final int currentChildIndex = mSelectedPosition - mFirstPosition;
13951397
return scrollToChild(currentChildIndex - 1);
13961398
}

core/java/android/widget/HorizontalScrollView.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,9 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
744744
}
745745
switch (action) {
746746
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
747+
if (!isEnabled()) {
748+
return false;
749+
}
747750
final int viewportWidth = getWidth() - mPaddingLeft - mPaddingRight;
748751
final int targetScrollX = Math.min(mScrollX + viewportWidth, getScrollRange());
749752
if (targetScrollX != mScrollX) {
@@ -752,6 +755,9 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
752755
}
753756
} return false;
754757
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
758+
if (!isEnabled()) {
759+
return false;
760+
}
755761
final int viewportWidth = getWidth() - mPaddingLeft - mPaddingRight;
756762
final int targetScrollX = Math.max(0, mScrollX - viewportWidth);
757763
if (targetScrollX != mScrollX) {
@@ -770,10 +776,10 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
770776
final int scrollRange = getScrollRange();
771777
if (scrollRange > 0) {
772778
info.setScrollable(true);
773-
if (mScrollX > 0) {
779+
if (isEnabled() && mScrollX > 0) {
774780
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
775781
}
776-
if (mScrollX < scrollRange) {
782+
if (isEnabled() && mScrollX < scrollRange) {
777783
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
778784
}
779785
}

core/java/android/widget/NumberPicker.java

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,13 +2173,15 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) {
21732173
return false;
21742174
}
21752175
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
2176-
if (getWrapSelectorWheel() || getValue() < getMaxValue()) {
2176+
if (NumberPicker.this.isEnabled()
2177+
&& (getWrapSelectorWheel() || getValue() < getMaxValue())) {
21772178
changeValueByOne(true);
21782179
return true;
21792180
}
21802181
} return false;
21812182
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
2182-
if (getWrapSelectorWheel() || getValue() > getMinValue()) {
2183+
if (NumberPicker.this.isEnabled()
2184+
&& (getWrapSelectorWheel() || getValue() > getMinValue())) {
21832185
changeValueByOne(false);
21842186
return true;
21852187
}
@@ -2189,20 +2191,23 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) {
21892191
case VIRTUAL_VIEW_ID_INPUT: {
21902192
switch (action) {
21912193
case AccessibilityNodeInfo.ACTION_FOCUS: {
2192-
if (!mInputText.isFocused()) {
2194+
if (NumberPicker.this.isEnabled() && !mInputText.isFocused()) {
21932195
return mInputText.requestFocus();
21942196
}
21952197
} break;
21962198
case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: {
2197-
if (mInputText.isFocused()) {
2199+
if (NumberPicker.this.isEnabled() && mInputText.isFocused()) {
21982200
mInputText.clearFocus();
21992201
return true;
22002202
}
22012203
return false;
22022204
}
22032205
case AccessibilityNodeInfo.ACTION_CLICK: {
2204-
showSoftInput();
2205-
return true;
2206+
if (NumberPicker.this.isEnabled()) {
2207+
showSoftInput();
2208+
return true;
2209+
}
2210+
return false;
22062211
}
22072212
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: {
22082213
if (mAccessibilityFocusedView != virtualViewId) {
@@ -2230,10 +2235,13 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) {
22302235
case VIRTUAL_VIEW_ID_INCREMENT: {
22312236
switch (action) {
22322237
case AccessibilityNodeInfo.ACTION_CLICK: {
2233-
NumberPicker.this.changeValueByOne(true);
2234-
sendAccessibilityEventForVirtualView(virtualViewId,
2235-
AccessibilityEvent.TYPE_VIEW_CLICKED);
2236-
} return true;
2238+
if (NumberPicker.this.isEnabled()) {
2239+
NumberPicker.this.changeValueByOne(true);
2240+
sendAccessibilityEventForVirtualView(virtualViewId,
2241+
AccessibilityEvent.TYPE_VIEW_CLICKED);
2242+
return true;
2243+
}
2244+
} return false;
22372245
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: {
22382246
if (mAccessibilityFocusedView != virtualViewId) {
22392247
mAccessibilityFocusedView = virtualViewId;
@@ -2257,11 +2265,14 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) {
22572265
case VIRTUAL_VIEW_ID_DECREMENT: {
22582266
switch (action) {
22592267
case AccessibilityNodeInfo.ACTION_CLICK: {
2260-
final boolean increment = (virtualViewId == VIRTUAL_VIEW_ID_INCREMENT);
2261-
NumberPicker.this.changeValueByOne(increment);
2262-
sendAccessibilityEventForVirtualView(virtualViewId,
2263-
AccessibilityEvent.TYPE_VIEW_CLICKED);
2264-
} return true;
2268+
if (NumberPicker.this.isEnabled()) {
2269+
final boolean increment = (virtualViewId == VIRTUAL_VIEW_ID_INCREMENT);
2270+
NumberPicker.this.changeValueByOne(increment);
2271+
sendAccessibilityEventForVirtualView(virtualViewId,
2272+
AccessibilityEvent.TYPE_VIEW_CLICKED);
2273+
return true;
2274+
}
2275+
} return false;
22652276
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: {
22662277
if (mAccessibilityFocusedView != virtualViewId) {
22672278
mAccessibilityFocusedView = virtualViewId;
@@ -2470,7 +2481,9 @@ private AccessibilityNodeInfo createAccessibilityNodeInfoForVirtualButton(int vi
24702481
if (mAccessibilityFocusedView == virtualViewId) {
24712482
info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
24722483
}
2473-
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
2484+
if (NumberPicker.this.isEnabled()) {
2485+
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
2486+
}
24742487

24752488
return info;
24762489
}
@@ -2509,11 +2522,13 @@ private AccessibilityNodeInfo createAccessibilityNodeInfoForNumberPicker(int lef
25092522
if (mAccessibilityFocusedView == View.NO_ID) {
25102523
info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
25112524
}
2512-
if (getWrapSelectorWheel() || getValue() < getMaxValue()) {
2513-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
2514-
}
2515-
if (getWrapSelectorWheel() || getValue() > getMinValue()) {
2516-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
2525+
if (NumberPicker.this.isEnabled()) {
2526+
if (getWrapSelectorWheel() || getValue() < getMaxValue()) {
2527+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
2528+
}
2529+
if (getWrapSelectorWheel() || getValue() > getMinValue()) {
2530+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
2531+
}
25172532
}
25182533

25192534
return info;

core/java/android/widget/ScrollView.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,9 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
745745
if (super.performAccessibilityAction(action, arguments)) {
746746
return true;
747747
}
748+
if (!isEnabled()) {
749+
return false;
750+
}
748751
switch (action) {
749752
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
750753
final int viewportHeight = getHeight() - mPaddingBottom - mPaddingTop;
@@ -770,14 +773,16 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
770773
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
771774
super.onInitializeAccessibilityNodeInfo(info);
772775
info.setClassName(ScrollView.class.getName());
773-
final int scrollRange = getScrollRange();
774-
if (scrollRange > 0) {
775-
info.setScrollable(true);
776-
if (mScrollY > 0) {
777-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
778-
}
779-
if (mScrollY < scrollRange) {
780-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
776+
if (isEnabled()) {
777+
final int scrollRange = getScrollRange();
778+
if (scrollRange > 0) {
779+
info.setScrollable(true);
780+
if (mScrollY > 0) {
781+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
782+
}
783+
if (mScrollY < scrollRange) {
784+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
785+
}
781786
}
782787
}
783788
}

core/java/android/widget/StackView.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,11 +1230,13 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
12301230
super.onInitializeAccessibilityNodeInfo(info);
12311231
info.setClassName(StackView.class.getName());
12321232
info.setScrollable(getChildCount() > 1);
1233-
if (getDisplayedChild() < getChildCount() - 1) {
1234-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1235-
}
1236-
if (getDisplayedChild() > 0) {
1237-
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1233+
if (isEnabled()) {
1234+
if (getDisplayedChild() < getChildCount() - 1) {
1235+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
1236+
}
1237+
if (getDisplayedChild() > 0) {
1238+
info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
1239+
}
12381240
}
12391241
}
12401242

@@ -1243,6 +1245,9 @@ public boolean performAccessibilityAction(int action, Bundle arguments) {
12431245
if (super.performAccessibilityAction(action, arguments)) {
12441246
return true;
12451247
}
1248+
if (!isEnabled()) {
1249+
return false;
1250+
}
12461251
switch (action) {
12471252
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
12481253
if (getDisplayedChild() < getChildCount() - 1) {

core/java/android/widget/TextView.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7739,8 +7739,7 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
77397739
info.setText(getTextForAccessibility());
77407740
}
77417741

7742-
if (TextUtils.isEmpty(getContentDescription())
7743-
&& !TextUtils.isEmpty(mText)) {
7742+
if (TextUtils.isEmpty(getContentDescription()) && !TextUtils.isEmpty(mText)) {
77447743
info.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
77457744
info.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
77467745
info.setMovementGranularities(AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER

0 commit comments

Comments
 (0)