Merge "Add hard clip for overscrolled children to not be visible above QSB." into ub-launcher3-edmonton-polish
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 8993978..4d63c96 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -312,6 +312,11 @@
         }
     }
 
+    @Override
+    public int getCanvasClipTopForOverscroll() {
+        return 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..892c59f 100644
--- a/src/com/android/launcher3/views/SpringRelativeLayout.java
+++ b/src/com/android/launcher3/views/SpringRelativeLayout.java
@@ -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);