am 6807fd1d
: Merge branch \'readonly-p4-donut\' into donut
Merge commit '6807fd1d478b48843c5d0698dc59e33bf3f1d3b0' * commit '6807fd1d478b48843c5d0698dc59e33bf3f1d3b0': AI 149059: Manually merge CL 148988 to fix "Not to revert SEEN flag if POP, and
This commit is contained in:
commit
4bb7783beb
@ -528,8 +528,12 @@ public class MessagingController implements Runnable {
|
|||||||
localFolder.open(OpenMode.READ_WRITE, null);
|
localFolder.open(OpenMode.READ_WRITE, null);
|
||||||
Message[] localMessages = localFolder.getMessages(null);
|
Message[] localMessages = localFolder.getMessages(null);
|
||||||
HashMap<String, Message> localUidMap = new HashMap<String, Message>();
|
HashMap<String, Message> localUidMap = new HashMap<String, Message>();
|
||||||
|
int localUnreadCount = 0;
|
||||||
for (Message message : localMessages) {
|
for (Message message : localMessages) {
|
||||||
localUidMap.put(message.getUid(), message);
|
localUidMap.put(message.getUid(), message);
|
||||||
|
if (!message.isSet(Flag.SEEN)) {
|
||||||
|
localUnreadCount++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Store remoteStore = Store.getInstance(account.getStoreUri(), mContext,
|
Store remoteStore = Store.getInstance(account.getStoreUri(), mContext,
|
||||||
@ -597,6 +601,7 @@ public class MessagingController implements Runnable {
|
|||||||
final ArrayList<Message> unsyncedMessages = new ArrayList<Message>();
|
final ArrayList<Message> unsyncedMessages = new ArrayList<Message>();
|
||||||
HashMap<String, Message> remoteUidMap = new HashMap<String, Message>();
|
HashMap<String, Message> remoteUidMap = new HashMap<String, Message>();
|
||||||
|
|
||||||
|
int newMessageCount = 0;
|
||||||
if (remoteMessageCount > 0) {
|
if (remoteMessageCount > 0) {
|
||||||
/*
|
/*
|
||||||
* Message numbers start at 1.
|
* Message numbers start at 1.
|
||||||
@ -615,6 +620,9 @@ public class MessagingController implements Runnable {
|
|||||||
*/
|
*/
|
||||||
for (Message message : remoteMessages) {
|
for (Message message : remoteMessages) {
|
||||||
Message localMessage = localUidMap.get(message.getUid());
|
Message localMessage = localUidMap.get(message.getUid());
|
||||||
|
if (localMessage == null) {
|
||||||
|
newMessageCount++;
|
||||||
|
}
|
||||||
if (localMessage == null ||
|
if (localMessage == null ||
|
||||||
(!localMessage.isSet(Flag.X_DOWNLOADED_FULL) &&
|
(!localMessage.isSet(Flag.X_DOWNLOADED_FULL) &&
|
||||||
!localMessage.isSet(Flag.X_DOWNLOADED_PARTIAL))) {
|
!localMessage.isSet(Flag.X_DOWNLOADED_PARTIAL))) {
|
||||||
@ -694,12 +702,19 @@ public class MessagingController implements Runnable {
|
|||||||
FetchProfile fp = new FetchProfile();
|
FetchProfile fp = new FetchProfile();
|
||||||
fp.add(FetchProfile.Item.FLAGS);
|
fp.add(FetchProfile.Item.FLAGS);
|
||||||
remoteFolder.fetch(remoteMessages, fp, null);
|
remoteFolder.fetch(remoteMessages, fp, null);
|
||||||
|
boolean remoteSupportsSeenFlag = false;
|
||||||
|
for (Flag flag : remoteFolder.getPermanentFlags()) {
|
||||||
|
if (flag == Flag.SEEN) {
|
||||||
|
remoteSupportsSeenFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
for (Message remoteMessage : remoteMessages) {
|
for (Message remoteMessage : remoteMessages) {
|
||||||
Message localMessage = localFolder.getMessage(remoteMessage.getUid());
|
Message localMessage = localFolder.getMessage(remoteMessage.getUid());
|
||||||
if (localMessage == null) {
|
if (localMessage == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (remoteMessage.isSet(Flag.SEEN) != localMessage.isSet(Flag.SEEN)) {
|
if (remoteMessage.isSet(Flag.SEEN) != localMessage.isSet(Flag.SEEN)
|
||||||
|
&& remoteSupportsSeenFlag) {
|
||||||
localMessage.setFlag(Flag.SEEN, remoteMessage.isSet(Flag.SEEN));
|
localMessage.setFlag(Flag.SEEN, remoteMessage.isSet(Flag.SEEN));
|
||||||
synchronized (mListeners) {
|
synchronized (mListeners) {
|
||||||
for (MessagingListener l : mListeners) {
|
for (MessagingListener l : mListeners) {
|
||||||
@ -714,10 +729,30 @@ public class MessagingController implements Runnable {
|
|||||||
*/
|
*/
|
||||||
int remoteUnreadMessageCount = remoteFolder.getUnreadMessageCount();
|
int remoteUnreadMessageCount = remoteFolder.getUnreadMessageCount();
|
||||||
if (remoteUnreadMessageCount == -1) {
|
if (remoteUnreadMessageCount == -1) {
|
||||||
|
if (remoteSupportsSeenFlag) {
|
||||||
|
/*
|
||||||
|
* If remote folder doesn't supported unread message count but supports
|
||||||
|
* seen flag, use local folder's unread message count and the size of
|
||||||
|
* new messages.
|
||||||
|
* This mode is actually not used but for non-POP3, non-IMAP.
|
||||||
|
*/
|
||||||
localFolder.setUnreadMessageCount(localFolder.getUnreadMessageCount()
|
localFolder.setUnreadMessageCount(localFolder.getUnreadMessageCount()
|
||||||
+ newMessages.size());
|
+ newMessages.size());
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* If remote folder doesn't supported unread message count and doesn't
|
||||||
|
* support seen flag, use localUnreadCount and newMessageCount which
|
||||||
|
* don't rely on remote SEEN flag.
|
||||||
|
* This mode is used by POP3.
|
||||||
|
*/
|
||||||
|
localFolder.setUnreadMessageCount(localUnreadCount + newMessageCount);
|
||||||
}
|
}
|
||||||
else {
|
} else {
|
||||||
|
/*
|
||||||
|
* If remote folder supports unread message count,
|
||||||
|
* use remoteUnreadMessageCount.
|
||||||
|
* This mode is used by IMAP.
|
||||||
|
*/
|
||||||
localFolder.setUnreadMessageCount(remoteUnreadMessageCount);
|
localFolder.setUnreadMessageCount(remoteUnreadMessageCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.email.mail.store;
|
package com.android.email.mail.store;
|
||||||
|
|
||||||
|
import com.android.email.mail.Flag;
|
||||||
import com.android.email.mail.Folder;
|
import com.android.email.mail.Folder;
|
||||||
import com.android.email.mail.MessagingException;
|
import com.android.email.mail.MessagingException;
|
||||||
import com.android.email.mail.Transport;
|
import com.android.email.mail.Transport;
|
||||||
@ -113,9 +114,21 @@ public class ImapStoreUnitTests extends AndroidTestCase {
|
|||||||
/**
|
/**
|
||||||
* TODO: Test the operation of checkSettings()
|
* TODO: Test the operation of checkSettings()
|
||||||
* TODO: Test small Store & Folder functions that manage folders & namespace
|
* TODO: Test small Store & Folder functions that manage folders & namespace
|
||||||
* TODO: Test small Folder functions that don't really do anything in Imap (if any)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test small Folder functions that don't really do anything in Imap
|
||||||
|
* TODO: Test all of the small Folder functions.
|
||||||
|
*/
|
||||||
|
public void testSmallFolderFunctions() throws MessagingException {
|
||||||
|
// getPermanentFlags() returns { Flag.DELETED, Flag.SEEN }
|
||||||
|
Flag[] flags = mFolder.getPermanentFlags();
|
||||||
|
assertEquals(2, flags.length);
|
||||||
|
// TODO: Write flags into hashset and compare them to a hashset and compare them
|
||||||
|
assertEquals(Flag.DELETED, flags[0]);
|
||||||
|
assertEquals(Flag.SEEN, flags[1]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lightweight test to confirm that IMAP hasn't implemented any folder roles yet.
|
* Lightweight test to confirm that IMAP hasn't implemented any folder roles yet.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user