Merge "Improve mailbox sync and load more." into jb-ub-mail-ur9

This commit is contained in:
Yu Ping Hu 2013-04-11 21:18:47 +00:00 committed by Android (Google) Code Review
commit 7dd26feaea
13 changed files with 147 additions and 150 deletions

View File

@ -1609,10 +1609,12 @@ public abstract class EmailContent {
// Other states, as a bit field, e.g. CHILDREN_VISIBLE, HAS_CHILDREN
public static final String FLAGS = "flags";
// Backward compatible
@Deprecated
public static final String VISIBLE_LIMIT = "visibleLimit";
// Sync status (can be used as desired by sync services)
public static final String SYNC_STATUS = "syncStatus";
// Number of messages in the mailbox.
@Deprecated
public static final String MESSAGE_COUNT = "messageCount";
// The last time a message in this mailbox has been read (in millis)
public static final String LAST_TOUCHED_TIME = "lastTouchedTime";

View File

@ -29,17 +29,18 @@ import android.util.Log;
import com.android.emailcommon.Logging;
import com.android.emailcommon.R;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.SyncColumns;
import com.android.emailcommon.utility.Utility;
public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns, Parcelable {
public class Mailbox extends EmailContent implements MailboxColumns, Parcelable {
public static final String TABLE_NAME = "Mailbox";
public static Uri CONTENT_URI;
public static Uri MESSAGE_COUNT_URI;
public static Uri FROM_ACCOUNT_AND_TYPE_URI;
public static void initMailbox() {
CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/mailbox");
MESSAGE_COUNT_URI = Uri.parse(EmailContent.CONTENT_URI + "/mailboxCount");
FROM_ACCOUNT_AND_TYPE_URI = Uri.parse(EmailContent.CONTENT_URI +
"/mailboxIdFromAccountAndType");
}
@ -57,7 +58,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public long mSyncTime;
public boolean mFlagVisible = true;
public int mFlags;
public int mVisibleLimit;
public String mSyncStatus;
public long mLastTouchedTime;
public int mUiSyncStatus;
@ -78,14 +78,13 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public static final int CONTENT_SYNC_TIME_COLUMN = 10;
public static final int CONTENT_FLAG_VISIBLE_COLUMN = 11;
public static final int CONTENT_FLAGS_COLUMN = 12;
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_TOUCHED_TIME_COLUMN = 16;
public static final int CONTENT_UI_SYNC_STATUS_COLUMN = 17;
public static final int CONTENT_UI_LAST_SYNC_RESULT_COLUMN = 18;
public static final int CONTENT_TOTAL_COUNT_COLUMN = 19;
public static final int CONTENT_HIERARCHICAL_NAME_COLUMN = 20;
public static final int CONTENT_SYNC_STATUS_COLUMN = 13;
public static final int CONTENT_PARENT_KEY_COLUMN = 14;
public static final int CONTENT_LAST_TOUCHED_TIME_COLUMN = 15;
public static final int CONTENT_UI_SYNC_STATUS_COLUMN = 16;
public static final int CONTENT_UI_LAST_SYNC_RESULT_COLUMN = 17;
public static final int CONTENT_TOTAL_COUNT_COLUMN = 18;
public static final int CONTENT_HIERARCHICAL_NAME_COLUMN = 19;
/**
* <em>NOTE</em>: If fields are added or removed, the method {@link #getHashes()}
@ -95,31 +94,17 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
RECORD_ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.SERVER_ID,
MailboxColumns.PARENT_SERVER_ID, MailboxColumns.ACCOUNT_KEY, MailboxColumns.TYPE,
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.LAST_TOUCHED_TIME,
MailboxColumns.UI_SYNC_STATUS, MailboxColumns.UI_LAST_SYNC_RESULT,
MailboxColumns.TOTAL_COUNT, MailboxColumns.HIERARCHICAL_NAME
MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_TIME, MailboxColumns.FLAG_VISIBLE,
MailboxColumns.FLAGS, MailboxColumns.SYNC_STATUS, MailboxColumns.PARENT_KEY,
MailboxColumns.LAST_TOUCHED_TIME, MailboxColumns.UI_SYNC_STATUS,
MailboxColumns.UI_LAST_SYNC_RESULT, MailboxColumns.TOTAL_COUNT,
MailboxColumns.HIERARCHICAL_NAME
};
private static final String ACCOUNT_AND_MAILBOX_TYPE_SELECTION =
MailboxColumns.ACCOUNT_KEY + " =? AND " +
MailboxColumns.TYPE + " =?";
private static final String MAILBOX_TYPE_SELECTION =
MailboxColumns.TYPE + " =?";
/** Selection by server pathname for a given account */
public static final String PATH_AND_ACCOUNT_SELECTION =
MailboxColumns.SERVER_ID + "=? and " + MailboxColumns.ACCOUNT_KEY + "=?";
private static final String[] MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION = new String [] {
"sum(" + MailboxColumns.UNREAD_COUNT + ")"
};
private static final int UNREAD_COUNT_COUNT_COLUMN = 0;
private static final String[] MAILBOX_SUM_OF_MESSAGE_COUNT_PROJECTION = new String [] {
"sum(" + MailboxColumns.MESSAGE_COUNT + ")"
};
private static final int MESSAGE_COUNT_COUNT_COLUMN = 0;
private static final String[] MAILBOX_TYPE_PROJECTION = new String [] {
MailboxColumns.TYPE
};
@ -228,6 +213,11 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
public static final long QUERY_ALL_DRAFTS = -5;
public static final long QUERY_ALL_OUTBOX = -6;
/**
* Specifies how many messages will be shown in a folder when it is first synced.
*/
public static final int FIRST_SYNC_MESSAGE_COUNT = 25;
public Mailbox() {
mBaseUri = CONTENT_URI;
}
@ -380,7 +370,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
mSyncTime = cursor.getLong(CONTENT_SYNC_TIME_COLUMN);
mFlagVisible = cursor.getInt(CONTENT_FLAG_VISIBLE_COLUMN) == 1;
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
mVisibleLimit = cursor.getInt(CONTENT_VISIBLE_LIMIT_COLUMN);
mSyncStatus = cursor.getString(CONTENT_SYNC_STATUS_COLUMN);
mLastTouchedTime = cursor.getLong(CONTENT_LAST_TOUCHED_TIME_COLUMN);
mUiSyncStatus = cursor.getInt(CONTENT_UI_SYNC_STATUS_COLUMN);
@ -405,7 +394,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
values.put(MailboxColumns.SYNC_TIME, mSyncTime);
values.put(MailboxColumns.FLAG_VISIBLE, mFlagVisible);
values.put(MailboxColumns.FLAGS, mFlags);
values.put(MailboxColumns.VISIBLE_LIMIT, mVisibleLimit);
values.put(MailboxColumns.SYNC_STATUS, mSyncStatus);
values.put(MailboxColumns.LAST_TOUCHED_TIME, mLastTouchedTime);
values.put(MailboxColumns.UI_SYNC_STATUS, mUiSyncStatus);
@ -415,6 +403,44 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
return values;
}
/**
* During sync, updates the remote message count, and determine how many messages to sync down
* for this mailbox.
* @param c
* @param remoteMessageCount the current message count on the server; this might be different
* from this object's current message count (in which case it will be written back to the db).
* @param deltaMessageCount the minimum number of additional messages to sync for this request.
* @return
*/
public int handleCountsForSync(Context c, final int remoteMessageCount,
final int deltaMessageCount) {
// Write the remote message count to the DB if necessary.
if (remoteMessageCount != mTotalCount) {
ContentValues values = new ContentValues();
values.put(MailboxColumns.TOTAL_COUNT, remoteMessageCount);
update(c, values);
}
// TODO: The value computed below is not quite right if the messages we have are not
// actually a subset of the server side messages, but it's close enough?
final int currentMessageCount = getMailboxMessageCount(c, mId);
// Determine how many "new" messages we have. If we've never synced before, then use a
// default value, otherwise it's the actual change in remote count.
final int newMessageCount;
if (mSyncTime == 0) {
newMessageCount = FIRST_SYNC_MESSAGE_COUNT;
} else {
newMessageCount = Math.max(0, remoteMessageCount - mTotalCount);
}
// Determine the desired number of messages to sync.
final int messageCount = currentMessageCount + Math.max(newMessageCount, deltaMessageCount);
// Limit to [0, remoteMessageCount].
return Math.min(Math.max(0, messageCount), remoteMessageCount);
}
/**
* Convenience method to return the id of a given type of Mailbox for a given Account; the
* common Mailbox types (Inbox, Outbox, Sent, Drafts, Trash, and Search) are all cached by
@ -461,29 +487,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
return null;
}
public static int getUnreadCountByAccountAndMailboxType(Context context, long accountId,
int type) {
return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION,
ACCOUNT_AND_MAILBOX_TYPE_SELECTION,
new String[] { String.valueOf(accountId), String.valueOf(type) },
null, UNREAD_COUNT_COUNT_COLUMN, 0);
}
public static int getUnreadCountByMailboxType(Context context, int type) {
return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
MAILBOX_SUM_OF_UNREAD_COUNT_PROJECTION,
MAILBOX_TYPE_SELECTION,
new String[] { String.valueOf(type) }, null, UNREAD_COUNT_COUNT_COLUMN, 0);
}
public static int getMessageCountByMailboxType(Context context, int type) {
return Utility.getFirstRowInt(context, Mailbox.CONTENT_URI,
MAILBOX_SUM_OF_MESSAGE_COUNT_PROJECTION,
MAILBOX_TYPE_SELECTION,
new String[] { String.valueOf(type) }, null, MESSAGE_COUNT_COUNT_COLUMN, 0);
}
/**
* Return the mailbox for a message with a given id
* @param context the caller's context
@ -517,6 +520,21 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
null, null, null, MAILBOX_DISPLAY_NAME_COLUMN);
}
public static int getMailboxMessageCount(Context c, long mailboxId) {
Cursor cursor = c.getContentResolver().query(
ContentUris.withAppendedId(MESSAGE_COUNT_URI, mailboxId), null, null, null, null);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
return cursor.getInt(0);
}
} finally {
cursor.close();
}
}
return 0;
}
/**
* @param mailboxId ID of a mailbox. This method accepts magic mailbox IDs, such as
* {@link #QUERY_ALL_INBOXES}. (They're all non-refreshable.)
@ -589,8 +607,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
= mFlagVisible;
hash[CONTENT_FLAGS_COLUMN]
= mFlags;
hash[CONTENT_VISIBLE_LIMIT_COLUMN]
= mVisibleLimit;
hash[CONTENT_SYNC_STATUS_COLUMN]
= mSyncStatus;
hash[CONTENT_PARENT_KEY_COLUMN]
@ -632,7 +648,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
dest.writeLong(mSyncTime);
dest.writeInt(mFlagVisible ? 1 : 0);
dest.writeInt(mFlags);
dest.writeInt(mVisibleLimit);
dest.writeString(mSyncStatus);
dest.writeLong(mLastTouchedTime);
dest.writeInt(mUiSyncStatus);
@ -657,7 +672,6 @@ public class Mailbox extends EmailContent implements SyncColumns, MailboxColumns
mSyncTime = in.readLong();
mFlagVisible = in.readInt() == 1;
mFlags = in.readInt();
mVisibleLimit = in.readInt();
mSyncStatus = in.readString();
mLastTouchedTime = in.readLong();
mUiSyncStatus = in.readInt();

View File

@ -157,14 +157,16 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
*
* @param mailboxId the id of the mailbox record
* @param userRequest whether or not the user specifically asked for the sync
* @param deltaMessageCount amount by which to change the number of messages synced.
*/
@Override
public void startSync(final long mailboxId, final boolean userRequest) throws RemoteException {
public void startSync(final long mailboxId, final boolean userRequest,
final int deltaMessageCount) throws RemoteException {
setTask(new ProxyTask() {
@Override
public void run() throws RemoteException {
if (mCallback != null) mService.setCallback(mCallback);
mService.startSync(mailboxId, userRequest);
mService.startSync(mailboxId, userRequest, deltaMessageCount);
}
}, "startSync");
}

View File

@ -26,9 +26,10 @@ import android.os.Bundle;
interface IEmailService {
Bundle validate(in HostAuth hostauth);
oneway void startSync(long mailboxId, boolean userRequest);
oneway void startSync(long mailboxId, boolean userRequest, int deltaMessageCount);
oneway void stopSync(long mailboxId);
// TODO: loadMore appears to be unused; if so, delete it.
oneway void loadMore(long messageId);
oneway void loadAttachment(long attachmentId, boolean background);

View File

@ -198,6 +198,5 @@ public abstract class Store {
//mailbox.mSyncTime;
mailbox.mType = type;
//box.mUnreadCount;
mailbox.mVisibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
}
}

View File

@ -110,8 +110,6 @@ public class Pop3Store extends Store {
if (mailbox == null) {
mailbox = Mailbox.newSystemMailbox(mContext, mAccount.mId, Mailbox.TYPE_INBOX);
}
// TODO: Mailbox.newSystemMailbox should be aware of these default values for inbox?
mailbox.mVisibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
if (mailbox.isSaved()) {
mailbox.update(mContext, mailbox.toContentValues());
} else {

View File

@ -192,6 +192,7 @@ public class EmailProvider extends ContentProvider {
private static final int MAILBOX_ID_FROM_ACCOUNT_AND_TYPE = MAILBOX_BASE + 2;
private static final int MAILBOX_NOTIFICATION = MAILBOX_BASE + 3;
private static final int MAILBOX_MOST_RECENT_MESSAGE = MAILBOX_BASE + 4;
private static final int MAILBOX_MESSAGE_COUNT = MAILBOX_BASE + 5;
private static final int MESSAGE_BASE = 0x2000;
private static final int MESSAGE = MESSAGE_BASE;
@ -1086,6 +1087,7 @@ public class EmailProvider extends ContentProvider {
MAILBOX_NOTIFICATION);
matcher.addURI(EmailContent.AUTHORITY, "mailboxMostRecentMessage/#",
MAILBOX_MOST_RECENT_MESSAGE);
matcher.addURI(EmailContent.AUTHORITY, "mailboxCount/#", MAILBOX_MESSAGE_COUNT);
// All messages
matcher.addURI(EmailContent.AUTHORITY, "message", MESSAGE);
@ -1303,7 +1305,7 @@ public class EmailProvider extends ContentProvider {
c = uiFolderLoadMore(uri);
return c;
case UI_FOLDER_REFRESH:
c = uiFolderRefresh(uri);
c = uiFolderRefresh(uri, 0);
return c;
case MAILBOX_NOTIFICATION:
c = notificationQuery(uri);
@ -1311,6 +1313,9 @@ public class EmailProvider extends ContentProvider {
case MAILBOX_MOST_RECENT_MESSAGE:
c = mostRecentMessageQuery(uri);
return c;
case MAILBOX_MESSAGE_COUNT:
c = getMailboxMessageCount(uri);
return c;
case ACCOUNT_DEFAULT_ID:
// Start with a snapshot of the cache
Map<String, Cursor> accountCache = mCacheAccount.getSnapshot();
@ -2064,7 +2069,14 @@ outer:
String mailboxId = uri.getLastPathSegment();
return db.rawQuery("select max(_id) from Message where mailboxKey=?",
new String[] {mailboxId});
}
}
private Cursor getMailboxMessageCount(Uri uri) {
SQLiteDatabase db = getDatabase(getContext());
String mailboxId = uri.getLastPathSegment();
return db.rawQuery("select count(*) from Message where mailboxKey=?",
new String[] {mailboxId});
}
/**
* Support for UnifiedEmail below
@ -3755,7 +3767,7 @@ outer:
final EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
mServiceCallback, mailbox.mAccountKey);
try {
service.startSync(mailbox.mId, true);
service.startSync(mailbox.mId, true, 0);
} catch (RemoteException e) {
}
final long originalMsgId = msg.mSourceKey;
@ -4342,7 +4354,7 @@ outer:
}
};
private Cursor uiFolderRefresh(Uri uri) {
private Cursor uiFolderRefresh(Uri uri, int deltaMessageCount) {
Context context = getContext();
String idString = uri.getLastPathSegment();
long id = Long.parseLong(idString);
@ -4351,7 +4363,7 @@ outer:
EmailServiceProxy service = EmailServiceUtils.getServiceForAccount(context,
mServiceCallback, mailbox.mAccountKey);
try {
service.startSync(id, true);
service.startSync(id, true, deltaMessageCount);
} catch (RemoteException e) {
}
return null;
@ -4373,21 +4385,7 @@ outer:
mSearchParams.mOffset += SEARCH_MORE_INCREMENT;
runSearchQuery(context, mailbox.mAccountKey, id);
} else {
// Compute the new visibleLimit for this mailbox.
int newLimit = mailbox.mVisibleLimit + VISIBLE_LIMIT_INCREMENT;
if (newLimit > mailbox.mTotalCount) {
newLimit = mailbox.mTotalCount;
}
// Only do something if the limit is changing.
if (newLimit != mailbox.mVisibleLimit) {
// Save the new limit to the db.
ContentValues values = new ContentValues();
values.put(MailboxColumns.VISIBLE_LIMIT, newLimit);
context.getContentResolver().update(ContentUris.withAppendedId(Mailbox.CONTENT_URI,
id), values, null, null);
// And order a refresh
uiFolderRefresh(uri);
}
uiFolderRefresh(uri, VISIBLE_LIMIT_INCREMENT);
}
return null;
}

View File

@ -79,6 +79,7 @@ public abstract class EmailServiceStub extends IEmailService.Stub implements IEm
private static final int MAILBOX_COLUMN_TYPE = 2;
public static final String SYNC_EXTRA_MAILBOX_ID = "__mailboxId__";
public static final String SYNC_EXTRA_DELTA_MESSAGE_COUNT = "__deltaMessageCount__";
/** System folders that should always exist. */
private final int[] DEFAULT_FOLDERS = {
@ -111,7 +112,8 @@ public abstract class EmailServiceStub extends IEmailService.Stub implements IEm
}
@Override
public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
public void startSync(long mailboxId, boolean userRequest, int deltaMessageCount)
throws RemoteException {
Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, mailboxId);
if (mailbox == null) return;
Account account = Account.restoreAccountWithId(mContext, mailbox.mAccountKey);
@ -126,6 +128,9 @@ public abstract class EmailServiceStub extends IEmailService.Stub implements IEm
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
}
extras.putLong(SYNC_EXTRA_MAILBOX_ID, mailboxId);
if (deltaMessageCount != 0) {
extras.putInt(SYNC_EXTRA_DELTA_MESSAGE_COUNT, deltaMessageCount);
}
ContentResolver.requestSync(acct, EmailContent.AUTHORITY, extras);
}
@ -420,7 +425,7 @@ public abstract class EmailServiceStub extends IEmailService.Stub implements IEm
}
// If we just created the inbox, sync it
if (inboxId != -1) {
startSync(inboxId, true);
startSync(inboxId, true, 0);
}
}
}

View File

@ -58,7 +58,6 @@ import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
import com.android.emailcommon.service.SyncWindow;
import com.android.mail.utils.LogUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.xmlpull.v1.XmlPullParserException;
@ -597,7 +596,8 @@ public class EmailServiceUtils {
}
@Override
public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
public void startSync(long mailboxId, boolean userRequest, int deltaMessageCount)
throws RemoteException {
}
@Override

View File

@ -165,10 +165,11 @@ public class ImapService extends Service {
* TODO this should use ID's instead of fully-restored objects
* @param account
* @param folder
* @param deltaMessageCount requested change in number of messages to sync
* @throws MessagingException
*/
public static void synchronizeMailboxSynchronous(Context context, final Account account,
final Mailbox folder) throws MessagingException {
final Mailbox folder, final int deltaMessageCount) throws MessagingException {
sendMailboxStatus(folder, EmailServiceStatus.IN_PROGRESS);
TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
@ -178,7 +179,7 @@ public class ImapService extends Service {
NotificationController nc = NotificationController.getInstance(context);
try {
processPendingActionsSynchronous(context, account);
synchronizeMailboxGeneric(context, account, folder);
synchronizeMailboxGeneric(context, account, folder, deltaMessageCount);
// Clear authentication notification for this account
nc.cancelLoginFailedNotification(account.mId);
sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
@ -335,12 +336,12 @@ public class ImapService extends Service {
*
* @param account the account to sync
* @param mailbox the mailbox to sync
* @param deltaMessageCount requested change in number of messages to sync
* @return results of the sync pass
* @throws MessagingException
*/
private static void synchronizeMailboxGeneric(final Context context,
final Account account, final Mailbox mailbox) throws MessagingException {
private static void synchronizeMailboxGeneric(final Context context, final Account account,
final Mailbox mailbox, final int deltaMessageCount) throws MessagingException {
/*
* A list of IDs for messages that were downloaded and did not have the seen flag set.
* This serves as the "true" new message count reported to the user via notification.
@ -414,25 +415,12 @@ public class ImapService extends Service {
// 4. Trash any remote messages that are marked as trashed locally.
// TODO - this comment was here, but no code was here.
ContentValues values = new ContentValues();
// 5. Get the number of messages on the server.
final int remoteMessageCount = remoteFolder.getMessageCount();
// 5. Get the remote message count.
int remoteMessageCount = remoteFolder.getMessageCount();
values.put(MailboxColumns.TOTAL_COUNT, remoteMessageCount);
// 6. Determine the limit # of messages to download
int visibleLimit = mailbox.mVisibleLimit;
if (visibleLimit <= 0) {
visibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
}
if (visibleLimit > remoteMessageCount) {
visibleLimit = remoteMessageCount;
}
if (visibleLimit != mailbox.mVisibleLimit) {
values.put(MailboxColumns.VISIBLE_LIMIT, visibleLimit);
}
mailbox.update(context, values);
// 6. Update the total count and determine new message count to sync.
final int messageCount = mailbox.handleCountsForSync(context, remoteMessageCount,
deltaMessageCount);
// 7. Create a list of messages to download
Message[] remoteMessages = new Message[0];
@ -443,7 +431,7 @@ public class ImapService extends Service {
/*
* Message numbers start at 1.
*/
int remoteStart = Math.max(0, remoteMessageCount - visibleLimit) + 1;
int remoteStart = Math.max(0, remoteMessageCount - messageCount) + 1;
int remoteEnd = remoteMessageCount;
remoteMessages = remoteFolder.getMessages(remoteStart, remoteEnd, null);
// TODO Why are we running through the list twice? Combine w/ for loop below
@ -616,7 +604,7 @@ public class ImapService extends Service {
protocolSearchInfo.equals(mLastSearchServerId)) {
return mLastSearchRemoteMailbox;
}
Cursor c = context.getContentResolver().query(Mailbox.CONTENT_URI,
Cursor c = context.getContentResolver().query(Mailbox.CONTENT_URI,
Mailbox.CONTENT_PROJECTION, Mailbox.PATH_AND_ACCOUNT_SELECTION,
new String[] {protocolSearchInfo, Long.toString(accountKey)},
null);

View File

@ -103,7 +103,7 @@ public class Pop3Service extends Service {
long inboxId = Mailbox.findMailboxOfType(mContext, att.mAccountKey, Mailbox.TYPE_INBOX);
if (inboxId == Mailbox.NO_MAILBOX) return;
// We load attachments during a sync
startSync(inboxId, true);
startSync(inboxId, true, 0);
}
@Override
@ -129,10 +129,11 @@ public class Pop3Service extends Service {
*
* @param account
* @param folder
* @param deltaMessageCount the requested change in number of messages to sync.
* @throws MessagingException
*/
public static void synchronizeMailboxSynchronous(Context context, final Account account,
final Mailbox folder) throws MessagingException {
final Mailbox folder, final int deltaMessageCount) throws MessagingException {
sendMailboxStatus(folder, EmailServiceStatus.IN_PROGRESS);
TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(context, account));
@ -141,7 +142,7 @@ public class Pop3Service extends Service {
}
NotificationController nc = NotificationController.getInstance(context);
try {
synchronizePop3Mailbox(context, account, folder);
synchronizePop3Mailbox(context, account, folder, deltaMessageCount);
// Clear authentication notification for this account
nc.cancelLoginFailedNotification(account.mId);
sendMailboxStatus(folder, EmailServiceStatus.SUCCESS);
@ -243,10 +244,11 @@ public class Pop3Service extends Service {
*
* @param account the account to sync
* @param mailbox the mailbox to sync
* @param deltaMessageCount the requested change to number of messages to sync
* @throws MessagingException
*/
private static void synchronizePop3Mailbox(final Context context,
final Account account, final Mailbox mailbox) throws MessagingException {
private static void synchronizePop3Mailbox(final Context context, final Account account,
final Mailbox mailbox, final int deltaMessageCount) throws MessagingException {
// TODO Break this into smaller pieces
ContentResolver resolver = context.getContentResolver();
@ -293,12 +295,6 @@ public class Pop3Service extends Service {
// count.
remoteFolder.open(OpenMode.READ_WRITE);
// Get the remote message count.
int remoteMessageCount = remoteFolder.getMessageCount();
ContentValues values = new ContentValues();
values.put(MailboxColumns.TOTAL_COUNT, remoteMessageCount);
mailbox.update(context, values);
String[] accountIdArgs = new String[] { Long.toString(account.mId) };
long trashMailboxId = Mailbox.findMailboxOfType(context, account.mId, Mailbox.TYPE_TRASH);
Cursor updates = resolver.query(
@ -328,11 +324,12 @@ public class Pop3Service extends Service {
updates.close();
}
// Determine the limit # of messages to download
int visibleLimit = mailbox.mVisibleLimit;
if (visibleLimit <= 0) {
visibleLimit = MailActivityEmail.VISIBLE_LIMIT_DEFAULT;
}
// Get the remote message count.
final int remoteMessageCount = remoteFolder.getMessageCount();
// Update the total count and determine new message count to sync.
final int messageCount = mailbox.handleCountsForSync(context, remoteMessageCount,
deltaMessageCount);
// Create a list of messages to download
Pop3Message[] remoteMessages = new Pop3Message[0];
@ -343,7 +340,7 @@ public class Pop3Service extends Service {
/*
* Message numbers start at 1.
*/
remoteMessages = remoteFolder.getMessages(remoteMessageCount, visibleLimit);
remoteMessages = remoteFolder.getMessages(remoteMessageCount, messageCount);
/*
* Get a list of the messages that are in the remote list but not on
@ -378,7 +375,7 @@ public class Pop3Service extends Service {
AttachmentColumns.UI_STATE + "=" + AttachmentState.DOWNLOADING,
new String[] {Long.toString(account.mId)}, null);
try {
values.clear();
final ContentValues values = new ContentValues();
while (c.moveToNext()) {
values.put(AttachmentColumns.UI_STATE, UIProvider.AttachmentState.SAVED);
Attachment att = new Attachment();

View File

@ -109,7 +109,7 @@ public class PopImapSyncAdapterService extends Service {
}
private static void sync(Context context, long mailboxId, SyncResult syncResult,
boolean uiRefresh) {
boolean uiRefresh, int deltaMessageCount) {
TempDirectory.setTempDirectory(context);
Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
if (mailbox == null) return;
@ -139,9 +139,11 @@ public class PopImapSyncAdapterService extends Service {
if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
EmailServiceStub.sendMailImpl(context, account.mId);
} else if (protocol.equals(legacyImapProtocol)) {
ImapService.synchronizeMailboxSynchronous(context, account, mailbox);
ImapService.synchronizeMailboxSynchronous(context, account, mailbox,
deltaMessageCount);
} else {
Pop3Service.synchronizeMailboxSynchronous(context, account, mailbox);
Pop3Service.synchronizeMailboxSynchronous(context, account, mailbox,
deltaMessageCount);
}
} catch (MessagingException e) {
int cause = e.getExceptionType();
@ -155,8 +157,9 @@ public class PopImapSyncAdapterService extends Service {
}
}
} finally {
// Always clear our sync state
// Always clear our sync state and update sync time.
values.put(Mailbox.UI_SYNC_STATUS, EmailContent.SYNC_STATUS_NONE);
values.put(Mailbox.SYNC_TIME, System.currentTimeMillis());
resolver.update(mailboxUri, values, null, null);
}
}
@ -200,7 +203,7 @@ public class PopImapSyncAdapterService extends Service {
}
}
for (long mailboxId: mailboxesToUpdate) {
sync(context, mailboxId, syncResult, false);
sync(context, mailboxId, syncResult, false, 0);
}
} else {
Log.d(TAG, "Sync request for " + acct.mDisplayName);
@ -222,7 +225,9 @@ public class PopImapSyncAdapterService extends Service {
if (mailboxId == Mailbox.NO_MAILBOX) return;
boolean uiRefresh =
extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
sync(context, mailboxId, syncResult, uiRefresh);
int deltaMessageCount =
extras.getInt(EmailServiceStub.SYNC_EXTRA_DELTA_MESSAGE_COUNT, 0);
sync(context, mailboxId, syncResult, uiRefresh, deltaMessageCount);
// Outbox is a special case here
Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);

View File

@ -78,18 +78,6 @@ public class MailActivityEmail extends com.android.mail.ui.MailActivity {
*/
public static boolean sDebugInhibitGraphicsAcceleration = false;
/**
* Specifies how many messages will be shown in a folder by default. This number is set
* on each new folder and can be incremented with "Load more messages..." by the
* VISIBLE_LIMIT_INCREMENT
*/
public static final int VISIBLE_LIMIT_DEFAULT = 25;
/**
* Number of additional messages to load when a user selects "Load more messages..."
*/
public static final int VISIBLE_LIMIT_INCREMENT = 25;
/**
* This is used to force stacked UI to return to the "welcome" screen any time we change
* the accounts list (e.g. deleting accounts in the Account Manager preferences.)