From 947a96956035e1ee22a82d18aec018b9046b641b Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Thu, 25 Sep 2014 12:43:47 -0700 Subject: [PATCH] Correctly advertise accessibility scrolling actions Previously, we didn't take into account partially-visible views. This extracts existing logic for determining whether the list can scroll up or down and applies that when adding scrolling actions. BUG: 17648502 Change-Id: I7ed9382e1645970ab098c210ad10f8a077da834b --- core/java/android/widget/AbsListView.java | 64 +++++++++++++---------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index af53ec85b7c36..f8eb8162608e5 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1487,11 +1487,11 @@ public abstract class AbsListView extends AdapterView implements Te super.onInitializeAccessibilityNodeInfo(info); info.setClassName(AbsListView.class.getName()); if (isEnabled()) { - if (getFirstVisiblePosition() > 0) { + if (canScrollUp()) { info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); info.setScrollable(true); } - if (getLastVisiblePosition() < getCount() - 1) { + if (canScrollDown()) { info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); info.setScrollable(true); } @@ -2197,38 +2197,46 @@ public abstract class AbsListView extends AdapterView implements Te void updateScrollIndicators() { if (mScrollUp != null) { - boolean canScrollUp; - // 0th element is not visible - canScrollUp = mFirstPosition > 0; - - // ... Or top of 0th element is not visible - if (!canScrollUp) { - if (getChildCount() > 0) { - View child = getChildAt(0); - canScrollUp = child.getTop() < mListPadding.top; - } - } - - mScrollUp.setVisibility(canScrollUp ? View.VISIBLE : View.INVISIBLE); + mScrollUp.setVisibility(canScrollUp() ? View.VISIBLE : View.INVISIBLE); } if (mScrollDown != null) { - boolean canScrollDown; - int count = getChildCount(); - - // Last item is not visible - canScrollDown = (mFirstPosition + count) < mItemCount; - - // ... Or bottom of the last element is not visible - if (!canScrollDown && count > 0) { - View child = getChildAt(count - 1); - canScrollDown = child.getBottom() > mBottom - mListPadding.bottom; - } - - mScrollDown.setVisibility(canScrollDown ? View.VISIBLE : View.INVISIBLE); + mScrollDown.setVisibility(canScrollDown() ? View.VISIBLE : View.INVISIBLE); } } + private boolean canScrollUp() { + boolean canScrollUp; + // 0th element is not visible + canScrollUp = mFirstPosition > 0; + + // ... Or top of 0th element is not visible + if (!canScrollUp) { + if (getChildCount() > 0) { + View child = getChildAt(0); + canScrollUp = child.getTop() < mListPadding.top; + } + } + + return canScrollUp; + } + + private boolean canScrollDown() { + boolean canScrollDown; + int count = getChildCount(); + + // Last item is not visible + canScrollDown = (mFirstPosition + count) < mItemCount; + + // ... Or bottom of the last element is not visible + if (!canScrollDown && count > 0) { + View child = getChildAt(count - 1); + canScrollDown = child.getBottom() > mBottom - mListPadding.bottom; + } + + return canScrollDown; + } + @Override @ViewDebug.ExportedProperty public View getSelectedView() {