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

Commit 80ab3606 authored by Christian Göllner's avatar Christian Göllner Committed by Alex Florescu
Browse files

[Large screens][Motion] Improve expansion timing on lockscreen

- Adds more xml resource configs to be able to more precisely control
  the expansion transition:
  - QS transition start delay
  - QS squish transition distance
  - QS squish transition start fraction
- On split shade:
  - Fades in notifications scrim later
  - Fades in QS earlier
  - QS squshiness starts at 0.5 instead of 0
- On large screen portrait:
  - Fades in QS and notifications only after the behind scrim finished
    fading in
  - QS squshiness starts at 0.5 instead of 0

Change-Id: Id0941d11fe194c8be74f6101cf6f9f7d22888fc9
Test: QSFragmentTest.java
Test: NotificationPanelViewControllerTest.java
Test: ScrimControllerTest.java
Test: LockscreenShadeQsTransitionControllerTest.kt
Test: LockscreenShadeTransitionControllerTest.kt
Test: Manually
Bug: 239904136
(cherry picked from commit ae32ffda)
parent 1a4b98ce
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ package com.android.systemui.plugins.qs;

import android.view.View;

import androidx.annotation.FloatRange;

import com.android.systemui.plugins.FragmentBase;
import com.android.systemui.plugins.annotations.DependsOn;
import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -107,10 +109,24 @@ public interface QS extends FragmentBase {
    void setInSplitShade(boolean shouldTranslate);

    /**
     * Set the amount of pixels we have currently dragged down if we're transitioning to the full
     * shade. 0.0f means we're not transitioning yet.
     * Sets the progress of the transition to full shade on the lockscreen.
     *
     * @param isTransitioningToFullShade
     *        whether the transition to full shade is in progress. This might be {@code true}, even
     *        though {@code qsTransitionFraction} is still 0.
     *        The reason for that is that on some device configurations, the QS transition has a
     *        start delay compared to the overall transition.
     *
     * @param qsTransitionFraction
     *        the fraction of the QS transition progress, from 0 to 1.
     *
     * @param qsSquishinessFraction
     *        the fraction of the QS "squish" transition progress, from 0 to 1.
     */
    default void setTransitionToFullShadeAmount(float pxAmount, float progress) {}
    default void setTransitionToFullShadeProgress(
            boolean isTransitioningToFullShade,
            @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction,
            @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) {}

    /**
     * A rounded corner clipping that makes QS feel as if it were behind everything.
@@ -139,6 +155,12 @@ public interface QS extends FragmentBase {
     */
    default void setOverScrollAmount(int overScrollAmount) {}

    /**
     * Sets whether the notification panel is using the full width of the screen. Typically true on
     * small screens and false on large screens.
     */
    void setIsNotificationPanelFullWidth(boolean isFullWidth);

    /**
     * Callback for when QSPanel container is scrolled
     */
+10 −35
Original line number Diff line number Diff line
@@ -49,54 +49,29 @@

    <dimen name="status_view_margin_horizontal">8dp</dimen>

    <!-- Distance that the full shade transition takes in order to complete by tapping on a button
         like "expand". -->
    <!-- Lockscreen shade transition values -->
    <dimen name="lockscreen_shade_transition_by_tap_distance">200dp</dimen>

    <!-- Distance that the full shade transition takes in order to complete.  -->
    <dimen name="lockscreen_shade_full_transition_distance">200dp</dimen>

    <!-- Distance that the full shade transition takes in order for media to fully transition to
         the shade -->
    <dimen name="lockscreen_shade_media_transition_distance">200dp</dimen>

    <!-- Distance that the full shade transition takes in order for scrim to fully transition to
         the shade (in alpha) -->
    <!-- Media transition distance = qs delay + qs distance   -->
    <dimen name="lockscreen_shade_media_transition_distance">129.28dp</dimen>
    <dimen name="lockscreen_shade_scrim_transition_distance">80dp</dimen>

    <!-- The notifications scrim transition should start when the other scrims' transition is at
         95%. -->
    <dimen name="lockscreen_shade_notifications_scrim_transition_delay">76dp</dimen>

    <!-- The notifications scrim transition duration is 66.6% of the duration of the other scrims'
        transition. -->
    <dimen name="lockscreen_shade_notifications_scrim_transition_distance">53.28dp</dimen>

    <!-- Distance that the full shade transition takes in order for the keyguard content on
         NotificationPanelViewController to fully fade (e.g. Clock & Smartspace) -->
    <dimen name="lockscreen_shade_npvc_keyguard_content_alpha_transition_distance">80dp</dimen>

    <!-- Distance that the full shade transition takes in order for the notification shell to fully
         expand. -->
    <dimen name="lockscreen_shade_notif_shelf_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>

    <!-- Distance that the full shade transition takes in order for the Quick Settings to fully
         fade and expand. -->
    <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>

    <!-- Distance that the full shade transition takes in order for depth of the wallpaper to fully
         change.
         On split-shade, there should be no depth effect, so setting the value to 0. -->
    <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_notifications_scrim_transition_distance</dimen>
    <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_notifications_scrim_transition_delay</dimen>
    <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen>
    <!-- On split-shade, the QS squish transition should start from half height.  -->
    <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item>
    <!-- On split-shade, there should be no depth effect, so setting the value to 0.  -->
    <dimen name="lockscreen_shade_depth_controller_transition_distance">0dp</dimen>

    <!-- Distance that the full shade transition takes in order for the UDFPS Keyguard View to fully
         fade. -->
    <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>

    <!-- Used for StatusBar to know that a transition is in progress. At the moment it only checks
         whether the progress is > 0, therefore this value is not very important. -->
    <dimen name="lockscreen_shade_status_bar_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>

    <dimen name="lockscreen_shade_keyguard_transition_distance">@dimen/lockscreen_shade_media_transition_distance</dimen>

    <!-- Roughly the same distance as media on LS to media on QS. We will translate by this value
+20 −0
Original line number Diff line number Diff line
@@ -73,4 +73,24 @@
    <dimen name="large_dialog_width">472dp</dimen>

    <dimen name="large_screen_shade_header_height">42dp</dimen>

    <!-- Lockscreen shade transition values -->
    <dimen name="lockscreen_shade_transition_by_tap_distance">200dp</dimen>
    <dimen name="lockscreen_shade_full_transition_distance">80dp</dimen>
    <dimen name="lockscreen_shade_media_transition_distance">120dp</dimen>
    <dimen name="lockscreen_shade_scrim_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_notifications_scrim_transition_delay">@dimen/lockscreen_shade_scrim_transition_distance</dimen>
    <dimen name="lockscreen_shade_notifications_scrim_transition_distance">@dimen/lockscreen_shade_scrim_transition_distance</dimen>
    <dimen name="lockscreen_shade_npvc_keyguard_content_alpha_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_notif_shelf_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_scrim_transition_distance</dimen>
    <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen>
    <!-- On large screen portrait, the QS squish transition should start from half height.  -->
    <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item>
    <dimen name="lockscreen_shade_depth_controller_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_status_bar_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
    <dimen name="lockscreen_shade_keyguard_transition_distance">@dimen/lockscreen_shade_media_transition_distance</dimen>

</resources>
+11 −0
Original line number Diff line number Diff line
@@ -1210,6 +1210,17 @@
         fade and expand. -->
    <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>

    <!-- Distance delay for the QS transition to start during the lockscreen shade expansion. -->
    <dimen name="lockscreen_shade_qs_transition_delay">0dp</dimen>

    <!-- Distance that it takes to complete the QS "squish" transition during the lockscreen shade
         expansion. -->
    <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen>

    <!-- The fraction at which the QS "squish" transition should start during the lockscreen shade
         expansion. 0 is fully collapsed, 1 is fully expanded. -->
    <item type="dimen" format="float" name="lockscreen_shade_qs_squish_start_fraction">0</item>

    <!-- Distance that the full shade transition takes in order for depth of the wallpaper to fully
         change.  -->
    <dimen name="lockscreen_shade_depth_controller_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen>
+58 −11
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import androidx.annotation.FloatRange;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle;
@@ -166,6 +167,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    // visible;
    private boolean mQsVisible;

    /**
     * Whether the notification panel uses the full width of the screen.
     *
     * Usually {@code true} on small screens, and {@code false} on large screens.
     */
    private boolean mIsNotificationPanelFullWidth;

    @Inject
    public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
            QSTileHost qsTileHost,
@@ -571,15 +579,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    }

    @Override
    public void setTransitionToFullShadeAmount(float pxAmount, float progress) {
        boolean isTransitioningToFullShade = pxAmount > 0;
    public void setTransitionToFullShadeProgress(
            boolean isTransitioningToFullShade,
            @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction,
            @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) {
        if (isTransitioningToFullShade != mTransitioningToFullShade) {
            mTransitioningToFullShade = isTransitioningToFullShade;
            updateShowCollapsedOnKeyguard();
        }
        mFullShadeProgress = progress;
        mFullShadeProgress = qsTransitionFraction;
        setQsExpansion(mLastQSExpansion, mLastPanelFraction, mLastHeaderTranslation,
                isTransitioningToFullShade ? progress : mSquishinessFraction);
                isTransitioningToFullShade ? qsSquishinessFraction : mSquishinessFraction);
    }

    @Override
