diff --git a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java index edb28d55d..912009ece 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java @@ -63,6 +63,8 @@ public class BaseAndroidTest protected AndroidTestComponent component; + protected ModelFactory modelFactory; + @Before public void setUp() { @@ -89,7 +91,7 @@ public class BaseAndroidTest taskRunner = component.getTaskRunner(); logger = component.getHabitsLogger(); - ModelFactory modelFactory = component.getModelFactory(); + modelFactory = component.getModelFactory(); fixtures = new HabitFixtures(modelFactory, habitList); latch = new CountDownLatch(1); diff --git a/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java b/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java index bd5928ecc..7a6e51281 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java +++ b/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java @@ -39,12 +39,18 @@ public class HabitFixtures } public Habit createEmptyHabit() + { + return createEmptyHabit(null); + } + + public Habit createEmptyHabit(Long id) { Habit habit = modelFactory.buildHabit(); habit.setName("Meditate"); habit.setDescription("Did you meditate this morning?"); habit.setColor(3); habit.setFrequency(Frequency.DAILY); + habit.setId(id); habitList.add(habit); return habit; } diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java b/app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java new file mode 100644 index 000000000..92f71a3f4 --- /dev/null +++ b/app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.models; + +import android.support.test.runner.*; +import android.test.suitebuilder.annotation.*; + +import org.hamcrest.*; +import org.isoron.uhabits.*; +import org.junit.*; +import org.junit.runner.*; + +import java.io.*; +import java.util.*; + +import static junit.framework.Assert.*; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.isoron.uhabits.models.HabitList.Order.*; + +@SuppressWarnings("JavaDoc") +@RunWith(AndroidJUnit4.class) +@MediumTest +public class HabitListTest extends BaseAndroidTest +{ + private ArrayList habitsArray; + + private HabitList activeHabits; + + private HabitList reminderHabits; + + @Override + public void setUp() + { + super.setUp(); + habitList.removeAll(); + + habitsArray = new ArrayList<>(); + + for (int i = 0; i < 10; i++) + { + Habit habit = fixtures.createEmptyHabit((long) i); + habitsArray.add(habit); + + if (i % 3 == 0) + habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY)); + + habitList.update(habit); + } + + habitsArray.get(0).setArchived(true); + habitsArray.get(1).setArchived(true); + habitsArray.get(4).setArchived(true); + habitsArray.get(7).setArchived(true); + + activeHabits = habitList.getFiltered(new HabitMatcherBuilder().build()); + + reminderHabits = habitList.getFiltered(new HabitMatcherBuilder() + .setArchivedAllowed(true) + .setReminderRequired(true) + .build()); + } + + @Test + public void test_size() + { + assertThat(habitList.size(), equalTo(10)); + } + + @Test + public void test_countActive() + { + assertThat(activeHabits.size(), equalTo(6)); + } + + @Test + public void test_getByPosition() + { + assertThat(habitList.getByPosition(0), equalTo(habitsArray.get(0))); + assertThat(habitList.getByPosition(3), equalTo(habitsArray.get(3))); + assertThat(habitList.getByPosition(9), equalTo(habitsArray.get(9))); + + assertThat(activeHabits.getByPosition(0), equalTo(habitsArray.get(2))); + } + + @Test + public void test_getHabitsWithReminder() + { + assertThat(reminderHabits.size(), equalTo(4)); + assertThat(reminderHabits.getByPosition(1), + equalTo(habitsArray.get(3))); + } + + @Test + public void test_get_withInvalidId() + { + assertThat(habitList.getById(100L), is(nullValue())); + } + + @Test + public void test_get_withValidId() + { + Habit habit1 = habitsArray.get(0); + Habit habit2 = habitList.getById(habit1.getId()); + assertThat(habit1, equalTo(habit2)); + } + + @Test + public void test_reorder() + { + int operations[][] = { + { 5, 2 }, { 3, 7 }, { 4, 4 }, { 3, 2 } + }; + + int expectedPosition[][] = { + { 0, 1, 3, 4, 5, 2, 6, 7, 8, 9 }, + { 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 }, + { 0, 1, 7, 3, 4, 2, 5, 6, 8, 9 }, + { 0, 1, 7, 2, 4, 3, 5, 6, 8, 9 }, + }; + + for (int i = 0; i < operations.length; i++) + { + int from = operations[i][0]; + int to = operations[i][1]; + + Habit fromHabit = habitList.getByPosition(from); + Habit toHabit = habitList.getByPosition(to); + habitList.reorder(fromHabit, toHabit); + + int actualPositions[] = new int[10]; + + for (int j = 0; j < 10; j++) + { + Habit h = habitList.getById(j); + assertNotNull(h); + actualPositions[j] = habitList.indexOf(h); + } + + assertThat(actualPositions, equalTo(expectedPosition[i])); + } + } + + @Test + public void test_writeCSV() throws IOException + { + habitList.removeAll(); + + Habit h1 = fixtures.createEmptyHabit(); + h1.setName("Meditate"); + h1.setDescription("Did you meditate this morning?"); + h1.setFrequency(Frequency.DAILY); + h1.setColor(3); + + Habit h2 = fixtures.createEmptyHabit(); + h2.setName("Wake up early"); + h2.setDescription("Did you wake up before 6am?"); + h2.setFrequency(new Frequency(2, 3)); + h2.setColor(5); + + habitList.update(h1); + habitList.update(h2); + + String expectedCSV = + "Position,Name,Description,NumRepetitions,Interval,Color\n" + + "001,Meditate,Did you meditate this morning?,1,1,#AFB42B\n" + + "002,Wake up early,Did you wake up before 6am?,2,3,#00897B\n"; + + StringWriter writer = new StringWriter(); + habitList.writeCSV(writer); + + MatcherAssert.assertThat(writer.toString(), equalTo(expectedCSV)); + } + + @Test + public void test_ordering() + { + habitList.removeAll(); + + Habit h3 = fixtures.createEmptyHabit(); + h3.setName("C Habit"); + h3.setColor(0); + habitList.update(h3); + + Habit h1 = fixtures.createEmptyHabit(); + h1.setName("A Habit"); + h1.setColor(2); + habitList.update(h1); + + Habit h4 = fixtures.createEmptyHabit(); + h4.setName("D Habit"); + h4.setColor(1); + habitList.update(h4); + + Habit h2 = fixtures.createEmptyHabit(); + h2.setName("B Habit"); + h2.setColor(2); + habitList.update(h2); + + habitList.setOrder(BY_POSITION); + assertThat(habitList.getByPosition(0), equalTo(h3)); + assertThat(habitList.getByPosition(1), equalTo(h1)); + assertThat(habitList.getByPosition(2), equalTo(h4)); + assertThat(habitList.getByPosition(3), equalTo(h2)); + + habitList.setOrder(BY_NAME); + assertThat(habitList.getByPosition(0), equalTo(h1)); + assertThat(habitList.getByPosition(1), equalTo(h2)); + assertThat(habitList.getByPosition(2), equalTo(h3)); + assertThat(habitList.getByPosition(3), equalTo(h4)); + + habitList.remove(h1); + habitList.add(h1); + assertThat(habitList.getByPosition(0), equalTo(h1)); + + habitList.setOrder(BY_COLOR); + assertThat(habitList.getByPosition(0), equalTo(h3)); + assertThat(habitList.getByPosition(1), equalTo(h4)); + assertThat(habitList.getByPosition(2), equalTo(h1)); + assertThat(habitList.getByPosition(3), equalTo(h2)); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java b/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java index ae51ed1f5..5308fc61c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java @@ -125,17 +125,6 @@ public class SQLiteHabitListTest extends BaseAndroidTest assertThat(habits.get(3).getName(), equalTo("habit 3")); } -// @Test -// public void testGetAll_withoutArchived() -// { -// List habits = habitList.toList(); -// assertThat(habits.size(), equalTo(5)); -// assertThat(habits.get(3).getName(), equalTo("habit 7")); -// -// List another = habitList.toList(); -// assertThat(habits, equalTo(another)); -// } - @Test public void testGetById() { @@ -178,45 +167,6 @@ public class SQLiteHabitListTest extends BaseAndroidTest assertThat(habitList.indexOf(h2), equalTo(-1)); } - @Test - public void test_reorder() - { - // Same as HabitListTest.java - // TODO: remove duplication - - int operations[][] = { - {5, 2}, {3, 7}, {4, 4}, {3, 2} - }; - - int expectedPosition[][] = { - {0, 1, 3, 4, 5, 2, 6, 7, 8, 9}, - {0, 1, 7, 3, 4, 2, 5, 6, 8, 9}, - {0, 1, 7, 3, 4, 2, 5, 6, 8, 9}, - {0, 1, 7, 2, 4, 3, 5, 6, 8, 9}, - }; - - for (int i = 0; i < operations.length; i++) - { - int from = operations[i][0]; - int to = operations[i][1]; - - Habit fromHabit = habitList.getByPosition(from); - Habit toHabit = habitList.getByPosition(to); - habitList.reorder(fromHabit, toHabit); - - int actualPositions[] = new int[10]; - - for (int j = 0; j < 10; j++) - { - Habit h = habitList.getById(j); - assertNotNull(h); - actualPositions[j] = habitList.indexOf(h); - } - - assertThat(actualPositions, equalTo(expectedPosition[i])); - } - } - private HabitRecord getRecord(long id) { return new Select() diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java index dc8fe057d..aa3826c4c 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java @@ -112,6 +112,22 @@ public class ListHabitsMenu extends BaseMenu invalidate(); return true; + case R.id.actionSortColor: + adapter.setOrder(HabitList.Order.BY_COLOR); + return true; + + case R.id.actionSortManual: + adapter.setOrder(HabitList.Order.BY_POSITION); + return true; + + case R.id.actionSortName: + adapter.setOrder(HabitList.Order.BY_NAME); + return true; + + case R.id.actionSortScore: + adapter.setOrder(HabitList.Order.BY_SCORE); + return true; + default: return false; } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java index 71480dee6..7b91c3df8 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java @@ -27,6 +27,7 @@ import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.activities.habits.list.views.*; import org.isoron.uhabits.models.*; +import org.isoron.uhabits.preferences.*; import java.util.*; @@ -55,15 +56,21 @@ public class HabitCardListAdapter @NonNull private final HabitCardListCache cache; + @NonNull + private Preferences preferences; + @Inject - public HabitCardListAdapter(@NonNull HabitCardListCache cache) + public HabitCardListAdapter(@NonNull HabitCardListCache cache, + @NonNull Preferences preferences) { + this.preferences = preferences; this.selected = new LinkedList<>(); this.observable = new ModelObservable(); this.cache = cache; cache.setListener(this); cache.setCheckmarkCount(ListHabitsRootView.MAX_CHECKMARK_COUNT); + cache.setOrder(preferences.getDefaultOrder()); setHasStableIds(true); } @@ -130,6 +137,11 @@ public class HabitCardListAdapter return selected.isEmpty(); } + public boolean isSortable() + { + return cache.getOrder() == HabitList.Order.BY_POSITION; + } + /** * Notify the adapter that it has been attached to a ListView. */ @@ -260,6 +272,12 @@ public class HabitCardListAdapter this.listView = listView; } + public void setOrder(HabitList.Order order) + { + cache.setOrder(order); + preferences.setDefaultOrder(order); + } + /** * Selects or deselects the item at a given position. * diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java index 56356ec3f..fbb4e51a6 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java @@ -107,6 +107,11 @@ public class HabitCardListCache implements CommandRunner.Listener return data.habits.size(); } + public HabitList.Order getOrder() + { + return filteredHabits.getOrder(); + } + public int getScore(long habitId) { return data.scores.get(habitId); @@ -180,6 +185,13 @@ public class HabitCardListCache implements CommandRunner.Listener this.listener = listener; } + public void setOrder(HabitList.Order order) + { + allHabits.setOrder(order); + filteredHabits.setOrder(order); + refreshAllHabits(); + } + /** * Interface definition for a callback to be invoked when the data on the * cache has been modified. diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java index b193da2c9..fab2680eb 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java @@ -168,7 +168,7 @@ public class HabitCardListView extends RecyclerView { int position = holder.getAdapterPosition(); if (controller != null) controller.onItemLongClick(position); - touchHelper.startDrag(holder); + if(adapter.isSortable()) touchHelper.startDrag(holder); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/models/HabitList.java b/app/src/main/java/org/isoron/uhabits/models/HabitList.java index dd2b81f23..444a5824c 100644 --- a/app/src/main/java/org/isoron/uhabits/models/HabitList.java +++ b/app/src/main/java/org/isoron/uhabits/models/HabitList.java @@ -48,9 +48,7 @@ public abstract class HabitList implements Iterable public HabitList() { observable = new ModelObservable(); - filter = new HabitMatcherBuilder() - .setArchivedAllowed(true) - .build(); + filter = new HabitMatcherBuilder().setArchivedAllowed(true).build(); } protected HabitList(@NonNull HabitMatcher filter) @@ -106,6 +104,15 @@ public abstract class HabitList implements Iterable return observable; } + public abstract Order getOrder(); + + /** + * Changes the order of the elements on the list. + * + * @param order the new order criterea + */ + public abstract void setOrder(@NonNull Order order); + /** * Returns the index of the given habit in the list, or -1 if the list does * not contain the habit. @@ -149,7 +156,7 @@ public abstract class HabitList implements Iterable public void repair() { - for(Habit h : this) + for (Habit h : this) { h.getCheckmarks().invalidateNewerThan(0); h.getStreaks().invalidateNewerThan(0); @@ -228,4 +235,12 @@ public abstract class HabitList implements Iterable csv.close(); } + + public enum Order + { + BY_NAME, + BY_COLOR, + BY_SCORE, + BY_POSITION + } } diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java index e014107ce..601852122 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java +++ b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java @@ -25,6 +25,8 @@ import org.isoron.uhabits.models.*; import java.util.*; +import static org.isoron.uhabits.models.HabitList.Order.*; + /** * In-memory implementation of {@link HabitList}. */ @@ -33,16 +35,23 @@ public class MemoryHabitList extends HabitList @NonNull private LinkedList list; + private Comparator comparator = null; + + @NonNull + private Order order; + public MemoryHabitList() { super(); list = new LinkedList<>(); + order = Order.BY_POSITION; } protected MemoryHabitList(@NonNull HabitMatcher matcher) { super(matcher); list = new LinkedList<>(); + order = Order.BY_POSITION; } @Override @@ -57,6 +66,7 @@ public class MemoryHabitList extends HabitList if (id == null) habit.setId((long) list.size()); list.addLast(habit); + resort(); } @Override @@ -82,10 +92,17 @@ public class MemoryHabitList extends HabitList public HabitList getFiltered(HabitMatcher matcher) { MemoryHabitList habits = new MemoryHabitList(matcher); - for(Habit h : this) if (matcher.matches(h)) habits.add(h); + habits.comparator = comparator; + for (Habit h : this) if (matcher.matches(h)) habits.add(h); return habits; } + @Override + public Order getOrder() + { + return order; + } + @Override public int indexOf(@NonNull Habit h) { @@ -112,6 +129,14 @@ public class MemoryHabitList extends HabitList list.add(toPos, from); } + @Override + public void setOrder(@NonNull Order order) + { + this.order = order; + this.comparator = getComparatorByOrder(order); + resort(); + } + @Override public int size() { @@ -123,4 +148,34 @@ public class MemoryHabitList extends HabitList { // NOP } + + private Comparator getComparatorByOrder(Order order) + { + Comparator nameComparator = + (h1, h2) -> h1.getName().compareTo(h2.getName()); + + Comparator colorComparator = (h1, h2) -> { + Integer c1 = h1.getColor(); + Integer c2 = h2.getColor(); + if (c1.equals(c2)) return nameComparator.compare(h1, h2); + else return c1.compareTo(c2); + }; + + Comparator scoreComparator = (h1, h2) -> { + int s1 = h1.getScores().getTodayValue(); + int s2 = h2.getScores().getTodayValue(); + return Integer.compare(s2, s1); + }; + + if (order == BY_POSITION) return null; + if (order == BY_NAME) return nameComparator; + if (order == BY_COLOR) return colorComparator; + if (order == BY_SCORE) return scoreComparator; + throw new IllegalStateException(); + } + + private void resort() + { + if (comparator != null) Collections.sort(list, comparator); + } } diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java index 6541a81d3..da8a6aee5 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java +++ b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java @@ -39,10 +39,15 @@ public class SQLiteHabitList extends HabitList private static SQLiteHabitList instance; + @NonNull private final SQLiteUtils sqlite; + @NonNull private final ModelFactory modelFactory; + @NonNull + private Order order; + public SQLiteHabitList(@NonNull ModelFactory modelFactory) { super(); @@ -50,16 +55,19 @@ public class SQLiteHabitList extends HabitList if (cache == null) cache = new HashMap<>(); sqlite = new SQLiteUtils<>(HabitRecord.class); + order = Order.BY_POSITION; } protected SQLiteHabitList(@NonNull ModelFactory modelFactory, - @NonNull HabitMatcher filter) + @NonNull HabitMatcher filter, + @NonNull Order order) { super(filter); this.modelFactory = modelFactory; if (cache == null) cache = new HashMap<>(); sqlite = new SQLiteUtils<>(HabitRecord.class); + this.order = order; } public static SQLiteHabitList getInstance( @@ -118,7 +126,20 @@ public class SQLiteHabitList extends HabitList @Override public HabitList getFiltered(HabitMatcher filter) { - return new SQLiteHabitList(modelFactory, filter); + return new SQLiteHabitList(modelFactory, filter, order); + } + + @Override + @NonNull + public Order getOrder() + { + return order; + } + + @Override + public void setOrder(@NonNull Order order) + { + this.order = order; } @Override @@ -214,6 +235,13 @@ public class SQLiteHabitList extends HabitList getObservable().notifyListeners(); } + @Override + public void repair() + { + super.repair(); + rebuildOrder(); + } + @Override public int size() { @@ -249,12 +277,38 @@ public class SQLiteHabitList extends HabitList habits.add(habit); } + if(order == Order.BY_SCORE) + { + Collections.sort(habits, (lhs, rhs) -> { + int s1 = lhs.getScores().getTodayValue(); + int s2 = rhs.getScores().getTodayValue(); + return Integer.compare(s2, s1); + }); + } + return habits; } private void appendOrderBy(StringBuilder query) { - query.append("order by position "); + switch (order) + { + case BY_POSITION: + query.append("order by position "); + break; + + case BY_NAME: + case BY_SCORE: + query.append("order by name "); + break; + + case BY_COLOR: + query.append("order by color, name "); + break; + + default: + throw new IllegalStateException(); + } } private void appendSelect(StringBuilder query) @@ -282,11 +336,4 @@ public class SQLiteHabitList extends HabitList appendOrderBy(query); return query.toString(); } - - @Override - public void repair() - { - super.repair(); - rebuildOrder(); - } } diff --git a/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java b/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java index 86e5e5278..e8626aa5f 100644 --- a/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java +++ b/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java @@ -24,6 +24,7 @@ import android.preference.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.models.*; import java.util.*; @@ -61,6 +62,21 @@ public class Preferences return prefs.getInt("pref_default_habit_palette_color", fallbackColor); } + public HabitList.Order getDefaultOrder() + { + String name = prefs.getString("pref_default_order", "BY_POSITION"); + + try + { + return HabitList.Order.valueOf(name); + } + catch (IllegalArgumentException e) + { + setDefaultOrder(HabitList.Order.BY_POSITION); + return HabitList.Order.BY_POSITION; + } + } + public int getDefaultScoreSpinnerPosition() { int defaultScoreInterval = prefs.getInt("pref_score_view_interval", 1); @@ -69,6 +85,11 @@ public class Preferences return defaultScoreInterval; } + public void setDefaultOrder(HabitList.Order order) + { + prefs.edit().putString("pref_default_order", order.name()).apply(); + } + public void setDefaultScoreSpinnerPosition(int position) { prefs.edit().putInt("pref_score_view_interval", position).apply(); diff --git a/app/src/main/res/layout/edit_habit.xml b/app/src/main/res/layout/edit_habit.xml index a8d4b0b95..007fe9500 100644 --- a/app/src/main/res/layout/edit_habit.xml +++ b/app/src/main/res/layout/edit_habit.xml @@ -79,7 +79,7 @@ + style="@style/dialogFormInputLargeNumber"/> + style="@style/dialogFormInputLargeNumber"/> + + + + + + + + + + + + @@ -73,5 +93,4 @@ android:orderInCategory="100" android:title="@string/about" app:showAsAction="never"/> - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d4ac16b9a..9d3f32315 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,4 +196,10 @@ Toggle Action Habit + + Sort + Manually + By name + By color + By score \ No newline at end of file diff --git a/app/src/main/res/values/styles_dialog.xml b/app/src/main/res/values/styles_dialog.xml index 91f07fe20..784a52886 100644 --- a/app/src/main/res/values/styles_dialog.xml +++ b/app/src/main/res/values/styles_dialog.xml @@ -34,13 +34,13 @@ ?android:attr/selectableItemBackground -