Convert Mailbox syncInterval column to boolean.

We are no longer doing per-mailbox sync intervals; instead,
mailboxes opt in to syncing, and the account sync interval
controls what happens.

Change-Id: I8ae32ea25079abbb63bb6a6a282bf5c06de73fca
This commit is contained in:
Yu Ping Hu 2013-06-20 17:11:01 -07:00
parent 6f2beeb59a
commit a54ee609cd
3 changed files with 52 additions and 3 deletions

View File

@ -17,6 +17,7 @@
package com.android.emailcommon.provider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
@ -128,7 +129,9 @@ public class Mailbox extends EmailContent implements MailboxColumns, Parcelable
public static final long NO_MAILBOX = -1;
// Sentinel values for the mSyncInterval field of both Mailbox records
@Deprecated
public static final int CHECK_INTERVAL_NEVER = -1;
@Deprecated
public static final int CHECK_INTERVAL_PUSH = -2;
// The following two sentinel values are used by EAS
// Ping indicates that the EAS mailbox is synced based on a "ping" from the server
@ -151,6 +154,15 @@ public class Mailbox extends EmailContent implements MailboxColumns, Parcelable
MailboxColumns.TYPE + "<" + Mailbox.TYPE_NOT_EMAIL +
" AND " + MailboxColumns.FLAG_VISIBLE + "=1";
/** Selection for all mailboxes that explicitly say they want to sync for an account. */
private static final String SYNCING_AND_ACCOUNT_SELECTION =
MailboxColumns.SYNC_INTERVAL + "=1 and " + MailboxColumns.ACCOUNT_KEY + "=?";
/** Selection for mailboxes that say they want to sync, plus outbox, for an account. */
private static final String OUTBOX_PLUS_SYNCING_AND_ACCOUNT_SELECTION = "("
+ MailboxColumns.TYPE + "=" + Mailbox.TYPE_OUTBOX + " or "
+ MailboxColumns.SYNC_INTERVAL + "=1) and " + MailboxColumns.ACCOUNT_KEY + "=?";
// Types of mailboxes. The list is ordered to match a typical UI presentation, e.g.
// placing the inbox at the top.
// Arrays of "special_mailbox_display_names" and "special_mailbox_icons" are depends on
@ -691,4 +703,27 @@ public class Mailbox extends EmailContent implements MailboxColumns, Parcelable
public String toString() {
return "[Mailbox " + mId + ": " + mDisplayName + "]";
}
/**
* Get the mailboxes that want to receive push updates for an account.
* @param cr The {@link ContentResolver}.
* @param accountId The id for the account that is pushing.
* @return A cursor (suitable for use with {@link #restore}) with all mailboxes we should sync.
*/
public static Cursor getMailboxesForPush(final ContentResolver cr, final long accountId) {
return cr.query(Mailbox.CONTENT_URI, Mailbox.CONTENT_PROJECTION,
SYNCING_AND_ACCOUNT_SELECTION, new String[] { Long.toString(accountId) }, null);
}
/**
* Get the mailbox ids for an account that should sync when we do a full account sync.
* @param cr The {@link ContentResolver}.
* @param accountId The id for the account that is pushing.
* @return A cursor (with one column, containing ids) with all mailbox ids we should sync.
*/
public static Cursor getMailboxIdsForSync(final ContentResolver cr, final long accountId) {
return cr.query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
OUTBOX_PLUS_SYNCING_AND_ACCOUNT_SELECTION,
new String[] { Long.toString(accountId) }, null);
}
}

View File

@ -143,8 +143,10 @@ public final class DBHelper {
// Version 110: Stop updating message_count, don't use auto lookback, and don't use
// ping/push_hold sync states.
// Version 111: Delete Exchange account mailboxes.
// Version 112: Convert Mailbox syncInterval to a boolean (whether or not this mailbox
// syncs along with the account).
public static final int DATABASE_VERSION = 111;
public static final int DATABASE_VERSION = 112;
// Any changes to the database format *must* include update-in-place code.
// Original version: 2
@ -1047,8 +1049,18 @@ public final class DBHelper {
oldVersion = 110;
}
if (oldVersion == 110) {
// Delete account mailboxes.
db.execSQL("delete from " + Mailbox.TABLE_NAME + " where " + MailboxColumns.TYPE
+ "=" +Mailbox.TYPE_EAS_ACCOUNT_MAILBOX);
oldVersion = 111;
}
if (oldVersion == 111) {
// Mailbox sync interval now indicates whether this mailbox syncs with the rest
// of the account. Anyone who was syncing at all, plus outboxes, are set to 1,
// everyone else is 0.
db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_INTERVAL
+ "=case when " + MailboxColumns.SYNC_INTERVAL + "="
+ Mailbox.CHECK_INTERVAL_NEVER + " then 0 else 1 end");
}
}

View File

@ -3208,7 +3208,9 @@ public class EmailProvider extends ContentProvider {
new String[] {String.valueOf(mailbox.mId)});
// For non-push mailboxes, if it's stale (i.e. last sync was a while
// ago), force a sync.
if (mailbox.mSyncInterval > Mailbox.CHECK_INTERVAL_PUSH) {
// TODO: Fix the check for whether we're non-push? Right now it checks
// whether we are participating in account sync rules.
if (mailbox.mSyncInterval == 0) {
final long timeSinceLastSync =
System.currentTimeMillis() - mailbox.mSyncTime;
if (timeSinceLastSync > AUTO_REFRESH_INTERVAL_MS) {
@ -4350,7 +4352,7 @@ public class EmailProvider extends ContentProvider {
m.mServerId = SEARCH_MAILBOX_SERVER_ID;
m.mFlagVisible = false;
m.mDisplayName = SEARCH_MAILBOX_SERVER_ID;
m.mSyncInterval = Mailbox.CHECK_INTERVAL_NEVER;
m.mSyncInterval = 0;
m.mType = Mailbox.TYPE_SEARCH;
m.mFlags = Mailbox.FLAG_HOLDS_MAIL;
m.mParentKey = Mailbox.NO_MAILBOX;