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;
             }