From 7d65e2ee9aa801b37faad9403720aaf72cf8a907 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 7 Dec 2018 19:10:18 +0100 Subject: [PATCH] Delay autoclose until after undo move --- .../java/eu/faircode/email/ActivityView.java | 94 -------------- .../eu/faircode/email/FragmentMessages.java | 117 ++++++++++++++++-- .../java/eu/faircode/email/MessageTarget.java | 10 -- 3 files changed, 109 insertions(+), 112 deletions(-) delete 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 6300f5e34c..291075634a 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -35,7 +35,6 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.os.ParcelFileDescriptor; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -128,7 +127,6 @@ 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"; @@ -136,8 +134,6 @@ 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 @@ -363,7 +359,6 @@ 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); @@ -1193,8 +1188,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB onViewThread(intent); else if (ACTION_VIEW_FULL.equals(action)) onViewFull(intent); - else if (ACTION_UNDO_MOVE.equals(action)) - onUndoMove(intent); else if (ACTION_EDIT_FOLDER.equals(action)) onEditFolder(intent); else if (ACTION_EDIT_ANSWER.equals(action)) @@ -1261,93 +1254,6 @@ 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( - getVisibleView(), - 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 a54e29381c..151b907f2a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -27,6 +27,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.Handler; import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; @@ -44,6 +45,7 @@ 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; @@ -107,6 +109,9 @@ public class FragmentMessages extends FragmentEx { private List archives = new ArrayList<>(); private List trashes = new ArrayList<>(); + private boolean moving = false; + private boolean closing = false; + private AdapterMessage.ViewType viewType; private SelectionTracker selectionTracker = null; private LiveData> messages = null; @@ -122,6 +127,7 @@ public class FragmentMessages extends FragmentEx { 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) { @@ -341,6 +347,8 @@ public class FragmentMessages extends FragmentEx { @Override public void move(long id, String name, boolean type) { + moving = true; + Bundle args = new Bundle(); args.putLong("id", id); args.putString("name", name); @@ -509,6 +517,8 @@ public class FragmentMessages extends FragmentEx { return; Log.i(Helper.TAG, "Swiped dir=" + direction + " message=" + message.id); + moving = true; + Bundle args = new Bundle(); args.putLong("id", message.id); args.putBoolean("thread", viewType != AdapterMessage.ViewType.THREAD); @@ -601,6 +611,8 @@ public class FragmentMessages extends FragmentEx { } private void onActionMove(String folderType) { + moving = true; + Bundle args = new Bundle(); args.putLong("account", account); args.putString("thread", thread); @@ -974,6 +986,8 @@ public class FragmentMessages extends FragmentEx { } private void onActionMove(String type) { + moving = true; + Bundle args = new Bundle(); args.putString("type", type); args.putLongArray("ids", getSelection()); @@ -1066,6 +1080,8 @@ public class FragmentMessages extends FragmentEx { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem target) { + moving = true; + args.putLong("target", target.getItemId()); selectionTracker.clearSelection(); @@ -1616,8 +1632,12 @@ public class FragmentMessages extends FragmentEx { public void onChanged(@Nullable PagedList messages) { if (messages == null || (viewType == AdapterMessage.ViewType.THREAD && messages.size() == 0 && autoclose)) { - finish(); - return; + if (moving) + closing = true; + else { + finish(); + return; + } } if (viewType == AdapterMessage.ViewType.THREAD) { @@ -1688,7 +1708,12 @@ public class FragmentMessages extends FragmentEx { // - no more non archived/trashed/outgoing messages if (count == 0) - finish(); + if (moving) + closing = true; + else { + finish(); + return; + } } } } else { @@ -1753,11 +1778,82 @@ public class FragmentMessages extends FragmentEx { }.load(this, args); } - private void moveUndo(MessageTarget target) { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); - lbm.sendBroadcast( - new Intent(ActivityView.ACTION_UNDO_MOVE) - .putExtra("target", target)); + private void moveUndo(final MessageTarget result) { + // 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(); + moving = false; + closing = false; + + 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); + } + }); + snackbar.show(); + + // Wait + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Log.i(Helper.TAG, "Move timeout"); + + moving = false; + if (closing) + finish(); + + // Remove snackbar + if (snackbar.isShown()) + snackbar.dismiss(); + + final DB db = DB.getInstance(getContext()); + + new Thread(new Runnable() { + @Override + public void run() { + 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(); + } + } + }).start(); + } + }, UNDO_TIMEOUT); } private ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { @@ -1770,4 +1866,9 @@ public class FragmentMessages extends FragmentEx { return false; } }; + + 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 deleted file mode 100644 index 4838b36f10..0000000000 --- a/app/src/main/java/eu/faircode/email/MessageTarget.java +++ /dev/null @@ -1,10 +0,0 @@ -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