mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-15 06:30:17 -05:00
Keep the sync state of a remote EasFolder in sync with its local counterpart when synchronizing the folder.
This commit is contained in:
parent
474780cbf4
commit
a212965b99
@ -64,7 +64,6 @@ import com.fsck.k9.mail.store.UnavailableStorageException;
|
||||
import com.fsck.k9.mail.store.LocalStore.LocalFolder;
|
||||
import com.fsck.k9.mail.store.LocalStore.LocalMessage;
|
||||
import com.fsck.k9.mail.store.LocalStore.PendingCommand;
|
||||
import com.fsck.k9.mail.store.EasStore.EasFolder;
|
||||
|
||||
|
||||
/**
|
||||
@ -503,28 +502,21 @@ public class MessagingController implements Runnable {
|
||||
private void syncLocalFoldersWithRemoteFolders(List<? extends Folder> localFolders,
|
||||
List<? extends Folder> remoteFolders, final Account account) throws MessagingException {
|
||||
HashSet<String> remoteFolderNames = new HashSet<String>();
|
||||
HashMap<String, Folder> localFolderNames = new HashMap<String, Folder>();
|
||||
HashSet<String> localFolderNames = new HashSet<String>();
|
||||
|
||||
List<LocalFolder> foldersToCreate = new LinkedList<LocalFolder>();
|
||||
LocalStore localStore = account.getLocalStore();
|
||||
|
||||
for (Folder localFolder : localFolders) {
|
||||
localFolderNames.put(localFolder.getRemoteName(), localFolder);
|
||||
localFolderNames.add(localFolder.getRemoteName());
|
||||
}
|
||||
|
||||
// Add any new folders in the remote store to the local store.
|
||||
for (Folder remoteFolder : remoteFolders) {
|
||||
LocalFolder localFolder = (LocalFolder)localFolderNames.get(remoteFolder.getRemoteName());
|
||||
if (localFolder == null) {
|
||||
localFolder = localStore.getFolder(remoteFolder.getRemoteName(),
|
||||
remoteFolder.getName());
|
||||
foldersToCreate.add(localFolder);
|
||||
if (!localFolderNames.contains(remoteFolder.getRemoteName())) {
|
||||
foldersToCreate.add(localStore.getFolder(remoteFolder.getRemoteName(), remoteFolder.getName()));
|
||||
}
|
||||
remoteFolderNames.add(remoteFolder.getRemoteName());
|
||||
|
||||
if (remoteFolder instanceof EasFolder) {
|
||||
((EasFolder)remoteFolder).setLocalFolder(localFolder, false);
|
||||
}
|
||||
}
|
||||
|
||||
localStore.createFolders(foldersToCreate, account.getDisplayCount());
|
||||
@ -849,7 +841,9 @@ public class MessagingController implements Runnable {
|
||||
* TODO Break this method up into smaller chunks.
|
||||
* @param providedRemoteFolder TODO
|
||||
*/
|
||||
private void synchronizeMailboxSynchronous(final Account account, final String folder, final MessagingListener listener, Folder providedRemoteFolder) {
|
||||
private void synchronizeMailboxSynchronous(final Account account, final String folder,
|
||||
final MessagingListener listener, Folder providedRemoteFolder) {
|
||||
Store remoteStore = null;
|
||||
Folder remoteFolder = null;
|
||||
LocalFolder tLocalFolder = null;
|
||||
|
||||
@ -859,6 +853,7 @@ public class MessagingController implements Runnable {
|
||||
for (MessagingListener l : getListeners(listener)) {
|
||||
l.synchronizeMailboxStarted(account, folder);
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't ever sync the Outbox or errors folder
|
||||
*/
|
||||
@ -907,17 +902,17 @@ public class MessagingController implements Runnable {
|
||||
Log.v(K9.LOG_TAG, "SYNC: using providedRemoteFolder " + folder);
|
||||
remoteFolder = providedRemoteFolder;
|
||||
} else {
|
||||
Store remoteStore = account.getRemoteStore();
|
||||
remoteStore = account.getRemoteStore();
|
||||
|
||||
if (K9.DEBUG)
|
||||
Log.v(K9.LOG_TAG, "SYNC: About to get remote folder " + folder);
|
||||
remoteFolder = remoteStore.getFolder(folder);
|
||||
|
||||
remoteFolder = remoteStore.getFolder(folder);
|
||||
if (remoteFolder == null) {
|
||||
throw new Exception("Store returned null remote folder for " + folder);
|
||||
throw new Exception("Attempted to synchronize a local-only folder " + folder);
|
||||
}
|
||||
|
||||
if (! verifyOrCreateRemoteSpecialFolder(account, folder, remoteFolder, listener)) {
|
||||
if (!verifyOrCreateRemoteSpecialFolder(account, folder, remoteFolder, listener)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -951,7 +946,6 @@ public class MessagingController implements Runnable {
|
||||
Log.d(K9.LOG_TAG, "SYNC: Expunging folder " + account.getDescription() + ":" + folder);
|
||||
remoteFolder.expunge();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -975,7 +969,6 @@ public class MessagingController implements Runnable {
|
||||
Log.v(K9.LOG_TAG, "SYNC: Remote message count for folder " + folder + " is " + remoteMessageCount);
|
||||
final Date earliestDate = account.getEarliestPollDate();
|
||||
|
||||
|
||||
if (remoteMessageCount > 0 || syncMode) {
|
||||
/* Message numbers start at 1. */
|
||||
int remoteStart;
|
||||
@ -994,7 +987,6 @@ public class MessagingController implements Runnable {
|
||||
l.synchronizeMailboxHeadersStarted(account, folder);
|
||||
}
|
||||
|
||||
|
||||
remoteMessageArray = remoteFolder.getMessages(remoteStart, remoteEnd, earliestDate, null);
|
||||
|
||||
int messageCount = remoteMessageArray.length;
|
||||
@ -1042,7 +1034,6 @@ public class MessagingController implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
localFolder.destroyMessages(destroyMessages.toArray(EMPTY_MESSAGE_ARRAY));
|
||||
|
||||
for (Message destroyMessage : destroyMessages) {
|
||||
@ -1061,7 +1052,6 @@ public class MessagingController implements Runnable {
|
||||
int unreadMessageCount = setLocalUnreadCountToRemote(localFolder, remoteFolder, newMessages);
|
||||
setLocalFlaggedCountToRemote(localFolder, remoteFolder);
|
||||
|
||||
|
||||
for (MessagingListener l : getListeners()) {
|
||||
l.folderStatusChanged(account, folder, unreadMessageCount);
|
||||
}
|
||||
@ -1079,7 +1069,6 @@ public class MessagingController implements Runnable {
|
||||
l.synchronizeMailboxFinished(account, folder, remoteMessageCount, newMessages);
|
||||
}
|
||||
|
||||
|
||||
if (commandException != null) {
|
||||
String rootMessage = getRootCauseMessage(commandException);
|
||||
Log.e(K9.LOG_TAG, "Root cause failure in " + account.getDescription() + ":" +
|
||||
@ -1115,13 +1104,25 @@ public class MessagingController implements Runnable {
|
||||
Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date());
|
||||
|
||||
} finally {
|
||||
// For certain store types, we need to make sure to keep the push state of the local
|
||||
// and remote folder in sync.
|
||||
if (remoteStore.keepPushStateInSync()) {
|
||||
if (remoteFolder != null && tLocalFolder != null) {
|
||||
try {
|
||||
tLocalFolder.setPushState(remoteFolder.getPushState());
|
||||
}
|
||||
catch (MessagingException e) {
|
||||
Log.e(K9.LOG_TAG, "Unable to update the local push state for folder " + tLocalFolder.getName(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (providedRemoteFolder == null) {
|
||||
closeFolder(remoteFolder);
|
||||
}
|
||||
|
||||
closeFolder(tLocalFolder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -223,4 +223,8 @@ public abstract class Folder {
|
||||
public boolean isSyncMode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getPushState() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -176,6 +176,10 @@ public abstract class Store {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean keepPushStateInSync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void sendMessages(Message[] messages) throws MessagingException {
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,6 @@ import com.fsck.k9.mail.ServerSettings;
|
||||
import com.fsck.k9.mail.Store;
|
||||
import com.fsck.k9.mail.filter.EOLConvertingOutputStream;
|
||||
import com.fsck.k9.mail.internet.MimeMessage;
|
||||
import com.fsck.k9.mail.store.LocalStore.LocalFolder;
|
||||
import com.fsck.k9.mail.store.exchange.Eas;
|
||||
import com.fsck.k9.mail.store.exchange.adapter.EasEmailSyncParser;
|
||||
import com.fsck.k9.mail.store.exchange.adapter.FolderSyncParser;
|
||||
@ -802,6 +801,7 @@ public class EasStore extends Store {
|
||||
throw new MessagingException("io", e);
|
||||
}
|
||||
|
||||
// EASTODO: This needs to preserve the sync key for each folder.
|
||||
synchronized (mFolderList) {
|
||||
mFolderList.clear();
|
||||
for (Folder folder : folderList) {
|
||||
@ -868,7 +868,7 @@ public class EasStore extends Store {
|
||||
|
||||
EasFolder remoteFolder = new EasFolder(folder.getName(), folder.getRemoteName(), type);
|
||||
mFolderList.put(folder.getRemoteName(), remoteFolder);
|
||||
remoteFolder.setLocalFolder((LocalFolder)folder, true);
|
||||
remoteFolder.setSyncKey(folder.getPushState());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -909,6 +909,11 @@ public class EasStore extends Store {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keepPushStateInSync() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMessages(Message[] messages) throws MessagingException {
|
||||
for (int i = 0; i < messages.length; i++) {
|
||||
@ -999,7 +1004,6 @@ public class EasStore extends Store {
|
||||
private int mType;
|
||||
private boolean mIsOpen = false;
|
||||
private String mSyncKey = null;
|
||||
private LocalFolder mLocalFolder = null;
|
||||
|
||||
protected EasStore getStore() {
|
||||
return EasStore.this;
|
||||
@ -1012,16 +1016,6 @@ public class EasStore extends Store {
|
||||
mType = type;
|
||||
}
|
||||
|
||||
public void setLocalFolder(LocalFolder folder, boolean setSyncKey) {
|
||||
mLocalFolder = folder;
|
||||
if (setSyncKey && mLocalFolder != null) {
|
||||
if (mSyncKey != null && !mSyncKey.equals(INITIAL_SYNC_KEY)) {
|
||||
Log.d(K9.LOG_TAG, "Overriding non-default SyncKey: " + mSyncKey);
|
||||
}
|
||||
mSyncKey = mLocalFolder.getPushState();
|
||||
}
|
||||
}
|
||||
|
||||
public String getSyncKey() throws MessagingException {
|
||||
if (mSyncKey == null) {
|
||||
Log.d(K9.LOG_TAG, "Reset SyncKey to 0");
|
||||
@ -1032,9 +1026,6 @@ public class EasStore extends Store {
|
||||
|
||||
public void setSyncKey(String key) throws MessagingException {
|
||||
mSyncKey = key;
|
||||
if (mLocalFolder != null) {
|
||||
mLocalFolder.setPushState(mSyncKey);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1451,9 +1442,14 @@ public class EasStore extends Store {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNewPushState(String oldPushState, Message message) {
|
||||
public String getPushState() {
|
||||
return mSyncKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNewPushState(String oldPushState, Message message) {
|
||||
return getPushState();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1419,9 +1419,11 @@ public class LocalStore extends Store implements Serializable {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPushState() {
|
||||
return mPushState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FolderClass getDisplayClass() {
|
||||
return mDisplayClass;
|
||||
|
Loading…
Reference in New Issue
Block a user