Merge "Add lastSeenMessageKey column to the mailbox table"

This commit is contained in:
Todd Kennedy 2011-05-06 15:07:58 -07:00 committed by Android (Google) Code Review
commit ae993bda32
4 changed files with 93 additions and 11 deletions

View File

@ -712,13 +712,8 @@ public abstract class EmailContent {
// 8 general purpose flags (bits) that may be used at the discretion of the sync adapter
public static final int FLAG_SYNC_ADAPTER_SHIFT = 9;
public static final int FLAG_SYNC_ADAPTER_MASK = 255 << FLAG_SYNC_ADAPTER_SHIFT;
/**
* Bit used in mFlags indicating that the outgoing message should *not* include quoted
* original message. ("Not", in order to keep compatibility with old databases)
*/
public static final int FLAG_NOT_INCLUDE_QUOTED_TEXT_SHIFT = 17;
public static final int FLAG_NOT_INCLUDE_QUOTED_TEXT
= 1 << FLAG_NOT_INCLUDE_QUOTED_TEXT_SHIFT;
/** If set, the outgoing message should *not* include the quoted original message. */
public static final int FLAG_NOT_INCLUDE_QUOTED_TEXT = 1 << 17;
public Message() {
mBaseUri = CONTENT_URI;
@ -2240,6 +2235,8 @@ public abstract class EmailContent {
public static final String SYNC_STATUS = "syncStatus";
// Number of messages in the mailbox.
public static final String MESSAGE_COUNT = "messageCount";
// Number of messages in the mailbox.
public static final String LAST_SEEN_MESSAGE_KEY = "lastSeenMessageKey";
}
public static final class Mailbox extends EmailContent implements SyncColumns, MailboxColumns {
@ -2264,6 +2261,7 @@ public abstract class EmailContent {
public int mFlags;
public int mVisibleLimit;
public String mSyncStatus;
public long mLastSeenMessageKey;
public static final int CONTENT_ID_COLUMN = 0;
public static final int CONTENT_DISPLAY_NAME_COLUMN = 1;
@ -2281,6 +2279,8 @@ public abstract class EmailContent {
public static final int CONTENT_VISIBLE_LIMIT_COLUMN = 13;
public static final int CONTENT_SYNC_STATUS_COLUMN = 14;
public static final int CONTENT_PARENT_KEY_COLUMN = 15;
public static final int CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN = 16;
/**
* <em>NOTE</em>: If fields are added or removed, the method {@link #getHashes()}
* MUST be updated.
@ -2291,7 +2291,8 @@ public abstract class EmailContent {
MailboxColumns.DELIMITER, MailboxColumns.SYNC_KEY, MailboxColumns.SYNC_LOOKBACK,
MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_TIME,
MailboxColumns.FLAG_VISIBLE, MailboxColumns.FLAGS, MailboxColumns.VISIBLE_LIMIT,
MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY
MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY,
MailboxColumns.LAST_SEEN_MESSAGE_KEY,
};
private static final String ACCOUNT_AND_MAILBOX_TYPE_SELECTION =
@ -2477,6 +2478,7 @@ public abstract class EmailContent {
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
mVisibleLimit = cursor.getInt(CONTENT_VISIBLE_LIMIT_COLUMN);
mSyncStatus = cursor.getString(CONTENT_SYNC_STATUS_COLUMN);
mLastSeenMessageKey = cursor.getLong(CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN);
}
@Override
@ -2497,6 +2499,7 @@ public abstract class EmailContent {
values.put(MailboxColumns.FLAGS, mFlags);
values.put(MailboxColumns.VISIBLE_LIMIT, mVisibleLimit);
values.put(MailboxColumns.SYNC_STATUS, mSyncStatus);
values.put(MailboxColumns.LAST_SEEN_MESSAGE_KEY, mLastSeenMessageKey);
return values;
}
@ -2671,6 +2674,8 @@ public abstract class EmailContent {
= mSyncStatus;
hash[CONTENT_PARENT_KEY_COLUMN]
= mParentKey;
hash[CONTENT_LAST_SEEN_MESSAGE_KEY_COLUMN]
= mLastSeenMessageKey;
return hash;
}
}

View File

@ -902,6 +902,65 @@ public class Utility {
}
}
/**
* Updates the last seen message key in the mailbox data base for the INBOX of the currently
* shown account. If the account is {@link Account#ACCOUNT_ID_COMBINED_VIEW}, the INBOX for
* all accounts are updated.
*/
public static void updateLastSeenMessageKey(final Context context, final long accountId) {
EmailAsyncTask.runAsyncParallel(new Runnable() {
private void updateLastSeenMessageKeyForAccount(long accountId) {
ContentResolver resolver = context.getContentResolver();
if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
Cursor c = resolver.query(
Account.CONTENT_URI, EmailContent.ID_PROJECTION, null, null, null);
if (c == null) throw new ProviderUnavailableException();
try {
while (c.moveToNext()) {
final long id = c.getLong(EmailContent.ID_PROJECTION_COLUMN);
updateLastSeenMessageKeyForAccount(id);
}
} finally {
c.close();
}
} else {
Mailbox mailbox =
Mailbox.restoreMailboxOfType(context, accountId, Mailbox.TYPE_INBOX);
// mailbox has been removed
if (mailbox == null) {
return;
}
// We use the highest _id for the account the mailbox table as the "last seen
// message key". We don't care if the message has been read or not. We only
// need a point at which we can compare against in the future. By setting this
// value, we are claiming that every message before this has potentially been
// seen by the user.
long messageId = Utility.getFirstRowLong(
context,
Message.CONTENT_URI,
EmailContent.ID_PROJECTION,
MessageColumns.MAILBOX_KEY + "=?",
new String[] { Long.toString(mailbox.mId) },
MessageColumns.ID + " DESC",
EmailContent.ID_PROJECTION_COLUMN, 0L);
ContentValues values = mailbox.toContentValues();
values.put(MailboxColumns.LAST_SEEN_MESSAGE_KEY, messageId);
resolver.update(
Mailbox.CONTENT_URI,
values,
EmailContent.ID_SELECTION,
new String[] { Long.toString(mailbox.mId) });
}
}
@Override
public void run() {
updateLastSeenMessageKeyForAccount(accountId);
}
});
}
public static long[] toPrimitiveLongArray(Collection<Long> collection) {
// Need to do this manually because we're converting to a primitive long array, not
// a Long array.

View File

@ -362,6 +362,7 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
mResumed = false;
super.onPause();
mSavedListState = getListView().onSaveInstanceState();
Utility.updateLastSeenMessageKey(mActivity, mAccountId);
}
/**

View File

@ -130,7 +130,8 @@ public class EmailProvider extends ContentProvider {
// Version 19: Add Policy table; add policyKey to Account table and trigger to delete an
// Account's policy when the Account is deleted
// Version 20: Add new policies to Policy table
public static final int DATABASE_VERSION = 20;
// Version 21: Add lastSeenMessageKey column to Mailbox table
public static final int DATABASE_VERSION = 21;
// Any changes to the database format *must* include update-in-place code.
// Original version: 2
@ -626,7 +627,8 @@ public class EmailProvider extends ContentProvider {
+ MailboxColumns.FLAGS + " integer, "
+ MailboxColumns.VISIBLE_LIMIT + " integer, "
+ MailboxColumns.SYNC_STATUS + " text, "
+ MailboxColumns.MESSAGE_COUNT + " integer not null default 0"
+ MailboxColumns.MESSAGE_COUNT + " integer not null default 0, "
+ MailboxColumns.LAST_SEEN_MESSAGE_KEY + " integer"
+ ");";
db.execSQL("create table " + Mailbox.TABLE_NAME + s);
db.execSQL("create index mailbox_" + MailboxColumns.SERVER_ID
@ -1054,10 +1056,14 @@ public class EmailProvider extends ContentProvider {
" integer;");
} catch (SQLException e) {
// Shouldn't be needed unless we're debugging and interrupt the process
Log.w(TAG, "Exception upgrading EmailProvider.db from 19 to 2 " + e);
Log.w(TAG, "Exception upgrading EmailProvider.db from 19 to 20 " + e);
}
oldVersion = 20;
}
if (oldVersion == 20) {
upgradeFromVersion20ToVersion21(db);
oldVersion = 21;
}
}
@Override
@ -1833,4 +1839,15 @@ public class EmailProvider extends ContentProvider {
Log.w(TAG, "Exception upgrading EmailProvider.db from 17 to 18 " + e);
}
}
/** Upgrades the database from v20 to v21 */
private static void upgradeFromVersion20ToVersion21(SQLiteDatabase db) {
try {
db.execSQL("alter table " + Mailbox.TABLE_NAME
+ " add column " + Mailbox.LAST_SEEN_MESSAGE_KEY + " integer;");
} catch (SQLException e) {
// Shouldn't be needed unless we're debugging and interrupt the process
Log.w(TAG, "Exception upgrading EmailProvider.db from 20 to 21 " + e);
}
}
}