Merge "Fix ArrayIndexOutOfBoundsException, (issue 11038649)" into jb-ub-now-indigo-rose
diff --git a/res/drawable-hdpi/ic_pageindicator_add.png b/res/drawable-hdpi/ic_pageindicator_add.png
index c77a4f9..c37d622 100644
--- a/res/drawable-hdpi/ic_pageindicator_add.png
+++ b/res/drawable-hdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_add.png b/res/drawable-mdpi/ic_pageindicator_add.png
index 22420bd..8e05e64 100644
--- a/res/drawable-mdpi/ic_pageindicator_add.png
+++ b/res/drawable-mdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_add.png b/res/drawable-xhdpi/ic_pageindicator_add.png
index 9647b8f..28e164b 100644
--- a/res/drawable-xhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_add.png b/res/drawable-xxhdpi/ic_pageindicator_add.png
index 591b189..fd8a662 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 81f9af2..72a6ce2 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -296,12 +296,8 @@
         addView(mShortcutsAndWidgets);
     }
 
-    public void enableHardwareLayers() {
-        mShortcutsAndWidgets.setLayerType(LAYER_TYPE_HARDWARE, sPaint);
-    }
-
-    public void disableHardwareLayers() {
-        mShortcutsAndWidgets.setLayerType(LAYER_TYPE_NONE, sPaint);
+    public void enableHardwareLayer(boolean hasLayer) {
+        mShortcutsAndWidgets.setLayerType(hasLayer ? LAYER_TYPE_HARDWARE : LAYER_TYPE_NONE, sPaint);
     }
 
     public void buildHardwareLayer() {
diff --git a/src/com/android/launcher3/DynamicGrid.java b/src/com/android/launcher3/DynamicGrid.java
index 33eb595..8a6fbc1 100644
--- a/src/com/android/launcher3/DynamicGrid.java
+++ b/src/com/android/launcher3/DynamicGrid.java
@@ -498,17 +498,17 @@
         boolean hasAA = !AppsCustomizePagedView.DISABLE_ALL_APPS;
         // Our phone profiles include the bar sizes in each orientation
         deviceProfiles.add(new DeviceProfile("Super Short Stubby",
-                255, 300,  2, 3,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 300,  2, 3,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Shorter Stubby",
-                255, 400,  3, 3,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 400,  3, 3,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Short Stubby",
-                275, 420,  3, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                275, 420,  3, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Stubby",
-                255, 450,  3, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 450,  3, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Nexus S",
-                296, 491.33f,  4, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                296, 491.33f,  4, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Nexus 4",
-                359, 518,  4, 4,  60, 12, (hasAA ? 5 : 4), 56));
+                359, 518,  4, 4,  60, 13, (hasAA ? 5 : 4), 56));
         // The tablet profile is odd in that the landscape orientation
         // also includes the nav bar on the side
         deviceProfiles.add(new DeviceProfile("Nexus 7",
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 831637f..f1d4c1d 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -911,6 +911,7 @@
         if (DEBUG_RESUME_TIME) {
             Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
         }
+        mWorkspace.updateInteractionForState();
     }
 
     @Override
@@ -1719,7 +1720,7 @@
         }
     }
     protected void showWorkspaceAndExitOverviewMode() {
-        showWorkspaceAndExitOverviewMode(true);
+        showWorkspaceAndExitOverviewMode(false);
     }
 
     @Override
@@ -3072,7 +3073,6 @@
                 .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
 
         onWorkspaceShown(animated);
-        onInteractionEnd();
     }
 
     public void onWorkspaceShown(boolean animated) {
@@ -3087,7 +3087,6 @@
 
         // Change the state *after* we've called all the transition code
         mState = State.APPS_CUSTOMIZE;
-        onInteractionBegin();
 
         // Pause the auto-advance of widgets until we are out of AllApps
         mUserPresent = false;
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 03e24c6..fcc1aff 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -990,13 +990,14 @@
         // in accordance with any scroll effects.
         mForceScreenScrolled = true;
         mRecomputePageSpacing = true;
-
+        updateFreescrollBounds();
         invalidate();
     }
 
     @Override
     public void onChildViewRemoved(View parent, View child) {
         mForceScreenScrolled = true;
+        updateFreescrollBounds();
         invalidate();
     }
 
