Merge "Show remove folder option in user created labels." into jb-ub-mail
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"><b><xliff:g id="count">%1$d</xliff:g></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 */