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

Commit cbef7b65 authored by Michał Brzeziński's avatar Michał Brzeziński Committed by Automerger Merge Worker
Browse files

Merge "First part of Fixing heads-up notification motion in split shade" into...

Merge "First part of Fixing heads-up notification motion in split shade" into tm-qpr-dev am: 12520fff am: 74d88a0b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19580549



Change-Id: I96e37e8d00a427b2015e207a1b7bb68a0201fb0b
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ccd0d620 74d88a0b
Loading
Loading
Loading
Loading
+65 −18
Original line number Original line Diff line number Diff line
@@ -443,6 +443,8 @@ public final class NotificationPanelViewController extends PanelViewController {
    private boolean mQsTouchAboveFalsingThreshold;
    private boolean mQsTouchAboveFalsingThreshold;
    private int mQsFalsingThreshold;
    private int mQsFalsingThreshold;


    /** Indicates drag starting height when swiping down or up on heads-up notifications */
    private int mHeadsUpStartHeight;
    private HeadsUpTouchHelper mHeadsUpTouchHelper;
    private HeadsUpTouchHelper mHeadsUpTouchHelper;
    private boolean mListenForHeadsUp;
    private boolean mListenForHeadsUp;
    private int mNavigationBarBottomHeight;
    private int mNavigationBarBottomHeight;
@@ -645,6 +647,8 @@ public final class NotificationPanelViewController extends PanelViewController {


    /** The drag distance required to fully expand the split shade. */
    /** The drag distance required to fully expand the split shade. */
    private int mSplitShadeFullTransitionDistance;
    private int mSplitShadeFullTransitionDistance;
    /** The drag distance required to fully transition scrims. */
    private int mSplitShadeScrimTransitionDistance;


    private final NotificationListContainer mNotificationListContainer;
    private final NotificationListContainer mNotificationListContainer;
    private final NotificationStackSizeCalculator mNotificationStackSizeCalculator;
    private final NotificationStackSizeCalculator mNotificationStackSizeCalculator;
@@ -1052,6 +1056,8 @@ public final class NotificationPanelViewController extends PanelViewController {
        mLockscreenNotificationQSPadding = mResources.getDimensionPixelSize(
        mLockscreenNotificationQSPadding = mResources.getDimensionPixelSize(
                R.dimen.notification_side_paddings);
                R.dimen.notification_side_paddings);
        mUdfpsMaxYBurnInOffset = mResources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
        mUdfpsMaxYBurnInOffset = mResources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
        mSplitShadeScrimTransitionDistance = mResources.getDimensionPixelSize(
                R.dimen.split_shade_scrim_transition_distance);
    }
    }


    private void updateViewControllers(KeyguardStatusView keyguardStatusView,
    private void updateViewControllers(KeyguardStatusView keyguardStatusView,
@@ -1335,7 +1341,7 @@ public final class NotificationPanelViewController extends PanelViewController {
        mQsSizeChangeAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
        mQsSizeChangeAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
        mQsSizeChangeAnimator.addUpdateListener(animation -> {
        mQsSizeChangeAnimator.addUpdateListener(animation -> {
            requestScrollerTopPaddingUpdate(false /* animate */);
            requestScrollerTopPaddingUpdate(false /* animate */);
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();
            int height = (int) mQsSizeChangeAnimator.getAnimatedValue();
            int height = (int) mQsSizeChangeAnimator.getAnimatedValue();
            mQs.setHeightOverride(height);
            mQs.setHeightOverride(height);
        });
        });
@@ -2114,7 +2120,7 @@ public final class NotificationPanelViewController extends PanelViewController {
            mMetricsLogger.count(COUNTER_PANEL_OPEN_QS, 1);
            mMetricsLogger.count(COUNTER_PANEL_OPEN_QS, 1);
            setQsExpandImmediate(true);
            setQsExpandImmediate(true);
            setShowShelfOnly(true);
            setShowShelfOnly(true);
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();


            // Normally, we start listening when the panel is expanded, but here we need to start
            // Normally, we start listening when the panel is expanded, but here we need to start
            // earlier so the state is already up to date when dragging down.
            // earlier so the state is already up to date when dragging down.
@@ -2326,7 +2332,7 @@ public final class NotificationPanelViewController extends PanelViewController {
        // Reset scroll position and apply that position to the expanded height.
        // Reset scroll position and apply that position to the expanded height.
        float height = mQsExpansionHeight;
        float height = mQsExpansionHeight;
        setQsExpansion(height);
        setQsExpansion(height);
        requestPanelHeightUpdate();
        updateExpandedHeightToMaxHeight();
        mNotificationStackScrollLayoutController.checkSnoozeLeavebehind();
        mNotificationStackScrollLayoutController.checkSnoozeLeavebehind();


        // When expanding QS, let's authenticate the user if possible,
        // When expanding QS, let's authenticate the user if possible,
@@ -2342,7 +2348,7 @@ public final class NotificationPanelViewController extends PanelViewController {
        if (changed) {
        if (changed) {
            mQsExpanded = expanded;
            mQsExpanded = expanded;
            updateQsState();
            updateQsState();
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();
            mFalsingCollector.setQsExpanded(expanded);
            mFalsingCollector.setQsExpanded(expanded);
            mCentralSurfaces.setQsExpanded(expanded);
            mCentralSurfaces.setQsExpanded(expanded);
            mNotificationsQSContainerController.setQsExpanded(expanded);
            mNotificationsQSContainerController.setQsExpanded(expanded);
@@ -3066,16 +3072,7 @@ public final class NotificationPanelViewController extends PanelViewController {
        int maxHeight;
        int maxHeight;
        if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted
        if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted
                || mPulsing || mSplitShadeEnabled) {
                || mPulsing || mSplitShadeEnabled) {
            if (mSplitShadeEnabled && mBarState == SHADE) {
                // Max panel height is used to calculate the fraction of the shade expansion.
                // Traditionally the value is based on the number of notifications.
                // On split-shade, we want the required distance to be a specific and constant
                // value, to make sure the expansion motion has the expected speed.
                // We also only want this on non-lockscreen for now.
                maxHeight = mSplitShadeFullTransitionDistance;
            } else {
            maxHeight = calculatePanelHeightQsExpanded();
            maxHeight = calculatePanelHeightQsExpanded();
            }
        } else {
        } else {
            maxHeight = calculatePanelHeightShade();
            maxHeight = calculatePanelHeightShade();
        }
        }
@@ -3433,6 +3430,31 @@ public final class NotificationPanelViewController extends PanelViewController {
                || !isTracking());
                || !isTracking());
    }
    }


    @Override
    public int getMaxPanelTransitionDistance() {
        // Traditionally the value is based on the number of notifications. On split-shade, we want
        // the required distance to be a specific and constant value, to make sure the expansion
        // motion has the expected speed. We also only want this on non-lockscreen for now.
        if (mSplitShadeEnabled && mBarState == SHADE) {
            boolean transitionFromHeadsUp =
                    mHeadsUpManager.isTrackingHeadsUp() || mExpandingFromHeadsUp;
            // heads-up starting height is too close to mSplitShadeFullTransitionDistance and
            // when dragging HUN transition is already 90% complete. It makes shade become
            // immediately visible when starting to drag. We want to set distance so that
            // nothing is immediately visible when dragging (important for HUN swipe up motion) -
            // 0.4 expansion fraction is a good starting point.
            if (transitionFromHeadsUp) {
                double maxDistance = Math.max(mSplitShadeFullTransitionDistance,
                        mHeadsUpStartHeight * 2.5);
                return (int) Math.min(getMaxPanelHeight(), maxDistance);
            } else {
                return mSplitShadeFullTransitionDistance;
            }
        } else {
            return getMaxPanelHeight();
        }
    }

    @Override
    @Override
    protected boolean isTrackingBlocked() {
    protected boolean isTrackingBlocked() {
        return mConflictingQsExpansionGesture && mQsExpanded || mBlockingExpansionForCurrentTouch;
        return mConflictingQsExpansionGesture && mQsExpanded || mBlockingExpansionForCurrentTouch;
@@ -3631,11 +3653,36 @@ public final class NotificationPanelViewController extends PanelViewController {
        return mBarState == KEYGUARD;
        return mBarState == KEYGUARD;
    }
    }


    /**
     * Called when heads-up notification is being dragged up or down to indicate what's the starting
     * height for shade motion
     */
    public void setHeadsUpDraggingStartingHeight(int startHeight) {
        mHeadsUpStartHeight = startHeight;
        float scrimMinFraction;
        if (mSplitShadeEnabled) {
            boolean highHun = mHeadsUpStartHeight * 2.5 > mSplitShadeScrimTransitionDistance;
            // if HUN height is higher than 40% of predefined transition distance, it means HUN
            // is too high for regular transition. In that case we need to calculate transition
            // distance - here we take scrim transition distance as equal to shade transition
            // distance. It doesn't result in perfect motion - usually scrim transition distance
            // should be longer - but it's good enough for HUN case.
            float transitionDistance =
                    highHun ? getMaxPanelTransitionDistance() : mSplitShadeFullTransitionDistance;
            scrimMinFraction = mHeadsUpStartHeight / transitionDistance;
        } else {
            int transitionDistance = getMaxPanelHeight();
            scrimMinFraction = transitionDistance > 0f
                    ? (float) mHeadsUpStartHeight / transitionDistance : 0f;
        }
        setPanelScrimMinFraction(scrimMinFraction);
    }

    /**
    /**
     * Sets the minimum fraction for the panel expansion offset. This may be non-zero in certain
     * Sets the minimum fraction for the panel expansion offset. This may be non-zero in certain
     * cases, such as if there's a heads-up notification.
     * cases, such as if there's a heads-up notification.
     */
     */
    public void setPanelScrimMinFraction(float minFraction) {
    private void setPanelScrimMinFraction(float minFraction) {
        mMinFraction = minFraction;
        mMinFraction = minFraction;
        mDepthController.setPanelPullDownMinFraction(mMinFraction);
        mDepthController.setPanelPullDownMinFraction(mMinFraction);
        mScrimController.setPanelScrimMinFraction(mMinFraction);
        mScrimController.setPanelScrimMinFraction(mMinFraction);
@@ -4368,7 +4415,7 @@ public final class NotificationPanelViewController extends PanelViewController {
            if (mKeyguardShowing) {
            if (mKeyguardShowing) {
                updateMaxDisplayedNotifications(true);
                updateMaxDisplayedNotifications(true);
            }
            }
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();
        }
        }


        @Override
        @Override
@@ -4501,7 +4548,7 @@ public final class NotificationPanelViewController extends PanelViewController {
            if (mQsExpanded && mQsFullyExpanded) {
            if (mQsExpanded && mQsFullyExpanded) {
                mQsExpansionHeight = mQsMaxExpansionHeight;
                mQsExpansionHeight = mQsMaxExpansionHeight;
                requestScrollerTopPaddingUpdate(false /* animate */);
                requestScrollerTopPaddingUpdate(false /* animate */);
                requestPanelHeightUpdate();
                updateExpandedHeightToMaxHeight();
            }
            }
            if (mAccessibilityManager.isEnabled()) {
            if (mAccessibilityManager.isEnabled()) {
                mView.setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
                mView.setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
@@ -4770,7 +4817,7 @@ public final class NotificationPanelViewController extends PanelViewController {
            if (mQsExpanded && mQsFullyExpanded) {
            if (mQsExpanded && mQsFullyExpanded) {
                mQsExpansionHeight = mQsMaxExpansionHeight;
                mQsExpansionHeight = mQsMaxExpansionHeight;
                requestScrollerTopPaddingUpdate(false /* animate */);
                requestScrollerTopPaddingUpdate(false /* animate */);
                requestPanelHeightUpdate();
                updateExpandedHeightToMaxHeight();


                // Size has changed, start an animation.
                // Size has changed, start an animation.
                if (mQsMaxExpansionHeight != oldMaxHeight) {
                if (mQsMaxExpansionHeight != oldMaxHeight) {
+14 −10
Original line number Original line Diff line number Diff line
@@ -248,7 +248,7 @@ public abstract class PanelViewController {
        keyguardStateController.addCallback(new KeyguardStateController.Callback() {
        keyguardStateController.addCallback(new KeyguardStateController.Callback() {
            @Override
            @Override
            public void onKeyguardFadingAwayChanged() {
            public void onKeyguardFadingAwayChanged() {
                requestPanelHeightUpdate();
                updateExpandedHeightToMaxHeight();
            }
            }
        });
        });
        mAmbientState = ambientState;
        mAmbientState = ambientState;
@@ -730,7 +730,7 @@ public abstract class PanelViewController {
        setExpandedHeightInternal(height);
        setExpandedHeightInternal(height);
    }
    }


    protected void requestPanelHeightUpdate() {
    void updateExpandedHeightToMaxHeight() {
        float currentMaxPanelHeight = getMaxPanelHeight();
        float currentMaxPanelHeight = getMaxPanelHeight();


        if (isFullyCollapsed()) {
        if (isFullyCollapsed()) {
@@ -753,6 +753,13 @@ public abstract class PanelViewController {
        setExpandedHeight(currentMaxPanelHeight);
        setExpandedHeight(currentMaxPanelHeight);
    }
    }


    /**
     * Returns drag down distance after which panel should be fully expanded. Usually it's the
     * same as max panel height but for large screen devices (especially split shade) we might
     * want to return different value to shorten drag distance
     */
    public abstract int getMaxPanelTransitionDistance();

    public void setExpandedHeightInternal(float h) {
    public void setExpandedHeightInternal(float h) {
        if (isNaN(h)) {
        if (isNaN(h)) {
            Log.wtf(TAG, "ExpandedHeight set to NaN");
            Log.wtf(TAG, "ExpandedHeight set to NaN");
@@ -763,18 +770,15 @@ public abstract class PanelViewController {
                        () -> mLatencyTracker.onActionEnd(LatencyTracker.ACTION_EXPAND_PANEL));
                        () -> mLatencyTracker.onActionEnd(LatencyTracker.ACTION_EXPAND_PANEL));
                mExpandLatencyTracking = false;
                mExpandLatencyTracking = false;
            }
            }
            float maxPanelHeight = getMaxPanelHeight();
            float maxPanelHeight = getMaxPanelTransitionDistance();
            if (mHeightAnimator == null) {
            if (mHeightAnimator == null) {
                // Split shade has its own overscroll logic
                // Split shade has its own overscroll logic
                if (mTracking && !mInSplitShade) {
                if (mTracking && !mInSplitShade) {
                    float overExpansionPixels = Math.max(0, h - maxPanelHeight);
                    float overExpansionPixels = Math.max(0, h - maxPanelHeight);
                    setOverExpansionInternal(overExpansionPixels, true /* isFromGesture */);
                    setOverExpansionInternal(overExpansionPixels, true /* isFromGesture */);
                }
                }
                mExpandedHeight = Math.min(h, maxPanelHeight);
            } else {
                mExpandedHeight = h;
            }
            }

            mExpandedHeight = Math.min(h, maxPanelHeight);
            // If we are closing the panel and we are almost there due to a slow decelerating
            // If we are closing the panel and we are almost there due to a slow decelerating
            // interpolator, abort the animation.
            // interpolator, abort the animation.
            if (mExpandedHeight < 1f && mExpandedHeight != 0f && mClosing) {
            if (mExpandedHeight < 1f && mExpandedHeight != 0f && mClosing) {
@@ -832,7 +836,7 @@ public abstract class PanelViewController {
    protected abstract int getMaxPanelHeight();
    protected abstract int getMaxPanelHeight();


    public void setExpandedFraction(float frac) {
    public void setExpandedFraction(float frac) {
        setExpandedHeight(getMaxPanelHeight() * frac);
        setExpandedHeight(getMaxPanelTransitionDistance() * frac);
    }
    }


    public float getExpandedHeight() {
    public float getExpandedHeight() {
@@ -1029,7 +1033,7 @@ public abstract class PanelViewController {
        mHeightAnimator = animator;
        mHeightAnimator = animator;
        if (animator == null && mPanelUpdateWhenAnimatorEnds) {
        if (animator == null && mPanelUpdateWhenAnimatorEnds) {
            mPanelUpdateWhenAnimatorEnds = false;
            mPanelUpdateWhenAnimatorEnds = false;
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();
        }
        }
    }
    }


@@ -1421,7 +1425,7 @@ public abstract class PanelViewController {
        @Override
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
                int oldTop, int oldRight, int oldBottom) {
                int oldTop, int oldRight, int oldBottom) {
            requestPanelHeightUpdate();
            updateExpandedHeightToMaxHeight();
            mHasLayoutedSinceDown = true;
            mHasLayoutedSinceDown = true;
            if (mUpdateFlingOnLayout) {
            if (mUpdateFlingOnLayout) {
                abortAnimations();
                abortAnimations();
+7 −1
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@ import com.android.systemui.statusbar.phone.panelstate.PanelExpansionChangeEvent
import com.android.systemui.statusbar.phone.panelstate.PanelState
import com.android.systemui.statusbar.phone.panelstate.PanelState
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
import com.android.systemui.statusbar.phone.panelstate.STATE_OPENING
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.LargeScreenUtils
import java.io.PrintWriter
import java.io.PrintWriter
import javax.inject.Inject
import javax.inject.Inject
@@ -28,6 +29,7 @@ constructor(
    private val scrimController: ScrimController,
    private val scrimController: ScrimController,
    @Main private val resources: Resources,
    @Main private val resources: Resources,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val statusBarStateController: SysuiStatusBarStateController,
    private val headsUpManager: HeadsUpManager
) {
) {


    private var inSplitShade = false
    private var inSplitShade = false
@@ -84,7 +86,11 @@ constructor(
    }
    }


    private fun canUseCustomFraction(panelState: Int?) =
    private fun canUseCustomFraction(panelState: Int?) =
        inSplitShade && isScreenUnlocked() && panelState == STATE_OPENING
        inSplitShade && isScreenUnlocked() && panelState == STATE_OPENING &&
                // in case of HUN we can't always use predefined distances to manage scrim
                // transition because dragDownPxAmount can start from value bigger than
                // splitShadeScrimTransitionDistance
                !headsUpManager.isTrackingHeadsUp


    private fun isScreenUnlocked() =
    private fun isScreenUnlocked() =
        statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE
        statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE
+1 −3
Original line number Original line Diff line number Diff line
@@ -115,9 +115,7 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
                    mInitialTouchY = y;
                    mInitialTouchY = y;
                    int startHeight = (int) (mPickedChild.getActualHeight()
                    int startHeight = (int) (mPickedChild.getActualHeight()
                                                + mPickedChild.getTranslationY());
                                                + mPickedChild.getTranslationY());
                    float maxPanelHeight = mPanel.getMaxPanelHeight();
                    mPanel.setHeadsUpDraggingStartingHeight(startHeight);
                    mPanel.setPanelScrimMinFraction(maxPanelHeight > 0f
                            ? (float) startHeight / maxPanelHeight : 0f);
                    mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight);
                    mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight);
                    // This call needs to be after the expansion start otherwise we will get a
                    // This call needs to be after the expansion start otherwise we will get a
                    // flicker of one frame as it's not expanded yet.
                    // flicker of one frame as it's not expanded yet.
+2 −2
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@ class PanelExpansionStateManager @Inject constructor() {
                    "f=$fraction " +
                    "f=$fraction " +
                    "expanded=$expanded " +
                    "expanded=$expanded " +
                    "tracking=$tracking " +
                    "tracking=$tracking " +
                    "drawDownPxAmount=$dragDownPxAmount " +
                    "dragDownPxAmount=$dragDownPxAmount " +
                    "${if (fullyOpened) " fullyOpened" else ""} " +
                    "${if (fullyOpened) " fullyOpened" else ""} " +
                    if (fullyClosed) " fullyClosed" else ""
                    if (fullyClosed) " fullyClosed" else ""
        )
        )
Loading