From b6c760bc6b6848c9a821f7c1ac9580e3ba53c67f Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 6 Apr 2017 22:02:19 +0200 Subject: [PATCH] add badge to filter menu item --- Habitica/res/drawable/badge_bg.xml | 5 ++ Habitica/res/layout/filter_menu_item.xml | 26 +++++++++ Habitica/res/menu/menu_main_activity.xml | 2 +- .../habitica/helpers/TaskFilterHelper.java | 23 +++++--- .../tasks/BaseTasksRecyclerViewAdapter.java | 8 +-- .../tasks/TaskRecyclerViewFragment.java | 9 +-- .../ui/fragments/tasks/TasksFragment.java | 56 ++++++++++++++++--- 7 files changed, 102 insertions(+), 27 deletions(-) create mode 100644 Habitica/res/drawable/badge_bg.xml create mode 100644 Habitica/res/layout/filter_menu_item.xml diff --git a/Habitica/res/drawable/badge_bg.xml b/Habitica/res/drawable/badge_bg.xml new file mode 100644 index 000000000..c6f2317f4 --- /dev/null +++ b/Habitica/res/drawable/badge_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/filter_menu_item.xml b/Habitica/res/layout/filter_menu_item.xml new file mode 100644 index 000000000..f4c6346e1 --- /dev/null +++ b/Habitica/res/layout/filter_menu_item.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/menu/menu_main_activity.xml b/Habitica/res/menu/menu_main_activity.xml index 5cdacd0e0..a296f32ce 100644 --- a/Habitica/res/menu/menu_main_activity.xml +++ b/Habitica/res/menu/menu_main_activity.xml @@ -13,7 +13,7 @@ - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java index 8722bd04b..f94e22e83 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java @@ -3,14 +3,16 @@ package com.habitrpg.android.habitica.helpers; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by magicmicky on 02/10/15. */ public class TaskFilterHelper { private List tagsId; - private String activeFilter; + private Map activeFilters = new HashMap<>(); public TaskFilterHelper() { tagsId = new ArrayList<>(); @@ -21,8 +23,8 @@ public class TaskFilterHelper { this.tagsId.add(tags); } - public int howMany() { - return this.tagsId.size() + (activeFilter != null ? 1 : 0); + public int howMany(String type) { + return this.tagsId.size() + (activeFilters.get(type) != null ? 1 : 0); } public List getTags() { @@ -38,9 +40,10 @@ public class TaskFilterHelper { } public List filter(List tasks) { - List filtered = new ArrayList(); + List filtered = new ArrayList<>(); + String activeFilter = activeFilters.get(tasks.get(0).type); for (Task task : tasks) { - if (isFiltered(task)) { + if (isFiltered(task, activeFilter)) { filtered.add(task); } } @@ -48,7 +51,7 @@ public class TaskFilterHelper { return filtered; } - private boolean isFiltered(Task task) { + private boolean isFiltered(Task task, String activeFilter) { if (!task.containsAllTagIds(tagsId)) { return false; } @@ -75,7 +78,11 @@ public class TaskFilterHelper { return true; } - public void setActiveFilter(String activeFilter) { - this.activeFilter = activeFilter; + public void setActiveFilter(String type, String activeFilter) { + activeFilters.put(type, activeFilter); + } + + public String getActiveFilter(String type) { + return activeFilters.get(type); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java index d8a05b562..aa42f2a1e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java @@ -35,7 +35,7 @@ public abstract class BaseTasksRecyclerViewAdapter content; protected List filteredContent; - int layoutResource; + private int layoutResource; Context context; private TaskFilterHelper taskFilterHelper; @@ -81,11 +81,11 @@ public abstract class BaseTasksRecyclerViewAdapter(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java index 98abc6b32..7d6aa9379 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java @@ -75,16 +75,14 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli @Nullable private SortableTasksRecyclerViewAdapter.SortTasksCallback sortCallback; private ItemTouchHelper.Callback mItemTouchCallback; - private String activeFilter; - public static TaskRecyclerViewFragment newInstance(@Nullable HabitRPGUser user, String classType, @Nullable String activeFilter, + public static TaskRecyclerViewFragment newInstance(@Nullable HabitRPGUser user, String classType, @Nullable SortableTasksRecyclerViewAdapter.SortTasksCallback sortCallback) { TaskRecyclerViewFragment fragment = new TaskRecyclerViewFragment(); fragment.setRetainInstance(true); fragment.user = user; fragment.classType = classType; fragment.sortCallback = sortCallback; - fragment.activeFilter = activeFilter; return fragment; } @@ -129,8 +127,6 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - taskFilterHelper.setActiveFilter(activeFilter); - mItemTouchCallback = new ItemTouchHelper.Callback() { private Integer mFromPosition = null; @@ -295,8 +291,7 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli } public void setActiveFilter(String activeFilter) { - this.activeFilter = activeFilter; - taskFilterHelper.setActiveFilter(activeFilter); + taskFilterHelper.setActiveFilter(classType, activeFilter); recyclerAdapter.filter(); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index 41188afe2..e1765804c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -9,6 +9,7 @@ import android.support.design.widget.CoordinatorLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.GravityCompat; +import android.support.v4.view.MenuItemCompat; import android.support.v4.view.ViewPager; import android.util.SparseArray; import android.view.LayoutInflater; @@ -18,6 +19,8 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; import com.github.clans.fab.FloatingActionButton; import com.github.clans.fab.FloatingActionMenu; @@ -59,9 +62,9 @@ public class TasksFragment extends BaseMainFragment { MenuItem refreshItem; FloatingActionMenu floatingMenu; SparseArray viewFragmentsDictionary = new SparseArray<>(); - Map activeTaskFilters = new HashMap<>(); private boolean displayingTaskForm; + private TextView filterCountTextView; public void setActivity(MainActivity activity) { super.setActivity(activity); @@ -131,6 +134,11 @@ public class TasksFragment extends BaseMainFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_main_activity, menu); + + RelativeLayout badgeLayout = (RelativeLayout) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); + filterCountTextView = (TextView) badgeLayout.findViewById(R.id.badge_textview); + badgeLayout.setOnClickListener(view -> showFilterDialog()); + updateFilterIcon(); } @Override @@ -157,9 +165,8 @@ public class TasksFragment extends BaseMainFragment { } dialog.setActiveTags(taskFilterHelper.getTags()); String taskType = getActiveFragment().classType; - dialog.setTaskType(taskType, activeTaskFilters.get(taskType)); + dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)); dialog.setListener((activeTaskFilter, activeTags) -> { - activeTaskFilters.put(taskType, activeTaskFilter); int activePos = viewPager.getCurrentItem(); if (activePos >= 1) { viewFragmentsDictionary.get(activePos-1).recyclerAdapter.filter(); @@ -169,6 +176,7 @@ public class TasksFragment extends BaseMainFragment { viewFragmentsDictionary.get(activePos+1).recyclerAdapter.filter(); } taskFilterHelper.setTags(activeTags); + updateFilterIcon(); }); dialog.show(); } @@ -197,16 +205,16 @@ public class TasksFragment extends BaseMainFragment { switch (position) { case 0: - fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_HABIT, activeTaskFilters.get(Task.TYPE_HABIT), sortCallback); + fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_HABIT, sortCallback); break; case 1: - fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_DAILY, activeTaskFilters.get(Task.TYPE_DAILY), sortCallback); + fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_DAILY, sortCallback); break; case 3: - fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_REWARD, null, null); + fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_REWARD, null); break; default: - fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_TODO, activeTaskFilters.get(Task.TYPE_TODO),sortCallback); + fragment = TaskRecyclerViewFragment.newInstance(user, Task.TYPE_TODO,sortCallback); } viewFragmentsDictionary.put(position, fragment); @@ -234,6 +242,39 @@ public class TasksFragment extends BaseMainFragment { return ""; } }); + + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + bottomNavigation.selectTabAtPosition(position); + updateFilterIcon(); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + private void updateFilterIcon() { + int filterCount = 0; + if (getActiveFragment() != null) { + filterCount = taskFilterHelper.howMany(getActiveFragment().classType); + } + if (filterCount == 0) { + filterCountTextView.setText(null); + filterCountTextView.setVisibility(View.GONE); + } else { + filterCountTextView.setText(String.valueOf(filterCount)); + filterCountTextView.setVisibility(View.VISIBLE); + } + } // endregion @@ -284,6 +325,7 @@ public class TasksFragment extends BaseMainFragment { getActiveFragment().onRefresh(); } + @Nullable private TaskRecyclerViewFragment getActiveFragment() { return viewFragmentsDictionary.get(viewPager.getCurrentItem()); }