From 125c7066fff771a4244fb52758edfc269783a9ed Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 2 Dec 2020 16:58:32 +0100 Subject: [PATCH] Force sync old messages --- app/src/main/java/eu/faircode/email/Core.java | 6 ++++-- app/src/main/java/eu/faircode/email/DaoOperation.java | 3 +++ app/src/main/java/eu/faircode/email/EntityFolder.java | 3 ++- .../main/java/eu/faircode/email/EntityOperation.java | 11 +++++++++-- .../java/eu/faircode/email/ServiceSynchronize.java | 7 +++++-- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index e2a08136f6..062a098ef5 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2167,13 +2167,14 @@ class Core { // Legacy if (jargs.length() == 0) - jargs = folder.getSyncArgs(); + jargs = folder.getSyncArgs(false); int sync_days = jargs.getInt(0); int keep_days = jargs.getInt(1); boolean download = jargs.optBoolean(2, false); boolean auto_delete = jargs.optBoolean(3, false); int initialize = jargs.optInt(4, folder.initialize); + boolean force = jargs.optBoolean(5, false); if (keep_days == sync_days && keep_days != Integer.MAX_VALUE) keep_days++; @@ -2186,6 +2187,7 @@ class Core { boolean delete_unseen = prefs.getBoolean("delete_unseen", false); Log.i(folder.name + " start sync after=" + sync_days + "/" + keep_days + + " force=" + force + " sync unseen=" + sync_unseen + " flagged=" + sync_flagged + " delete unseen=" + delete_unseen + " kept=" + sync_kept); @@ -2248,7 +2250,7 @@ class Core { } // Get list of local uids - final List uids = db.message().getUids(folder.id, sync_kept ? null : sync_time); + final List uids = db.message().getUids(folder.id, sync_kept || force ? null : sync_time); Log.i(folder.name + " local count=" + uids.size()); // Reduce list of local uids diff --git a/app/src/main/java/eu/faircode/email/DaoOperation.java b/app/src/main/java/eu/faircode/email/DaoOperation.java index dd8da3c5e6..63f13d533f 100644 --- a/app/src/main/java/eu/faircode/email/DaoOperation.java +++ b/app/src/main/java/eu/faircode/email/DaoOperation.java @@ -143,4 +143,7 @@ public interface DaoOperation { @Query("DELETE FROM operation WHERE id = :id") int deleteOperation(long id); + + @Query("DELETE FROM operation WHERE folder = :folder AND name = :name") + int deleteOperation(long folder, String name); } diff --git a/app/src/main/java/eu/faircode/email/EntityFolder.java b/app/src/main/java/eu/faircode/email/EntityFolder.java index 6cb2b6c727..374688ee2c 100644 --- a/app/src/main/java/eu/faircode/email/EntityFolder.java +++ b/app/src/main/java/eu/faircode/email/EntityFolder.java @@ -284,7 +284,7 @@ public class EntityFolder extends EntityOrder implements Serializable { return "notification.folder." + id; } - JSONArray getSyncArgs() { + JSONArray getSyncArgs(boolean force) { int days = sync_days; if (last_sync != null) { int ago_days = (int) ((new Date().getTime() - last_sync) / (24 * 3600 * 1000L)) + 1; @@ -298,6 +298,7 @@ public class EntityFolder extends EntityOrder implements Serializable { jargs.put(download); jargs.put(auto_delete); jargs.put(initialize); + jargs.put(force); return jargs; } diff --git a/app/src/main/java/eu/faircode/email/EntityOperation.java b/app/src/main/java/eu/faircode/email/EntityOperation.java index b8e500a120..9bd56f5750 100644 --- a/app/src/main/java/eu/faircode/email/EntityOperation.java +++ b/app/src/main/java/eu/faircode/email/EntityOperation.java @@ -387,20 +387,27 @@ public class EntityOperation { } static void sync(Context context, long fid, boolean foreground) { + sync(context, fid, foreground, false); + } + + static void sync(Context context, long fid, boolean foreground, boolean force) { DB db = DB.getInstance(context); EntityFolder folder = db.folder().getFolder(fid); if (folder == null) return; + if (force) + db.operation().deleteOperation(fid, SYNC); + // TODO: replace sync parameters? - if (db.operation().getOperationCount(fid, EntityOperation.SYNC) == 0) { + if (db.operation().getOperationCount(fid, SYNC) == 0) { EntityOperation operation = new EntityOperation(); operation.account = folder.account; operation.folder = folder.id; operation.message = null; operation.name = SYNC; - operation.args = folder.getSyncArgs().toString(); + operation.args = folder.getSyncArgs(force).toString(); operation.created = new Date().getTime(); operation.id = db.operation().insertOperation(operation); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 13b16ab374..f9037a4c9d 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -919,6 +919,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences try { wlAccount.acquire(); + boolean forced = false; final DB db = DB.getInstance(this); long thread = Thread.currentThread().getId(); @@ -1123,7 +1124,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences // Update folder list if (account.protocol == EntityAccount.TYPE_IMAP) - Core.onSynchronizeFolders(this, account, iservice.getStore(), state, force); + Core.onSynchronizeFolders(this, account, iservice.getStore(), state, force && !forced); // Open synchronizing folders List folders = db.folder().getFolders(account.id, false, true); @@ -1312,7 +1313,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences idlers.add(idler); if (sync && folder.selectable) - EntityOperation.sync(this, folder.id, false); + EntityOperation.sync(this, folder.id, false, force && !forced); if (capNotify && EntityFolder.INBOX.equals(folder.type)) ifolder.doCommand(new IMAPFolder.ProtocolCommand() { @@ -1357,6 +1358,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } + forced = true; + Log.i(account.name + " observing operations"); getMainHandler().post(new Runnable() { @Override