diff --git a/res/layout/apps_customize_pane.xml b/res/layout/apps_customize_pane.xml
index 1b01b48..efd29a6 100644
--- a/res/layout/apps_customize_pane.xml
+++ b/res/layout/apps_customize_pane.xml
@@ -29,6 +29,7 @@
             android:id="@+id/tabs_container"
             android:layout_width="wrap_content"
             android:layout_height="@dimen/apps_customize_tab_bar_height"
+            android:layout_marginTop="@dimen/apps_customize_tab_bar_margin_top"
             android:layout_gravity="center_horizontal">
             <com.android.launcher2.FocusOnlyTabWidget
                 android:id="@android:id/tabs"
@@ -36,7 +37,8 @@
                 android:layout_height="match_parent"
                 android:layout_gravity="left"
                 android:background="@drawable/tab_unselected_holo"
-                android:tabStripEnabled="false" />
+                android:tabStripEnabled="false"
+                android:divider="@null" />
             <include
                 android:id="@+id/market_button"
                 layout="@layout/market_button"
diff --git a/res/values-sw340dp-port/dimens.xml b/res/values-sw340dp-port/dimens.xml
index ef44913..bf7ebc3 100644
--- a/res/values-sw340dp-port/dimens.xml
+++ b/res/values-sw340dp-port/dimens.xml
@@ -59,7 +59,4 @@
     <dimen name="apps_customize_pageLayoutPaddingRight">8dp</dimen>
     <dimen name="apps_customize_cell_height">92dp</dimen>
     <dimen name="apps_customize_widget_cell_height_gap">16dp</dimen>
-
-<!-- Folders -->
-    <dimen name="folder_preview_size">64dp</dimen>
 </resources>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 584734b..5c3b950 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -33,6 +33,7 @@
 
 <!-- AppsCustomize -->
     <dimen name="apps_customize_tab_bar_height">56dp</dimen>
+    <dimen name="apps_customize_tab_bar_margin_top">8dp</dimen>
     <dimen name="apps_customize_cell_width">96dp</dimen>
     <dimen name="apps_customize_cell_height">98dp</dimen>
     <dimen name="apps_customize_widget_cell_width_gap">36dp</dimen>
@@ -74,7 +75,7 @@
 
 <!-- Folders -->
     <!-- The size of the image which sits behind the preview of the folder contents -->
-    <dimen name="folder_preview_size">80dp</dimen>
+    <dimen name="folder_preview_size">78dp</dimen>
     <!-- The amount that the preview contents are inset from the preview background -->
     <dimen name="folder_preview_padding">4dp</dimen>
 </resources>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index ec281f9..70e24be 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -28,11 +28,13 @@
         <item name="android:textSize">13sp</item>
     </style>
     <style name="WorkspaceIcon.Portrait.Folder">
+        <item name="android:drawablePadding">0dp</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">0dp</item>
         <item name="android:paddingBottom">0dp</item>
         <item name="android:textSize">13sp</item>
+        <item name="android:layout_marginTop">-2dp</item>
     </style>
     <style name="WorkspaceIcon.Landscape">
         <item name="android:drawablePadding">0dp</item>
@@ -43,11 +45,13 @@
         <item name="android:textSize">13sp</item>
     </style>
     <style name="WorkspaceIcon.Landscape.Folder">
+        <item name="android:drawablePadding">0dp</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">0dp</item>
         <item name="android:paddingBottom">0dp</item>
         <item name="android:textSize">13sp</item>
+        <item name="android:layout_marginTop">-2dp</item>
     </style>
 
     <style name="Theme" parent="android:Theme.Holo.Wallpaper.NoTitleBar">
@@ -77,6 +81,8 @@
     <style name="TabIndicator.AppsCustomize">
         <item name="android:paddingTop">16dp</item>
         <item name="android:paddingBottom">20dp</item>
+        <item name="android:paddingLeft">48dp</item>
+        <item name="android:paddingRight">48dp</item>
         <item name="android:textSize">14sp</item>
     </style>
 
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 5ad3af9..164f1e1 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -32,7 +32,7 @@
     <string name="external_drop_widget_error" msgid="127440783198670829">"Không thể thả mục vào Màn hình chính này."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Chọn tiện ích con để tạo"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Tên thư mục"</string>
