Merge "Changing menus to show Wallpapers, Manage Apps, Help. (5114668)"
diff --git a/res/layout-xlarge/apps_customize_widget.xml b/res/layout-xlarge/apps_customize_widget.xml
new file mode 100644
index 0000000..31c3fbe
--- /dev/null
+++ b/res/layout-xlarge/apps_customize_widget.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher2.PagedViewWidget
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_weight="1"
+    android:orientation="vertical"
+
+    launcher:blurColor="#FF6B8CF0"
+    launcher:outlineColor="#FF8CD2FF"
+
+    android:background="@drawable/focusable_view_bg"
+    android:focusable="true">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="4dp"
+        android:orientation="vertical"
+        android:background="@drawable/widget_info_bg">
+        <!-- The name of the widget. -->
+        <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:id="@+id/widget_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:gravity="left|bottom"
+            android:singleLine="true"
+            android:ellipsize="marquee"
+            android:fadingEdge="horizontal"
+
+            android:textColor="#FFBBBBBB"
+            android:textSize="14sp"
+            android:shadowColor="#FF000000"
+            android:shadowDx="0.0"
+            android:shadowDy="1.0"
+            android:shadowRadius="1.0" />
+
+        <!-- The original dimensions of the widget (can't be the same text as above due to different
+             style. -->
+        <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:id="@+id/widget_dims"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:gravity="left|bottom"
+
+            android:textColor="#FF999999"
+            android:textSize="12sp"
+            android:shadowColor="#99000000"
+            android:shadowDx="0.0"
+            android:shadowDy="1.0"
+            android:shadowRadius="1.0" />
+    </LinearLayout>
+
+    <!-- The icon of the widget. -->
+    <ImageView
+        android:id="@+id/widget_preview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:adjustViewBounds="true"
+        android:scaleType="fitStart" />
+</com.android.launcher2.PagedViewWidget>
diff --git a/res/layout/apps_customize_widget.xml b/res/layout/apps_customize_widget.xml
index 31c3fbe..57a9962 100644
--- a/res/layout/apps_customize_widget.xml
+++ b/res/layout/apps_customize_widget.xml
@@ -29,18 +29,18 @@
     android:focusable="true">
 
     <LinearLayout
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginBottom="4dp"
-        android:orientation="vertical"
+        android:orientation="horizontal"
         android:background="@drawable/widget_info_bg">
         <!-- The name of the widget. -->
         <TextView xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/widget_name"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:gravity="left|bottom"
+            android:layout_weight="1"
+            android:gravity="left"
             android:singleLine="true"
             android:ellipsize="marquee"
             android:fadingEdge="horizontal"
@@ -58,10 +58,12 @@
             android:id="@+id/widget_dims"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_gravity="bottom"
+            android:layout_marginLeft="5dp"
             android:layout_weight="0"
-            android:gravity="left|bottom"
+            android:gravity="left"
 
-            android:textColor="#FF999999"
+            android:textColor="#FF666666"
             android:textSize="12sp"
             android:shadowColor="#99000000"
             android:shadowDx="0.0"
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index ea761ce..4f6bc41 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -60,5 +60,5 @@
     <dimen name="apps_customize_widget_cell_width_gap">30dp</dimen>
     <dimen name="apps_customize_widget_cell_height_gap">5dp</dimen>
     <integer name="apps_customize_widget_cell_count_x">3</integer>
-    <integer name="apps_customize_widget_cell_count_y">1</integer>
+    <integer name="apps_customize_widget_cell_count_y">2</integer>
 </resources>
diff --git a/res/values-large-land/dimens.xml b/res/values-large-land/dimens.xml
index 4358ff9..61d993e 100644
--- a/res/values-large-land/dimens.xml
+++ b/res/values-large-land/dimens.xml
@@ -35,4 +35,6 @@
     <dimen name="apps_customize_pageLayoutPaddingBottom">14dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingLeft">40dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingRight">40dp</dimen>
+    <integer name="apps_customize_widget_cell_count_x">3</integer>
+    <integer name="apps_customize_widget_cell_count_y">2</integer>
 </resources>
diff --git a/res/values-large-port/dimens.xml b/res/values-large-port/dimens.xml
index 4e1cf8f..ebf837d 100644
--- a/res/values-large-port/dimens.xml
+++ b/res/values-large-port/dimens.xml
@@ -38,4 +38,6 @@
     <dimen name="apps_customize_pageLayoutPaddingBottom">10dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingLeft">10dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingRight">10dp</dimen>
+    <integer name="apps_customize_widget_cell_count_x">2</integer>
+    <integer name="apps_customize_widget_cell_count_y">3</integer>
 </resources>
\ No newline at end of file
diff --git a/res/values-port/dimens.xml b/res/values-port/dimens.xml
index 088d3fd..2abd9d7 100644
--- a/res/values-port/dimens.xml
+++ b/res/values-port/dimens.xml
@@ -36,5 +36,5 @@
     <dimen name="apps_customize_widget_cell_width_gap">20dp</dimen>
     <dimen name="apps_customize_widget_cell_height_gap">10dp</dimen>
     <integer name="apps_customize_widget_cell_count_x">2</integer>
-    <integer name="apps_customize_widget_cell_count_y">2</integer>
+    <integer name="apps_customize_widget_cell_count_y">3</integer>
 </resources>
diff --git a/res/values-xlarge-land/dimens.xml b/res/values-xlarge-land/dimens.xml
new file mode 100644
index 0000000..6a54265
--- /dev/null
+++ b/res/values-xlarge-land/dimens.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <integer name="apps_customize_widget_cell_count_x">4</integer>
+    <integer name="apps_customize_widget_cell_count_y">2</integer>
+</resources>
\ No newline at end of file
diff --git a/res/values-xlarge-port/dimens.xml b/res/values-xlarge-port/dimens.xml
index 0850e8c..22d56d9 100644
--- a/res/values-xlarge-port/dimens.xml
+++ b/res/values-xlarge-port/dimens.xml
@@ -18,4 +18,6 @@
     <!-- We can also afford to have a slightly wider portrait layout in
          xlarge -->
     <dimen name="apps_customize_pageLayoutWidthGap">36dp</dimen>
+    <integer name="apps_customize_widget_cell_count_x">3</integer>
+    <integer name="apps_customize_widget_cell_count_y">3</integer>
 </resources>
\ No newline at end of file
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index 16dad1b..9d03995 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -282,8 +282,6 @@
         mWidgetSpacingLayout.calculateCellCount(width, height, maxCellCountX, maxCellCountY);
         mCellCountX = mWidgetSpacingLayout.getCellCountX();
         mCellCountY = mWidgetSpacingLayout.getCellCountY();
-        mWidgetCountX = Math.max(1, (int) Math.round(mCellCountX / 2f));
-        mWidgetCountY = Math.max(1, (int) Math.round(mCellCountY / 3f));
 
         // Force a measure to update recalculate the gaps
         int widthSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.AT_MOST);
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index 45f58a4..e25ce5c 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -38,7 +38,7 @@
  * because we want to make the bubble taller than the text and TextView's clip is
  * too aggressive.
  */
