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

@ -6,9 +6,7 @@ import static com.todoroo.andlib.utility.DateUtilities.getAbbreviatedRelativeDat
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Paint;
import android.net.Uri;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
@ -22,7 +20,9 @@ import butterknife.OnClick;
import butterknife.OnLongClick;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.service.TaskCompleter;
import com.todoroo.astrid.ui.CheckableImageView;
import java.util.List;
@ -195,7 +195,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
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.indent = task.indent;
@ -205,7 +205,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
setupTitleAndCheckbox();
setupDueDate();
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)) {
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 =
chipProvider.getChips(context, isRemoteList || indent > 0, hideSubtaskChip, task);
chipProvider.getChips(
context,
filter,
indent > 0,
hideSubtaskChip,
task);
if (chips.isEmpty()) {
chipGroup.setVisibility(View.GONE);
} else {

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

@ -30,7 +30,6 @@ import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskDao;
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 SECONDARY_SORT = field("secondary_sort").as("secondarySort");
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 =
new StringProperty(null, "group_concat(distinct(" + TAGS_METADATA_JOIN + ".tag_uid)" + ")")
.as("tags");
@ -128,19 +138,7 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
&& (includeGoogleTaskSubtasks || includeCaldavSubtasks)
&& preferences.showSubtasks()
&& !(preferences.isManualSort() && filter.supportsManualSort())) {
String tagQuery =
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(TAG_QUERY);
fields.add(INDENT);
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.
// Eventually, we might consider restructuring things so that this query is constructed
// elsewhere.
Criterion tagsJoinCriterion =
filter instanceof TagFilter
? Criterion.and(
JOIN_TAGS,
field(TAGS_METADATA_JOIN + ".tag_uid").neq(((TagFilter) filter).getUuid()))
: JOIN_TAGS;
String joinedQuery =
Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), tagsJoinCriterion).toString()
Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), JOIN_TAGS).toString()
+ JOINS
+ filter.getSqlQuery();

Loading…
Cancel
Save