diff --git a/app/src/main/java/org/isoron/uhabits/BaseComponent.java b/app/src/main/java/org/isoron/uhabits/BaseComponent.java index feb93f511..86ca692ef 100644 --- a/app/src/main/java/org/isoron/uhabits/BaseComponent.java +++ b/app/src/main/java/org/isoron/uhabits/BaseComponent.java @@ -95,4 +95,6 @@ public interface BaseComponent void inject(BaseWidget baseWidget); void inject(WidgetUpdater widgetManager); + + void inject(ListHabitsMenu listHabitsMenu); } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsActivity.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsActivity.java index d4440c178..f5d54179f 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsActivity.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsActivity.java @@ -61,17 +61,6 @@ public class ListHabitsActivity extends BaseActivity system = new BaseSystem(this); adapter = new HabitCardListAdapter(habits, checkmarkCount); -// List colors = new ArrayList<>(); -// colors.add(0); -// colors.add(1); -// colors.add(2); -// -// HabitMatcher matcher = new HabitMatcherBuilder() -// .setArchivedAllowed(false) -// .setAllowedColors(colors) -// .build(); -// adapter.setFilter(matcher); - rootView = new ListHabitsRootView(this, adapter); screen = new ListHabitsScreen(this, rootView); menu = new ListHabitsMenu(this, screen, adapter); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsMenu.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsMenu.java index b518a33be..d4017e366 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsMenu.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsMenu.java @@ -19,32 +19,43 @@ package org.isoron.uhabits.ui.habits.list; -import android.support.annotation.NonNull; -import android.view.Menu; -import android.view.MenuItem; +import android.support.annotation.*; +import android.view.*; -import org.isoron.uhabits.R; -import org.isoron.uhabits.ui.BaseActivity; -import org.isoron.uhabits.ui.BaseMenu; +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.*; import org.isoron.uhabits.ui.habits.list.model.*; -import org.isoron.uhabits.utils.InterfaceUtils; +import org.isoron.uhabits.utils.*; + +import javax.inject.*; public class ListHabitsMenu extends BaseMenu { @NonNull private final ListHabitsScreen screen; + private final HabitCardListAdapter adapter; + private boolean showArchived; - private final HabitCardListAdapter adapter; + private boolean showCompleted; + + @Inject + Preferences preferences; public ListHabitsMenu(@NonNull BaseActivity activity, @NonNull ListHabitsScreen screen, @NonNull HabitCardListAdapter adapter) { super(activity); + HabitsApplication.getComponent().inject(this); this.screen = screen; this.adapter = adapter; + + showCompleted = preferences.getShowCompleted(); + showArchived = preferences.getShowArchived(); + updateAdapterFilter(); } @Override @@ -55,6 +66,9 @@ public class ListHabitsMenu extends BaseMenu MenuItem showArchivedItem = menu.findItem(R.id.action_show_archived); showArchivedItem.setChecked(showArchived); + + MenuItem showCompletedItem = menu.findItem(R.id.actionShowCompleted); + showCompletedItem.setChecked(showCompleted); } @Override @@ -83,8 +97,12 @@ public class ListHabitsMenu extends BaseMenu return true; case R.id.action_show_archived: - showArchived = !showArchived; - adapter.setShowArchived(showArchived); + toggleShowArchived(); + invalidate(); + return true; + + case R.id.actionShowCompleted: + toggleShowCompleted(); invalidate(); return true; @@ -96,6 +114,28 @@ public class ListHabitsMenu extends BaseMenu @Override protected int getMenuResourceId() { - return R.menu.main_activity; + return R.menu.list_habits; + } + + private void toggleShowArchived() + { + showArchived = !showArchived; + preferences.setShowArchived(showArchived); + updateAdapterFilter(); + } + + private void toggleShowCompleted() + { + showCompleted = !showCompleted; + preferences.setShowCompleted(showCompleted); + updateAdapterFilter(); + } + + private void updateAdapterFilter() + { + adapter.setFilter(new HabitMatcherBuilder() + .setArchivedAllowed(showArchived) + .setCompletedAllowed(showCompleted) + .build()); } } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java index 6edb3be10..e41789c14 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java @@ -172,6 +172,7 @@ public class HabitCardListCache implements CommandRunner.Listener public void setFilter(HabitMatcher matcher) { filteredHabits = allHabits.getFiltered(matcher); + refreshAllHabits(true); } public void setListener(@Nullable Listener listener) diff --git a/app/src/main/java/org/isoron/uhabits/utils/Preferences.java b/app/src/main/java/org/isoron/uhabits/utils/Preferences.java index 73a9e729b..22c631df6 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/Preferences.java +++ b/app/src/main/java/org/isoron/uhabits/utils/Preferences.java @@ -61,6 +61,16 @@ public class Preferences return prefs.getLong("last_hint_timestamp", -1); } + public boolean getShowArchived() + { + return prefs.getBoolean("pref_show_archived", false); + } + + public boolean getShowCompleted() + { + return prefs.getBoolean("pref_show_completed", true); + } + public void incrementLaunchCount() { int count = prefs.getInt("launch_count", 0); @@ -105,6 +115,16 @@ public class Preferences .apply(); } + public void setShowCompleted(boolean showCompleted) + { + prefs.edit().putBoolean("pref_show_completed", showCompleted).apply(); + } + + public void setShowArchived(boolean showArchived) + { + prefs.edit().putBoolean("pref_show_archived", showArchived).apply(); + } + public boolean shouldReverseCheckmarks() { return prefs.getBoolean("pref_checkmark_reverse_order", false); diff --git a/app/src/main/res/drawable-hdpi/ic_action_filter_dark.png b/app/src/main/res/drawable-hdpi/ic_action_filter_dark.png new file mode 100644 index 000000000..7e8a6b536 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_filter_dark.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_filter_light.png b/app/src/main/res/drawable-hdpi/ic_action_filter_light.png new file mode 100644 index 000000000..a966cb9bd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_filter_light.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_filter_dark.png b/app/src/main/res/drawable-mdpi/ic_action_filter_dark.png new file mode 100644 index 000000000..59a2ec755 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_filter_dark.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_filter_light.png b/app/src/main/res/drawable-mdpi/ic_action_filter_light.png new file mode 100644 index 000000000..d86492b42 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_filter_light.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_filter_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_filter_dark.png new file mode 100644 index 000000000..9416c70ec Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_filter_dark.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_filter_light.png b/app/src/main/res/drawable-xhdpi/ic_action_filter_light.png new file mode 100644 index 000000000..b64df3612 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_filter_light.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png new file mode 100644 index 000000000..1263ae82e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_filter_light.png b/app/src/main/res/drawable-xxhdpi/ic_action_filter_light.png new file mode 100644 index 000000000..2314642f9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_filter_light.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png b/app/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png new file mode 100644 index 000000000..cb2207f11 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png b/app/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png new file mode 100644 index 000000000..9319c4bb4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png differ diff --git a/app/src/main/res/layout/filter.xml b/app/src/main/res/layout/filter.xml new file mode 100644 index 000000000..4f53105a2 --- /dev/null +++ b/app/src/main/res/layout/filter.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/list_habits.xml similarity index 75% rename from app/src/main/res/menu/main_activity.xml rename to app/src/main/res/menu/list_habits.xml index 958594485..5ad16cd12 100644 --- a/app/src/main/res/menu/main_activity.xml +++ b/app/src/main/res/menu/list_habits.xml @@ -29,19 +29,31 @@ app:showAsAction="ifRoom"/> + android:id="@+id/action_filter" + android:icon="?iconFilter" + android:title="@string/filter" + app:showAsAction="ifRoom"> + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23f9e3719..b5a25def8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,4 +180,6 @@ Score Reminder sound None + Filter + Show completed \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 94bf2a851..0a71982e7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -56,6 +56,7 @@ @drawable/ic_action_edit_dark @drawable/ic_action_unarchive_dark @drawable/ic_action_color_dark + @drawable/ic_action_filter_dark @drawable/ic_repeat_black @drawable/ic_alarm_black @drawable/ic_action_color_light @@ -106,6 +107,7 @@ @drawable/ic_action_archive_dark @drawable/ic_action_edit_dark @drawable/ic_action_unarchive_dark + @drawable/ic_action_filter_dark @drawable/ic_action_color_dark @drawable/ic_action_color_dark @drawable/ic_repeat_white