Added sort on sent time

pull/174/head
M66B 6 years ago
parent 16dd351cc8
commit 0e37fd6b5b

@ -174,7 +174,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private boolean compact; private boolean compact;
private int zoom; private int zoom;
private String sort; private String sort;
private boolean ascending;
private boolean filter_duplicates; private boolean filter_duplicates;
private IProperties properties; private IProperties properties;
@ -4095,7 +4094,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
AdapterMessage(Fragment parentFragment, AdapterMessage(Fragment parentFragment,
String type, boolean found, ViewType viewType, String type, boolean found, ViewType viewType,
boolean compact, int zoom, String sort, boolean ascending, boolean filter_duplicates, boolean compact, int zoom, String sort, boolean filter_duplicates,
final IProperties properties) { final IProperties properties) {
this.parentFragment = parentFragment; this.parentFragment = parentFragment;
this.type = type; this.type = type;
@ -4104,7 +4103,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
this.compact = compact; this.compact = compact;
this.zoom = zoom; this.zoom = zoom;
this.sort = sort; this.sort = sort;
this.ascending = ascending;
this.filter_duplicates = filter_duplicates; this.filter_duplicates = filter_duplicates;
this.properties = properties; this.properties = properties;
@ -4278,10 +4276,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
return this.sort; return this.sort;
} }
void setAscending(boolean ascending) {
this.ascending = ascending;
}
void setFilterDuplicates(boolean filter_duplicates) { void setFilterDuplicates(boolean filter_duplicates) {
if (this.filter_duplicates != filter_duplicates) { if (this.filter_duplicates != filter_duplicates) {
this.filter_duplicates = filter_duplicates; this.filter_duplicates = filter_duplicates;

@ -124,7 +124,6 @@ class Core {
private static final int SYNC_BATCH_SIZE = 20; private static final int SYNC_BATCH_SIZE = 20;
private static final int DOWNLOAD_BATCH_SIZE = 20; private static final int DOWNLOAD_BATCH_SIZE = 20;
private static final long YIELD_DURATION = 200L; // milliseconds private static final long YIELD_DURATION = 200L; // milliseconds
private static final long FUTURE_RECEIVED = 30 * 24 * 3600 * 1000L; // milliseconds
static void processOperations( static void processOperations(
Context context, Context context,
@ -2064,17 +2063,6 @@ class Core {
} }
if (message == null) { 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(); String authentication = helper.getAuthentication();
MessageHelper.MessageParts parts = helper.getMessageParts(context); MessageHelper.MessageParts parts = helper.getMessageParts(context);
@ -2113,8 +2101,8 @@ class Core {
message.content = false; message.content = false;
message.encrypt = parts.getEncryption(); message.encrypt = parts.getEncryption();
message.ui_encrypt = message.encrypt; message.ui_encrypt = message.encrypt;
message.received = received; message.received = helper.getReceived();
message.sent = sent; message.sent = helper.getSent();
message.seen = seen; message.seen = seen;
message.answered = answered; message.answered = answered;
message.flagged = flagged; message.flagged = flagged;

@ -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" + " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" +
" ELSE 0" + " ELSE 0" +
" END" + " 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) @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
DataSource.Factory<Integer, TupleMessageEx> pagedUnified( DataSource.Factory<Integer, TupleMessageEx> pagedUnified(
String type, String type,
boolean threading, 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 filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
boolean found, boolean found,
boolean debug); 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" + " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" +
" ELSE 0" + " ELSE 0" +
" END" + " 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) @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
DataSource.Factory<Integer, TupleMessageEx> pagedFolder( DataSource.Factory<Integer, TupleMessageEx> pagedFolder(
long folder, boolean threading, 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 filter_seen, boolean filter_unflagged, boolean filter_unknown, boolean filter_snoozed,
boolean found, boolean found,
boolean debug); boolean debug);
@ -180,7 +182,8 @@ public interface DaoMessage {
" AND message.thread = :thread" + " AND message.thread = :thread" +
" AND (:id IS NULL OR message.id = :id)" + " AND (:id IS NULL OR message.id = :id)" +
" AND (NOT message.ui_hide OR :debug)" + " 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" + ", CASE" +
" WHEN folder.type = '" + EntityFolder.INBOX + "' THEN 1" + " WHEN folder.type = '" + EntityFolder.INBOX + "' THEN 1" +
" WHEN folder.type = '" + EntityFolder.OUTBOX + "' THEN 2" + " WHEN folder.type = '" + EntityFolder.OUTBOX + "' THEN 2" +
@ -193,7 +196,8 @@ public interface DaoMessage {
" WHEN folder.type = '" + EntityFolder.JUNK + "' THEN 9" + " WHEN folder.type = '" + EntityFolder.JUNK + "' THEN 9" +
" ELSE 999 END") " ELSE 999 END")
// The folder type sort order should match the duplicate algorithm // The folder type sort order should match the duplicate algorithm
DataSource.Factory<Integer, TupleMessageEx> pagedThread(long account, String thread, Long id, boolean ascending, boolean debug); DataSource.Factory<Integer, TupleMessageEx> pagedThread(
long account, String thread, Long id, boolean use_sent_time, boolean ascending, boolean debug);
@Query("SELECT account.name AS accountName" + @Query("SELECT account.name AS accountName" +
", COUNT(message.id) AS count" + ", COUNT(message.id) AS count" +

@ -117,7 +117,7 @@ public class EntityAccount extends EntityOrder implements Serializable {
@NonNull @NonNull
public Boolean ignore_size = false; public Boolean ignore_size = false;
@NonNull @NonNull
public Boolean use_date = false; public Boolean use_date = false; // Obsolete
public String prefix; // namespace, obsolete public String prefix; // namespace, obsolete
public Long quota_usage; public Long quota_usage;

@ -110,7 +110,6 @@ public class FragmentAccount extends FragmentBase {
private EditText etInterval; private EditText etInterval;
private CheckBox cbPartialFetch; private CheckBox cbPartialFetch;
private CheckBox cbIgnoreSize; private CheckBox cbIgnoreSize;
private CheckBox cbUseDate;
private Button btnCheck; private Button btnCheck;
private ContentLoadingProgressBar pbCheck; private ContentLoadingProgressBar pbCheck;
@ -218,7 +217,6 @@ public class FragmentAccount extends FragmentBase {
etInterval = view.findViewById(R.id.etInterval); etInterval = view.findViewById(R.id.etInterval);
cbPartialFetch = view.findViewById(R.id.cbPartialFetch); cbPartialFetch = view.findViewById(R.id.cbPartialFetch);
cbIgnoreSize = view.findViewById(R.id.cbIgnoreSize); cbIgnoreSize = view.findViewById(R.id.cbIgnoreSize);
cbUseDate = view.findViewById(R.id.cbUseDate);
btnCheck = view.findViewById(R.id.btnCheck); btnCheck = view.findViewById(R.id.btnCheck);
pbCheck = view.findViewById(R.id.pbCheck); pbCheck = view.findViewById(R.id.pbCheck);
@ -778,7 +776,6 @@ public class FragmentAccount extends FragmentBase {
args.putString("interval", etInterval.getText().toString()); args.putString("interval", etInterval.getText().toString());
args.putBoolean("partial_fetch", cbPartialFetch.isChecked()); args.putBoolean("partial_fetch", cbPartialFetch.isChecked());
args.putBoolean("ignore_size", cbIgnoreSize.isChecked()); args.putBoolean("ignore_size", cbIgnoreSize.isChecked());
args.putBoolean("use_date", cbUseDate.isChecked());
args.putSerializable("drafts", drafts); args.putSerializable("drafts", drafts);
args.putSerializable("sent", sent); args.putSerializable("sent", sent);
@ -839,7 +836,6 @@ public class FragmentAccount extends FragmentBase {
String interval = args.getString("interval"); String interval = args.getString("interval");
boolean partial_fetch = args.getBoolean("partial_fetch"); boolean partial_fetch = args.getBoolean("partial_fetch");
boolean ignore_size = args.getBoolean("ignore_size"); boolean ignore_size = args.getBoolean("ignore_size");
boolean use_date = args.getBoolean("use_date");
EntityFolder drafts = (EntityFolder) args.getSerializable("drafts"); EntityFolder drafts = (EntityFolder) args.getSerializable("drafts");
EntityFolder sent = (EntityFolder) args.getSerializable("sent"); EntityFolder sent = (EntityFolder) args.getSerializable("sent");
@ -927,8 +923,6 @@ public class FragmentAccount extends FragmentBase {
return true; return true;
if (!Objects.equals(account.ignore_size, ignore_size)) if (!Objects.equals(account.ignore_size, ignore_size))
return true; return true;
if (!Objects.equals(account.use_date, use_date))
return true;
EntityFolder edrafts = db.folder().getFolderByType(account.id, EntityFolder.DRAFTS); EntityFolder edrafts = db.folder().getFolderByType(account.id, EntityFolder.DRAFTS);
if (!Objects.equals(edrafts == null ? null : edrafts.id, drafts == null ? null : drafts.id)) 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.poll_interval = Integer.parseInt(interval);
account.partial_fetch = partial_fetch; account.partial_fetch = partial_fetch;
account.ignore_size = ignore_size; account.ignore_size = ignore_size;
account.use_date = use_date;
if (!update) if (!update)
account.created = now; account.created = now;
@ -1398,7 +1391,6 @@ public class FragmentAccount extends FragmentBase {
etInterval.setText(account == null ? "" : Long.toString(account.poll_interval)); etInterval.setText(account == null ? "" : Long.toString(account.poll_interval));
cbPartialFetch.setChecked(account == null ? true : account.partial_fetch); cbPartialFetch.setChecked(account == null ? true : account.partial_fetch);
cbIgnoreSize.setChecked(account == null ? false : account.ignore_size); 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); auth = (account == null ? EmailService.AUTH_TYPE_PASSWORD : account.auth_type);
provider = (account == null ? null : account.provider); provider = (account == null ? null : account.provider);

@ -668,13 +668,11 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
boolean compact = prefs.getBoolean("compact", false); boolean compact = prefs.getBoolean("compact", false);
int zoom = prefs.getInt("view_zoom", compact ? 0 : 1); int zoom = prefs.getInt("view_zoom", compact ? 0 : 1);
String sort = prefs.getString("sort", "time"); 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); boolean filter_duplicates = prefs.getBoolean("filter_duplicates", true);
adapter = new AdapterMessage( adapter = new AdapterMessage(
this, type, found, viewType, this, type, found, viewType,
compact, zoom, sort, ascending, filter_duplicates, compact, zoom, sort, filter_duplicates,
iProperties); iProperties);
rvMessage.setAdapter(adapter); rvMessage.setAdapter(adapter);
@ -3072,6 +3070,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
public void onPrepareOptionsMenu(Menu menu) { public void onPrepareOptionsMenu(Menu menu) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String sort = prefs.getString("sort", "time"); String sort = prefs.getString("sort", "time");
boolean use_sent_time = prefs.getBoolean("use_sent_time", false);
boolean ascending = prefs.getBoolean( boolean ascending = prefs.getBoolean(
viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false);
boolean filter_seen = prefs.getBoolean("filter_seen", 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); menu.findItem(R.id.menu_sort_on_attachments).setChecked(true);
else if ("snoozed".equals(sort)) else if ("snoozed".equals(sort))
menu.findItem(R.id.menu_sort_on_snoozed).setChecked(true); 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_ascending).setChecked(ascending);
menu.findItem(R.id.menu_filter).setVisible(viewType != AdapterMessage.ViewType.SEARCH && !outbox); 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"); onMenuSort("snoozed");
return true; return true;
case R.id.menu_use_sent_time:
onMenuUseSentTime(!item.isChecked());
return true;
case R.id.menu_ascending: case R.id.menu_ascending:
onMenuAscending(!item.isChecked()); onMenuAscending(!item.isChecked());
return true; return true;
@ -3303,11 +3307,17 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
loadMessages(true); 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) { private void onMenuAscending(boolean ascending) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
prefs.edit().putBoolean( prefs.edit().putBoolean(
viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", ascending).apply(); viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", ascending).apply();
adapter.setAscending(ascending);
getActivity().invalidateOptionsMenu(); getActivity().invalidateOptionsMenu();
loadMessages(true); loadMessages(true);
} }

@ -42,7 +42,6 @@ public class TupleAccountState extends EntityAccount {
this.poll_interval.equals(other.poll_interval) && this.poll_interval.equals(other.poll_interval) &&
this.partial_fetch.equals(other.partial_fetch) && this.partial_fetch.equals(other.partial_fetch) &&
this.ignore_size.equals(other.ignore_size) && this.ignore_size.equals(other.ignore_size) &&
this.use_date.equals(other.use_date) &&
this.folders == other.folders && this.folders == other.folders &&
Objects.equals(this.tbd, other.tbd)); Objects.equals(this.tbd, other.tbd));
} else } else

@ -92,7 +92,7 @@ public class ViewModelMessages extends ViewModel {
db.message().pagedUnified( db.message().pagedUnified(
args.type, args.type,
args.threading, args.threading,
args.sort, args.ascending, args.sort, args.use_sent_time, args.ascending,
args.filter_seen, args.filter_seen,
args.filter_unflagged, args.filter_unflagged,
args.filter_unknown, args.filter_unknown,
@ -111,7 +111,7 @@ public class ViewModelMessages extends ViewModel {
builder = new LivePagedListBuilder<>( builder = new LivePagedListBuilder<>(
db.message().pagedFolder( db.message().pagedFolder(
args.folder, args.threading, args.folder, args.threading,
args.sort, args.ascending, args.sort, args.use_sent_time, args.ascending,
args.filter_seen, args.filter_seen,
args.filter_unflagged, args.filter_unflagged,
args.filter_unknown, args.filter_unknown,
@ -127,7 +127,7 @@ public class ViewModelMessages extends ViewModel {
db.message().pagedThread( db.message().pagedThread(
args.account, args.thread, args.account, args.thread,
args.threading ? null : args.id, args.threading ? null : args.id,
args.ascending, args.use_sent_time, args.ascending,
args.debug), LOCAL_PAGE_SIZE); args.debug), LOCAL_PAGE_SIZE);
break; break;
@ -141,7 +141,7 @@ public class ViewModelMessages extends ViewModel {
db.message().pagedUnified( db.message().pagedUnified(
null, null,
args.threading, args.threading,
"time", false, "time", args.use_sent_time, false,
false, false, false, false, false, false, false, false,
true, true,
args.debug), args.debug),
@ -150,7 +150,7 @@ public class ViewModelMessages extends ViewModel {
builder = new LivePagedListBuilder<>( builder = new LivePagedListBuilder<>(
db.message().pagedFolder( db.message().pagedFolder(
args.folder, args.threading, args.folder, args.threading,
"time", false, "time", args.use_sent_time, false,
false, false, false, false, false, false, false, false,
true, true,
args.debug), args.debug),
@ -314,6 +314,7 @@ public class ViewModelMessages extends ViewModel {
private boolean threading; private boolean threading;
private String sort; private String sort;
private boolean use_sent_time;
private boolean ascending; private boolean ascending;
private boolean filter_seen; private boolean filter_seen;
private boolean filter_unflagged; private boolean filter_unflagged;
@ -338,6 +339,7 @@ public class ViewModelMessages extends ViewModel {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.threading = prefs.getBoolean("threading", true); this.threading = prefs.getBoolean("threading", true);
this.sort = prefs.getString("sort", "time"); this.sort = prefs.getString("sort", "time");
this.use_sent_time = prefs.getBoolean("use_sent_time", false);
this.ascending = prefs.getBoolean( this.ascending = prefs.getBoolean(
viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false); viewType == AdapterMessage.ViewType.THREAD ? "ascending_thread" : "ascending_list", false);
this.filter_seen = prefs.getBoolean("filter_seen", false); this.filter_seen = prefs.getBoolean("filter_seen", false);
@ -361,6 +363,7 @@ public class ViewModelMessages extends ViewModel {
this.threading == other.threading && this.threading == other.threading &&
Objects.equals(this.sort, other.sort) && Objects.equals(this.sort, other.sort) &&
this.use_sent_time == other.use_sent_time &&
this.ascending == other.ascending && this.ascending == other.ascending &&
this.filter_seen == other.filter_seen && this.filter_seen == other.filter_seen &&
this.filter_unflagged == other.filter_unflagged && this.filter_unflagged == other.filter_unflagged &&
@ -378,7 +381,7 @@ public class ViewModelMessages extends ViewModel {
" thread=" + thread + ":" + id + " thread=" + thread + ":" + id +
" query=" + query + ":" + server + "" + " query=" + query + ":" + server + "" +
" threading=" + threading + " threading=" + threading +
" sort=" + sort + ":" + ascending + " sort=" + sort + ":" + use_sent_time + ":" + ascending +
" filter seen=" + filter_seen + " filter seen=" + filter_seen +
" unflagged=" + filter_unflagged + " unflagged=" + filter_unflagged +
" unknown=" + filter_unknown + " unknown=" + filter_unknown +

@ -526,15 +526,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPartialFetchRemark" /> app:layout_constraintTop_toBottomOf="@id/tvPartialFetchRemark" />
<CheckBox
android:id="@+id/cbUseDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_use_date"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbIgnoreSize" />
<!-- check --> <!-- check -->
<Button <Button
@ -545,7 +536,7 @@
android:tag="disable" android:tag="disable"
android:text="@string/title_check" android:text="@string/title_check"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbUseDate" /> app:layout_constraintTop_toBottomOf="@id/cbIgnoreSize" />
<eu.faircode.email.ContentLoadingProgressBar <eu.faircode.email.ContentLoadingProgressBar
android:id="@+id/pbCheck" android:id="@+id/pbCheck"
@ -920,7 +911,7 @@
cbBrowse,tvBrowseHint, cbBrowse,tvBrowseHint,
cbAutoSeen, cbAutoSeen,
tvInterval,etInterval,tvIntervalRemark, tvInterval,etInterval,tvIntervalRemark,
cbPartialFetch,tvPartialFetchRemark,cbIgnoreSize,cbUseDate" /> cbPartialFetch,tvPartialFetchRemark,cbIgnoreSize" />
<androidx.constraintlayout.widget.Group <androidx.constraintlayout.widget.Group
android:id="@+id/grpFolders" android:id="@+id/grpFolders"

@ -50,6 +50,10 @@
android:id="@+id/menu_sort_on_snoozed" android:id="@+id/menu_sort_on_snoozed"
android:title="@string/title_sort_on_hidden" /> android:title="@string/title_sort_on_hidden" />
</group> </group>
<item
android:id="@+id/menu_use_sent_time"
android:checkable="true"
android:title="@string/title_sort_sent_time" />
<item <item
android:id="@+id/menu_ascending" android:id="@+id/menu_ascending"
android:checkable="true" android:checkable="true"

@ -832,6 +832,7 @@
<string name="title_sort_on_size">Size</string> <string name="title_sort_on_size">Size</string>
<string name="title_sort_on_attachments">Attachments</string> <string name="title_sort_on_attachments">Attachments</string>
<string name="title_sort_on_hidden">Hidden</string> <string name="title_sort_on_hidden">Hidden</string>
<string name="title_sort_sent_time">Use sent time</string>
<string name="title_sort_ascending">Oldest first</string> <string name="title_sort_ascending">Oldest first</string>
<string name="title_filter">Filter out</string> <string name="title_filter">Filter out</string>

Loading…
Cancel
Save