New AllAppsCustomize transitions

Change-Id: Ibefda8bf156810849c5e8f3383d49ae64a7ee08a
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index d3e0963..8d49b4c 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -189,6 +189,14 @@
     private final float sWidgetPreviewIconPaddingPercentage = 0.25f;
     private PagedViewCellLayout mWidgetSpacingLayout;
 
+    // Relating to the scroll and overscroll effects
+    Workspace.ZInterpolator mZInterpolator = new Workspace.ZInterpolator(0.5f);
+    private float mDensity;
+    private static float CAMERA_DISTANCE = 3500;
+    private static float TRANSITION_SCALE_FACTOR = 0.6f;
+    private static float TRANSITION_PIVOT = 0.75f;
+    private static float TRANSITION_MAX_ROTATION = 26f;
+
     // Previews & outlines
     ArrayList<AppsCustomizeAsyncTask> mRunningTasks;
     private HolographicOutlineHelper mHolographicOutlineHelper;
@@ -211,6 +219,7 @@
         mDefaultWidgetBackground = resources.getDrawable(R.drawable.default_widget_preview_holo);
         mAppIconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
         mDragViewMultiplyColor = resources.getColor(R.color.drag_view_multiply_color);
+        mDensity = resources.getDisplayMetrics().density;
 
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PagedView, 0, 0);
         // TODO-APPS_CUSTOMIZE: remove these unnecessary attrs after
@@ -265,7 +274,7 @@
             int currentPage = getCurrentPage();
             switch (mContentType) {
             case Applications: {
-                PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(currentPage);
+                PagedViewCellLayout layout = (PagedViewCellLayout) getPageAt(currentPage);
                 PagedViewCellLayoutChildren childrenLayout = layout.getChildrenLayout();
                 int numItemsPerPage = mCellCountX * mCellCountY;
                 int childCount = childrenLayout.getChildCount();
@@ -274,7 +283,7 @@
                 }}
                 break;
             case Widgets: {
-                PagedViewGridLayout layout = (PagedViewGridLayout) getChildAt(currentPage);
+                PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(currentPage);
                 int numItemsPerPage = mWidgetCountX * mWidgetCountY;
                 int childCount = layout.getChildCount();
                 if (childCount > 0) {
@@ -526,8 +535,6 @@
         if (!super.beginDragging(v)) return false;
 
         // Go into spring loaded mode (must happen before we startDrag())
-        int currentPageIndex = mLauncher.getWorkspace().getCurrentPage();
-        CellLayout currentPage = (CellLayout) mLauncher.getWorkspace().getChildAt(currentPageIndex);
         mLauncher.enterSpringLoadedDragMode();
 
         if (v instanceof PagedViewIcon) {
@@ -626,11 +633,10 @@
     }
     public void syncAppsPageItems(int page, boolean immediate) {
         // ensure that we have the right number of items on the pages
-        int numPages = getPageCount();
         int numCells = mCellCountX * mCellCountY;
         int startIndex = page * numCells;
         int endIndex = Math.min(startIndex + numCells, mApps.size());
-        PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(page);
+        PagedViewCellLayout layout = (PagedViewCellLayout) getPageAt(page);
 
         layout.removeAllViewsOnPage();
         ArrayList<Object> items = new ArrayList<Object>();
@@ -653,8 +659,6 @@
             images.add(info.iconBitmap);
         }
 
-        // Create the hardware layers
-        layout.allowHardwareLayerCreation();
         layout.createHardwareLayers();
 
         if (mFadeInAdjacentScreens) {
@@ -959,6 +963,8 @@
         } else {
             prepareLoadWidgetPreviewsTask(page, items, cellWidth, cellHeight, mWidgetCountX);
         }
+        PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page);
+        layout.createHardwareLayer();
     }
     private void loadWidgetPreviewsInBackground(AppsCustomizeAsyncTask task,
             AsyncTaskPageData data) {
@@ -997,7 +1003,7 @@
     }
     private void onSyncWidgetPageItems(AsyncTaskPageData data) {
         int page = data.page;
-        PagedViewGridLayout layout = (PagedViewGridLayout) getChildAt(page);
+        PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page);
         // Only set the column count once we have items
         layout.setColumnCount(layout.getCellCountX());
 
