diff options
| author | 2011-07-29 22:17:14 -0700 | |
|---|---|---|
| committer | 2011-07-29 22:20:44 -0700 | |
| commit | 4e03f5910cf641e2610f4cbe3fc24d84c430d1e8 (patch) | |
| tree | a48bd0a52c8c166dd4ed97e73ed663ad6af45d84 | |
| parent | e8f1cbae4400e8b046b405f205dffe0417826fb3 (diff) | |
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
| -rw-r--r-- | core/java/android/widget/AbsListView.java | 21 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 11 |
2 files changed, 32 insertions, 0 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index cadf2aba0cec..9737a5a9bc07 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -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. @@ -1265,6 +1268,24 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } @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); event.setScrollable(true); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 6dcae6d4c936..294f6bbecc49 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -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 = |