From 9a1ee17165f85283d7a02e6eba43718575005c69 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 28 Mar 2021 19:56:35 +0200 Subject: [PATCH] Refactoring --- .../eu/faircode/email/ActivityCompose.java | 147 +++++++++--------- .../java/eu/faircode/email/ActivityView.java | 59 +++---- .../eu/faircode/email/FragmentMessages.java | 142 ++++++++--------- 3 files changed, 174 insertions(+), 174 deletions(-) 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,85 +211,26 @@ 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"); - - DB db = DB.getInstance(context); - - 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); - - EntityMessage message; - - try { - db.beginTransaction(); - - message = db.message().getMessage(id); - if (message == null) - return null; - - db.folder().setFolderError(message.folder, null); - if (message.identity != null) - db.identity().setIdentityError(message.identity, null); - - File source = message.getFile(context); - - // 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)); - - message.id = null; - message.folder = drafts.id; - message.fts = false; - message.ui_snoozed = null; - message.error = null; - message.id = db.message().insertMessage(message); - - File target = message.getFile(context); - source.renameTo(target); - - List attachments = db.attachment().getAttachments(id); - for (EntityAttachment attachment : attachments) - db.attachment().setMessage(attachment.id, message.id); - - EntityOperation.queue(context, message, EntityOperation.ADD); - - // Delete from outbox - db.message().deleteMessage(id); // will delete operation too - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - ServiceSynchronize.eval(context, "outbox/drafts"); - - NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel("send:" + id, 1); - - return message; + return undoSend(id, context); } @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)); + protected void onExecuted(Bundle args, Long id) { + if (id == null) + return; + + context.startActivity( + new Intent(context, ActivityCompose.class) + .putExtra("action", "edit") + .putExtra("id", id)); } @Override @@ -298,4 +239,68 @@ public class ActivityCompose extends ActivityBase implements FragmentManager.OnB } }.execute(context, owner, args, "undo:sent"); } + + static Long undoSend(long id, Context context) { + DB db = DB.getInstance(context); + + 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); + + EntityMessage message; + + try { + db.beginTransaction(); + + message = db.message().getMessage(id); + if (message == null) + return null; + + db.folder().setFolderError(message.folder, null); + if (message.identity != null) + db.identity().setIdentityError(message.identity, null); + + File source = message.getFile(context); + + // 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)); + + message.id = null; + message.folder = drafts.id; + message.fts = false; + message.ui_snoozed = null; + message.error = null; + message.id = db.message().insertMessage(message); + + File target = message.getFile(context); + source.renameTo(target); + + List attachments = db.attachment().getAttachments(id); + for (EntityAttachment attachment : attachments) + db.attachment().setMessage(attachment.id, message.id); + + EntityOperation.queue(context, message, EntityOperation.ADD); + + // Delete from outbox + db.message().deleteMessage(id); // will delete operation too + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + ServiceSynchronize.eval(context, "outbox/drafts"); + + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + nm.cancel("send:" + id, 1); + + 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; } + 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(); + + 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); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + ServiceSynchronize.eval(context, "move"); + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.e(ex); + } + }; + + SimpleTask show = new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + ArrayList result = args.getParcelableArrayList("result"); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + 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.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + 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, - new Runnable() { - @Override - public void run() { - new SimpleTask() { - @Override - protected Void onExecute(Context context, Bundle args) { - ArrayList result = args.getParcelableArrayList("result"); - - 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; - - 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(); - } - - ServiceSynchronize.eval(context, "move"); - - 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"); - - DB db = DB.getInstance(context); - try { - db.beginTransaction(); - - 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.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return null; - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Log.e(ex); - } - }.execute(FragmentMessages.this, args, "undo:show"); - } - }); + ((ActivityView) activity).undo(title, args, move, show); } @Override