diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java index 39154b529..8ba500981 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java @@ -88,6 +88,11 @@ public abstract class ListHabitsSteps clickViewWithId(R.id.action_filter); clickText(R.string.hide_completed); break; + + case TOGGLE_ENTERED: + clickViewWithId(R.id.action_filter); + clickText(R.string.hide_entered); + break; } } @@ -156,6 +161,6 @@ public abstract class ListHabitsSteps public enum MenuItem { ABOUT, HELP, SETTINGS, EDIT, DELETE, ARCHIVE, TOGGLE_ARCHIVED, - UNARCHIVE, TOGGLE_COMPLETED, ADD + UNARCHIVE, TOGGLE_COMPLETED, TOGGLE_ENTERED, ADD } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index 74f2f0d89..0ba088a45 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -39,10 +39,12 @@ class ListHabitsMenu @Inject constructor( val nightModeItem = menu.findItem(R.id.actionToggleNightMode) val hideArchivedItem = menu.findItem(R.id.actionHideArchived) val hideCompletedItem = menu.findItem(R.id.actionHideCompleted) + val hideEnteredItem = menu.findItem(R.id.actionHideEntered) nightModeItem.isChecked = themeSwitcher.isNightMode hideArchivedItem.isChecked = !preferences.showArchived hideCompletedItem.isChecked = !preferences.showCompleted + hideEnteredItem.isChecked = !preferences.showEntered } override fun onItemSelected(item: MenuItem): Boolean { @@ -84,6 +86,12 @@ class ListHabitsMenu @Inject constructor( return true } + R.id.actionHideEntered -> { + behavior.onToggleShowEntered() + invalidate() + return true + } + R.id.actionSortColor -> { behavior.onSortByColor() return true diff --git a/android/uhabits-android/src/main/res/menu/list_habits.xml b/android/uhabits-android/src/main/res/menu/list_habits.xml index f74b910e2..e7b224e7a 100644 --- a/android/uhabits-android/src/main/res/menu/list_habits.xml +++ b/android/uhabits-android/src/main/res/menu/list_habits.xml @@ -48,6 +48,12 @@ android:enabled="true" android:title="@string/hide_completed"/> + + Filter Hide completed Hide archived + Hide entered Make notifications sticky Prevents notifications from being swiped away. Notification light diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java index cf9565007..d1920234e 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java @@ -334,6 +334,13 @@ public class Habit else return (todayCheckmark != UNCHECKED && todayCheckmark != UNCHECKED_EXPLICITLY_NECESSARY); } + public synchronized boolean isEnteredToday() + { + int todayCheckmark = getCheckmarks().getTodayValue(); + if (isNumerical()) return todayCheckmark > 0; + else return (todayCheckmark != UNCHECKED && todayCheckmark != CHECKED_IMPLICITLY); + } + public synchronized boolean isNumerical() { return data.type == NUMBER_HABIT; diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java index d2b1801b2..2ffc7b472 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java @@ -32,13 +32,17 @@ public class HabitMatcher private final boolean completedAllowed; + private final boolean enteredAllowed; + public HabitMatcher(boolean allowArchived, boolean reminderRequired, - boolean completedAllowed) + boolean completedAllowed, + boolean enteredAllowed) { this.archivedAllowed = allowArchived; this.reminderRequired = reminderRequired; this.completedAllowed = completedAllowed; + this.enteredAllowed = enteredAllowed; } public boolean isArchivedAllowed() @@ -51,6 +55,11 @@ public class HabitMatcher return completedAllowed; } + public boolean isEnteredAllowed() + { + return enteredAllowed; + } + public boolean isReminderRequired() { return reminderRequired; @@ -61,6 +70,7 @@ public class HabitMatcher if (!isArchivedAllowed() && habit.isArchived()) return false; if (isReminderRequired() && !habit.hasReminder()) return false; if (!isCompletedAllowed() && habit.isCompletedToday()) return false; + if (!isEnteredAllowed() && habit.isEnteredToday()) return false; return true; } } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java index 9939816e2..f14c2a004 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java @@ -27,10 +27,12 @@ public class HabitMatcherBuilder private boolean completedAllowed = true; + private boolean enteredAllowed = true; + public HabitMatcher build() { return new HabitMatcher(archivedAllowed, reminderRequired, - completedAllowed); + completedAllowed, enteredAllowed); } public HabitMatcherBuilder setArchivedAllowed(boolean archivedAllowed) @@ -45,6 +47,12 @@ public class HabitMatcherBuilder return this; } + public HabitMatcherBuilder setEnteredAllowed(boolean enteredAllowed) + { + this.enteredAllowed = enteredAllowed; + return this; + } + public HabitMatcherBuilder setReminderRequired(boolean reminderRequired) { this.reminderRequired = reminderRequired; 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 e9d1e31cd..326898037 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 @@ -141,6 +141,16 @@ public class Preferences storage.putBoolean("pref_show_completed", showCompleted); } + public boolean getShowEntered() + { + return storage.getBoolean("pref_show_entered", true); + } + + public void setShowEntered(boolean showEntered) + { + storage.putBoolean("pref_show_entered", showEntered); + } + public long getSnoozeInterval() { return Long.parseLong(storage.getString("pref_snooze_interval", "15")); 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 ad0607a4c..02ca9d87a 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 @@ -45,6 +45,8 @@ public class ListHabitsMenuBehavior private boolean showArchived; + private boolean showEntered; + @Inject public ListHabitsMenuBehavior(@NonNull Screen screen, @NonNull Adapter adapter, @@ -58,6 +60,7 @@ public class ListHabitsMenuBehavior showCompleted = preferences.getShowCompleted(); showArchived = preferences.getShowArchived(); + showEntered = preferences.getShowEntered(); updateAdapterFilter(); } @@ -95,6 +98,13 @@ public class ListHabitsMenuBehavior updateAdapterFilter(); } + public void onToggleShowEntered() + { + showEntered = !showEntered; + preferences.setShowEntered(showEntered); + updateAdapterFilter(); + } + public void onSortByColor() { if (adapter.getOrder() != HabitList.Order.BY_COLOR_ASC) { @@ -138,6 +148,7 @@ public class ListHabitsMenuBehavior adapter.setFilter(new HabitMatcherBuilder() .setArchivedAllowed(showArchived) .setCompletedAllowed(showCompleted) + .setEnteredAllowed(showEntered) .build()); adapter.refresh(); }