-    <string name="rename_folder_title" msgid="4544573104191526550">"Đổi tên thư mục"</string>
+    <string name="rename_folder_title" msgid="4544573104191526550">"Đổi tên thư mục"</string>
     <string name="rename_action" msgid="6016003384693240896">"OK"</string>
     <string name="cancel_action" msgid="3811860427489435048">"Hủy"</string>
     <string name="menu_item_add_item" msgid="6233177331075781114">"Thêm vào Màn hình chính"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index da82809..87c9be8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -59,6 +59,7 @@
     <!-- The height of the tab bar - if this changes, we should update the
          external icon width/height above to compensate -->
     <dimen name="apps_customize_tab_bar_height">52dp</dimen>
+    <dimen name="apps_customize_tab_bar_margin_top">0dp</dimen>
     <dimen name="app_icon_size">48dp</dimen>
     <!-- The width can be 72dp because we don't have L/R padding -->
     <dimen name="apps_customize_cell_width">74dp</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e38c395..ddbdb34 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -86,7 +86,7 @@
 
     <style name="WorkspaceIcon.Portrait.Folder">
         <item name="android:drawablePadding">0dp</item>
-        <item name="android:paddingTop">0dp</item>
+        <item name="android:paddingTop">2dp</item>
     </style>
     <style name="WorkspaceIcon.Landscape.Folder">
         <item name="android:drawablePadding">0dp</item>
diff --git a/res/xml/update_workspace.xml b/res/xml/update_workspace.xml
new file mode 100644
index 0000000..44a3f9e
--- /dev/null
+++ b/res/xml/update_workspace.xml
@@ -0,0 +1,49 @@
+<?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.
+-->
+
+<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
+    <!-- Update the db with new hotseat items.  Note that we reference the browser's original
+         package name. -->
+    <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
+    <favorite
+        launcher:packageName="com.android.contacts"
+        launcher:className="com.android.contacts.activities.DialtactsActivity"
+        launcher:container="-101"
+        launcher:screen="0"
+        launcher:x="0"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.contacts"
+        launcher:className="com.android.contacts.activities.PeopleActivity"
+        launcher:container="-101"
+        launcher:screen="1"
+        launcher:x="1"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.mms"
+        launcher:className="com.android.mms.ui.ConversationList"
+        launcher:container="-101"
+        launcher:screen="3"
+        launcher:x="3"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.browser"
+        launcher:className="com.android.browser.BrowserActivity"
+        launcher:container="-101"
+        launcher:screen="4"
+        launcher:x="4"
+        launcher:y="0" />
+</favorites>
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 334b369..897a7fb 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -171,7 +171,7 @@
 
     private void reloadCurrentPage() {
         if (!LauncherApplication.isScreenLarge()) {
-            mAppsCustomizePane.flashScrollingIndicator();
+            mAppsCustomizePane.flashScrollingIndicator(true);
         }
         mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage());
         mAppsCustomizePane.requestFocus();
