Fixed an issue where the top edge flickered

Because the overscroller is going over the edge, scrolling
could sometimes become negative. Also, the edge position
didn't actually match the position of the overscroll.
Now the overscrolling is done via the stackY, which also
updates the qsEdge.

Fixes: 191246064
Test: overscroll with notifications, observe no flickering
Change-Id: Iea994b05152f1c2465224b5371b4330a67310827
This commit is contained in:
Selim Cinek
2021-06-16 15:09:31 +02:00
parent adc3f0b6c1
commit 770a8ebeec
4 changed files with 12 additions and 14 deletions

View File

@@ -225,8 +225,14 @@ public class AmbientState {
return mScrollY;
}
/**
* Set the new Scroll Y position.
*/
public void setScrollY(int scrollY) {
this.mScrollY = scrollY;
// Because we're dealing with an overscroller, scrollY could sometimes become smaller than
// 0. However this is only for internal purposes and the scroll position when read
// should never be smaller than 0, otherwise it can lead to flickers.
this.mScrollY = Math.max(scrollY, 0);
}
/**

View File

@@ -1148,7 +1148,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
private void updateStackPosition() {
// Consider interpolating from an mExpansionStartY for use on lockscreen and AOD
float endTopPosition = mTopPadding + mExtraTopInsetForFullShadeTransition
+ mAmbientState.getOverExpansion();
+ mAmbientState.getOverExpansion()
- getCurrentOverScrollAmount(false /* top */);
final float fraction = mAmbientState.getExpansionFraction();
final float stackY = MathUtils.lerp(0, endTopPosition, fraction);
mAmbientState.setStackY(stackY);
@@ -1866,6 +1867,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
if (onTop) {
notifyOverscrollTopListener(amount, isRubberbanded);
}
updateStackPosition();
requestChildrenUpdate();
}
}

View File

@@ -1056,10 +1056,6 @@ public class NotificationStackScrollLayoutController {
mView.setAlpha(alpha);
}
public float getCurrentOverScrollAmount(boolean top) {
return mView.getCurrentOverScrollAmount(top);
}
public float calculateAppearFraction(float height) {
return mView.calculateAppearFraction(height);
}

View File

@@ -218,13 +218,7 @@ public class StackScrollAlgorithm {
*/
private void initAlgorithmState(ViewGroup hostView, StackScrollAlgorithmState state,
AmbientState ambientState) {
float bottomOverScroll = ambientState.getOverScrollAmount(false /* onTop */);
int scrollY = ambientState.getScrollY();
// Due to the overScroller, the stackscroller can have negative scroll state. This is
// already accounted for by the top padding and doesn't need an additional adaption
scrollY = Math.max(0, scrollY);
state.scrollY = (int) (scrollY + bottomOverScroll);
state.scrollY = ambientState.getScrollY();
state.mCurrentYPosition = -state.scrollY;
state.mCurrentExpandedYPosition = -state.scrollY;
@@ -261,7 +255,7 @@ public class StackScrollAlgorithm {
// Save the index of first view in shelf from when shade is fully
// expanded. Consider updating these states in updateContentView instead so that we don't
// have to recalculate in every frame.
float currentY = -scrollY;
float currentY = -ambientState.getScrollY();
if (!ambientState.isOnKeyguard()) {
currentY += mNotificationScrimPadding;
}