Skip to content

Commit f76a83c

Browse files
committed
Fixing some minor issues in accessibility focus.
1. Now accessibility focus does not drag input focus and vice versa. Having the two focuses chase each other can lead to some pathological cases. For example, a container is input focusable and manages input focus for its children i.e. as soon as it gets input focus it sets input focus to a child. Now assume input and accessibility focus are on a child and focus search finds the parent to take accessibility focus, now putting accessibility focus to the parent will put input focus there and the parent will put input focus to the child which as a result will put accessibility focus there, thus resulting in traversal loop. bug:6522900 2. Fixed asymmetrical behavior of accessibility focus search for AbsListView. bug:6520016 3. Fixed accessibility focus search getting stuck in an empty AbsListView. bug:6520049 Change-Id: Ia26e5be7b5a9f340f873861ff466c787467b98dc
1 parent d51ac09 commit f76a83c

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

core/java/android/view/View.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4325,7 +4325,6 @@ protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyF
43254325
if (gainFocus) {
43264326
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
43274327
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
4328-
requestAccessibilityFocus();
43294328
}
43304329
}
43314330

@@ -6183,8 +6182,6 @@ public boolean requestAccessibilityFocus() {
61836182
invalidate();
61846183
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
61856184
notifyAccessibilityStateChanged();
6186-
// Try to give input focus to this view - not a descendant.
6187-
requestFocusNoSearch(View.FOCUS_DOWN, null);
61886185
return true;
61896186
}
61906187
return false;
@@ -6230,11 +6227,13 @@ public void clearAccessibilityFocus() {
62306227
private void requestAccessibilityFocusFromHover() {
62316228
if (includeForAccessibility() && isActionableForAccessibility()) {
62326229
requestAccessibilityFocus();
6230+
requestFocusNoSearch(View.FOCUS_DOWN, null);
62336231
} else {
62346232
if (mParent != null) {
62356233
View nextFocus = mParent.findViewToTakeAccessibilityFocusFromHover(this, this);
62366234
if (nextFocus != null) {
62376235
nextFocus.requestAccessibilityFocus();
6236+
nextFocus.requestFocusNoSearch(View.FOCUS_DOWN, null);
62386237
}
62396238
}
62406239
}

core/java/android/widget/AbsListView.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,24 +1352,23 @@ public View focusSearch(View focused, int direction) {
13521352
case ACCESSIBILITY_FOCUS_FORWARD: {
13531353
ViewRootImpl viewRootImpl = getViewRootImpl();
13541354
if (viewRootImpl == null) {
1355-
break;
1355+
return null;
13561356
}
13571357
View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
13581358
if (currentFocus == null) {
1359-
break;
1359+
return super.focusSearch(this, direction);
13601360
}
13611361
// If we have the focus try giving it to the first child.
13621362
if (currentFocus == this) {
1363-
final int firstVisiblePosition = getFirstVisiblePosition();
1364-
if (firstVisiblePosition >= 0) {
1363+
if (getChildCount() > 0) {
13651364
return getChildAt(0);
13661365
}
1367-
return null;
1366+
return super.focusSearch(this, direction);
13681367
}
13691368
// Find the item that has accessibility focus.
13701369
final int currentPosition = getPositionForView(currentFocus);
13711370
if (currentPosition < 0 || currentPosition >= getCount()) {
1372-
break;
1371+
return super.focusSearch(this, direction);
13731372
}
13741373
// Try to advance focus in the current item.
13751374
View currentItem = getChildAt(currentPosition - getFirstVisiblePosition());
@@ -1386,25 +1385,31 @@ public View focusSearch(View focused, int direction) {
13861385
final int nextPosition = currentPosition - getFirstVisiblePosition() + 1;
13871386
if (nextPosition < getChildCount()) {
13881387
return getChildAt(nextPosition);
1388+
} else {
1389+
return super.focusSearch(this, direction);
13891390
}
1390-
} break;
1391+
}
13911392
case ACCESSIBILITY_FOCUS_BACKWARD: {
13921393
ViewRootImpl viewRootImpl = getViewRootImpl();
13931394
if (viewRootImpl == null) {
1394-
break;
1395+
return null;
13951396
}
13961397
View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
13971398
if (currentFocus == null) {
1398-
break;
1399+
return super.focusSearch(this, direction);
13991400
}
14001401
// If we have the focus do a generic search.
14011402
if (currentFocus == this) {
1403+
final int lastChildIndex = getChildCount() - 1;
1404+
if (lastChildIndex >= 0) {
1405+
return getChildAt(lastChildIndex);
1406+
}
14021407
return super.focusSearch(this, direction);
14031408
}
14041409
// Find the item that has accessibility focus.
14051410
final int currentPosition = getPositionForView(currentFocus);
14061411
if (currentPosition < 0 || currentPosition >= getCount()) {
1407-
break;
1412+
return super.focusSearch(this, direction);
14081413
}
14091414
// Try to advance focus in the current item.
14101415
View currentItem = getChildAt(currentPosition - getFirstVisiblePosition());
@@ -1422,7 +1427,7 @@ public View focusSearch(View focused, int direction) {
14221427
if (nextPosition >= 0) {
14231428
return getChildAt(nextPosition);
14241429
} else {
1425-
return this;
1430+
return super.focusSearch(this, direction);
14261431
}
14271432
}
14281433
}

0 commit comments

Comments
 (0)