Check send messages with exists operation

pull/162/head
M66B 5 years ago
parent 2f62dc21f1
commit cfb11a0cb6

@ -325,6 +325,7 @@ The low priority status bar notification shows the number of pending operations,
* *sync*: synchronize local and remote messages * *sync*: synchronize local and remote messages
* *subscribe*: subscribe to remote folder * *subscribe*: subscribe to remote folder
* *send*: send message * *send*: send message
* *exists*: check if message exists
Operations are processed only when there is a connection to the email server or when manually synchronizing. Operations are processed only when there is a connection to the email server or when manually synchronizing.
See also [this FAQ](#user-content-faq16). See also [this FAQ](#user-content-faq16).

@ -115,6 +115,7 @@ class Core {
private static int lastUnseen = -1; private static int lastUnseen = -1;
private static final int MAX_NOTIFICATION_COUNT = 100; // per group private static final int MAX_NOTIFICATION_COUNT = 100; // per group
private static final long AFTER_SEND_DELAY = 10 * 1000L; // milliseconds
private static final int SYNC_CHUNCK_SIZE = 200; private static final int SYNC_CHUNCK_SIZE = 200;
private static final int SYNC_BATCH_SIZE = 20; private static final int SYNC_BATCH_SIZE = 20;
private static final int DOWNLOAD_BATCH_SIZE = 20; private static final int DOWNLOAD_BATCH_SIZE = 20;
@ -221,7 +222,7 @@ class Core {
break; break;
case EntityOperation.HEADERS: case EntityOperation.HEADERS:
onHeaders(context, folder, message, (IMAPFolder) ifolder); onHeaders(context, jargs, folder, message, (IMAPFolder) ifolder);
break; break;
case EntityOperation.RAW: case EntityOperation.RAW:
@ -229,13 +230,17 @@ class Core {
break; break;
case EntityOperation.BODY: case EntityOperation.BODY:
onBody(context, folder, message, (IMAPFolder) ifolder); onBody(context, jargs, folder, message, (IMAPFolder) ifolder);
break; break;
case EntityOperation.ATTACHMENT: case EntityOperation.ATTACHMENT:
onAttachment(context, jargs, folder, message, op, (IMAPFolder) ifolder); onAttachment(context, jargs, folder, message, op, (IMAPFolder) ifolder);
break; break;
case EntityOperation.EXISTS:
onExists(context, jargs, folder, message, op, (IMAPFolder) ifolder);
break;
case EntityOperation.SYNC: case EntityOperation.SYNC:
onSynchronizeMessages(context, jargs, account, folder, (IMAPFolder) ifolder, state); onSynchronizeMessages(context, jargs, account, folder, (IMAPFolder) ifolder, state);
break; break;
@ -322,6 +327,8 @@ class Core {
return; return;
if (EntityOperation.ADD.equals(op.name)) if (EntityOperation.ADD.equals(op.name))
return; return;
if (EntityOperation.EXISTS.equals(op.name))
return;
if (EntityOperation.DELETE.equals(op.name) && !TextUtils.isEmpty(message.msgid)) if (EntityOperation.DELETE.equals(op.name) && !TextUtils.isEmpty(message.msgid))
return; return;
@ -461,7 +468,7 @@ class Core {
} }
} }
private static void onAdd(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder) throws MessagingException, JSONException, IOException { private static void onAdd(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPStore istore, IMAPFolder ifolder) throws MessagingException, IOException {
// Add message // Add message
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
@ -736,7 +743,7 @@ class Core {
} }
} }
private static void onHeaders(Context context, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException { private static void onHeaders(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException {
// Download headers // Download headers
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
@ -783,7 +790,7 @@ class Core {
} }
} }
private static void onBody(Context context, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, IOException { private static void onBody(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, IOException {
// Download message body // Download message body
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
@ -837,6 +844,32 @@ class Core {
parts.downloadAttachment(context, attachment); parts.downloadAttachment(context, attachment);
} }
private static void onExists(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws MessagingException {
if (message.uid != null)
return;
if (EntityFolder.SENT.equals(folder.type)) {
long ago = new Date().getTime() - op.created;
long delay = AFTER_SEND_DELAY - ago;
if (delay > 0) {
Log.i(folder.name + " send delay=" + delay);
try {
Thread.sleep(delay);
} catch (InterruptedException ex) {
Log.w(ex);
}
}
}
Message[] imessages = ifolder.search(new MessageIDTerm(message.msgid));
if (imessages == null || imessages.length == 0)
EntityOperation.queue(context, message, EntityOperation.ADD);
else {
long uid = ifolder.getUID(imessages[0]);
EntityOperation.queue(context, message, EntityOperation.FETCH, uid);
}
}
static void onSynchronizeFolders(Context context, EntityAccount account, Store istore, State state) throws MessagingException { static void onSynchronizeFolders(Context context, EntityAccount account, Store istore, State state) throws MessagingException {
DB db = DB.getInstance(context); DB db = DB.getInstance(context);

@ -90,6 +90,7 @@ public class EntityOperation {
static final String SYNC = "sync"; static final String SYNC = "sync";
static final String SUBSCRIBE = "subscribe"; static final String SUBSCRIBE = "subscribe";
static final String SEND = "send"; static final String SEND = "send";
static final String EXISTS = "exists";
static void queue(Context context, EntityMessage message, String name, Object... values) { static void queue(Context context, EntityMessage message, String name, Object... values) {
DB db = DB.getInstance(context); DB db = DB.getInstance(context);

@ -68,7 +68,6 @@ public class ServiceSend extends ServiceBase {
private ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); private ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
private static final int IDENTITY_ERROR_AFTER = 30; // minutes private static final int IDENTITY_ERROR_AFTER = 30; // minutes
private static final long AFTER_SEND_DELAY = 10 * 1000L; // milliseconds
@Override @Override
public void onCreate() { public void onCreate() {
@ -423,6 +422,10 @@ public class ServiceSend extends ServiceBase {
db.message().setMessageSent(sid, time); db.message().setMessageSent(sid, time);
db.message().setMessageUiHide(sid, 0L); db.message().setMessageUiHide(sid, 0L);
// Check for sent orphans
EntityMessage orphan = db.message().getMessage(sid);
EntityOperation.queue(this, orphan, EntityOperation.EXISTS);
} }
if (message.inreplyto != null) { if (message.inreplyto != null) {
@ -442,17 +445,6 @@ public class ServiceSend extends ServiceBase {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("send:" + message.identity, 1); nm.cancel("send:" + message.identity, 1);
// Check for sent orphans
if (sent != null) {
// Give server time to store message into the sent folder
try {
Thread.sleep(AFTER_SEND_DELAY);
} catch (InterruptedException ex) {
Log.w(ex);
}
EntityOperation.sync(this, sent.id, false);
}
} catch (MessagingException ex) { } catch (MessagingException ex) {
Log.e(ex); Log.e(ex);

Loading…
Cancel
Save