@@ -597,13 +607,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
                + mHeader.getPaddingBottom();
    }

    @Override
    public void setIsNotificationPanelFullWidth(boolean isFullWidth) {
        mIsNotificationPanelFullWidth = isFullWidth;
    }

    @Override
    public void setQsExpansion(float expansion, float panelExpansionFraction,
            float proposedTranslation, float squishinessFraction) {
        float headerTranslation = mTransitioningToFullShade ? 0 : proposedTranslation;
        float alphaProgress = mTransitioningToFullShade || mState == StatusBarState.KEYGUARD
                ? mFullShadeProgress : panelExpansionFraction;
        setAlphaAnimationProgress(mInSplitShade ? alphaProgress : 1);
        float alphaProgress = calculateAlphaProgress(panelExpansionFraction);
        setAlphaAnimationProgress(alphaProgress);
        mContainer.setExpansion(expansion);
        final float translationScaleY = (mInSplitShade
                ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1);
@@ -683,10 +697,43 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        } else if (progress > 0 && view.getVisibility() != View.VISIBLE) {
            view.setVisibility((View.VISIBLE));
        }
        float alpha = mQSPanelController.isBouncerInTransit()
                ? BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(progress)
                : ShadeInterpolation.getContentAlpha(progress);
        view.setAlpha(alpha);
        view.setAlpha(interpolateAlphaAnimationProgress(progress));
    }

    private float calculateAlphaProgress(float panelExpansionFraction) {
        if (mIsNotificationPanelFullWidth) {
            // Small screens. QS alpha is not animated.
            return 1;
        }
        if (mInSplitShade) {
            // Large screens in landscape.
            if (mTransitioningToFullShade || isKeyguardState()) {
                // Always use "mFullShadeProgress" on keyguard, because
                // "panelExpansionFractions" is always 1 on keyguard split shade.
                return mFullShadeProgress;
            } else {
                return panelExpansionFraction;
            }
        }
        // Large screens in portrait.
        if (mTransitioningToFullShade) {
            // Only use this value during the standard lock screen shade expansion. During the
            // "quick" expansion from top, this value is 0.
            return mFullShadeProgress;
        } else {
            return panelExpansionFraction;
        }
    }

    private float interpolateAlphaAnimationProgress(float progress) {
        if (mQSPanelController.isBouncerInTransit()) {
            return BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(progress);
        }
        if (isKeyguardState()) {
            // Alpha progress should be linear on lockscreen shade expansion.
            return progress;
        }
        return ShadeInterpolation.getContentAlpha(progress);
    }

    private void updateQsBounds() {
Loading