auto import from //branches/cupcake/...@125939
diff --git a/res/drawable/ic_menu_gallery.png b/res/drawable/ic_menu_gallery.png
deleted file mode 100644
index f61bbd8..0000000
--- a/res/drawable/ic_menu_gallery.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_menu_notifications.png b/res/drawable/ic_menu_notifications.png
deleted file mode 100644
index 866d4e0..0000000
--- a/res/drawable/ic_menu_notifications.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_menu_preferences.png b/res/drawable/ic_menu_preferences.png
deleted file mode 100755
index b8e7141..0000000
--- a/res/drawable/ic_menu_preferences.png
+++ /dev/null
Binary files differ
diff --git a/res/layout/widget_search.xml b/res/layout/widget_search.xml
index 4343e27..95e8052 100644
--- a/res/layout/widget_search.xml
+++ b/res/layout/widget_search.xml
@@ -36,6 +36,7 @@
         android:singleLine="true"
         android:selectAllOnFocus="true"
         android:completionThreshold="1"
+        android:inputType="textAutoComplete|textSearchString"
         />
         
      <ImageButton android:id="@+id/search_go_btn"
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644
index 0000000..eb217e9
--- /dev/null
+++ b/res/values-fr/strings.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name">"Accueil"</string>
+    <string name="folder_name">"Dossier"</string>
+    <string name="chooser_wallpaper">"Sélectionner l\'arrière-plan à partir de"</string>
+    <string name="wallpaper_instructions">"Configurer l\'arrière-plan"</string>
+    <string name="pick_wallpaper">"Galerie des arrière-plans"</string>
+    <string name="activity_not_found">"L\'application n\'est pas installée sur votre téléphone."</string>
+    <!-- no translation found for rename_folder_label (5646236631298452787) -->
+    <skip />
+    <string name="rename_folder_title">"Renommer le dossier"</string>
+    <string name="rename_action">"OK"</string>
+    <string name="cancel_action">"Annuler"</string>
+    <!-- no translation found for menu_item_add_item (6233177331075781114) -->
+    <skip />
+    <string name="group_applications">"Application"</string>
+    <string name="group_shortcuts">"Raccourci"</string>
+    <!-- no translation found for group_live_folders (3057578584715591220) -->
+    <skip />
+    <string name="group_widgets">"Widget"</string>
+    <string name="group_wallpapers">"Arrière-plan"</string>
+    <string name="add_folder">"Dossier"</string>
+    <string name="add_clock">"Horloge"</string>
+    <string name="add_photo_frame">"Cadre d\'image"</string>
+    <string name="add_search">"Rechercher"</string>
+    <string name="out_of_space">"Plus d\'espace libre sur l\'écran Accueil."</string>
+    <string name="menu_add">"Ajouter"</string>
+    <string name="menu_wallpaper">"Arrière-plan"</string>
+    <string name="menu_search">"Rechercher"</string>
+    <string name="menu_notifications">"Notifications"</string>
+    <string name="menu_settings">"Paramètres"</string>
+    <string name="permlab_install_shortcut">"installer des raccourcis"</string>
+    <string name="permdesc_install_shortcut">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
+    <string name="permlab_uninstall_shortcut">"désinstaller les raccourcis"</string>
+    <string name="permdesc_uninstall_shortcut">"Permet à une application de supprimer les raccourcis sans l\'intervention de l\'utilisateur."</string>
+    <!-- no translation found for permlab_read_settings (3452408290738106747) -->
+    <skip />
+    <!-- no translation found for permdesc_read_settings (8377434937176025492) -->
+    <skip />
+    <!-- no translation found for permlab_write_settings (1360567537236705628) -->
+    <skip />
+    <!-- no translation found for permdesc_write_settings (1098648778383349818) -->
+    <skip />
+    <string name="search_hint">"Recherche Google"</string>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 0000000..d94a156
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name">"Home"</string>
+    <string name="folder_name">"Cartella"</string>
+    <string name="chooser_wallpaper">"Seleziona sfondo da"</string>
+    <string name="wallpaper_instructions">"Imposta sfondo"</string>
+    <string name="pick_wallpaper">"Galleria sfondi"</string>
+    <string name="activity_not_found">"Applicazione non installata sul telefono."</string>
+    <!-- no translation found for rename_folder_label (5646236631298452787) -->
+    <skip />
+    <string name="rename_folder_title">"Rinomina cartella"</string>
+    <string name="rename_action">"OK"</string>
+    <string name="cancel_action">"Annulla"</string>
+    <!-- no translation found for menu_item_add_item (6233177331075781114) -->
+    <skip />
+    <string name="group_applications">"Applicazione"</string>
+    <string name="group_shortcuts">"Collegamento"</string>
+    <!-- no translation found for group_live_folders (3057578584715591220) -->
+    <skip />
+    <string name="group_widgets">"Widget"</string>
+    <string name="group_wallpapers">"Sfondo"</string>
+    <string name="add_folder">"Cartella"</string>
+    <string name="add_clock">"Orologio"</string>
+    <string name="add_photo_frame">"Cornice immagini"</string>
+    <string name="add_search">"Ricerca"</string>
+    <string name="out_of_space">"Spazio nella schermata Home esaurito."</string>
+    <string name="menu_add">"Aggiungi"</string>
+    <string name="menu_wallpaper">"Sfondo"</string>
+    <string name="menu_search">"Cerca"</string>
+    <string name="menu_notifications">"Notifiche"</string>
+    <string name="menu_settings">"Impostazioni"</string>
+    <string name="permlab_install_shortcut">"aggiungere collegamenti"</string>
+    <string name="permdesc_install_shortcut">"Consente a un\'applicazione di aggiungere collegamenti automaticamente."</string>
+    <string name="permlab_uninstall_shortcut">"eliminare collegamenti"</string>
+    <string name="permdesc_uninstall_shortcut">"Consente a un\'applicazione di rimuovere collegamenti automaticamente."</string>
+    <!-- no translation found for permlab_read_settings (3452408290738106747) -->
+    <skip />
+    <!-- no translation found for permdesc_read_settings (8377434937176025492) -->
+    <skip />
+    <!-- no translation found for permlab_write_settings (1360567537236705628) -->
+    <skip />
+    <!-- no translation found for permdesc_write_settings (1098648778383349818) -->
+    <skip />
+    <string name="search_hint">"Ricerca Google"</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..7657890
--- /dev/null
+++ b/res/values-zh-rCN/strings.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name">"主页"</string>
+    <string name="folder_name">"文件夹"</string>
+    <string name="chooser_wallpaper">"选择壁纸"</string>
+    <string name="wallpaper_instructions">"设置壁纸"</string>
+    <string name="pick_wallpaper">"壁纸图库"</string>
+    <string name="activity_not_found">"您的手机上没有安装应用程序。"</string>
+    <!-- no translation found for rename_folder_label (5646236631298452787) -->
+    <skip />
+    <string name="rename_folder_title">"重命名文件夹"</string>
+    <string name="rename_action">"确定"</string>
+    <string name="cancel_action">"取消"</string>
+    <!-- no translation found for menu_item_add_item (6233177331075781114) -->
+    <skip />
+    <string name="group_applications">"应用程序"</string>
+    <string name="group_shortcuts">"快捷键"</string>
+    <!-- no translation found for group_live_folders (3057578584715591220) -->
+    <skip />
+    <string name="group_widgets">"小工具"</string>
+    <string name="group_wallpapers">"壁纸"</string>
+    <string name="add_folder">"文件夹"</string>
+    <string name="add_clock">"时钟"</string>
+    <string name="add_photo_frame">"相框"</string>
+    <string name="add_search">"搜索"</string>
+    <string name="out_of_space">"该“主页”屏幕上没有多余空间。"</string>
+    <string name="menu_add">"添加"</string>
+    <string name="menu_wallpaper">"壁纸"</string>
+    <string name="menu_search">"搜索"</string>
+    <string name="menu_notifications">"通知"</string>
+    <string name="menu_settings">"设置"</string>
+    <string name="permlab_install_shortcut">"安装快捷键"</string>
+    <string name="permdesc_install_shortcut">"允许应用程序在没有用户介入的情况下添加快捷键。"</string>
+    <string name="permlab_uninstall_shortcut">"卸载快捷键"</string>
+    <string name="permdesc_uninstall_shortcut">"允许应用程序在没有用户介入的情况下删除快捷键。"</string>
+    <!-- no translation found for permlab_read_settings (3452408290738106747) -->
+    <skip />
+    <!-- no translation found for permdesc_read_settings (8377434937176025492) -->
+    <skip />
+    <!-- no translation found for permlab_write_settings (1360567537236705628) -->
+    <skip />
+    <!-- no translation found for permdesc_write_settings (1098648778383349818) -->
+    <skip />
+    <string name="search_hint">"Google 搜索"</string>
+</resources>
diff --git a/src/com/android/launcher/HandleView.java b/src/com/android/launcher/HandleView.java
index 437d559..9afe41c 100644
--- a/src/com/android/launcher/HandleView.java
+++ b/src/com/android/launcher/HandleView.java
@@ -49,7 +49,7 @@
     @Override
     public View focusSearch(int direction) {
         View newFocus = super.focusSearch(direction);
-        if (newFocus == null) {
+        if (newFocus == null && mLauncher.isDrawerDown()) {
             final Workspace workspace = mLauncher.getWorkspace();
             workspace.dispatchUnhandledMove(null, direction);
             return (mOrientation == ORIENTATION_HORIZONTAL && direction == FOCUS_DOWN) ?
diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java
index 928f4ca..01001c0 100644
--- a/src/com/android/launcher/Launcher.java
+++ b/src/com/android/launcher/Launcher.java
@@ -45,6 +45,7 @@
 import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.Message;
 import android.provider.*;
 import android.telephony.PhoneNumberUtils;
 import android.text.Selection;
@@ -260,7 +261,7 @@
 
     private void startLoaders() {
         sModel.loadApplications(true, this, mLocaleChanged);
-        sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged);
+        sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged, true);
         mRestoring = false;
     }
 
@@ -812,13 +813,13 @@
                 .setIcon(android.R.drawable.ic_menu_add)
                 .setAlphabeticShortcut('A');
         menu.add(0, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper)
-                 .setIcon(R.drawable.ic_menu_gallery)
+                 .setIcon(android.R.drawable.ic_menu_gallery)
                  .setAlphabeticShortcut('W');
         menu.add(0, MENU_SEARCH, 0, R.string.menu_search)
                 .setIcon(android.R.drawable.ic_search_category_default)
                 .setAlphabeticShortcut(SearchManager.MENU_KEY);
         menu.add(0, MENU_NOTIFICATIONS, 0, R.string.menu_notifications)
-                .setIcon(R.drawable.ic_menu_notifications)
+                .setIcon(android.R.drawable.ic_menu_notifications)
                 .setAlphabeticShortcut('N');
 
         final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
@@ -826,7 +827,7 @@
                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
         menu.add(0, MENU_SETTINGS, 0, R.string.menu_settings)
-                .setIcon(R.drawable.ic_menu_preferences).setAlphabeticShortcut('P')
+                .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('P')
                 .setIntent(settings);
 
         return true;
@@ -1111,7 +1112,7 @@
     private void onFavoritesChanged() {
         mDesktopLocked = true;
         mDrawer.lock();
-        sModel.loadUserItems(false, this, false);
+        sModel.loadUserItems(false, this, false, false);
     }
 
     void onDesktopItemsLoaded() {
@@ -1119,7 +1120,80 @@
 
         bindDesktopItems();
         mAllAppsGrid.setAdapter(Launcher.getModel().getApplicationsAdapter());
+    }
 
+    /**
+     * Refreshes the shortcuts shown on the workspace.
+     */
+    private void bindDesktopItems() {
+        final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems();
+        if (shortcuts == null) {
+            return;
+        }
+
+        final Workspace workspace = mWorkspace;
+        int count = workspace.getChildCount();
+        for (int i = 0; i < count; i++) {
+            ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout();
+        }
+
+        count = shortcuts.size();
+
+        final DesktopItemsBinder binder = new DesktopItemsBinder(this, shortcuts);
+        binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, 0, count).sendToTarget();
+    }
+
+    private void bindItems(Launcher.DesktopItemsBinder binder,
+            ArrayList<ItemInfo> shortcuts, int start, int count) {
+
+        final Workspace workspace = mWorkspace;
+        final boolean desktopLocked = mDesktopLocked;
+
+        final int end = Math.min(start + DesktopItemsBinder.ITEMS_COUNT, count);
+        int i = start;
+
+        for ( ; i < end; i++) {
+            final ItemInfo item = shortcuts.get(i);
+            switch (item.itemType) {
+                case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
+                case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
+                    final View shortcut = createShortcut((ApplicationInfo) item);
+                    workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
+                    final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
+                            (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()),
+                            (UserFolderInfo) item);
+                    workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
+                    final FolderIcon newLiveFolder = LiveFolderIcon.fromXml(
+                            R.layout.live_folder_icon, this,
+                            (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()),
+                            (LiveFolderInfo) item);
+                    workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                default:
+                    final Widget widget = (Widget) item;
+                    final View view = createWidget(mInflater, widget);
+                    view.setTag(widget);
+                    workspace.addWidget(view, widget, !desktopLocked);
+            }
+        }
+
+        workspace.requestLayout();
+
+        if (end >= count) {
+            finishBindDesktopItems();
+        } else {
+            binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, i, count).sendToTarget();
+        }
+    }
+
+    private void finishBindDesktopItems() {
         if (mSavedState != null) {
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
 
@@ -1152,57 +1226,6 @@
         mDrawer.unlock();
     }
 
-    /**
-     * Refreshes the shortcuts shown on the workspace.
-     */
-    private void bindDesktopItems() {
-        final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems();
-        if (shortcuts == null) {
-            return;
-        }
-
-        final Workspace workspace = mWorkspace;
-        int count = workspace.getChildCount();
-        for (int i = 0; i < count; i++) {
-            ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout();
-        }
-
-        count = shortcuts.size();
-        for (int i = 0; i < count; i++) {
-            final ItemInfo item = shortcuts.get(i);
-            switch (item.itemType) {
-            case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
-            case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
-                final View shortcut = createShortcut((ApplicationInfo) item);
-                workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
-                final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
-                        (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()),
-                        ((UserFolderInfo) item));
-                workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
-                final FolderIcon newLiveFolder = LiveFolderIcon.fromXml(
-                        R.layout.live_folder_icon, this,
-                        (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()),
-                        ((LiveFolderInfo) item));
-                workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            default:
-                final Widget widget = (Widget)item;
-                final View view = createWidget(mInflater, widget);
-                view.setTag(widget);
-                workspace.addWidget(view, widget, !mDesktopLocked);
-            }
-        }
-
-        workspace.requestLayout();
-    }
-
     private View createWidget(LayoutInflater inflater, Widget widget) {
         final Workspace workspace = mWorkspace;
         final int screen = workspace.getCurrentScreen();
@@ -1456,7 +1479,7 @@
 
                 if (mDesktopLocked) {
                     mDrawer.lock();
-                    sModel.loadUserItems(false, Launcher.this, false);
+                    sModel.loadUserItems(false, Launcher.this, false, false);
                 } else {
                     final FolderIcon folderIcon = (FolderIcon)
                             mWorkspace.getViewForTag(mFolderInfo);
@@ -1466,7 +1489,7 @@
                     } else {
                         mDesktopLocked = true;
                         mDrawer.lock();
-                        sModel.loadUserItems(false, Launcher.this, false);
+                        sModel.loadUserItems(false, Launcher.this, false, false);
                     }
                 }
             }
