mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-23 18:02:15 -05:00
Local messages
This commit is contained in:
parent
708fb57c04
commit
0024f39bc6
@ -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);
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,7 @@ public class MessagingController implements Runnable {
|
||||
* Don't modify this list directly, but use {@link addMessage} and
|
||||
* {@link removeMatchingMessage} instead.
|
||||
*/
|
||||
LinkedList<Message> messages;
|
||||
LinkedList<LocalMessage> 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<MessageReference>();
|
||||
messages = new LinkedList<Message>();
|
||||
messages = new LinkedList<LocalMessage>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -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<MessageReference> 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<Message> messages) {
|
||||
List<? extends Message> messages) {
|
||||
if (!platformSupportsLockScreenNotifications()) {
|
||||
return;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -1138,14 +1138,14 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
|
||||
* @return The local version of the message. Never <code>null</code>.
|
||||
* @throws MessagingException
|
||||
*/
|
||||
public Message storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException {
|
||||
return this.localStore.database.execute(true, new DbCallback<Message>() {
|
||||
public LocalMessage storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException {
|
||||
return this.localStore.database.execute(true, new DbCallback<LocalMessage>() {
|
||||
@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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user