From f38e4ae60bae04076cf855b03992927052b8dc1e Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 7 Oct 2021 16:27:49 -0700 Subject: [PATCH] Animate QS alpha on split shade pull down When pulling down the shade in split mode, the quick settings alpha should be directly connected to the drag down gesture and the same that we have for the notification shade. Test: manual Bug: 200804740 Fixes: 196722669 Change-Id: I6532c8a78826a5b60609dc66557abc49a3f140c5 --- .../systemui/animation/Interpolators.java | 6 +-- .../com/android/systemui/plugins/qs/QS.java | 15 ++++-- .../com/android/systemui/qs/QSAnimator.java | 14 ----- .../com/android/systemui/qs/QSFragment.java | 51 ++++++++++++------- .../LockscreenShadeTransitionController.kt | 5 +- .../NotificationPanelViewController.java | 6 +-- ...LockscreenShadeTransitionControllerTest.kt | 4 +- 7 files changed, 56 insertions(+), 45 deletions(-) diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java index 27658824933ae..a3d924fbad605 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java @@ -200,10 +200,10 @@ public class Interpolators { /** * Interpolate alpha for notifications background scrim during shade expansion. * @param fraction Shade expansion fraction - * @param forNotification If we want the alpha of the notification shade or the scrim. + * @param forUiContent If we want the alpha of the scrims, or ui that's on top of them. */ - public static float getNotificationScrimAlpha(float fraction, boolean forNotification) { - if (forNotification) { + public static float getNotificationScrimAlpha(float fraction, boolean forUiContent) { + if (forUiContent) { fraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction); } else { fraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction); diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java index a03d84956ddc4..757dc2ec807d5 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java @@ -52,7 +52,16 @@ public interface QS extends FragmentBase { boolean isShowingDetail(); void closeDetail(); void animateHeaderSlidingOut(); - void setQsExpansion(float qsExpansionFraction, float headerTranslation); + + /** + * Asks QS to update its presentation, according to {@code NotificationPanelViewController}. + * + * @param qsExpansionFraction How much each UI element in QS should be expanded (QQS to QS.) + * @param panelExpansionFraction Whats the expansion of the whole shade. + * @param headerTranslation How much we should vertically translate QS. + */ + void setQsExpansion(float qsExpansionFraction, float panelExpansionFraction, + float headerTranslation); void setHeaderListening(boolean listening); void notifyCustomizeChanged(); void setContainerController(QSContainerController controller); @@ -75,13 +84,13 @@ public interface QS extends FragmentBase { /** * If QS should translate as we pull it down, or if it should be static. */ - void setTranslateWhileExpanding(boolean shouldTranslate); + 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. */ - default void setTransitionToFullShadeAmount(float pxAmount, boolean animated) {} + default void setTransitionToFullShadeAmount(float pxAmount, float progress) {} /** * A rounded corner clipping that makes QS feel as if it were behind everything. diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index bfb63ea5e7c3e..90d3448ac1eff 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -35,7 +35,6 @@ import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.qs.TouchAnimator.Listener; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.tileimpl.HeightOverrideable; -import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import com.android.wm.shell.animation.Interpolators; @@ -170,19 +169,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha } } - void startAlphaAnimation(boolean show) { - if (show == mToShowing) { - return; - } - mToShowing = show; - if (show) { - CrossFadeHelper.fadeIn(mQs.getView(), QQS_FADE_IN_DURATION, 0 /* delay */); - } else { - CrossFadeHelper.fadeOut(mQs.getView(), QQS_FADE_OUT_DURATION, 0 /* delay */, - null /* endRunnable */); - } - } - /** * Sets whether or not the keyguard is currently being shown with a collapsed header. */ diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index ad3135e1ae1c5..17c2fd04765c5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -90,6 +90,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private int mLayoutDirection; private QSFooter mFooter; private float mLastQSExpansion = -1; + private float mLastPanelFraction; private boolean mQsDisabled; private ImageView mQsDragHandler; @@ -121,7 +122,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca * When true, QS will translate from outside the screen. It will be clipped with parallax * otherwise. */ - private boolean mTranslateWhileExpanding; + private boolean mInSplitShade; private boolean mPulseExpanding; /** @@ -136,6 +137,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private DumpManager mDumpManager; + /** + * Progress of pull down from the center of the lock screen. + * @see com.android.systemui.statusbar.LockscreenShadeTransitionController + */ + private float mFullShadeProgress; + @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, InjectionInflationController injectionInflater, QSTileHost qsTileHost, @@ -227,7 +234,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { boolean sizeChanged = (oldTop - oldBottom) != (top - bottom); if (sizeChanged) { - setQsExpansion(mLastQSExpansion, mLastHeaderTranslation); + setQsExpansion(mLastQSExpansion, mLastPanelFraction, + mLastHeaderTranslation); } }); mQSPanelController.setUsingHorizontalLayoutChangeListener( @@ -409,7 +417,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSAnimator.setShowCollapsedOnKeyguard(showCollapsed); } if (!showCollapsed && isKeyguardState()) { - setQsExpansion(mLastQSExpansion, 0); + setQsExpansion(mLastQSExpansion, mLastPanelFraction, 0); } } } @@ -477,33 +485,30 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } @Override - public void setTranslateWhileExpanding(boolean shouldTranslate) { - mTranslateWhileExpanding = shouldTranslate; - mQSAnimator.setTranslateWhileExpanding(shouldTranslate); + public void setInSplitShade(boolean inSplitShade) { + mInSplitShade = inSplitShade; + mQSAnimator.setTranslateWhileExpanding(inSplitShade); } @Override - public void setTransitionToFullShadeAmount(float pxAmount, boolean animated) { + public void setTransitionToFullShadeAmount(float pxAmount, float progress) { boolean isTransitioningToFullShade = pxAmount > 0; if (isTransitioningToFullShade != mTransitioningToFullShade) { mTransitioningToFullShade = isTransitioningToFullShade; updateShowCollapsedOnKeyguard(); - setQsExpansion(mLastQSExpansion, mLastHeaderTranslation); } + mFullShadeProgress = progress; + setQsExpansion(mLastQSExpansion, mLastPanelFraction, mLastHeaderTranslation); } @Override - public void setQsExpansion(float expansion, float proposedTranslation) { - if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + proposedTranslation); + public void setQsExpansion(float expansion, float panelExpansionFraction, + float proposedTranslation) { float headerTranslation = mTransitioningToFullShade ? 0 : proposedTranslation; - if (mQSAnimator != null) { - final boolean showQSOnLockscreen = expansion > 0; - final boolean showQSUnlocked = headerTranslation == 0 || !mTranslateWhileExpanding; - mQSAnimator.startAlphaAnimation(showQSOnLockscreen || showQSUnlocked - || mTransitioningToFullShade); - } + float progress = mTransitioningToFullShade ? mFullShadeProgress : panelExpansionFraction; + setAlphaAnimationProgress(mInSplitShade ? progress : 1); mContainer.setExpansion(expansion); - final float translationScaleY = (mTranslateWhileExpanding + final float translationScaleY = (mInSplitShade ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard; if (!mHeaderAnimating && !headerWillBeAnimating()) { @@ -520,6 +525,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca return; } mLastHeaderTranslation = headerTranslation; + mLastPanelFraction = panelExpansionFraction; mLastQSExpansion = expansion; mLastKeyguardAndExpanded = onKeyguardAndExpanded; mLastViewHeight = currentHeight; @@ -561,6 +567,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca updateMediaPositions(); } + private void setAlphaAnimationProgress(float progress) { + final View view = getView(); + if (progress == 0 && view.getVisibility() != View.INVISIBLE) { + view.setVisibility(View.INVISIBLE); + } else if (progress > 0 && view.getVisibility() != View.VISIBLE) { + view.setVisibility((View.VISIBLE)); + } + float alpha = Interpolators.getNotificationScrimAlpha(progress, true /* uiContent */); + view.setAlpha(alpha); + } + private void updateQsBounds() { if (mLastQSExpansion == 1.0f) { // Fully expanded, let's set the layout bounds as clip bounds. This is necessary because diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index ca18b076b1e95..dca7f70d34707 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -298,9 +298,8 @@ class LockscreenShadeTransitionController @Inject constructor( nsslController.setTransitionToFullShadeAmount(field) notificationPanelController.setTransitionToFullShadeAmount(field, false /* animate */, 0 /* delay */) - // TODO: appear qs also in split shade - val qsAmount = if (useSplitShade) 0f else field - qS.setTransitionToFullShadeAmount(qsAmount, false /* animate */) + val progress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance) + qS.setTransitionToFullShadeAmount(field, progress) // TODO: appear media also in split shade val mediaAmount = if (useSplitShade) 0f else field mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 392b7ba0d13e5..d09a89e5adc20 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1091,7 +1091,7 @@ public class NotificationPanelViewController extends PanelViewController { Utils.shouldUseSplitNotificationShade(mResources); mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade); if (mQs != null) { - mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade); + mQs.setInSplitShade(mShouldUseSplitNotificationShade); } int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight : @@ -2344,7 +2344,7 @@ public class NotificationPanelViewController extends PanelViewController { private void updateQsExpansion() { if (mQs == null) return; float qsExpansionFraction = computeQsExpansionFraction(); - mQs.setQsExpansion(qsExpansionFraction, getHeaderTranslation()); + mQs.setQsExpansion(qsExpansionFraction, getExpandedFraction(), getHeaderTranslation()); mMediaHierarchyManager.setQsExpansion(qsExpansionFraction); int qsPanelBottomY = calculateQsBottomPosition(qsExpansionFraction); mScrimController.setQsPosition(qsExpansionFraction, qsPanelBottomY); @@ -3607,7 +3607,7 @@ public class NotificationPanelViewController extends PanelViewController { mQs.setExpandClickListener(mOnClickListener); mQs.setHeaderClickable(isQsExpansionEnabled()); mQs.setOverscrolling(mStackScrollerOverscrolling); - mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade); + mQs.setInSplitShade(mShouldUseSplitNotificationShade); // recompute internal state when qspanel height changes mQs.getView().addOnLayoutChangeListener( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index c50296be94f39..793851160dc2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -209,7 +209,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { verify(scrimController, never()).setTransitionToFullShadeProgress(anyFloat()) verify(notificationPanelController, never()).setTransitionToFullShadeAmount(anyFloat(), anyBoolean(), anyLong()) - verify(qS, never()).setTransitionToFullShadeAmount(anyFloat(), anyBoolean()) + verify(qS, never()).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) } @Test @@ -220,7 +220,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { verify(scrimController).setTransitionToFullShadeProgress(anyFloat()) verify(notificationPanelController).setTransitionToFullShadeAmount(anyFloat(), anyBoolean(), anyLong()) - verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyBoolean()) + verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) verify(depthController).transitionToFullShadeProgress = anyFloat() } }