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

Commit d6047940 authored by Jorim Jaggi's avatar Jorim Jaggi Committed by Android Git Automerger
Browse files

am 06a0c3a4: Implement nice transition for unlocking while QS is open

* commit '06a0c3a4':
  Implement nice transition for unlocking while QS is open
parents 0f22af99 06a0c3a4
Loading
Loading
Loading
Loading
+51 −27
Original line number Diff line number Diff line
@@ -527,13 +527,7 @@ public class NotificationPanelView extends PanelView implements
                mIntercepting = false;
                break;
        }

        // Allow closing the whole panel when in SHADE state.
        if (mStatusBarState == StatusBarState.SHADE) {
        return super.onInterceptTouchEvent(event);
        } else {
            return !mQsExpanded && super.onInterceptTouchEvent(event);
        }
    }

    @Override
@@ -645,8 +639,7 @@ public class NotificationPanelView extends PanelView implements
    }

    private boolean isInQsArea(float x, float y) {
        return mStatusBarState != StatusBarState.SHADE ||
                (x >= mScrollView.getLeft() && x <= mScrollView.getRight()) &&
        return (x >= mScrollView.getLeft() && x <= mScrollView.getRight()) &&
                (y <= mNotificationStackScroller.getBottomMostNotificationBottom()
                || y <= mQsContainer.getY() + mQsContainer.getHeight());
    }
