Merge "Fix some action bar logic" into lmp-dev
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 7a9c4c2..cb01e8e 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -761,6 +761,7 @@
             mSearchView.setText(mPendingSearchViewQuery);
             mPendingSearchViewQuery = null;
         }
+        mActionBarController.restoreActionBarOffset();
         return false;
     }
 
@@ -1160,7 +1161,7 @@
 
     @Override
     public void setActionBarHideOffset(int hideOffset) {
-        getActionBar().setHideOffset(hideOffset);
+        mActionBarController.setHideOffset(hideOffset);
     }
 
     /**
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index 04e8d8f..966d265 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -76,6 +76,7 @@
     public interface HostInterface {
         public void showCallHistory();
         public int getActionBarHeight();
+        public void setActionBarHideOffset(int offset);
     }
 
     private ActionBar mActionBar;
@@ -152,7 +153,8 @@
 
                 final int availableActionBarHeight =
                         Math.min(mActionBar.getHeight(), topPaneHeight);
-                mActionBar.setHideOffset(mActionBar.getHeight() - availableActionBarHeight);
+                ((HostInterface) getActivity()).setActionBarHideOffset(
+                        mActionBar.getHeight() - availableActionBarHeight);
 
                 if (!mActionBar.isShowing()) {
                     mActionBar.show();
diff --git a/src/com/android/dialer/widget/ActionBarController.java b/src/com/android/dialer/widget/ActionBarController.java
index 4f1e2e6..265c03f 100644
--- a/src/com/android/dialer/widget/ActionBarController.java
+++ b/src/com/android/dialer/widget/ActionBarController.java
@@ -4,6 +4,7 @@
 
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.app.ActionBar;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -31,12 +32,12 @@
     private final AnimationCallback mFadeOutCallback = new AnimationCallback() {
         @Override
         public void onAnimationEnd() {
-            slideActionBarUp(false);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
 
         @Override
         public void onAnimationCancel() {
-            slideActionBarUp(false);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
     };
 
@@ -45,8 +46,7 @@
         public boolean hasSearchQuery();
         public boolean shouldShowActionBar();
         public int getActionBarHeight();
-        public int getActionBarHideOffset();
-        public void setActionBarHideOffset(int hideOffset);
+        public ActionBar getActionBar();
     }
 
     public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) {
@@ -55,13 +55,6 @@
     }
 
     /**
-     * @return The offset the action bar is being translated upwards by
-     */
-    public int getHideOffset() {
-        return mActivityUi.getActionBarHideOffset();
-    }
-
-    /**
      * @return Whether or not the action bar is currently showing (both slid down and visible)
      */
     public boolean isActionBarShowing() {
@@ -97,9 +90,9 @@
         }
 
         if (mActivityUi.shouldShowActionBar()) {
-            slideActionBarDown(false /* animate */);
+            slideActionBar(false /* slideUp */, false /* animate */);
         } else {
-            slideActionBarUp(false /* animate */);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
     }
 
@@ -122,7 +115,7 @@
                 if (!mSearchBox.isExpanded()) {
                     mSearchBox.expand(false /* animate */, false /* requestFocus */);
                 }
-                slideActionBarDown(true /* animate */);
+                slideActionBar(false /* slideUp */, true /* animate */);
             } else {
                 mSearchBox.fadeIn();
             }
@@ -138,59 +131,51 @@
             Log.d(TAG, "OnDialpadUp: isInSearchUi " + mActivityUi.isInSearchUi());
         }
         if (mActivityUi.isInSearchUi()) {
-            slideActionBarUp(true);
+            slideActionBar(true /* slideUp */, true /* animate */);
         } else {
             // From the lists fragment
             mSearchBox.fadeOut(mFadeOutCallback);
         }
     }
 
