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 62394690e..b461368c3 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,12 +319,23 @@ public class HabitCardListAdapter preferences.setDefaultOrder(order); } + @Override + public void setPreviousOrder(HabitList.Order order) { + cache.setPreviousOrder(order); + preferences.setDefaultPreviousOrder(order); + } + @Override public HabitList.Order getOrder() { return cache.getOrder(); } + @Override + public HabitList.Order getPreviousOrder() { + return cache.getPreviousOrder(); + } + /** * 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 92228ede6..526d3b258 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 @@ -109,13 +109,22 @@ public abstract class HabitList implements Iterable public abstract Order getOrder(); + public abstract Order getPreviousOrder(); + /** * Changes the order of the elements on the list. * - * @param order the new order criterea + * @param order the new order criterion */ public abstract void setOrder(@NonNull Order order); + /** + * Changes the previous order of the elements on the list. + * + * @param order the new order criterion + */ + public abstract void setPreviousOrder(@NonNull Order order); + /** * Returns the index of the given habit in the list, or -1 if the list does * not contain the habit. @@ -242,6 +251,8 @@ public abstract class HabitList implements Iterable csv.close(); } + + public enum Order { BY_NAME_ASC, 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 17f852f63..c35872314 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 @@ -113,12 +113,26 @@ public class MemoryHabitList extends HabitList return order; } + @Override + public synchronized Order getPreviousOrder() + { + return previousOrder; + } + @Override public synchronized void setOrder(@NonNull Order order) { - this.previousOrder = this.order; this.order = order; - this.comparator = getComposedComparatorByOrder(order, this.previousOrder); + this.comparator = getComposedComparatorByOrder(this.order, this.previousOrder); + resort(); + getObservable().notifyListeners(); + } + + @Override + public void setPreviousOrder(@NonNull Order order) + { + this.previousOrder = order; + this.comparator = getComposedComparatorByOrder(this.order, this.previousOrder); resort(); getObservable().notifyListeners(); } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java index a60f5613d..2a8b66c87 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLiteHabitList.java @@ -121,6 +121,12 @@ public class SQLiteHabitList extends HabitList return list.getOrder(); } + @Override + public Order getPreviousOrder() + { + return list.getPreviousOrder(); + } + @Override public synchronized void setOrder(@NonNull Order order) { @@ -128,6 +134,13 @@ public class SQLiteHabitList extends HabitList getObservable().notifyListeners(); } + @Override + public synchronized void setPreviousOrder(@NonNull Order order) + { + list.setPreviousOrder(order); + getObservable().notifyListeners(); + } + @Override public synchronized int indexOf(@NonNull Habit h) { diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java index 456a997ca..26da634c8 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java @@ -80,6 +80,11 @@ public class Preferences storage.putString("pref_default_order", order.name()); } + public void setDefaultPreviousOrder(HabitList.Order order) + { + storage.putString("pref_default_previous_order", order.name()); + } + public int getDefaultScoreSpinnerPosition() { int defaultScoreInterval = diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java index 86f67c29d..13b43af4f 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java @@ -121,6 +121,11 @@ public class HabitCardListCache implements CommandRunner.Listener return filteredHabits.getOrder(); } + public synchronized HabitList.Order getPreviousOrder() + { + return filteredHabits.getPreviousOrder(); + } + public synchronized double getScore(long habitId) { return data.scores.get(habitId); @@ -204,6 +209,14 @@ public class HabitCardListCache implements CommandRunner.Listener refreshAllHabits(); } + public synchronized void setPreviousOrder(@NonNull HabitList.Order order) + { + allHabits.setPreviousOrder(order); + filteredHabits.setPreviousOrder(order); + refreshAllHabits(); + } + + /** * Interface definition for a callback to be invoked when the data on the * cache has been modified. 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 192923995..696234bc1 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 @@ -95,44 +95,43 @@ public class ListHabitsMenuBehavior updateAdapterFilter(); } - public void onSortByColor() + public void onSortByManually() { - if (adapter.getOrder() != HabitList.Order.BY_COLOR_ASC) { - adapter.setOrder(HabitList.Order.BY_COLOR_ASC); - } else { - adapter.setOrder(HabitList.Order.BY_COLOR_DESC); - } + adapter.setOrder(HabitList.Order.BY_POSITION); } - public void onSortByManually() + public void onSortByColor() { - adapter.setOrder(HabitList.Order.BY_POSITION); + onSortToggleBy(HabitList.Order.BY_COLOR_ASC, HabitList.Order.BY_COLOR_DESC); } + public void onSortByScore() { - if (adapter.getOrder() != HabitList.Order.BY_SCORE_DESC) { - adapter.setOrder(HabitList.Order.BY_SCORE_DESC); - } else { - adapter.setOrder(HabitList.Order.BY_SCORE_ASC); - } + onSortToggleBy(HabitList.Order.BY_SCORE_DESC, HabitList.Order.BY_SCORE_ASC); } public void onSortByName() { - if (adapter.getOrder() != HabitList.Order.BY_NAME_ASC) { - adapter.setOrder(HabitList.Order.BY_NAME_ASC); - } else { - adapter.setOrder(HabitList.Order.BY_NAME_DESC); - } + onSortToggleBy(HabitList.Order.BY_NAME_ASC, HabitList.Order.BY_NAME_DESC); + } + + public void onSortByStatus() + { + onSortToggleBy(HabitList.Order.BY_STATUS_ASC, HabitList.Order.BY_STATUS_DESC); } - public void onSortByStatus() { - if (adapter.getOrder() != HabitList.Order.BY_STATUS_ASC) { - adapter.setOrder(HabitList.Order.BY_STATUS_ASC); + private void onSortToggleBy(HabitList.Order defaultOrder, HabitList.Order reversedOrder) + { + if (adapter.getOrder() != defaultOrder) { + if (adapter.getOrder() != reversedOrder) { + adapter.setPreviousOrder(adapter.getOrder()); + } + adapter.setOrder(defaultOrder); } else { - adapter.setOrder(HabitList.Order.BY_STATUS_DESC); + adapter.setOrder(reversedOrder); } + } public void onToggleNightMode() @@ -158,7 +157,11 @@ public class ListHabitsMenuBehavior void setOrder(HabitList.Order order); + void setPreviousOrder(HabitList.Order order); + HabitList.Order getOrder(); + + HabitList.Order getPreviousOrder(); } public interface Screen