Add Controller.deleteMessages(long[]) for batch delete

- Also removed the accoundId parameter, which wasn't used.
- Also cleaned up MailboxListFragment.onDrop.
  (the restored Message was only used to get the account id, but
   it's no longer needed.)

Bug 4384642

Change-Id: I8f6635011dae0529a82972617101e1c130090b76
This commit is contained in:
Makoto Onuki 2011-05-25 12:04:36 -07:00
parent 72b458395d
commit 3096b4ae18
6 changed files with 44 additions and 58 deletions

View File

@ -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);

View File

@ -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));
}

View File

@ -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;
}

View File

@ -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);

View File

@ -849,13 +849,10 @@ public class MessageListFragment extends ListFragment
}
private void deleteMessages(Set<Long> selectedSet) {
// Clone the set, because deleting is going to thrash things
HashSet<Long> cloneSet = new HashSet<Long>(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.
}

View File

@ -218,7 +218,7 @@ public class ControllerProviderOpsTests extends ProviderTestCase2<EmailProvider>
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<EmailProvider>
}
{
// 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<EmailProvider>
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 =