mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-09 10:33:41 +02:00
@@ -174,6 +174,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
||||
private boolean compact;
|
||||
private int zoom;
|
||||
private String sort;
|
||||
private boolean ascending;
|
||||
private boolean filter_duplicates;
|
||||
private IProperties properties;
|
||||
|
||||
@@ -4094,7 +4095,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
||||
|
||||
AdapterMessage(Fragment parentFragment,
|
||||
String type, boolean found, ViewType viewType,
|
||||
boolean compact, int zoom, String sort, boolean filter_duplicates,
|
||||
boolean compact, int zoom, String sort, boolean ascending, boolean filter_duplicates,
|
||||
final IProperties properties) {
|
||||
this.parentFragment = parentFragment;
|
||||
this.type = type;
|
||||
@@ -4103,6 +4104,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
||||
this.compact = compact;
|
||||
this.zoom = zoom;
|
||||
this.sort = sort;
|
||||
this.ascending = ascending;
|
||||
this.filter_duplicates = filter_duplicates;
|
||||
this.properties = properties;
|
||||
|
||||
@@ -4276,6 +4278,10 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
||||
return this.sort;
|
||||
}
|
||||
|
||||
void setAscending(boolean ascending) {
|
||||
this.ascending = ascending;
|
||||
}
|
||||
|
||||
void setFilterDuplicates(boolean filter_duplicates) {
|
||||
if (this.filter_duplicates != filter_duplicates) {
|
||||
this.filter_duplicates = filter_duplicates;
|
||||
|
||||
@@ -124,6 +124,7 @@ class Core {
|
||||
private static final int SYNC_BATCH_SIZE = 20;
|
||||
private static final int DOWNLOAD_BATCH_SIZE = 20;
|
||||
private static final long YIELD_DURATION = 200L; // milliseconds
|
||||
private static final long FUTURE_RECEIVED = 30 * 24 * 3600 * 1000L; // milliseconds
|
||||
|
||||
static void processOperations(
|
||||
Context context,
|
||||
@@ -2063,6 +2064,17 @@ class Core {
|
||||
}
|
||||
|
||||
if (message == null) {
|
||||
Long sent = helper.getSent();
|
||||
long received;
|
||||
if (account.use_date)
|
||||
received = (sent == null ? 0 : sent);
|
||||
else {
|
||||
received = helper.getReceived();
|
||||
if (received == 0 || received > new Date().getTime() + FUTURE_RECEIVED)
|
||||
if (sent != null)
|
||||
received = sent;
|
||||
}
|
||||
|
||||
String authentication = helper.getAuthentication();
|
||||
MessageHelper.MessageParts parts = helper.getMessageParts(context);
|
||||
|
||||
@@ -2101,8 +2113,8 @@ class Core {
|
||||
message.content = false;
|
||||
message.encrypt = parts.getEncryption();
|
||||
message.ui_encrypt = message.encrypt;
|
||||
message.received = helper.getReceived();
|
||||
message.sent = helper.getSent();
|
||||
message.received = received;
|
||||
message.sent = sent;
|
||||
message.seen = seen;
|
||||
message.answered = answered;
|
||||
message.flagged = flagged;
|
||||
|
||||
@@ -92,13 +92,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 :use_sent_time THEN message.sent ELSE message.received END" +
|
||||
" * CASE WHEN :ascending THEN 1 ELSE -1 END")
|
||||
", CASE WHEN :ascending THEN message.received ELSE -message.received END")
|
||||
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
||||
DataSource.Factory<Integer, TupleMessageEx> pagedUnified(
|
||||
String type,
|
||||
boolean threading,
|
||||
String sort, boolean use_sent_time, boolean ascending,
|
||||
String sort, boolean ascending,
|
||||
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
|
||||
boolean found,
|
||||
boolean debug);
|
||||
@@ -148,12 +147,11 @@ 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 :use_sent_time THEN message.sent ELSE message.received END" +
|
||||
" * CASE WHEN :ascending THEN 1 ELSE -1 END")
|
||||
", CASE WHEN :ascending THEN message.received ELSE -message.received END")
|
||||
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
||||
DataSource.Factory<Integer, TupleMessageEx> pagedFolder(
|
||||
long folder, boolean threading,
|
||||
String sort, boolean use_sent_time, boolean ascending,
|
||||
String sort, boolean ascending,
|
||||
boolean filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
|
||||
boolean found,
|
||||
boolean debug);
|
||||
@@ -182,8 +180,7 @@ 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 :use_sent_time THEN message.sent ELSE message.received END" +
|
||||
" * CASE WHEN :ascending THEN 1 ELSE -1 END" +
|
||||
" ORDER BY CASE WHEN :ascending THEN message.received ELSE -message.received END" +
|
||||
", CASE" +
|
||||
" WHEN folder.type = '" + EntityFolder.INBOX + "' THEN 1" +
|
||||
" WHEN folder.type = '" + EntityFolder.OUTBOX + "' THEN 2" +
|
||||
@@ -196,8 +193,7 @@ 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<Integer, TupleMessageEx> pagedThread(
|
||||
long account, String thread, Long id, boolean use_sent_time, boolean ascending, boolean debug);
|
||||
DataSource.Factory<Integer, TupleMessageEx> pagedThread(long account, String thread, Long id, boolean ascending, boolean debug);
|
||||
|
||||
@Query("SELECT account.name AS accountName" +
|
||||
", COUNT(message.id) AS count" +
|
||||
|
||||
@@ -117,7 +117,7 @@ public class EntityAccount extends EntityOrder implements Serializable {
|
||||
@NonNull
|
||||
public Boolean ignore_size = false;
|
||||
@NonNull
|
||||
public Boolean use_date = false; // Obsolete
|
||||
public Boolean use_date = false;
|
||||
public String prefix; // namespace, obsolete
|
||||
|
||||
public Long quota_usage;
|
||||
|
||||
@@ -110,6 +110,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
private EditText etInterval;
|
||||
private CheckBox cbPartialFetch;
|
||||
private CheckBox cbIgnoreSize;
|
||||
private CheckBox cbUseDate;
|
||||
|
||||
private Button btnCheck;
|
||||
private ContentLoadingProgressBar pbCheck;
|
||||
@@ -217,6 +218,7 @@ 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);
|
||||
@@ -776,6 +778,7 @@ 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);
|
||||
@@ -836,6 +839,7 @@ 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");
|
||||
@@ -923,6 +927,8 @@ 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))
|
||||
@@ -1046,6 +1052,7 @@ 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;
|
||||
@@ -1391,6 +1398,7 @@ 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);
|
||||
|
||||
@@ -668,11 +668,13 @@ 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, filter_duplicates,
|
||||
compact, zoom, sort, ascending, filter_duplicates,
|
||||
iProperties);
|
||||
rvMessage.setAdapter(adapter);
|
||||
|
||||
@@ -3070,7 +3072,6 @@ 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);
|
||||
@@ -3134,7 +3135,6 @@ 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,10 +3227,6 @@ 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;
|
||||
@@ -3307,17 +3303,11 @@ 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);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ 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
|
||||
|
||||
@@ -92,7 +92,7 @@ public class ViewModelMessages extends ViewModel {
|
||||
db.message().pagedUnified(
|
||||
args.type,
|
||||
args.threading,
|
||||
args.sort, args.use_sent_time, args.ascending,
|
||||
args.sort, 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.use_sent_time, args.ascending,
|
||||
args.sort, 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.use_sent_time, args.ascending,
|
||||
args.ascending,
|
||||
args.debug), LOCAL_PAGE_SIZE);
|
||||
break;
|
||||
|
||||
@@ -141,7 +141,7 @@ public class ViewModelMessages extends ViewModel {
|
||||
db.message().pagedUnified(
|
||||
null,
|
||||
args.threading,
|
||||
"time", args.use_sent_time, false,
|
||||
"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", args.use_sent_time, false,
|
||||
"time", false,
|
||||
false, false, false, false,
|
||||
true,
|
||||
args.debug),
|
||||
@@ -314,7 +314,6 @@ 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;
|
||||
@@ -339,7 +338,6 @@ 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);
|
||||
@@ -363,7 +361,6 @@ 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 &&
|
||||
@@ -381,7 +378,7 @@ public class ViewModelMessages extends ViewModel {
|
||||
" thread=" + thread + ":" + id +
|
||||
" query=" + query + ":" + server + "" +
|
||||
" threading=" + threading +
|
||||
" sort=" + sort + ":" + use_sent_time + ":" + ascending +
|
||||
" sort=" + sort + ":" + ascending +
|
||||
" filter seen=" + filter_seen +
|
||||
" unflagged=" + filter_unflagged +
|
||||
" unknown=" + filter_unknown +
|
||||
|
||||
Reference in New Issue
Block a user