Merge "Adding logging to track issue with apps pages. (Bug 6549598)" into jb-dev
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 92cabe5..db65a31 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -106,6 +106,7 @@
 
     private static String sDefaultFolderName;
     private static String sHintText;
+    private ObjectAnimator mOpenCloseAnimator;
 
     /**
      * Used to inflate the Workspace from XML.
@@ -417,7 +418,8 @@
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
-        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
+        final ObjectAnimator oa = mOpenCloseAnimator =
+            ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
             @Override
@@ -430,7 +432,7 @@
             @Override
             public void onAnimationEnd(Animator animation) {
                 mState = STATE_OPEN;
-
+                setLayerType(LAYER_TYPE_NONE, null);
                 Cling cling = mLauncher.showFirstRunFoldersCling();
                 if (cling != null) {
                     cling.bringToFront();
@@ -439,7 +441,16 @@
             }
         });
         oa.setDuration(mExpandDuration);
-        oa.start();
+        setLayerType(LAYER_TYPE_HARDWARE, null);
+        buildLayer();
+        post(new Runnable() {
+            public void run() {
+                // Check if the animator changed in the meantime
+                if (oa != mOpenCloseAnimator)
+                    return;
+                oa.start();
+            }
+        });
     }
 
     private void sendCustomAccessibilityEvent(int type, String text) {
@@ -465,12 +476,14 @@
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
-        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
+        final ObjectAnimator oa = mOpenCloseAnimator =
+                ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 onCloseComplete();
+                setLayerType(LAYER_TYPE_NONE, null);
                 mState = STATE_SMALL;
             }
             @Override
@@ -481,7 +494,16 @@
             }
         });
         oa.setDuration(mExpandDuration);
-        oa.start();
+        setLayerType(LAYER_TYPE_HARDWARE, null);
+        buildLayer();
+        post(new Runnable() {
+            public void run() {
+                // Check if the animator changed in the meantime
+                if (oa != mOpenCloseAnimator)
+                    return;
+                oa.start();
+            }
+        });
     }
 
     void notifyDataSetChanged() {
diff --git a/src/com/android/launcher2/SearchDropTargetBar.java b/src/com/android/launcher2/SearchDropTargetBar.java
index a01fd3a..77681a8 100644
--- a/src/com/android/launcher2/SearchDropTargetBar.java
+++ b/src/com/android/launcher2/SearchDropTargetBar.java
@@ -18,7 +18,6 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.graphics.Rect;
@@ -26,7 +25,6 @@
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
 import android.widget.FrameLayout;
 
 import com.android.launcher.R;
@@ -40,10 +38,10 @@
     private static final int sTransitionInDuration = 200;
     private static final int sTransitionOutDuration = 175;
 
-    private ObjectAnimator mDropTargetBarFadeInAnim;
-    private ObjectAnimator mDropTargetBarFadeOutAnim;
-    private ObjectAnimator mQSBSearchBarFadeInAnim;
-    private ObjectAnimator mQSBSearchBarFadeOutAnim;
+    private ObjectAnimator mDropTargetBarAnim;
+    private ObjectAnimator mQSBSearchBarAnim;
+    private static final AccelerateInterpolator sAccelerateInterpolator =
+            new AccelerateInterpolator();
 
     private boolean mIsSearchBarHidden;
     private View mQSBSearchBar;
@@ -75,28 +73,19 @@
         mDeleteDropTarget.setLauncher(launcher);
     }
 
-    // This sets up the view for the animation
     private void prepareStartAnimation(View v) {
-        // Enable the hw layers (which will be disabled in the onAnimationEnd callback below
+        // Enable the hw layers before the animation starts (will be disabled in the onAnimationEnd
+        // callback below)
         v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
         v.buildLayer();
     }
 
-    private void prepareAnimation(ObjectAnimator in, ObjectAnimator out, final View v) {
-        in.setInterpolator(new AccelerateInterpolator());
-        in.setDuration(sTransitionInDuration);
-        in.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                v.setVisibility(View.VISIBLE);
-            }
-        });
-        out.setInterpolator(new AccelerateInterpolator());
-        out.setDuration(sTransitionOutDuration);
-        out.addListener(new AnimatorListenerAdapter() {
+    private void setupAnimation(ObjectAnimator anim, final View v) {
+        anim.setInterpolator(sAccelerateInterpolator);
+        anim.setDuration(sTransitionInDuration);
+        anim.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
-                v.setVisibility(View.INVISIBLE);
                 v.setLayerType(View.LAYER_TYPE_NONE, null);
             }
         });
@@ -122,64 +111,55 @@
         // Create the various fade animations
         if (mEnableDropDownDropTargets) {
             mDropTargetBar.setTranslationY(-mBarHeight);
-            mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f);
-            mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
-                    -mBarHeight);
-            mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 0);
-            mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY",
+            mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
+                    -mBarHeight, 0f);
+            mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 0,
                     -mBarHeight);
         } else {
             mDropTargetBar.setAlpha(0f);
-            mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 1f);
-            mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f);
-            mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f);
-            mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
+            mDropTargetBarAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f, 1f);
+            mQSBSearchBarAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f, 0f);
         }
-        prepareAnimation(mDropTargetBarFadeInAnim, mDropTargetBarFadeOutAnim, mDropTargetBar);
-        prepareAnimation(mQSBSearchBarFadeInAnim, mQSBSearchBarFadeOutAnim, mQSBSearchBar);
+        setupAnimation(mDropTargetBarAnim, mDropTargetBar);
+        setupAnimation(mQSBSearchBarAnim, mQSBSearchBar);
     }
 
     public void finishAnimations() {
-        mDropTargetBarFadeInAnim.end();
-        mDropTargetBarFadeOutAnim.end();
-        mQSBSearchBarFadeInAnim.end();
-        mQSBSearchBarFadeOutAnim.end();
-    }
-
-    private void cancelSearchBarAnimations() {
-        mQSBSearchBarFadeInAnim.cancel();
-        mQSBSearchBarFadeOutAnim.cancel();
+        prepareStartAnimation(mDropTargetBar);
+        mDropTargetBarAnim.reverse();
+        prepareStartAnimation(mQSBSearchBar);
+        mQSBSearchBarAnim.reverse();
     }
 
     /*
      * Shows and hides the search bar.
      */
     public void showSearchBar(boolean animated) {
-        cancelSearchBarAnimations();
+        if (!mIsSearchBarHidden) return;
         if (animated) {
             prepareStartAnimation(mQSBSearchBar);
-            mQSBSearchBarFadeInAnim.start();
+            mQSBSearchBarAnim.reverse();
         } else {
-            mQSBSearchBar.setVisibility(View.VISIBLE);
+            mQSBSearchBarAnim.cancel();
             if (mEnableDropDownDropTargets) {
                 mQSBSearchBar.setTranslationY(0);
             } else {
-                mQSBSearchBar.setAlpha(1f);
+                mDropTargetBar.setAlpha(1f);
             }
         }
         mIsSearchBarHidden = false;
     }
     public void hideSearchBar(boolean animated) {
-        cancelSearchBarAnimations();
+        if (mIsSearchBarHidden) return;
         if (animated) {
             prepareStartAnimation(mQSBSearchBar);
-            mQSBSearchBarFadeOutAnim.start();
+            mQSBSearchBarAnim.start();
         } else {
-            mQSBSearchBar.setVisibility(View.INVISIBLE);
+            mQSBSearchBarAnim.cancel();
             if (mEnableDropDownDropTargets) {
-                mQSBSearchBar.setTranslationY(0);
+                mQSBSearchBar.setTranslationY(-mBarHeight);
             } else {
-                mQSBSearchBar.setAlpha(0f);
+                mDropTargetBar.setAlpha(0f);
             }
         }
         mIsSearchBarHidden = true;
@@ -202,12 +182,10 @@
     public void onDragStart(DragSource source, Object info, int dragAction) {
         // Animate out the QSB search bar, and animate in the drop target bar
         prepareStartAnimation(mDropTargetBar);
-        mDropTargetBarFadeOutAnim.cancel();
-        mDropTargetBarFadeInAnim.start();
+        mDropTargetBarAnim.start();
         if (!mIsSearchBarHidden) {
             prepareStartAnimation(mQSBSearchBar);
-            mQSBSearchBarFadeInAnim.cancel();
-            mQSBSearchBarFadeOutAnim.start();
+            mQSBSearchBarAnim.start();
         }
     }
 
@@ -220,12 +198,10 @@
         if (!mDeferOnDragEnd) {
             // Restore the QSB search bar, and animate out the drop target bar
             prepareStartAnimation(mDropTargetBar);
-            mDropTargetBarFadeInAnim.cancel();
-            mDropTargetBarFadeOutAnim.start();
+            mDropTargetBarAnim.reverse();
             if (!mIsSearchBarHidden) {
                 prepareStartAnimation(mQSBSearchBar);
-                mQSBSearchBarFadeOutAnim.cancel();
-                mQSBSearchBarFadeInAnim.start();
+                mQSBSearchBarAnim.reverse();
             }
         } else {
             mDeferOnDragEnd = false;