@@ -355,19 +355,19 @@
     public boolean onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace) {
         mInTransition = true;
         boolean delayLauncherTransitionUntilLayout = false;
+        boolean animated = (animation != null);
         mLauncherTransition = null;
 
-        // if the content wasn't visible before, delay the launcher animation until after a cal
+        // if the content wasn't visible before, delay the launcher animation until after a call
         // to layout -- this prevents a blip
-        if (animation != null) {
-            if (mContent.getVisibility() == GONE) {
-                mLauncherTransition = animation;
-                delayLauncherTransitionUntilLayout = true;
-            }
-            mContent.setVisibility(VISIBLE);
-            if (!delayLauncherTransitionUntilLayout) {
-                enableAndBuildHardwareLayer();
-            }
+        if (animated && mContent.getVisibility() == GONE) {
+            mLauncherTransition = animation;
+            delayLauncherTransitionUntilLayout = true;
+        }
+        mContent.setVisibility(VISIBLE);
+
+        if (animated && !delayLauncherTransitionUntilLayout) {
+            enableAndBuildHardwareLayer();
         }
 
         if (!toWorkspace && !LauncherApplication.isScreenLarge()) {
diff --git a/src/com/android/launcher2/CachedTextView.java b/src/com/android/launcher2/CachedTextView.java
deleted file mode 100644
index f9f68a0..0000000
--- a/src/com/android/launcher2/CachedTextView.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2010 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 android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.drawable.Drawable;
-import android.text.Layout;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-/*
- * This class is a bit of a hack, designed to speed up long text labels in Launcher. It caches the
- * text in a TextView to a bitmap and then just draws that Bitmap instead afterward, speeding up
- * rendering. Marquee scrolling is not currently supported.
- *
- */
-public class CachedTextView extends TextView {
-    private Bitmap mCache;
-    private final Paint mCachePaint = new Paint();
-    private final Canvas mCacheCanvas = new Canvas();
-
-    private int mPrevAlpha = -1;
-    private boolean mIsBuildingCache;
-    boolean mIsTextCacheDirty;
-    float mTextCacheLeft;
-    float mTextCacheTop;
-    float mTextCacheScrollX;
-    float mRectLeft, mRectTop;
-    private float mPaddingH = 0;
-    private float mPaddingV = 0;
-    private CharSequence mText;
-    private boolean mEnabled = true;
-
-    public CachedTextView(Context context) {
-        super(context);
-    }
-
-    public CachedTextView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public CachedTextView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    protected int getCacheTopPadding() {
-        return 0;
-    }
-    protected int getCacheLeftPadding() {
-        return 0;
-    }
-    protected int getCacheRightPadding() {
-        return 0;
-    }
-    protected int getCacheBottomPadding() {
-        return 0;
-    }
-
-    public void disableCache() {
-        mEnabled = false;
-    }
-
-    public void setText(CharSequence text, BufferType type) {
-        super.setText(text, type);
-        mIsTextCacheDirty = true;
-    }
-
-    private void buildAndUpdateCache() {
-        final Layout layout = getLayout();
-        final int left = getCompoundPaddingLeft();
-        final int top = getExtendedPaddingTop();
-        final float prevAlpha = getAlpha();
-
-        mTextCacheLeft = layout.getLineLeft(0) - getCacheLeftPadding();
-        mTextCacheTop = top + layout.getLineTop(0) - mPaddingV - getCacheTopPadding();
-
-        mRectLeft = mScrollX + getLeft();
-        mRectTop = 0;
-        mTextCacheScrollX = mScrollX;
-
-        final float textCacheRight =
-            Math.min(left + layout.getLineRight(0) + mPaddingH, mScrollX + mRight - mLeft) +
-            getCacheRightPadding();
-        final float textCacheBottom = top + layout.getLineBottom(0) + mPaddingV +
-            getCacheBottomPadding();
-        final float xCharWidth = getPaint().measureText("x");
-
-        int width = (int) (textCacheRight - mTextCacheLeft + (2 * xCharWidth));
-        int height = (int) (textCacheBottom - mTextCacheTop);
-
-        if (width > 0 && height > 0) {
-            if (mCache != null) {
-                if (mCache.getWidth() != width || mCache.getHeight() != height) {
-                    mCache.recycle();
-                    mCache = null;
-                }
-            }
-            if (mCache == null) {
-                mCache = Bitmap.createBitmap(width, height, Config.ARGB_8888);
-                mCacheCanvas.setBitmap(mCache);
-            } else {
-                mCacheCanvas.drawColor(0, Mode.CLEAR);
-            }
-
-            mCacheCanvas.save();
-            mCacheCanvas.translate(-mTextCacheLeft, -mTextCacheTop);
-
-            mIsBuildingCache = true;
-            setAlpha(1.0f);
-            draw(mCacheCanvas);
-            setAlpha(prevAlpha);
-            mIsBuildingCache = false;
-            mCacheCanvas.restore();
-            mCacheCanvas.setBitmap(null);
-
-            // A hack-- we set the text to be one space (we don't make it empty just to avoid any
-            // potential issues with text measurement, like line height, etc.) so that the text view
-            // doesn't draw it anymore, since it's been cached.
-            mText = getText();
-            setText(" ");
-        }
-    }
-
-    public CharSequence getText() {
-        return (mText == null) ? super.getText() : mText;
-    }
-
-    public void draw(Canvas canvas) {
-        if (mEnabled && mIsTextCacheDirty && !mIsBuildingCache) {
-            buildAndUpdateCache();
-            mIsTextCacheDirty = false;
-        }
-        if (mCache != null && !mIsBuildingCache) {
-            canvas.drawBitmap(mCache, mTextCacheLeft - mTextCacheScrollX + mScrollX,
-                    mTextCacheTop, mCachePaint);
-        }
-        super.draw(canvas);
-    }
-
-    protected boolean isBuildingCache() {
-        return mIsBuildingCache;
-    }
-
-    @Override
-    protected boolean onSetAlpha(int alpha) {
-        if (mPrevAlpha != alpha) {
-            mPrevAlpha = alpha;
-            mCachePaint.setAlpha(alpha);
-
-            // We manually update the drawables alpha since the default TextView implementation may
-            // not do this if there is a background set (which we may due to the focus bg)
-            final Drawable[] dr = getCompoundDrawables();
-            for (int i = 0; i < dr.length; ++i) {
-                if (dr[i] != null) {
-                    dr[i].mutate().setAlpha(alpha);
-                }
-            }
-
-            super.onSetAlpha(alpha);
-        }
-        return true;
-    }
-}
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 7ee03fc..43510c2 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -78,6 +78,7 @@
 import android.view.View;
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AccelerateDecelerateInterpolator;
@@ -161,6 +162,7 @@
     private enum State { WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED };
     private State mState = State.WORKSPACE;
     private AnimatorSet mStateAnimation;
+    private AnimatorSet mDividerAnimator;
 
     static final int APPWIDGET_HOST_ID = 1024;
     private static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300;
@@ -177,8 +179,11 @@
 
     private LayoutInflater mInflater;
 
-    private DragController mDragController;
     private Workspace mWorkspace;
+    private View mQsbDivider;
+    private View mDockDivider;
+    private DragLayer mDragLayer;
+    private DragController mDragController;
 
     private AppWidgetManager mAppWidgetManager;
     private LauncherAppWidgetHost mAppWidgetHost;
@@ -241,7 +246,6 @@
 
     static final ArrayList<String> sDumpLogs = new ArrayList<String>();
 
-    private DragLayer mDragLayer;
 
     private BubbleTextView mWaitingForResume;
 
@@ -560,7 +564,24 @@
         // market intent, so refresh the icon
         updateAppMarketIcon();
         if (!mWorkspaceLoading) {
-            mWorkspace.post(mBuildLayersRunnable);
+            final ViewTreeObserver observer = mWorkspace.getViewTreeObserver();
+            final Workspace workspace = mWorkspace;
+            // We want to let Launcher draw itself at least once before we force it to build
+            // layers on all the workspace pages, so that transitioning to Launcher from other
+            // apps is nice and speedy. Usually the first call to preDraw doesn't correspond to
+            // a true draw so we wait until the second preDraw call to be safe
+            observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+                boolean mFirstTime = true;
+                public boolean onPreDraw() {
+                    if (mFirstTime) {
+                        mFirstTime = false;
+                    } else {
+                        workspace.post(mBuildLayersRunnable);
+                        observer.removeOnPreDrawListener(this);
+                    }
+                    return true;
+                }
+            });
         }
         clearTypedText();
     }
