Show remove folder option in user created labels.

Fixes b/6977686 User created labels don't have Remove label (archive) icon

Change-Id: Icecada98ac11e66f622fbac80991a481873eed18
diff --git a/res/menu-sw600dp-port/conversation_actions.xml b/res/menu-sw600dp-port/conversation_actions.xml
index 8c60cd4..12bf1e5 100644
--- a/res/menu-sw600dp-port/conversation_actions.xml
+++ b/res/menu-sw600dp-port/conversation_actions.xml
@@ -25,7 +25,12 @@
         android:showAsAction="ifRoom"
         android:icon="@drawable/archive"
         android:alphabeticShortcut="@string/trigger_y_char" />
-
+    <item
+        android:id="@+id/remove_folder"
+        android:title="@string/remove_folder"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/archive"
+        android:alphabeticShortcut="@string/trigger_y_char" />
     <item
         android:id="@+id/delete"
         android:title="@string/delete"
diff --git a/res/menu-sw600dp-port/conversation_search_results_actions.xml b/res/menu-sw600dp-port/conversation_search_results_actions.xml
index 9ee4679..1e91daa 100644
--- a/res/menu-sw600dp-port/conversation_search_results_actions.xml
+++ b/res/menu-sw600dp-port/conversation_search_results_actions.xml
@@ -25,7 +25,6 @@
         android:showAsAction="ifRoom"
         android:icon="@drawable/archive"
         android:alphabeticShortcut="@string/trigger_y_char" />
-
     <item
         android:id="@+id/delete"
         android:title="@string/delete"
diff --git a/res/menu-sw600dp/conversation_actions.xml b/res/menu-sw600dp/conversation_actions.xml
index 7a9eb83..ff678e3 100644
--- a/res/menu-sw600dp/conversation_actions.xml
+++ b/res/menu-sw600dp/conversation_actions.xml
@@ -37,7 +37,12 @@
         android:showAsAction="ifRoom"
         android:icon="@drawable/archive"
         android:alphabeticShortcut="@string/trigger_y_char" />
-
+    <item
+        android:id="@+id/remove_folder"
+        android:title="@string/remove_folder"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/archive"
+        android:alphabeticShortcut="@string/trigger_y_char" />
     <item
         android:id="@+id/delete"
         android:title="@string/delete"
diff --git a/res/menu/conversation_actions.xml b/res/menu/conversation_actions.xml
index 5462e39..88de115 100644
--- a/res/menu/conversation_actions.xml
+++ b/res/menu/conversation_actions.xml
@@ -25,6 +25,12 @@
         android:showAsAction="ifRoom"
         android:icon="@drawable/archive"
         android:alphabeticShortcut="@string/trigger_y_char" />
+    <item
+        android:id="@+id/remove_folder"
+        android:title="@string/remove_folder"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/archive"
+        android:alphabeticShortcut="@string/trigger_y_char" />
     <!-- Always available -->
     <item
         android:id="@+id/delete"
diff --git a/res/menu/conversation_list_selection_actions_menu.xml b/res/menu/conversation_list_selection_actions_menu.xml
index acaa87c..83095ee 100644
--- a/res/menu/conversation_list_selection_actions_menu.xml
+++ b/res/menu/conversation_list_selection_actions_menu.xml
@@ -27,7 +27,12 @@
         android:showAsAction="ifRoom"
         android:icon="@drawable/archive"
         android:alphabeticShortcut="@string/trigger_y_char"/>
-
+    <item
+        android:id="@+id/remove_folder"
+        android:title="@string/remove_folder"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/archive"
+        android:alphabeticShortcut="@string/trigger_y_char" />
     <item
         android:id="@+id/delete"
         android:title="@string/delete"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5c23de1..9da68be 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -464,7 +464,7 @@
         <!-- Displayed while marking multiple conversations as unread. [CHAR LIMIT=80]-->
         <item quantity="other">&lt;b><xliff:g id="count">%1$d</xliff:g>&lt;/b> marked unread.</item>
     </plurals>
-
+ 
     <plurals name="conversation_folder_changed">
         <!-- Displayed while adding and removing folders to a single conversation. [CHAR LIMIT=100] -->
         <item quantity="one">Changed folder.</item>
