From ef40606eb9e5978cfab47ccc76e4a641d1f31da4 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 29 Sep 2016 17:33:13 -0700 Subject: [PATCH] Fixed a bug with the scrollability of notifications The accessibility node info wasn't up to date when we scrolled into the view, so you could never scroll up anymore. This is now fixed. Change-Id: Ic71e5005edf89e7dc8a9129206342ed97820e687 Fixes: 31545848 --- .../stack/NotificationStackScrollLayout.java | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index e87adae01b188..90e12ec3fabd4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -351,6 +351,8 @@ public class NotificationStackScrollLayout extends ViewGroup } }; private boolean mQsExpanded; + private boolean mForwardScrollable; + private boolean mBackwardScrollable; public NotificationStackScrollLayout(Context context) { this(context, null); @@ -596,7 +598,7 @@ public class NotificationStackScrollLayout extends ViewGroup if (startingPosition < mOwnScrollY) { // This child starts off screen, so let's keep it offscreen to keep the others visible - mOwnScrollY += childHeight; + setOwnScrollY(mOwnScrollY + childHeight); } } } @@ -619,7 +621,7 @@ public class NotificationStackScrollLayout extends ViewGroup // Only apply the scroll if we're scrolling the view upwards, or the view is so far up // that it is not visible anymore. if (mOwnScrollY < targetScroll || outOfViewScroll < mOwnScrollY) { - mOwnScrollY = targetScroll; + setOwnScrollY(targetScroll); } } } @@ -639,7 +641,7 @@ public class NotificationStackScrollLayout extends ViewGroup private void clampScrollPosition() { int scrollRange = getScrollRange(); if (scrollRange < mOwnScrollY) { - mOwnScrollY = scrollRange; + setOwnScrollY(scrollRange); } } @@ -1406,7 +1408,7 @@ public class NotificationStackScrollLayout extends ViewGroup false /* onTop */, false /* animate */); } - mOwnScrollY = range; + setOwnScrollY(range); scrollAmount = 0.0f; } return scrollAmount; @@ -1437,7 +1439,7 @@ public class NotificationStackScrollLayout extends ViewGroup setOverScrolledPixels(currentTopPixels - newScrollY, true /* onTop */, false /* animate */); - mOwnScrollY = 0; + setOwnScrollY(0); scrollAmount = 0.0f; } return scrollAmount; @@ -1652,7 +1654,7 @@ public class NotificationStackScrollLayout extends ViewGroup } private void customScrollTo(int y) { - mOwnScrollY = y; + setOwnScrollY(y); updateChildren(); } @@ -1663,7 +1665,7 @@ public class NotificationStackScrollLayout extends ViewGroup final int oldX = mScrollX; final int oldY = mOwnScrollY; mScrollX = scrollX; - mOwnScrollY = scrollY; + setOwnScrollY(scrollY); if (clampedY) { springBack(); } else { @@ -1693,12 +1695,12 @@ public class NotificationStackScrollLayout extends ViewGroup if (overScrolledTop) { onTop = true; newAmount = -mOwnScrollY; - mOwnScrollY = 0; + setOwnScrollY(0); mDontReportNextOverScroll = true; } else { onTop = false; newAmount = mOwnScrollY - scrollRange; - mOwnScrollY = scrollRange; + setOwnScrollY(scrollRange); } setOverScrollAmount(newAmount, onTop, false); setOverScrollAmount(0.0f, onTop, true); @@ -1826,6 +1828,19 @@ public class NotificationStackScrollLayout extends ViewGroup if (scrollable != mScrollable) { mScrollable = scrollable; setFocusable(scrollable); + updateForwardAndBackwardScrollability(); + } + } + + private void updateForwardAndBackwardScrollability() { + boolean forwardScrollable = mScrollable && mOwnScrollY < getScrollRange(); + boolean backwardsScrollable = mScrollable && mOwnScrollY > 0; + boolean changed = forwardScrollable != mForwardScrollable + || backwardsScrollable != mBackwardScrollable; + mForwardScrollable = forwardScrollable; + mBackwardScrollable = backwardsScrollable; + if (changed) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } } @@ -2084,13 +2099,13 @@ public class NotificationStackScrollLayout extends ViewGroup float topAmount = getCurrentOverScrollAmount(true); float bottomAmount = getCurrentOverScrollAmount(false); if (velocityY < 0 && topAmount > 0) { - mOwnScrollY -= (int) topAmount; + setOwnScrollY(mOwnScrollY - (int) topAmount); mDontReportNextOverScroll = true; setOverScrollAmount(0, true, false); mMaxOverScroll = Math.abs(velocityY) / 1000f * getRubberBandFactor(true /* onTop */) * mOverflingDistance + topAmount; } else if (velocityY > 0 && bottomAmount > 0) { - mOwnScrollY += bottomAmount; + setOwnScrollY((int) (mOwnScrollY + bottomAmount)); setOverScrollAmount(0, false, false); mMaxOverScroll = Math.abs(velocityY) / 1000f * getRubberBandFactor(false /* onTop */) * mOverflingDistance @@ -2441,11 +2456,11 @@ public class NotificationStackScrollLayout extends ViewGroup if (endPosition <= mOwnScrollY) { // This child is fully scrolled of the top, so we have to deduct its height from the // scrollPosition - mOwnScrollY -= childHeight; + setOwnScrollY(mOwnScrollY - childHeight); } else if (startingPosition < mOwnScrollY) { // This child is currently being scrolled into, set the scroll position to the start of // this child - mOwnScrollY = startingPosition; + setOwnScrollY(startingPosition); } } @@ -3026,7 +3041,7 @@ public class NotificationStackScrollLayout extends ViewGroup public void onExpansionStopped() { mIsExpansionChanging = false; if (!mIsExpanded) { - mOwnScrollY = 0; + setOwnScrollY(0); mPhoneStatusBar.resetUserExpandedStates(); // lets make sure nothing is in the overlay / transient anymore @@ -3059,7 +3074,7 @@ public class NotificationStackScrollLayout extends ViewGroup public void resetScrollPosition() { mScroller.abortAnimation(); - mOwnScrollY = 0; + setOwnScrollY(0); } private void setIsExpanded(boolean isExpanded) { @@ -3128,7 +3143,7 @@ public class NotificationStackScrollLayout extends ViewGroup } int stackEnd = getStackEndPosition(); if (endPosition > stackEnd) { - mOwnScrollY += endPosition - stackEnd; + setOwnScrollY((int) (mOwnScrollY + endPosition - stackEnd)); mDisallowScrollingInThisMotion = true; } } @@ -3690,15 +3705,14 @@ public class NotificationStackScrollLayout extends ViewGroup @Override public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfoInternal(info); - final int scrollRange = getScrollRange(); - if (scrollRange > 0) { + if (mScrollable) { info.setScrollable(true); - if (mScrollY > 0) { + if (mBackwardScrollable) { info.addAction( AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD); info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP); } - if (mScrollY < scrollRange) { + if (mForwardScrollable) { info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD); info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN); } @@ -3874,6 +3888,13 @@ public class NotificationStackScrollLayout extends ViewGroup updateAlgorithmLayoutMinHeight(); } + public void setOwnScrollY(int ownScrollY) { + if (ownScrollY != mOwnScrollY) { + mOwnScrollY = ownScrollY; + updateForwardAndBackwardScrollability(); + } + } + /** * A listener that is notified when some child locations might have changed. */