@@ -726,6 +747,8 @@
 
         mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
         mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace);
+        mQsbDivider = (ImageView) findViewById(R.id.qsb_divider);
+        mDockDivider = (ImageView) findViewById(R.id.dock_divider);
 
         // Setup the drag layer
         mDragLayer.setup(this, dragController);
@@ -2252,7 +2275,7 @@
                     if (!springLoaded && !LauncherApplication.isScreenLarge()) {
                         // Hide the workspace scrollbar
                         mWorkspace.hideScrollingIndicator(true);
-                        mWorkspace.hideDockDivider(true);
+                        hideDockDivider();
                     }
                     if (!animationCancelled) {
                         updateWallpaperVisibility(false);
@@ -2294,7 +2317,7 @@
                 if (!springLoaded && !LauncherApplication.isScreenLarge()) {
                     // Hide the workspace scrollbar
                     mWorkspace.hideScrollingIndicator(true);
-                    mWorkspace.hideDockDivider(true);
+                    hideDockDivider();
                 }
             }
             updateWallpaperVisibility(false);
@@ -2306,7 +2329,7 @@
      * This is the opposite of showAppsCustomizeHelper.
      * @param animated If true, the transition will be animated.
      */
-    private void hideAppsCustomizeHelper(boolean animated) {
+    private void hideAppsCustomizeHelper(boolean animated, final boolean springLoaded) {
         if (mStateAnimation != null) {
             mStateAnimation.cancel();
             mStateAnimation = null;
@@ -2370,6 +2393,7 @@
                 ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, null, true);
                 ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance, null, true);
             }
