diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index 3c1e667d46..78b73847e7 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -358,6 +358,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback 0 ? "+" : "") + TextUtils.join(",", flags); @@ -1326,7 +1335,8 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback :size)" + " AND (:after IS NULL OR received > :after)" + " AND (:before IS NULL OR received < :before)" + + " AND (:touched IS NULL OR last_attempt > :touched)" + " AND NOT message.folder IN (:exclude)" + " GROUP BY message.id" + - " ORDER BY received DESC" + + " ORDER BY CASE WHEN :touched IS NULL THEN received ELSE last_attempt END DESC" + " LIMIT :limit OFFSET :offset") List matchMessages( Long account, Long folder, long[] exclude, String find, @@ -397,7 +398,7 @@ public interface DaoMessage { boolean unseen, boolean flagged, boolean hidden, boolean encrypted, boolean with_attachments, boolean with_notes, int type_count, String[] types, Integer size, - Long after, Long before, + Long after, Long before, Long touched, int limit, int offset); @Query("SELECT id" + @@ -930,7 +931,7 @@ public interface DaoMessage { int setMessageVerified(long id, boolean verified); @Query("UPDATE message SET last_attempt = :last_attempt WHERE id = :id AND NOT (last_attempt IS :last_attempt)") - int setMessageLastAttempt(long id, long last_attempt); + int setMessageLastAttempt(long id, Long last_attempt); @Query("UPDATE message SET ui_ignored = 1" + " WHERE NOT ui_ignored" + diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 7ed18073c9..409e43eaca 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -261,7 +261,7 @@ public class EntityMessage implements Serializable { public Integer revisions; // compose public String warning; // persistent public String error; // volatile - public Long last_attempt; // send + public Long last_attempt; // send / last touched static String generateMessageId() { return generateMessageId("localhost"); diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogSearch.java b/app/src/main/java/eu/faircode/email/FragmentDialogSearch.java index 0c4d361d90..8340607ac2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogSearch.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogSearch.java @@ -65,6 +65,7 @@ import java.util.List; public class FragmentDialogSearch extends FragmentDialogBase { private static final int MAX_SUGGESTIONS = 3; + private static final int RECENTLY_TOUCHED = 3600 * 1000; // milliseconds @NonNull @Override @@ -613,6 +614,24 @@ public class FragmentDialogSearch extends FragmentDialogBase { ibUnseen.setOnClickListener(onClick); ibFlagged.setOnClickListener(onClick); + ibHidden.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + dialog.dismiss(); + + BoundaryCallbackMessages.SearchCriteria criteria = new BoundaryCallbackMessages.SearchCriteria(); + criteria.touched = RECENTLY_TOUCHED; + + FragmentMessages.search( + context, getViewLifecycleOwner(), getParentFragmentManager(), + account, -1L, + false, + criteria); + + return true; + } + }); + etQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_GO || diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 84cdf2365d..e2d94586aa 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -7830,6 +7830,9 @@ public class FragmentMessages extends FragmentBase EntityOperation.queue(context, message, EntityOperation.BODY); } + if (!EntityFolder.OUTBOX.equals(folder.type)) + db.message().setMessageLastAttempt(message.id, new Date().getTime()); + db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -8192,7 +8195,7 @@ public class FragmentMessages extends FragmentBase Log.i("Move id=" + target.id + " target=" + target.targetFolder.name); db.message().setMessageUiBusy(target.id, null); - db.message().setMessageLastAttempt(target.id, new Date().getTime()); + db.message().setMessageLastAttempt(target.id, null); EntityOperation.queue(context, message, EntityOperation.MOVE, target.targetFolder.id); } @@ -8226,7 +8229,7 @@ public class FragmentMessages extends FragmentBase db.message().setMessageUiBusy(target.id, null); db.message().setMessageUiHide(target.id, false); db.message().setMessageFound(target.id, target.found); - db.message().setMessageLastAttempt(target.id, new Date().getTime()); + db.message().setMessageLastAttempt(target.id, null); } db.setTransactionSuccessful(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7aea41f1a7..efc50f7221 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1913,6 +1913,7 @@ notes invitation size > %1$s + touched Search on device Search on server