Use less HW layers in All Apps

(saves memory)

Change-Id: Ib2beda7549662a787437c7aa043e7858357c051f
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index 4bfeb60..e36eee2 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -1099,7 +1099,7 @@
             images.add(info.iconBitmap);
         }
 
-        layout.createHardwareLayers();
+        enableHwLayersOnVisiblePages();
     }
 
     /**
@@ -1552,8 +1552,7 @@
                 }
             }
 
-            layout.createHardwareLayer();
-            invalidate();
+            enableHwLayersOnVisiblePages();
 
             // Update all thread priorities
             Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
@@ -1676,6 +1675,50 @@
                 }
             }
         }
+
+        enableHwLayersOnVisiblePages();
+    }
+
+    private void enableHwLayersOnVisiblePages() {
+        final int screenCount = getChildCount();
+
+        getVisiblePages(mTempVisiblePagesRange);
+        int leftScreen = mTempVisiblePagesRange[0];
+        int rightScreen = mTempVisiblePagesRange[1];
+        int forceDrawScreen = -1;
+        if (leftScreen == rightScreen) {
+            // make sure we're caching at least two pages always
+            if (rightScreen < screenCount - 1) {
+                rightScreen++;
+                forceDrawScreen = rightScreen;
+            } else if (leftScreen > 0) {
+                leftScreen--;
+                forceDrawScreen = leftScreen;
+            }
+        } else {
+            forceDrawScreen = leftScreen + 1;
+        }
+
+        for (int i = 0; i < screenCount; i++) {
+            final View layout = (View) getPageAt(i);
+            if (!(leftScreen <= i && i <= rightScreen &&
+                    (i == forceDrawScreen || shouldDrawChild(layout)))) {
+                layout.setLayerType(LAYER_TYPE_NONE, null);
+            }
+        }
+
+        int newLeft = -1;
+        int newRight = -1;
+        for (int i = 0; i < screenCount; i++) {
+            final View layout = (View) getPageAt(i);
+
+            if (leftScreen <= i && i <= rightScreen &&
+                    (i == forceDrawScreen || shouldDrawChild(layout))) {
+                if (layout.getLayerType() != LAYER_TYPE_HARDWARE) {
+                    layout.setLayerType(LAYER_TYPE_HARDWARE, null);
+                }
+            }
+        }
     }
 
     protected void overScroll(float amount) {
diff --git a/src/com/android/launcher2/PagedViewCellLayout.java b/src/com/android/launcher2/PagedViewCellLayout.java
index 6f73e63..9ce177b 100644
--- a/src/com/android/launcher2/PagedViewCellLayout.java
+++ b/src/com/android/launcher2/PagedViewCellLayout.java
@@ -86,17 +86,6 @@
         return mCellHeight;
     }
 
-    void destroyHardwareLayers() {
-        // called when a page is no longer visible (triggered by loadAssociatedPages ->
-        // removeAllViewsOnPage)
-        setLayerType(LAYER_TYPE_NONE, null);
-    }
-
-    void createHardwareLayers() {
-        // called when a page is visible (triggered by loadAssociatedPages -> syncPageItems)
-        setLayerType(LAYER_TYPE_HARDWARE, null);
-    }
-
     @Override
     public void cancelLongPress() {
         super.cancelLongPress();
@@ -133,7 +122,7 @@
     @Override
     public void removeAllViewsOnPage() {
         mChildren.removeAllViews();
-        destroyHardwareLayers();
+        setLayerType(LAYER_TYPE_NONE, null);
     }
 
     @Override
diff --git a/src/com/android/launcher2/PagedViewGridLayout.java b/src/com/android/launcher2/PagedViewGridLayout.java
index 90bfe88..aa9adc0 100644
--- a/src/com/android/launcher2/PagedViewGridLayout.java
+++ b/src/com/android/launcher2/PagedViewGridLayout.java
@@ -98,19 +98,11 @@
         return result;
     }
 
-    void destroyHardwareLayer() {
-        setLayerType(LAYER_TYPE_NONE, null);
-    }
-
-    void createHardwareLayer() {
-        setLayerType(LAYER_TYPE_HARDWARE, null);
-    }
-
     @Override
     public void removeAllViewsOnPage() {
         removeAllViews();
         mOnLayoutListener = null;
-        destroyHardwareLayer();
+        setLayerType(LAYER_TYPE_NONE, null);
     }
 
     @Override
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 2c44aca..9d8845b 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1406,13 +1406,13 @@
                 }
             }
             for (int i = 0; i < screenCount; i++) {
-                final CellLayout layout = (CellLayout) getChildAt(i);
+                final CellLayout layout = (CellLayout) getPageAt(i);
                 if (!(leftScreen <= i && i <= rightScreen && shouldDrawChild(layout))) {
                     layout.disableHardwareLayers();
                 }
             }
             for (int i = 0; i < screenCount; i++) {
-                final CellLayout layout = (CellLayout) getChildAt(i);
+                final CellLayout layout = (CellLayout) getPageAt(i);
                 if (leftScreen <= i && i <= rightScreen && shouldDrawChild(layout)) {
                     layout.enableHardwareLayers();
                 }