diff --git a/src/com/android/mail/browse/SelectedConversationsActionMenu.java b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
index 38bd85b..594f485 100644
--- a/src/com/android/mail/browse/SelectedConversationsActionMenu.java
+++ b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
@@ -115,6 +115,11 @@
             case R.id.archive:
                 performDestructiveAction(R.id.archive);
                 break;
+            case R.id.remove_folder:
+                destroy(R.id.remove_folder, mSelectionSet.values(),
+                        mUpdater.getDeferredRemoveFolder(mSelectionSet.values(), mFolder, true,
+                                true, true));
+                break;
             case R.id.mute:
                 mUpdater.delete(mSelectionSet.values(), mUpdater.getBatchAction(R.id.mute));
                 break;
@@ -347,8 +352,15 @@
         final MenuItem unread = menu.findItem(R.id.unread);
         unread.setVisible(showMarkUnread);
         final MenuItem archive = menu.findItem(R.id.archive);
-        archive.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.ARCHIVE) &&
-                mFolder.supportsCapability(FolderCapabilities.ARCHIVE));
+        archive.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.ARCHIVE)
+                && mFolder.supportsCapability(FolderCapabilities.ARCHIVE));
+        final MenuItem removeFolder = menu.findItem(R.id.remove_folder);
+        removeFolder.setVisible(!archive.isVisible() && mFolder != null
+                && mFolder.supportsCapability(FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES));
+        if (mFolder != null) {
+            removeFolder.setTitle(mActivity.getActivityContext().getString(R.string.remove_folder,
+                    mFolder.name));
+        }
         final MenuItem spam = menu.findItem(R.id.report_spam);
         spam.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.REPORT_SPAM) &&
                 mFolder.supportsCapability(FolderCapabilities.REPORT_SPAM));
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index fbf83a5..4b0d808 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -687,6 +687,9 @@
                         getAction(R.id.archive, target));
                 break;
             }
+            case R.id.remove_folder:
+                delete(target, getRemoveFolder(target, mFolder, true, false, true));
+                break;
             case R.id.delete: {
                 final boolean showDialog = (settings != null && settings.confirmDelete);
                 confirmAndDelete(target, showDialog, R.plurals.confirm_delete_conversation,
@@ -2209,6 +2212,7 @@
         private boolean mCompleted;
         private boolean mIsSelectedSet;
         private boolean mShowUndo;
+        private int mAction;
 
         /**
          * Create a new folder destruction object to act on the given conversations.
@@ -2216,12 +2220,13 @@
          */
         private FolderDestruction(final Collection<Conversation> target,
                 final Collection<FolderOperation> folders, boolean isDestructive, boolean isBatch,
-                boolean showUndo) {
+                boolean showUndo, int action) {
             mTarget = ImmutableList.copyOf(target);
             mFolderOps.addAll(folders);
             mIsDestructive = isDestructive;
             mIsSelectedSet = isBatch;
             mShowUndo = showUndo;
+            mAction = action;
         }
 
         @Override
@@ -2231,7 +2236,7 @@
             }
             if (mIsDestructive && mShowUndo) {
                 ToastBarOperation undoOp = new ToastBarOperation(mTarget.size(),
-                        R.id.change_folder, ToastBarOperation.UNDO);
+                        mAction, ToastBarOperation.UNDO);
                 onUndoAvailable(undoOp);
             }
             // For each conversation, for each operation, add/ remove the
