diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index 74f2f0d89..793a5354e 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -104,6 +104,11 @@ class ListHabitsMenu @Inject constructor( return true } + R.id.actionSortPriority -> { + behavior.onSortByPriority() + return true + } + else -> return false } } diff --git a/android/uhabits-android/src/main/res/menu/list_habits.xml b/android/uhabits-android/src/main/res/menu/list_habits.xml index f74b910e2..27abd2f45 100644 --- a/android/uhabits-android/src/main/res/menu/list_habits.xml +++ b/android/uhabits-android/src/main/res/menu/list_habits.xml @@ -65,6 +65,10 @@ + + diff --git a/android/uhabits-android/src/main/res/values/strings.xml b/android/uhabits-android/src/main/res/values/strings.xml index 964faf8a6..1cd2b7912 100644 --- a/android/uhabits-android/src/main/res/values/strings.xml +++ b/android/uhabits-android/src/main/res/values/strings.xml @@ -159,6 +159,7 @@ By name By color By score + By priority Export Press-and-hold to change the value Change value diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java index 436016664..1b06cdb73 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java @@ -250,6 +250,8 @@ public abstract class HabitList implements Iterable BY_COLOR_DESC, BY_SCORE_ASC, BY_SCORE_DESC, - BY_POSITION + BY_PRIORITY_ASC, + BY_PRIORITY_DESC, + BY_POSITION; } } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java index 60f05ee3a..497833c64 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java @@ -157,6 +157,24 @@ public class MemoryHabitList extends HabitList else return p1.compareTo(p2); }; + Comparator priorityComparatorDesc = (h1, h2) -> + { + if (h1.isCompletedToday() != h2.isCompletedToday()) { + return h1.isCompletedToday() ? -1 : 1; + } + + if (h1.isNumerical() != h2.isNumerical()) { + return h1.isNumerical() ? -1 : 1; + } + + Integer v1 = h1.getCheckmarks().getToday().getValue(); + Integer v2 = h2.getCheckmarks().getToday().getValue(); + + return v2.compareTo(v1); + }; + + Comparator priorityComparatorAsc = (h1, h2) -> priorityComparatorDesc.compare(h2, h1); + if (order == BY_POSITION) return positionComparator; if (order == BY_NAME_ASC) return nameComparatorAsc; if (order == BY_NAME_DESC) return nameComparatorDesc; @@ -164,6 +182,8 @@ public class MemoryHabitList extends HabitList if (order == BY_COLOR_DESC) return colorComparatorDesc; if (order == BY_SCORE_DESC) return scoreComparatorDesc; if (order == BY_SCORE_ASC) return scoreComparatorAsc; + if (order == BY_PRIORITY_DESC) return priorityComparatorDesc; + if (order == BY_PRIORITY_ASC) return priorityComparatorAsc; throw new IllegalStateException(); } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java index ad0607a4c..03c281982 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java @@ -127,6 +127,14 @@ public class ListHabitsMenuBehavior } } + public void onSortByPriority() { + if (adapter.getOrder() != HabitList.Order.BY_PRIORITY_ASC) { + adapter.setOrder(HabitList.Order.BY_PRIORITY_ASC); + } else { + adapter.setOrder(HabitList.Order.BY_PRIORITY_DESC); + } + } + public void onToggleNightMode() { themeSwitcher.toggleNightMode(); diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java index a6191933d..f4a7a8125 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java @@ -131,6 +131,14 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest assertThat(orderCaptor.getValue(), equalTo(BY_NAME_ASC)); } + @Test + public void testOnSortPriority() + { + behavior.onSortByPriority(); + verify(adapter).setOrder(orderCaptor.capture()); + assertThat(orderCaptor.getValue(), equalTo(BY_PRIORITY_DESC)); + } + @Test public void testOnToggleShowArchived() {