blob: c11ab0e5d0ec3d4dc3708c078ff5a405b8b9fae7 [file] [log] [blame]
Mindy Pereira11b0bbd2012-01-24 10:06:17 -08001/*
2 * Copyright (C) 2010 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mail.browse;
19
20import com.android.mail.R;
Mindy Pereira30d2d322012-02-03 08:40:49 -080021import com.android.mail.providers.Account;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080022import com.android.mail.providers.Conversation;
Mindy Pereira4f166de2012-02-14 13:40:58 -080023import com.android.mail.providers.Folder;
Mindy Pereiraefe3d252012-03-01 14:20:44 -080024import com.android.mail.providers.Settings;
Mindy Pereiraf98b3182012-02-22 11:07:13 -080025import com.android.mail.providers.UIProvider;
Paul Westbrook334e64a2012-02-23 13:26:35 -080026import com.android.mail.providers.UIProvider.FolderCapabilities;
Marc Blank8d69d4e2012-01-25 12:04:28 -080027import com.android.mail.providers.UIProvider.ConversationColumns;
Mindy Pereirafac92d72012-02-01 10:58:33 -080028import com.android.mail.ui.AnimatedAdapter;
Mindy Pereira9879d4c2012-01-31 09:34:18 -080029import com.android.mail.ui.ActionCompleteListener;
Vikram Aggarwal1ddcf0f2012-01-13 11:45:02 -080030import com.android.mail.ui.ConversationSelectionSet;
31import com.android.mail.ui.ConversationSetObserver;
Mindy Pereiraf3dfb152012-02-06 12:55:13 -080032import com.android.mail.ui.FoldersSelectionDialog;
Vikram Aggarwald247dc92012-02-10 15:49:01 -080033import com.android.mail.ui.RestrictedActivity;
Mindy Pereiraf3dfb152012-02-06 12:55:13 -080034import com.android.mail.ui.FoldersSelectionDialog.CommitListener;
Mindy Pereira7ad3b872012-02-22 09:10:46 -080035import com.android.mail.ui.UndoBarView.UndoListener;
36import com.android.mail.ui.UndoOperation;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080037import com.android.mail.utils.LogUtils;
Mindy Pereiraefe3d252012-03-01 14:20:44 -080038import com.android.mail.utils.Utils;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080039import com.google.common.annotations.VisibleForTesting;
40
Mindy Pereirad92e9f32012-02-03 09:10:58 -080041import java.util.ArrayList;
Mindy Pereira0825efd2012-02-15 17:30:32 -080042import java.util.Arrays;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080043import java.util.Collection;
Mindy Pereira0825efd2012-02-15 17:30:32 -080044import java.util.HashSet;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080045
Mindy Pereiraefe3d252012-03-01 14:20:44 -080046import android.app.AlertDialog;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080047import android.content.Context;
Mindy Pereiraefe3d252012-03-01 14:20:44 -080048import android.content.DialogInterface;
Mindy Pereira0825efd2012-02-15 17:30:32 -080049import android.text.TextUtils;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080050import android.view.ActionMode;
51import android.view.Menu;
52import android.view.MenuInflater;
53import android.view.MenuItem;
Mindy Pereira30d2d322012-02-03 08:40:49 -080054import android.widget.Toast;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080055
56/**
57 * A component that displays a custom view for an {@code ActionBar}'s {@code
58 * ContextMode} specific to operating on a set of conversations.
59 */
60public class SelectedConversationsActionMenu implements ActionMode.Callback,
Mindy Pereira7ad3b872012-02-22 09:10:46 -080061 ConversationSetObserver, CommitListener {
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080062
63 private static final String LOG_TAG = new LogUtils().getLogTag();
64
65 /**
66 * The set of conversations to display the menu for.
67 */
68 protected final ConversationSelectionSet mSelectionSet;
Marc Blankce538182012-02-03 13:04:27 -080069 /**
70 * The set of conversations to marked for deletion
71 */
72 protected Collection<Conversation> mDeletionSet;
73 /**
74 * The new folder list (after selection)
75 */
76 protected String mFolderChangeList;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080077
Vikram Aggarwald247dc92012-02-10 15:49:01 -080078 private final RestrictedActivity mActivity;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080079
Vikram Aggarwalcd8bf0a2012-02-14 13:13:18 -080080 /**
81 * Context of the activity. A dialog requires the context of an activity rather than the global
82 * root context of the process. So mContext = mActivity.getApplicationContext() will fail.
83 */
Mindy Pereira11b0bbd2012-01-24 10:06:17 -080084 private final Context mContext;
85
86 @VisibleForTesting
87 ActionMode mActionMode;
88
89 private boolean mActivated = false;
90
91 private Menu mMenu;
92
Mindy Pereirafac92d72012-02-01 10:58:33 -080093 private AnimatedAdapter mListAdapter;
Mindy Pereira9879d4c2012-01-31 09:34:18 -080094
Mindy Pereira96b5c352012-02-01 11:33:40 -080095 private ActionCompleteListener mActionCompleteListener;
96
Mindy Pereira7ad3b872012-02-22 09:10:46 -080097 private UndoListener mUndoListener;
98
Mindy Pereira30d2d322012-02-03 08:40:49 -080099 private Account mAccount;
100
Mindy Pereirad92e9f32012-02-03 09:10:58 -0800101 protected int mCheckedItem = 0;
102
Mindy Pereira4f166de2012-02-14 13:40:58 -0800103 private Folder mFolder;
104
Mindy Pereira830c00f2012-02-22 11:43:49 -0800105 private ActionCompleteListener mDeleteListener = new DestructiveActionListener(R.id.delete);
106 private ActionCompleteListener mArchiveListener = new DestructiveActionListener(R.id.archive);
107 private ActionCompleteListener mMuteListener = new DestructiveActionListener(R.id.mute);
108 private ActionCompleteListener mSpamListener = new DestructiveActionListener(R.id.report_spam);
Mindy Pereiraf98b3182012-02-22 11:07:13 -0800109
Vikram Aggarwald247dc92012-02-10 15:49:01 -0800110 public SelectedConversationsActionMenu(RestrictedActivity activity,
Mindy Pereira96b5c352012-02-01 11:33:40 -0800111 ConversationSelectionSet selectionSet, AnimatedAdapter adapter,
Mindy Pereira7ad3b872012-02-22 09:10:46 -0800112 ActionCompleteListener listener, UndoListener undoListener, Account account,
113 Folder folder) {
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800114 mSelectionSet = selectionSet;
115 mActivity = activity;
Vikram Aggarwalcd8bf0a2012-02-14 13:13:18 -0800116 mContext = mActivity.getActivityContext();
Mindy Pereirafac92d72012-02-01 10:58:33 -0800117 mListAdapter = adapter;
Mindy Pereira96b5c352012-02-01 11:33:40 -0800118 mActionCompleteListener = listener;
Mindy Pereira7ad3b872012-02-22 09:10:46 -0800119 mUndoListener = undoListener;
Mindy Pereira30d2d322012-02-03 08:40:49 -0800120 mAccount = account;
Mindy Pereira4f166de2012-02-14 13:40:58 -0800121 mFolder = folder;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800122 }
123
124 @Override
125 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
126 boolean handled = true;
Marc Blank8d69d4e2012-01-25 12:04:28 -0800127 Collection<Conversation> conversations = mSelectionSet.values();
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800128 switch (item.getItemId()) {
129 case R.id.delete:
Mindy Pereiraefe3d252012-03-01 14:20:44 -0800130 performDestructiveAction(R.id.delete, mDeleteListener);
Marc Blank8d69d4e2012-01-25 12:04:28 -0800131 break;
Mindy Pereiraf98b3182012-02-22 11:07:13 -0800132 case R.id.archive:
Mindy Pereiraefe3d252012-03-01 14:20:44 -0800133 performDestructiveAction(R.id.archive, mArchiveListener);
Mindy Pereiraf98b3182012-02-22 11:07:13 -0800134 break;
Mindy Pereira830c00f2012-02-22 11:43:49 -0800135 case R.id.mute:
136 mListAdapter.delete(conversations, mMuteListener);
137 break;
138 case R.id.report_spam:
139 mListAdapter.delete(conversations, mSpamListener);
140 break;
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800141 case R.id.read:
142 markConversationsRead(true);
143 break;
144 case R.id.unread:
145 markConversationsRead(false);
Marc Blank8d69d4e2012-01-25 12:04:28 -0800146 break;
147 case R.id.star:
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800148 starConversations(true);
149 break;
150 case R.id.remove_star:
151 starConversations(false);
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800152 break;
Mindy Pereira30d2d322012-02-03 08:40:49 -0800153 case R.id.change_folder:
154 showChangeFoldersDialog();
155 break;
Mindy Pereira7f0a9622012-02-29 15:00:34 -0800156 case R.id.mark_important:
157 markConversationsImportant(true);
158 break;
159 case R.id.mark_not_important:
160 markConversationsImportant(false);
161 break;
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800162 default:
163 handled = false;
164 break;
165 }
166 return handled;
167 }
168
Mindy Pereiraefe3d252012-03-01 14:20:44 -0800169 private void performDestructiveAction(int id, final ActionCompleteListener listener) {
170 Settings settings = mActivity.getSettings();
171 final Collection<Conversation> conversations = mSelectionSet.values();
172 boolean showDialog = false;
173 if (settings != null) {
174 showDialog = (id == R.id.delete) ? settings.confirmDelete : settings.confirmArchive;
175 }
176 if (showDialog) {
177 int resId = id == R.id.delete ? R.plurals.confirm_delete_conversation
178 : R.plurals.confirm_archive_conversation;
179 CharSequence message = Utils.formatPlural(mContext, resId, conversations.size());
180 new AlertDialog.Builder(mContext).setMessage(message)
181 .setPositiveButton(R.string.ok, new AlertDialog.OnClickListener() {
182 @Override
183 public void onClick(DialogInterface dialog, int which) {
184 mListAdapter.delete(conversations, listener);
185 }
186
187 }).setNegativeButton(R.string.cancel, null).create().show();
188 } else {
189 mListAdapter.delete(conversations, listener);
190 }
191 }
192
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800193 private void markConversationsRead(boolean read) {
194 Collection<Conversation> conversations = mSelectionSet.values();
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800195 Conversation.updateBoolean(mContext, conversations, ConversationColumns.READ, read);
196 mSelectionSet.clear();
197 // Redraw with changes
198 mListAdapter.notifyDataSetChanged();
199 }
200
Mindy Pereira7f0a9622012-02-29 15:00:34 -0800201 private void markConversationsImportant(boolean important) {
202 Collection<Conversation> conversations = mSelectionSet.values();
203 int priority = important ? UIProvider.ConversationPriority.HIGH
204 : UIProvider.ConversationPriority.LOW;
205 Conversation.updateInt(mContext, conversations, ConversationColumns.PRIORITY, priority);
206 mSelectionSet.clear();
207 // Redraw with changes
208 mListAdapter.notifyDataSetChanged();
209 }
210
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800211 private void starConversations(boolean star) {
212 Collection<Conversation> conversations = mSelectionSet.values();
213 if (conversations.size() > 0) {
214 Conversation.updateBoolean(mContext, conversations,
215 ConversationColumns.STARRED, star);
216 }
217 mSelectionSet.clear();
218 // Redraw with changes
219 mListAdapter.notifyDataSetChanged();
220 }
221
Mindy Pereira30d2d322012-02-03 08:40:49 -0800222 private void showChangeFoldersDialog() {
Vikram Aggarwald247dc92012-02-10 15:49:01 -0800223 new FoldersSelectionDialog(mContext, mAccount, this, mSelectionSet.values()).show();
Mindy Pereiraf3dfb152012-02-06 12:55:13 -0800224 }
Marc Blankce538182012-02-03 13:04:27 -0800225
Mindy Pereiraf3dfb152012-02-06 12:55:13 -0800226 @Override
227 public void onCommit(String folderChangeList) {
228 mFolderChangeList = folderChangeList;
229 // TODO: Make user-friendly toast
230 Toast.makeText(mContext, folderChangeList, Toast.LENGTH_LONG).show();
231 // Do the change here...
Mindy Pereira4f166de2012-02-14 13:40:58 -0800232 // Get currently active folder info and compare it to the list
233 // these conversations have been given; if they no longer contain
234 // the selected folder, delete them from the list.
Mindy Pereira0825efd2012-02-15 17:30:32 -0800235 HashSet<String> folderUris = new HashSet<String>();
236 if (!TextUtils.isEmpty(folderChangeList)) {
237 folderUris.addAll(Arrays.asList(folderChangeList.split(",")));
238 }
239 if (!folderUris.contains(mFolder.uri)) {
Mindy Pereira4f166de2012-02-14 13:40:58 -0800240 final Collection<Conversation> conversations = mSelectionSet.values();
241 // Indicate delete on update (i.e. no longer in this folder)
242 mDeletionSet = new ArrayList<Conversation>();
243 for (Conversation conv : conversations) {
244 conv.localDeleteOnUpdate = true;
245 // For Gmail, add... if (noLongerInList(conv))...
246 mDeletionSet.add(conv);
247 }
248 // Delete the local delete items (all for now) and when done,
249 // update...
250 mListAdapter.delete(mDeletionSet, mFolderChangeListener);
251 } else {
252 mFolderChangeListener.onActionComplete();
Mindy Pereirad92e9f32012-02-03 09:10:58 -0800253 }
Mindy Pereira30d2d322012-02-03 08:40:49 -0800254 }
255
Marc Blankce538182012-02-03 13:04:27 -0800256 private ActionCompleteListener mFolderChangeListener = new ActionCompleteListener() {
257 @Override
258 public void onActionComplete() {
259 mActionCompleteListener.onActionComplete();
Mindy Pereiraf98b3182012-02-22 11:07:13 -0800260 Collection<Conversation> deletionSet = mDeletionSet;
261 // Only show undo if this was a destructive folder change.
262 UndoOperation undoOp = null;
263 if (deletionSet != null && deletionSet.size() > 0) {
264 undoOp = new UndoOperation(deletionSet.size(), R.id.change_folder);
265 mDeletionSet = null;
266 }
267 mUndoListener.onUndoAvailable(undoOp);
Vikram Aggarwald247dc92012-02-10 15:49:01 -0800268 Conversation.updateString(mContext, mSelectionSet.values(),
Marc Blankce538182012-02-03 13:04:27 -0800269 ConversationColumns.FOLDER_LIST, mFolderChangeList);
270 mSelectionSet.clear();
271 mListAdapter.notifyDataSetChanged();
Mindy Pereiraf98b3182012-02-22 11:07:13 -0800272 }
273 };
Marc Blankce538182012-02-03 13:04:27 -0800274
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800275 @Override
276 public boolean onCreateActionMode(ActionMode mode, Menu menu) {
277 mSelectionSet.addObserver(this);
278 MenuInflater inflater = mActivity.getMenuInflater();
279 inflater.inflate(R.menu.conversation_list_selection_actions_menu, menu);
280 mActionMode = mode;
281 mMenu = menu;
282 updateCount();
283 return true;
284 }
285
286 @Override
287 public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800288 // Determine read/ unread
289 // Star/ unstar
290 Collection<Conversation> conversations = mSelectionSet.values();
291 boolean showStar = false;
292 boolean showMarkUnread = false;
Mindy Pereira7f0a9622012-02-29 15:00:34 -0800293 boolean showMarkImportant = false;
294
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800295 for (Conversation conversation : conversations) {
296 if (!conversation.starred) {
297 showStar = true;
298 }
299 if (conversation.read) {
300 showMarkUnread = true;
301 }
Mindy Pereira7f0a9622012-02-29 15:00:34 -0800302 if (!conversation.isImportant()) {
303 showMarkImportant = true;
304 }
305 if (showStar && showMarkUnread && showMarkImportant) {
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800306 break;
307 }
308 }
Paul Westbrook334e64a2012-02-23 13:26:35 -0800309 final MenuItem star = menu.findItem(R.id.star);
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800310 star.setVisible(showStar);
Paul Westbrook334e64a2012-02-23 13:26:35 -0800311 final MenuItem unstar = menu.findItem(R.id.remove_star);
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800312 unstar.setVisible(!showStar);
Paul Westbrook334e64a2012-02-23 13:26:35 -0800313 final MenuItem read = menu.findItem(R.id.read);
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800314 read.setVisible(!showMarkUnread);
Paul Westbrook334e64a2012-02-23 13:26:35 -0800315 final MenuItem unread = menu.findItem(R.id.unread);
Mindy Pereirafebeb5f2012-02-14 15:08:13 -0800316 unread.setVisible(showMarkUnread);
Paul Westbrook334e64a2012-02-23 13:26:35 -0800317 final MenuItem archive = menu.findItem(R.id.archive);
318 archive.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.ARCHIVE) &&
319 mFolder.supportsCapability(FolderCapabilities.ARCHIVE));
320 final MenuItem spam = menu.findItem(R.id.report_spam);
321 spam.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.REPORT_SPAM) &&
322 mFolder.supportsCapability(FolderCapabilities.ARCHIVE));
323 final MenuItem mute = menu.findItem(R.id.mute);
Mindy Pereira830c00f2012-02-22 11:43:49 -0800324 mute.setVisible(mAccount.supportsCapability(UIProvider.AccountCapabilities.MUTE));
Mindy Pereira7f0a9622012-02-29 15:00:34 -0800325 final MenuItem markImportant = menu.findItem(R.id.mark_important);
326 markImportant.setVisible(showMarkImportant
327 && mAccount.supportsCapability(UIProvider.AccountCapabilities.MARK_IMPORTANT));
328 final MenuItem markNotImportant = menu.findItem(R.id.mark_not_important);
329 markNotImportant.setVisible(!showMarkImportant
330 && mAccount.supportsCapability(UIProvider.AccountCapabilities.MARK_IMPORTANT));
331
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800332 return true;
333 }
334
335 public void onPrepareActionMode() {
336 if (mActionMode != null) {
337 onPrepareActionMode(mActionMode, mActionMode.getMenu());
338 }
339 }
340
341 @Override
342 public void onDestroyActionMode(ActionMode mode) {
343 mActionMode = null;
344 // The action mode may have been destroyed due to this menu being deactivated, in which
345 // case resources need not be cleaned up. However, if it was destroyed while this menu is
346 // active, that implies the user hit "Done" in the top right, and resources need cleaning.
347 if (mActivated) {
348 destroy();
349
350 if (mSelectionSet.size() > 0) {
351 // If we are destroying the menu, when there is a selection, clear the
352 // set of conversations
353 LogUtils.e(LOG_TAG,
354 "Destroying action menu, with non-empty conversation set. Count: %d",
355 mSelectionSet.size());
356 mSelectionSet.clear();
357 }
358 }
359 mMenu = null;
360 }
361
362 @Override
Vikram Aggarwal1ddcf0f2012-01-13 11:45:02 -0800363 public void onSetPopulated(ConversationSelectionSet set) {
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800364 // Noop. This object can only exist while the set is non-empty.
365 }
366
367 @Override
Vikram Aggarwal1ddcf0f2012-01-13 11:45:02 -0800368 public void onSetEmpty() {
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800369 destroy();
370 }
371
372 @Override
373 public void onSetChanged(ConversationSelectionSet set) {
374 // If the set is empty, the menu buttons are invalid and most like the menu will be cleaned
375 // up. Avoid making any changes to stop flickering ("Add Star" -> "Remove Star") just
376 // before hiding the menu.
377 if (set.isEmpty()) {
378 return;
379 }
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800380 updateCount();
381 }
382
383 /**
384 * Updates the visible count of how many conversations are selected.
385 */
386 private void updateCount() {
387 if (mActionMode != null) {
388 mActionMode.setTitle(mContext.getString(R.string.num_selected, mSelectionSet.size()));
389 }
390 }
391
392 /**
393 * Activates and shows this menu (essentially starting an {@link ActionMode}).
394 */
395 public void activate() {
396 mActivated = true;
397 if (mActionMode == null) {
398 mActivity.startActionMode(this);
399 }
400 }
401
402 /**
403 * De-activates and hides the menu (essentially disabling the {@link ActionMode}), but maintains
404 * the selection conversation set, and internally updates state as necessary.
405 */
406 public void deactivate() {
407 if (mActionMode != null) {
408 mActivated = false;
409 mActionMode.finish();
410 }
411 }
412
413 @VisibleForTesting
414 public boolean isActivated() {
415 return mActivated;
416 }
417
418 /**
419 * Destroys and cleans up the resources associated with this menu.
420 */
421 public void destroy() {
422 deactivate();
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800423 mSelectionSet.removeObserver(this);
424 mSelectionSet.clear();
425 }
426
427 /**
428 * Disable the selected conversations menu item associated with a command
429 * id.
430 */
431 public void disableCommand(int id) {
432 enableMenuItem(id, false);
433 }
434
435 /**
436 * Enable the selected conversations menu item associated with a command
437 * id.
438 */
439 public void enableCommand(int id) {
440 enableMenuItem(id, true);
441 }
442
443 private void enableMenuItem(int id, boolean enable) {
444 if (mActivated) {
445 MenuItem item = mMenu.findItem(id);
446 if (item != null) {
447 item.setEnabled(enable);
448 }
449 }
450 }
Mindy Pereira830c00f2012-02-22 11:43:49 -0800451
452
453 private class DestructiveActionListener implements ActionCompleteListener {
454 private int mAction;
455 public DestructiveActionListener(int action) {
456 mAction = action;
457 }
458
459 @Override
460 public void onActionComplete() {
461 // This is where we actually delete.
462 Collection<Conversation> conversations = mSelectionSet.values();
463 mActionCompleteListener.onActionComplete();
464 mUndoListener.onUndoAvailable(new UndoOperation(conversations.size(), mAction));
465 switch (mAction) {
466 case R.id.archive:
467 Conversation.archive(mContext, conversations);
468 break;
469 case R.id.delete:
470 Conversation.delete(mContext, conversations);
471 break;
472 case R.id.mute:
Paul Westbrook334e64a2012-02-23 13:26:35 -0800473 if (mFolder.supportsCapability(FolderCapabilities.DESTRUCTIVE_MUTE)) {
474 // Make sure to set the localDeleteOnUpdate flag for these conversatons.
475 for (Conversation conversation: conversations) {
476 conversation.localDeleteOnUpdate = true;
477 }
478 }
Mindy Pereira830c00f2012-02-22 11:43:49 -0800479 Conversation.mute(mContext, conversations);
480 break;
481 case R.id.report_spam:
482 Conversation.reportSpam(mContext, conversations);
483 break;
484 }
485 mListAdapter.notifyDataSetChanged();
486 mSelectionSet.clear();
487 }
488 };
Mindy Pereira11b0bbd2012-01-24 10:06:17 -0800489}