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

Commit 4e03f591 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Removing firing of spurious scroll accesibility events.

1. Adding a TextView to a layout fires an accessibility scroll event
   with mScrollX = 8144. Now TextView does not fire scroll events
   since they are not interesting for accessibility and also the
   implementation fires scroll to frequently - though correctly.

2. AbsListView was firing accessibility events for the same location.
   Here the caveat is that this class does not know its height and
   calls onScrollChange every time is scroll as seen by the user
   may have changed but for accessibility purposes we care for the
   start and end indices of visible views. The fix is to avoid
   sending access events with duplicate data.

bug:5097467

Change-Id: I7bf11efd638ea3673843f1095a03f518e57cfe9d
parent e8f1cbae
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -628,6 +628,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
    private int mGlowPaddingLeft;
    private int mGlowPaddingRight;

    private int mLastAccessibilityScrollEventFromIndex;
    private int mLastAccessibilityScrollEventToIndex;

    /**
     * Interface definition for a callback to be invoked when the list or grid
     * has been scrolled.
@@ -1264,6 +1267,24 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
        info.setScrollable(true);
    }

    @Override
    public void sendAccessibilityEvent(int eventType) {
        // Since this class calls onScrollChanged even if the mFirstPosition and the
        // child count have not changed we will avoid sending duplicate accessibility
        // events.
        if (eventType == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
            final int lastPosition = mFirstPosition + getChildCount();
            if (mLastAccessibilityScrollEventFromIndex == mFirstPosition
                    && mLastAccessibilityScrollEventToIndex == lastPosition) {
                return;   
            } else {
                mLastAccessibilityScrollEventFromIndex = mFirstPosition;
                mLastAccessibilityScrollEventToIndex = lastPosition;       
            }
        }
        super.sendAccessibilityEvent(eventType);
    }

    @Override
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(event);
+11 −0
Original line number Diff line number Diff line
@@ -8441,6 +8441,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        info.setPassword(isPassword);
    }

    @Override
    public void sendAccessibilityEvent(int eventType) {
        // Do not send scroll events since first they are not interesting for
        // accessibility and second such events a generated too frequently.
        // For details see the implementation of bringTextIntoView().
        if (eventType == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
            return;
        }
        super.sendAccessibilityEvent(eventType);
    }

    void sendAccessibilityEventTypeViewTextChanged(CharSequence beforeText,
            int fromIndex, int removedCount, int addedCount) {
        AccessibilityEvent event =