Remove filter criteria broadcast

pull/321/head
Alex Baker 10 years ago
parent 660377b93b
commit 008d9117cd

@ -342,12 +342,6 @@
android:theme="@style/TranslucentDialog" />
<!-- tags -->
<receiver android:name="com.todoroo.astrid.tags.TagCustomFilterCriteriaExposer">
<intent-filter>
<action android:name="org.tasks.REQUEST_CUSTOM_FILTER_CRITERIA" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- custom filters -->
<activity
@ -382,13 +376,6 @@
android:theme="@style/Tasks"
android:configChanges="orientation|keyboardHidden" />
<receiver android:name="com.todoroo.astrid.gtasks.GtasksCustomFilterCriteriaExposer">
<intent-filter>
<action android:name="org.tasks.REQUEST_CUSTOM_FILTER_CRITERIA" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity
android:name="com.todoroo.astrid.gtasks.GtasksPreferences"
android:label="@string/synchronization"

@ -45,11 +45,6 @@ public class AstridApiConstants {
*/
public static final String EXTRAS_TASK_ID = "task";
/**
* Extras name for a response item broadcast to astrid
*/
public static final String EXTRAS_RESPONSE = "response";
/**
* Extras name for old task due date
*/
@ -60,21 +55,6 @@ public class AstridApiConstants {
*/
public static final String EXTRAS_NEW_DUE_DATE = "newDueDate";
// -- Custom criteria API
/**
* Action name for a broadcast intent requesting custom filter criteria (e.g. "Due by, Tagged, Tag contains", etc.)
*/
public static final String BROADCAST_REQUEST_CUSTOM_FILTER_CRITERIA = BuildConfig.APPLICATION_ID + ".REQUEST_CUSTOM_FILTER_CRITERIA";
/**
* Action name for broadcast intent sending custom filter criteria back to Astrid
* <li> EXTRAS_ADDON you add-on identifier
* <li> EXTRAS_RESPONSE an array of {@link CustomFilterCriterion} </li>
*/
public static final String BROADCAST_SEND_CUSTOM_FILTER_CRITERIA = BuildConfig.APPLICATION_ID + ".SEND_CUSTOM_FILTER_CRITERIA";
// --- Events API
/**

@ -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<String,CustomFilterCriterion> criteria = Collections.synchronizedMap(new LinkedHashMap<String,CustomFilterCriterion>());
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<CriterionInstance> 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> 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);
}
}
}
}

@ -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<GtasksList> 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);
}
}

@ -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];
}
}

@ -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<CustomFilterCriterion> getAll() {
List<CustomFilterCriterion> 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<GtasksList> 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];
}
}

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

Loading…
Cancel
Save