From fd79a9a8ad3396689138edbc5ded5d5bfd5c9e60 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 5 Dec 2018 13:56:37 +0100 Subject: [PATCH] Delegate undo move to view So, it works with auto close enabled too --- .../java/eu/faircode/email/ActivityView.java | 114 ++++++++++++++++-- .../eu/faircode/email/FragmentMessages.java | 100 +-------------- .../java/eu/faircode/email/MessageTarget.java | 10 ++ 3 files changed, 120 insertions(+), 104 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/MessageTarget.java diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 5668bc0e23..275e3c70d8 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -31,6 +31,7 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.ParcelFileDescriptor; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -123,6 +124,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES"; static final String ACTION_VIEW_THREAD = BuildConfig.APPLICATION_ID + ".VIEW_THREAD"; static final String ACTION_VIEW_FULL = BuildConfig.APPLICATION_ID + ".VIEW_FULL"; + static final String ACTION_UNDO_MOVE = BuildConfig.APPLICATION_ID + ".UNDO_MOVE"; static final String ACTION_EDIT_FOLDER = BuildConfig.APPLICATION_ID + ".EDIT_FOLDER"; static final String ACTION_EDIT_ANSWER = BuildConfig.APPLICATION_ID + ".EDIT_ANSWER"; static final String ACTION_STORE_ATTACHMENT = BuildConfig.APPLICATION_ID + ".STORE_ATTACHMENT"; @@ -130,6 +132,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB static final String ACTION_SHOW_PRO = BuildConfig.APPLICATION_ID + ".SHOW_PRO"; static final String ACTION_SHOW_LEGEND = BuildConfig.APPLICATION_ID + ".SHOW_LEGEND"; + private static final int UNDO_TIMEOUT = 5000; // milliseconds + static final String UPDATE_LATEST_API = "https://api.github.com/repos/M66B/open-source-email/releases/latest"; static final long UPDATE_INTERVAL = 12 * 3600 * 1000L; // milliseconds @@ -351,6 +355,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB iff.addAction(ACTION_VIEW_MESSAGES); iff.addAction(ACTION_VIEW_THREAD); iff.addAction(ACTION_VIEW_FULL); + iff.addAction(ACTION_UNDO_MOVE); iff.addAction(ACTION_EDIT_FOLDER); iff.addAction(ACTION_EDIT_ANSWER); iff.addAction(ACTION_STORE_ATTACHMENT); @@ -1089,23 +1094,27 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (ACTION_VIEW_MESSAGES.equals(intent.getAction())) + String action = intent.getAction(); + + if (ACTION_VIEW_MESSAGES.equals(action)) onViewMessages(intent); - else if (ACTION_VIEW_THREAD.equals(intent.getAction())) + else if (ACTION_VIEW_THREAD.equals(action)) onViewThread(intent); - else if (ACTION_VIEW_FULL.equals(intent.getAction())) + else if (ACTION_VIEW_FULL.equals(action)) onViewFull(intent); - else if (ACTION_EDIT_FOLDER.equals(intent.getAction())) + else if (ACTION_UNDO_MOVE.equals(action)) + onUndoMove(intent); + else if (ACTION_EDIT_FOLDER.equals(action)) onEditFolder(intent); - else if (ACTION_EDIT_ANSWER.equals(intent.getAction())) + else if (ACTION_EDIT_ANSWER.equals(action)) onEditAnswer(intent); - else if (ACTION_STORE_ATTACHMENT.equals(intent.getAction())) + else if (ACTION_STORE_ATTACHMENT.equals(action)) onStoreAttachment(intent); - else if (ACTION_DECRYPT.equals(intent.getAction())) + else if (ACTION_DECRYPT.equals(action)) onDecrypt(intent); - else if (ACTION_SHOW_PRO.equals(intent.getAction())) + else if (ACTION_SHOW_PRO.equals(action)) onShowPro(intent); - else if (ACTION_SHOW_LEGEND.equals(intent.getAction())) + else if (ACTION_SHOW_LEGEND.equals(action)) onMenuLegend(); } }; @@ -1159,6 +1168,93 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB fragmentTransaction.commit(); } + private void onUndoMove(Intent intent) { + final MessageTarget result = (MessageTarget) intent.getSerializableExtra("target"); + + // Show undo snackbar + final Snackbar snackbar = Snackbar.make( + view, + getString(R.string.title_moving, result.target.getDisplayName(this)), + Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.title_undo, new View.OnClickListener() { + @Override + public void onClick(View v) { + snackbar.dismiss(); + + Bundle args = new Bundle(); + args.putSerializable("result", result); + + // Show message again + new SimpleTask() { + @Override + protected Void onLoad(Context context, Bundle args) { + MessageTarget result = (MessageTarget) args.getSerializable("result"); + for (long id : result.ids) { + Log.i(Helper.TAG, "Move undo id=" + id); + DB.getInstance(context).message().setMessageUiHide(id, false); + } + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + super.onException(args, ex); + } + }.load(ActivityView.this, args); + } + }); + snackbar.show(); + + // Wait + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Log.i(Helper.TAG, "Move timeout"); + + // Remove snackbar + if (snackbar.isShown()) + snackbar.dismiss(); + + Bundle args = new Bundle(); + args.putSerializable("result", result); + + // Process move in a thread + // - the activity could be gone + new SimpleTask() { + @Override + protected Void onLoad(Context context, Bundle args) { + MessageTarget result = (MessageTarget) args.getSerializable("result"); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + for (long id : result.ids) { + EntityMessage message = db.message().getMessage(id); + if (message != null && message.ui_hide) { + Log.i(Helper.TAG, "Move id=" + id + " target=" + result.target.name); + EntityFolder folder = db.folder().getFolderByName(message.account, result.target.name); + EntityOperation.queue(db, message, EntityOperation.MOVE, folder.id); + } + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(ActivityView.this, ActivityView.this, ex); + } + }.load(ActivityView.this, args); + } + }, UNDO_TIMEOUT); + } + private void onEditFolder(Intent intent) { FragmentFolder fragment = new FragmentFolder(); fragment.setArguments(intent.getExtras()); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 4c0ec1d4c6..21bb9c3aee 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -28,7 +28,6 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.os.Bundle; -import android.os.Handler; import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; @@ -44,13 +43,10 @@ import android.widget.TextView; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.snackbar.Snackbar; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -126,11 +122,8 @@ public class FragmentMessages extends FragmentEx { private BoundaryCallbackMessages searchCallback = null; - private ExecutorService executor = Executors.newCachedThreadPool(Helper.backgroundThreadFactory); - private static final int LOCAL_PAGE_SIZE = 100; private static final int REMOTE_PAGE_SIZE = 10; - private static final int UNDO_TIMEOUT = 5000; // milliseconds @Override public void onCreate(Bundle savedInstanceState) { @@ -1737,89 +1730,11 @@ public class FragmentMessages extends FragmentEx { .putExtra("found", target.found)); } - private void moveUndo(final MessageTarget result) { - final boolean undo = !(viewType == AdapterMessage.ViewType.THREAD && autoclose); - - // Show undo snackbar - final Snackbar snackbar = Snackbar.make( - view, - getString(R.string.title_moving, result.target.getDisplayName(getContext())), - Snackbar.LENGTH_INDEFINITE); - snackbar.setAction(R.string.title_undo, new View.OnClickListener() { - @Override - public void onClick(View v) { - snackbar.dismiss(); - - Bundle args = new Bundle(); - args.putSerializable("result", result); - - // Show message again - new SimpleTask() { - @Override - protected Void onLoad(Context context, Bundle args) { - MessageTarget result = (MessageTarget) args.getSerializable("result"); - for (long id : result.ids) { - Log.i(Helper.TAG, "Move undo id=" + id); - DB.getInstance(context).message().setMessageUiHide(id, false); - } - return null; - } - - @Override - protected void onException(Bundle args, Throwable ex) { - super.onException(args, ex); - } - }.load(FragmentMessages.this, args); - } - }); - if (undo) - snackbar.show(); - - // Wait - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - Log.i(Helper.TAG, "Move timeout"); - - // Remove snackbar - if (snackbar.isShown()) - snackbar.dismiss(); - - final Bundle args = new Bundle(); - args.putSerializable("result", result); - - // Process move in a thread - // - the fragment could be gone - executor.submit(new Runnable() { - @Override - public void run() { - try { - MessageTarget result = (MessageTarget) args.getSerializable("result"); - - DB db = DB.getInstance(snackbar.getContext()); - try { - db.beginTransaction(); - - for (long id : result.ids) { - EntityMessage message = db.message().getMessage(id); - if (message != null && message.ui_hide) { - Log.i(Helper.TAG, "Move id=" + id + " target=" + result.target.name); - EntityFolder folder = db.folder().getFolderByName(message.account, result.target.name); - EntityOperation.queue(db, message, EntityOperation.MOVE, folder.id); - } - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - } catch (Throwable ex) { - Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex)); - } - } - }); - } - }, undo ? UNDO_TIMEOUT : 0); + private void moveUndo(MessageTarget target) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); + lbm.sendBroadcast( + new Intent(ActivityView.ACTION_UNDO_MOVE) + .putExtra("target", target)); } private ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { @@ -1832,9 +1747,4 @@ public class FragmentMessages extends FragmentEx { return false; } }; - - private class MessageTarget implements Serializable { - List ids = new ArrayList<>(); - EntityFolder target; - } } diff --git a/app/src/main/java/eu/faircode/email/MessageTarget.java b/app/src/main/java/eu/faircode/email/MessageTarget.java new file mode 100644 index 0000000000..4838b36f10 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/MessageTarget.java @@ -0,0 +1,10 @@ +package eu.faircode.email; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +class MessageTarget implements Serializable { + List ids = new ArrayList<>(); + EntityFolder target; +} \ No newline at end of file