diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index dd6ed85294..f0a1553d26 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -793,6 +793,10 @@ public class AdapterMessage extends RecyclerView.Adapter() { + @Override + protected Void onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + boolean hide = args.getBoolean("hide"); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + + db.message().setMessageSnoozed(message.id, hide ? Long.MAX_VALUE : null); + EntityMessage.snooze(context, message.id, hide ? Long.MAX_VALUE : null); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(parentFragment.getFragmentManager(), ex); + } + }.execute(context, owner, args, "message:hide"); + } + private void onMenuColoredStar(final TupleMessageEx message) { Bundle args = new Bundle(); args.putLong("id", message.id); diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index d44ac3be9a..b4e8b32bd1 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -130,6 +130,9 @@ public class AdapterRule extends RecyclerView.Adapter { case EntityRule.TYPE_UNSEEN: tvAction.setText(R.string.title_rule_unseen); break; + case EntityRule.TYPE_HIDE: + tvAction.setText(R.string.title_rule_hide); + break; case EntityRule.TYPE_IGNORE: tvAction.setText(R.string.title_rule_ignore); break; diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 70f1b4b77f..df820dfdcc 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -238,7 +238,7 @@ public class EntityMessage implements Serializable { PendingIntent pi = PendingIntent.getService(context, ServiceUI.PI_WAKEUP, snoozed, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - if (wakeup == null) { + if (wakeup == null || wakeup == Long.MAX_VALUE) { Log.i("Cancel snooze id=" + id); am.cancel(pi); } else { diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index bc7e6d7da9..36a43e9338 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -97,6 +97,7 @@ public class EntityRule { static final int TYPE_IGNORE = 9; static final int TYPE_NOOP = 10; static final int TYPE_KEYWORD = 11; + static final int TYPE_HIDE = 12; static final String ACTION_AUTOMATION = BuildConfig.APPLICATION_ID + ".AUTOMATION"; static final String EXTRA_RULE = "rule"; @@ -274,6 +275,8 @@ public class EntityRule { return onActionSeen(context, message, true); case TYPE_UNSEEN: return onActionSeen(context, message, false); + case TYPE_HIDE: + return onActionHide(context, message); case TYPE_IGNORE: return onActionIgnore(context, message, jaction); case TYPE_SNOOZE: @@ -304,6 +307,17 @@ public class EntityRule { return true; } + private boolean onActionHide(Context context, EntityMessage message) { + DB db = DB.getInstance(context); + db.message().setMessageSnoozed(message.id, Long.MAX_VALUE); + db.message().setMessageUiIgnored(message.id, true); + EntityMessage.snooze(context, message.id, Long.MAX_VALUE); + + message.ui_snoozed = Long.MAX_VALUE; + message.ui_ignored = true; + return true; + } + private boolean onActionIgnore(Context context, EntityMessage message, JSONObject jargs) { DB db = DB.getInstance(context); db.message().setMessageUiIgnored(message.id, true); diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index d19e5eb7c7..d5bcef8a69 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -147,6 +147,7 @@ public class FragmentAccount extends FragmentBase { static final Long SWIPE_ACTION_ASK = -1L; static final Long SWIPE_ACTION_SEEN = -2L; static final Long SWIPE_ACTION_SNOOZE = -3L; + static final Long SWIPE_ACTION_HIDE = -4L; @Override public void onCreate(Bundle savedInstanceState) { @@ -1441,6 +1442,11 @@ public class FragmentAccount extends FragmentBase { snooze.name = getString(R.string.title_snooze_now); folders.add(snooze); + EntityFolder hide = new EntityFolder(); + hide.id = SWIPE_ACTION_HIDE; + hide.name = getString(R.string.title_hide); + folders.add(hide); + folders.addAll(_folders); adapterSwipe.clear(); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 78ccbfe280..d5a8a7acc4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1434,6 +1434,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. icon = (message.ui_seen ? R.drawable.baseline_visibility_off_24 : R.drawable.baseline_visibility_24); else if (FragmentAccount.SWIPE_ACTION_SNOOZE.equals(action)) icon = (message.ui_snoozed == null ? R.drawable.baseline_timelapse_24 : R.drawable.baseline_timer_off_24); + else if (FragmentAccount.SWIPE_ACTION_HIDE.equals(action)) + icon = (message.ui_snoozed == null ? R.drawable.baseline_visibility_off_24 : R.drawable.baseline_visibility_24); else icon = EntityFolder.getIcon(dX > 0 ? swipes.right_type : swipes.left_type); Drawable d = getResources().getDrawable(icon, getContext().getTheme()).mutate(); @@ -1496,6 +1498,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. onActionSeenSelection(!message.ui_seen, message.id); else if (FragmentAccount.SWIPE_ACTION_SNOOZE.equals(action)) onActionSnooze(message); + else if (FragmentAccount.SWIPE_ACTION_HIDE.equals(action)) + onActionHide(message); else swipeFolder(message, action); } @@ -1928,6 +1932,17 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. onSnooze(args); } + private void onActionHide(TupleMessageEx message) { + Bundle args = new Bundle(); + args.putLong("account", message.account); + args.putString("thread", message.thread); + args.putLong("id", message.id); + args.putLong("duration", message.ui_snoozed == null ? Long.MAX_VALUE : 0); + args.putLong("time", message.ui_snoozed == null ? Long.MAX_VALUE : 0); + + onSnooze(args); + } + private void onActionSnoozeSelection() { Bundle args = new Bundle(); args.putString("title", getString(R.string.title_snooze)); @@ -2648,7 +2663,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. ibSeen.setImageResource(filter_seen ? R.drawable.baseline_drafts_24 : R.drawable.baseline_mail_24); ibUnflagged.setImageResource(filter_unflagged ? R.drawable.baseline_star_border_24 : R.drawable.baseline_star_24); - ibSnoozed.setImageResource(filter_snoozed ? R.drawable.baseline_timelapse_24 : R.drawable.baseline_timer_off_24); + ibSnoozed.setImageResource(filter_snoozed ? R.drawable.baseline_visibility_off_24 : R.drawable.baseline_visibility_24); ibSeen.setVisibility(experiments && folder ? View.VISIBLE : View.GONE); ibUnflagged.setVisibility(experiments && folder ? View.VISIBLE : View.GONE); @@ -4235,8 +4250,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. account, thread, threading ? null : id, null); for (EntityMessage threaded : messages) { db.message().setMessageSnoozed(threaded.id, wakeup); - EntityMessage.snooze(context, threaded.id, wakeup); EntityOperation.queue(context, threaded, EntityOperation.SEEN, true); + EntityMessage.snooze(context, threaded.id, wakeup); } db.setTransactionSuccessful(); diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index fab328e4e1..c9f65bde57 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -329,6 +329,7 @@ public class FragmentRule extends FragmentBase { actions.add(new Action(EntityRule.TYPE_NOOP, getString(R.string.title_rule_noop))); actions.add(new Action(EntityRule.TYPE_SEEN, getString(R.string.title_rule_seen))); actions.add(new Action(EntityRule.TYPE_UNSEEN, getString(R.string.title_rule_unseen))); + actions.add(new Action(EntityRule.TYPE_HIDE, getString(R.string.title_rule_hide))); actions.add(new Action(EntityRule.TYPE_IGNORE, getString(R.string.title_rule_ignore))); actions.add(new Action(EntityRule.TYPE_SNOOZE, getString(R.string.title_rule_snooze))); actions.add(new Action(EntityRule.TYPE_FLAG, getString(R.string.title_rule_flag))); diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index c3822f68bb..2cd94e4f4b 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -716,17 +716,6 @@ app:layout_constraintStart_toEndOf="@id/barrier_folders" app:layout_constraintTop_toBottomOf="@id/spLeft" /> - -