Write reply/forward flags on Controller.sendMessage

- also fix some mixups with the actual icon states

Bug: 4947145
Change-Id: Iec1bbfc46ac956a6bf050e4fb162b94ea3c6b316
This commit is contained in:
Ben Komalo 2011-07-06 16:48:51 -04:00
parent d8ab562d0d
commit 7891106a7d
4 changed files with 40 additions and 18 deletions

View File

@ -294,6 +294,12 @@ public abstract class EmailContent {
public String mTextContent; public String mTextContent;
public String mHtmlReply; public String mHtmlReply;
public String mTextReply; public String mTextReply;
/**
* Points to the ID of the message being replied to or forwarded. Will always be set,
* even if {@link #mHtmlReply} and {@link #mTextReply} are null (indicating the user doesn't
* want to include quoted text.
*/
public long mSourceKey; public long mSourceKey;
public String mIntroText; public String mIntroText;
@ -680,7 +686,7 @@ public abstract class EmailContent {
public String mProtocolSearchInfo; public String mProtocolSearchInfo;
// The following transient members may be used while building and manipulating messages, // The following transient members may be used while building and manipulating messages,
// but they are NOT persisted directly by EmailProvider // but they are NOT persisted directly by EmailProvider. See Body for related fields.
transient public String mText; transient public String mText;
transient public String mHtml; transient public String mHtml;
transient public String mTextReply; transient public String mTextReply;

View File

@ -93,8 +93,6 @@ public class Controller {
/*package*/ static final String SEARCH_MAILBOX_SERVER_ID = "__search_mailbox__"; /*package*/ static final String SEARCH_MAILBOX_SERVER_ID = "__search_mailbox__";
private static final String WHERE_TYPE_ATTACHMENT = private static final String WHERE_TYPE_ATTACHMENT =
MailboxColumns.TYPE + "=" + Mailbox.TYPE_ATTACHMENT; MailboxColumns.TYPE + "=" + Mailbox.TYPE_ATTACHMENT;
private static final String WHERE_TYPE_SEARCH =
MailboxColumns.TYPE + "=" + Mailbox.TYPE_SEARCH;
private static final String WHERE_MAILBOX_KEY = MessageColumns.MAILBOX_KEY + "=?"; private static final String WHERE_MAILBOX_KEY = MessageColumns.MAILBOX_KEY + "=?";
private static final String[] MESSAGEID_TO_ACCOUNTID_PROJECTION = new String[] { private static final String[] MESSAGEID_TO_ACCOUNTID_PROJECTION = new String[] {
@ -554,15 +552,19 @@ public class Controller {
* Send a message: * Send a message:
* - move the message to Outbox (the message is assumed to be in Drafts). * - move the message to Outbox (the message is assumed to be in Drafts).
* - EAS service will take it from there * - EAS service will take it from there
* - mark reply/forward state in source message (if any)
* - trigger send for POP/IMAP * - trigger send for POP/IMAP
* @param messageId the id of the message to send * @param message the fully populated Message (usually retrieved from the Draft box). Note that
* all transient fields (e.g. Body related fields) are also expected to be fully loaded
*/ */
public void sendMessage(long messageId, long accountId) { public void sendMessage(Message message) {
ContentResolver resolver = mProviderContext.getContentResolver(); ContentResolver resolver = mProviderContext.getContentResolver();
if (accountId == -1) { long accountId = message.mAccountKey;
long messageId = message.mId;
if (accountId == Account.NO_ACCOUNT) {
accountId = lookupAccountForMessage(messageId); accountId = lookupAccountForMessage(messageId);
} }
if (accountId == -1) { if (accountId == Account.NO_ACCOUNT) {
// probably the message was not found // probably the message was not found
if (Logging.LOGD) { if (Logging.LOGD) {
Email.log("no account found for message " + messageId); Email.log("no account found for message " + messageId);
@ -576,9 +578,25 @@ public class Controller {
cv.put(EmailContent.MessageColumns.MAILBOX_KEY, outboxId); cv.put(EmailContent.MessageColumns.MAILBOX_KEY, outboxId);
// does this need to be SYNCED_CONTENT_URI instead? // does this need to be SYNCED_CONTENT_URI instead?
Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, messageId); Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, messageId);
resolver.update(uri, cv, null, null); resolver.update(uri, cv, null, null);
// If this is a reply/forward, indicate it as such on the source.
long sourceKey = message.mSourceKey;
if (sourceKey != Message.NO_MESSAGE) {
Message source = Message.restoreMessageWithId(mProviderContext, sourceKey);
if (source != null) {
boolean isReply = (message.mFlags & Message.FLAG_TYPE_REPLY) != 0;
int flagUpdate = isReply ? Message.FLAG_REPLIED_TO : Message.FLAG_FORWARDED;
uri = ContentUris.withAppendedId(Message.CONTENT_URI, sourceKey);
cv.clear();
cv.put(MessageColumns.FLAGS, source.mFlags | flagUpdate);
resolver.update(uri, cv, null, null);
} else {
Log.w(Logging.LOG_TAG, "Unable to find source message for a reply/forward");
}
}
sendPendingMessages(accountId); sendPendingMessages(accountId);
} }

View File

@ -1162,8 +1162,8 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
// Use the Intent to set flags saying this message is a reply or a forward and save the // Use the Intent to set flags saying this message is a reply or a forward and save the
// unique id of the source message // unique id of the source message
if (mSource != null && mQuotedTextBar.getVisibility() == View.VISIBLE) { if (mSource != null && mQuotedTextBar.getVisibility() == View.VISIBLE) {
// If the quote bar is visible; this must either be a reply or forward
message.mSourceKey = mSource.mId; message.mSourceKey = mSource.mId;
// If the quote bar is visible; this must either be a reply or forward
// Get the body of the source message here // Get the body of the source message here
message.mHtmlReply = mSource.mHtml; message.mHtmlReply = mSource.mHtml;
message.mTextReply = mSource.mText; message.mTextReply = mSource.mText;
@ -1195,8 +1195,9 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
mDraft.mIntroText = null; mDraft.mIntroText = null;
mDraft.mTextReply = null; mDraft.mTextReply = null;
mDraft.mHtmlReply = null; mDraft.mHtmlReply = null;
mDraft.mSourceKey = 0;
mDraft.mFlags &= ~Message.FLAG_TYPE_MASK; // Note that mSourceKey is not cleared out as this is still considered a
// reply/forward.
} }
} }
} }
@ -1282,7 +1283,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
Utility.showToast(MessageCompose.this, Utility.showToast(MessageCompose.this,
R.string.message_view_attachment_background_load); R.string.message_view_attachment_background_load);
} }
mController.sendMessage(mDraft.mId, mDraft.mAccountKey); mController.sendMessage(mDraft);
ArrayList<CharSequence> addressTexts = new ArrayList<CharSequence>(); ArrayList<CharSequence> addressTexts = new ArrayList<CharSequence>();
addressTexts.add(mToView.getText()); addressTexts.add(mToView.getText());

View File

@ -76,9 +76,6 @@ public class MessageListItem extends View {
init(context); init(context);
} }
// Narrow mode shows sender/snippet and time/favorite stacked to save real estate; due to this,
// it is also somewhat taller
private static final int MODE_NARROW = MessageListItemCoordinates.NARROW_MODE;
// Wide mode shows sender, snippet, time, and favorite spread out across the screen // Wide mode shows sender, snippet, time, and favorite spread out across the screen
private static final int MODE_WIDE = MessageListItemCoordinates.WIDE_MODE; private static final int MODE_WIDE = MessageListItemCoordinates.WIDE_MODE;
// Sentinel indicating that the view needs layout // Sentinel indicating that the view needs layout
@ -357,13 +354,13 @@ public class MessageListItem extends View {
// Draw the reply state. Draw nothing if neither replied nor forwarded. // Draw the reply state. Draw nothing if neither replied nor forwarded.
if (mHasBeenRepliedTo && mHasBeenForwarded) { if (mHasBeenRepliedTo && mHasBeenForwarded) {
canvas.drawBitmap(sStateReplied, canvas.drawBitmap(sStateRepliedAndForwarded,
mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint); mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint);
} else if (mHasBeenRepliedTo) { } else if (mHasBeenRepliedTo) {
canvas.drawBitmap(sStateForwarded, canvas.drawBitmap(sStateReplied,
mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint); mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint);
} else if (mHasBeenForwarded) { } else if (mHasBeenForwarded) {
canvas.drawBitmap(sStateRepliedAndForwarded, canvas.drawBitmap(sStateForwarded,
mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint); mCoordinates.stateX, mCoordinates.stateY, sDefaultPaint);
} }