Merge branch 'eclair' into eclair-release
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a557f67..c065777 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -46,7 +46,7 @@
     <string name="title_select_shortcut" msgid="2858897527672831763">"Sélectionner un raccourci"</string>
     <string name="title_select_live_folder" msgid="3753447798805166749">"Sélectionner le dossier"</string>
     <string name="all_apps_button_label" msgid="3953036962111614813">"Toutes les applications"</string>
-    <string name="all_apps_home_button_label" msgid="1022222300329398558">"Page d\'accueil"</string>
+    <string name="all_apps_home_button_label" msgid="1022222300329398558">"Domicile"</string>
     <string name="menu_add" msgid="3065046628354640854">"Ajouter"</string>
     <string name="menu_wallpaper" msgid="5837429080911269832">"Fond d\'écran"</string>
     <string name="menu_search" msgid="4826514464423239041">"Rechercher"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 6b8d3bb..04fc175 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -45,10 +45,8 @@
     <string name="shortcut_duplicate" msgid="4757756326465060694">"「<xliff:g id="NAME">%s</xliff:g>」捷徑已經存在。"</string>
     <string name="title_select_shortcut" msgid="2858897527672831763">"選取捷徑"</string>
     <string name="title_select_live_folder" msgid="3753447798805166749">"選取資料夾"</string>
-    <!-- no translation found for all_apps_button_label (3953036962111614813) -->
-    <skip />
-    <!-- no translation found for all_apps_home_button_label (1022222300329398558) -->
-    <skip />
+    <string name="all_apps_button_label" msgid="3953036962111614813">"所有應用程式"</string>
+    <string name="all_apps_home_button_label" msgid="1022222300329398558">"主螢幕"</string>
     <string name="menu_add" msgid="3065046628354640854">"新增"</string>
     <string name="menu_wallpaper" msgid="5837429080911269832">"桌布"</string>
     <string name="menu_search" msgid="4826514464423239041">"搜尋"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b642ead..38f27c7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -31,7 +31,7 @@
     <!-- Button label on Wallpaper Gallery screen; user selects this button to set a specific wallpaper -->
     <string name="wallpaper_instructions">Set wallpaper</string>
     <!-- Option in "Select wallpaper from" dialog box -->
