diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java index 4fafea0a5..ae6379aaf 100644 --- a/src/com/android/email/MessagingController.java +++ b/src/com/android/email/MessagingController.java @@ -2214,6 +2214,10 @@ s * critical data as fast as possible, and then we'll fill in the de + ", uid = " + origUid + ", destination folder = " + destFolder + ", isCopy = " + isCopy); } if (isCopy) { + FetchProfile fp = new FetchProfile(); + fp.add(FetchProfile.Item.ENVELOPE); + fp.add(FetchProfile.Item.BODY); + localSrcFolder.fetch(new Message[] { message }, fp, null); localSrcFolder.copyMessages(new Message[] { message }, localDestFolder); } else { @@ -2255,6 +2259,7 @@ s * critical data as fast as possible, and then we'll fill in the de Store localStore = Store.getInstance(account.getLocalStoreUri(), mApplication); Folder localFolder = localStore.getFolder(folder); Message lMessage = localFolder.getMessage(message.getUid()); + String origUid = message.getUid(); if (lMessage != null) { if (folder.equals(account.getTrashFolderName())) @@ -2276,20 +2281,11 @@ s * critical data as fast as possible, and then we'll fill in the de { if (Config.LOGD) { - Log.d(Email.LOG_TAG, "Deleting message in normal folder, copying"); - } - FetchProfile fp = new FetchProfile(); - fp.add(FetchProfile.Item.ENVELOPE); - fp.add(FetchProfile.Item.BODY); - // TODO: Turn the fetch/copy/delete into an atomic move - localFolder.fetch(new Message[] { lMessage }, fp, null); - localFolder.copyMessages(new Message[] { lMessage }, localTrashFolder); - if (folder.equals(account.getOutboxFolderName())) { - lMessage.setFlag(Flag.X_DESTROYED, true); - } - else { - lMessage.setFlag(Flag.DELETED, true); + Log.d(Email.LOG_TAG, "Deleting message in normal folder, moving"); } + + localFolder.moveMessages(new Message[] { message }, localTrashFolder); + } } } @@ -2323,14 +2319,14 @@ s * critical data as fast as possible, and then we'll fill in the de { PendingCommand command = new PendingCommand(); command.command = PENDING_COMMAND_SET_FLAG; - command.arguments = new String[] { folder, message.getUid(), Boolean.toString(true), Flag.DELETED.toString() }; + command.arguments = new String[] { folder, origUid, Boolean.toString(true), Flag.DELETED.toString() }; queuePendingCommand(account, command); processPendingCommands(account); } else if (account.getDeletePolicy() == Account.DELETE_POLICY_ON_DELETE) { PendingCommand command = new PendingCommand(); command.command = PENDING_COMMAND_MOVE_OR_COPY; - command.arguments = new String[] { folder, message.getUid(), account.getTrashFolderName(), "false" }; + command.arguments = new String[] { folder, origUid, account.getTrashFolderName(), "false" }; queuePendingCommand(account, command); processPendingCommands(account); } @@ -2338,7 +2334,7 @@ s * critical data as fast as possible, and then we'll fill in the de { PendingCommand command = new PendingCommand(); command.command = PENDING_COMMAND_SET_FLAG; - command.arguments = new String[] { folder, message.getUid(), Boolean.toString(true), Flag.SEEN.toString() }; + command.arguments = new String[] { folder, origUid, Boolean.toString(true), Flag.SEEN.toString() }; queuePendingCommand(account, command); processPendingCommands(account); } diff --git a/src/com/android/email/activity/FolderMessageList.java b/src/com/android/email/activity/FolderMessageList.java index 9530df294..346409a4e 100644 --- a/src/com/android/email/activity/FolderMessageList.java +++ b/src/com/android/email/activity/FolderMessageList.java @@ -1002,28 +1002,27 @@ public class FolderMessageList extends ExpandableListActivity { return; } - String destFolderName = folder.name; - FolderInfoHolder destHolder = mAdapter.getFolder(destFolderName); - - if (destHolder == null) { +// String destFolderName = folder.name; +// FolderInfoHolder destHolder = mAdapter.getFolder(destFolderName); +// + if (folder == null) { return; } - if (holder.read == false && holder.folder.unreadMessageCount > 0) + if (holder.read == false ) { - holder.folder.unreadMessageCount--; - destHolder.unreadMessageCount++; + if (holder.folder.unreadMessageCount > 0) { + holder.folder.unreadMessageCount--; + } + folder.unreadMessageCount++; } - if (destHolder != null) - { - destHolder.needsRefresh = true; - } - + folder.needsRefresh = true; + mAdapter.removeMessage(holder.message.getFolder().getName(), holder.uid); MessagingController.getInstance(getApplication()).moveMessage(mAccount, - holder.message.getFolder().getName(), holder.message, destFolderName, null); + holder.message.getFolder().getName(), holder.message, folder.name, null); } @@ -1034,25 +1033,19 @@ public class FolderMessageList extends ExpandableListActivity { return; } - String destFolderName = folder.name; - FolderInfoHolder destHolder = mAdapter.getFolder(destFolderName); - - if (destHolder == null) { + if (folder == null) { return; } - if (holder.read == false && holder.folder.unreadMessageCount > 0) + if (holder.read == false) { - destHolder.unreadMessageCount++; - } - - if (destHolder != null) - { - destHolder.needsRefresh = true; + folder.unreadMessageCount++; } + + folder.needsRefresh = true; MessagingController.getInstance(getApplication()).copyMessage(mAccount, - holder.message.getFolder().getName(), holder.message, destFolderName, null); + holder.message.getFolder().getName(), holder.message, folder.name, null); } private void onReply(MessageInfoHolder holder) diff --git a/src/com/android/email/mail/store/LocalStore.java b/src/com/android/email/mail/store/LocalStore.java index b10cbb75d..a5decf6cf 100644 --- a/src/com/android/email/mail/store/LocalStore.java +++ b/src/com/android/email/mail/store/LocalStore.java @@ -981,25 +981,37 @@ public class LocalStore extends Store implements Serializable { @Override public void moveMessages(Message[] msgs, Folder destFolder) throws MessagingException { if (!(destFolder instanceof LocalFolder)) { - throw new MessagingException("copyMessages called with incorrect Folder"); + throw new MessagingException("copyMessages called with non-LocalFolder"); } - + LocalFolder lDestFolder = (LocalFolder)destFolder; + lDestFolder.open(OpenMode.READ_WRITE); for (Message message : msgs) { LocalMessage lMessage = (LocalMessage)message; if (!message.isSet(Flag.SEEN)) { - setUnreadMessageCount(getUnreadMessageCount() - 1); - lDestFolder.setUnreadMessageCount(destFolder.getUnreadMessageCount() + 1); + if (getUnreadMessageCount() > 0) { + setUnreadMessageCount(getUnreadMessageCount() - 1); + } + lDestFolder.setUnreadMessageCount(lDestFolder.getUnreadMessageCount() + 1); } - message.setUid("Local" + UUID.randomUUID().toString()); + String oldUID = message.getUid(); + + Log.d(Email.LOG_TAG, "Updating folder_id to " + lDestFolder.getId() + " for message with UID " + + message.getUid() + ", id " + lMessage.getId() + " currently in folder " + getName()); + + message.setUid("Local" + UUID.randomUUID().toString()); mDb.execSQL("UPDATE messages " + "SET folder_id = ?, uid = ? " + "WHERE id = ?", new Object[] { lDestFolder.getId(), message.getUid(), lMessage.getId() }); + + LocalMessage placeHolder = new LocalMessage(oldUID, this); + placeHolder.setFlagInternal(Flag.DELETED, true); + appendMessages(new Message[] { placeHolder }); } }