diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java | 61 |
1 files 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 e87adae01b18..90e12ec3fabd 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. */ |