-    <string name="pick_wallpaper">Wallpaper gallery</string>
+    <string name="pick_wallpaper">Wallpapers</string>
     <!-- Displayed when user selects a shortcut for an app that was uninstalled -->
     <string name="activity_not_found">Application is not installed on your phone.</string>
     <!-- List item for configuring the current wallpaper -->
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 327fa3a..5f6e6f1 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1395,6 +1395,10 @@
         if (tag instanceof ApplicationInfo) {
             // Open shortcut
             final Intent intent = ((ApplicationInfo) tag).intent;
+            int[] pos = new int[2];
+            v.getLocationOnScreen(pos);
+            intent.setSourceBounds(
+                    new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight()));
             startActivitySafely(intent);
         } else if (tag instanceof FolderInfo) {
             handleFolderClick((FolderInfo) tag);
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index 433addb..c3ceefd 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -58,7 +58,7 @@
 
     private static final String DATABASE_NAME = "launcher.db";
     
-    private static final int DATABASE_VERSION = 5;
+    private static final int DATABASE_VERSION = 6;
 
     static final String AUTHORITY = "com.android.launcher2.settings";
     
@@ -66,7 +66,6 @@
     static final String EXTRA_BIND_TARGETS = "com.android.launcher2.settings.bindtargets";
 
     static final String TABLE_FAVORITES = "favorites";
-    static final String TABLE_GESTURES = "gestures";
     static final String PARAMETER_NOTIFY = "notify";
 
     /**
@@ -226,17 +225,6 @@
                     "displayMode INTEGER" +
                     ");");
 
-            db.execSQL("CREATE TABLE gestures (" +
-                    "_id INTEGER PRIMARY KEY," +
-                    "title TEXT," +
-                    "intent TEXT," +
-                    "itemType INTEGER," +
-                    "iconType INTEGER," +
-                    "iconPackage TEXT," +
-                    "iconResource TEXT," +
-                    "icon BLOB" +
-                    ");");
-
             // Database was just created, so wipe any previous widgets
             if (mAppWidgetHost != null) {
                 mAppWidgetHost.deleteHost();
@@ -371,26 +359,7 @@
             }
 
             if (version < 4) {
-                db.beginTransaction();
-                try {
-                    db.execSQL("CREATE TABLE gestures (" +
-                        "_id INTEGER PRIMARY KEY," +
-                        "title TEXT," +
-                        "intent TEXT," +
-                        "itemType INTEGER," +
-                        "iconType INTEGER," +
-                        "iconPackage TEXT," +
-                        "iconResource TEXT," +
-                        "icon BLOB" +
-                        ");");
-                    db.setTransactionSuccessful();
-                    version = 4;
-                } catch (SQLException ex) {
-                    // Old version remains, which means we wipe old data
-                    Log.e(TAG, ex.getMessage(), ex);
-                } finally {
-                    db.endTransaction();
-                }
+                version = 4;
             }
             
             if (version < 5) {
@@ -408,14 +377,86 @@
                 }
             }
             
+            if (version < 6) {
+                if (updateContactsShortcuts(db)) {
+                    version = 6;
+                }
+            }
+            
             if (version != DATABASE_VERSION) {
                 Log.w(TAG, "Destroying all old data.");
                 db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVORITES);
-                db.execSQL("DROP TABLE IF EXISTS " + TABLE_GESTURES);
                 onCreate(db);
             }
         }
-        
+
+        private boolean updateContactsShortcuts(SQLiteDatabase db) {
+            Cursor c = null;
+            final String selectWhere = buildOrWhereString(Favorites.ITEM_TYPE,
+                    new int[] { Favorites.ITEM_TYPE_SHORTCUT });
+
+            db.beginTransaction();
+            try {
+                // Select and iterate through each matching widget
+                c = db.query(TABLE_FAVORITES, new String[] { Favorites._ID, Favorites.INTENT },
+                        selectWhere, null, null, null, null);
+                
+                if (LOGD) Log.d(TAG, "found upgrade cursor count=" + c.getCount());
+                
+                final ContentValues values = new ContentValues();
+                final int idIndex = c.getColumnIndex(Favorites._ID);
+                final int intentIndex = c.getColumnIndex(Favorites.INTENT);
+                
+                while (c != null && c.moveToNext()) {
+                    long favoriteId = c.getLong(idIndex);
+                    final String intentUri = c.getString(intentIndex);
+                    if (intentUri != null) {
+                        try {
+                            Intent intent = Intent.parseUri(intentUri, 0);
+                            android.util.Log.d("Home", intent.toString());
+                            final Uri uri = intent.getData();
+                            final String data = uri.toString();
+                            if (Intent.ACTION_VIEW.equals(intent.getAction()) &&
+                                    (data.startsWith("content://contacts/people/") ||
+                                    data.startsWith("content://com.android.contacts/contacts/lookup/"))) {
+
+                                intent = new Intent("com.android.contacts.action.QUICK_CONTACT");
+                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+                                        Intent.FLAG_ACTIVITY_CLEAR_TOP |
+                                        Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+
+                                intent.setData(uri);
+                                intent.putExtra("mode", 3);
+                                intent.putExtra("exclude_mimes", (String[]) null);
+
+                                values.clear();
+                                values.put(LauncherSettings.Favorites.INTENT, intent.toUri(0));
+    
+                                String updateWhere = Favorites._ID + "=" + favoriteId;
+                                db.update(TABLE_FAVORITES, values, updateWhere, null);                                
+                            }
+                        } catch (RuntimeException ex) {
+                            Log.e(TAG, "Problem upgrading shortcut", ex);
+                        } catch (URISyntaxException e) {
+                            Log.e(TAG, "Problem upgrading shortcut", e);                            
+                        }
+                    }
+                }
+                
+                db.setTransactionSuccessful();
+            } catch (SQLException ex) {
+                Log.w(TAG, "Problem while upgrading contacts", ex);
+                return false;
+            } finally {
+                db.endTransaction();
+                if (c != null) {
+                    c.close();
+                }
+            }
+
+            return true;
+        }
+
         /**
          * Upgrade existing clock and photo frame widgets into their new widget
          * equivalents. This method allocates appWidgetIds, and then hands off to
@@ -649,10 +690,6 @@
         }
         
         private boolean addAppWidget(SQLiteDatabase db, ContentValues values, TypedArray a) {
-            final int[] bindSources = new int[] {
-                    Favorites.ITEM_TYPE_APPWIDGET,
-            };
-
             String packageName = a.getString(R.styleable.Favorite_packageName);
             String className = a.getString(R.styleable.Favorite_className);
 
@@ -662,9 +699,6 @@
             
             ComponentName cn = new ComponentName(packageName, className);
             
-            final ArrayList<ComponentName> bindTargets = new ArrayList<ComponentName>();
-            bindTargets.add(cn);
-
             boolean allocatedAppWidgets = false;
             final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
 
@@ -694,7 +728,7 @@
             final int iconResId = a.getResourceId(R.styleable.Favorite_icon, 0);
             final int titleResId = a.getResourceId(R.styleable.Favorite_title, 0);
 
-            Intent intent = null;
+            Intent intent;
             String uri = null;
             try {
                 uri = a.getString(R.styleable.Favorite_uri);
diff --git a/src/com/android/launcher2/LauncherSettings.java b/src/com/android/launcher2/LauncherSettings.java
index a930acd..a438d47 100644
--- a/src/com/android/launcher2/LauncherSettings.java
+++ b/src/com/android/launcher2/LauncherSettings.java
@@ -90,37 +90,6 @@
         static final String ICON = "icon";
     }
 
-    static final class Gestures implements BaseLauncherColumns {
-                /**
-         * The content:// style URL for this table
-         */
-        static final Uri CONTENT_URI = Uri.parse("content://" +
-                LauncherProvider.AUTHORITY + "/" + LauncherProvider.TABLE_GESTURES +
-                "?" + LauncherProvider.PARAMETER_NOTIFY + "=true");
-
-        /**
-         * The content:// style URL for this table. When this Uri is used, no notification is
-         * sent if the content changes.
-         */
-        static final Uri CONTENT_URI_NO_NOTIFICATION = Uri.parse("content://" +
-                LauncherProvider.AUTHORITY + "/" + LauncherProvider.TABLE_GESTURES +
-                "?" + LauncherProvider.PARAMETER_NOTIFY + "=false");
-
-        /**
-         * The content:// style URL for a given row, identified by its id.
-         *
-         * @param id The row id.
-         * @param notify True to send a notification is the content changes.
-         *
-         * @return The unique content URL for the specified row.
-         */
-        static Uri getContentUri(long id, boolean notify) {
-            return Uri.parse("content://" + LauncherProvider.AUTHORITY +
-                    "/" + LauncherProvider.TABLE_GESTURES + "/" + id + "?" +
-                    LauncherProvider.PARAMETER_NOTIFY + "=" + notify);
-        }
-    }
-
     /**
      * Favorites. When changing these values, be sure to update
      * {@link com.android.settings.LauncherAppWidgetBinder} as needed.