merge in ics-release history after reset to master
diff --git a/res/layout-land/search_bar.xml b/res/layout-land/search_bar.xml
index 0dbfd7b..452a80c 100644
--- a/res/layout-land/search_bar.xml
+++ b/res/layout-land/search_bar.xml
@@ -27,7 +27,7 @@
         android:layout_height="wrap_content"
         android:src="@drawable/ic_search_normal_holo"
         android:adjustViewBounds="true"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickSearchButton"
         android:focusable="true"
         android:clickable="true"
@@ -49,7 +49,7 @@
         android:layout_height="wrap_content"
         android:src="@drawable/ic_voice_search_holo"
         android:adjustViewBounds="true"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickVoiceButton"
         android:focusable="true"
         android:clickable="true"
diff --git a/res/layout-large/search_bar.xml b/res/layout-large/search_bar.xml
index e26a96a..d6482fe 100644
--- a/res/layout-large/search_bar.xml
+++ b/res/layout-large/search_bar.xml
@@ -28,7 +28,7 @@
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:src="@drawable/ic_search_normal_holo"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickSearchButton"
         android:focusable="true"
         android:clickable="true"
@@ -51,7 +51,7 @@
         android:layout_height="wrap_content"
         android:layout_toRightOf="@+id/search_divider"
         android:src="@drawable/ic_voice_search_holo"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickVoiceButton"
         android:focusable="true"
         android:clickable="true"
diff --git a/res/layout-port/search_bar.xml b/res/layout-port/search_bar.xml
index 0de290a..b65da0b 100644
--- a/res/layout-port/search_bar.xml
+++ b/res/layout-port/search_bar.xml
@@ -27,7 +27,7 @@
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:layout_toLeftOf="@+id/voice_button"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickSearchButton"
         android:focusable="true"
         android:clickable="true"
@@ -50,7 +50,7 @@
         android:layout_alignParentTop="true"
         android:src="@drawable/ic_voice_search_holo"
         android:adjustViewBounds="true"
-        android:background="@drawable/button_bg"
+        android:background="?android:attr/selectableItemBackground"
         android:onClick="onClickVoiceButton"
         android:focusable="true"
         android:clickable="true"
diff --git a/res/values-large/styles.xml b/res/values-large/styles.xml
index ea1a8e6..41bd9cd 100644
--- a/res/values-large/styles.xml
+++ b/res/values-large/styles.xml
@@ -94,7 +94,7 @@
     </style>
     <style name="DropTargetButton">
         <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_height">match_parent</item>
         <item name="android:layout_gravity">center</item>
         <item name="android:gravity">center_vertical</item>
         <item name="android:drawablePadding">7.5dp</item>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index b356a42..15ca427 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -104,7 +104,7 @@
     </style>
     <style name="DropTargetButton">
         <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_height">match_parent</item>
         <item name="android:layout_gravity">center</item>
         <item name="android:gravity">center_vertical</item>
         <item name="android:drawablePadding">7.5dp</item>
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index e5fe7bd..53d154f 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -228,6 +228,7 @@
         // (top + bottom)
         mWidgetPreviewIconPaddedDimension =
             (int) (mAppIconSize * (1 + (2 * sWidgetPreviewIconPaddingPercentage)));
+        mFadeInAdjacentScreens = LauncherApplication.isScreenLarge();
     }
 
     @Override
@@ -567,7 +568,9 @@
         layout.allowHardwareLayerCreation();
         layout.createHardwareLayers();
 
