diff options
10 files changed, 65 insertions, 38 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 a3d924fbad60..80634832acd9 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java @@ -197,26 +197,6 @@ public class Interpolators { return MathUtils.max(0.0f, (float) (1.0f - Math.exp(-4 * progress))); } - /** - * Interpolate alpha for notifications background scrim during shade expansion. - * @param fraction Shade expansion fraction - * @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 forUiContent) { - if (forUiContent) { - fraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction); - } else { - fraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction); - } - fraction = fraction * 1.2f - 0.2f; - if (fraction <= 0) { - return 0; - } else { - final float oneMinusFrac = 1f - fraction; - return (float) (1f - 0.5f * (1f - Math.cos(3.14159f * oneMinusFrac * oneMinusFrac))); - } - } - // Create the default emphasized interpolator private static PathInterpolator createEmphasizedInterpolator() { Path path = new Path(); diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ShadeInterpolation.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ShadeInterpolation.kt new file mode 100644 index 000000000000..0ee2bfea55c5 --- /dev/null +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ShadeInterpolation.kt @@ -0,0 +1,37 @@ +package com.android.systemui.animation + +import android.util.MathUtils + +object ShadeInterpolation { + + /** + * Interpolate alpha for notification background scrim during shade expansion. + * @param fraction Shade expansion fraction + */ + @JvmStatic + fun getNotificationScrimAlpha(fraction: Float): Float { + val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction) + return interpolateEaseInOut(mappedFraction) + } + + /** + * Interpolate alpha for shade content during shade expansion. + * @param fraction Shade expansion fraction + */ + @JvmStatic + fun getContentAlpha(fraction: Float): Float { + val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction) + return interpolateEaseInOut(mappedFraction) + } + + private fun interpolateEaseInOut(fraction: Float): Float { + val mappedFraction = fraction * 1.2f - 0.2f + return if (mappedFraction <= 0) { + 0f + } else { + val oneMinusFrac = 1f - mappedFraction + (1f - 0.5f * (1f - Math.cos((3.14159f * oneMinusFrac * oneMinusFrac).toDouble()))) + .toFloat() + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index f300efca8a23..7a78601da355 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -39,6 +39,7 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; +import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.FalsingManager; @@ -573,7 +574,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } else if (progress > 0 && view.getVisibility() != View.VISIBLE) { view.setVisibility((View.VISIBLE)); } - float alpha = Interpolators.getNotificationScrimAlpha(progress, true /* uiContent */); + float alpha = ShadeInterpolation.getContentAlpha(progress); view.setAlpha(alpha); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index d4f54e1cd7b1..5648741e3caf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -32,6 +32,7 @@ import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.Dumpable import com.android.systemui.animation.Interpolators +import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController @@ -184,12 +185,12 @@ class NotificationShadeDepthController @Inject constructor( val animationRadius = MathUtils.constrain(shadeAnimation.radius, blurUtils.minBlurRadius.toFloat(), blurUtils.maxBlurRadius.toFloat()) val expansionRadius = blurUtils.blurRadiusOfRatio( - Interpolators.getNotificationScrimAlpha( - if (shouldApplyShadeBlur()) shadeExpansion else 0f, false)) + ShadeInterpolation.getNotificationScrimAlpha( + if (shouldApplyShadeBlur()) shadeExpansion else 0f)) var combinedBlur = (expansionRadius * INTERACTION_BLUR_FRACTION + animationRadius * ANIMATION_BLUR_FRACTION) - val qsExpandedRatio = Interpolators.getNotificationScrimAlpha(qsPanelExpansion, - false /* notification */) * shadeExpansion + val qsExpandedRatio = ShadeInterpolation.getNotificationScrimAlpha(qsPanelExpansion) * + shadeExpansion combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsExpandedRatio)) combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress)) var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 3bd7dd339a9e..0b93fff82725 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -31,7 +31,7 @@ import android.view.animation.PathInterpolator; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; -import com.android.systemui.animation.Interpolators; +import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; @@ -168,8 +168,8 @@ public class NotificationShelf extends ActivatableNotificationView implements viewState.clipTopAmount = 0; if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) { - viewState.alpha = Interpolators.getNotificationScrimAlpha( - ambientState.getExpansionFraction(), true /* notification */); + float expansion = ambientState.getExpansionFraction(); + viewState.alpha = ShadeInterpolation.getContentAlpha(expansion); } else { viewState.alpha = 1f - ambientState.getHideAmount(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 7cbe78f16ceb..0accce82b797 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -27,7 +27,7 @@ import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import com.android.systemui.R; -import com.android.systemui.animation.Interpolators; +import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -408,8 +408,8 @@ public class StackScrollAlgorithm { viewState.alpha = 1f - ambientState.getHideAmount(); } else if (ambientState.isExpansionChanging()) { // Adjust alpha for shade open & close. - viewState.alpha = Interpolators.getNotificationScrimAlpha( - ambientState.getExpansionFraction(), true /* notification */); + float expansion = ambientState.getExpansionFraction(); + viewState.alpha = ShadeInterpolation.getContentAlpha(expansion); } if (ambientState.isShadeExpanded() && view.mustStayOnScreen() 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 54a61402b311..9dea5bc09e10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1247,6 +1247,7 @@ public class NotificationPanelViewController extends PanelViewController { stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded; } + mSplitShadeHeaderController.setShadeExpandedFraction(getExpandedFraction()); mNotificationStackScrollLayoutController.setIntrinsicPadding(stackScrollerPadding); mKeyguardBottomArea.setAntiBurnInOffsetX(mClockPositionResult.clockX); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index a5cea06ad893..9fbc3328cce7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -47,7 +47,7 @@ import com.android.settingslib.Utils; import com.android.systemui.DejankUtils; import com.android.systemui.Dumpable; import com.android.systemui.R; -import com.android.systemui.animation.Interpolators; +import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; @@ -579,8 +579,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (isNaN(expansionFraction)) { return; } - expansionFraction = Interpolators - .getNotificationScrimAlpha(expansionFraction, false /* notification */); + expansionFraction = ShadeInterpolation.getNotificationScrimAlpha(expansionFraction); boolean qsBottomVisible = qsPanelBottomY > 0; if (mQsExpansion != expansionFraction || mQsBottomVisible != qsBottomVisible) { mQsExpansion = expansionFraction; @@ -915,8 +914,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - return Interpolators.getNotificationScrimAlpha( - mPanelExpansionFraction, false /* notification */); + return ShadeInterpolation.getNotificationScrimAlpha(mPanelExpansionFraction); } private void setScrimAlpha(ScrimView scrim, float alpha) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt index 4b7fe4e7ea29..a7ecd0619d26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone import android.view.View import com.android.systemui.R +import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.flags.FeatureFlags @@ -53,6 +54,14 @@ class SplitShadeHeaderController @Inject constructor( updateVisibility() } + var shadeExpandedFraction = -1f + set(value) { + if (visible && field != value) { + statusBar.alpha = ShadeInterpolation.getContentAlpha(value) + field = value + } + } + init { batteryMeterViewController.init() val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt index e5ae65f2dd17..dbd5168386de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt @@ -24,7 +24,7 @@ import android.view.View import android.view.ViewRootImpl import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.animation.Interpolators +import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.phone.BiometricUnlockController @@ -208,7 +208,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { notificationShadeDepthController.onPanelExpansionChanged(1f, tracking = false) notificationShadeDepthController.updateBlurCallback.doFrame(0) verify(wallpaperController).setNotificationShadeZoom( - eq(Interpolators.getNotificationScrimAlpha(0.25f, false /* notifications */))) + eq(ShadeInterpolation.getNotificationScrimAlpha(0.25f))) } @Test |