From e25698319325d5e9619bc45ae85d861b0f1c5954 Mon Sep 17 00:00:00 2001 From: Marc Blank Date: Mon, 7 Sep 2009 16:03:02 -0700 Subject: [PATCH] Add sourceKey to Body table; add flags for reply/forward in Message * Set reply/forward flag and sourceKey as appropriate in MessageCompose * Update provider tests accordingly Change-Id: I7f49d80a735314a1a38f09fbf1f234257c41af8c --- .../email/activity/MessageCompose.java | 11 ++++++++ .../android/email/provider/EmailContent.java | 26 +++++++++++++++-- .../android/email/provider/EmailProvider.java | 28 +++++++++++++------ .../email/provider/ProviderTestUtils.java | 2 ++ .../android/email/provider/ProviderTests.java | 5 ++++ 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/com/android/email/activity/MessageCompose.java b/src/com/android/email/activity/MessageCompose.java index b60ab6531..59aad1636 100644 --- a/src/com/android/email/activity/MessageCompose.java +++ b/src/com/android/email/activity/MessageCompose.java @@ -622,6 +622,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus values.put(MessageColumns.DISPLAY_NAME, message.mDisplayName); values.put(MessageColumns.FLAG_LOADED, message.mFlagLoaded); values.put(MessageColumns.FLAG_ATTACHMENT, message.mFlagAttachment); + values.put(MessageColumns.FLAGS, message.mFlags); return values; } @@ -668,6 +669,16 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus message.mDisplayName = makeDisplayName(message.mTo, message.mCc, message.mBcc); message.mFlagLoaded = Message.LOADED; message.mFlagAttachment = hasAttachments; + String action = getIntent().getAction(); + // Use the Intent to set flags saying this message is a reply or a forward and save the + // unique id of the source message + if (ACTION_REPLY.equals(action) || ACTION_REPLY_ALL.equals(action)) { + message.mFlags |= Message.FLAG_TYPE_REPLY; + message.mSourceKey = mSource.mId; + } else if (ACTION_FORWARD.equals(action)) { + message.mFlags |= Message.FLAG_TYPE_FORWARD; + message.mSourceKey = mSource.mId; + } } private Attachment[] getAttachmentsFromUI() { diff --git a/src/com/android/email/provider/EmailContent.java b/src/com/android/email/provider/EmailContent.java index 8f622928f..3abd9d1d8 100644 --- a/src/com/android/email/provider/EmailContent.java +++ b/src/com/android/email/provider/EmailContent.java @@ -185,6 +185,8 @@ public abstract class EmailContent { public static final String HTML_REPLY = "htmlReply"; // Replied-to or forwarded body (in text form) public static final String TEXT_REPLY = "textReply"; + // Message id of the source (if this is a reply/forward) + public static final String SOURCE_MESSAGE_KEY = "sourceMessageKey"; } public static final class Body extends EmailContent implements BodyColumns { @@ -198,9 +200,10 @@ public abstract class EmailContent { public static final int CONTENT_TEXT_CONTENT_COLUMN = 3; public static final int CONTENT_HTML_REPLY_COLUMN = 4; public static final int CONTENT_TEXT_REPLY_COLUMN = 5; + public static final int CONTENT_SOURCE_KEY_COLUMN = 6; public static final String[] CONTENT_PROJECTION = new String[] { RECORD_ID, BodyColumns.MESSAGE_KEY, BodyColumns.HTML_CONTENT, BodyColumns.TEXT_CONTENT, - BodyColumns.HTML_REPLY, BodyColumns.TEXT_REPLY + BodyColumns.HTML_REPLY, BodyColumns.TEXT_REPLY, BodyColumns.SOURCE_MESSAGE_KEY }; public static final int TEXT_TEXT_COLUMN = 1; @@ -220,6 +223,7 @@ public abstract class EmailContent { public String mTextContent; public String mHtmlReply; public String mTextReply; + public long mSourceKey; public Body() { mBaseUri = CONTENT_URI; @@ -235,6 +239,7 @@ public abstract class EmailContent { values.put(BodyColumns.TEXT_CONTENT, mTextContent); values.put(BodyColumns.HTML_REPLY, mHtmlReply); values.put(BodyColumns.TEXT_REPLY, mTextReply); + values.put(BodyColumns.SOURCE_MESSAGE_KEY, mSourceKey); return values; } @@ -330,6 +335,7 @@ public abstract class EmailContent { mTextContent = c.getString(CONTENT_TEXT_CONTENT_COLUMN); mHtmlReply = c.getString(CONTENT_HTML_REPLY_COLUMN); mTextReply = c.getString(CONTENT_TEXT_REPLY_COLUMN); + mSourceKey = c.getLong(CONTENT_SOURCE_KEY_COLUMN); return this; } @@ -484,22 +490,33 @@ public abstract class EmailContent { public String mBcc; public String mReplyTo; + // The following transient members may be used while building and manipulating messages, + // but they are NOT persisted directly by EmailProvider transient public String mText; transient public String mHtml; transient public String mTextReply; transient public String mHtmlReply; - - // Can be used while building messages, but is NOT saved by the Provider + transient public long mSourceKey; transient public ArrayList mAttachments = null; + // Values used in mFlagRead public static final int UNREAD = 0; public static final int READ = 1; public static final int DELETED = 2; + // Values used in mFlagLoaded public static final int NOT_LOADED = 0; public static final int LOADED = 1; public static final int PARTIALLY_LOADED = 2; + // Bits used in mFlags + // These three states are mutually exclusive, and indicate whether the message is an + // original, a reply, or a forward + public static final int FLAG_TYPE_ORIGINAL = 0; + public static final int FLAG_TYPE_REPLY = 1<<0; + public static final int FLAG_TYPE_FORWARD = 1<<1; + public static final int FLAG_TYPE_MASK = FLAG_TYPE_REPLY | FLAG_TYPE_FORWARD; + public Message() { mBaseUri = CONTENT_URI; } @@ -665,6 +682,9 @@ public abstract class EmailContent { if (mHtmlReply != null) { cv.put(Body.HTML_REPLY, mHtmlReply); } + if (mSourceKey != 0) { + cv.put(Body.SOURCE_MESSAGE_KEY, mSourceKey); + } b = ContentProviderOperation.newInsert(Body.CONTENT_URI); b.withValues(cv); ContentValues backValues = new ContentValues(); diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index 985dabab7..437abe407 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -56,9 +56,13 @@ public class EmailProvider extends ContentProvider { static final String BODY_DATABASE_NAME = "EmailProviderBody.db"; // Any changes to the database format *must* include update-in-place code. - + // Original version: 3 public static final int DATABASE_VERSION = 3; - public static final int BODY_DATABASE_VERSION = 2; + + // Any changes to the database format *must* include update-in-place code. + // Original version: 2 + // Version 3: Add "sourceKey" column + public static final int BODY_DATABASE_VERSION = 3; public static final String EMAIL_AUTHORITY = "com.android.email.provider"; @@ -480,18 +484,26 @@ public class EmailProvider extends ContentProvider { + BodyColumns.HTML_CONTENT + " text, " + BodyColumns.TEXT_CONTENT + " text, " + BodyColumns.HTML_REPLY + " text, " - + BodyColumns.TEXT_REPLY + " text" + + BodyColumns.TEXT_REPLY + " text, " + + BodyColumns.SOURCE_MESSAGE_KEY + " text" + ");"; db.execSQL("create table " + Body.TABLE_NAME + s); db.execSQL(createIndex(Body.TABLE_NAME, BodyColumns.MESSAGE_KEY)); } static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) { - try { - db.execSQL("drop table " + Body.TABLE_NAME); - } catch (SQLException e) { - } - createBodyTable(db); + if (oldVersion < 2) { + // Versions earlier than 2 require a wipe of the database + try { + db.execSQL("drop table " + Body.TABLE_NAME); + createBodyTable(db); + } catch (SQLException e) { + } + } else if (oldVersion == 2) { + Log.d(TAG, "Upgrading Body from v2 to v3"); + db.execSQL("alter table " + Body.TABLE_NAME + + " add " + Body.SOURCE_MESSAGE_KEY + " integer"); + } } private final int mDatabaseVersion = DATABASE_VERSION; diff --git a/tests/src/com/android/email/provider/ProviderTestUtils.java b/tests/src/com/android/email/provider/ProviderTestUtils.java index e92f8c857..31c6dd355 100644 --- a/tests/src/com/android/email/provider/ProviderTestUtils.java +++ b/tests/src/com/android/email/provider/ProviderTestUtils.java @@ -127,6 +127,7 @@ public class ProviderTestUtils extends Assert { message.mHtml = "body html " + name; message.mTextReply = "reply text " + name; message.mHtmlReply = "reply html " + name; + message.mSourceKey = mailboxId; } if (saveIt) { @@ -269,6 +270,7 @@ public class ProviderTestUtils extends Assert { assertEquals(caller + " mHtml", expect.mHtml, actual.mHtml); assertEquals(caller + " mTextReply", expect.mTextReply, actual.mTextReply); assertEquals(caller + " mHtmlReply", expect.mHtmlReply, actual.mHtmlReply); + assertEquals(caller + " mSourceKey", expect.mSourceKey, actual.mSourceKey); } /** diff --git a/tests/src/com/android/email/provider/ProviderTests.java b/tests/src/com/android/email/provider/ProviderTests.java index c14f6ae97..2ad83c764 100644 --- a/tests/src/com/android/email/provider/ProviderTests.java +++ b/tests/src/com/android/email/provider/ProviderTests.java @@ -203,6 +203,7 @@ public class ProviderTests extends ProviderTestCase2 { message2.mHtml = null; message2.mTextReply = null; message2.mHtmlReply = null; + message2.mSourceKey = 0; Message message2get = EmailContent.Message.restoreMessageWithId(mMockContext, message2Id); ProviderTestUtils.assertMessageEqual("testMessageSave", message2, message2get); @@ -212,6 +213,7 @@ public class ProviderTests extends ProviderTestCase2 { assertEquals("body html", html2, body2.mHtmlContent); assertEquals("reply text", textReply2, body2.mTextReply); assertEquals("reply html", htmlReply2, body2.mHtmlReply); + assertEquals("source key", message2.mMailboxKey, body2.mSourceKey); // Message with attachments and body Message message3 = ProviderTestUtils.setupMessage("message3", account1Id, box1Id, true, @@ -401,6 +403,7 @@ public class ProviderTests extends ProviderTestCase2 { values.put(BodyColumns.HTML_CONTENT, htmlContent); values.put(BodyColumns.TEXT_REPLY, textReply); values.put(BodyColumns.HTML_REPLY, htmlReply); + values.put(BodyColumns.SOURCE_MESSAGE_KEY, 17); // 1 Message message1 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, @@ -415,6 +418,7 @@ public class ProviderTests extends ProviderTestCase2 { assertEquals(body1.mHtmlContent, htmlContent); assertEquals(body1.mTextReply, textReply); assertEquals(body1.mHtmlReply, htmlReply); + assertEquals(body1.mSourceKey, 17); // 2 Message message2 = ProviderTestUtils.setupMessage("message1", account1Id, box1Id, true, @@ -430,6 +434,7 @@ public class ProviderTests extends ProviderTestCase2 { assertEquals(body2.mHtmlContent, htmlContent); assertEquals(body2.mTextReply, textReply); assertEquals(body2.mHtmlReply, htmlReply); + assertEquals(body2.mSourceKey, 17); } /**