|
|
@ -1,7 +1,6 @@
|
|
|
|
package com.todoroo.astrid.core;
|
|
|
|
package com.todoroo.astrid.core;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
|
|
|
|
|
|
|
|
import android.app.ListActivity;
|
|
|
|
import android.app.ListActivity;
|
|
|
@ -45,7 +44,7 @@ import com.todoroo.astrid.data.Task;
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public class CustomFilterActivity extends ListActivity {
|
|
|
|
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_IMPORTANCE = "importance"; //$NON-NLS-1$
|
|
|
|
private static final String IDENTIFIER_DUEDATE = "dueDate"; //$NON-NLS-1$
|
|
|
|
private static final String IDENTIFIER_DUEDATE = "dueDate"; //$NON-NLS-1$
|
|
|
|
private static final String IDENTIFIER_UNIVERSE = "active"; //$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 TextView filterName;
|
|
|
|
private CustomFilterAdapter adapter;
|
|
|
|
private CustomFilterAdapter adapter;
|
|
|
|
private boolean criteriaRequested = false;
|
|
|
|
private final Map<String,CustomFilterCriterion> criteria = Collections.synchronizedMap(new LinkedHashMap<String,CustomFilterCriterion>());
|
|
|
|
private final ArrayList<CustomFilterCriterion> criteria =
|
|
|
|
|
|
|
|
new ArrayList<CustomFilterCriterion>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private FilterCriteriaReceiver filterCriteriaReceiver = new FilterCriteriaReceiver();
|
|
|
|
private FilterCriteriaReceiver filterCriteriaReceiver = new FilterCriteriaReceiver();
|
|
|
|
|
|
|
|
|
|
|
@ -151,7 +148,6 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@SuppressWarnings("nls")
|
|
|
|
@SuppressWarnings("nls")
|
|
|
|
private void populateCriteria() {
|
|
|
|
private void populateCriteria() {
|
|
|
|
if (criteriaRequested) return;
|
|
|
|
|
|
|
|
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_CUSTOM_FILTER_CRITERIA);
|
|
|
|
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_CUSTOM_FILTER_CRITERIA);
|
|
|
|
sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
|
|
|
|
sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
|
|
|
|
|
|
|
|
|
|
|
@ -183,7 +179,7 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
values, r.getStringArray(R.array.CFC_dueBefore_entries),
|
|
|
|
values, r.getStringArray(R.array.CFC_dueBefore_entries),
|
|
|
|
entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(),
|
|
|
|
entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap(),
|
|
|
|
getString(R.string.CFC_dueBefore_name));
|
|
|
|
getString(R.string.CFC_dueBefore_name));
|
|
|
|
criteria.add(criterion);
|
|
|
|
criteria.put(IDENTIFIER_DUEDATE, criterion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// built in criteria: importance
|
|
|
|
// built in criteria: importance
|
|
|
@ -208,7 +204,7 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
values, entries,
|
|
|
|
values, entries,
|
|
|
|
entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap(),
|
|
|
|
entryValues, ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap(),
|
|
|
|
getString(R.string.CFC_importance_name));
|
|
|
|
getString(R.string.CFC_importance_name));
|
|
|
|
criteria.add(criterion);
|
|
|
|
criteria.put(IDENTIFIER_IMPORTANCE, criterion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// built in criteria: title containing X
|
|
|
|
// built in criteria: title containing X
|
|
|
@ -216,7 +212,7 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
ContentValues values = new ContentValues();
|
|
|
|
ContentValues values = new ContentValues();
|
|
|
|
values.put(Task.TITLE.name, "?");
|
|
|
|
values.put(Task.TITLE.name, "?");
|
|
|
|
CustomFilterCriterion criterion = new TextInputCriterion(
|
|
|
|
CustomFilterCriterion criterion = new TextInputCriterion(
|
|
|
|
IDENTIFIER_TAG, // really? This isn't IDENTIFIER_TITLE?
|
|
|
|
IDENTIFIER_TITLE,
|
|
|
|
getString(R.string.CFC_title_contains_text),
|
|
|
|
getString(R.string.CFC_title_contains_text),
|
|
|
|
Query.select(Task.ID).from(Task.TABLE).where(
|
|
|
|
Query.select(Task.ID).from(Task.TABLE).where(
|
|
|
|
Criterion.and(TaskCriteria.activeAndVisible(),
|
|
|
|
Criterion.and(TaskCriteria.activeAndVisible(),
|
|
|
@ -224,10 +220,8 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
null, getString(R.string.CFC_title_contains_name), "",
|
|
|
|
null, getString(R.string.CFC_title_contains_name), "",
|
|
|
|
((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(),
|
|
|
|
((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(),
|
|
|
|
getString(R.string.CFC_title_contains_name));
|
|
|
|
getString(R.string.CFC_title_contains_name));
|
|
|
|
criteria.add(criterion);
|
|
|
|
criteria.put(IDENTIFIER_TITLE, criterion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
criteriaRequested = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
@ -303,14 +297,15 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < criteria.size(); i++) {
|
|
|
|
int i = 0;
|
|
|
|
CustomFilterCriterion item = criteria.get(i);
|
|
|
|
for (CustomFilterCriterion item : criteria.values()) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
menu.add(CustomFilterActivity.MENU_GROUP_FILTER,
|
|
|
|
menu.add(CustomFilterActivity.MENU_GROUP_FILTER,
|
|
|
|
i, 0, item.name);
|
|
|
|
i, 0, item.name);
|
|
|
|
} catch (NullPointerException e) {
|
|
|
|
} catch (NullPointerException e) {
|
|
|
|
throw new NullPointerException("One of the criteria is null. Criteria: " + criteria);
|
|
|
|
throw new NullPointerException("One of the criteria is null. Criteria: " + criteria);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
@ -453,12 +448,21 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
adapter.notifyDataSetInvalidated();
|
|
|
|
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
|
|
|
|
@Override
|
|
|
|
public boolean onMenuItemSelected(int featureId, MenuItem item) {
|
|
|
|
public boolean onMenuItemSelected(int featureId, MenuItem item) {
|
|
|
|
// group filter option
|
|
|
|
// group filter option
|
|
|
|
if(item.getGroupId() == MENU_GROUP_FILTER) {
|
|
|
|
if(item.getGroupId() == MENU_GROUP_FILTER) {
|
|
|
|
// give an initial value for the row before adding it
|
|
|
|
// 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();
|
|
|
|
final CriterionInstance instance = new CriterionInstance();
|
|
|
|
instance.criterion = criterion;
|
|
|
|
instance.criterion = criterion;
|
|
|
|
adapter.showOptionsFor(instance, new Runnable() {
|
|
|
|
adapter.showOptionsFor(instance, new Runnable() {
|
|
|
@ -493,16 +497,10 @@ public class CustomFilterActivity extends ListActivity {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
final Parcelable[] filters = intent.getExtras().
|
|
|
|
final Parcelable[] filters = intent.getExtras().
|
|
|
|
getParcelableArray(AstridApiConstants.EXTRAS_RESPONSE);
|
|
|
|
getParcelableArray(AstridApiConstants.EXTRAS_RESPONSE);
|
|
|
|
final List<CustomFilterCriterion> addedCriterions = new ArrayList<CustomFilterCriterion>(filters.length);
|
|
|
|
|
|
|
|
for (Parcelable filter : filters) {
|
|
|
|
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) {
|
|
|
|
} catch (Exception e) {
|
|
|
|
String addon;
|
|
|
|
String addon;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|