Made criterion identifiers unique.

pull/14/head
Joshua Ball 14 years ago
parent eabe880f52
commit a9b4f968d7

@ -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<CustomFilterCriterion> criteria =
new ArrayList<CustomFilterCriterion>();
private final Map<String,CustomFilterCriterion> criteria = Collections.synchronizedMap(new LinkedHashMap<String,CustomFilterCriterion>());
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> 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 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<CustomFilterCriterion> addedCriterions = new ArrayList<CustomFilterCriterion>(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 {

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

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

Loading…
Cancel
Save