diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 95179d67f8..07d87aa92b 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -174,7 +174,6 @@ public class AdapterMessage extends RecyclerView.Adapter new Date().getTime() + FUTURE_RECEIVED) - if (sent != null) - received = sent; - } - String authentication = helper.getAuthentication(); MessageHelper.MessageParts parts = helper.getMessageParts(context); @@ -2113,8 +2101,8 @@ class Core { message.content = false; message.encrypt = parts.getEncryption(); message.ui_encrypt = message.encrypt; - message.received = received; - message.sent = sent; + message.received = helper.getReceived(); + message.sent = helper.getSent(); message.seen = seen; message.answered = answered; message.flagged = flagged; diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 4d49856ff6..e7607dca85 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -92,12 +92,13 @@ public interface DaoMessage { " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + " ELSE 0" + " END" + - ", CASE WHEN :ascending THEN message.received ELSE -message.received END") + ", CASE WHEN :use_sent_time THEN message.sent ELSE message.received END" + + " * CASE WHEN :ascending THEN 1 ELSE -1 END") @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) DataSource.Factory pagedUnified( String type, boolean threading, - String sort, boolean ascending, + String sort, boolean use_sent_time, boolean ascending, boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean found, boolean debug); @@ -147,11 +148,12 @@ public interface DaoMessage { " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + " ELSE 0" + " END" + - ", CASE WHEN :ascending THEN message.received ELSE -message.received END") + ", CASE WHEN :use_sent_time THEN message.sent ELSE message.received END" + + " * CASE WHEN :ascending THEN 1 ELSE -1 END") @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) DataSource.Factory pagedFolder( long folder, boolean threading, - String sort, boolean ascending, + String sort, boolean use_sent_time, boolean ascending, boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed, boolean found, boolean debug); @@ -180,7 +182,8 @@ public interface DaoMessage { " AND message.thread = :thread" + " AND (:id IS NULL OR message.id = :id)" + " AND (NOT message.ui_hide OR :debug)" + - " ORDER BY CASE WHEN :ascending THEN message.received ELSE -message.received END" + + " ORDER BY CASE WHEN :use_sent_time THEN message.sent ELSE message.received END" + + " * CASE WHEN :ascending THEN 1 ELSE -1 END" + ", CASE" + " WHEN folder.type = '" + EntityFolder.INBOX + "' THEN 1" + " WHEN folder.type = '" + EntityFolder.OUTBOX + "' THEN 2" + @@ -193,7 +196,8 @@ public interface DaoMessage { " WHEN folder.type = '" + EntityFolder.JUNK + "' THEN 9" + " ELSE 999 END") // The folder type sort order should match the duplicate algorithm - DataSource.Factory pagedThread(long account, String thread, Long id, boolean ascending, boolean debug); + DataSource.Factory pagedThread( + long account, String thread, Long id, boolean use_sent_time, boolean ascending, boolean debug); @Query("SELECT account.name AS accountName" + ", COUNT(message.id) AS count" + diff --git a/app/src/main/java/eu/faircode/email/EntityAccount.java b/app/src/main/java/eu/faircode/email/EntityAccount.java index 2bed904b58..69f3fb07f0 100644 --- a/app/src/main/java/eu/faircode/email/EntityAccount.java +++ b/app/src/main/java/eu/faircode/email/EntityAccount.java @@ -117,7 +117,7 @@ public class EntityAccount extends EntityOrder implements Serializable { @NonNull public Boolean ignore_size = false; @NonNull - public Boolean use_date = false; + public Boolean use_date = false; // Obsolete public String prefix; // namespace, obsolete public Long quota_usage; diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 2f16a508b0..a28776c435 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -110,7 +110,6 @@ public class FragmentAccount extends FragmentBase { private EditText etInterval; private CheckBox cbPartialFetch; private CheckBox cbIgnoreSize; - private CheckBox cbUseDate; private Button btnCheck; private ContentLoadingProgressBar pbCheck; @@ -218,7 +217,6 @@ public class FragmentAccount extends FragmentBase { etInterval = view.findViewById(R.id.etInterval); cbPartialFetch = view.findViewById(R.id.cbPartialFetch); cbIgnoreSize = view.findViewById(R.id.cbIgnoreSize); - cbUseDate = view.findViewById(R.id.cbUseDate); btnCheck = view.findViewById(R.id.btnCheck); pbCheck = view.findViewById(R.id.pbCheck); @@ -778,7 +776,6 @@ public class FragmentAccount extends FragmentBase { args.putString("interval", etInterval.getText().toString()); args.putBoolean("partial_fetch", cbPartialFetch.isChecked()); args.putBoolean("ignore_size", cbIgnoreSize.isChecked()); - args.putBoolean("use_date", cbUseDate.isChecked()); args.putSerializable("drafts", drafts); args.putSerializable("sent", sent); @@ -839,7 +836,6 @@ public class FragmentAccount extends FragmentBase { String interval = args.getString("interval"); boolean partial_fetch = args.getBoolean("partial_fetch"); boolean ignore_size = args.getBoolean("ignore_size"); - boolean use_date = args.getBoolean("use_date"); EntityFolder drafts = (EntityFolder) args.getSerializable("drafts"); EntityFolder sent = (EntityFolder) args.getSerializable("sent"); @@ -927,8 +923,6 @@ public class FragmentAccount extends FragmentBase { return true; if (!Objects.equals(account.ignore_size, ignore_size)) return true; - if (!Objects.equals(account.use_date, use_date)) - return true; EntityFolder edrafts = db.folder().getFolderByType(account.id, EntityFolder.DRAFTS); if (!Objects.equals(edrafts == null ? null : edrafts.id, drafts == null ? null : drafts.id)) @@ -1052,7 +1046,6 @@ public class FragmentAccount extends FragmentBase { account.poll_interval = Integer.parseInt(interval); account.partial_fetch = partial_fetch; account.ignore_size = ignore_size; - account.use_date = use_date; if (!update) account.created = now; @@ -1398,7 +1391,6 @@ public class FragmentAccount extends FragmentBase { etInterval.setText(account == null ? "" : Long.toString(account.poll_interval)); cbPartialFetch.setChecked(account == null ? true : account.partial_fetch); cbIgnoreSize.setChecked(account == null ? false : account.ignore_size); - cbUseDate.setChecked(account == null ? false : account.use_date); auth = (account == null ? EmailService.AUTH_TYPE_PASSWORD : account.auth_type); provider = (account == null ? null : account.provider); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index bbc0c5dc81..c3a4ac3d01 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -668,13 +668,11 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. boolean compact = prefs.getBoolean("compact", false); int zoom = prefs.getInt("view_zoom", compact ? 0 : 1); String sort = prefs.getString("sort", "time"); - boolean ascending = prefs.getBoolean( - viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); boolean filter_duplicates = prefs.getBoolean("filter_duplicates", true); adapter = new AdapterMessage( this, type, found, viewType, - compact, zoom, sort, ascending, filter_duplicates, + compact, zoom, sort, filter_duplicates, iProperties); rvMessage.setAdapter(adapter); @@ -3072,6 +3070,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. public void onPrepareOptionsMenu(Menu menu) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); String sort = prefs.getString("sort", "time"); + boolean use_sent_time = prefs.getBoolean("use_sent_time", false); boolean ascending = prefs.getBoolean( viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); boolean filter_seen = prefs.getBoolean("filter_seen", false); @@ -3135,6 +3134,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. menu.findItem(R.id.menu_sort_on_attachments).setChecked(true); else if ("snoozed".equals(sort)) menu.findItem(R.id.menu_sort_on_snoozed).setChecked(true); + menu.findItem(R.id.menu_use_sent_time).setChecked(use_sent_time); menu.findItem(R.id.menu_ascending).setChecked(ascending); menu.findItem(R.id.menu_filter).setVisible(viewType != AdapterMessage.ViewType.SEARCH && !outbox); @@ -3227,6 +3227,10 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. onMenuSort("snoozed"); return true; + case R.id.menu_use_sent_time: + onMenuUseSentTime(!item.isChecked()); + return true; + case R.id.menu_ascending: onMenuAscending(!item.isChecked()); return true; @@ -3303,11 +3307,17 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. loadMessages(true); } + private void onMenuUseSentTime(boolean use_sent_time) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + prefs.edit().putBoolean("use_sent_time", use_sent_time).apply(); + getActivity().invalidateOptionsMenu(); + loadMessages(true); + } + private void onMenuAscending(boolean ascending) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); prefs.edit().putBoolean( viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", ascending).apply(); - adapter.setAscending(ascending); getActivity().invalidateOptionsMenu(); loadMessages(true); } diff --git a/app/src/main/java/eu/faircode/email/TupleAccountState.java b/app/src/main/java/eu/faircode/email/TupleAccountState.java index 977005665d..a9daa640f8 100644 --- a/app/src/main/java/eu/faircode/email/TupleAccountState.java +++ b/app/src/main/java/eu/faircode/email/TupleAccountState.java @@ -42,7 +42,6 @@ public class TupleAccountState extends EntityAccount { this.poll_interval.equals(other.poll_interval) && this.partial_fetch.equals(other.partial_fetch) && this.ignore_size.equals(other.ignore_size) && - this.use_date.equals(other.use_date) && this.folders == other.folders && Objects.equals(this.tbd, other.tbd)); } else diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 442bf6def1..a7351237b3 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -92,7 +92,7 @@ public class ViewModelMessages extends ViewModel { db.message().pagedUnified( args.type, args.threading, - args.sort, args.ascending, + args.sort, args.use_sent_time, args.ascending, args.filter_seen, args.filter_unflagged, args.filter_unknown, @@ -111,7 +111,7 @@ public class ViewModelMessages extends ViewModel { builder = new LivePagedListBuilder<>( db.message().pagedFolder( args.folder, args.threading, - args.sort, args.ascending, + args.sort, args.use_sent_time, args.ascending, args.filter_seen, args.filter_unflagged, args.filter_unknown, @@ -127,7 +127,7 @@ public class ViewModelMessages extends ViewModel { db.message().pagedThread( args.account, args.thread, args.threading ? null : args.id, - args.ascending, + args.use_sent_time, args.ascending, args.debug), LOCAL_PAGE_SIZE); break; @@ -141,7 +141,7 @@ public class ViewModelMessages extends ViewModel { db.message().pagedUnified( null, args.threading, - "time", false, + "time", args.use_sent_time, false, false, false, false, false, true, args.debug), @@ -150,7 +150,7 @@ public class ViewModelMessages extends ViewModel { builder = new LivePagedListBuilder<>( db.message().pagedFolder( args.folder, args.threading, - "time", false, + "time", args.use_sent_time, false, false, false, false, false, true, args.debug), @@ -314,6 +314,7 @@ public class ViewModelMessages extends ViewModel { private boolean threading; private String sort; + private boolean use_sent_time; private boolean ascending; private boolean filter_seen; private boolean filter_unflagged; @@ -338,6 +339,7 @@ public class ViewModelMessages extends ViewModel { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); this.threading = prefs.getBoolean("threading", true); this.sort = prefs.getString("sort", "time"); + this.use_sent_time = prefs.getBoolean("use_sent_time", false); this.ascending = prefs.getBoolean( viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); this.filter_seen = prefs.getBoolean("filter_seen", false); @@ -361,6 +363,7 @@ public class ViewModelMessages extends ViewModel { this.threading == other.threading && Objects.equals(this.sort, other.sort) && + this.use_sent_time == other.use_sent_time && this.ascending == other.ascending && this.filter_seen == other.filter_seen && this.filter_unflagged == other.filter_unflagged && @@ -378,7 +381,7 @@ public class ViewModelMessages extends ViewModel { " thread=" + thread + ":" + id + " query=" + query + ":" + server + "" + " threading=" + threading + - " sort=" + sort + ":" + ascending + + " sort=" + sort + ":" + use_sent_time + ":" + ascending + " filter seen=" + filter_seen + " unflagged=" + filter_unflagged + " unknown=" + filter_unknown + diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index e399cfe640..02ceb9a7c3 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -526,15 +526,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvPartialFetchRemark" /> - -