From 7db6f600fbd77ed48bcb93b252d68321dddc578a Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Tue, 17 Nov 2020 23:40:32 +0100 Subject: [PATCH] Remember previous sort method as a secondary ordering --- .../isoron/uhabits/core/models/Checkmark.java | 5 +++++ .../isoron/uhabits/core/models/HabitList.java | 2 +- .../core/models/memory/MemoryHabitList.java | 20 +++++++++++++++++-- .../habits/list/ListHabitsMenuBehavior.java | 6 +++--- .../list/ListHabitsMenuBehaviorTest.java | 2 +- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java index a3150e150..c41e8838b 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java @@ -31,6 +31,11 @@ import static org.isoron.uhabits.core.utils.StringUtils.defaultToStringStyle; * While repetitions simply record that the habit was performed at a given date, * a checkmark provides more information, such as whether a repetition was * expected at that day or not. + *

+ *

+ * Note that the priority comparator in + * {@link org.isoron.uhabits.core.models.memory.MemoryHabitList} + * relies on SKIP > YES_MANUAL > YES_AUTO > NO. *

* Checkmarks are computed automatically from the list of repetitions. */ 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 1b06cdb73..baccbb877 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 @@ -252,6 +252,6 @@ public abstract class HabitList implements Iterable BY_SCORE_DESC, BY_PRIORITY_ASC, BY_PRIORITY_DESC, - BY_POSITION; + 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 497833c64..3bcc611b1 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 @@ -40,6 +40,9 @@ public class MemoryHabitList extends HabitList @NonNull private Order order = Order.BY_POSITION; + @NonNull + private Order previousOrder = Order.BY_POSITION; + @Nullable private MemoryHabitList parent = null; @@ -113,14 +116,27 @@ public class MemoryHabitList extends HabitList @Override public synchronized void setOrder(@NonNull Order order) { + this.previousOrder = this.order; this.order = order; - this.comparator = getComparatorByOrder(order); + this.comparator = getComposedComparatorByOrder(order, this.previousOrder); resort(); getObservable().notifyListeners(); } - private Comparator getComparatorByOrder(Order order) + private Comparator getComposedComparatorByOrder(Order firstOrder, Order secondOrder) { + return (h1, h2) -> { + int firstResult = getComparatorByOrder(firstOrder).compare(h1, h2); + + if (firstResult != 0 || secondOrder == null) { + return firstResult; + } + + return getComparatorByOrder(secondOrder).compare(h1, h2); + }; + } + + private Comparator getComparatorByOrder(Order order) { Comparator nameComparatorAsc = (h1, h2) -> h1.getName().compareTo(h2.getName()); 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 2ca3ba6c5..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 @@ -128,10 +128,10 @@ public class ListHabitsMenuBehavior } public void onSortByPriority() { - if (adapter.getOrder() != HabitList.Order.BY_PRIORITY_DESC) { - adapter.setOrder(HabitList.Order.BY_PRIORITY_DESC); - } else { + if (adapter.getOrder() != HabitList.Order.BY_PRIORITY_ASC) { adapter.setOrder(HabitList.Order.BY_PRIORITY_ASC); + } else { + adapter.setOrder(HabitList.Order.BY_PRIORITY_DESC); } } 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 f4a7a8125..202d8b7ab 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 @@ -136,7 +136,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest { behavior.onSortByPriority(); verify(adapter).setOrder(orderCaptor.capture()); - assertThat(orderCaptor.getValue(), equalTo(BY_PRIORITY_DESC)); + assertThat(orderCaptor.getValue(), equalTo(BY_PRIORITY_ASC)); } @Test