-        prepareGenerateHoloOutlinesTask(page, items, images);
+        if (mFadeInAdjacentScreens) {
+            prepareGenerateHoloOutlinesTask(page, items, images);
+        }
     }
 
     /**
@@ -929,7 +932,10 @@
 
         invalidate();
         forceUpdateAdjacentPagesAlpha();
-        prepareGenerateHoloOutlinesTask(data.page, data.items, data.generatedImages);
+
+        if (mFadeInAdjacentScreens) {
+            prepareGenerateHoloOutlinesTask(data.page, data.items, data.generatedImages);
+        }
     }
     private void onHolographicPageItemsLoaded(AsyncTaskPageData data) {
         // Invalidate early to short-circuit children invalidates
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 9440b89..d9d0487 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -661,8 +661,10 @@
 
     @Override
     public void removeAllViewsInLayout() {
-        clearOccupiedCells();
-        mChildren.removeAllViewsInLayout();
+        if (mChildren.getChildCount() > 0) {
+            clearOccupiedCells();
+            mChildren.removeAllViewsInLayout();
+        }
     }
 
     public void removeViewWithoutMarkingCells(View view) {
@@ -1526,8 +1528,8 @@
         int smallerSize = Math.min(actualWidth, actualHeight);
 
         // Always round up to next largest cell
-        int spanX = (width + smallerSize) / smallerSize;
-        int spanY = (height + smallerSize) / smallerSize;
+        int spanX = (int) Math.ceil(width / (float) smallerSize);
+        int spanY = (int) Math.ceil(height / (float) smallerSize);
 
         if (result == null) {
             return new int[] { spanX, spanY };
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index 28c53d1..647a425 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -31,6 +31,7 @@
 import android.view.inputmethod.InputMethodManager;
 
 import com.android.launcher.R;
+import com.android.launcher2.DropTarget.DragObject;
 
 import java.util.ArrayList;
 
@@ -81,7 +82,7 @@
      */
     private int mScrollZone;
 
-    private DropTarget.DragObject mDragObject = new DropTarget.DragObject();
+    private DropTarget.DragObject mDragObject;
 
     /** Who can receive drop events */
     private ArrayList<DropTarget> mDropTargets = new ArrayList<DropTarget>();
@@ -275,6 +276,8 @@
 
         mDragging = true;
 
+        mDragObject = new DropTarget.DragObject();
+
         mDragObject.dragComplete = false;
         mDragObject.xOffset = mMotionDownX - (dragLayerX + dragRegionLeft);
         mDragObject.yOffset = mMotionDownY - (dragLayerY + dragRegionTop);
