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());
}