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 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,