Folder auto-destroys itself when there is only one item left.

Change-Id: I4ea41e0730e3dc474a518eba0a04c11167b5c1df
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 029b89f..1324a08 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -329,7 +329,7 @@
         mItemsInvalidated = true;
         mInfo.addListener(this);
 
-        if (sDefaultFolderName != mInfo.title) {
+        if (!sDefaultFolderName.contentEquals(mInfo.title)) {
             mFolderName.setText(mInfo.title);
         } else {
             mFolderName.setText("");
@@ -784,6 +784,42 @@
             setupContentForNumItems(getItemCount());
             mRearrangeOnClose = false;
         }
+        if (getItemCount() <= 1) {
+            replaceFolderWithFinalItem();
+        }
+    }
+
+    private void replaceFolderWithFinalItem() {
+        ItemInfo finalItem = null;
+
+        if (getItemCount() == 1) {
+            finalItem = mInfo.contents.get(0);
+        }
+
+        // Remove the folder completely
+        final CellLayout cellLayout = (CellLayout)
+                mLauncher.getWorkspace().getChildAt(mInfo.screen);
+        cellLayout.removeView(mFolderIcon);
+        if (mFolderIcon instanceof DropTarget) {
+            mDragController.removeDropTarget((DropTarget) mFolderIcon);
+        }
+        mLauncher.removeFolder(mInfo);
+
+        if (finalItem != null) {
+            LauncherModel.addOrMoveItemInDatabase(mLauncher, finalItem,
+                    LauncherSettings.Favorites.CONTAINER_DESKTOP, mInfo.screen,
+                    mInfo.cellX, mInfo.cellY);
+        }
+        LauncherModel.deleteFolderContentsFromDatabase(mLauncher, mInfo, true);
+
+        // Add the last remaining child to the workspace in place of the folder
+        if (finalItem != null) {
+            View child = mLauncher.createShortcut(R.layout.application, cellLayout,
+                    (ShortcutInfo) finalItem);
+
+            mLauncher.getWorkspace().addInScreen(child, mInfo.screen, mInfo.cellX, mInfo.cellY, 
+                    mInfo.spanX, mInfo.spanY);
+        }
     }
 
     public void onDrop(DragObject d) {
@@ -833,6 +869,9 @@
         } else {
             setupContentForNumItems(getItemCount());
         }
+        if (getItemCount() <= 1) {
+            replaceFolderWithFinalItem();
+        }
     }
 
     public void onItemsChanged() {
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 7cfab2a..a79a968 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -380,15 +380,33 @@
             });
     }
 
+    static void deleteFolderContentsFromDatabase(Context context, final FolderInfo info) {
+        deleteFolderContentsFromDatabase(context, info, false);
+    }
+
     /**
      * Remove the contents of the specified folder from the database
      */
-    static void deleteFolderContentsFromDatabase(Context context, FolderInfo info) {
+    static void deleteFolderContentsFromDatabase(Context context, final FolderInfo info,
+            boolean post) {
+        // TODO: this post flag is temporary to fix an ordering of commands issue. In future, 
+        // all db operations will be moved to the worker thread, so this can be discarded at
+        // that time.
         final ContentResolver cr = context.getContentResolver();
 
-        cr.delete(LauncherSettings.Favorites.getContentUri(info.id, false), null, null);
-        cr.delete(LauncherSettings.Favorites.CONTENT_URI,
-                LauncherSettings.Favorites.CONTAINER + "=" + info.id, null);
+        if (!post) {
+            cr.delete(LauncherSettings.Favorites.getContentUri(info.id, false), null, null);
+            cr.delete(LauncherSettings.Favorites.CONTENT_URI,
+                    LauncherSettings.Favorites.CONTAINER + "=" + info.id, null);
+        } else {
+            sWorker.post(new Runnable() {
+                public void run() {
+                    cr.delete(LauncherSettings.Favorites.getContentUri(info.id, false), null, null);
+                    cr.delete(LauncherSettings.Favorites.CONTENT_URI,
+                            LauncherSettings.Favorites.CONTAINER + "=" + info.id, null);
+                }
+            });
+        }
     }
 
     /**