diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java index 5769de23c..bb1e5a824 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java @@ -1,7 +1,6 @@ package com.todoroo.astrid.core; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.Map.Entry; import android.app.ListActivity; @@ -45,7 +44,7 @@ import com.todoroo.astrid.data.Task; */ public class CustomFilterActivity extends ListActivity { - private static final String IDENTIFIER_TAG = "tag"; //$NON-NLS-1$ + 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$ @@ -112,9 +111,7 @@ public class CustomFilterActivity extends ListActivity { private TextView filterName; private CustomFilterAdapter adapter; - private boolean criteriaRequested = false; - private final ArrayList criteria = - new ArrayList(); + private final Map criteria = Collections.synchronizedMap(new LinkedHashMap()); private FilterCriteriaReceiver filterCriteriaReceiver = new FilterCriteriaReceiver(); @@ -151,7 +148,6 @@ public class CustomFilterActivity extends ListActivity { */ @SuppressWarnings("nls") private void populateCriteria() { - if (criteriaRequested) return; Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_CUSTOM_FILTER_CRITERIA); sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); @@ -183,7 +179,7 @@ public class CustomFilterActivity extends ListActivity { values, r.getStringArray(R.array.CFC_dueBefore_entries), entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(), getString(R.string.CFC_dueBefore_name)); - criteria.add(criterion); + criteria.put(IDENTIFIER_DUEDATE, criterion); } // built in criteria: importance @@ -208,7 +204,7 @@ public class CustomFilterActivity extends ListActivity { values, entries, entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap(), getString(R.string.CFC_importance_name)); - criteria.add(criterion); + criteria.put(IDENTIFIER_IMPORTANCE, criterion); } // built in criteria: title containing X @@ -216,7 +212,7 @@ public class CustomFilterActivity extends ListActivity { ContentValues values = new ContentValues(); values.put(Task.TITLE.name, "?"); CustomFilterCriterion criterion = new TextInputCriterion( - IDENTIFIER_TAG, // really? This isn't IDENTIFIER_TITLE? + IDENTIFIER_TITLE, getString(R.string.CFC_title_contains_text), Query.select(Task.ID).from(Task.TABLE).where( Criterion.and(TaskCriteria.activeAndVisible(), @@ -224,10 +220,8 @@ public class CustomFilterActivity extends ListActivity { null, getString(R.string.CFC_title_contains_name), "", ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(), getString(R.string.CFC_title_contains_name)); - criteria.add(criterion); + criteria.put(IDENTIFIER_TITLE, criterion); } - - criteriaRequested = true; } @Override @@ -303,14 +297,15 @@ public class CustomFilterActivity extends ListActivity { return; } - for(int i = 0; i < criteria.size(); i++) { - CustomFilterCriterion item = criteria.get(i); + 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); } + i++; } } }); @@ -453,12 +448,21 @@ public class CustomFilterActivity extends ListActivity { 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 onMenuItemSelected(int featureId, MenuItem item) { // group filter option if(item.getGroupId() == MENU_GROUP_FILTER) { // give an initial value for the row before adding it - CustomFilterCriterion criterion = criteria.get(item.getItemId()); + CustomFilterCriterion criterion = getNth(item.getItemId(), criteria); final CriterionInstance instance = new CriterionInstance(); instance.criterion = criterion; adapter.showOptionsFor(instance, new Runnable() { @@ -493,16 +497,10 @@ public class CustomFilterActivity extends ListActivity { try { final Parcelable[] filters = intent.getExtras(). getParcelableArray(AstridApiConstants.EXTRAS_RESPONSE); - final List addedCriterions = new ArrayList(filters.length); for (Parcelable filter : filters) { - addedCriterions.add((CustomFilterCriterion)filter); + CustomFilterCriterion filterCriterion = (CustomFilterCriterion) filter; + criteria.put(filterCriterion.identifier, filterCriterion); } - runOnUiThread(new Runnable() { - @Override - public void run() { - criteria.addAll(addedCriterions); - } - }); } catch (Exception e) { String addon; try { diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevCustomFilterCriteriaExposer.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevCustomFilterCriteriaExposer.java index cbb33cf30..02f20c6cf 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevCustomFilterCriteriaExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevCustomFilterCriteriaExposer.java @@ -27,7 +27,8 @@ import java.util.Set; import java.util.TreeSet; public class ProducteevCustomFilterCriteriaExposer extends BroadcastReceiver { - private static final String IDENTIFIER_PRODUCTEEV = "producteev"; // still don't really know what this is + private static final String IDENTIFIER_PRODUCTEEV_WORKSPACE = "producteev_workspace"; //$NON-NLS-1$ + private static final String IDENTIFIER_PRODUCTEEV_ASSIGNEE = "producteev_assignee"; //$NON-NLS-1$ @Override public void onReceive(Context context, Intent intent) { @@ -57,7 +58,7 @@ public class ProducteevCustomFilterCriteriaExposer extends BroadcastReceiver { values.put(Metadata.KEY.name, ProducteevTask.METADATA_KEY); values.put(ProducteevTask.DASHBOARD_ID.name, "?"); CustomFilterCriterion criterion = new MultipleSelectCriterion( - IDENTIFIER_PRODUCTEEV, + IDENTIFIER_PRODUCTEEV_WORKSPACE, context.getString(R.string.CFC_producteev_in_workspace_text), // Todo: abstract these metadata queries Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner( @@ -91,7 +92,7 @@ public class ProducteevCustomFilterCriteriaExposer extends BroadcastReceiver { values.put(Metadata.KEY.name, ProducteevTask.METADATA_KEY); values.put(ProducteevTask.RESPONSIBLE_ID.name, "?"); CustomFilterCriterion criterion = new MultipleSelectCriterion( - IDENTIFIER_PRODUCTEEV, // still not really sure what the point of this identifier is + IDENTIFIER_PRODUCTEEV_ASSIGNEE, context.getString(R.string.CFC_producteev_assigned_to_text), // Todo: abstract these metadata queries, and unify this code with the CustomFilterExposers. Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner( diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java index 1296f0f38..70985eec1 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java @@ -20,7 +20,8 @@ import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; public class TagCustomFilterCriteriaExposer extends BroadcastReceiver { - private static final String IDENTIFIER_TAG = "tag"; //$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$ @Override public void onReceive(Context context, Intent intent) { @@ -40,7 +41,7 @@ public class TagCustomFilterCriteriaExposer extends BroadcastReceiver { values.put(Metadata.KEY.name, TagService.KEY); values.put(TagService.TAG.name, "?"); CustomFilterCriterion criterion = new MultipleSelectCriterion( - IDENTIFIER_TAG, + 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( @@ -56,7 +57,7 @@ public class TagCustomFilterCriteriaExposer extends BroadcastReceiver { // built in criteria: tags containing X { CustomFilterCriterion criterion = new TextInputCriterion( - IDENTIFIER_TAG, + 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(