@@ -2239,6 +2244,9 @@
             for (Conversation target : mTarget) {
                 HashMap<Uri, Folder> targetFolders = Folder
                         .hashMapForFolders(target.getRawFolders());
+                if (mIsDestructive) {
+                    target.localDeleteOnUpdate = true;
+                }
                 for (FolderOperation op : mFolderOps) {
                     if (op.mAdd) {
                         targetFolders.put(op.mFolder.uri, op.mFolder);
@@ -2273,7 +2281,28 @@
             Collection<FolderOperation> folders, boolean isDestructive, boolean isBatch,
             boolean showUndo) {
         final DestructiveAction da = new FolderDestruction(target, folders, isDestructive, isBatch,
-                showUndo);
+                showUndo, R.id.change_folder);
+        registerDestructiveAction(da);
+        return da;
+    }
+
+    @Override
+    public final DestructiveAction getDeferredRemoveFolder(Collection<Conversation> target,
+            Folder toRemove, boolean isDestructive, boolean isBatch,
+            boolean showUndo) {
+        Collection<FolderOperation> folderOps = new ArrayList<FolderOperation>();
+        folderOps.add(new FolderOperation(toRemove, false));
+        return new FolderDestruction(target, folderOps, isDestructive, isBatch,
+                showUndo, R.id.remove_folder);
+    }
+
+    private final DestructiveAction getRemoveFolder(Collection<Conversation> target,
+            Folder toRemove, boolean isDestructive, boolean isBatch,
+            boolean showUndo) {
+        Collection<FolderOperation> folderOps = new ArrayList<FolderOperation>();
+        folderOps.add(new FolderOperation(toRemove, false));
+        DestructiveAction da = new FolderDestruction(target, folderOps, isDestructive, isBatch,
+                showUndo, R.id.remove_folder);
         registerDestructiveAction(da);
         return da;
     }
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index c3597a3..0ce8898 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -547,7 +547,7 @@
             if (ConversationListContext.isSearchResult(mViewContext)) {
                 action = R.id.delete;
             } else if (mFolder == null) {
-                action = R.id.change_folder;
+                action = R.id.remove_folder;
             } else {
                 // We have enough information to respect user settings.
                 switch (swipeSetting) {
@@ -558,7 +558,7 @@
                                 break;
                             } else if (mFolder.supportsCapability
                                     (FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES)) {
-                                action = R.id.change_folder;
+                                action = R.id.remove_folder;
                                 break;
                             }
                         }
diff --git a/src/com/android/mail/ui/ConversationUpdater.java b/src/com/android/mail/ui/ConversationUpdater.java
index d2e0b93..8188c48 100644
--- a/src/com/android/mail/ui/ConversationUpdater.java
+++ b/src/com/android/mail/ui/ConversationUpdater.java
@@ -24,6 +24,7 @@
 import com.android.mail.browse.MessageCursor.ConversationMessage;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.ConversationInfo;
+import com.android.mail.providers.Folder;
 import com.android.mail.providers.UIProvider;
 
 import java.util.Collection;
@@ -128,6 +129,16 @@
     public DestructiveAction getDeferredBatchAction(int action);
 
     /**
+     * Get destructive folder change for selected conversations.
+     * The caller must explicitly call performAction.
+     * @param action
+     * @return
+     */
+    public DestructiveAction getDeferredRemoveFolder(Collection<Conversation> target,
+            Folder toRemove, boolean isDestructive, boolean isBatch,
+            boolean showUndo);
+
+    /**
      * Assign the target conversations to the given folders, and remove them from all other
      * folders that they might be assigned to.
      * @param folders the folders to assign the conversations to.
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index 7c27edc..7199202 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -387,9 +387,16 @@
                                 .supportsCapability(UIProvider.AccountCapabilities.MARK_IMPORTANT));
         // TODO(mindyp) show/ hide spam and mute based on conversation
         // properties to be added.
+        boolean archiveVisible = mAccount.supportsCapability(AccountCapabilities.ARCHIVE)
+                && mFolder != null && mFolder.supportsCapability(FolderCapabilities.ARCHIVE);
         Utils.setMenuItemVisibility(menu, R.id.archive,
-                mAccount.supportsCapability(AccountCapabilities.ARCHIVE) && mFolder != null
-                        && mFolder.supportsCapability(FolderCapabilities.ARCHIVE));
+                archiveVisible);
+        Utils.setMenuItemVisibility(menu, R.id.remove_folder, !archiveVisible && mFolder != null
+                && mFolder.supportsCapability(FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES));
+        if (mFolder != null) {
+            menu.findItem(R.id.remove_folder).setTitle(
+                    mActivity.getActivityContext().getString(R.string.remove_folder, mFolder.name));
+        }
         Utils.setMenuItemVisibility(menu, R.id.report_spam,
                 mAccount.supportsCapability(AccountCapabilities.REPORT_SPAM) && mFolder != null
                         && mFolder.supportsCapability(FolderCapabilities.REPORT_SPAM)
diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java
index c0971b1..53e8fe2 100644
--- a/src/com/android/mail/ui/OnePaneController.java
+++ b/src/com/android/mail/ui/OnePaneController.java
@@ -477,7 +477,8 @@
                             getUndoClickedListener(
                                     convList != null ? convList.getAnimatedAdapter() : null),
                             0,
-                            Html.fromHtml(op.getDescription(mActivity.getActivityContext())),
+                            Html.fromHtml(op.getDescription(mActivity.getActivityContext(),
+                                    mFolder)),
                             true, /* showActionIcon */
                             R.string.undo,
                             true,  /* replaceVisibleToast */
@@ -490,7 +491,8 @@
                         mToastBar.show(
                                 getUndoClickedListener(convList.getAnimatedAdapter()),
                                 0,
-                                Html.fromHtml(op.getDescription(mActivity.getActivityContext())),
+                                Html.fromHtml(op.getDescription(mActivity.getActivityContext(),
+                                        mFolder)),
                                 true, /* showActionIcon */
                                 R.string.undo,
                                 true,  /* replaceVisibleToast */
diff --git a/src/com/android/mail/ui/SwipeableListView.java b/src/com/android/mail/ui/SwipeableListView.java
index dc9088a..16792e6 100644
--- a/src/com/android/mail/ui/SwipeableListView.java
+++ b/src/com/android/mail/ui/SwipeableListView.java
@@ -189,7 +189,7 @@
         adapter.setupLeaveBehind(conv, undoOp, conv.position);
         ConversationCursor cc = (ConversationCursor) adapter.getCursor();
         switch (mSwipeAction) {
-            case R.id.change_folder:
+            case R.id.remove_folder:
                 FolderOperation folderOp = new FolderOperation(mFolder, false);
                 HashMap<Uri, Folder> targetFolders = Folder
                         .hashMapForFolders(conv.getRawFolders());
@@ -312,7 +312,7 @@
      */
     public String getSwipeActionText() {
         Resources res = getContext().getResources();
-        if (mSwipeAction == R.id.change_folder) {
+        if (mSwipeAction == R.id.remove_folder) {
             return res.getString(R.string.remove_folder, mFolder.name);
         }
         return res.getString(mSwipeAction == R.id.archive ? R.string.archive : R.string.delete);
diff --git a/src/com/android/mail/ui/ToastBarOperation.java b/src/com/android/mail/ui/ToastBarOperation.java
index ce8d98f..139e0aa 100644
--- a/src/com/android/mail/ui/ToastBarOperation.java
+++ b/src/com/android/mail/ui/ToastBarOperation.java
@@ -89,12 +89,14 @@
      * Get a string description of the operation that will be performed
      * when the user taps the undo bar.
      */
-    public String getDescription(Context context) {
+    public String getDescription(Context context, Folder folder) {
         int resId = -1;
         switch (mAction) {
             case R.id.delete:
                 resId = R.plurals.conversation_deleted;
                 break;
+            case R.id.remove_folder:
+                return context.getString(R.string.folder_removed, folder.name);
             case R.id.change_folder:
                 resId = R.plurals.conversation_folder_changed;
                 break;
@@ -126,7 +128,7 @@
     }
 
     public String getSingularDescription(Context context, Folder folder) {
-        if (mAction == R.id.change_folder) {
+        if (mAction == R.id.remove_folder) {
             return context.getString(R.string.folder_removed, folder.name);
         }
         int resId = -1;
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 8004c1e..7a2378f 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -450,7 +450,8 @@
                     mToastBar.show(
                             getUndoClickedListener(convList.getAnimatedAdapter()),
                             0,
-                            Html.fromHtml(op.getDescription(mActivity.getActivityContext())),
+                            Html.fromHtml(op.getDescription(mActivity.getActivityContext(),
+                                    mFolder)),
                             true, /* showActionIcon */
                             R.string.undo,
                             true,  /* replaceVisibleToast */
@@ -477,7 +478,8 @@
                 mToastBar.show(
                         getUndoClickedListener(convList.getAnimatedAdapter()),
                         0,
-                        Html.fromHtml(op.getDescription(mActivity.getActivityContext())),
+                        Html.fromHtml(op.getDescription(mActivity.getActivityContext(),
+                                mFolder)),
                         true, /* showActionIcon */
                         R.string.undo,
                         true,  /* replaceVisibleToast */