Don't move drafts to trash
Now deleted drafts are really deleted, rather than getting moved to trash. Also rewrote the test to avoid creating AsyncTasks on the test thread. In this case it seems to be running fine, but I've had problems doing this before. Bug 3099179 Change-Id: Ice5298bf94312ce764d90aa35c5a6c5262ec5b42
This commit is contained in:
parent
f8b30b776b
commit
77aabd9519
|
@ -677,18 +677,27 @@ public class Controller {
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete a single message by moving it to the trash, or deleting it from the trash
|
||||
* Delete a single message by moving it to the trash, or really delete it if it's already in
|
||||
* trash or a draft message.
|
||||
*
|
||||
* This function has no callback, no result reporting, because the desired outcome
|
||||
* 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
|
||||
* @return the AsyncTask used to execute the deletion
|
||||
*/
|
||||
public AsyncTask<Void, Void, Void> deleteMessage(final long messageId, long accountId) {
|
||||
return Utility.runAsync(new Runnable() {
|
||||
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) {
|
||||
// 1. Get the message's account
|
||||
Account account = Account.getAccountForMessageId(mProviderContext, messageId);
|
||||
|
||||
|
@ -707,8 +716,8 @@ public class Controller {
|
|||
ContentResolver resolver = mProviderContext.getContentResolver();
|
||||
|
||||
// 5. Perform "delete" as appropriate
|
||||
if (mailbox.mId == trashMailboxId) {
|
||||
// 5a. Delete from trash
|
||||
if ((mailbox.mId == trashMailboxId) || (mailbox.mType == Mailbox.TYPE_DRAFTS)) {
|
||||
// 5a. Really delete it
|
||||
resolver.delete(uri, null, null);
|
||||
} else {
|
||||
// 5b. Move to trash
|
||||
|
@ -721,8 +730,6 @@ public class Controller {
|
|||
mLegacyController.processPendingActions(account.mId);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Moving messages to another folder
|
||||
|
|
|
@ -199,36 +199,72 @@ public class ControllerProviderOpsTests extends ProviderTestCase2<EmailProvider>
|
|||
public void testDeleteMessage() throws InterruptedException, ExecutionException {
|
||||
Account account1 = ProviderTestUtils.setupAccount("message-delete", true, mProviderContext);
|
||||
long account1Id = account1.mId;
|
||||
Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
|
||||
long box1Id = box1.mId;
|
||||
Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account1Id, false, mProviderContext);
|
||||
box2.mType = EmailContent.Mailbox.TYPE_TRASH;
|
||||
box2.save(mProviderContext);
|
||||
long box2Id = box2.mId;
|
||||
Mailbox box = ProviderTestUtils.setupMailbox("box1", account1Id, true, mProviderContext);
|
||||
long boxId = box.mId;
|
||||
|
||||
Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false,
|
||||
Mailbox trashBox = ProviderTestUtils.setupMailbox("box2", account1Id, false,
|
||||
mProviderContext);
|
||||
trashBox.mType = EmailContent.Mailbox.TYPE_TRASH;
|
||||
trashBox.save(mProviderContext);
|
||||
long trashBoxId = trashBox.mId;
|
||||
|
||||
Mailbox draftBox = ProviderTestUtils.setupMailbox("box3", account1Id, false,
|
||||
mProviderContext);
|
||||
draftBox.mType = EmailContent.Mailbox.TYPE_DRAFTS;
|
||||
draftBox.save(mProviderContext);
|
||||
long draftBoxId = draftBox.mId;
|
||||
|
||||
{
|
||||
// Case 1: Message in a regular mailbox, account known.
|
||||
Message message = ProviderTestUtils.setupMessage("message1", account1Id, boxId, false,
|
||||
true, mProviderContext);
|
||||
long message1Id = message1.mId;
|
||||
long messageId = message.mId;
|
||||
|
||||
// Because deleteMessage now runs asynchronously, call get() to force it to complete
|
||||
mTestController.deleteMessage(message1Id, account1Id).get();
|
||||
mTestController.deleteMessageSync(messageId, account1Id);
|
||||
|
||||
// now read back a fresh copy and confirm it's in the trash
|
||||
Message message1get = EmailContent.Message.restoreMessageWithId(mProviderContext,
|
||||
message1Id);
|
||||
assertEquals(box2Id, message1get.mMailboxKey);
|
||||
Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
|
||||
messageId);
|
||||
assertEquals(trashBoxId, restored.mMailboxKey);
|
||||
}
|
||||
|
||||
// Now repeat test with accountId "unknown"
|
||||
Message message2 = ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false,
|
||||
{
|
||||
// Case 2: Message in a regular mailbox, account *un*known.
|
||||
Message message = ProviderTestUtils.setupMessage("message2", account1Id, boxId, false,
|
||||
true, mProviderContext);
|
||||
long message2Id = message2.mId;
|
||||
long messageId = message.mId;
|
||||
|
||||
mTestController.deleteMessage(message2Id, -1).get();
|
||||
mTestController.deleteMessageSync(messageId, -1);
|
||||
|
||||
// now read back a fresh copy and confirm it's in the trash
|
||||
Message message2get = EmailContent.Message.restoreMessageWithId(mProviderContext,
|
||||
message2Id);
|
||||
assertEquals(box2Id, message2get.mMailboxKey);
|
||||
Message restored = EmailContent.Message.restoreMessageWithId(mProviderContext,
|
||||
messageId);
|
||||
assertEquals(trashBoxId, restored.mMailboxKey);
|
||||
}
|
||||
|
||||
{
|
||||
// Case 3: Already in trash
|
||||
Message message = ProviderTestUtils.setupMessage("message3", account1Id, trashBoxId,
|
||||
false, true, mProviderContext);
|
||||
long messageId = message.mId;
|
||||
|
||||
mTestController.deleteMessageSync(messageId, account1Id);
|
||||
|
||||
// Message should be deleted.
|
||||
assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
|
||||
}
|
||||
|
||||
{
|
||||
// Case 4: Draft
|
||||
Message message = ProviderTestUtils.setupMessage("message3", account1Id, draftBoxId,
|
||||
false, true, mProviderContext);
|
||||
long messageId = message.mId;
|
||||
|
||||
mTestController.deleteMessageSync(messageId, account1Id);
|
||||
|
||||
// Message should be deleted.
|
||||
assertNull(EmailContent.Message.restoreMessageWithId(mProviderContext, messageId));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -248,8 +284,7 @@ public class ControllerProviderOpsTests extends ProviderTestCase2<EmailProvider>
|
|||
mProviderContext);
|
||||
long message1Id = message1.mId;
|
||||
|
||||
// Because deleteMessage now runs asynchronously, call get() to force it to complete
|
||||
mTestController.deleteMessage(message1Id, account1Id).get();
|
||||
mTestController.deleteMessageSync(message1Id, account1Id);
|
||||
|
||||
// now read back a fresh copy and confirm it's in the trash
|
||||
Message message1get =
|
||||
|
|
Loading…
Reference in New Issue