mirror of https://github.com/M66B/FairEmail.git
Improved ADD
This commit is contained in:
parent
1535af0027
commit
30de1b0ad5
|
@ -269,6 +269,9 @@ public interface DaoMessage {
|
||||||
@Update
|
@Update
|
||||||
int updateMessage(EntityMessage message);
|
int updateMessage(EntityMessage message);
|
||||||
|
|
||||||
|
@Query("UPDATE message SET uid = :uid WHERE id = :id")
|
||||||
|
int setMessageUid(long id, long uid);
|
||||||
|
|
||||||
@Query("UPDATE message SET seen = :seen WHERE id = :id")
|
@Query("UPDATE message SET seen = :seen WHERE id = :id")
|
||||||
int setMessageSeen(long id, boolean seen);
|
int setMessageSeen(long id, boolean seen);
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ import android.util.LongSparseArray;
|
||||||
|
|
||||||
import com.sun.mail.iap.ConnectionException;
|
import com.sun.mail.iap.ConnectionException;
|
||||||
import com.sun.mail.iap.Response;
|
import com.sun.mail.iap.Response;
|
||||||
|
import com.sun.mail.imap.AppendUID;
|
||||||
import com.sun.mail.imap.IMAPFolder;
|
import com.sun.mail.imap.IMAPFolder;
|
||||||
import com.sun.mail.imap.IMAPMessage;
|
import com.sun.mail.imap.IMAPMessage;
|
||||||
import com.sun.mail.imap.IMAPStore;
|
import com.sun.mail.imap.IMAPStore;
|
||||||
|
@ -1051,7 +1052,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
DB db = DB.getInstance(ServiceSynchronize.this);
|
DB db = DB.getInstance(ServiceSynchronize.this);
|
||||||
int count = db.message().deleteMessage(folder.id, uid);
|
int count = db.message().deleteMessage(folder.id, uid);
|
||||||
|
|
||||||
Log.i("Deleted uid=" + uid + " count=" + count);
|
Log.i(folder.name + " deleted uid=" + uid + " count=" + count);
|
||||||
} catch (MessageRemovedException ex) {
|
} catch (MessageRemovedException ex) {
|
||||||
Log.w(folder.name, ex);
|
Log.w(folder.name, ex);
|
||||||
}
|
}
|
||||||
|
@ -1481,7 +1482,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
doKeyword(folder, ifolder, message, jargs, db);
|
doKeyword(folder, ifolder, message, jargs, db);
|
||||||
|
|
||||||
else if (EntityOperation.ADD.equals(op.name))
|
else if (EntityOperation.ADD.equals(op.name))
|
||||||
doAdd(folder, isession, ifolder, message, jargs, db);
|
doAdd(folder, isession, istore, ifolder, message, jargs, db);
|
||||||
|
|
||||||
else if (EntityOperation.MOVE.equals(op.name))
|
else if (EntityOperation.MOVE.equals(op.name))
|
||||||
doMove(folder, isession, istore, ifolder, message, jargs, db);
|
doMove(folder, isession, istore, ifolder, message, jargs, db);
|
||||||
|
@ -1680,9 +1681,11 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doAdd(EntityFolder folder, Session isession, IMAPFolder ifolder, EntityMessage message, JSONArray jargs, DB db) throws MessagingException, JSONException, IOException {
|
private void doAdd(EntityFolder folder, Session isession, IMAPStore istore, IMAPFolder ifolder, EntityMessage message, JSONArray jargs, DB db) throws MessagingException, JSONException, IOException {
|
||||||
|
// Get message
|
||||||
MimeMessage imessage;
|
MimeMessage imessage;
|
||||||
if (folder.id.equals(message.folder)) {
|
if (folder.id.equals(message.folder)) {
|
||||||
|
// Pre flight checks
|
||||||
if (!message.content)
|
if (!message.content)
|
||||||
throw new IllegalArgumentException("Message body missing");
|
throw new IllegalArgumentException("Message body missing");
|
||||||
|
|
||||||
|
@ -1709,6 +1712,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle auto read
|
||||||
boolean autoread = false;
|
boolean autoread = false;
|
||||||
if (jargs.length() > 1) {
|
if (jargs.length() > 1) {
|
||||||
autoread = jargs.getBoolean(1);
|
autoread = jargs.getBoolean(1);
|
||||||
|
@ -1718,15 +1722,55 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle draft
|
||||||
if (EntityFolder.DRAFTS.equals(folder.type)) {
|
if (EntityFolder.DRAFTS.equals(folder.type)) {
|
||||||
if (ifolder.getPermanentFlags().contains(Flags.Flag.DRAFT))
|
if (ifolder.getPermanentFlags().contains(Flags.Flag.DRAFT))
|
||||||
imessage.setFlag(Flags.Flag.DRAFT, true);
|
imessage.setFlag(Flags.Flag.DRAFT, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add message
|
||||||
|
if (istore.hasCapability("UIDPLUS")) {
|
||||||
|
Log.i(folder.name + " append uid id=" + message.id);
|
||||||
|
AppendUID[] uids = ifolder.appendUIDMessages(new Message[]{imessage});
|
||||||
|
if (uids == null || uids.length == 0)
|
||||||
|
throw new MessageRemovedException("Message not appended");
|
||||||
|
Log.i(folder.name + " appended uid=" + uids[0].uid);
|
||||||
|
db.message().setMessageUid(message.id, uids[0].uid);
|
||||||
|
} else {
|
||||||
|
Log.i(folder.name + " append id=" + message.id);
|
||||||
ifolder.appendMessages(new Message[]{imessage});
|
ifolder.appendMessages(new Message[]{imessage});
|
||||||
|
|
||||||
|
Log.i(folder.name + " lookup id=" + message.id);
|
||||||
|
long uid = -1;
|
||||||
|
Message[] iappended = ifolder.search(new MessageIDTerm(message.msgid));
|
||||||
|
if (iappended != null)
|
||||||
|
for (Message m : iappended) {
|
||||||
|
long auid = ifolder.getUID(m);
|
||||||
|
Log.i(folder.name + " " + message.msgid + " uid=" + auid);
|
||||||
|
if ((message.uid == null || auid != message.uid) && auid > uid)
|
||||||
|
uid = auid;
|
||||||
|
}
|
||||||
|
if (uid < 0)
|
||||||
|
throw new MessageRemovedException("Message not found back");
|
||||||
|
|
||||||
|
Log.i(folder.name + " lookup id=" + message.id + " uid=" + uid);
|
||||||
|
db.message().setMessageUid(message.id, uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folder.id.equals(message.folder)) {
|
||||||
|
// Delete previous message
|
||||||
|
if (message.uid != null) {
|
||||||
|
Message iprevious = ifolder.getMessageByUID(message.uid);
|
||||||
|
if (iprevious == null)
|
||||||
|
Log.e(folder.name + " previous uid=" + message.uid + " not found");
|
||||||
|
else {
|
||||||
|
Log.i(folder.name + " deleting uid=" + message.uid);
|
||||||
|
iprevious.setFlag(Flags.Flag.DELETED, true);
|
||||||
|
ifolder.expunge();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// Cross account move
|
// Cross account move
|
||||||
if (!folder.id.equals(message.folder)) {
|
|
||||||
if (autoread) {
|
if (autoread) {
|
||||||
Log.i(folder.name + " queuing SEEN id=" + message.id);
|
Log.i(folder.name + " queuing SEEN id=" + message.id);
|
||||||
EntityOperation.queue(this, db, message, EntityOperation.SEEN, true);
|
EntityOperation.queue(this, db, message, EntityOperation.SEEN, true);
|
||||||
|
@ -2493,7 +2537,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
|
|
||||||
if (dup.folder.equals(folder.id)) {
|
if (dup.folder.equals(folder.id)) {
|
||||||
String thread = helper.getThreadId(uid);
|
String thread = helper.getThreadId(uid);
|
||||||
Log.i(folder.name + " found as id=" + dup.id + "/" +
|
Log.i(folder.name + " found as id=" + dup.id +
|
||||||
" uid=" + dup.uid + "/" + uid +
|
" uid=" + dup.uid + "/" + uid +
|
||||||
" msgid=" + msgid + " thread=" + thread);
|
" msgid=" + msgid + " thread=" + thread);
|
||||||
dup.folder = folder.id; // outbox to sent
|
dup.folder = folder.id; // outbox to sent
|
||||||
|
@ -2503,19 +2547,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
dup.uid = uid;
|
dup.uid = uid;
|
||||||
filter = true;
|
filter = true;
|
||||||
} else if (dup.uid != uid) {
|
} else if (dup.uid != uid) {
|
||||||
if (EntityFolder.DRAFTS.equals(folder.type)) {
|
|
||||||
Log.i(folder.name + " deleting previous uid=" + dup.uid);
|
|
||||||
Message iprev = ifolder.getMessageByUID(dup.uid);
|
|
||||||
if (iprev == null)
|
|
||||||
Log.w(folder.name + " previous not found uid=" + dup.uid);
|
|
||||||
else {
|
|
||||||
iprev.setFlag(Flags.Flag.DELETED, true);
|
|
||||||
ifolder.expunge();
|
|
||||||
}
|
|
||||||
Log.i(folder.name + " set uid=" + uid);
|
|
||||||
} else // Draft in Gmail archive
|
|
||||||
Log.e(folder.name + " changed uid=" + dup.uid + "/" + uid);
|
Log.e(folder.name + " changed uid=" + dup.uid + "/" + uid);
|
||||||
|
|
||||||
dup.uid = uid;
|
dup.uid = uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue