diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java index ad4f8013e..62394690e 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java @@ -319,6 +319,12 @@ public class HabitCardListAdapter preferences.setDefaultOrder(order); } + @Override + public HabitList.Order getOrder() + { + return cache.getOrder(); + } + /** * Selects or deselects the item at a given position. * 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 84916f322..436016664 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 @@ -244,9 +244,12 @@ public abstract class HabitList implements Iterable public enum Order { - BY_NAME, - BY_COLOR, - BY_SCORE, + BY_NAME_ASC, + BY_NAME_DESC, + BY_COLOR_ASC, + BY_COLOR_DESC, + BY_SCORE_ASC, + BY_SCORE_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 80a6d514a..7dd31a65f 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 @@ -120,37 +120,49 @@ public class MemoryHabitList extends HabitList private Comparator getComparatorByOrder(Order order) { - Comparator nameComparator = - (h1, h2) -> h1.getName().compareTo(h2.getName()); + Comparator nameComparatorAsc = + (h1, h2) -> h1.getName().compareTo(h2.getName()); - Comparator colorComparator = (h1, h2) -> + Comparator nameComparatorDesc = + (h1, h2) -> nameComparatorAsc.compare(h2, h1); + + Comparator colorComparatorAsc = (h1, h2) -> { Integer c1 = h1.getColor(); Integer c2 = h2.getColor(); - if (c1.equals(c2)) return nameComparator.compare(h1, h2); + if (c1.equals(c2)) return nameComparatorAsc.compare(h1, h2); else return c1.compareTo(c2); }; - Comparator scoreComparator = (h1, h2) -> + Comparator colorComparatorDesc = + (h1, h2) -> colorComparatorAsc.compare(h2, h1); + + Comparator scoreComparatorDesc = (h1, h2) -> { Double s1 = h1.getScores().getTodayValue(); Double s2 = h2.getScores().getTodayValue(); - if (s1.equals(s2)) return nameComparator.compare(h1, h2); + if (s1.equals(s2)) return nameComparatorAsc.compare(h1, h2); else return s2.compareTo(s1); }; + Comparator scoreComparatorAsc = + (h1, h2) -> scoreComparatorDesc.compare(h2, h1); + Comparator positionComparator = (h1, h2) -> { Integer p1 = h1.getPosition(); Integer p2 = h2.getPosition(); - if (p1.equals(p2)) return nameComparator.compare(h1, h2); + if (p1.equals(p2)) return nameComparatorAsc.compare(h1, h2); else return p1.compareTo(p2); }; if (order == BY_POSITION) return positionComparator; - if (order == BY_NAME) return nameComparator; - if (order == BY_COLOR) return colorComparator; - if (order == BY_SCORE) return scoreComparator; + if (order == BY_NAME_ASC) return nameComparatorAsc; + if (order == BY_NAME_DESC) return nameComparatorDesc; + if (order == BY_COLOR_ASC) return colorComparatorAsc; + if (order == BY_COLOR_DESC) return colorComparatorDesc; + if (order == BY_SCORE_DESC) return scoreComparatorDesc; + if (order == BY_SCORE_ASC) return scoreComparatorAsc; 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 9714a7522..ad0607a4c 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 @@ -97,7 +97,11 @@ public class ListHabitsMenuBehavior public void onSortByColor() { - adapter.setOrder(HabitList.Order.BY_COLOR); + if (adapter.getOrder() != HabitList.Order.BY_COLOR_ASC) { + adapter.setOrder(HabitList.Order.BY_COLOR_ASC); + } else { + adapter.setOrder(HabitList.Order.BY_COLOR_DESC); + } } public void onSortByManually() @@ -107,12 +111,20 @@ public class ListHabitsMenuBehavior public void onSortByScore() { - adapter.setOrder(HabitList.Order.BY_SCORE); + if (adapter.getOrder() != HabitList.Order.BY_SCORE_DESC) { + adapter.setOrder(HabitList.Order.BY_SCORE_DESC); + } else { + adapter.setOrder(HabitList.Order.BY_SCORE_ASC); + } } public void onSortByName() { - adapter.setOrder(HabitList.Order.BY_NAME); + if (adapter.getOrder() != HabitList.Order.BY_NAME_ASC) { + adapter.setOrder(HabitList.Order.BY_NAME_ASC); + } else { + adapter.setOrder(HabitList.Order.BY_NAME_DESC); + } } public void onToggleNightMode() @@ -137,6 +149,8 @@ public class ListHabitsMenuBehavior void setFilter(HabitMatcher build); void setOrder(HabitList.Order order); + + HabitList.Order getOrder(); } public interface Screen diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java index a7b490b24..da482150a 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java @@ -144,7 +144,13 @@ public class HabitListTest extends BaseUnitTest assertThat(list.getByPosition(2), equalTo(h4)); assertThat(list.getByPosition(3), equalTo(h2)); - list.setOrder(BY_NAME); + list.setOrder(BY_NAME_DESC); + assertThat(list.getByPosition(0), equalTo(h4)); + assertThat(list.getByPosition(1), equalTo(h3)); + assertThat(list.getByPosition(2), equalTo(h2)); + assertThat(list.getByPosition(3), equalTo(h1)); + + list.setOrder(BY_NAME_ASC); assertThat(list.getByPosition(0), equalTo(h1)); assertThat(list.getByPosition(1), equalTo(h2)); assertThat(list.getByPosition(2), equalTo(h3)); @@ -154,12 +160,18 @@ public class HabitListTest extends BaseUnitTest list.add(h1); assertThat(list.getByPosition(0), equalTo(h1)); - list.setOrder(BY_COLOR); + list.setOrder(BY_COLOR_ASC); assertThat(list.getByPosition(0), equalTo(h3)); assertThat(list.getByPosition(1), equalTo(h4)); assertThat(list.getByPosition(2), equalTo(h1)); assertThat(list.getByPosition(3), equalTo(h2)); + list.setOrder(BY_COLOR_DESC); + assertThat(list.getByPosition(0), equalTo(h2)); + assertThat(list.getByPosition(1), equalTo(h1)); + assertThat(list.getByPosition(2), equalTo(h4)); + assertThat(list.getByPosition(3), equalTo(h3)); + list.setOrder(BY_POSITION); assertThat(list.getByPosition(0), equalTo(h3)); assertThat(list.getByPosition(1), equalTo(h1)); @@ -284,7 +296,7 @@ public class HabitListTest extends BaseUnitTest @Test public void testReorder_onSortedList() throws Exception { - habitList.setOrder(BY_SCORE); + habitList.setOrder(BY_SCORE_DESC); Habit h1 = habitsArray.get(1); Habit h2 = habitsArray.get(2); thrown.expect(IllegalStateException.class); diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java index b2f036cbc..f1011f583 100644 --- a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/preferences/PreferencesTest.java @@ -77,8 +77,8 @@ public class PreferencesTest extends BaseUnitTest { assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION)); - prefs.setDefaultOrder(HabitList.Order.BY_SCORE); - assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_SCORE)); + prefs.setDefaultOrder(HabitList.Order.BY_SCORE_DESC); + assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_SCORE_DESC)); storage.putString("pref_default_order", "BOGUS"); assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION)); 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 429878df5..a6191933d 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 @@ -104,7 +104,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest { behavior.onSortByColor(); verify(adapter).setOrder(orderCaptor.capture()); - assertThat(orderCaptor.getValue(), equalTo(BY_COLOR)); + assertThat(orderCaptor.getValue(), equalTo(BY_COLOR_ASC)); } @Test @@ -120,7 +120,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest { behavior.onSortByScore(); verify(adapter).setOrder(orderCaptor.capture()); - assertThat(orderCaptor.getValue(), equalTo(BY_SCORE)); + assertThat(orderCaptor.getValue(), equalTo(BY_SCORE_DESC)); } @Test @@ -128,7 +128,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest { behavior.onSortByName(); verify(adapter).setOrder(orderCaptor.capture()); - assertThat(orderCaptor.getValue(), equalTo(BY_NAME)); + assertThat(orderCaptor.getValue(), equalTo(BY_NAME_ASC)); } @Test