Merge "Fix issue with extra empty screen left over after widget add cancel (issue 10865959)" into jb-ub-now-indigo-rose
diff --git a/res/drawable-hdpi/ic_allapps_pressed.png b/res/drawable-hdpi/ic_allapps_pressed.png
index bdc7baa..863eeba 100644
--- a/res/drawable-hdpi/ic_allapps_pressed.png
+++ b/res/drawable-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed.png b/res/drawable-mdpi/ic_allapps_pressed.png
index 35a9683..3bd87b1 100644
--- a/res/drawable-mdpi/ic_allapps_pressed.png
+++ b/res/drawable-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png
index 20bec4f..d678f02 100644
--- a/res/drawable-xhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed.png b/res/drawable-xxhdpi/ic_allapps_pressed.png
index 752070d..77b45ae 100644
--- a/res/drawable-xxhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xxhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml
index d01e2eb..5d5f33b 100644
--- a/res/layout/user_folder.xml
+++ b/res/layout/user_folder.xml
@@ -45,7 +45,7 @@
         android:hint="@string/folder_hint_text"
         android:textSize="14sp"
         android:textColor="#ff777777"
-        android:textColorHighlight="#ff333333"
+        android:textColorHighlight="#ffCCCCCC"
         android:textCursorDrawable="@null"
         android:gravity="center_horizontal"
         android:singleLine="true"
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index 1f876fd..2aab64d 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -25,6 +25,7 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.TextView;
@@ -175,6 +176,16 @@
         }
     }
 
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        // We don't want any clicks to go through to the hotseat unless the workspace is in
+        // the normal state.
+        if (mLauncher.getWorkspace().isSmall()) {
+            return true;
+        }
+        return false;
+    }
+
     void addAllAppsFolder(IconCache iconCache,
             ArrayList<AppInfo> allApps, ArrayList<ComponentName> onWorkspace,
             Launcher launcher, Workspace workspace) {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 66d4410..688acaf 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -17,6 +17,7 @@
 package com.android.launcher3;
 
 import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.LayoutTransition;
@@ -441,6 +442,13 @@
         setLayoutTransition(mLayoutTransition);
     }
 
+    void enableLayoutTransitions() {
+        setLayoutTransition(mLayoutTransition);
+    }
+    void disableLayoutTransitions() {
+        setLayoutTransition(null);
+    }
+
     @Override
     protected int getScrollMode() {
         return SmoothPagedView.X_LARGE_MODE;
@@ -488,10 +496,24 @@
     }
 
     public void removeAllWorkspaceScreens() {
+        // Disable all layout transitions before removing all pages to ensure that we don't get the
+        // transition animations competing with us changing the scroll when we add pages or the
+        // custom content screen
+        disableLayoutTransitions();
+
+        // Since we increment the current page when we call addCustomContentPage via bindScreens
+        // (and other places), we need to adjust the current page back when we clear the pages
+        if (hasCustomContent()) {
+            removeCustomContentPage();
+        }
+
         // Remove the pages and clear the screen models
         removeAllViews();
         mScreenOrder.clear();
         mWorkspaceScreens.clear();
+
+        // Re-enable the layout transitions
+        enableLayoutTransitions();
     }
 
     public long insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) {
@@ -1409,11 +1431,11 @@
         if (hasCustomContent()) {
             int index = mScreenOrder.indexOf(CUSTOM_CONTENT_SCREEN_ID);
 
-            int scrollDelta = getScrollForPage(index + 1) - getScrollX() +
-                    getLayoutTransitionOffsetForPage(index + 1);
-            translationX = scrollDelta;
-            progress = (1.0f * scrollDelta) /
-                    (getScrollForPage(index + 1) - getScrollForPage(index));
+            int scrollDelta = getScrollX() - getScrollForPage(index) -
+                    getLayoutTransitionOffsetForPage(index);
+            float scrollRange = getScrollForPage(index + 1) - getScrollForPage(index);
+            translationX = scrollRange - scrollDelta;
+            progress = (scrollRange - scrollDelta) / scrollRange;
 
             if (isLayoutRtl()) {
                 translationX = Math.min(0, translationX);
@@ -1821,7 +1843,7 @@
         super.onStartReordering();
         showOutlines();
         // Reordering handles its own animations, disable the automatic ones.
-        setLayoutTransition(null);
+        disableLayoutTransitions();
     }
 
     protected void onEndReordering() {
@@ -1838,7 +1860,7 @@
         mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder);
 
         // Re-enable auto layout transitions for page deletion.
-        setLayoutTransition(mLayoutTransition);
+        enableLayoutTransitions();
     }
 
     public boolean isInOverviewMode() {
@@ -2058,15 +2080,14 @@
             ObjectAnimator overviewPanelAlpha = ObjectAnimator.ofFloat(overviewPanel,
                     "alpha", finalOverviewPanelAlpha);
 
-            overviewPanelAlpha.addUpdateListener(new AlphaUpdateListener(overviewPanel));
-            hotseatAlpha.addUpdateListener(new AlphaUpdateListener(hotseat));
-            searchBarAlpha.addUpdateListener(new AlphaUpdateListener(searchBar));
+            overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel));
+            hotseatAlpha.addListener(new AlphaUpdateListener(hotseat));
+            searchBarAlpha.addListener(new AlphaUpdateListener(searchBar));
 
             if (getPageIndicator() != null) {
-                pageIndicatorAlpha.addUpdateListener(new AlphaUpdateListener(getPageIndicator()));
+                pageIndicatorAlpha.addListener(new AlphaUpdateListener(getPageIndicator()));
             }
 
-
             anim.play(overviewPanelAlpha);
             anim.play(hotseatAlpha);
             anim.play(searchBarAlpha);
@@ -2106,7 +2127,7 @@
         return anim;
     }
 
-    static class AlphaUpdateListener implements AnimatorUpdateListener {
+    static class AlphaUpdateListener implements AnimatorUpdateListener, AnimatorListener {
         View view;
         public AlphaUpdateListener(View v) {
             view = v;
@@ -2128,6 +2149,25 @@
                 view.setVisibility(VISIBLE);
             }
         }
+
+        @Override
+        public void onAnimationCancel(Animator arg0) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator arg0) {
+            updateVisibility(view);
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator arg0) {
+        }
+
+        @Override
+        public void onAnimationStart(Animator arg0) {
+            // We want the views to be visible for animation, so fade-in/out is visible
+            view.setVisibility(VISIBLE);
+        }
     }
 
     @Override