merge in ics-release history after reset to master
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 8aae809..e27345b 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -916,8 +916,10 @@
     }
 
     public void setBackgroundAlpha(float alpha) {
-        mBackgroundAlpha = alpha;
-        invalidate();
+        if (mBackgroundAlpha != alpha) {
+            mBackgroundAlpha = alpha;
+            invalidate();
+        }
     }
 
     // Need to return true to let the view system know we know how to handle alpha-- this is
@@ -928,6 +930,7 @@
         return true;
     }
 
+    @Override
     public void setAlpha(float alpha) {
         setChildrenAlpha(alpha);
         super.setAlpha(alpha);
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 975686e..ef36042 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -181,7 +181,7 @@
 
     // Scrolling indicator
     private ValueAnimator mScrollIndicatorAnimator;
-    private ImageView mScrollIndicator;
+    private View mScrollIndicator;
     private int mScrollIndicatorPaddingLeft;
     private int mScrollIndicatorPaddingRight;
     private boolean mHasScrollIndicator = true;
@@ -726,19 +726,17 @@
     protected void getVisiblePages(int[] range) {
         final int pageCount = getChildCount();
         if (pageCount > 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 && leftScreen < pageCount - 1) {
+            while (leftScreen < pageCount - 1 &&
+                    getPageAt(leftScreen).getRight() <= mScrollX) {
                 leftScreen++;
-                x += getScaledMeasuredWidth(getPageAt(leftScreen)) + mPageSpacing;
             }
             rightScreen = leftScreen;
-            while (x < mScrollX + screenWidth && rightScreen < pageCount - 1) {
+            while (rightScreen < pageCount - 1 &&
+                    getPageAt(rightScreen + 1).getLeft() < mScrollX + screenWidth) {
                 rightScreen++;
-                x += getScaledMeasuredWidth(getPageAt(rightScreen)) + mPageSpacing;
             }
             range[0] = leftScreen;
             range[1] = rightScreen;
@@ -774,8 +772,21 @@
                 canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
                         mScrollY + mBottom - mTop);
 
-                for (int i = rightScreen; i >= leftScreen; i--) {
-                    drawChild(canvas, getPageAt(i), drawingTime);
+                // On certain graphics drivers, if you draw to a off-screen buffer that's not
+                // used, it can lead to poor performance. We were running into this when
+                // setChildrenLayersEnabled was called on a CellLayout; that triggered a re-draw
+                // of that CellLayout's hardware layer, even if that CellLayout wasn't visible.
+                // As a fix, below we set pages that aren't going to be rendered are to be
+                // View.INVISIBLE, preventing re-drawing of their hardware layer
+                for (int i = getChildCount() - 1; i >= 0; i--) {
+                    final View v = getPageAt(i);
+                    if (leftScreen <= i && i <= rightScreen &&
+                            v.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
+                        v.setVisibility(VISIBLE);
+                        drawChild(canvas, v, drawingTime);
+                    } else {
+                        v.setVisibility(INVISIBLE);
+                    }
                 }
                 canvas.restore();
             }
@@ -1756,12 +1767,12 @@
         }
     }
 
-    protected ImageView getScrollingIndicator() {
+    protected View getScrollingIndicator() {
         // We use mHasScrollIndicator to prevent future lookups if there is no sibling indicator
         // found
         if (mHasScrollIndicator && mScrollIndicator == null) {
             ViewGroup parent = (ViewGroup) getParent();
-            mScrollIndicator = (ImageView) (parent.findViewById(R.id.paged_view_indicator));
+            mScrollIndicator = (View) (parent.findViewById(R.id.paged_view_indicator));
             mHasScrollIndicator = mScrollIndicator != null;
             if (mHasScrollIndicator) {
                 mScrollIndicator.setVisibility(View.VISIBLE);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 2906371..148c1ba 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1268,32 +1268,6 @@
         return (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground);
     }
 
-    public void scrollTo (int x, int y) {
-        super.scrollTo(x, y);
-        syncChildrenLayersEnabledOnVisiblePages();
-    }
-
-    // This method just applies the value mChildrenLayersEnabled to all the pages that
-    // will be rendered on the next frame.
-    // We do this because calling setChildrenLayersEnabled on a view that's not
-    // visible/rendered causes slowdowns on some graphics cards
-    private void syncChildrenLayersEnabledOnVisiblePages() {
-        if (mChildrenLayersEnabled) {
-            getVisiblePages(mTempVisiblePagesRange);
-            final int leftScreen = mTempVisiblePagesRange[0];
-            final int rightScreen = mTempVisiblePagesRange[1];
-            if (leftScreen != -1 && rightScreen != -1) {
-                for (int i = leftScreen; i <= rightScreen; i++) {
-                    ViewGroup page = (ViewGroup) getPageAt(i);
-                    if (page.getVisibility() == VISIBLE &&
-                            page.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
-                        ((ViewGroup)getPageAt(i)).setChildrenLayersEnabled(true);
-                    }
-                }
-            }
-        }
-    }
-
     @Override
     protected void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
@@ -1400,13 +1374,8 @@
 
         if (enableChildrenLayers != mChildrenLayersEnabled) {
             mChildrenLayersEnabled = enableChildrenLayers;
-            // calling setChildrenLayersEnabled on a view that's not visible/rendered
-            // causes slowdowns on some graphics cards, so we only disable it here and leave
-            // the enabling to dispatchDraw
-            if (!enableChildrenLayers) {
-                for (int i = 0; i < getPageCount(); i++) {
-                    ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(false);
-                }
+            for (int i = 0; i < getPageCount(); i++) {
+                ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(mChildrenLayersEnabled);
             }
         }
     }
@@ -1726,9 +1695,11 @@
                             cl.setBackgroundAlphaMultiplier(a * mOldBackgroundAlphaMultipliers[i] +
                                     b * mNewBackgroundAlphaMultipliers[i]);
                             cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]);
+                            if (mOldAlphas[i] != mNewAlphas[i]) {
+                                cl.setAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]);
+                            }
                         }
                     }
-                    syncChildrenLayersEnabledOnVisiblePages();
                 }
             });
 
@@ -1768,7 +1739,6 @@
             // Fade the background gradient away
             animateBackgroundGradient(0f, true);
         }
-        syncChildrenLayersEnabledOnVisiblePages();
         return anim;
     }
 
@@ -3520,7 +3490,7 @@
         final ViewGroup parent = (ViewGroup) getParent();
         final ImageView qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
         final ImageView dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
-        final ImageView scrollIndicator = getScrollingIndicator();
+        final View scrollIndicator = getScrollingIndicator();
 
         cancelScrollingIndicatorAnimations();
         if (qsbDivider != null) qsbDivider.setAlpha(reducedFade);