@@ -1635,4 +1658,28 @@
         public void onScrollEnded() {
         }
     }
+
+    private static class DesktopItemsBinder extends Handler {
+        static final int MESSAGE_BIND_ITEMS = 0x1;
+        // Number of items to bind in every pass
+        static final int ITEMS_COUNT = 6;
+
+        private final ArrayList<ItemInfo> mShortcuts;
+        private final WeakReference<Launcher> mLauncher;
+
+        DesktopItemsBinder(Launcher launcher, ArrayList<ItemInfo> shortcuts) {
+            mLauncher = new WeakReference<Launcher>(launcher);
+            mShortcuts = shortcuts;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MESSAGE_BIND_ITEMS:
+                    Launcher launcher = mLauncher.get();
+                    if (launcher != null) launcher.bindItems(this, mShortcuts, msg.arg1, msg.arg2);
+                    break;
+            }
+        }
+    }
 }
diff --git a/src/com/android/launcher/LauncherModel.java b/src/com/android/launcher/LauncherModel.java
index 0ef2a80..314a502 100644
--- a/src/com/android/launcher/LauncherModel.java
+++ b/src/com/android/launcher/LauncherModel.java
@@ -28,9 +28,9 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
 import android.util.Log;
+import android.os.Process;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -45,7 +45,6 @@
  * Maintains in-memory state of the Launcher. It is expected that there should be only one
  * LauncherModel object held in a static. Also provide APIs for updating the database state
  * for the Launcher