-    public void slideActionBarUp(boolean animate) {
+    public void slideActionBar(boolean slideUp, boolean animate) {
         if (DEBUG) {
-            Log.d(TAG, "Sliding actionBar up - animate: " + animate);
+            Log.d(TAG, "Sliding actionBar - up: " + slideUp + " animate: " + animate);
         }
         if (animate) {
-            ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
+            ValueAnimator animator =
+                    slideUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
             animator.addUpdateListener(new AnimatorUpdateListener() {
                 @Override
                 public void onAnimationUpdate(ValueAnimator animation) {
                     final float value = (float) animation.getAnimatedValue();
-                    mActivityUi.setActionBarHideOffset(
+                    setHideOffset(
                             (int) (mActivityUi.getActionBarHeight() * value));
                 }
             });
             animator.start();
         } else {
-           mActivityUi.setActionBarHideOffset(mActivityUi.getActionBarHeight());
+           setHideOffset(slideUp ? mActivityUi.getActionBarHeight() : 0);
         }
-        mIsActionBarSlidUp = true;
-    }
-
-    public void slideActionBarDown(boolean animate) {
-        if (DEBUG) {
-            Log.d(TAG, "Sliding actionBar down - animate: " + animate);
-        }
-        if (animate) {
-            ValueAnimator animator = ValueAnimator.ofFloat(1, 0);
-            animator.addUpdateListener(new AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    final float value = (float) animation.getAnimatedValue();
-                    mActivityUi.setActionBarHideOffset(
-                            (int) (mActivityUi.getActionBarHeight() * value));
-                }
-            });
-            animator.start();
-        } else {
-            mActivityUi.setActionBarHideOffset(0);
-        }
-        mIsActionBarSlidUp = false;
+        mIsActionBarSlidUp = slideUp;
     }
 
     public void setAlpha(float alphaValue) {
         mSearchBox.animate().alpha(alphaValue).start();
     }
 
+    public void setHideOffset(int offset) {
+        mIsActionBarSlidUp = offset >= mActivityUi.getActionBarHeight();
+        mActivityUi.getActionBar().setHideOffset(offset);
+    }
+
+    /**
+     * @return The offset the action bar is being translated upwards by
+     */
+    public int getHideOffset() {
+        return mActivityUi.getActionBar().getHideOffset();
+    }
+
     /**
      * Saves the current state of the action bar into a provided {@link Bundle}
      */
@@ -201,15 +186,10 @@
     }
 
     /**
-     * Restores the action bar state from a provided {@link Bundle}
+     * Restores the action bar state from a provided {@link Bundle}.
      */
     public void restoreInstanceState(Bundle inState) {
         mIsActionBarSlidUp = inState.getBoolean(KEY_IS_SLID_UP);
-        if (mIsActionBarSlidUp) {
-            slideActionBarUp(false);
-        } else {
-            slideActionBarDown(false);
-        }
 
         final boolean isSearchBoxFadedOut = inState.getBoolean(KEY_IS_FADED_OUT);
         if (isSearchBoxFadedOut) {
@@ -230,6 +210,14 @@
         }
     }
 
+    /**
+     * This should be called after onCreateOptionsMenu has been called, when the actionbar has
+     * been laid out and actually has a height.
+     */
+    public void restoreActionBarOffset() {
+        slideActionBar(mIsActionBarSlidUp /* slideUp */, false /* animate */);
+    }
+
     @VisibleForTesting
     public boolean getIsActionBarSlidUp() {
         return mIsActionBarSlidUp;
diff --git a/tests/src/com/android/dialer/widget/ActionBarControllerTest.java b/tests/src/com/android/dialer/widget/ActionBarControllerTest.java
index c67ea35..cafa747 100644
--- a/tests/src/com/android/dialer/widget/ActionBarControllerTest.java
+++ b/tests/src/com/android/dialer/widget/ActionBarControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.widget;
 
+import android.app.ActionBar;
 import android.content.Context;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -57,13 +58,8 @@
         }
 
         @Override
-        public int getActionBarHideOffset() {
-            return actionBarHideOffset;
-        }
-
-        @Override
-        public void setActionBarHideOffset(int hideOffset) {
-            actionBarHideOffset = hideOffset;
+        public ActionBar getActionBar() {
+            return null;
         }
     }
 
@@ -139,7 +135,7 @@
         assertActionBarState(false, false, false);
 
         // No search query typed in the dialpad, but action bar was not showing before
-        mActionBarController.slideActionBarUp(false);
+        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
         mActivityUi.shouldShowActionBar = false;
         mSearchBox.setVisible(false);
         mActionBarController.onDialpadDown();
@@ -147,7 +143,7 @@
 
         // Something typed in the dialpad - so remain in search UI and slide the expanded search
         // box down
-        mActionBarController.slideActionBarUp(false);
+        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
         mActivityUi.shouldShowActionBar = true;
         mActivityUi.hasSearchQuery= true;
         mSearchBox.setVisible(false);
@@ -168,7 +164,7 @@
         mActivityUi.hasSearchQuery = true;
         mSearchBox.expand(true, false);
         mSearchBox.setVisible(true);
-        mActionBarController.slideActionBarUp(false);
+        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
         mActionBarController.onDialpadUp();
         assertActionBarState(true, false, true);
     }