diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index b760c7c068..67d7e90726 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -1164,14 +1164,10 @@ public class AdapterMessage extends RecyclerView.Adapter messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) - EntityOperation.queue(db, threaded, EntityOperation.FLAG, flagged); - } else - EntityOperation.queue(db, message, EntityOperation.FLAG, flagged); + List messages = db.message().getMessageByThread( + message.account, message.thread, threading && thread ? null : id, message.folder, message.ui_found); + for (EntityMessage threaded : messages) + EntityOperation.queue(db, threaded, EntityOperation.FLAG, flagged); return null; } diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index c215a6f798..203702d33f 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -164,8 +164,9 @@ public interface DaoMessage { " WHERE account = :account" + " AND thread = :thread" + " AND (:id IS NULL OR message.id = :id)" + + " AND (:folder IS NULL OR message.folder = :folder)" + " AND ui_found = :found") - List getMessageByThread(long account, String thread, Long id, boolean found); + List getMessageByThread(long account, String thread, Long id, Long folder, boolean found); @Query("SELECT message.* FROM message" + " JOIN folder ON folder.id = message.folder" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index ac62b22034..7ac555d603 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -527,11 +527,9 @@ public class FragmentMessages extends FragmentEx { if (thread) { List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) { - if (!threaded.ui_hide && threaded.folder.equals(message.folder)) - result.ids.add(threaded.id); - } + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); + for (EntityMessage threaded : messages) + result.ids.add(threaded.id); } else result.ids.add(message.id); @@ -587,6 +585,66 @@ public class FragmentMessages extends FragmentEx { return false; } } + + private void onActionMove(String folderType) { + Bundle args = new Bundle(); + args.putLong("account", account); + args.putBoolean("found", found); + args.putString("folderType", folderType); + + new SimpleTask() { + @Override + protected MessageTarget onLoad(Context context, Bundle args) { + long account = args.getLong("account"); + String thread = args.getString("thread"); + boolean found = args.getBoolean("found"); + String folderType = args.getString("folderType"); + + MessageTarget result = new MessageTarget(); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + result.target = db.folder().getFolderByType(account, folderType); + + List messages = db.message().getMessageByThread( + account, thread, threading ? null : id, null, found); + for (EntityMessage message : messages) + if (!result.target.id.equals(message.folder)) { + result.ids.add(message.id); + db.message().setMessageUiHide(message.id, true); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return result; + } + + @Override + protected void onLoaded(Bundle args, MessageTarget result) { + moveUndo(result); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); + } + }.load(FragmentMessages.this, args); + } + + private void onActionNavigate(ViewModelMessages.Target target) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); + lbm.sendBroadcast( + new Intent(ActivityView.ACTION_VIEW_THREAD) + .putExtra("account", target.account) + .putExtra("thread", target.thread) + .putExtra("id", target.id) + .putExtra("found", target.found)); + } }); fab.setOnClickListener(new View.OnClickListener() { @@ -776,10 +834,9 @@ public class FragmentMessages extends FragmentEx { EntityMessage message = db.message().getMessage(id); if (message.ui_seen != seen) { List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) - EntityOperation.queue(db, threaded, EntityOperation.SEEN, seen); + EntityOperation.queue(db, threaded, EntityOperation.SEEN, seen); } } @@ -819,10 +876,9 @@ public class FragmentMessages extends FragmentEx { EntityMessage message = db.message().getMessage(id); if (message.ui_flagged != flagged) { List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) - EntityOperation.queue(db, threaded, EntityOperation.FLAG, flagged); + EntityOperation.queue(db, threaded, EntityOperation.FLAG, flagged); } } @@ -877,14 +933,13 @@ public class FragmentMessages extends FragmentEx { for (long id : ids) { EntityMessage message = db.message().getMessage(id); List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) { - if (threaded.uid == null && !TextUtils.isEmpty(threaded.error)) // outbox - db.message().deleteMessage(threaded.id); - else - EntityOperation.queue(db, threaded, EntityOperation.DELETE); - } + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); + for (EntityMessage threaded : messages) { + if (threaded.uid == null && !TextUtils.isEmpty(threaded.error)) // outbox + db.message().deleteMessage(threaded.id); + else + EntityOperation.queue(db, threaded, EntityOperation.DELETE); + } } db.setTransactionSuccessful(); @@ -931,12 +986,11 @@ public class FragmentMessages extends FragmentEx { for (long id : ids) { EntityMessage message = db.message().getMessage(id); List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) { - result.ids.add(threaded.id); - db.message().setMessageUiHide(threaded.id, true); - } + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); + for (EntityMessage threaded : messages) { + result.ids.add(threaded.id); + db.message().setMessageUiHide(threaded.id, true); + } } db.setTransactionSuccessful(); @@ -1021,12 +1075,11 @@ public class FragmentMessages extends FragmentEx { for (long id : ids) { EntityMessage message = db.message().getMessage(id); List messages = db.message().getMessageByThread( - message.account, message.thread, threading ? null : id, message.ui_found); - for (EntityMessage threaded : messages) - if (threaded.folder.equals(message.folder)) { - result.ids.add(threaded.id); - db.message().setMessageUiHide(threaded.id, true); - } + message.account, message.thread, threading ? null : id, message.folder, message.ui_found); + for (EntityMessage threaded : messages) { + result.ids.add(threaded.id); + db.message().setMessageUiHide(threaded.id, true); + } } db.setTransactionSuccessful(); @@ -1684,66 +1737,6 @@ public class FragmentMessages extends FragmentEx { }.load(this, args); } - private void onActionMove(String folderType) { - Bundle args = new Bundle(); - args.putLong("account", account); - args.putString("thread", thread); - args.putBoolean("found", found); - args.putString("folderType", folderType); - - new SimpleTask() { - @Override - protected MessageTarget onLoad(Context context, Bundle args) { - long account = args.getLong("account"); - String thread = args.getString("thread"); - boolean found = args.getBoolean("found"); - String folderType = args.getString("folderType"); - - MessageTarget result = new MessageTarget(); - - DB db = DB.getInstance(context); - try { - db.beginTransaction(); - - result.target = db.folder().getFolderByType(account, folderType); - - List messages = db.message().getMessageByThread(account, thread, threading ? null : id, found); - for (EntityMessage message : messages) - if (message.uid != null && !result.target.id.equals(message.folder)) { - result.ids.add(message.id); - db.message().setMessageUiHide(message.id, true); - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return result; - } - - @Override - protected void onLoaded(Bundle args, MessageTarget result) { - moveUndo(result); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); - } - }.load(this, args); - } - - private void onActionNavigate(ViewModelMessages.Target target) { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); - lbm.sendBroadcast( - new Intent(ActivityView.ACTION_VIEW_THREAD) - .putExtra("account", target.account) - .putExtra("thread", target.thread) - .putExtra("id", target.id) - .putExtra("found", target.found)); - } - private void moveUndo(MessageTarget target) { LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); lbm.sendBroadcast(