Allow user to sort habits in reverse order

Closes #556, closes #497
pull/610/head
Alinson S. Xavier 5 years ago
parent acb5051eec
commit 3e99d821a5

@ -319,6 +319,12 @@ public class HabitCardListAdapter
preferences.setDefaultOrder(order); preferences.setDefaultOrder(order);
} }
@Override
public HabitList.Order getOrder()
{
return cache.getOrder();
}
/** /**
* Selects or deselects the item at a given position. * Selects or deselects the item at a given position.
* *

@ -244,9 +244,12 @@ public abstract class HabitList implements Iterable<Habit>
public enum Order public enum Order
{ {
BY_NAME, BY_NAME_ASC,
BY_COLOR, BY_NAME_DESC,
BY_SCORE, BY_COLOR_ASC,
BY_COLOR_DESC,
BY_SCORE_ASC,
BY_SCORE_DESC,
BY_POSITION BY_POSITION
} }
} }

@ -120,37 +120,49 @@ public class MemoryHabitList extends HabitList
private Comparator<Habit> getComparatorByOrder(Order order) private Comparator<Habit> getComparatorByOrder(Order order)
{ {
Comparator<Habit> nameComparator = Comparator<Habit> nameComparatorAsc =
(h1, h2) -> h1.getName().compareTo(h2.getName()); (h1, h2) -> h1.getName().compareTo(h2.getName());
Comparator<Habit> colorComparator = (h1, h2) -> Comparator<Habit> nameComparatorDesc =
(h1, h2) -> nameComparatorAsc.compare(h2, h1);
Comparator<Habit> colorComparatorAsc = (h1, h2) ->
{ {
Integer c1 = h1.getColor(); Integer c1 = h1.getColor();
Integer c2 = h2.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); else return c1.compareTo(c2);
}; };
Comparator<Habit> scoreComparator = (h1, h2) -> Comparator<Habit> colorComparatorDesc =
(h1, h2) -> colorComparatorAsc.compare(h2, h1);
Comparator<Habit> scoreComparatorDesc = (h1, h2) ->
{ {
Double s1 = h1.getScores().getTodayValue(); Double s1 = h1.getScores().getTodayValue();
Double s2 = h2.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); else return s2.compareTo(s1);
}; };
Comparator<Habit> scoreComparatorAsc =
(h1, h2) -> scoreComparatorDesc.compare(h2, h1);
Comparator<Habit> positionComparator = (h1, h2) -> Comparator<Habit> positionComparator = (h1, h2) ->
{ {
Integer p1 = h1.getPosition(); Integer p1 = h1.getPosition();
Integer p2 = h2.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); else return p1.compareTo(p2);
}; };
if (order == BY_POSITION) return positionComparator; if (order == BY_POSITION) return positionComparator;
if (order == BY_NAME) return nameComparator; if (order == BY_NAME_ASC) return nameComparatorAsc;
if (order == BY_COLOR) return colorComparator; if (order == BY_NAME_DESC) return nameComparatorDesc;
if (order == BY_SCORE) return scoreComparator; 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(); throw new IllegalStateException();
} }

@ -97,7 +97,11 @@ public class ListHabitsMenuBehavior
public void onSortByColor() 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() public void onSortByManually()
@ -107,12 +111,20 @@ public class ListHabitsMenuBehavior
public void onSortByScore() 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() 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() public void onToggleNightMode()
@ -137,6 +149,8 @@ public class ListHabitsMenuBehavior
void setFilter(HabitMatcher build); void setFilter(HabitMatcher build);
void setOrder(HabitList.Order order); void setOrder(HabitList.Order order);
HabitList.Order getOrder();
} }
public interface Screen public interface Screen

@ -144,7 +144,13 @@ public class HabitListTest extends BaseUnitTest
assertThat(list.getByPosition(2), equalTo(h4)); assertThat(list.getByPosition(2), equalTo(h4));
assertThat(list.getByPosition(3), equalTo(h2)); 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(0), equalTo(h1));
assertThat(list.getByPosition(1), equalTo(h2)); assertThat(list.getByPosition(1), equalTo(h2));
assertThat(list.getByPosition(2), equalTo(h3)); assertThat(list.getByPosition(2), equalTo(h3));
@ -154,12 +160,18 @@ public class HabitListTest extends BaseUnitTest
list.add(h1); list.add(h1);
assertThat(list.getByPosition(0), equalTo(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(0), equalTo(h3));
assertThat(list.getByPosition(1), equalTo(h4)); assertThat(list.getByPosition(1), equalTo(h4));
assertThat(list.getByPosition(2), equalTo(h1)); assertThat(list.getByPosition(2), equalTo(h1));
assertThat(list.getByPosition(3), equalTo(h2)); 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); list.setOrder(BY_POSITION);
assertThat(list.getByPosition(0), equalTo(h3)); assertThat(list.getByPosition(0), equalTo(h3));
assertThat(list.getByPosition(1), equalTo(h1)); assertThat(list.getByPosition(1), equalTo(h1));
@ -284,7 +296,7 @@ public class HabitListTest extends BaseUnitTest
@Test @Test
public void testReorder_onSortedList() throws Exception public void testReorder_onSortedList() throws Exception
{ {
habitList.setOrder(BY_SCORE); habitList.setOrder(BY_SCORE_DESC);
Habit h1 = habitsArray.get(1); Habit h1 = habitsArray.get(1);
Habit h2 = habitsArray.get(2); Habit h2 = habitsArray.get(2);
thrown.expect(IllegalStateException.class); thrown.expect(IllegalStateException.class);

@ -77,8 +77,8 @@ public class PreferencesTest extends BaseUnitTest
{ {
assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION)); assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION));
prefs.setDefaultOrder(HabitList.Order.BY_SCORE); prefs.setDefaultOrder(HabitList.Order.BY_SCORE_DESC);
assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_SCORE)); assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_SCORE_DESC));
storage.putString("pref_default_order", "BOGUS"); storage.putString("pref_default_order", "BOGUS");
assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION)); assertThat(prefs.getDefaultOrder(), equalTo(HabitList.Order.BY_POSITION));

@ -104,7 +104,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest
{ {
behavior.onSortByColor(); behavior.onSortByColor();
verify(adapter).setOrder(orderCaptor.capture()); verify(adapter).setOrder(orderCaptor.capture());
assertThat(orderCaptor.getValue(), equalTo(BY_COLOR)); assertThat(orderCaptor.getValue(), equalTo(BY_COLOR_ASC));
} }
@Test @Test
@ -120,7 +120,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest
{ {
behavior.onSortByScore(); behavior.onSortByScore();
verify(adapter).setOrder(orderCaptor.capture()); verify(adapter).setOrder(orderCaptor.capture());
assertThat(orderCaptor.getValue(), equalTo(BY_SCORE)); assertThat(orderCaptor.getValue(), equalTo(BY_SCORE_DESC));
} }
@Test @Test
@ -128,7 +128,7 @@ public class ListHabitsMenuBehaviorTest extends BaseUnitTest
{ {
behavior.onSortByName(); behavior.onSortByName();
verify(adapter).setOrder(orderCaptor.capture()); verify(adapter).setOrder(orderCaptor.capture());
assertThat(orderCaptor.getValue(), equalTo(BY_NAME)); assertThat(orderCaptor.getValue(), equalTo(BY_NAME_ASC));
} }
@Test @Test

Loading…
Cancel
Save