diff --git a/src/com/android/launcher2/IconCache.java b/src/com/android/launcher2/IconCache.java
index 20c5f34..04f97f3 100644
--- a/src/com/android/launcher2/IconCache.java
+++ b/src/com/android/launcher2/IconCache.java
@@ -69,11 +69,14 @@
     }
 
     public Drawable getFullResIcon(Resources resources, int iconId) {
+        Drawable d;
         try {
-            return resources.getDrawableForDensity(iconId, mIconDpi);
+            d = resources.getDrawableForDensity(iconId, mIconDpi);
         } catch (Resources.NotFoundException e) {
-            return getFullResDefaultActivityIcon();
+            d = null;
         }
+
+        return (d != null) ? d : getFullResDefaultActivityIcon();
     }
 
     public Drawable getFullResIcon(ResolveInfo info, PackageManager packageManager) {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index a8782ba..ac85f98 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1533,8 +1533,15 @@
      * @param v The view representing the clicked shortcut.
      */
     public void onClick(View v) {
-        // Make sure that rogue clicks don't get through while allapps is launching
-        if (mWorkspace.isSwitchingState()) return;
+        // Make sure that rogue clicks don't get through while allapps is launching, or after the
+        // view has detached (it's possible for this to happen if the view is removed mid touch).
+        if (v.getWindowToken() == null) {
+            return;
+        }
+
+        if (mWorkspace.isSwitchingState()) {
+            return;
+        }
 
         Object tag = v.getTag();
         if (tag instanceof ShortcutInfo) {
@@ -1692,6 +1699,7 @@
     }
 
     private void growAndFadeOutFolderIcon(FolderIcon fi) {
+        if (fi == null) return;
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.5f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.5f);
@@ -1708,6 +1716,7 @@
     }
 
     private void shrinkAndFadeInFolderIcon(FolderIcon fi) {
+        if (fi == null) return;
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index c8cf1f8..63e8077 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -382,8 +382,7 @@
         final ContentResolver cr = context.getContentResolver();
         item.onAddToDatabase(values);
 
-        Launcher l = (Launcher) context;
-        LauncherApplication app = (LauncherApplication) l.getApplication();
+        LauncherApplication app = (LauncherApplication) context.getApplicationContext();
         item.id = app.getLauncherProvider().generateNewId();
         values.put(LauncherSettings.Favorites._ID, item.id);
         item.updateValuesWithCoordinates(values, item.cellX, item.cellY);
@@ -506,7 +505,7 @@
                     sFolders.remove(info.id);
                     sWorkspaceItems.remove(info);
 
-                    cr.delete(LauncherSettings.Favorites.CONTENT_URI,
+                    cr.delete(LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION,
                             LauncherSettings.Favorites.CONTAINER + "=" + info.id, null);
                     for (ItemInfo childInfo : info.contents) {
                         sItemsIdMap.remove(childInfo.id);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 2c24440..26c00ad 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1137,16 +1137,18 @@
                 scrollProgress = Math.min(scrollProgress, 1.0f);
                 scrollProgress = Math.max(scrollProgress, -1.0f);
 
-                // If the current page (i) is being overscrolled, we use a different
-                // set of rules for setting the background alpha multiplier.
-                if ((mScrollX < 0 && i == 0) || (mScrollX > mMaxScrollX &&
-                        i == getChildCount() -1 )) {
-                    cl.setBackgroundAlphaMultiplier(
-                            overScrollBackgroundAlphaInterpolator(Math.abs(scrollProgress)));
-                    mOverScrollPageIndex = i;
-                } else if (mOverScrollPageIndex != i) {
-                    cl.setBackgroundAlphaMultiplier(
-                            backgroundAlphaInterpolator(Math.abs(scrollProgress)));
+                if (mState != State.SPRING_LOADED) {
+                    // If the current page (i) is being overscrolled, we use a different
+                    // set of rules for setting the background alpha multiplier.
+                    if ((mScrollX < 0 && i == 0) || (mScrollX > mMaxScrollX &&
+                            i == getChildCount() -1 )) {
+                        cl.setBackgroundAlphaMultiplier(
+                                overScrollBackgroundAlphaInterpolator(Math.abs(scrollProgress)));
+                        mOverScrollPageIndex = i;
+                    } else if (mOverScrollPageIndex != i) {
+                        cl.setBackgroundAlphaMultiplier(
+                                backgroundAlphaInterpolator(Math.abs(scrollProgress)));
+                    }
                 }
 
                 float rotation = WORKSPACE_ROTATION * scrollProgress;
@@ -1758,7 +1760,7 @@
                 // Set the final alpha depending on whether we are fading side pages.  On phone ui,
                 // we don't do any of the rotation, or the fading alpha in portrait.  See the
                 // ctor and screenScrolled().
-                if (mFadeInAdjacentScreens) {
+                if (mFadeInAdjacentScreens && !springLoaded) {
                     finalAlphaValue = (i == mCurrentPage) ? 1f : 0f;
                 } else {
                     finalAlphaValue = 1f;
@@ -2283,15 +2285,6 @@
             }
         }
 
-        // When you are in customization mode and drag to a particular screen, make that the
-        // new current/default screen, so any subsequent taps add items to that screen
-        if (!mLauncher.isAllAppsVisible()) {
-            int dragTargetIndex = indexOfChild(mDragTargetLayout);
-            if (dragTargetIndex > -1 && mCurrentPage != dragTargetIndex &&
-                    (isSmall() || mIsSwitchingState)) {
-                scrollToNewPageWithoutMovingPages(dragTargetIndex);
-            }
-        }
         CellLayout dropTargetLayout = mDragTargetLayout;
 
         int snapScreen = -1;
@@ -2344,7 +2337,7 @@
                         (int) mDragViewVisualCenter[1], mDragInfo.spanX, mDragInfo.spanY, cell,
                         dropTargetLayout, mTargetCell);
 
-                if (mInScrollArea && !hasMovedIntoHotseat && mState != State.SPRING_LOADED) {
+                if (mCurrentPage != screen && !hasMovedIntoHotseat) {
                     snapScreen = screen;
                     snapToPage(screen);
                 }