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