diff --git a/app/src/main/java/eu/faircode/email/ActivityCompose.java b/app/src/main/java/eu/faircode/email/ActivityCompose.java index e571806a5f..325d9d6ebf 100644 --- a/app/src/main/java/eu/faircode/email/ActivityCompose.java +++ b/app/src/main/java/eu/faircode/email/ActivityCompose.java @@ -211,91 +211,96 @@ public class ActivityCompose extends ActivityBase implements FragmentManager.OnB Intent.ACTION_SEND_MULTIPLE.equals(action)); } - static void undoSend(long id, final Context context, final LifecycleOwner owner, final FragmentManager manager) { + static void undoSend(final long id, final Context context, final LifecycleOwner owner, final FragmentManager manager) { Bundle args = new Bundle(); args.putLong("id", id); - new SimpleTask() { + new SimpleTask() { @Override - protected EntityMessage onExecute(Context context, Bundle args) { + protected Long onExecute(Context context, Bundle args) { long id = args.getLong("id"); + return undoSend(id, context); + } - DB db = DB.getInstance(context); + @Override + protected void onExecuted(Bundle args, Long id) { + if (id == null) + return; + + context.startActivity( + new Intent(context, ActivityCompose.class) + .putExtra("action", "edit") + .putExtra("id", id)); + } - EntityOperation operation = db.operation().getOperation(id, EntityOperation.SEND); - if (operation != null) - if ("executing".equals(operation.state)) { - // Trigger update - db.message().setMessageUiBusy(id, new Date().getTime()); - return null; - } else - db.operation().deleteOperation(operation.id); + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(manager, ex, !(ex instanceof IllegalArgumentException)); + } + }.execute(context, owner, args, "undo:sent"); + } - EntityMessage message; + static Long undoSend(long id, Context context) { + DB db = DB.getInstance(context); - try { - db.beginTransaction(); + EntityOperation operation = db.operation().getOperation(id, EntityOperation.SEND); + if (operation != null) + if ("executing".equals(operation.state)) { + // Trigger update + db.message().setMessageUiBusy(id, new Date().getTime()); + return null; + } else + db.operation().deleteOperation(operation.id); - message = db.message().getMessage(id); - if (message == null) - return null; + EntityMessage message; - db.folder().setFolderError(message.folder, null); - if (message.identity != null) - db.identity().setIdentityError(message.identity, null); + try { + db.beginTransaction(); - File source = message.getFile(context); + message = db.message().getMessage(id); + if (message == null) + return null; - // Insert into drafts - EntityFolder drafts = db.folder().getFolderByType(message.account, EntityFolder.DRAFTS); - if (drafts == null) - throw new IllegalArgumentException(context.getString(R.string.title_no_drafts)); + db.folder().setFolderError(message.folder, null); + if (message.identity != null) + db.identity().setIdentityError(message.identity, null); - message.id = null; - message.folder = drafts.id; - message.fts = false; - message.ui_snoozed = null; - message.error = null; - message.id = db.message().insertMessage(message); + File source = message.getFile(context); - File target = message.getFile(context); - source.renameTo(target); + // Insert into drafts + EntityFolder drafts = db.folder().getFolderByType(message.account, EntityFolder.DRAFTS); + if (drafts == null) + throw new IllegalArgumentException(context.getString(R.string.title_no_drafts)); - List attachments = db.attachment().getAttachments(id); - for (EntityAttachment attachment : attachments) - db.attachment().setMessage(attachment.id, message.id); + message.id = null; + message.folder = drafts.id; + message.fts = false; + message.ui_snoozed = null; + message.error = null; + message.id = db.message().insertMessage(message); - EntityOperation.queue(context, message, EntityOperation.ADD); + File target = message.getFile(context); + source.renameTo(target); - // Delete from outbox - db.message().deleteMessage(id); // will delete operation too + List attachments = db.attachment().getAttachments(id); + for (EntityAttachment attachment : attachments) + db.attachment().setMessage(attachment.id, message.id); - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } + EntityOperation.queue(context, message, EntityOperation.ADD); - ServiceSynchronize.eval(context, "outbox/drafts"); + // Delete from outbox + db.message().deleteMessage(id); // will delete operation too - NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel("send:" + id, 1); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } - return message; - } + ServiceSynchronize.eval(context, "outbox/drafts"); - @Override - protected void onExecuted(Bundle args, EntityMessage draft) { - if (draft != null) - context.startActivity( - new Intent(context, ActivityCompose.class) - .putExtra("action", "edit") - .putExtra("id", draft.id)); - } + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + nm.cancel("send:" + id, 1); - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(manager, ex, !(ex instanceof IllegalArgumentException)); - } - }.execute(context, owner, args, "undo:sent"); + return message.id; } } diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 35933f717d..efa4989319 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -746,29 +746,21 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB return super.onOptionsItemSelected(item); } - public void undo(String title, Runnable move, Runnable show) { + public void undo(String title, final Bundle args, final SimpleTask move, final SimpleTask show) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); int undo_timeout = prefs.getInt("undo_timeout", 5000); if (undo_timeout == 0) - try { - move.run(); - } catch (Throwable ex) { - Log.e(ex); - } + move.execute(this, args, "undo:move"); else - undo(undo_timeout, title, move, show); + undo(undo_timeout, title, args, move, show); } - public void undo(long undo_timeout, String title, final Runnable move, final Runnable show) { + public void undo(long undo_timeout, String title, final Bundle args, final SimpleTask move, final SimpleTask show) { if (drawerLayout == null || drawerLayout.getChildCount() == 0) { Log.e("Undo: drawer missing"); if (show != null) - try { - show.run(); - } catch (Throwable ex) { - Log.e(ex); - } + show.execute(this, args, "undo:show"); return; } @@ -785,11 +777,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB Log.i("Undo timeout"); snackbar.dismiss(); if (move != null) - try { - move.run(); - } catch (Throwable ex) { - Log.e(ex); - } + move.execute(ActivityView.this, args, "undo:move"); } }; @@ -800,11 +788,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB getMainHandler().removeCallbacks(timeout); snackbar.dismiss(); if (show != null) - try { - show.run(); - } catch (Throwable ex) { - Log.e(ex); - } + show.execute(ActivityView.this, args, "undo:show"); } }); @@ -1327,6 +1311,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB } private void onUndoSend(Intent intent) { + long id = intent.getLongExtra("id", -1); int delayed = intent.getIntExtra("delayed", 0); long scheduled = intent.getLongExtra("scheduled", 0); long now = new Date().getTime(); @@ -1338,13 +1323,31 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB if (delayed * 1000L < UNDO_SEND_DELAY * 2 || scheduled - now < UNDO_SEND_DELAY * 2) return; - undo(UNDO_SEND_DELAY, getString(R.string.title_sending), null, new Runnable() { + SimpleTask task = new SimpleTask() { @Override - public void run() { - long id = intent.getLongExtra("id", -1); - ActivityCompose.undoSend(id, ActivityView.this, ActivityView.this, getSupportFragmentManager()); + protected Long onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + return ActivityCompose.undoSend(id, context); } - }); + + @Override + protected void onExecuted(Bundle args, Long id) { + if (id == null) + return; + + startActivity( + new Intent(ActivityView.this, ActivityCompose.class) + .putExtra("action", "edit") + .putExtra("id", id)); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getSupportFragmentManager(), ex, !(ex instanceof IllegalArgumentException)); + } + }; + + undo(UNDO_SEND_DELAY, getString(R.string.title_sending), intent.getExtras(), null, task); } private BroadcastReceiver receiver = new BroadcastReceiver() { diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index dd9d1bc1a0..35bf0dca1a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -5399,82 +5399,74 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. return; } - String title = getString(R.string.title_move_undo, getDisplay(result, true), result.size()); - ((ActivityView) activity).undo(title, - new Runnable() { - @Override - public void run() { - new SimpleTask() { - @Override - protected Void onExecute(Context context, Bundle args) { - ArrayList result = args.getParcelableArrayList("result"); + SimpleTask move = new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + ArrayList result = args.getParcelableArrayList("result"); - DB db = DB.getInstance(context); - try { - db.beginTransaction(); + DB db = DB.getInstance(context); + try { + db.beginTransaction(); - for (MessageTarget target : result) { - EntityMessage message = db.message().getMessage(target.id); - if (message == null || !message.ui_hide) - continue; + for (MessageTarget target : result) { + EntityMessage message = db.message().getMessage(target.id); + if (message == null || !message.ui_hide) + continue; - Log.i("Move id=" + target.id + " target=" + target.targetFolder.name); - db.message().setMessageUiBusy(target.id, null); - db.message().setMessageLastAttempt(target.id, new Date().getTime()); - EntityOperation.queue(context, message, EntityOperation.MOVE, target.targetFolder.id); - } + Log.i("Move id=" + target.id + " target=" + target.targetFolder.name); + db.message().setMessageUiBusy(target.id, null); + db.message().setMessageLastAttempt(target.id, new Date().getTime()); + EntityOperation.queue(context, message, EntityOperation.MOVE, target.targetFolder.id); + } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } - ServiceSynchronize.eval(context, "move"); + ServiceSynchronize.eval(context, "move"); - return null; - } + return null; + } - @Override - protected void onException(Bundle args, Throwable ex) { - Log.e(ex); - } - }.execute(FragmentMessages.this, args, "undo:move"); - } - }, - new Runnable() { - @Override - public void run() { - new SimpleTask() { - @Override - protected Void onExecute(Context context, Bundle args) { - ArrayList result = args.getParcelableArrayList("result"); + @Override + protected void onException(Bundle args, Throwable ex) { + Log.e(ex); + } + }; - DB db = DB.getInstance(context); - try { - db.beginTransaction(); + SimpleTask show = new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + ArrayList result = args.getParcelableArrayList("result"); - for (MessageTarget target : result) { - Log.i("Move undo id=" + target.id); - db.message().setMessageUiBusy(target.id, null); - db.message().setMessageUiHide(target.id, false); - db.message().setMessageLastAttempt(target.id, new Date().getTime()); - } + DB db = DB.getInstance(context); + try { + db.beginTransaction(); - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } + for (MessageTarget target : result) { + Log.i("Move undo id=" + target.id); + db.message().setMessageUiBusy(target.id, null); + db.message().setMessageUiHide(target.id, false); + db.message().setMessageLastAttempt(target.id, new Date().getTime()); + } - return null; - } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } - @Override - protected void onException(Bundle args, Throwable ex) { - Log.e(ex); - } - }.execute(FragmentMessages.this, args, "undo:show"); - } - }); + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.e(ex); + } + }; + + String title = getString(R.string.title_move_undo, getDisplay(result, true), result.size()); + ((ActivityView) activity).undo(title, args, move, show); } @Override