Adding a rank column for itemInfo

> Rank is used to determine position of an item
in a folder.

Bug: 18590192
Change-Id: I2826a7c570b4cc58e719d685f17a24ec6133804f
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 9233bcb..a9ad596 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -57,7 +57,7 @@
     private static final boolean LOGD = false;
 
     private static final int MIN_DATABASE_VERSION = 12;
-    private static final int DATABASE_VERSION = 20;
+    private static final int DATABASE_VERSION = 21;
 
     static final String OLD_AUTHORITY = "com.android.launcher2.settings";
     static final String AUTHORITY = ProviderConfig.AUTHORITY;
@@ -326,6 +326,10 @@
                 Uri.parse(getContext().getString(R.string.old_launcher_provider_uri)));
     }
 
+    public void updateFolderItemsRank() {
+        mOpenHelper.updateFolderItemsRank(mOpenHelper.getWritableDatabase(), false);
+    }
+
     public void deleteDatabase() {
         // Are you sure? (y/n)
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
@@ -409,7 +413,8 @@
                     "appWidgetProvider TEXT," +
                     "modified INTEGER NOT NULL DEFAULT 0," +
                     "restored INTEGER NOT NULL DEFAULT 0," +
-                    "profileId INTEGER DEFAULT " + userSerialNumber +
+                    "profileId INTEGER DEFAULT " + userSerialNumber + "," +
+                    "rank INTEGER NOT NULL DEFAULT 0" +
                     ");");
             addWorkspacesTable(db);
 
@@ -585,6 +590,12 @@
                 // else old version remains, which means we wipe old data
             }
 
+            if (version < 21) {
+                if (updateFolderItemsRank(db, true)) {
+                    version  = 21;
+                }
+            }
+
             if (version != DATABASE_VERSION) {
                 Log.w(TAG, "Destroying all old data.");
                 createEmptyDB(db);
@@ -609,6 +620,37 @@
             onCreate(db);
         }
 
+        private boolean updateFolderItemsRank(SQLiteDatabase db, boolean addRankColumn) {
+            db.beginTransaction();
+            try {
+                if (addRankColumn) {
+                    // Insert new column for holding rank
+                    db.execSQL("ALTER TABLE favorites ADD COLUMN rank INTEGER NOT NULL DEFAULT 0;");
+                }
+
+                // Get a map for folder ID to folder width
+                Cursor c = db.rawQuery("SELECT container, MAX(cellX) FROM favorites"
+                        + " WHERE container IN (SELECT _id FROM favorites WHERE itemType = ?)"
+                        + " GROUP BY container;",
+                        new String[] {Integer.toString(LauncherSettings.Favorites.ITEM_TYPE_FOLDER)});
+
+                while (c.moveToNext()) {
+                    db.execSQL("UPDATE favorites SET rank=cellX+(cellY*?) WHERE container=?;",
+                            new Object[] {c.getLong(1) + 1, c.getLong(0)});
+                }
+
+                c.close();
+                db.setTransactionSuccessful();
+            } catch (SQLException ex) {
+                // Old version remains, which means we wipe old data
+                Log.e(TAG, ex.getMessage(), ex);
+                return false;
+            } finally {
+                db.endTransaction();
+            }
+            return true;
+        }
+
         private boolean addProfileColumn(SQLiteDatabase db) {
             db.beginTransaction();
             try {
@@ -1116,6 +1158,8 @@
                         } finally {
                             db.endTransaction();
                         }
+
+                        updateFolderItemsRank(db, false);
                     }
                 } finally {
                     c.close();