diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml
index f3c4ae66d..bf9cfde4c 100644
--- a/astrid/res/values/strings-core.xml
+++ b/astrid/res/values/strings-core.xml
@@ -116,6 +116,9 @@
Copy Task
+
+ Filter By Tag
+
Delete Task
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
index 173dd9106..1d1966c7e 100644
--- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
@@ -1,6 +1,8 @@
package com.todoroo.astrid.activity;
+import java.text.Collator;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
@@ -63,6 +65,8 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
+import com.todoroo.andlib.sql.Criterion;
+import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
@@ -95,6 +99,8 @@ import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
+import com.todoroo.astrid.tags.TagService;
+import com.todoroo.astrid.tags.TagService.Tag;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
@@ -131,10 +137,11 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
private static final int CONTEXT_MENU_EDIT_TASK_ID = Menu.FIRST + 20;
private static final int CONTEXT_MENU_COPY_TASK_ID = Menu.FIRST + 21;
- private static final int CONTEXT_MENU_DELETE_TASK_ID = Menu.FIRST + 22;
- private static final int CONTEXT_MENU_UNDELETE_TASK_ID = Menu.FIRST + 23;
- private static final int CONTEXT_MENU_PURGE_TASK_ID = Menu.FIRST + 24;
- private static final int CONTEXT_MENU_ADDON_INTENT_ID = Menu.FIRST + 25;
+ private static final int CONTEXT_MENU_FILTER_BY_TAG_ID = Menu.FIRST + 22;
+ private static final int CONTEXT_MENU_DELETE_TASK_ID = Menu.FIRST + 23;
+ private static final int CONTEXT_MENU_UNDELETE_TASK_ID = Menu.FIRST + 24;
+ private static final int CONTEXT_MENU_PURGE_TASK_ID = Menu.FIRST + 25;
+ private static final int CONTEXT_MENU_ADDON_INTENT_ID = Menu.FIRST + 26;
private static final int CONTEXT_MENU_DEBUG = Menu.FIRST + 30;
@@ -812,6 +819,14 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
R.string.TAd_contextEditTask);
menu.add(id, CONTEXT_MENU_COPY_TASK_ID, Menu.NONE,
R.string.TAd_contextCopyTask);
+
+ TodorooCursor cursor = TagService.getInstance().getTags(
+ id);
+ menu.add(id, CONTEXT_MENU_FILTER_BY_TAG_ID, Menu.NONE,
+ R.string.TAd_contextFilterByTag).setEnabled(
+ cursor.getCount() > 0);
+ cursor.close();
+
menu.add(id, CONTEXT_MENU_DELETE_TASK_ID, Menu.NONE,
R.string.TAd_contextDeleteTask);
@@ -1022,6 +1037,68 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
return true;
}
+ case CONTEXT_MENU_FILTER_BY_TAG_ID: {
+ itemId = item.getGroupId();
+
+ final TodorooCursor cursor = TagService.getInstance().getTags(
+ itemId);
+ if (!cursor.moveToFirst()) {
+ cursor.close();
+ return false;
+ }
+ final List tags = new ArrayList();
+ do {
+ tags.add(cursor.get(TagService.TAG));
+ } while (cursor.moveToNext());
+ cursor.close();
+
+ Collator collator = Collator.getInstance();
+ collator.setStrength(Collator.PRIMARY);
+ Collections.sort(tags, collator);
+
+ DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Tag tag = new Tag(tags.get(which), 0);
+
+ String listTitle = tag.tag;
+ String title = TaskListActivity.this.getString(
+ R.string.tag_FEx_name, tag.tag);
+ Criterion criterion = TaskCriteria.activeAndVisible();
+ QueryTemplate tagTemplate = tag.queryTemplate(criterion);
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Metadata.KEY.name, TagService.KEY);
+ contentValues.put(TagService.TAG.name, tag.tag);
+
+ Filter tagFilter = new Filter(listTitle, title,
+ tagTemplate, contentValues);
+ Intent tagIntent = new Intent(TaskListActivity.this,
+ TaskListActivity.class);
+ tagIntent.putExtra(TaskListActivity.TOKEN_FILTER, tagFilter);
+
+ startActivity(tagIntent);
+ AndroidUtilities.callApiMethod(5,
+ this,
+ "overridePendingTransition", //$NON-NLS-1$
+ new Class>[] { Integer.TYPE, Integer.TYPE },
+ R.anim.slide_left_in, R.anim.slide_left_out);
+ }
+ };
+
+ if (tags.size() == 1) {
+ listener.onClick(null, 0);
+ } else {
+ new AlertDialog.Builder(this).setTitle(
+ R.string.TAd_contextFilterByTag).setAdapter(
+ new ArrayAdapter(this,
+ android.R.layout.select_dialog_item, tags),
+ listener).show();
+ }
+
+ return true;
+ }
+
case CONTEXT_MENU_DELETE_TASK_ID: {
itemId = item.getGroupId();
Task task = new Task();