summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java42
1 files changed, 31 insertions, 11 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 7b9e71143f34..c22bd5cba6db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -140,7 +140,6 @@ public class NotificationStackScrollLayout extends ViewGroup
private boolean mSwipingInProgress;
private int mCurrentStackHeight = Integer.MAX_VALUE;
private final Paint mBackgroundPaint = new Paint();
- private final Path mBackgroundPath = new Path();
private final boolean mShouldDrawNotificationBackground;
private float mExpandedHeight;
@@ -376,6 +375,11 @@ public class NotificationStackScrollLayout extends ViewGroup
private View mForcedScroll;
private View mNeedingPulseAnimation;
private float mDarkAmount = 0f;
+
+ /**
+ * How fast the background scales in the X direction as a factor of the Y expansion.
+ */
+ private float mBackgroundXFactor = 1f;
private static final Property<NotificationStackScrollLayout, Float> DARK_AMOUNT =
new FloatProperty<NotificationStackScrollLayout>("darkAmount") {
@Override
@@ -548,7 +552,7 @@ public class NotificationStackScrollLayout extends ViewGroup
float inverseDark = 1 - mDarkAmount;
float yProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(inverseDark);
float xProgress = Interpolators.FAST_OUT_SLOW_IN
- .getInterpolation(inverseDark * 2f);
+ .getInterpolation(inverseDark * mBackgroundXFactor);
mBackgroundAnimationRect.set(
(int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress),
@@ -4028,21 +4032,37 @@ public class NotificationStackScrollLayout extends ViewGroup
return mDarkAmount;
}
+ /**
+ * Cancel any previous dark animations - to avoid race conditions - and creates a new one.
+ * This function also sets {@code mBackgroundXFactor} based on the current {@code mDarkAmount}.
+ */
private void startDarkAmountAnimation() {
- ObjectAnimator darkAnimator = ObjectAnimator.ofFloat(this, DARK_AMOUNT, mDarkAmount,
- mAmbientState.isDark() ? 1f : 0);
- darkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
- darkAnimator.setInterpolator(Interpolators.ALPHA_IN);
- darkAnimator.addListener(new AnimatorListenerAdapter() {
+ boolean dark = mAmbientState.isDark();
+ if (mDarkAmountAnimator != null) {
+ mDarkAmountAnimator.cancel();
+ }
+
+ long duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
+ // Longer animation when sleeping with more than 1 notification
+ if (dark && getNotGoneChildCount() > 2) {
+ duration *= 1.2f;
+ }
+
+ mDarkAmountAnimator = ObjectAnimator.ofFloat(this, DARK_AMOUNT, mDarkAmount,
+ dark ? 1f : 0);
+ // We only swap the scaling factor if we're fully dark or fully awake to avoid
+ // interpolation issues when playing with the power button.
+ if (mDarkAmount == 0 || mDarkAmount == 1) {
+ mBackgroundXFactor = dark ? 2.5f : 1.5f;
+ }
+ mDarkAmountAnimator.setDuration(duration);
+ mDarkAmountAnimator.setInterpolator(Interpolators.LINEAR);
+ mDarkAmountAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mDarkAmountAnimator = null;
}
});
- if (mDarkAmountAnimator != null) {
- mDarkAmountAnimator.cancel();
- }
- mDarkAmountAnimator = darkAnimator;
mDarkAmountAnimator.start();
}