diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index e4d4b7ea0f..7961e726c7 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -114,6 +114,7 @@ import javax.mail.search.SearchTerm; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; import static androidx.core.app.NotificationCompat.DEFAULT_LIGHTS; import static androidx.core.app.NotificationCompat.DEFAULT_SOUND; +import static javax.mail.Folder.READ_WRITE; class Core { private static final int MAX_NOTIFICATION_COUNT = 100; // per group @@ -251,11 +252,11 @@ class Core { break; case EntityOperation.MOVE: - onMove(context, jargs, false, folder, message, (IMAPStore) istore, (IMAPFolder) ifolder); + onMove(context, jargs, false, folder, message, (IMAPStore) istore, (IMAPFolder) ifolder, state); break; case EntityOperation.COPY: - onMove(context, jargs, true, folder, message, (IMAPStore) istore, (IMAPFolder) ifolder); + onMove(context, jargs, true, folder, message, (IMAPStore) istore, (IMAPFolder) ifolder, state); break; case EntityOperation.FETCH: @@ -649,7 +650,7 @@ class Core { } } - private static void onMove(Context context, JSONArray jargs, boolean copy, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder) throws JSONException, MessagingException, IOException { + private static void onMove(Context context, JSONArray jargs, boolean copy, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder, State state) throws JSONException, MessagingException, IOException { // Move message DB db = DB.getInstance(context); @@ -669,6 +670,7 @@ class Core { throw new FolderNotFoundException(); IMAPFolder itarget = (IMAPFolder) istore.getFolder(target.name); + // Some providers do not support copying drafts if (EntityFolder.DRAFTS.equals(folder.type) || EntityFolder.DRAFTS.equals(target.type)) { Log.i(folder.name + " move from " + folder.type + " to " + target.type); @@ -718,6 +720,23 @@ class Core { ifolder.expunge(); } + // Fetch appended/copied + try { + itarget.open(READ_WRITE); + try { + Long uid = findUid(itarget, message.msgid, false); + if (uid != null) { + JSONArray fargs = new JSONArray(); + fargs.put(uid); + onFetch(context, fargs, target, itarget, state); + } + } finally { + itarget.close(); + } + } catch (Throwable ex) { + Log.w(ex); + } + // Delete junk contacts if (EntityFolder.JUNK.equals(target.type)) { Address[] recipients = (message.reply != null ? message.reply : message.from); diff --git a/app/src/main/java/eu/faircode/email/EntityOperation.java b/app/src/main/java/eu/faircode/email/EntityOperation.java index 82124e3f18..87af83b53e 100644 --- a/app/src/main/java/eu/faircode/email/EntityOperation.java +++ b/app/src/main/java/eu/faircode/email/EntityOperation.java @@ -21,6 +21,7 @@ package eu.faircode.email; import android.content.Context; import android.content.SharedPreferences; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; @@ -164,8 +165,7 @@ public class EntityOperation { // Create copy without uid in target folder // Message with same msgid can be in archive if (message.uid != null && - target.synchronize && - message.received > cal_keep.getTimeInMillis() && + !TextUtils.isEmpty(message.msgid) && db.message().countMessageByMsgId(target.id, message.msgid) == 0) { File msource = message.getFile(context);