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
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user