+            mWorkspace.hideScrollingIndicator(false);
         }
     }
 
@@ -2380,10 +2404,12 @@
         mWorkspace.changeState(Workspace.State.NORMAL, animated, stagger);
         if (mState != State.WORKSPACE) {
             mWorkspace.setVisibility(View.VISIBLE);
-            hideAppsCustomizeHelper(animated);
+            hideAppsCustomizeHelper(animated, false);
 
             // Show the search bar and hotseat
             mSearchDropTargetBar.showSearchBar(animated);
+            // We only need to animate in the dock divider if we're going from spring loaded mode
+            showDockDivider(animated && mState == State.APPS_CUSTOMIZE_SPRING_LOADED);
 
             // Set focus to the AppsCustomize button
             if (mAllAppsButton != null) {
@@ -2391,8 +2417,7 @@
             }
         }
 
-        mWorkspace.showDockDivider(!animated);
-        mWorkspace.flashScrollingIndicator();
+        mWorkspace.flashScrollingIndicator(animated);
 
         // Change the state *after* we've called all the transition code
         mState = State.WORKSPACE;
@@ -2429,7 +2454,8 @@
     void enterSpringLoadedDragMode() {
         if (mState == State.APPS_CUSTOMIZE) {
             mWorkspace.changeState(Workspace.State.SPRING_LOADED);
-            hideAppsCustomizeHelper(true);
+            hideAppsCustomizeHelper(true, true);
+            hideDockDivider();
             mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
         }
     }
@@ -2466,6 +2492,33 @@
         // Otherwise, we are not in spring loaded mode, so don't do anything.
     }
 
+    void hideDockDivider() {
+        if (mQsbDivider != null && mDockDivider != null) {
+            mQsbDivider.setVisibility(View.INVISIBLE);
+            mDockDivider.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    void showDockDivider(boolean animated) {
+        if (mQsbDivider != null && mDockDivider != null) {
+            mQsbDivider.setVisibility(View.VISIBLE);
+            mDockDivider.setVisibility(View.VISIBLE);
+            if (mDividerAnimator != null) {
+                mDividerAnimator.cancel();
+                mQsbDivider.setAlpha(1f);
+                mDockDivider.setAlpha(1f);
+                mDividerAnimator = null;
+            }
+            if (animated) {
+                mDividerAnimator = new AnimatorSet();
+                mDividerAnimator.playTogether(ObjectAnimator.ofFloat(mQsbDivider, "alpha", 1f),
+                        ObjectAnimator.ofFloat(mDockDivider, "alpha", 1f));
+                mDividerAnimator.setDuration(mSearchDropTargetBar.getTransitionInDuration());
+                mDividerAnimator.start();
+            }
+        }
+    }
+
     void lockAllApps() {
         // TODO
     }
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index 6cec101..a01cc47 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -268,7 +268,7 @@
 
             if (!convertDatabase(db)) {
                 // Populate favorites table with initial favorites
-                loadFavorites(db, ItemInfo.NO_ID);
+                loadFavorites(db, R.xml.default_workspace);
             }
         }
 
@@ -446,7 +446,7 @@
                 }
 
                 // Add default hotseat icons
-                loadFavorites(db, LauncherSettings.Favorites.CONTAINER_HOTSEAT);
+                loadFavorites(db, R.xml.update_workspace);
                 version = 9;
             }
 
@@ -700,7 +700,7 @@
          * @param db The database to write the values into
          * @param filterContainerId The specific container id of items to load
          */
