Perform tag filtering in chip provider

gtask_related_email
Alex Baker 6 years ago
parent 4e0c009d5e
commit 8f6b6e54e7

@ -8,9 +8,7 @@ import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import java.util.List; import java.util.List;
import org.tasks.data.TaskContainer; import org.tasks.data.TaskContainer;
@ -23,7 +21,6 @@ public abstract class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewH
private final TaskAdapter adapter; private final TaskAdapter adapter;
private final TaskListFragment taskList; private final TaskListFragment taskList;
private final ViewHolderFactory viewHolderFactory; private final ViewHolderFactory viewHolderFactory;
private final boolean isRemoteList;
private final TaskDao taskDao; private final TaskDao taskDao;
TaskListRecyclerAdapter( TaskListRecyclerAdapter(
@ -34,9 +31,6 @@ public abstract class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewH
this.adapter = adapter; this.adapter = adapter;
this.viewHolderFactory = viewHolderFactory; this.viewHolderFactory = viewHolderFactory;
this.taskList = taskList; this.taskList = taskList;
isRemoteList =
taskList.getFilter() instanceof GtasksFilter
|| taskList.getFilter() instanceof CaldavFilter;
this.taskDao = taskDao; this.taskDao = taskDao;
} }
@ -50,7 +44,7 @@ public abstract class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewH
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
TaskContainer task = getItem(position); TaskContainer task = getItem(position);
if (task != null) { if (task != null) {
holder.bindView(task, isRemoteList, adapter.supportsManualSorting()); holder.bindView(task, taskList.getFilter(), adapter.supportsManualSorting());
holder.setMoving(false); holder.setMoving(false);
int indent = adapter.getIndent(task); int indent = adapter.getIndent(task);
task.setIndent(indent); task.setIndent(indent);

@ -6,9 +6,7 @@ import static com.todoroo.andlib.utility.DateUtilities.getAbbreviatedRelativeDat
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.graphics.Paint; import android.graphics.Paint;
import android.net.Uri;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -22,7 +20,9 @@ import butterknife.OnClick;
import butterknife.OnLongClick; import butterknife.OnLongClick;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup; import com.google.android.material.chip.ChipGroup;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.service.TaskCompleter; import com.todoroo.astrid.service.TaskCompleter;
import com.todoroo.astrid.ui.CheckableImageView; import com.todoroo.astrid.ui.CheckableImageView;
import java.util.List; import java.util.List;
@ -195,7 +195,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
return Math.round(indent * getShiftSize()); return Math.round(indent * getShiftSize());
} }
void bindView(TaskContainer task, boolean isRemoteList, boolean hideSubtasks) { void bindView(TaskContainer task, Filter filter, boolean hideSubtasks) {
this.task = task; this.task = task;
this.indent = task.indent; this.indent = task.indent;
@ -205,7 +205,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
setupTitleAndCheckbox(); setupTitleAndCheckbox();
setupDueDate(); setupDueDate();
if (preferences.getBoolean(R.string.p_show_list_indicators, true)) { if (preferences.getBoolean(R.string.p_show_list_indicators, true)) {
setupChips(isRemoteList, hideSubtasks); setupChips(filter, hideSubtasks);
} }
if (preferences.getBoolean(R.string.p_show_description, true)) { if (preferences.getBoolean(R.string.p_show_description, true)) {
description.setText(task.getNotes()); description.setText(task.getNotes());
@ -261,9 +261,14 @@ public class ViewHolder extends RecyclerView.ViewHolder {
} }
} }
private void setupChips(boolean isRemoteList, boolean hideSubtaskChip) { private void setupChips(Filter filter, boolean hideSubtaskChip) {
List<Chip> chips = List<Chip> chips =
chipProvider.getChips(context, isRemoteList || indent > 0, hideSubtaskChip, task); chipProvider.getChips(
context,
filter,
indent > 0,
hideSubtaskChip,
task);
if (chips.isEmpty()) { if (chips.isEmpty()) {
chipGroup.setVisibility(View.GONE); chipGroup.setVisibility(View.GONE);
} else { } else {

@ -2,8 +2,9 @@ package org.tasks.ui;
import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.removeIf; import static com.google.common.collect.Iterables.removeIf;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.transform; import static com.google.common.collect.Lists.transform;
import static com.google.common.collect.Sets.newHashSet;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import android.app.Activity; import android.app.Activity;
@ -24,6 +25,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.R; import org.tasks.R;
@ -103,7 +105,11 @@ public class ChipProvider {
} }
public List<Chip> getChips( public List<Chip> getChips(
Activity activity, boolean hideListChips, boolean hideSubtaskChip, TaskContainer task) { Activity activity,
Filter filter,
boolean isSubtask,
boolean hideSubtaskChip,
TaskContainer task) {
assertMainThread(); assertMainThread();
List<Chip> chips = new ArrayList<>(); List<Chip> chips = new ArrayList<>();
@ -127,18 +133,23 @@ public class ChipProvider {
task.getLocation().getDisplayName(), task.getLocation().getDisplayName(),
task.getLocation())); task.getLocation()));
} }
if (!hideListChips) { if (!isSubtask) {
if (!Strings.isNullOrEmpty(task.getGoogleTaskList())) { if (!Strings.isNullOrEmpty(task.getGoogleTaskList()) && !(filter instanceof GtasksFilter)) {
chips.add(newTagChip(activity, googleTaskLists.get(task.getGoogleTaskList()))); chips.add(newTagChip(activity, googleTaskLists.get(task.getGoogleTaskList())));
} else if (!Strings.isNullOrEmpty(task.getCaldav())) { } else if (!Strings.isNullOrEmpty(task.getCaldav()) && !(filter instanceof CaldavFilter)) {
chips.add(newTagChip(activity, caldavCalendars.get(task.getCaldav()))); chips.add(newTagChip(activity, caldavCalendars.get(task.getCaldav())));
} }
} }
String tags = task.getTagsString(); String tagString = task.getTagsString();
if (!Strings.isNullOrEmpty(tags)) { if (!Strings.isNullOrEmpty(tagString)) {
Iterable<TagFilter> tagFilters = Set<String> tags = newHashSet(tagString.split(","));
filter(transform(newArrayList(tags.split(",")), tagDatas::get), Predicates.notNull()); if (filter instanceof TagFilter) {
chips.addAll(transform(orderByName.sortedCopy(tagFilters), tag -> newTagChip(activity, tag))); tags.remove(((TagFilter) filter).getUuid());
}
chips.addAll(
transform(
orderByName.sortedCopy(filter(transform(tags, tagDatas::get), Predicates.notNull())),
tag -> newTagChip(activity, tag)));
} }
removeIf(chips, Predicates.isNull()); removeIf(chips, Predicates.isNull());

@ -30,7 +30,6 @@ import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter; import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
@ -86,6 +85,17 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
private static final Field PRIMARY_SORT = field("primary_sort").as("primarySort"); private static final Field PRIMARY_SORT = field("primary_sort").as("primarySort");
private static final Field SECONDARY_SORT = field("secondary_sort").as("secondarySort"); private static final Field SECONDARY_SORT = field("secondary_sort").as("secondarySort");
private static final Field INDENT = field("indent"); private static final Field INDENT = field("indent");
private static final Field TAG_QUERY =
field(
"("
+ Query.select(field("group_concat(distinct(tag_uid))"))
.from(Tag.TABLE)
.where(Task.ID.eq(Tag.TASK))
.toString()
+ " GROUP BY "
+ Tag.TASK
+ ")")
.as("tags");
private static final StringProperty TAGS = private static final StringProperty TAGS =
new StringProperty(null, "group_concat(distinct(" + TAGS_METADATA_JOIN + ".tag_uid)" + ")") new StringProperty(null, "group_concat(distinct(" + TAGS_METADATA_JOIN + ".tag_uid)" + ")")
.as("tags"); .as("tags");
@ -128,19 +138,7 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
&& (includeGoogleTaskSubtasks || includeCaldavSubtasks) && (includeGoogleTaskSubtasks || includeCaldavSubtasks)
&& preferences.showSubtasks() && preferences.showSubtasks()
&& !(preferences.isManualSort() && filter.supportsManualSort())) { && !(preferences.isManualSort() && filter.supportsManualSort())) {
String tagQuery = fields.add(TAG_QUERY);
Query.select(field("group_concat(distinct(tag_uid))"))
.from(Tag.TABLE)
.where(
filter instanceof TagFilter
? Criterion.and(
Task.ID.eq(Tag.TASK),
Tag.TAG_UID.neq(((TagFilter) filter).getUuid()))
: Task.ID.eq(Tag.TASK))
.toString()
+ " GROUP BY "
+ Tag.TASK;
fields.add(field("(" + tagQuery + ")").as("tags"));
fields.add(INDENT); fields.add(INDENT);
fields.add(CHILDREN); fields.add(CHILDREN);
@ -248,15 +246,9 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
// TODO: For now, we'll modify the query to join and include the things like tag data here. // TODO: For now, we'll modify the query to join and include the things like tag data here.
// Eventually, we might consider restructuring things so that this query is constructed // Eventually, we might consider restructuring things so that this query is constructed
// elsewhere. // elsewhere.
Criterion tagsJoinCriterion =
filter instanceof TagFilter
? Criterion.and(
JOIN_TAGS,
field(TAGS_METADATA_JOIN + ".tag_uid").neq(((TagFilter) filter).getUuid()))
: JOIN_TAGS;
String joinedQuery = String joinedQuery =
Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), tagsJoinCriterion).toString() Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), JOIN_TAGS).toString()
+ JOINS + JOINS
+ filter.getSqlQuery(); + filter.getSqlQuery();

Loading…
Cancel
Save