Improved the interpolators of the icon appearing
The interpolator has now a slight overshoot to it again.
Change-Id: I4253bf4b2cf9d471e3aa8c9483c9bcb88c2b3032
Test: add notifications, observe icon movement
Bug: 32437839
(cherry picked from commit 061d90729bba582395e9050898dab20fd434cf66)
diff --git a/packages/SystemUI/src/com/android/systemui/Interpolators.java b/packages/SystemUI/src/com/android/systemui/Interpolators.java
index fd3bd92..9b5577c 100644
--- a/packages/SystemUI/src/com/android/systemui/Interpolators.java
+++ b/packages/SystemUI/src/com/android/systemui/Interpolators.java
@@ -23,6 +23,8 @@
import android.view.animation.LinearInterpolator;
import android.view.animation.PathInterpolator;
+import com.android.systemui.statusbar.stack.HeadsUpAppearInterpolator;
+
/**
* Utility class to receive interpolators from
*/
@@ -37,6 +39,8 @@
public static final Interpolator ACCELERATE_DECELERATE = new AccelerateDecelerateInterpolator();
public static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f);
public static final Interpolator CUSTOM_40_40 = new PathInterpolator(0.4f, 0f, 0.6f, 1f);
+ public static final Interpolator HEADS_UP_APPEAR = new HeadsUpAppearInterpolator();
+ public static final Interpolator ICON_OVERSHOT = new PathInterpolator(0.4f, 0f, 0.2f, 1.4f);
/**
* Interpolator to be used when animating a move based on a click. Pair with enough duration.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index e99c641..4b0f454 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -22,13 +22,17 @@
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
+import android.util.Property;
import android.view.View;
+import android.view.animation.Interpolator;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.AlphaOptimizedFrameLayout;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.stack.AnimationFilter;
import com.android.systemui.statusbar.stack.AnimationProperties;
+import com.android.systemui.statusbar.stack.HeadsUpAppearInterpolator;
import com.android.systemui.statusbar.stack.ViewState;
import java.util.HashMap;
@@ -65,7 +69,9 @@
public AnimationFilter getAnimationFilter() {
return mAnimationFilter;
}
- }.setDuration(CANNED_ANIMATION_DURATION);
+
+ }.setDuration(CANNED_ANIMATION_DURATION)
+ .setCustomInterpolator(View.TRANSLATION_Y, Interpolators.ICON_OVERSHOT);
private static final AnimationProperties mTempProperties = new AnimationProperties() {
private AnimationFilter mAnimationFilter = new AnimationFilter();
@@ -440,8 +446,11 @@
AnimationFilter animationFilter = mTempProperties.getAnimationFilter();
animationFilter.reset();
animationFilter.combineFilter(ICON_ANIMATION_PROPERTIES.getAnimationFilter());
+ mTempProperties.resetCustomInterpolators();
+ mTempProperties.combineCustomInterpolators(ICON_ANIMATION_PROPERTIES);
if (animationProperties != null) {
animationFilter.combineFilter(animationProperties.getAnimationFilter());
+ mTempProperties.combineCustomInterpolators(animationProperties);
}
animationProperties = mTempProperties;
animationProperties.setDuration(CANNED_ANIMATION_DURATION);
@@ -455,6 +464,7 @@
AnimationFilter animationFilter = mTempProperties.getAnimationFilter();
animationFilter.reset();
animationFilter.animateX();
+ mTempProperties.resetCustomInterpolators();
animationProperties = mTempProperties;
animationProperties.setDuration(CANNED_ANIMATION_DURATION);
animate = true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java
index 0de774d..ebb0a6d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationProperties.java
@@ -17,16 +17,20 @@
package com.android.systemui.statusbar.stack;
import android.animation.AnimatorListenerAdapter;
+import android.util.ArrayMap;
import android.util.Property;
import android.view.View;
import android.view.animation.Interpolator;
+import java.util.HashMap;
+
/**
* Properties for a View animation
*/
public class AnimationProperties {
public long duration;
public long delay;
+ private ArrayMap<Property, Interpolator> mInterpolatorMap;
/**
* @return an animation filter for this animation.
@@ -50,7 +54,29 @@
* Get a custom interpolator for a property instead of the normal one.
*/
public Interpolator getCustomInterpolator(View child, Property property) {
- return null;
+ return mInterpolatorMap != null ? mInterpolatorMap.get(property) : null;
+ }
+
+
+ public void combineCustomInterpolators(AnimationProperties iconAnimationProperties) {
+ ArrayMap<Property, Interpolator> map = iconAnimationProperties.mInterpolatorMap;
+ if (map != null) {
+ if (mInterpolatorMap == null) {
+ mInterpolatorMap = new ArrayMap<>();
+ }
+ mInterpolatorMap.putAll(map);
+ }
+ }
+
+ /**
+ * Set a custom interpolator to use for all views for a property.
+ */
+ public AnimationProperties setCustomInterpolator(Property property, Interpolator interpolator) {
+ if (mInterpolatorMap == null) {
+ mInterpolatorMap = new ArrayMap<>();
+ }
+ mInterpolatorMap.put(property, interpolator);
+ return this;
}
public AnimationProperties setDuration(long duration) {
@@ -62,4 +88,9 @@
this.delay = delay;
return this;
}
+
+ public AnimationProperties resetCustomInterpolators() {
+ mInterpolatorMap = null;
+ return this;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 1f29b4f..3f9d17d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -53,7 +53,6 @@
public static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2;
public static final int ANIMATION_DELAY_HEADS_UP = 120;
- private final Interpolator mHeadsUpAppearInterpolator;
private final int mGoToFullShadeAppearingTranslation;
private final ExpandableViewState mTmpState = new ExpandableViewState();
private final AnimationProperties mAnimationProperties;
@@ -83,7 +82,6 @@
mGoToFullShadeAppearingTranslation =
hostLayout.getContext().getResources().getDimensionPixelSize(
R.dimen.go_to_full_shade_appearing_translation);
- mHeadsUpAppearInterpolator = new HeadsUpAppearInterpolator();
mAnimationProperties = new AnimationProperties() {
@Override
public AnimationFilter getAnimationFilter() {
@@ -103,7 +101,7 @@
@Override
public Interpolator getCustomInterpolator(View child, Property property) {
if (mHeadsUpAppearChildren.contains(child) && View.TRANSLATION_Y.equals(property)) {
- return mHeadsUpAppearInterpolator;
+ return Interpolators.HEADS_UP_APPEAR;
}
return null;
}