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:
parent
72b458395d
commit
3096b4ae18
|
@ -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);
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
}
|
||||
|
|
|
@ -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 =
|
||||
|
|
Loading…
Reference in New Issue