diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 73bfcee6a9..89bac188cf 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -72,6 +72,7 @@ import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -86,6 +87,7 @@ public class AdapterFolder extends RecyclerView.Adapter ids) { disabledIds = ids; } @@ -1187,6 +1197,14 @@ public class AdapterFolder extends RecyclerView.Adapter 0) Collections.sort(folders, folders.get(0).getComparator(context)); hierarchical = folders; + + if (sort_unread_atop) + Collections.sort(hierarchical, new Comparator() { + @Override + public int compare(TupleFolderEx f1, TupleFolderEx f2) { + return -Boolean.compare(f1.unseen > 0, f2.unseen > 0); + } + }); } else { List parents = new ArrayList<>(); Map idFolder = new HashMap<>(); @@ -1235,7 +1253,7 @@ public class AdapterFolder extends RecyclerView.Adapter items; @@ -1325,19 +1343,27 @@ public class AdapterFolder extends RecyclerView.Adapter getHierarchical(List parents, int indentation) { + private List getHierarchical(List parents, int indentation, boolean sort_unread_atop) { List result = new ArrayList<>(); if (parents.size() > 0) Collections.sort(parents, parents.get(0).getComparator(context)); + if (sort_unread_atop) + Collections.sort(parents, new Comparator() { + @Override + public int compare(TupleFolderEx f1, TupleFolderEx f2) { + return -Boolean.compare(f1.unseen > 0, f2.unseen > 0); + } + }); + for (TupleFolderEx parent : parents) { if (parent.hide && !show_hidden) continue; List childs = null; if (parent.child_refs != null) { - childs = getHierarchical(parent.child_refs, indentation + 1); + childs = getHierarchical(parent.child_refs, indentation + 1, sort_unread_atop); for (TupleFolderEx child : childs) { parent.childs_unseen += child.unseen; if (child.collapsed) diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index fc16a98116..fd3ec068cf 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -527,6 +527,7 @@ public class FragmentFolders extends FragmentBase { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); boolean subscriptions = prefs.getBoolean("subscriptions", false); boolean subscribed_only = prefs.getBoolean("subscribed_only", false); + boolean sort_unread_atop = prefs.getBoolean("sort_unread_atop", false); menu.findItem(R.id.menu_unified).setVisible(account < 0 || primary); menu.findItem(R.id.menu_theme).setVisible(account < 0 || primary); @@ -535,6 +536,7 @@ public class FragmentFolders extends FragmentBase { menu.findItem(R.id.menu_show_flagged).setChecked(show_flagged); menu.findItem(R.id.menu_subscribed_only).setChecked(subscribed_only); menu.findItem(R.id.menu_subscribed_only).setVisible(subscriptions); + menu.findItem(R.id.menu_sort_unread_atop).setChecked(sort_unread_atop); menu.findItem(R.id.menu_apply_all).setVisible(account >= 0 && imap); super.onPrepareOptionsMenu(menu); @@ -564,6 +566,9 @@ public class FragmentFolders extends FragmentBase { } else if (itemId == R.id.menu_subscribed_only) { onMenuSubscribedOnly(); return true; + } else if (itemId == R.id.menu_sort_unread_atop) { + onMenuSortUnreadAtop(); + return true; } else if (itemId == R.id.menu_search_folder) { onMenuSearchFolder(item); return true; @@ -657,6 +662,14 @@ public class FragmentFolders extends FragmentBase { adapter.setSubscribedOnly(subscribed_only); } + private void onMenuSortUnreadAtop() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + boolean sort_unread_atop = !prefs.getBoolean("sort_unread_atop", false); + prefs.edit().putBoolean("sort_unread_atop", sort_unread_atop).apply(); + getActivity().invalidateOptionsMenu(); + adapter.setSortUnreadAtop(sort_unread_atop); + } + private void onMenuSearchFolder(MenuItem item) { if (item.isActionViewExpanded()) item.collapseActionView(); diff --git a/app/src/main/res/menu/menu_folders.xml b/app/src/main/res/menu/menu_folders.xml index 7b94db34f8..cc15dca676 100644 --- a/app/src/main/res/menu/menu_folders.xml +++ b/app/src/main/res/menu/menu_folders.xml @@ -47,6 +47,12 @@ android:checkable="true" android:title="@string/title_subscribed_only" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d831e9069..26fa8e1563 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -913,6 +913,7 @@ Show hidden folders Show starred message count Subscribed only + Sort unread on top Search for folder Apply to all Hide folder