@@ -1062,7 +1068,7 @@
         invalidate();
 
         int page = data.page;
-        ViewGroup layout = (ViewGroup) getChildAt(page);
+        ViewGroup layout = (ViewGroup) getPageAt(page);
         if (layout instanceof PagedViewCellLayout) {
             PagedViewCellLayout cl = (PagedViewCellLayout) layout;
             int count = cl.getPageChildCount();
@@ -1114,6 +1120,92 @@
         }
     }
 
+    // We want our pages to be z-ordered such that the further a page is to the left, the higher
+    // it is in the z-order. This is important to insure touch events are handled correctly.
+    View getPageAt(int index) {
+        return getChildAt(getChildCount() - index - 1);
+    }
+
+    // In apps customize, we have a scrolling effect which emulates pulling cards off of a stack.
+    @Override
+    protected void screenScrolled(int screenCenter) {
+        super.screenScrolled(screenCenter);
+        final int halfScreenSize = getMeasuredWidth() / 2;
+
+        for (int i = 0; i < getChildCount(); i++) {
+            View v = getPageAt(i);
+            if (v != null) {
+                int totalDistance = getScaledMeasuredWidth(v) + mPageSpacing;
+                int delta = screenCenter - (getChildOffset(i) -
+                        getRelativeChildOffset(i) + halfScreenSize);
+
+                float scrollProgress = delta / (totalDistance * 1.0f);
+                scrollProgress = Math.min(scrollProgress, 1.0f);
+                scrollProgress = Math.max(scrollProgress, -1.0f);
+
+                float interpolatedProgress =
+                        mZInterpolator.getInterpolation(Math.abs(Math.min(scrollProgress, 0)));
+                float scale = (1 - interpolatedProgress) +
+                        interpolatedProgress * TRANSITION_SCALE_FACTOR;
+                float translationX = Math.min(0, scrollProgress) * v.getMeasuredWidth();
+                float alpha = scrollProgress < 0 ? 1 - Math.abs(scrollProgress) : 1.0f;
+
+                v.setCameraDistance(mDensity * CAMERA_DISTANCE);
+                int pageWidth = v.getMeasuredWidth();
+                int pageHeight = v.getMeasuredHeight();
+                if (i == 0 && scrollProgress < 0) {
+                    // Overscroll to the left
+                    v.setPivotX(TRANSITION_PIVOT * pageWidth);
+                    v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress);
+                    scale = 1.0f;
+                    alpha = 1.0f;
+                    // On the first page, we don't want the page to have any lateral motion
+                    translationX = getScrollX();
+                } else if (i == getChildCount() - 1 && scrollProgress > 0) {
+                    // Overscroll to the right
+                    v.setPivotX((1 - TRANSITION_PIVOT) * pageWidth);
+                    v.setRotationY(-TRANSITION_MAX_ROTATION * scrollProgress);
+                    scale = 1.0f;
+                    alpha = 1.0f;
+                    // On the last page, we don't want the page to have any lateral motion.
+                    translationX =  getScrollX() - mMaxScrollX;
+                } else {
+                    v.setPivotY(pageHeight / 2.0f);
+                    v.setPivotX(pageWidth / 2.0f);
+                    v.setRotationY(0f);
+                }
+
+                v.setTranslationX(translationX);
+                v.setScaleX(scale);
+                v.setScaleY(scale);
+                v.setAlpha(alpha);
+            }
+        }
+    }
+
+    protected void overScroll(float amount) {
+        int screenSize = getMeasuredWidth();
+
+        // We want to reach the max overscroll effect when the user has
+        // overscrolled half the size of the screen
+        float f = 2 * (amount / screenSize);
+
+        if (f == 0) return;
+
+        // Clamp this factor, f, to -1 < f < 1
+        if (Math.abs(f) >= 1) {
+            f /= Math.abs(f);
+        }
+
+        int overScrollAmount = (int) Math.round(f * screenSize);
+        if (amount < 0) {
+            mScrollX = overScrollAmount;
+        } else {
+            mScrollX = mMaxScrollX + overScrollAmount;
+        }
+        invalidate();
+    }
+
     /**
      * Used by the parent to get the content width to set the tab bar to
      * @return
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 76fa937..807470c 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -441,7 +441,7 @@
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             // disallowing padding in paged view (just pass 0)
-            final View child = getChildAt(i);
+            final View child = getPageAt(i);
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
 
             int childWidthMode;
@@ -489,7 +489,7 @@
 
         final int pageCount = getChildCount();
         for (int i = 0; i < pageCount; i++) {
-            View page = (View) getChildAt(i);
+            View page = (View) getPageAt(i);
             page.setX(page.getX() + delta);
         }
         setCurrentPage(newCurrentPage);
@@ -506,7 +506,7 @@
         float childrenX[] = new float[childCount];
         float childrenY[] = new float[childCount];
         for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
+            final View child = getPageAt(i);
             childrenX[i] = child.getX();
             childrenY[i] = child.getY();
         }
@@ -517,7 +517,7 @@
         measure(widthSpec, heightSpec);
         layout(mLeft, mTop, mRight, mBottom);
         for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
+            final View child = getPageAt(i);
             child.setX(childrenX[i]);
             child.setY(childrenY[i]);
         }
@@ -553,7 +553,7 @@
         }
 
         for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
+            final View child = getPageAt(i);
             if (child.getVisibility() != View.GONE) {
                 final int childWidth = getScaledMeasuredWidth(child);
                 final int childHeight = child.getMeasuredHeight();
@@ -586,7 +586,7 @@
                 int screenCenter = mScrollX + halfScreenSize + mPaddingLeft;
                 final int childCount = getChildCount();
                 for (int i = 0; i < childCount; ++i) {
-                    View layout = (View) getChildAt(i);
+                    View layout = (View) getPageAt(i);
                     int childWidth = getScaledMeasuredWidth(layout);
                     int halfChildWidth = (childWidth / 2);
                     int childCenter = getChildOffset(i) + halfChildWidth;
@@ -603,13 +603,13 @@
                     int distanceFromScreenCenter = childCenter - screenCenter;
                     if (distanceFromScreenCenter > 0) {
                         if (i > 0) {
-                            d += getScaledMeasuredWidth(getChildAt(i - 1)) / 2;
+                            d += getScaledMeasuredWidth(getPageAt(i - 1)) / 2;
                         } else {
                             continue;
                         }
                     } else {
                         if (i < childCount - 1) {
-                            d += getScaledMeasuredWidth(getChildAt(i + 1)) / 2;
+                            d += getScaledMeasuredWidth(getPageAt(i + 1)) / 2;
                         } else {
                             continue;
                         }
@@ -663,21 +663,19 @@
         // page.
         final int pageCount = getChildCount();
         if (pageCount > 0) {
-            final int pageWidth = getScaledMeasuredWidth(getChildAt(0));
+            final int pageWidth = getScaledMeasuredWidth(getPageAt(0));
             final int screenWidth = getMeasuredWidth();
             int x = getScaledRelativeChildOffset(0) + pageWidth;
             int leftScreen = 0;
             int rightScreen = 0;
-            while (x <= mScrollX) {
+            while (x <= mScrollX && leftScreen < pageCount - 1) {
                 leftScreen++;
-                x += getScaledMeasuredWidth(getChildAt(leftScreen)) + mPageSpacing;
+                x += getScaledMeasuredWidth(getPageAt(leftScreen)) + mPageSpacing;
             }
             rightScreen = leftScreen;
-            while (x < mScrollX + screenWidth && rightScreen < pageCount) {
+            while (x < mScrollX + screenWidth && rightScreen < pageCount - 1) {
                 rightScreen++;
-                if (rightScreen < pageCount) {
-                    x += getScaledMeasuredWidth(getChildAt(rightScreen)) + mPageSpacing;
-                }
+                x += getScaledMeasuredWidth(getPageAt(rightScreen)) + mPageSpacing;
             }
             rightScreen = Math.min(getChildCount() - 1, rightScreen);
 
@@ -687,8 +685,8 @@
             canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
                     mScrollY + mBottom - mTop);
 
-            for (int i = leftScreen; i <= rightScreen; i++) {
-                drawChild(canvas, getChildAt(i), drawingTime);
+            for (int i = rightScreen; i >= leftScreen; i--) {
+                drawChild(canvas, getPageAt(i), drawingTime);
             }
             canvas.restore();
         }
@@ -787,7 +785,7 @@
         if (disallowIntercept) {
             // We need to make sure to cancel our long press if
             // a scrollable widget takes over touch events
-            final View currentPage = getChildAt(mCurrentPage);
+            final View currentPage = getPageAt(mCurrentPage);
             currentPage.cancelLongPress();
         }
         super.requestDisallowInterceptTouchEvent(disallowIntercept);
@@ -1092,7 +1090,7 @@
                 // in the opposite direction, we use a threshold to determine whether we should
                 // just return to the starting page, or if we should skip one further.
                 boolean returnToOriginalPage = false;
-                final int pageWidth = getScaledMeasuredWidth(getChildAt(mCurrentPage));
+                final int pageWidth = getScaledMeasuredWidth(getPageAt(mCurrentPage));
                 if (Math.abs(deltaX) > pageWidth * RETURN_TO_ORIGINAL_PAGE_THRESHOLD &&
                         Math.signum(velocityX) != Math.signum(deltaX)) {
                     returnToOriginalPage = true;
@@ -1241,7 +1239,7 @@
         int right;
         for (int i = 0; i < childCount; ++i) {
             left = getRelativeChildOffset(i);
-            right = (left + getScaledMeasuredWidth(getChildAt(i)));
+            right = (left + getScaledMeasuredWidth(getPageAt(i)));
             if (left <= relativeOffset && relativeOffset <= right) {
                 return i;
             }
@@ -1259,7 +1257,7 @@
     protected int getChildWidth(int index) {
         // This functions are called enough times that it actually makes a difference in the
         // profiler -- so just inline the max() here
-        final int measuredWidth = getChildAt(index).getMeasuredWidth();
+        final int measuredWidth = getPageAt(index).getMeasuredWidth();
         final int minWidth = mMinimumWidth;
         return (minWidth > measuredWidth) ? minWidth : measuredWidth;
     }
@@ -1271,7 +1269,7 @@
     protected int getScaledRelativeChildOffset(int index) {
         int padding = mPaddingLeft + mPaddingRight;
         return mPaddingLeft + (getMeasuredWidth() - padding -
-                getScaledMeasuredWidth(getChildAt(index))) / 2;
+                getScaledMeasuredWidth(getPageAt(index))) / 2;
     }
 
     protected int getChildOffset(int index) {
@@ -1280,7 +1278,7 @@
 
         int offset = getRelativeChildOffset(0);
         for (int i = 0; i < index; ++i) {
-            offset += getScaledMeasuredWidth(getChildAt(i)) + mPageSpacing;
+            offset += getScaledMeasuredWidth(getPageAt(i)) + mPageSpacing;
         }
         return offset;
     }
@@ -1295,12 +1293,12 @@
     }
 
     int getPageNearestToCenterOfScreen() {
-        int minDistanceFromScreenCenter = getMeasuredWidth();
+        int minDistanceFromScreenCenter = Integer.MAX_VALUE;
         int minDistanceFromScreenCenterIndex = -1;
         int screenCenter = mScrollX + (getMeasuredWidth() / 2);
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; ++i) {
-            View layout = (View) getChildAt(i);
+            View layout = (View) getPageAt(i);
             int childWidth = getScaledMeasuredWidth(layout);
             int halfChildWidth = (childWidth / 2);
             int childCenter = getChildOffset(i) + halfChildWidth;
@@ -1395,7 +1393,7 @@
 
         View focusedChild = getFocusedChild();
         if (focusedChild != null && whichPage != mCurrentPage &&
-                focusedChild == getChildAt(mCurrentPage)) {
+                focusedChild == getPageAt(mCurrentPage)) {
             focusedChild.clearFocus();
         }
 
@@ -1441,7 +1439,7 @@
             ViewParent vp = v.getParent();
             int count = getChildCount();
             for (int i = 0; i < count; i++) {
-                if (vp == getChildAt(i)) {
+                if (vp == getPageAt(i)) {
                     return i;
                 }
             }
@@ -1509,7 +1507,7 @@
                     if ((i != page) && immediateAndOnly) {
                         continue;
                     }
-                    Page layout = (Page) getChildAt(i);
+                    Page layout = (Page) getPageAt(i);
                     final int childCount = layout.getPageChildCount();
                     if (lowerPageBound <= i && i <= upperPageBound) {
                         if (mDirtyPageContent.get(i)) {
@@ -1559,7 +1557,7 @@
         ArrayList<Checkable> checked = new ArrayList<Checkable>();
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; ++i) {
-            Page layout = (Page) getChildAt(i);
+            Page layout = (Page) getPageAt(i);
             final int grandChildCount = layout.getPageChildCount();
             for (int j = 0; j < grandChildCount; ++j) {
                 final View v = layout.getChildOnPageAt(j);
@@ -1579,7 +1577,7 @@
         if (mChoiceMode != CHOICE_MODE_MULTIPLE) {
             final int childCount = getChildCount();
             for (int i = 0; i < childCount; ++i) {
-                Page layout = (Page) getChildAt(i);
+                Page layout = (Page) getPageAt(i);
                 final int grandChildCount = layout.getPageChildCount();
                 for (int j = 0; j < grandChildCount; ++j) {
                     final View v = layout.getChildOnPageAt(j);
diff --git a/src/com/android/launcher2/PagedViewCellLayout.java b/src/com/android/launcher2/PagedViewCellLayout.java
index 803e700..29dc352 100644
--- a/src/com/android/launcher2/PagedViewCellLayout.java
+++ b/src/com/android/launcher2/PagedViewCellLayout.java
@@ -47,9 +47,6 @@
     private int mHeightGap;
     private int mMaxGap;
     protected PagedViewCellLayoutChildren mChildren;
-    private PagedViewCellLayoutChildren mHolographicChildren;
-    private boolean mAllowHardwareLayerCreation = false;
-    private boolean mCreateHardwareLayersIfAllowed = false;
 
     public PagedViewCellLayout(Context context) {
         this(context, null);
@@ -80,12 +77,6 @@
         mChildren.setGap(mWidthGap, mHeightGap);
 
         addView(mChildren);
-        mHolographicChildren = new PagedViewCellLayoutChildren(context);
-        mHolographicChildren.setAlpha(0f);
-        mHolographicChildren.setCellDimensions(mCellWidth, mCellHeight);
-        mHolographicChildren.setGap(mWidthGap, mHeightGap);
-
-        addView(mHolographicChildren);
     }
 
     public int getCellWidth() {
@@ -96,41 +87,20 @@
         return mCellHeight;
     }
 
-    public void allowHardwareLayerCreation() {
-        // This is called after the first time we launch into All Apps. Before that point,
-        // there's no need for hardware layers here since there's a hardware layer set on the
-        // parent, AllAppsTabbed, during the AllApps transition -- creating hardware layers here
-        // before the animation is done slows down the animation
-        if (!mAllowHardwareLayerCreation) {
-            mAllowHardwareLayerCreation = true;
-            if (mCreateHardwareLayersIfAllowed) {
-                createHardwareLayers();
-            }
-        }
-    }
-
     @Override
     public void setAlpha(float alpha) {
-        mChildren.setAlpha(HolographicOutlineHelper.viewAlphaInterpolator(alpha));
-        mHolographicChildren.setAlpha(HolographicOutlineHelper.highlightAlphaInterpolator(alpha));
+        mChildren.setAlpha(alpha);
     }
 
     void destroyHardwareLayers() {
         // called when a page is no longer visible (triggered by loadAssociatedPages ->
         // removeAllViewsOnPage)
-        mCreateHardwareLayersIfAllowed = false;
-        if (mAllowHardwareLayerCreation) {
-            mChildren.destroyHardwareLayer();
-            mHolographicChildren.destroyHardwareLayer();
-        }
+        mChildren.destroyHardwareLayer();
     }
+
     void createHardwareLayers() {
         // called when a page is visible (triggered by loadAssociatedPages -> syncPageItems)
-        mCreateHardwareLayersIfAllowed = true;
-        if (mAllowHardwareLayerCreation) {
-            mChildren.createHardwareLayer();
-            mHolographicChildren.createHardwareLayer();
-        }
+        mChildren.createHardwareLayer();
     }
 
     @Override
@@ -163,11 +133,7 @@
 
             if (child instanceof PagedViewIcon) {
                 PagedViewIcon pagedViewIcon = (PagedViewIcon) child;
-                if (mAllowHardwareLayerCreation) {
-                    pagedViewIcon.disableCache();
-                }
-                mHolographicChildren.addView(pagedViewIcon.getHolographicOutlineView(),
-                        index, lp);
+                pagedViewIcon.disableCache();
             }
             return true;
         }
@@ -177,14 +143,12 @@
     @Override
     public void removeAllViewsOnPage() {
         mChildren.removeAllViews();
-        mHolographicChildren.removeAllViews();
         destroyHardwareLayers();
     }
 
     @Override
     public void removeViewOnPageAt(int index) {
         mChildren.removeViewAt(index);
-        mHolographicChildren.removeViewAt(index);
     }
 
     @Override
@@ -237,7 +201,6 @@
             mHeightGap = Math.min(mMaxGap,numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
 
             mChildren.setGap(mWidthGap, mHeightGap);
-            mHolographicChildren.setGap(mWidthGap, mHeightGap);
         } else {
             mWidthGap = mOriginalWidthGap;
             mHeightGap = mOriginalHeightGap;
@@ -317,13 +280,11 @@
 
     public void enableCenteredContent(boolean enabled) {
         mChildren.enableCenteredContent(enabled);
-        mHolographicChildren.enableCenteredContent(enabled);
     }
 
     @Override
     protected void setChildrenDrawingCacheEnabled(boolean enabled) {
         mChildren.setChildrenDrawingCacheEnabled(enabled);
-        mHolographicChildren.setChildrenDrawingCacheEnabled(enabled);
     }
 
     public void setCellCount(int xCount, int yCount) {
@@ -336,7 +297,6 @@
         mWidthGap = widthGap;
         mHeightGap = heightGap;
         mChildren.setGap(widthGap, heightGap);
-        mHolographicChildren.setGap(widthGap, heightGap);
     }
 
     public int[] getCellCountForDimensions(int width, int height) {
diff --git a/src/com/android/launcher2/PagedViewCellLayoutChildren.java b/src/com/android/launcher2/PagedViewCellLayoutChildren.java
index 0907c60..eaef682 100644
--- a/src/com/android/launcher2/PagedViewCellLayoutChildren.java
+++ b/src/com/android/launcher2/PagedViewCellLayoutChildren.java
@@ -142,14 +142,10 @@
     }
 
     void destroyHardwareLayer() {
-        if (getLayerType() != LAYER_TYPE_NONE) {
-            setLayerType(LAYER_TYPE_NONE, null);
-        }
+        setLayerType(LAYER_TYPE_NONE, null);
     }
     void createHardwareLayer() {
-        if (getLayerType() != LAYER_TYPE_HARDWARE) {
-            setLayerType(LAYER_TYPE_HARDWARE, null);
-        }
+        setLayerType(LAYER_TYPE_HARDWARE, null);
     }
 
     public void enableCenteredContent(boolean enabled) {
diff --git a/src/com/android/launcher2/PagedViewGridLayout.java b/src/com/android/launcher2/PagedViewGridLayout.java
index 4131d8b..93626f0 100644
--- a/src/com/android/launcher2/PagedViewGridLayout.java
+++ b/src/com/android/launcher2/PagedViewGridLayout.java
@@ -40,6 +40,7 @@
     int getCellCountX() {
         return mCellCountX;
     }
+
     int getCellCountY() {
         return mCellCountY;
     }
@@ -69,27 +70,18 @@
         return result;
     }
 
-    @Override
-    protected boolean onSetAlpha(int alpha) {
-        return true;
+    void destroyHardwareLayer() {
+        setLayerType(LAYER_TYPE_NONE, null);
     }
 
-    @Override
-    public void setAlpha(float alpha) {
-        setChildrenAlpha(alpha);
-        super.setAlpha(alpha);
-    }
-
-    private void setChildrenAlpha(float alpha) {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            getChildAt(i).setAlpha(alpha);
-        }
+    void createHardwareLayer() {
+        setLayerType(LAYER_TYPE_HARDWARE, null);
     }
 
     @Override
     public void removeAllViewsOnPage() {
         removeAllViews();
+        destroyHardwareLayer();
     }
 
     @Override