diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java index b5408b4f9..cfe313889 100644 --- a/src/com/android/email/Controller.java +++ b/src/com/android/email/Controller.java @@ -721,6 +721,33 @@ public class Controller { resolver.delete(uri, null, null); } + /** + * Async version of {@link #deleteMessageSync}. + */ + public void deleteMessage(final long messageId) { + EmailAsyncTask.runAsyncParallel(new Runnable() { + public void run() { + deleteMessageSync(messageId); + } + }); + } + + /** + * Batch & async version of {@link #deleteMessageSync}. + */ + public void deleteMessages(final long[] messageIds) { + if (messageIds == null || messageIds.length == 0) { + throw new IllegalArgumentException(); + } + EmailAsyncTask.runAsyncParallel(new Runnable() { + public void run() { + for (long messageId: messageIds) { + deleteMessageSync(messageId); + } + } + }); + } + /** * Delete a single message by moving it to the trash, or really delete it if it's already in * trash or a draft message. @@ -729,20 +756,8 @@ public class Controller { * is reflected entirely by changes to one or more cursors. * * @param messageId The id of the message to "delete". - * @param accountId The id of the message's account, or -1 if not known by caller */ - public void deleteMessage(final long messageId, final long accountId) { - Utility.runAsync(new Runnable() { - public void run() { - deleteMessageSync(messageId, accountId); - } - }); - } - - /** - * Synchronous version of {@link #deleteMessage} for tests. - */ - /* package */ void deleteMessageSync(long messageId, long accountId) { + /* package */ void deleteMessageSync(long messageId) { // 1. Get the message's account Account account = Account.getAccountForMessageId(mProviderContext, messageId); diff --git a/src/com/android/email/activity/ActivityHelper.java b/src/com/android/email/activity/ActivityHelper.java index cfaa4f4a6..9784366b4 100644 --- a/src/com/android/email/activity/ActivityHelper.java +++ b/src/com/android/email/activity/ActivityHelper.java @@ -92,7 +92,7 @@ public final class ActivityHelper { } public static void deleteMessage(Context context, long messageId) { - Controller.getInstance(context).deleteMessage(messageId, -1); + Controller.getInstance(context).deleteMessage(messageId); Utility.showToast(context, context.getResources().getQuantityString(R.plurals.message_deleted_toast, 1)); } diff --git a/src/com/android/email/activity/MailboxListFragment.java b/src/com/android/email/activity/MailboxListFragment.java index ac3200f35..bd5c5262c 100644 --- a/src/com/android/email/activity/MailboxListFragment.java +++ b/src/com/android/email/activity/MailboxListFragment.java @@ -791,24 +791,12 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList long id = Long.parseLong(msgNum); messageIds[i] = id; } - final MailboxListItem targetItem = mDropTargetView; // Call either deleteMessage or moveMessage, depending on the target - EmailAsyncTask.runAsyncSerial(new Runnable() { - @Override - public void run() { - if (targetItem.mMailboxType == Mailbox.TYPE_TRASH) { - for (long messageId: messageIds) { - // TODO Get this off UI thread (put in clip) - Message msg = Message.restoreMessageWithId(mActivity, messageId); - if (msg != null) { - controller.deleteMessage(messageId, msg.mAccountKey); - } - } - } else { - controller.moveMessages(messageIds, targetItem.mMailboxId); - } - } - }); + if (mDropTargetView.mMailboxType == Mailbox.TYPE_TRASH) { + controller.deleteMessages(messageIds); + } else { + controller.moveMessages(messageIds, mDropTargetView.mMailboxId); + } return true; } diff --git a/src/com/android/email/activity/MessageCompose.java b/src/com/android/email/activity/MessageCompose.java index 5f3c84c95..749cae57b 100644 --- a/src/com/android/email/activity/MessageCompose.java +++ b/src/com/android/email/activity/MessageCompose.java @@ -1306,7 +1306,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus // first save, we give it an ID at this point for the first time (and last time). // Which means it's possible for a draft to not have an ID in onDiscard(), // but here. - mController.deleteMessage(mDraft.mId, mDraft.mAccountKey); + mController.deleteMessage(mDraft.mId); } Utility.showToast(MessageCompose.this, R.string.message_discarded_toast); setDraftNeedsSaving(false); diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java index 8607aa8c9..7fcdae0e9 100644 --- a/src/com/android/email/activity/MessageListFragment.java +++ b/src/com/android/email/activity/MessageListFragment.java @@ -849,13 +849,10 @@ public class MessageListFragment extends ListFragment } private void deleteMessages(Set selectedSet) { - // Clone the set, because deleting is going to thrash things - HashSet cloneSet = new HashSet(selectedSet); - for (Long id : cloneSet) { - mController.deleteMessage(id, -1); - } + final long[] messageIds = Utility.toPrimitiveLongArray(selectedSet); + mController.deleteMessages(messageIds); Toast.makeText(mActivity, mActivity.getResources().getQuantityString( - R.plurals.message_deleted_toast, cloneSet.size()), Toast.LENGTH_SHORT).show(); + R.plurals.message_deleted_toast, messageIds.length), Toast.LENGTH_SHORT).show(); selectedSet.clear(); // Message deletion is async... Can't refresh the list immediately. } diff --git a/tests/src/com/android/email/ControllerProviderOpsTests.java b/tests/src/com/android/email/ControllerProviderOpsTests.java index 24a9ab07b..3cc2f9e01 100644 --- a/tests/src/com/android/email/ControllerProviderOpsTests.java +++ b/tests/src/com/android/email/ControllerProviderOpsTests.java @@ -218,7 +218,7 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 true, mProviderContext); long messageId = message.mId; - mTestController.deleteMessageSync(messageId, account1Id); + mTestController.deleteMessageSync(messageId); // now read back a fresh copy and confirm it's in the trash Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext, @@ -227,38 +227,24 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 } { - // Case 2: Message in a regular mailbox, account *un*known. - Message message = ProviderTestUtils.setupMessage("message2", account1Id, boxId, false, - true, mProviderContext); - long messageId = message.mId; - - mTestController.deleteMessageSync(messageId, -1); - - // now read back a fresh copy and confirm it's in the trash - Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext, - messageId); - assertEquals(trashBoxId, restored.mMailboxKey); - } - - { - // Case 3: Already in trash + // Case 2: Already in trash Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId, false, true, mProviderContext); long messageId = message.mId; - mTestController.deleteMessageSync(messageId, account1Id); + mTestController.deleteMessageSync(messageId); // Message should be deleted. assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId)); } { - // Case 4: Draft + // Case 3: Draft Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId, false, true, mProviderContext); long messageId = message.mId; - mTestController.deleteMessageSync(messageId, account1Id); + mTestController.deleteMessageSync(messageId); // Message should be deleted. assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId)); @@ -280,7 +266,7 @@ public class ControllerProviderOpsTests extends ProviderTestCase2 mProviderContext); long message1Id = message1.mId; - mTestController.deleteMessageSync(message1Id, account1Id); + mTestController.deleteMessageSync(message1Id); // now read back a fresh copy and confirm it's in the trash Message message1get =