diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 4ee177b7f..32e949608 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -342,12 +342,6 @@
android:theme="@style/TranslucentDialog" />
-
-
-
-
-
-
-
-
-
-
-
-
-
EXTRAS_ADDON you add-on identifier
- * EXTRAS_RESPONSE an array of {@link CustomFilterCriterion}
- */
- public static final String BROADCAST_SEND_CUSTOM_FILTER_CRITERIA = BuildConfig.APPLICATION_ID + ".SEND_CUSTOM_FILTER_CRITERIA";
-
// --- Events API
/**
diff --git a/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java b/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java
index 539633c7c..308882907 100644
--- a/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java
+++ b/src/main/java/com/todoroo/astrid/core/CustomFilterActivity.java
@@ -5,17 +5,10 @@
*/
package com.todoroo.astrid.core;
-import android.content.BroadcastReceiver;
import android.content.ContentValues;
-import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
import android.database.Cursor;
-import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.v7.app.ActionBar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextMenu;
@@ -28,13 +21,10 @@ import android.widget.ListView;
import android.widget.TextView;
import com.todoroo.andlib.data.Property.CountProperty;
-import com.todoroo.andlib.sql.Criterion;
-import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.UnaryCriterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.actfm.TagSettingsActivity;
-import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.CustomFilterCriterion;
import com.todoroo.astrid.api.Filter;
@@ -47,18 +37,14 @@ import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.dialogs.DialogBuilder;
+import org.tasks.filters.FilterCriteriaProvider;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.ActivityPreferences;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
@@ -71,11 +57,6 @@ import javax.inject.Inject;
*/
public class CustomFilterActivity extends InjectingAppCompatActivity {
- private static final Logger log = LoggerFactory.getLogger(CustomFilterActivity.class);
-
- private static final String IDENTIFIER_TITLE = "title"; //$NON-NLS-1$
- private static final String IDENTIFIER_IMPORTANCE = "importance"; //$NON-NLS-1$
- private static final String IDENTIFIER_DUEDATE = "dueDate"; //$NON-NLS-1$
private static final String IDENTIFIER_UNIVERSE = "active"; //$NON-NLS-1$
static final int MENU_GROUP_FILTER = 0;
@@ -143,9 +124,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
private TextView filterName;
private CustomFilterAdapter adapter;
- private final Map criteria = Collections.synchronizedMap(new LinkedHashMap());
-
- private final FilterCriteriaReceiver filterCriteriaReceiver = new FilterCriteriaReceiver();
// --- activity
@@ -153,16 +131,13 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
@Inject StoreObjectDao storeObjectDao;
@Inject ActivityPreferences preferences;
@Inject DialogBuilder dialogBuilder;
+ @Inject FilterCriteriaProvider filterCriteriaProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- preferences.applyTheme();
- ActionBar ab = getSupportActionBar();
- if (ab != null) {
- ab.setDisplayHomeAsUpEnabled(true);
- }
+ preferences.applyTheme();
setContentView(R.layout.custom_filter_activity);
setTitle(R.string.FLA_new_filter);
@@ -170,7 +145,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
listView = (ListView) findViewById(android.R.id.list);
database.openForReading();
- populateCriteria();
filterName = (TextView)findViewById(R.id.filterName);
List startingCriteria = new ArrayList<>();
@@ -182,100 +156,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
setUpListeners();
}
- /**
- * Populate criteria list with built in and plugin criteria. The request is sent to every application
- * registered to listen for this broadcast. Each plugin can then add criteria to this activity.
- */
- private void populateCriteria() {
- Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_CUSTOM_FILTER_CRITERIA);
- sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
-
- Resources r = getResources();
-
- // built in criteria: due date
- {
- String[] entryValues = new String[] {
- "0",
- PermaSql.VALUE_EOD_YESTERDAY,
- PermaSql.VALUE_EOD,
- PermaSql.VALUE_EOD_TOMORROW,
- PermaSql.VALUE_EOD_DAY_AFTER,
- PermaSql.VALUE_EOD_NEXT_WEEK,
- PermaSql.VALUE_EOD_NEXT_MONTH,
- };
- ContentValues values = new ContentValues();
- values.put(Task.DUE_DATE.name, "?");
- CustomFilterCriterion criterion = new MultipleSelectCriterion(
- IDENTIFIER_DUEDATE,
- getString(R.string.CFC_dueBefore_text),
- Query.select(Task.ID).from(Task.TABLE).where(
- Criterion.and(
- TaskCriteria.activeAndVisible(),
- Criterion.or(
- Field.field("?").eq(0),
- Task.DUE_DATE.gt(0)),
- Task.DUE_DATE.lte("?"))).toString(),
- values, r.getStringArray(R.array.CFC_dueBefore_entries),
- entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(),
- getString(R.string.CFC_dueBefore_name));
- criteria.put(IDENTIFIER_DUEDATE, criterion);
- }
-
- // built in criteria: importance
- {
- String[] entryValues = new String[] {
- Integer.toString(Task.IMPORTANCE_DO_OR_DIE),
- Integer.toString(Task.IMPORTANCE_MUST_DO),
- Integer.toString(Task.IMPORTANCE_SHOULD_DO),
- Integer.toString(Task.IMPORTANCE_NONE),
- };
- String[] entries = new String[] {
- "!!!", "!!", "!", "o"
- };
- ContentValues values = new ContentValues();
- values.put(Task.IMPORTANCE.name, "?");
- CustomFilterCriterion criterion = new MultipleSelectCriterion(
- IDENTIFIER_IMPORTANCE,
- getString(R.string.CFC_importance_text),
- Query.select(Task.ID).from(Task.TABLE).where(
- Criterion.and(TaskCriteria.activeAndVisible(),
- Task.IMPORTANCE.lte("?"))).toString(),
- values, entries,
- entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap(),
- getString(R.string.CFC_importance_name));
- criteria.put(IDENTIFIER_IMPORTANCE, criterion);
- }
-
- // built in criteria: title containing X
- {
- ContentValues values = new ContentValues();
- values.put(Task.TITLE.name, "?");
- CustomFilterCriterion criterion = new TextInputCriterion(
- IDENTIFIER_TITLE,
- getString(R.string.CFC_title_contains_text),
- Query.select(Task.ID).from(Task.TABLE).where(
- Criterion.and(TaskCriteria.activeAndVisible(),
- Task.TITLE.like("%?%"))).toString(),
- getString(R.string.CFC_title_contains_name), "",
- ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(),
- getString(R.string.CFC_title_contains_name));
- criteria.put(IDENTIFIER_TITLE, criterion);
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- registerReceiver(filterCriteriaReceiver, new IntentFilter(AstridApiConstants.BROADCAST_SEND_CUSTOM_FILTER_CRITERIA));
- populateCriteria();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- unregisterReceiver(filterCriteriaReceiver);
- }
-
private CriterionInstance getStartingUniverse() {
CriterionInstance instance = new CriterionInstance();
instance.criterion = new MultipleSelectCriterion(IDENTIFIER_UNIVERSE,
@@ -335,13 +215,8 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
}
int i = 0;
- for (CustomFilterCriterion item : criteria.values()) {
- try {
- menu.add(CustomFilterActivity.MENU_GROUP_FILTER,
- i, 0, item.name);
- } catch (NullPointerException e) {
- throw new NullPointerException("One of the criteria is null. Criteria: " + criteria); //$NON-NLS-1$
- }
+ for (CustomFilterCriterion item : filterCriteriaProvider.getAll()) {
+ menu.add(CustomFilterActivity.MENU_GROUP_FILTER, i, 0, item.name);
i++;
}
}
@@ -495,17 +370,6 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
adapter.notifyDataSetInvalidated();
}
- private V getNth(int index, Map,V> map) {
- int i = 0;
- for (V v : map.values()) {
- if (i == index) {
- return v;
- }
- i++;
- }
- throw new IllegalArgumentException("out of bounds");
- }
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
@@ -519,7 +383,7 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
public boolean onContextItemSelected(android.view.MenuItem item) {
if(item.getGroupId() == MENU_GROUP_FILTER) {
// give an initial value for the row before adding it
- CustomFilterCriterion criterion = getNth(item.getItemId(), criteria);
+ CustomFilterCriterion criterion = filterCriteriaProvider.getAll().get(item.getItemId());
final CriterionInstance instance = new CriterionInstance();
instance.criterion = criterion;
adapter.showOptionsFor(instance, new Runnable() {
@@ -548,20 +412,4 @@ public class CustomFilterActivity extends InjectingAppCompatActivity {
return super.onContextItemSelected(item);
}
-
- public class FilterCriteriaReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- final Parcelable[] filters = intent.getExtras().
- getParcelableArray(AstridApiConstants.EXTRAS_RESPONSE);
- for (Parcelable filter : filters) {
- CustomFilterCriterion filterCriterion = (CustomFilterCriterion) filter;
- criteria.put(filterCriterion.identifier, filterCriterion);
- }
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- }
- }
}
diff --git a/src/main/java/com/todoroo/astrid/gtasks/GtasksCustomFilterCriteriaExposer.java b/src/main/java/com/todoroo/astrid/gtasks/GtasksCustomFilterCriteriaExposer.java
deleted file mode 100644
index 27d039a0e..000000000
--- a/src/main/java/com/todoroo/astrid/gtasks/GtasksCustomFilterCriteriaExposer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.gtasks;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.drawable.BitmapDrawable;
-
-import com.todoroo.andlib.data.AbstractModel;
-import com.todoroo.andlib.sql.Criterion;
-import com.todoroo.andlib.sql.Join;
-import com.todoroo.andlib.sql.Query;
-import com.todoroo.astrid.api.AstridApiConstants;
-import com.todoroo.astrid.api.CustomFilterCriterion;
-import com.todoroo.astrid.api.MultipleSelectCriterion;
-import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
-import com.todoroo.astrid.dao.TaskDao;
-import com.todoroo.astrid.data.Metadata;
-import com.todoroo.astrid.data.Task;
-
-import org.tasks.R;
-import org.tasks.injection.InjectingBroadcastReceiver;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-public class GtasksCustomFilterCriteriaExposer extends InjectingBroadcastReceiver {
-
- private static final String IDENTIFIER = "gtaskslist"; //$NON-NLS-1$
-
- @Inject GtasksPreferenceService gtasksPreferenceService;
- @Inject GtasksListService gtasksListService;
- @Inject GtasksMetadata gtasksMetadata;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- super.onReceive(context, intent);
-
- // if we aren't logged in, don't expose sync action
- if(!gtasksPreferenceService.isLoggedIn()) {
- return;
- }
-
- Resources r = context.getResources();
-
- List lists = gtasksListService.getLists();
-
- CustomFilterCriterion[] result = new CustomFilterCriterion[1];
- String[] listNames = new String[lists.size()];
- String[] listIds = new String[lists.size()];
- for (int i = 0; i < lists.size(); i++) {
- listNames[i] = lists.get(i).getName();
- listIds[i] = lists.get(i).getRemoteId();
- }
-
- ContentValues values = new ContentValues();
- values.putAll(gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues());
- values.remove(Metadata.TASK.name);
- values.put(GtasksMetadata.LIST_ID.name, "?");
-
- CustomFilterCriterion criterion = new MultipleSelectCriterion(
- IDENTIFIER,
- context.getString(R.string.CFC_gtasks_list_text),
-
- Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
- Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
- TaskDao.TaskCriteria.activeAndVisible(),
- MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
- GtasksMetadata.LIST_ID.eq("?"))).toString(),
-
- values,
- listNames,
- listIds,
- ((BitmapDrawable)r.getDrawable(R.drawable.gtasks_icon)).getBitmap(),
- context.getString(R.string.CFC_gtasks_list_name));
- result[0] = criterion;
-
- // transmit filter list
- Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_CUSTOM_FILTER_CRITERIA);
- broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, result);
- context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
- }
-}
diff --git a/src/main/java/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java b/src/main/java/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java
deleted file mode 100644
index 8472abad9..000000000
--- a/src/main/java/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * Copyright (c) 2012 Todoroo Inc
- *
- * See the file "LICENSE" for the full license governing this code.
- */
-package com.todoroo.astrid.tags;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.drawable.BitmapDrawable;
-
-import com.todoroo.andlib.sql.Criterion;
-import com.todoroo.andlib.sql.Join;
-import com.todoroo.andlib.sql.Query;
-import com.todoroo.astrid.api.AstridApiConstants;
-import com.todoroo.astrid.api.CustomFilterCriterion;
-import com.todoroo.astrid.api.MultipleSelectCriterion;
-import com.todoroo.astrid.api.TextInputCriterion;
-import com.todoroo.astrid.dao.MetadataDao;
-import com.todoroo.astrid.dao.TaskDao;
-import com.todoroo.astrid.data.Metadata;
-import com.todoroo.astrid.data.RemoteModel;
-import com.todoroo.astrid.data.TagData;
-import com.todoroo.astrid.data.Task;
-
-import org.tasks.R;
-import org.tasks.injection.InjectingBroadcastReceiver;
-
-import javax.inject.Inject;
-
-public class TagCustomFilterCriteriaExposer extends InjectingBroadcastReceiver {
-
- private static int[] default_tag_images = new int[] {
- R.drawable.default_list_0,
- R.drawable.default_list_1,
- R.drawable.default_list_2,
- R.drawable.default_list_3
- };
- private static final String IDENTIFIER_TAG_IS = "tag_is"; //$NON-NLS-1$
- private static final String IDENTIFIER_TAG_CONTAINS = "tag_contains"; //$NON-NLS-1$
-
- @Inject TagService tagService;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- super.onReceive(context, intent);
-
- Resources r = context.getResources();
-
- CustomFilterCriterion[] ret = new CustomFilterCriterion[2];
- int j = 0;
-
- // built in criteria: tags
- {
- TagData[] tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
- TaskDao.TaskCriteria.activeAndVisible());
- String[] tagNames = new String[tags.length];
- for(int i = 0; i < tags.length; i++) {
- tagNames[i] = tags[i].getName();
- }
- ContentValues values = new ContentValues();
- values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
- values.put(TaskToTagMetadata.TAG_NAME.name, "?");
- CustomFilterCriterion criterion = new MultipleSelectCriterion(
- IDENTIFIER_TAG_IS,
- context.getString(R.string.CFC_tag_text),
- Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
- Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
- TaskDao.TaskCriteria.activeAndVisible(),
- MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
- TaskToTagMetadata.TAG_NAME.eq("?"), Metadata.DELETION_DATE.eq(0))).toString(),
- values, tagNames, tagNames,
- ((BitmapDrawable)r.getDrawable(getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
- context.getString(R.string.CFC_tag_name));
- ret[j++] = criterion;
- }
-
- // built in criteria: tags containing X
- {
- CustomFilterCriterion criterion = new TextInputCriterion(
- IDENTIFIER_TAG_CONTAINS,
- context.getString(R.string.CFC_tag_contains_text),
- Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
- Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
- TaskDao.TaskCriteria.activeAndVisible(),
- MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
- TaskToTagMetadata.TAG_NAME.like("%?%"), Metadata.DELETION_DATE.eq(0))).toString(),
- context.getString(R.string.CFC_tag_contains_name), "",
- ((BitmapDrawable)r.getDrawable(getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
- context.getString(R.string.CFC_tag_contains_name));
- ret[j] = criterion;
- }
-
- // transmit filter list
- Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_CUSTOM_FILTER_CRITERIA);
- broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, ret);
- context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
-
- }
-
- private static int getDefaultImageIDForTag(String nameOrUUID) {
- if (RemoteModel.NO_UUID.equals(nameOrUUID)) {
- int random = (int)(Math.random()*4);
- return default_tag_images[random];
- }
- return default_tag_images[(Math.abs(nameOrUUID.hashCode()))%4];
- }
-}
diff --git a/src/main/java/org/tasks/filters/FilterCriteriaProvider.java b/src/main/java/org/tasks/filters/FilterCriteriaProvider.java
new file mode 100644
index 000000000..496a977bf
--- /dev/null
+++ b/src/main/java/org/tasks/filters/FilterCriteriaProvider.java
@@ -0,0 +1,227 @@
+package org.tasks.filters;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.BitmapDrawable;
+
+import com.todoroo.andlib.data.AbstractModel;
+import com.todoroo.andlib.sql.Criterion;
+import com.todoroo.andlib.sql.Field;
+import com.todoroo.andlib.sql.Join;
+import com.todoroo.andlib.sql.Query;
+import com.todoroo.astrid.api.CustomFilterCriterion;
+import com.todoroo.astrid.api.MultipleSelectCriterion;
+import com.todoroo.astrid.api.PermaSql;
+import com.todoroo.astrid.api.TextInputCriterion;
+import com.todoroo.astrid.dao.MetadataDao;
+import com.todoroo.astrid.dao.TaskDao;
+import com.todoroo.astrid.data.Metadata;
+import com.todoroo.astrid.data.RemoteModel;
+import com.todoroo.astrid.data.TagData;
+import com.todoroo.astrid.data.Task;
+import com.todoroo.astrid.gtasks.GtasksList;
+import com.todoroo.astrid.gtasks.GtasksListService;
+import com.todoroo.astrid.gtasks.GtasksMetadata;
+import com.todoroo.astrid.gtasks.GtasksPreferenceService;
+import com.todoroo.astrid.tags.TagService;
+import com.todoroo.astrid.tags.TaskToTagMetadata;
+
+import org.tasks.R;
+import org.tasks.injection.ForApplication;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+public class FilterCriteriaProvider {
+
+ private static final String IDENTIFIER_TITLE = "title"; //$NON-NLS-1$
+ private static final String IDENTIFIER_IMPORTANCE = "importance"; //$NON-NLS-1$
+ private static final String IDENTIFIER_DUEDATE = "dueDate"; //$NON-NLS-1$
+ private static final String IDENTIFIER_GTASKS = "gtaskslist"; //$NON-NLS-1$
+ private static final String IDENTIFIER_TAG_IS = "tag_is"; //$NON-NLS-1$
+ private static final String IDENTIFIER_TAG_CONTAINS = "tag_contains"; //$NON-NLS-1$
+ private static int[] default_tag_images = new int[] {
+ R.drawable.default_list_0,
+ R.drawable.default_list_1,
+ R.drawable.default_list_2,
+ R.drawable.default_list_3
+ };
+
+ private Context context;
+ private TagService tagService;
+ private GtasksPreferenceService gtasksPreferenceService;
+ private GtasksListService gtasksListService;
+ private GtasksMetadata gtasksMetadata;
+ private Resources r;
+
+ @Inject
+ public FilterCriteriaProvider(@ForApplication Context context, TagService tagService, GtasksPreferenceService gtasksPreferenceService, GtasksListService gtasksListService, GtasksMetadata gtasksMetadata) {
+ this.context = context;
+ this.tagService = tagService;
+ this.gtasksPreferenceService = gtasksPreferenceService;
+ this.gtasksListService = gtasksListService;
+ this.gtasksMetadata = gtasksMetadata;
+
+ r = context.getResources();
+ }
+
+ public List getAll() {
+ List result = newArrayList();
+
+ result.add(getTagFilter());
+ result.add(getTagNameContainsFilter());
+ result.add(getDueDateFilter());
+ result.add(getImportanceFilter());
+ result.add(getTaskTitleContainsFilter());
+ if (gtasksPreferenceService.isLoggedIn()) {
+ result.add(getGtasksFilterCriteria());
+ }
+
+ return result;
+ }
+
+ private CustomFilterCriterion getTagFilter() {
+ TagData[] tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
+ TaskDao.TaskCriteria.activeAndVisible());
+ String[] tagNames = new String[tags.length];
+ for(int i = 0; i < tags.length; i++) {
+ tagNames[i] = tags[i].getName();
+ }
+ ContentValues values = new ContentValues();
+ values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
+ values.put(TaskToTagMetadata.TAG_NAME.name, "?");
+ return new MultipleSelectCriterion(
+ IDENTIFIER_TAG_IS,
+ context.getString(R.string.CFC_tag_text),
+ Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
+ Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
+ TaskDao.TaskCriteria.activeAndVisible(),
+ MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
+ TaskToTagMetadata.TAG_NAME.eq("?"), Metadata.DELETION_DATE.eq(0))).toString(),
+ values, tagNames, tagNames,
+ ((BitmapDrawable)r.getDrawable(getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
+ context.getString(R.string.CFC_tag_name));
+ }
+
+ private CustomFilterCriterion getTagNameContainsFilter() {
+ return new TextInputCriterion(
+ IDENTIFIER_TAG_CONTAINS,
+ context.getString(R.string.CFC_tag_contains_text),
+ Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
+ Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
+ TaskDao.TaskCriteria.activeAndVisible(),
+ MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
+ TaskToTagMetadata.TAG_NAME.like("%?%"), Metadata.DELETION_DATE.eq(0))).toString(),
+ context.getString(R.string.CFC_tag_contains_name), "",
+ ((BitmapDrawable)r.getDrawable(getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
+ context.getString(R.string.CFC_tag_contains_name));
+ }
+
+ private CustomFilterCriterion getDueDateFilter() {
+ String[] entryValues = new String[] {
+ "0",
+ PermaSql.VALUE_EOD_YESTERDAY,
+ PermaSql.VALUE_EOD,
+ PermaSql.VALUE_EOD_TOMORROW,
+ PermaSql.VALUE_EOD_DAY_AFTER,
+ PermaSql.VALUE_EOD_NEXT_WEEK,
+ PermaSql.VALUE_EOD_NEXT_MONTH,
+ };
+ ContentValues values = new ContentValues();
+ values.put(Task.DUE_DATE.name, "?");
+ return new MultipleSelectCriterion(
+ IDENTIFIER_DUEDATE,
+ r.getString(R.string.CFC_dueBefore_text),
+ Query.select(Task.ID).from(Task.TABLE).where(
+ Criterion.and(
+ TaskDao.TaskCriteria.activeAndVisible(),
+ Criterion.or(
+ Field.field("?").eq(0),
+ Task.DUE_DATE.gt(0)),
+ Task.DUE_DATE.lte("?"))).toString(),
+ values, r.getStringArray(R.array.CFC_dueBefore_entries),
+ entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(),
+ r.getString(R.string.CFC_dueBefore_name));
+ }
+
+ private CustomFilterCriterion getImportanceFilter() {
+ String[] entryValues = new String[] {
+ Integer.toString(Task.IMPORTANCE_DO_OR_DIE),
+ Integer.toString(Task.IMPORTANCE_MUST_DO),
+ Integer.toString(Task.IMPORTANCE_SHOULD_DO),
+ Integer.toString(Task.IMPORTANCE_NONE),
+ };
+ String[] entries = new String[] {
+ "!!!", "!!", "!", "o"
+ };
+ ContentValues values = new ContentValues();
+ values.put(Task.IMPORTANCE.name, "?");
+ return new MultipleSelectCriterion(
+ IDENTIFIER_IMPORTANCE,
+ r.getString(R.string.CFC_importance_text),
+ Query.select(Task.ID).from(Task.TABLE).where(
+ Criterion.and(TaskDao.TaskCriteria.activeAndVisible(),
+ Task.IMPORTANCE.lte("?"))).toString(),
+ values, entries,
+ entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap(),
+ r.getString(R.string.CFC_importance_name));
+ }
+
+ private CustomFilterCriterion getTaskTitleContainsFilter() {
+ ContentValues values = new ContentValues();
+ values.put(Task.TITLE.name, "?");
+ return new TextInputCriterion(
+ IDENTIFIER_TITLE,
+ r.getString(R.string.CFC_title_contains_text),
+ Query.select(Task.ID).from(Task.TABLE).where(
+ Criterion.and(TaskDao.TaskCriteria.activeAndVisible(),
+ Task.TITLE.like("%?%"))).toString(),
+ r.getString(R.string.CFC_title_contains_name), "",
+ ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(),
+ r.getString(R.string.CFC_title_contains_name));
+ }
+
+ private CustomFilterCriterion getGtasksFilterCriteria() {
+ List lists = gtasksListService.getLists();
+
+ String[] listNames = new String[lists.size()];
+ String[] listIds = new String[lists.size()];
+ for (int i = 0; i < lists.size(); i++) {
+ listNames[i] = lists.get(i).getName();
+ listIds[i] = lists.get(i).getRemoteId();
+ }
+
+ ContentValues values = new ContentValues();
+ values.putAll(gtasksMetadata.createEmptyMetadata(AbstractModel.NO_ID).getMergedValues());
+ values.remove(Metadata.TASK.name);
+ values.put(GtasksMetadata.LIST_ID.name, "?");
+
+ return new MultipleSelectCriterion(
+ IDENTIFIER_GTASKS,
+ context.getString(R.string.CFC_gtasks_list_text),
+
+ Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
+ Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
+ TaskDao.TaskCriteria.activeAndVisible(),
+ MetadataDao.MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
+ GtasksMetadata.LIST_ID.eq("?"))).toString(),
+
+ values,
+ listNames,
+ listIds,
+ ((BitmapDrawable)r.getDrawable(R.drawable.gtasks_icon)).getBitmap(),
+ context.getString(R.string.CFC_gtasks_list_name));
+ }
+
+ private static int getDefaultImageIDForTag(String nameOrUUID) {
+ if (RemoteModel.NO_UUID.equals(nameOrUUID)) {
+ int random = (int)(Math.random()*4);
+ return default_tag_images[random];
+ }
+ return default_tag_images[(Math.abs(nameOrUUID.hashCode()))%4];
+ }
+}
diff --git a/src/main/java/org/tasks/injection/BroadcastModule.java b/src/main/java/org/tasks/injection/BroadcastModule.java
index b985450f2..46dc9e194 100644
--- a/src/main/java/org/tasks/injection/BroadcastModule.java
+++ b/src/main/java/org/tasks/injection/BroadcastModule.java
@@ -5,9 +5,7 @@ import com.todoroo.astrid.calls.PhoneStateChangedReceiver;
import com.todoroo.astrid.gcal.CalendarAlarmReceiver;
import com.todoroo.astrid.gcal.CalendarStartupReceiver;
import com.todoroo.astrid.gcal.GCalTaskCompleteListener;
-import com.todoroo.astrid.gtasks.GtasksCustomFilterCriteriaExposer;
import com.todoroo.astrid.repeats.RepeatTaskCompleteListener;
-import com.todoroo.astrid.tags.TagCustomFilterCriteriaExposer;
import com.todoroo.astrid.timers.TimerTaskCompleteListener;
import com.todoroo.astrid.widget.TasksWidget;
@@ -28,8 +26,6 @@ import dagger.Module;
TasksWidget.class,
TaskNotificationReceiver.class,
ListNotificationReceiver.class,
- GtasksCustomFilterCriteriaExposer.class,
- TagCustomFilterCriteriaExposer.class,
GCalTaskCompleteListener.class,
TimerTaskCompleteListener.class,
RepeatTaskCompleteListener.class,