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()
{