Merge "Allowing taskView to have focusable children (using taskOverlays)" into ub-launcher3-edmonton-polish
diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java
index 8b415d6..3c7c1aa 100644
--- a/src/com/android/launcher3/LauncherStateManager.java
+++ b/src/com/android/launcher3/LauncherStateManager.java
@@ -382,7 +382,9 @@
     }
 
     private void onStateTransitionStart(LauncherState state) {
-        mState.onStateDisabled(mLauncher);
+        if (mState != state) {
+            mState.onStateDisabled(mLauncher);
+        }
         mState = state;
         mState.onStateEnabled(mLauncher);
         mLauncher.getAppWidgetHost().setResumed(state == LauncherState.NORMAL);
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 8993978..fdf32af 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -312,6 +312,12 @@
         }
     }
 
+    @Override
+    public int getCanvasClipTopForOverscroll() {
+        // Do not clip if the QSB is attached to the spring, otherwise the QSB will get clipped.
+        return mSpringViews.get(getSearchView().getId()) ? 0 : mHeader.getTop();
+    }
+
     private void rebindAdapters(boolean showTabs) {
         rebindAdapters(showTabs, false /* force */);
     }
diff --git a/src/com/android/launcher3/views/SpringRelativeLayout.java b/src/com/android/launcher3/views/SpringRelativeLayout.java
index 5022d65..b0313ce 100644
--- a/src/com/android/launcher3/views/SpringRelativeLayout.java
+++ b/src/com/android/launcher3/views/SpringRelativeLayout.java
@@ -54,7 +54,7 @@
                 }
             };
 
-    private final SparseBooleanArray mSpringViews = new SparseBooleanArray();
+    protected final SparseBooleanArray mSpringViews = new SparseBooleanArray();
     private final SpringAnimation mSpring;
 
     private float mDampedScrollShift = 0;
@@ -85,12 +85,24 @@
         invalidate();
     }
 
+    /**
+     * Used to clip the canvas when drawing child views during overscroll.
+     */
+    public int getCanvasClipTopForOverscroll() {
+        return 0;
+    }
+
     @Override
     protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
         if (mDampedScrollShift != 0 && mSpringViews.get(child.getId())) {
+            int saveCount = canvas.save();
+
+            canvas.clipRect(0, getCanvasClipTopForOverscroll(), getWidth(), getHeight());
             canvas.translate(0, mDampedScrollShift);
             boolean result = super.drawChild(canvas, child, drawingTime);
-            canvas.translate(0, -mDampedScrollShift);
+
+            canvas.restoreToCount(saveCount);
+
             return result;
         }
         return super.drawChild(canvas, child, drawingTime);