-public class BubbleTextView extends TextView implements VisibilityChangedBroadcaster {
+public class BubbleTextView extends TextView {
     static final float CORNER_RADIUS = 4.0f;
     static final float SHADOW_LARGE_RADIUS = 4.0f;
     static final float SHADOW_SMALL_RADIUS = 1.75f;
@@ -67,8 +67,6 @@
 
     private boolean mStayPressed;
 
-    private VisibilityChangedListener mOnVisibilityChangedListener;
-
     public BubbleTextView(Context context) {
         super(context);
         init();
@@ -240,18 +238,6 @@
         return result;
     }
 
-    public void setVisibilityChangedListener(VisibilityChangedListener listener) {
-        mOnVisibilityChangedListener = listener;
-    }
-
-    @Override
-    protected void onVisibilityChanged(View changedView, int visibility) {
-        if (mOnVisibilityChangedListener != null) {
-            mOnVisibilityChangedListener.receiveVisibilityChangedMessage(this);
-        }
-        super.onVisibilityChanged(changedView, visibility);
-    }
-
     void setStayPressed(boolean stayPressed) {
         mStayPressed = stayPressed;
         if (!stayPressed) {
diff --git a/src/com/android/launcher2/CachedViewGroup.java b/src/com/android/launcher2/CachedViewGroup.java
deleted file mode 100644
index f314b32..0000000
--- a/src/com/android/launcher2/CachedViewGroup.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import com.android.launcher.R;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Bitmap.Config;
-import android.graphics.PorterDuff.Mode;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-
-// This class caches the drawing of this View's children in a bitmap when the scale factor
-// falls below a certain size. Only used by CellLayout, but in a separate class to keep cache
-// logic separate from the other logic in CellLayout
-public class CachedViewGroup extends ViewGroup implements VisibilityChangedListener {
-    static final String TAG = "CachedViewGroup";
-
-    private Bitmap mCache;
-    private Canvas mCacheCanvas;
-    private Rect mCacheRect;
-    private Paint mCachePaint;
-
-    private boolean mIsCacheEnabled = true;
-    private boolean mDisableCacheUpdates = false;
-    private boolean mForceCacheUpdate = false;
-    private boolean isUpdatingCache = false;
-    private boolean mIsCacheDirty = true;
-    private float mBitmapCacheScale;
-    private float mMaxScaleForUsingBitmapCache;
-
-    private Rect mBackgroundRect;
-
-    public CachedViewGroup(Context context) {
-        super(context);
-        init();
-    }
-
-    public CachedViewGroup(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init();
-    }
-
-    private void init() {
-        mBackgroundRect = new Rect();
-        mCacheRect = new Rect();
-        final Resources res = getResources();
-        mBitmapCacheScale =
-            res.getInteger(R.integer.config_workspaceScreenBitmapCacheScale) / 100.0f;
-        mMaxScaleForUsingBitmapCache =
-            res.getInteger(R.integer.config_maxScaleForUsingWorkspaceScreenBitmapCache) / 100.0f;
-        mCacheCanvas = new Canvas();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        // sub-classes (namely CellLayout) will need to implement this
-        prepareCacheBitmap();
-        invalidateCache();
-    }
-
-    private void invalidateIfNeeded() {
-        if (mIsCacheDirty) {
-            // Force a redraw to update the cache if it's dirty
-            invalidate();
-        }
-    }
-
-    public void enableCache() {
-        mIsCacheEnabled = true;
-        invalidateIfNeeded();
-    }
-
-    public void disableCache() {
-        mIsCacheEnabled = false;
-    }
-
-    public void disableCacheUpdates() {
-        mDisableCacheUpdates = true;
-        // Force just one update before we enter a period of no cache updates
-        mForceCacheUpdate = true;
-    }
-
-    public void enableCacheUpdates() {
-        mDisableCacheUpdates = false;
-        invalidateIfNeeded();
-    }
-
-    private void invalidateCache() {
-        mIsCacheDirty = true;
-        invalidate();
-    }
-
-    public void receiveVisibilityChangedMessage(View v) {
-        invalidateCache();
-    }
-
-    private void prepareCacheBitmap() {
-        if (mCache == null) {
-            mCache = Bitmap.createBitmap((int) (getWidth() * mBitmapCacheScale),
-                    (int) (getHeight() * mBitmapCacheScale), Config.ARGB_8888);
-
-            mCachePaint = new Paint();
-            mCachePaint.setFilterBitmap(true);
-            mCacheCanvas.setBitmap(mCache);
-            mCacheCanvas.scale(mBitmapCacheScale, mBitmapCacheScale);
-        }
-    }
-
-
-    public void updateCache() {
-        mCacheCanvas.drawColor(0, Mode.CLEAR);
-
-        float alpha = getAlpha();
-        setAlpha(1.0f);
-        isUpdatingCache = true;
-        drawChildren(mCacheCanvas);
-        isUpdatingCache = false;
-        setAlpha(alpha);
-
-        mIsCacheDirty = false;
-    }
-
-    public void drawChildren(Canvas canvas) {
-        super.dispatchDraw(canvas);
-    }
-
-    @Override
-    public void removeAllViews() {
-        super.removeAllViews();
-        invalidateCache();
-    }
-
-    @Override
-    public void removeAllViewsInLayout() {
-        super.removeAllViewsInLayout();
-        invalidateCache();
-    }
-
-    @Override
-    public void removeView(View view) {
-        super.removeView(view);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewAt(int index) {
-        super.removeViewAt(index);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewInLayout(View view) {
-        super.removeViewInLayout(view);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViews(int start, int count) {
-        super.removeViews(start, count);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewsInLayout(int start, int count) {
-        super.removeViewsInLayout(start, count);
-        invalidateCache();
-    }
-
-    @Override
-    public void dispatchDraw(Canvas canvas) {
-        final int count = getChildCount();
-
-        boolean useBitmapCache = false;
-        if (!isUpdatingCache) {
-            if (!mIsCacheDirty) {
-                // Check if one of the children (an icon or widget) is dirty
-                for (int i = 0; i < count; i++) {
-                    final View child = getChildAt(i);
-                    if (child.isDirty()) {
-                        mIsCacheDirty = true;
-                        break;
-                    }
-                }
-            }
-
-            useBitmapCache = mIsCacheEnabled && getScaleX() < mMaxScaleForUsingBitmapCache;
-            if (mForceCacheUpdate ||
-                    (useBitmapCache && !mDisableCacheUpdates)) {
-                // Sometimes we force a cache update-- this is used to make sure the cache will look as
-                // up-to-date as possible right when we disable cache updates
-                if (mIsCacheDirty) {
-                    updateCache();
-                }
-                mForceCacheUpdate = false;
-            }
-        }
-
-        if (useBitmapCache) {
-            mCachePaint.setAlpha((int)(255*getAlpha()));
-            canvas.drawBitmap(mCache, mCacheRect, mBackgroundRect, mCachePaint);
-        } else {
-            super.dispatchDraw(canvas);
-        }
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        super.addView(child, index, params);
-
-        // invalidate the cache to have it reflect the new item
-        invalidateCache();
-
-        if (child instanceof VisibilityChangedBroadcaster) {
-            VisibilityChangedBroadcaster v = (VisibilityChangedBroadcaster) child;
-            v.setVisibilityChangedListener(this);
-        }
-    }
-
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        mBackgroundRect.set(0, 0, w, h);
-        mCacheRect.set(0, 0, (int) (mBitmapCacheScale * w), (int) (mBitmapCacheScale * h));
-        mCache = null;
-        prepareCacheBitmap();
-        invalidateCache();
-    }
-}
-
-
-//Custom interfaces used to listen to "visibility changed" events of *children* of Views. Avoided
-//using "onVisibilityChanged" in the names because there's a method of that name in framework
-//(which can only can be used to listen to ancestors' "visibility changed" events)
-interface VisibilityChangedBroadcaster {
-    public void setVisibilityChangedListener(VisibilityChangedListener listener);
-}
-
-interface VisibilityChangedListener {
-    public void receiveVisibilityChangedMessage(View v);
-}
\ No newline at end of file
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index a17e2d6..6f59d1f 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -292,8 +292,20 @@
         return minGap * (numCells - 1) + cellHeight * numCells;
     }
 
+    @Override
+    public void setChildrenLayersEnabled(boolean enabled) {
+        // see "Hardware Layer Note" lower in the code
+        if (LauncherApplication.isScreenLarge()) {
+            super.setChildrenLayersEnabled(enabled);
+        } else {
+            mChildren.setChildrenLayersEnabled(enabled);
+        }
+    }
     public void enableHardwareLayers() {
-        mChildren.enableHardwareLayers();
+        // see "Hardware Layer Note" lower in the code
+        if (LauncherApplication.isScreenLarge()) {
+            mChildren.enableHardwareLayers();
+        }
     }
 
     public void setGridSize(int x, int y) {
@@ -638,6 +650,16 @@
 
             child.setId(childId);
 
+            if (!LauncherApplication.isScreenLarge()) {
+                // Hardware Layer Note:
+                // On phones, we set hardware layers on individual items
+                // On tablets, we set hardware layers on the entire mChildren view
+                // Setting the hardware layers on individual items only uses
+                // less memory but on tablet-size devices it has worse performance
+                // (a drop of ~6fps) whereas on phones the performance is the same
+                // with both approaches
+                child.setLayerType(LAYER_TYPE_HARDWARE, null);
+            }
             mChildren.addView(child, index, lp);
 
             if (markCells) markCellsAsOccupiedForView(child);
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 490971e..7ab41bc 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1709,7 +1709,8 @@
         FolderInfo info = (FolderInfo) fi.getTag();
         if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
             CellLayout cl = (CellLayout) fi.getParent().getParent();
-            cl.setFolderLeaveBehindCell(info.cellX, info.cellY);
+            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) fi.getLayoutParams();
+            cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY);
         }
 
         ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(fi, alpha, scaleX, scaleY);
diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java
index 670c8b6..7c3b993 100644
--- a/src/com/android/launcher2/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java
@@ -30,12 +30,10 @@
 /**
  * {@inheritDoc}
  */
-public class LauncherAppWidgetHostView extends AppWidgetHostView
-    implements VisibilityChangedBroadcaster {
+public class LauncherAppWidgetHostView extends AppWidgetHostView {
     private boolean mHasPerformedLongPress;
     private CheckForLongPress mPendingCheckForLongPress;
     private LayoutInflater mInflater;
-    private VisibilityChangedListener mOnVisibilityChangedListener;
 
     public LauncherAppWidgetHostView(Context context) {
         super(context);
@@ -120,18 +118,6 @@
         }
     }
 
-    public void setVisibilityChangedListener(VisibilityChangedListener listener) {
-        mOnVisibilityChangedListener = listener;
-    }
-
-    @Override
-    protected void onVisibilityChanged(View changedView, int visibility) {
-        if (mOnVisibilityChangedListener != null) {
-            mOnVisibilityChangedListener.receiveVisibilityChangedMessage(this);
-        }
-        super.onVisibilityChanged(changedView, visibility);
-    }
-
     @Override
     public int getDescendantFocusability() {
         return ViewGroup.FOCUS_BLOCK_DESCENDANTS;
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index d9c2a84..053c2ea 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -111,8 +111,10 @@
         name.setText(info.label);
         name.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
         final TextView dims = (TextView) findViewById(R.id.widget_dims);
-        dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1]));
-        dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        if (dims != null) {
+            dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1]));
+            dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        }
     }
 
     public void applyFromResolveInfo(PackageManager pm, ResolveInfo info,
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index e2fcfec..947c946 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -390,7 +390,9 @@
         return SmoothPagedView.X_LARGE_MODE;
     }
 
-    private void onAddView(View child) {
+    @Override
+    protected void onViewAdded(View child) {
+        super.onViewAdded(child);
         if (!(child instanceof CellLayout)) {
             throw new IllegalArgumentException("A Workspace can only have CellLayout children.");
         }
@@ -400,36 +402,6 @@
         cl.enableHardwareLayers();
     }
 
-    @Override
-    public void addView(View child, int index, LayoutParams params) {
-        onAddView(child);
-        super.addView(child, index, params);
-    }
-
-    @Override
-    public void addView(View child) {
-        onAddView(child);
-        super.addView(child);
-    }
-
-    @Override
-    public void addView(View child, int index) {
-        onAddView(child);
-        super.addView(child, index);
-    }
-
-    @Override
-    public void addView(View child, int width, int height) {
-        onAddView(child);
-        super.addView(child, width, height);
-    }
-
-    @Override
-    public void addView(View child, LayoutParams params) {
-        onAddView(child);
-        super.addView(child, params);
-    }
-
     /**
      * @return The open folder on the current screen, or null if there is none
      */