Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f76a83cf authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

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:6520016e

3. Fixed accessibility focus search getting stuck in an
   empty AbsListView.

bug:6520049

Change-Id: Ia26e5be7b5a9f340f873861ff466c787467b98dc
parent d51ac09f
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -4325,7 +4325,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
        if (gainFocus) {
            if (AccessibilityManager.getInstance(mContext).isEnabled()) {
                sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
                requestAccessibilityFocus();
            }
        }
@@ -6183,8 +6182,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
            invalidate();
            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
            notifyAccessibilityStateChanged();
            // Try to give input focus to this view - not a descendant.
            requestFocusNoSearch(View.FOCUS_DOWN, null);
            return true;
        }
        return false;
@@ -6230,11 +6227,13 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
    private void requestAccessibilityFocusFromHover() {
        if (includeForAccessibility() && isActionableForAccessibility()) {
            requestAccessibilityFocus();
            requestFocusNoSearch(View.FOCUS_DOWN, null);
        } else {
            if (mParent != null) {
                View nextFocus = mParent.findViewToTakeAccessibilityFocusFromHover(this, this);
                if (nextFocus != null) {
                    nextFocus.requestAccessibilityFocus();
                    nextFocus.requestFocusNoSearch(View.FOCUS_DOWN, null);
                }
            }
        }
+16 −11
Original line number Diff line number Diff line
@@ -1352,24 +1352,23 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
            case ACCESSIBILITY_FOCUS_FORWARD: {
                ViewRootImpl viewRootImpl = getViewRootImpl();
                if (viewRootImpl == null) {
                    break;
                    return null;
                }
                View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
                if (currentFocus == null) {
                    break;
                    return super.focusSearch(this, direction);
                }
                // If we have the focus try giving it to the first child.
                if (currentFocus == this) {
                    final int firstVisiblePosition = getFirstVisiblePosition();
                    if (firstVisiblePosition >= 0) {
                    if (getChildCount() > 0) {
                        return getChildAt(0);
                    }
                    return null;
                    return super.focusSearch(this, direction);
                }
                // Find the item that has accessibility focus.
                final int currentPosition = getPositionForView(currentFocus);
                if (currentPosition < 0 || currentPosition >= getCount()) {
                    break;
                    return super.focusSearch(this, direction);
                }
                // Try to advance focus in the current item.
                View currentItem = getChildAt(currentPosition - getFirstVisiblePosition());
@@ -1386,25 +1385,31 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
                final int nextPosition = currentPosition - getFirstVisiblePosition() + 1;
                if (nextPosition < getChildCount()) {
                    return getChildAt(nextPosition);
                } else {
                    return super.focusSearch(this, direction);
                }
            }
            } break;
            case ACCESSIBILITY_FOCUS_BACKWARD: {
                ViewRootImpl viewRootImpl = getViewRootImpl();
                if (viewRootImpl == null) {
                    break;
                    return null;
                }
                View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
                if (currentFocus == null) {
                    break;
                    return super.focusSearch(this, direction);
                }
                // If we have the focus do a generic search.
                if (currentFocus == this) {
                    final int lastChildIndex = getChildCount() - 1;
                    if (lastChildIndex >= 0) {
                        return getChildAt(lastChildIndex);
                    }
                    return super.focusSearch(this, direction);
                }
                // Find the item that has accessibility focus.
                final int currentPosition = getPositionForView(currentFocus);
                if (currentPosition < 0 || currentPosition >= getCount()) {
                    break;
                    return super.focusSearch(this, direction);
                }
                // Try to advance focus in the current item.
                View currentItem = getChildAt(currentPosition - getFirstVisiblePosition());
@@ -1422,7 +1427,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
                if (nextPosition >= 0) {
                    return getChildAt(nextPosition);
                } else {
                    return this;
                    return super.focusSearch(this, direction);
                }
            }
        }