@@ -1558,6 +1559,17 @@
         setEnableFreeScroll(false, snapPage);
     }
 
+    void updateFreescrollBounds() {
+        getOverviewModePages(mTempVisiblePagesRange);
+        if (isLayoutRtl()) {
+            mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+            mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+        } else {
+            mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+            mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+        }
+    }
+
     private void setEnableFreeScroll(boolean freeScroll, int snapPage) {
         mFreeScroll = freeScroll;
 
@@ -1565,18 +1577,11 @@
             snapPage = getPageNearestToCenterOfScreen();
         }
 
-        getOverviewModePages(mTempVisiblePagesRange);
         if (!mFreeScroll) {
             snapToPage(snapPage);
         } else {
-            if (isLayoutRtl()) {
-                mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
-                mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
-            } else {
-                mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
-                mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
-            }
-
+            updateFreescrollBounds();
+            getOverviewModePages(mTempVisiblePagesRange);
             if (getCurrentPage() < mTempVisiblePagesRange[0]) {
                 setCurrentPage(mTempVisiblePagesRange[0]);
             } else if (getCurrentPage() > mTempVisiblePagesRange[1]) {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index ea348ef..2b7a737 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -1046,7 +1046,7 @@
                 mLauncher.updateVoiceButtonProxyVisible(false);
             }
         }
-    };
+    }
 
     protected void setWallpaperDimension() {
         String spKey = WallpaperCropActivity.getSharedPreferencesKey();
@@ -1572,7 +1572,7 @@
             } else {
                 for (int i = 0; i < getPageCount(); i++) {
                     final CellLayout cl = (CellLayout) getChildAt(i);
-                    cl.disableHardwareLayers();
+                    cl.enableHardwareLayer(false);
                 }
             }
         }
@@ -1592,17 +1592,16 @@
                     leftScreen--;
                 }
             }
+
+            final CellLayout customScreen = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID);
             for (int i = 0; i < screenCount; 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) getPageAt(i);
-                if (leftScreen <= i && i <= rightScreen && shouldDrawChild(layout)) {
-                    layout.enableHardwareLayers();
-                }
+
+                // enable layers between left and right screen inclusive, except for the
+                // customScreen, which may animate its content during transitions.
+                boolean enableLayer = layout != customScreen &&
+                        leftScreen <= i && i <= rightScreen && shouldDrawChild(layout);
+                layout.enableHardwareLayer(enableLayer);
             }
         }
     }
@@ -1780,19 +1779,16 @@
         if (mTouchState != TOUCH_STATE_REST) {
             return false;
         }
-        mLauncher.onInteractionBegin();
         enableOverviewMode(true, -1, true);
         return true;
     }
 
     public void exitOverviewMode(boolean animated) {
         exitOverviewMode(-1, animated);
-        mLauncher.onInteractionEnd();
     }
 
     public void exitOverviewMode(int snapPage, boolean animated) {
         enableOverviewMode(false, snapPage, animated);
-        mLauncher.onInteractionEnd();
     }
 
     private void enableOverviewMode(boolean enable, int snapPage, boolean animated) {
@@ -1835,6 +1831,19 @@
         return true;
     }
 
+    public void updateInteractionForState() {
+        if (mState != State.NORMAL) {
+            mLauncher.onInteractionBegin();
+        } else {
+            mLauncher.onInteractionEnd();
+        }
+    }
+
+    private void setState(State state) {
+        mState = state;
+        updateInteractionForState();
+    }
+
     Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage) {
         if (mState == state) {
             return null;
@@ -1850,7 +1859,7 @@
         final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
         final boolean oldStateIsSmall = (oldState == State.SMALL);
         final boolean oldStateIsOverview = (oldState == State.OVERVIEW);
-        mState = state;
+        setState(state);
         final boolean stateIsNormal = (state == State.NORMAL);
         final boolean stateIsSpringLoaded = (state == State.SPRING_LOADED);
         final boolean stateIsSmall = (state == State.SMALL);
@@ -4273,7 +4282,7 @@
         if (screenId == EXTRA_EMPTY_SCREEN_ID) {
             int count = mScreenOrder.size() - (hasCustomContent() ? 1 : 0);
             if (count > 1) {
-                return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_add,
+                return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_current,
                         R.drawable.ic_pageindicator_add);
             }
         }