diff --git a/src/com/fsck/k9/activity/MessageCompose.java b/src/com/fsck/k9/activity/MessageCompose.java index 2e6bacf99..9018cba8a 100644 --- a/src/com/fsck/k9/activity/MessageCompose.java +++ b/src/com/fsck/k9/activity/MessageCompose.java @@ -442,7 +442,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, */ public static Intent getActionReplyIntent( Context context, - Message message, + LocalMessage message, boolean replyAll, String messageBody) { Intent i = new Intent(context, MessageCompose.class); @@ -467,7 +467,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, */ public static void actionReply( Context context, - Message message, + LocalMessage message, boolean replyAll, String messageBody) { context.startActivity(getActionReplyIntent(context, message, replyAll, messageBody)); @@ -481,7 +481,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, */ public static void actionForward( Context context, - Message message, + LocalMessage message, String messageBody) { Intent i = new Intent(context, MessageCompose.class); i.putExtra(EXTRA_MESSAGE_BODY, messageBody); diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java index 765d03673..604c1a166 100644 --- a/src/com/fsck/k9/activity/MessageList.java +++ b/src/com/fsck/k9/activity/MessageList.java @@ -42,8 +42,8 @@ import com.fsck.k9.fragment.MessageListFragment; import com.fsck.k9.fragment.MessageListFragment.MessageListFragmentListener; import com.fsck.k9.fragment.MessageViewFragment; import com.fsck.k9.fragment.MessageViewFragment.MessageViewFragmentListener; -import com.fsck.k9.mail.Message; import com.fsck.k9.mail.store.StorageManager; +import com.fsck.k9.mail.store.local.LocalMessage; import com.fsck.k9.search.LocalSearch; import com.fsck.k9.search.SearchAccount; import com.fsck.k9.search.SearchSpecification; @@ -1193,22 +1193,22 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme } @Override - public void onResendMessage(Message message) { + public void onResendMessage(LocalMessage message) { MessageCompose.actionEditDraft(this, message.makeMessageReference()); } @Override - public void onForward(Message message) { + public void onForward(LocalMessage message) { MessageCompose.actionForward(this, message, null); } @Override - public void onReply(Message message) { + public void onReply(LocalMessage message) { MessageCompose.actionReply(this, message, false, null); } @Override - public void onReplyAll(Message message) { + public void onReplyAll(LocalMessage message) { MessageCompose.actionReply(this, message, true, null); } @@ -1399,17 +1399,17 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme } @Override - public void onReply(Message message, PgpData pgpData) { + public void onReply(LocalMessage message, PgpData pgpData) { MessageCompose.actionReply(this, message, false, pgpData.getDecryptedData()); } @Override - public void onReplyAll(Message message, PgpData pgpData) { + public void onReplyAll(LocalMessage message, PgpData pgpData) { MessageCompose.actionReply(this, message, true, pgpData.getDecryptedData()); } @Override - public void onForward(Message mMessage, PgpData mPgpData) { + public void onForward(LocalMessage mMessage, PgpData mPgpData) { MessageCompose.actionForward(this, mMessage, mPgpData.getDecryptedData()); } diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java index 458c713c7..d52c24183 100644 --- a/src/com/fsck/k9/controller/MessagingController.java +++ b/src/com/fsck/k9/controller/MessagingController.java @@ -214,7 +214,7 @@ public class MessagingController implements Runnable { * Don't modify this list directly, but use {@link addMessage} and * {@link removeMatchingMessage} instead. */ - LinkedList messages; + LinkedList messages; /** * List of references for messages that the user is still to be notified of, * but which don't fit into the inbox style anymore. It's sorted from newest @@ -238,7 +238,7 @@ public class MessagingController implements Runnable { public NotificationData(int unread) { unreadBeforeNotification = unread; droppedMessages = new LinkedList(); - messages = new LinkedList(); + messages = new LinkedList(); } /** @@ -249,9 +249,9 @@ public class MessagingController implements Runnable { * * @param m The new message to add. */ - public void addMessage(Message m) { + public void addMessage(LocalMessage m) { while (messages.size() >= MAX_MESSAGES) { - Message dropped = messages.removeLast(); + LocalMessage dropped = messages.removeLast(); droppedMessages.addFirst(dropped.makeMessageReference()); } messages.addFirst(m); @@ -272,10 +272,10 @@ public class MessagingController implements Runnable { } } - for (Message message : messages) { + for (LocalMessage message : messages) { if (message.makeMessageReference().equals(ref)) { if (messages.remove(message) && !droppedMessages.isEmpty()) { - Message restoredMessage = droppedMessages.getFirst().restoreToLocalMessage(context); + LocalMessage restoredMessage = droppedMessages.getFirst().restoreToLocalMessage(context); if (restoredMessage != null) { messages.addLast(restoredMessage); droppedMessages.removeFirst(); @@ -293,7 +293,7 @@ public class MessagingController implements Runnable { * List. */ public void supplyAllMessageRefs(List refs) { - for (Message m : messages) { + for (LocalMessage m : messages) { refs.add(m.makeMessageReference()); } refs.addAll(droppedMessages); @@ -1621,7 +1621,7 @@ public class MessagingController implements Runnable { } // Store the updated message locally - final Message localMessage = localFolder.storeSmallMessage(message, new Runnable() { + final LocalMessage localMessage = localFolder.storeSmallMessage(message, new Runnable() { @Override public void run() { progress.incrementAndGet(); @@ -1769,7 +1769,7 @@ public class MessagingController implements Runnable { // Update the listener with what we've found progress.incrementAndGet(); // TODO do we need to re-fetch this here? - Message localMessage = localFolder.getMessage(message.getUid()); + LocalMessage localMessage = localFolder.getMessage(message.getUid()); // Increment the number of "new messages" if the newly downloaded message is // not marked as read. @@ -4781,8 +4781,7 @@ public class MessagingController implements Runnable { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } - private Message findNewestMessageForNotificationLocked(Context context, - Account account, NotificationData data) { + private LocalMessage findNewestMessageForNotificationLocked(Context context, NotificationData data) { if (!data.messages.isEmpty()) { return data.messages.getFirst(); } @@ -4798,7 +4797,7 @@ public class MessagingController implements Runnable { * Creates a notification of a newly received message. */ private void notifyAccount(Context context, Account account, - Message message, int previousUnreadMessageCount) { + LocalMessage message, int previousUnreadMessageCount) { final NotificationData data = getNotificationData(account, previousUnreadMessageCount); synchronized (data) { notifyAccountWithDataLocked(context, account, message, data); @@ -4809,12 +4808,12 @@ public class MessagingController implements Runnable { private static final int NUM_SENDERS_IN_LOCK_SCREEN_NOTIFICATION = 5; private void notifyAccountWithDataLocked(Context context, Account account, - Message message, NotificationData data) { + LocalMessage message, NotificationData data) { boolean updateSilently = false; if (message == null) { /* this can happen if a message we previously notified for is read or deleted remotely */ - message = findNewestMessageForNotificationLocked(context, account, data); + message = findNewestMessageForNotificationLocked(context, data); updateSilently = true; if (message == null) { // seemingly both the message list as well as the overflow list is empty; @@ -5110,7 +5109,7 @@ public class MessagingController implements Runnable { int unreadCount, CharSequence accountDescription, CharSequence formattedSender, - List messages) { + List messages) { if (!platformSupportsLockScreenNotifications()) { return; } diff --git a/src/com/fsck/k9/fragment/MessageListFragment.java b/src/com/fsck/k9/fragment/MessageListFragment.java index 48e5b6190..fa70da72c 100644 --- a/src/com/fsck/k9/fragment/MessageListFragment.java +++ b/src/com/fsck/k9/fragment/MessageListFragment.java @@ -1190,19 +1190,19 @@ public class MessageListFragment extends Fragment implements OnItemClickListener } } - public void onReply(Message message) { + public void onReply(LocalMessage message) { mFragmentListener.onReply(message); } - public void onReplyAll(Message message) { + public void onReplyAll(LocalMessage message) { mFragmentListener.onReplyAll(message); } - public void onForward(Message message) { + public void onForward(LocalMessage message) { mFragmentListener.onForward(message); } - public void onResendMessage(Message message) { + public void onResendMessage(LocalMessage message) { mFragmentListener.onResendMessage(message); } @@ -1510,23 +1510,19 @@ public class MessageListFragment extends Fragment implements OnItemClickListener break; } case R.id.reply: { - Message message = getMessageAtPosition(adapterPosition); - onReply(message); + onReply(getMessageAtPosition(adapterPosition)); break; } case R.id.reply_all: { - Message message = getMessageAtPosition(adapterPosition); - onReplyAll(message); + onReplyAll(getMessageAtPosition(adapterPosition)); break; } case R.id.forward: { - Message message = getMessageAtPosition(adapterPosition); - onForward(message); + onForward(getMessageAtPosition(adapterPosition)); break; } case R.id.send_again: { - Message message = getMessageAtPosition(adapterPosition); - onResendMessage(message); + onResendMessage(getMessageAtPosition(adapterPosition)); mSelectedCount = 0; break; } @@ -3113,10 +3109,10 @@ public class MessageListFragment extends Fragment implements OnItemClickListener void setMessageListProgress(int level); void showThread(Account account, String folderName, long rootId); void showMoreFromSameSender(String senderAddress); - void onResendMessage(Message message); - void onForward(Message message); - void onReply(Message message); - void onReplyAll(Message message); + void onResendMessage(LocalMessage message); + void onForward(LocalMessage message); + void onReply(LocalMessage message); + void onReplyAll(LocalMessage message); void openMessage(MessageReference messageReference); void setMessageListTitle(String title); void setMessageListSubTitle(String subTitle); diff --git a/src/com/fsck/k9/fragment/MessageViewFragment.java b/src/com/fsck/k9/fragment/MessageViewFragment.java index c8cfea928..5945957e3 100644 --- a/src/com/fsck/k9/fragment/MessageViewFragment.java +++ b/src/com/fsck/k9/fragment/MessageViewFragment.java @@ -846,10 +846,10 @@ public class MessageViewFragment extends Fragment implements OnClickListener, } public interface MessageViewFragmentListener { - public void onForward(Message mMessage, PgpData mPgpData); + public void onForward(LocalMessage mMessage, PgpData mPgpData); public void disableDeleteAction(); - public void onReplyAll(Message mMessage, PgpData mPgpData); - public void onReply(Message mMessage, PgpData mPgpData); + public void onReplyAll(LocalMessage mMessage, PgpData mPgpData); + public void onReply(LocalMessage mMessage, PgpData mPgpData); public void displayMessageSubject(String title); public void setProgress(boolean b); public void showNextMessageOrReturn(); diff --git a/src/com/fsck/k9/mail/Message.java b/src/com/fsck/k9/mail/Message.java index 452d312df..d97982a4d 100644 --- a/src/com/fsck/k9/mail/Message.java +++ b/src/com/fsck/k9/mail/Message.java @@ -2,26 +2,20 @@ package com.fsck.k9.mail; import java.io.IOException; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.EnumSet; -import java.util.HashSet; import java.util.Set; import android.util.Log; import com.fsck.k9.K9; -import com.fsck.k9.activity.MessageReference; import com.fsck.k9.mail.filter.CountingOutputStream; import com.fsck.k9.mail.filter.EOLConvertingOutputStream; import com.fsck.k9.mail.store.UnavailableStorageException; public abstract class Message implements Part, CompositeBody { - protected MessageReference mReference; - - public enum RecipientType { TO, CC, BCC, } @@ -73,7 +67,6 @@ public abstract class Message implements Part, CompositeBody { } public void setUid(String uid) { - this.mReference = null; this.mUid = uid; } @@ -251,15 +244,6 @@ public abstract class Message implements Part, CompositeBody { public abstract void setCharset(String charset) throws MessagingException; - public MessageReference makeMessageReference() { - if (mReference == null) { - mReference = new MessageReference(); - mReference.folderName = getFolder().getName(); - mReference.uid = mUid; - } - return mReference; - } - public long calculateSize() { try { @@ -279,14 +263,12 @@ public abstract class Message implements Part, CompositeBody { /** * Copy the contents of this object into another {@code Message} object. * - * @param destination - * The {@code Message} object to receive the contents of this instance. + * @param destination The {@code Message} object to receive the contents of this instance. */ protected void copy(Message destination) { destination.mUid = mUid; destination.mInternalDate = mInternalDate; destination.mFolder = mFolder; - destination.mReference = mReference; // mFlags contents can change during the object lifetime, so copy the Set destination.mFlags = EnumSet.copyOf(mFlags); diff --git a/src/com/fsck/k9/mail/internet/MimeMessage.java b/src/com/fsck/k9/mail/internet/MimeMessage.java index 75fa217d8..0d7bb8bab 100644 --- a/src/com/fsck/k9/mail/internet/MimeMessage.java +++ b/src/com/fsck/k9/mail/internet/MimeMessage.java @@ -608,28 +608,27 @@ public class MimeMessage extends Message { /** * Copy the contents of this object into another {@code MimeMessage} object. * - * @param message - * The {@code MimeMessage} object to receive the contents of this instance. + * @param destination The {@code MimeMessage} object to receive the contents of this instance. */ - protected void copy(MimeMessage message) { - super.copy(message); + protected void copy(MimeMessage destination) { + super.copy(destination); - message.mHeader = mHeader.clone(); + destination.mHeader = mHeader.clone(); - message.mBody = mBody; - message.mMessageId = mMessageId; - message.mSentDate = mSentDate; - message.mDateFormat = mDateFormat; - message.mSize = mSize; + destination.mBody = mBody; + destination.mMessageId = mMessageId; + destination.mSentDate = mSentDate; + destination.mDateFormat = mDateFormat; + destination.mSize = mSize; // These arrays are not supposed to be modified, so it's okay to reuse the references - message.mFrom = mFrom; - message.mTo = mTo; - message.mCc = mCc; - message.mBcc = mBcc; - message.mReplyTo = mReplyTo; - message.mReferences = mReferences; - message.mInReplyTo = mInReplyTo; + destination.mFrom = mFrom; + destination.mTo = mTo; + destination.mCc = mCc; + destination.mBcc = mBcc; + destination.mReplyTo = mReplyTo; + destination.mReferences = mReferences; + destination.mInReplyTo = mInReplyTo; } @Override diff --git a/src/com/fsck/k9/mail/store/local/LocalFolder.java b/src/com/fsck/k9/mail/store/local/LocalFolder.java index d4273d03f..8ca5c139c 100644 --- a/src/com/fsck/k9/mail/store/local/LocalFolder.java +++ b/src/com/fsck/k9/mail/store/local/LocalFolder.java @@ -1138,14 +1138,14 @@ public class LocalFolder extends Folder implements Serializable { * @return The local version of the message. Never null. * @throws MessagingException */ - public Message storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException { - return this.localStore.database.execute(true, new DbCallback() { + public LocalMessage storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException { + return this.localStore.database.execute(true, new DbCallback() { @Override - public Message doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException { + public LocalMessage doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException { try { appendMessages(Collections.singletonList(message)); final String uid = message.getUid(); - final Message result = getMessage(uid); + final LocalMessage result = getMessage(uid); runnable.run(); // Set a flag indicating this message has now be fully downloaded result.setFlag(Flag.X_DOWNLOADED_FULL, true); diff --git a/src/com/fsck/k9/mail/store/local/LocalMessage.java b/src/com/fsck/k9/mail/store/local/LocalMessage.java index 6dd164f14..7391a8646 100644 --- a/src/com/fsck/k9/mail/store/local/LocalMessage.java +++ b/src/com/fsck/k9/mail/store/local/LocalMessage.java @@ -27,7 +27,7 @@ import com.fsck.k9.mail.store.local.LockableDatabase.DbCallback; import com.fsck.k9.mail.store.local.LockableDatabase.WrappedException; public class LocalMessage extends MimeMessage { - + protected MessageReference mReference; private final LocalStore localStore; private long mId; @@ -52,8 +52,7 @@ public class LocalMessage extends MimeMessage { this.mFolder = folder; } - void populateFromGetMessageCursor(Cursor cursor) - throws MessagingException { + void populateFromGetMessageCursor(Cursor cursor) throws MessagingException { final String subject = cursor.getString(0); this.setSubject(subject == null ? "" : subject); @@ -191,6 +190,12 @@ public class LocalMessage extends MimeMessage { mMessageDirty = true; } + @Override + public void setUid(String uid) { + super.setUid(uid); + this.mReference = null; + } + @Override public boolean hasAttachments() { return (mAttachmentCount > 0); @@ -564,15 +569,24 @@ public class LocalMessage extends MimeMessage { return localStore.getAccount(); } - @Override public MessageReference makeMessageReference() { if (mReference == null) { - mReference = super.makeMessageReference(); + mReference = new MessageReference(); + mReference.folderName = getFolder().getName(); + mReference.uid = mUid; mReference.accountUuid = getFolder().getUuid(); } return mReference; } + @Override + protected void copy(MimeMessage destination) { + super.copy(destination); + if (destination instanceof LocalMessage) { + ((LocalMessage)destination).mReference = mReference; + } + } + @Override public LocalFolder getFolder() { return (LocalFolder) super.getFolder(); diff --git a/src/com/fsck/k9/service/NotificationActionService.java b/src/com/fsck/k9/service/NotificationActionService.java index 2baef7560..079222e69 100644 --- a/src/com/fsck/k9/service/NotificationActionService.java +++ b/src/com/fsck/k9/service/NotificationActionService.java @@ -103,8 +103,8 @@ public class NotificationActionService extends CoreService { if (K9.DEBUG) Log.i(K9.LOG_TAG, "NotificationActionService initiating reply"); - MessageReference ref = (MessageReference) intent.getParcelableExtra(EXTRA_MESSAGE); - Message message = ref.restoreToLocalMessage(this); + MessageReference ref = intent.getParcelableExtra(EXTRA_MESSAGE); + LocalMessage message = ref.restoreToLocalMessage(this); if (message != null) { Intent i = MessageCompose.getActionReplyIntent(this, message, false, null); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);