You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.java

125 lines
4.0 KiB
Java

package com.todoroo.astrid.api;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import java.util.HashMap;
import java.util.Map;
import org.tasks.R;
import org.tasks.data.GoogleTask;
import org.tasks.data.GoogleTaskList;
public class GtasksFilter extends Filter {
/** Parcelable Creator Object */
public static final Parcelable.Creator<GtasksFilter> CREATOR =
new Parcelable.Creator<GtasksFilter>() {
/** {@inheritDoc} */
@Override
public GtasksFilter createFromParcel(Parcel source) {
GtasksFilter item = new GtasksFilter();
item.readFromParcel(source);
return item;
}
/** {@inheritDoc} */
@Override
public GtasksFilter[] newArray(int size) {
return new GtasksFilter[size];
}
};
private static final int CLOUD = R.drawable.ic_outline_cloud_24px;
private GoogleTaskList list;
private GtasksFilter() {
super();
}
public GtasksFilter(GoogleTaskList list) {
super(list.getTitle(), getQueryTemplate(list), getValuesForNewTasks(list));
this.list = list;
tint = list.getColor();
icon = CLOUD;
}
public static String toManualOrder(String query) {
query =
query.replace(
"WHERE",
"JOIN (SELECT google_tasks.*, COUNT(c.gt_id) AS children, 0 AS siblings, google_tasks.gt_order AS primary_sort, NULL AS secondary_sort FROM google_tasks LEFT JOIN google_tasks AS c ON c.gt_parent = google_tasks.gt_task WHERE google_tasks.gt_parent = 0 GROUP BY google_tasks.gt_task UNION SELECT c.*, 0 AS children, COUNT(s.gt_id) AS siblings, p.gt_order AS primary_sort, c.gt_order AS secondary_sort FROM google_tasks AS c LEFT JOIN google_tasks AS p ON c.gt_parent = p.gt_task LEFT JOIN tasks ON c.gt_parent = tasks._id LEFT JOIN google_tasks AS s ON s.gt_parent = p.gt_task WHERE c.gt_parent > 0 AND ((tasks.completed=0) AND (tasks.deleted=0) AND (tasks.hideUntil<(strftime('%s','now')*1000))) GROUP BY c.gt_task) as g2 ON g2.gt_id = google_tasks.gt_id WHERE");
query = query.replaceAll("ORDER BY .*", "");
query = query + "ORDER BY primary_sort ASC, secondary_sort ASC";
return query;
}
private static QueryTemplate getQueryTemplate(GoogleTaskList list) {
return new QueryTemplate()
.join(Join.left(GoogleTask.TABLE, Task.ID.eq(Field.field("google_tasks.gt_task"))))
.where(
Criterion.and(
TaskDao.TaskCriteria.activeAndVisible(),
Field.field("google_tasks.gt_deleted").eq(0),
Field.field("google_tasks.gt_list_id").eq(list.getRemoteId())));
}
private static Map<String, Object> getValuesForNewTasks(GoogleTaskList list) {
Map<String, Object> values = new HashMap<>();
values.put(GoogleTask.KEY, list.getRemoteId());
return values;
}
public long getStoreId() {
return list.getId();
}
public GoogleTaskList getList() {
return list;
}
@Override
public boolean supportsSubtasks() {
return true;
}
/** {@inheritDoc} */
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeParcelable(list, 0);
}
@Override
protected void readFromParcel(Parcel source) {
super.readFromParcel(source);
list = source.readParcelable(getClass().getClassLoader());
}
public String getRemoteId() {
return list.getRemoteId();
}
@Override
public int getMenu() {
return R.menu.menu_gtasks_list_fragment;
}
@Override
public boolean areItemsTheSame(@NonNull FilterListItem other) {
return other instanceof GtasksFilter
&& list.getRemoteId().equals(((GtasksFilter) other).list.getRemoteId());
}
@Override
public boolean areContentsTheSame(@NonNull FilterListItem other) {
return list.equals(((GtasksFilter) other).list);
}
}