- *
  */
 public class LauncherModel {
     private static final int UI_NOTIFICATION_RATE = 4;
@@ -104,6 +103,13 @@
         }
 
         mApplicationsLoaded = false;
+
+        if (!isLaunching) {
+            startApplicationsLoader(launcher);
+        }
+    }
+
+    private void startApplicationsLoader(Launcher launcher) {
         mApplicationsLoader = new ApplicationsLoader(launcher);
         mLoader = new Thread(mApplicationsLoader, "Applications Loader");
         mLoader.start();
@@ -130,6 +136,8 @@
         public void run() {
             mRunning = true;
 
+            android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
             Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
             mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
@@ -221,8 +229,11 @@
      * Loads all of the items on the desktop, in folders, or in the dock.
      * These can be apps, shortcuts or widgets
      */
-    void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged) {
+    void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged,
+            boolean loadApplications) {
+
         if (isLaunching && mDesktopItems != null && mDesktopItemsLoaded) {
+            if (loadApplications) startApplicationsLoader(launcher);
             // We have already loaded our data from the DB
             launcher.onDesktopItemsLoaded();
             return;
@@ -240,7 +251,7 @@
         }
 
         mDesktopItemsLoaded = false;
-        mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged);
+        mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications);
         mDesktopLoader = new Thread(mDesktopItemsLoader, "Desktop Items Loader");
         mDesktopLoader.start();
     }
@@ -317,9 +328,11 @@
         private volatile boolean mRunning;
 
         private final WeakReference<Launcher> mLauncher;
-        private boolean mLocaleChanged;
+        private final boolean mLocaleChanged;
+        private final boolean mLoadApplications;
 
-        DesktopItemsLoader(Launcher launcher, boolean localeChanged) {
+        DesktopItemsLoader(Launcher launcher, boolean localeChanged, boolean loadApplications) {
+            mLoadApplications = loadApplications;
             mLauncher = new WeakReference<Launcher>(launcher);
             mLocaleChanged = localeChanged;
         }
@@ -532,6 +545,7 @@
                         launcher.onDesktopItemsLoaded();
                     }
                 });
+                if (mLoadApplications) startApplicationsLoader(launcher);
             }
 
             if (!mStopped) {