@@ -1119,9 +1112,26 @@ public class NotificationPanelView extends PanelView implements
    }

    private float calculateQsTopPadding() {
        // We can only do the smoother transition on Keyguard when we also are not collapsing from a
        // scrolled quick settings.
        if (mKeyguardShowing && mScrollYOverride == -1) {
        if (mKeyguardShowing
                && (mTwoFingerQsExpand || mIsExpanding && mQsExpandedWhenExpandingStarted)) {

            // Either QS pushes the notifications down when fully expanded, or QS is fully above the
            // notifications (mostly on tablets). maxNotifications denotes the normal top padding
            // on Keyguard, maxQs denotes the top padding from the quick settings panel. We need to
            // take the maximum and linearly interpolate with the panel expansion for a nice motion.
            int maxNotifications = mClockPositionResult.stackScrollerPadding
                    - mClockPositionResult.stackScrollerPaddingAdjustment
                    - mNotificationTopPadding;
            int maxQs = getTempQsMaxExpansion();
            int max = mStatusBarState == StatusBarState.KEYGUARD
                    ? Math.max(maxNotifications, maxQs)
                    : maxQs;
            return (int) interpolate(getExpandedFraction(),
                    mQsMinExpansionHeight, max);
        } else if (mKeyguardShowing && mScrollYOverride == -1) {

            // We can only do the smoother transition on Keyguard when we also are not collapsing
            // from a scrolled quick settings.
            return interpolate(getQsExpansionFraction(),
                    mNotificationStackScroller.getIntrinsicPadding() - mNotificationTopPadding,
                    mQsMaxExpansionHeight);
@@ -1133,7 +1143,9 @@ public class NotificationPanelView extends PanelView implements
    private void requestScrollerTopPaddingUpdate(boolean animate) {
        mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(),
                mScrollView.getScrollY(),
                mAnimateNextTopPaddingChange || animate);
                mAnimateNextTopPaddingChange || animate,
                mKeyguardShowing
                        && (mTwoFingerQsExpand || mIsExpanding && mQsExpandedWhenExpandingStarted));
        mAnimateNextTopPaddingChange = false;
    }

@@ -1263,18 +1275,27 @@ public class NotificationPanelView extends PanelView implements

    @Override
    protected void onHeightUpdated(float expandedHeight) {
        if (!mQsExpanded) {
        if (!mQsExpanded || mTwoFingerQsExpand || mIsExpanding && mQsExpandedWhenExpandingStarted) {
            positionClockAndNotifications();
        }
        if (mTwoFingerQsExpand || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null
                && !mQsExpansionFromOverscroll) {
            float t;
            if (mKeyguardShowing) {

                // On Keyguard, interpolate the QS expansion linearly to the panel expansion
                t = expandedHeight / getMaxPanelHeight();
            } else {

                // In Shade, interpolate linearly such that QS is closed whenever panel height is
                // minimum QS expansion + minStackHeight
                float panelHeightQsCollapsed = mNotificationStackScroller.getIntrinsicPadding()
                        + mNotificationStackScroller.getMinStackHeight()
                        + mNotificationStackScroller.getNotificationTopPadding();
                float panelHeightQsExpanded = calculatePanelHeightQsExpanded();
            float t = (expandedHeight - panelHeightQsCollapsed)
                t = (expandedHeight - panelHeightQsCollapsed)
                        / (panelHeightQsExpanded - panelHeightQsCollapsed);

            }
            setQsExpansion(mQsMinExpansionHeight
                    + t * (getTempQsMaxExpansion() - mQsMinExpansionHeight));
        }
@@ -1308,8 +1329,10 @@ public class NotificationPanelView extends PanelView implements
        float notificationHeight = mNotificationStackScroller.getHeight()
                - mNotificationStackScroller.getEmptyBottomMargin()
                - mNotificationStackScroller.getTopPadding();
        float totalHeight = mQsMaxExpansionHeight + notificationHeight
                + mNotificationStackScroller.getNotificationTopPadding();
        float totalHeight = Math.max(
                mQsMaxExpansionHeight + mNotificationStackScroller.getNotificationTopPadding(),
                mClockPositionResult.stackScrollerPadding - mTopPaddingAdjustment)
                + notificationHeight;
        if (totalHeight > mNotificationStackScroller.getHeight()) {
            float fullyCollapsedHeight = mQsMaxExpansionHeight
                    + mNotificationStackScroller.getMinStackHeight()
@@ -1442,7 +1465,7 @@ public class NotificationPanelView extends PanelView implements
        super.onExpandingStarted();
        mNotificationStackScroller.onExpansionStarted();
        mIsExpanding = true;
        mQsExpandedWhenExpandingStarted = mQsExpanded;
        mQsExpandedWhenExpandingStarted = mQsFullyExpanded;
        if (mQsExpanded) {
            onQsExpansionStarted();
        }
@@ -1496,11 +1519,12 @@ public class NotificationPanelView extends PanelView implements
    @Override
    protected void onTrackingStarted() {
        super.onTrackingStarted();
        if (mQsFullyExpanded) {
            mTwoFingerQsExpand = true;
        }
        if (mStatusBar.getBarState() == StatusBarState.KEYGUARD
                || mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED) {
            mAfforanceHelper.animateHideLeftRightIcon();
        } else if (mQsExpanded) {
            mTwoFingerQsExpand = true;
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -639,10 +639,10 @@ public abstract class PanelView extends FrameLayout {
        }

        mExpandedHeight = Math.max(0, mExpandedHeight);
        onHeightUpdated(mExpandedHeight);
        mExpandedFraction = Math.min(1f, fhWithoutOverExpansion == 0
                ? 0
                : mExpandedHeight / fhWithoutOverExpansion);
        onHeightUpdated(mExpandedHeight);
        notifyBarPanelExpansionChanged();
    }

+23 −4
Original line number Diff line number Diff line
@@ -71,6 +71,12 @@ public class NotificationStackScrollLayout extends ViewGroup
    private SwipeHelper mSwipeHelper;
    private boolean mSwipingInProgress;
    private int mCurrentStackHeight = Integer.MAX_VALUE;

    /**
     * mCurrentStackHeight is the actual stack height, mLastSetStackHeight is the stack height set
     * externally from {@link #setStackHeight}
     */
    private float mLastSetStackHeight;
    private int mOwnScrollY;
    private int mMaxLayoutHeight;

@@ -453,6 +459,7 @@ public class NotificationStackScrollLayout extends ViewGroup
     * @param height the new height of the stack
     */
    public void setStackHeight(float height) {
        mLastSetStackHeight = height;
        setIsExpanded(height > 0.0f);
        int newStackHeight = (int) height;
        int minStackHeight = getMinStackHeight();
@@ -1349,7 +1356,19 @@ public class NotificationStackScrollLayout extends ViewGroup
                && initialVelocity > 0;
    }

    public void updateTopPadding(float qsHeight, int scrollY, boolean animate) {
    /**
     * Updates the top padding of the notifications, taking {@link #getIntrinsicPadding()} into
     * account.
     *
     * @param qsHeight the top padding imposed by the quick settings panel
     * @param scrollY how much the notifications are scrolled inside the QS/notifications scroll
     *                container
     * @param animate whether to animate the change
     * @param ignoreIntrinsicPadding if true, {@link #getIntrinsicPadding()} is ignored and
     *                               {@code qsHeight} is the final top padding
     */
    public void updateTopPadding(float qsHeight, int scrollY, boolean animate,
            boolean ignoreIntrinsicPadding) {
        float start = qsHeight - scrollY + mNotificationTopPadding;
        float stackHeight = getHeight() - start;
        int minStackHeight = getMinStackHeight();
@@ -1357,13 +1376,13 @@ public class NotificationStackScrollLayout extends ViewGroup
            float overflow = minStackHeight - stackHeight;
            stackHeight = minStackHeight;
            start = getHeight() - stackHeight;
            setTranslationY(overflow);
            mTopPaddingOverflow = overflow;
        } else {
            setTranslationY(0);
            mTopPaddingOverflow = 0;
        }
        setTopPadding(clampPadding((int) start), animate);
        setTopPadding(ignoreIntrinsicPadding ? (int) start : clampPadding((int) start),
                animate);
        setStackHeight(mLastSetStackHeight);
    }

    public int getNotificationTopPadding() {