Add hide/show animations for action bar

Change-Id: I204cc744573fe040b4d37791a8eef1a65c88ee88
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index ce7ab84..3e19811 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -23,9 +23,9 @@
 import com.android.internal.widget.ActionBarView;
 
 import android.animation.Animator;
-import android.animation.ObjectAnimator;
 import android.animation.Animator.AnimatorListener;
 import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Dialog;
@@ -40,10 +40,10 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.Window;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 import android.widget.SpinnerAdapter;
-import android.widget.ViewAnimator;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -67,6 +67,7 @@
     private ActionBarView mActionView;
     private ActionBarContextView mUpperContextView;
     private LinearLayout mLowerContextView;
+    private View mContentView;
 
     private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();
 
@@ -88,7 +89,7 @@
 
     final Handler mHandler = new Handler();
 
-    private Animator mCurrentAnimation;
+    private Animator mCurrentAnim;
 
     final AnimatorListener[] mAfterAnimation = new AnimatorListener[] {
             new AnimatorListener() { // NORMAL_VIEW
@@ -101,7 +102,7 @@
                     if (mLowerContextView != null) {
                         mLowerContextView.removeAllViews();
                     }
-                    mCurrentAnimation = null;
+                    mCurrentAnim = null;
                     hideAllExcept(NORMAL_VIEW);
                 }
 
@@ -120,7 +121,7 @@
 
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    mCurrentAnimation = null;
+                    mCurrentAnim = null;
                     hideAllExcept(CONTEXT_VIEW);
                 }
 
@@ -134,9 +135,56 @@
             }
     };
 
+    final AnimatorListener mHideListener = new AnimatorListener() {
+        @Override
+        public void onAnimationStart(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            if (mContentView != null) {
+                mContentView.setTranslationY(0);
+            }
+            mContainerView.setVisibility(View.GONE);
+            mCurrentAnim = null;
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+        }
+    };
+
+    final AnimatorListener mShowListener = new AnimatorListener() {
+        @Override
+        public void onAnimationStart(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            mCurrentAnim = null;
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+        }
+    };
+
     public ActionBarImpl(Activity activity) {
         mActivity = activity;
-        init(activity.getWindow().getDecorView());
+        Window window = activity.getWindow();
+        View decor = window.getDecorView();
+        init(decor);
+        if (!mActivity.getWindow().hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) {
+            mContentView = decor.findViewById(android.R.id.content);
+        }
     }
 
     public ActionBarImpl(Dialog dialog) {
@@ -444,14 +492,45 @@
 
     @Override
     public void show() {
-        // TODO animate!
+        if (mCurrentAnim != null) {
+            mCurrentAnim.end();
+        }
+        if (mContainerView.getVisibility() == View.VISIBLE) {
+            return;
+        }
         mContainerView.setVisibility(View.VISIBLE);
+        mContainerView.setAlpha(0);
+        mContainerView.setTranslationY(-mContainerView.getHeight());
+        AnimatorSet anim = new AnimatorSet();
+        AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "translationY", 0))
+            .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 1));
+        if (mContentView != null) {
+            b.with(ObjectAnimator.ofFloat(mContentView, "translationY", -mContainerView.getHeight(), 0));
+        }
+        anim.addListener(mShowListener);
+        mCurrentAnim = anim;
+        anim.start();
     }
 
     @Override
     public void hide() {
-        // TODO animate!
-        mContainerView.setVisibility(View.GONE);
+        if (mCurrentAnim != null) {
+            mCurrentAnim.end();
+        }
+        if (mContainerView.getVisibility() == View.GONE) {
+            return;
+        }
+        mContainerView.setAlpha(1);
+        AnimatorSet anim = new AnimatorSet();
+        AnimatorSet.Builder b = anim.play(
+                ObjectAnimator.ofFloat(mContainerView, "translationY", -mContainerView.getHeight()))
+            .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 0));
+        if (mContentView != null) {
+            b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, -mContainerView.getHeight()));
+        }
+        anim.addListener(mHideListener);
+        mCurrentAnim = anim;
+        anim.start();
     }
 
     public boolean isShowing() {
@@ -459,10 +538,7 @@
     }
 
     private long animateTo(int viewIndex) {
-        // Don't wait for the current animation to finish.
-        if (mCurrentAnimation != null) {
-            mCurrentAnimation.end();
-        }
+        show();
 
         AnimatorSet set = new AnimatorSet();
 
@@ -492,7 +568,7 @@
 
         set.addListener(mAfterAnimation[viewIndex]);
 
-        mCurrentAnimation = set;
+        mCurrentAnim = set;
         set.start();
         return set.getDuration();
     }