-        private int loadFavorites(SQLiteDatabase db, long filterContainerId) {
+        private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {
             Intent intent = new Intent(Intent.ACTION_MAIN, null);
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             ContentValues values = new ContentValues();
@@ -708,7 +708,7 @@
             PackageManager packageManager = mContext.getPackageManager();
             int i = 0;
             try {
-                XmlResourceParser parser = mContext.getResources().getXml(R.xml.default_workspace);
+                XmlResourceParser parser = mContext.getResources().getXml(workspaceResourceId);
                 AttributeSet attrs = Xml.asAttributeSet(parser);
                 XmlUtils.beginDocument(parser, TAG_FAVORITES);
 
@@ -731,92 +731,91 @@
                     if (a.hasValue(R.styleable.Favorite_container)) {
                         container = Long.valueOf(a.getString(R.styleable.Favorite_container));
                     }
-                    if (filterContainerId == ItemInfo.NO_ID || filterContainerId == container) {
-                        String screen = a.getString(R.styleable.Favorite_screen);
-                        String x = a.getString(R.styleable.Favorite_x);
-                        String y = a.getString(R.styleable.Favorite_y);
 
-                        // If we are adding to the hotset, the screen is used as the position in the
-                        // hotset. This screen can't be at position 0 because AllApps is in the
-                        // zeroth position.
-                        if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT &&
-                                Hotseat.isAllAppsButtonRank(Integer.valueOf(screen))) {
-                            throw new RuntimeException("Invalid screen position for hotseat item");
+                    String screen = a.getString(R.styleable.Favorite_screen);
+                    String x = a.getString(R.styleable.Favorite_x);
+                    String y = a.getString(R.styleable.Favorite_y);
+
+                    // If we are adding to the hotseat, the screen is used as the position in the
+                    // hotseat. This screen can't be at position 0 because AllApps is in the
+                    // zeroth position.
+                    if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT &&
+                            Hotseat.isAllAppsButtonRank(Integer.valueOf(screen))) {
+                        throw new RuntimeException("Invalid screen position for hotseat item");
+                    }
+
+                    values.clear();
+                    values.put(LauncherSettings.Favorites.CONTAINER, container);
+                    values.put(LauncherSettings.Favorites.SCREEN, screen);
+                    values.put(LauncherSettings.Favorites.CELLX, x);
+                    values.put(LauncherSettings.Favorites.CELLY, y);
+
+                    if (TAG_FAVORITE.equals(name)) {
+                        long id = addAppShortcut(db, values, a, packageManager, intent);
+                        added = id >= 0;
+                    } else if (TAG_SEARCH.equals(name)) {
+                        added = addSearchWidget(db, values);
+                    } else if (TAG_CLOCK.equals(name)) {
+                        added = addClockWidget(db, values);
+                    } else if (TAG_APPWIDGET.equals(name)) {
+                        added = addAppWidget(db, values, a, packageManager);
+                    } else if (TAG_SHORTCUT.equals(name)) {
+                        long id = addUriShortcut(db, values, a);
+                        added = id >= 0;
+                    } else if (TAG_FOLDER.equals(name)) {
+                        String title;
+                        int titleResId =  a.getResourceId(R.styleable.Favorite_title, -1);
+                        if (titleResId != -1) {
+                            title = mContext.getResources().getString(titleResId);
+                        } else {
+                            title = mContext.getResources().getString(R.string.folder_name);
                         }
+                        values.put(LauncherSettings.Favorites.TITLE, title);
+                        long folderId = addFolder(db, values);
+                        added = folderId >= 0;
 
-                        values.clear();
-                        values.put(LauncherSettings.Favorites.CONTAINER, container);
-                        values.put(LauncherSettings.Favorites.SCREEN, screen);
-                        values.put(LauncherSettings.Favorites.CELLX, x);
-                        values.put(LauncherSettings.Favorites.CELLY, y);
+                        ArrayList<Long> folderItems = new ArrayList<Long>();
 
-                        if (TAG_FAVORITE.equals(name)) {
-                            long id = addAppShortcut(db, values, a, packageManager, intent);
-                            added = id >= 0;
-                        } else if (TAG_SEARCH.equals(name)) {
-                            added = addSearchWidget(db, values);
-                        } else if (TAG_CLOCK.equals(name)) {
-                            added = addClockWidget(db, values);
-                        } else if (TAG_APPWIDGET.equals(name)) {
-                            added = addAppWidget(db, values, a, packageManager);
-                        } else if (TAG_SHORTCUT.equals(name)) {
-                            long id = addUriShortcut(db, values, a);
-                            added = id >= 0;
-                        } else if (TAG_FOLDER.equals(name)) {
-                            String title;
-                            int titleResId =  a.getResourceId(R.styleable.Favorite_title, -1);
-                            if (titleResId != -1) {
-                                title = mContext.getResources().getString(titleResId);
+                        int folderDepth = parser.getDepth();
+                        while ((type = parser.next()) != XmlPullParser.END_TAG ||
+                                parser.getDepth() > folderDepth) {
+                            if (type != XmlPullParser.START_TAG) {
+                                continue;
+                            }
+                            final String folder_item_name = parser.getName();
+
+                            TypedArray ar = mContext.obtainStyledAttributes(attrs,
+                                    R.styleable.Favorite);
+                            values.clear();
+                            values.put(LauncherSettings.Favorites.CONTAINER, folderId);
+
+                            if (TAG_FAVORITE.equals(folder_item_name) && folderId >= 0) {
+                                long id =
+                                    addAppShortcut(db, values, ar, packageManager, intent);
+                                if (id >= 0) {
+                                    folderItems.add(id);
+                                }
+                            } else if (TAG_SHORTCUT.equals(folder_item_name) && folderId >= 0) {
+                                long id = addUriShortcut(db, values, ar);
+                                if (id >= 0) {
+                                    folderItems.add(id);
+                                }
                             } else {
-                                title = mContext.getResources().getString(R.string.folder_name);
+                                throw new RuntimeException("Folders can " +
+                                        "contain only shortcuts");
                             }
-                            values.put(LauncherSettings.Favorites.TITLE, title);
-                            long folderId = addFolder(db, values);
-                            added = folderId >= 0;
-
-                            ArrayList<Long> folderItems = new ArrayList<Long>();
-
-                            int folderDepth = parser.getDepth();
-                            while ((type = parser.next()) != XmlPullParser.END_TAG ||
-                                    parser.getDepth() > folderDepth) {
-                                if (type != XmlPullParser.START_TAG) {
-                                    continue;
-                                }
-                                final String folder_item_name = parser.getName();
-
-                                TypedArray ar = mContext.obtainStyledAttributes(attrs,
-                                        R.styleable.Favorite);
-                                values.clear();
-                                values.put(LauncherSettings.Favorites.CONTAINER, folderId);
-
-                                if (TAG_FAVORITE.equals(folder_item_name) && folderId >= 0) {
-                                    long id =
-                                        addAppShortcut(db, values, ar, packageManager, intent);
-                                    if (id >= 0) {
-                                        folderItems.add(id);
-                                    }
-                                } else if (TAG_SHORTCUT.equals(folder_item_name) && folderId >= 0) {
-                                    long id = addUriShortcut(db, values, ar);
-                                    if (id >= 0) {
-                                        folderItems.add(id);
-                                    }
-                                } else {
-                                    throw new RuntimeException("Folders can " +
-                                            "contain only shortcuts");
-                                }
-                                ar.recycle();
+                            ar.recycle();
+                        }
+                        // We can only have folders with >= 2 items, so we need to remove the
+                        // folder and clean up if less than 2 items were included, or some
+                        // failed to add, and less than 2 were actually added
+                        if (folderItems.size() < 2 && folderId >= 0) {
+                            // We just delete the folder and any items that made it
+                            deleteId(db, folderId);
+                            if (folderItems.size() > 0) {
+                                deleteId(db, folderItems.get(0));
                             }
-                            // We can only have folders with >= 2 items, so we need to remove the
-                            // folder and clean up if less than 2 items were included, or some
-                            // failed to add, and less than 2 were actually added
-                            if (folderItems.size() < 2 && folderId >= 0) {
-                                // We just delete the folder and any items that made it
-                                deleteId(db, folderId);
-                                if (folderItems.size() > 0) {
-                                    deleteId(db, folderItems.get(0));
-                                }
-                                added = false;
-                            }
+                            added = false;
                         }
                     }
                     if (added) i++;
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 935d26d..2f66537 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -1766,9 +1766,9 @@
             hideScrollingIndicator(false);
         }
     };
-    protected void flashScrollingIndicator() {
+    protected void flashScrollingIndicator(boolean animated) {
         removeCallbacks(hideScrollingIndicatorRunnable);
-        showScrollingIndicator(false);
+        showScrollingIndicator(!animated);
         postDelayed(hideScrollingIndicatorRunnable, sScrollIndicatorFlashDuration);
     }
 
diff --git a/src/com/android/launcher2/PagedViewCellLayout.java b/src/com/android/launcher2/PagedViewCellLayout.java
index ef39813..c29e50d 100644
--- a/src/com/android/launcher2/PagedViewCellLayout.java
+++ b/src/com/android/launcher2/PagedViewCellLayout.java
@@ -131,10 +131,6 @@
             child.setId(childId);
             mChildren.addView(child, index, lp);
 
-            if (child instanceof PagedViewIcon) {
-                PagedViewIcon pagedViewIcon = (PagedViewIcon) child;
-                pagedViewIcon.disableCache();
-            }
             return true;
         }
         return false;
diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java
index b03d867..af10f18 100644
--- a/src/com/android/launcher2/PagedViewIcon.java
+++ b/src/com/android/launcher2/PagedViewIcon.java
@@ -17,21 +17,14 @@
 package com.android.launcher2;
 
 import android.animation.ObjectAnimator;
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
-import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
 import android.util.AttributeSet;
-import android.view.KeyEvent;
 import android.widget.Checkable;
+import android.widget.TextView;
 
 import com.android.launcher.R;
 
@@ -40,7 +33,7 @@
  * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
  * drawables on the top).
  */
-public class PagedViewIcon extends CachedTextView implements Checkable {
+public class PagedViewIcon extends TextView implements Checkable {
     private static final String TAG = "PagedViewIcon";
 
     // holographic outline
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 39e9992..0598cd9 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -107,7 +107,6 @@
     private float mBackgroundAlpha = 0;
     private float mOverScrollMaxBackgroundAlpha = 0.0f;
     private int mOverScrollPageIndex = -1;
-    private AnimatorSet mDividerAnimator;
 
     private float mWallpaperScrollRatio = 1.0f;
 
@@ -3494,30 +3493,6 @@
         mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
     }
 
-    void showDockDivider(boolean immediately) {
-        final ViewGroup parent = (ViewGroup) getParent();
-        final View qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
-        final View dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
-        if (qsbDivider != null && dockDivider != null) {
-            qsbDivider.setVisibility(View.VISIBLE);
-            dockDivider.setVisibility(View.VISIBLE);
-            if (mDividerAnimator != null) {
-                mDividerAnimator.cancel();
-                mDividerAnimator = null;
-            }
-            if (immediately) {
-                qsbDivider.setAlpha(1f);
-                dockDivider.setAlpha(1f);
-            } else {
-                mDividerAnimator = new AnimatorSet();
-                mDividerAnimator.playTogether(ObjectAnimator.ofFloat(qsbDivider, "alpha", 1f),
-                        ObjectAnimator.ofFloat(dockDivider, "alpha", 1f));
-                mDividerAnimator.setDuration(sScrollIndicatorFadeInDuration);
-                mDividerAnimator.start();
-            }
-        }
-    }
-
     void setFadeForOverScroll(float fade) {
         if (!isScrollingIndicatorEnabled()) return;
 
@@ -3531,42 +3506,4 @@
         dockDivider.setAlpha(reducedFade);
         scrollIndicator.setAlpha(1 - fade);
     }
-
-    void hideDockDivider(boolean immediately) {
-        final ViewGroup parent = (ViewGroup) getParent();
-        final View qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
-        final View dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
-        if (qsbDivider != null && dockDivider != null) {
-            if (mDividerAnimator != null) {
-                mDividerAnimator.cancel();
-                mDividerAnimator = null;
-            }
-            if (immediately) {
-                qsbDivider.setVisibility(View.GONE);
-                dockDivider.setVisibility(View.GONE);
-                qsbDivider.setAlpha(0f);
-                dockDivider.setAlpha(0f);
-            } else {
-                mDividerAnimator = new AnimatorSet();
-                mDividerAnimator.playTogether(ObjectAnimator.ofFloat(qsbDivider, "alpha", 0f),
-                        ObjectAnimator.ofFloat(dockDivider, "alpha", 0f));
-                mDividerAnimator.addListener(new AnimatorListenerAdapter() {
-                    private boolean cancelled = false;
-                    @Override
-                    public void onAnimationCancel(android.animation.Animator animation) {
-                        cancelled = true;
-                    }
-                    @Override
-                    public void onAnimationEnd(android.animation.Animator animation) {
-                        if (!cancelled) {
-                            qsbDivider.setVisibility(View.GONE);
-                            dockDivider.setVisibility(View.GONE);
-                        }
-                    }
-                });
-                mDividerAnimator.setDuration(sScrollIndicatorFadeOutDuration);
-                mDividerAnimator.start();
-            }
-        }
-    }
 }
