mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-15 06:30:17 -05:00
Update retrieveMessageDeltas to properly handle multiple deltas for the same message.
This commit is contained in:
parent
e0436b13d0
commit
ba39628af9
@ -1163,7 +1163,7 @@ public class MessagingController implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HashSet<String> deletedMessages = new HashSet<String>();
|
HashSet<String> deletedMessages = new HashSet<String>();
|
||||||
HashSet<String> outOfOrderMessages = new HashSet<String>();
|
HashMap<String, Message> newMessages = new HashMap<String, Message>();
|
||||||
|
|
||||||
final Date earliestDate = account.getEarliestPollDate();
|
final Date earliestDate = account.getEarliestPollDate();
|
||||||
|
|
||||||
@ -1178,22 +1178,27 @@ public class MessagingController implements Runnable {
|
|||||||
Message localMessage = localUidMap.get(remoteMessage.getUid());
|
Message localMessage = localUidMap.get(remoteMessage.getUid());
|
||||||
if (localMessage == null && !remoteMessage.isSet(Flag.DELETED)) {
|
if (localMessage == null && !remoteMessage.isSet(Flag.DELETED)) {
|
||||||
if (remoteMessage.isSet(Flag.X_DELTA_ONLY)) {
|
if (remoteMessage.isSet(Flag.X_DELTA_ONLY)) {
|
||||||
// We got a message delta for a message we don't have in our local store?
|
Message message = newMessages.get(remoteMessage.getUid());
|
||||||
// Perhaps the messages list is out of order?
|
if (message != null) {
|
||||||
outOfOrderMessages.add(remoteMessage.getUid());
|
message.setFlags(remoteMessage.getFlags(), true);
|
||||||
if (K9.DEBUG) {
|
} else if (K9.DEBUG) {
|
||||||
Log.v(K9.LOG_TAG, "Received a message delta for a message not currently in the local store, discarded");
|
Log.v(K9.LOG_TAG, "Received a message delta for an unknown message, discarded");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We don't have the message locally, add it to the store.
|
// We don't have the message locally, add it to the store.
|
||||||
remoteMessages.add(remoteMessage);
|
remoteMessages.add(remoteMessage);
|
||||||
if (K9.DEBUG && outOfOrderMessages.contains(remoteMessage.getUid())) {
|
// Also add it to a hash map for quick retrieval.
|
||||||
Log.v(K9.LOG_TAG, "Processed a full remote message after processing a delta for the same message");
|
newMessages.put(remoteMessage.getUid(), remoteMessage);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (remoteMessage.isSet(Flag.DELETED)) {
|
} else if (remoteMessage.isSet(Flag.DELETED)) {
|
||||||
// The remote message was deleted, mark it to be deleted locally.
|
Message message = newMessages.get(remoteMessage.getUid());
|
||||||
deletedMessages.add(remoteMessage.getUid());
|
if (message != null) {
|
||||||
|
// The message is both new and deleted, just remove it from the remote messages list.
|
||||||
|
remoteMessages.remove(message);
|
||||||
|
} else {
|
||||||
|
// The remote message was deleted, mark it to be deleted locally.
|
||||||
|
deletedMessages.add(remoteMessage.getUid());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// We already have the message locally, just add any new flags that have been set.
|
// We already have the message locally, just add any new flags that have been set.
|
||||||
localMessage.setFlags(remoteMessage.getFlags(), true);
|
localMessage.setFlags(remoteMessage.getFlags(), true);
|
||||||
|
Loading…
Reference in New Issue
Block a user