Cleaning up overscroll effect in launcher workspace

-> Making sure workspace is drawn above the hotseat and qsb
-> Dimming the dock divider and page indicator during overscroll

Change-Id: I40766aa88e58db2d102c11d1ae8b2455aa459a07
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index aa49ca1..433db50 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -69,6 +69,8 @@
     private float mDropViewAlpha;
     private boolean mHoverPointClosesFolder = false;
     private Rect mHitRect = new Rect();
+    private int mWorkspaceIndex = -1;
+    private int mHotseatIndex = -1;
 
     /**
      * Used to create a new DragLayer from XML.
@@ -81,6 +83,7 @@
 
         // Disable multitouch across the workspace/all apps/customize tray
         setMotionEventSplittingEnabled(false);
+        setChildrenDrawingOrderEnabled(true);
     }
 
     public void setup(Launcher launcher, DragController controller) {
@@ -610,6 +613,44 @@
     }
 
     @Override
+    protected void onViewAdded(View child) {
+        super.onViewAdded(child);
+        updateChildIndices();
+    }
+
+    @Override
+    protected void onViewRemoved(View child) {
+        super.onViewRemoved(child);
+        updateChildIndices();
+    }
+
+    private void updateChildIndices() {
+        if (mLauncher != null) {
+            mWorkspaceIndex = indexOfChild(mLauncher.getWorkspace());
+            mHotseatIndex = indexOfChild(mLauncher.getHotseat());
+        }
+    }
+
+    @Override
+    protected int getChildDrawingOrder(int childCount, int i) {
+        if (mWorkspaceIndex == -1 || mHotseatIndex == -1 || 
+                mLauncher.getWorkspace().isDrawingBackgroundGradient()) {
+            return i;
+        }
+
+        // This ensures that the workspace is drawn above the hotseat and qsb,
+        // except when the workspace is drawing a background gradient, in which
+        // case we want the workspace to stay behind these elements.
+        if (i == mHotseatIndex) {
+            return mWorkspaceIndex;
+        } else if (i == mWorkspaceIndex) {
+            return mHotseatIndex;
+        } else {
+            return i;
+        }
+    }
+
+    @Override
     protected void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
         if (mDropView != null) {
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index d8a8bb2..df1d525 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -1703,7 +1703,7 @@
         }
     }
 
-    private ImageView getScrollingIndicator() {
+    protected ImageView getScrollingIndicator() {
         // We use mHasScrollIndicator to prevent future lookups if there is no sibling indicator
         // found
         if (mHasScrollIndicator && mScrollIndicator == null) {
@@ -1742,9 +1742,7 @@
             // Fade the indicator in
             updateScrollingIndicatorPosition();
             mScrollIndicator.setVisibility(View.VISIBLE);
-            if (mScrollIndicatorAnimator != null) {
-                mScrollIndicatorAnimator.cancel();
-            }
+            cancelScrollingIndicatorAnimations();
             if (immediately) {
                 mScrollIndicator.setAlpha(1f);
             } else {
@@ -1755,6 +1753,12 @@
         }
     }
 
+    protected void cancelScrollingIndicatorAnimations() {
+        if (mScrollIndicatorAnimator != null) {
+            mScrollIndicatorAnimator.cancel();
+        }
+    }
+
     protected void hideScrollingIndicator(boolean immediately) {
         if (getChildCount() <= 1) return;
         if (!isScrollingIndicatorEnabled()) return;
@@ -1763,9 +1767,7 @@
         if (mScrollIndicator != null) {
             // Fade the indicator out
             updateScrollingIndicatorPosition();
-            if (mScrollIndicatorAnimator != null) {
-                mScrollIndicatorAnimator.cancel();
-            }
+            cancelScrollingIndicatorAnimations();
             if (immediately) {
                 mScrollIndicator.setVisibility(View.GONE);
                 mScrollIndicator.setAlpha(0f);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index a6ba98e..d3a31c4 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -175,6 +175,7 @@
     private final Rect mTempRect = new Rect();
     private final int[] mTempXY = new int[2];
     private int mDragViewMultiplyColor;
+    private float mOverscrollFade = 0;
 
     // Paint used to draw external drop outline
     private final Paint mExternalDragOutlinePaint = new Paint();
@@ -1152,7 +1153,11 @@
             cl.setPivotX(cl.getMeasuredWidth() * (index == 0 ? 0.75f : 0.25f));
             cl.setTranslationX(translationX);
             cl.setRotationY(rotation);
+            setFadeForOverScroll(Math.abs(scrollProgress));
         } else {
+            if (mOverscrollFade != 0) {
+                setFadeForOverScroll(0);
+            }
             // We don't want to mess with the translations during transitions
             if (!isSwitchingState()) {
                 resetCellLayoutTransforms((CellLayout) getChildAt(0), true);
@@ -1230,6 +1235,10 @@
         super.onDraw(canvas);
     }
 
+    boolean isDrawingBackgroundGradient() {
+        return (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground);
+    }
+
     @Override
     protected void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
@@ -3454,6 +3463,20 @@
         }
     }
 
+    void setFadeForOverScroll(float fade) {
+        if (!isScrollingIndicatorEnabled()) return;
+
+        mOverscrollFade = fade;
+        float reducedFade = 0.5f + 0.5f * (1 - fade);
+        final ViewGroup parent = (ViewGroup) getParent();
+        final ImageView dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
+        final ImageView scrollIndicator = getScrollingIndicator();
+
+        cancelScrollingIndicatorAnimations();
+        dockDivider.setAlpha(reducedFade);
+        scrollIndicator.setAlpha(1 - fade);
+    }
+
     void hideDockDivider(boolean immediately) {
         final ViewGroup parent = (ViewGroup) getParent();
         final View qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));