Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 770a8ebe authored by Selim Cinek's avatar Selim Cinek
Browse files

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
parent adc3f0b6
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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);
    }

    /**
+3 −1
Original line number Diff line number Diff line
@@ -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();
        }
    }
+0 −4
Original line number Diff line number Diff line
@@ -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);
    }
+2 −8
Original line number Diff line number Diff line
@@ -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;
        }