From 770a8ebeec58ac45df8ce5f4948d92123844e76a Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 16 Jun 2021 15:09:31 +0200 Subject: [PATCH] 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 --- .../statusbar/notification/stack/AmbientState.java | 8 +++++++- .../stack/NotificationStackScrollLayout.java | 4 +++- .../stack/NotificationStackScrollLayoutController.java | 4 ---- .../notification/stack/StackScrollAlgorithm.java | 10 ++-------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 0c86262d9037f..7ab15048d4cd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -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); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index f90b4c079c508..be40694b32a7d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -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(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index dec98887577ef..f7b137087c996 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -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); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index e5fd103c239f1..c47e71a730efc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -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; }