From 28d05d632508604c569931954df96ba3ce1e34a0 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 7 May 2012 20:01:18 -0700 Subject: [PATCH 01/13] Started altering tag service to filter out emergent tags --- .../astrid/actfm/EditPeopleControlSet.java | 2 +- .../astrid/actfm/sync/ActFmSyncService.java | 2 +- .../todoroo/astrid/tags/TagCaseMigrator.java | 2 +- .../tags/TagCustomFilterCriteriaExposer.java | 2 +- .../todoroo/astrid/tags/TagDetailExposer.java | 2 +- .../com/todoroo/astrid/tags/TagService.java | 48 +++++++++++++++---- .../todoroo/astrid/tags/TagsControlSet.java | 2 +- .../astrid/provider/Astrid2TaskProvider.java | 4 +- 8 files changed, 46 insertions(+), 18 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java index dd5c7eeb4..908e08f96 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java @@ -241,7 +241,7 @@ public class EditPeopleControlSet extends PopupControlSet { @Override public void run() { ArrayList collaborators = new ArrayList(); - TodorooCursor tags = TagService.getInstance().getTags(task.getId()); + TodorooCursor tags = TagService.getInstance().getTags(task.getId(), true); try { Metadata metadata = new Metadata(); for(tags.moveToFirst(); !tags.isAfterLast(); tags.moveToNext()) { diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java index f71c8256d..79c4f3ccc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -394,7 +394,7 @@ public final class ActFmSyncService { } if(Flags.checkAndClear(Flags.TAGS_CHANGED) || newlyCreated) { - TodorooCursor cursor = TagService.getInstance().getTags(task.getId()); + TodorooCursor cursor = TagService.getInstance().getTags(task.getId(), false); try { if(cursor.getCount() == 0) { params.add("tags"); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagCaseMigrator.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagCaseMigrator.java index 48fa80430..c29998099 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagCaseMigrator.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagCaseMigrator.java @@ -38,7 +38,7 @@ public class TagCaseMigrator { public void performTagCaseMigration(@SuppressWarnings("unused") Context context) { if (!Preferences.getBoolean(PREF_CASE_MIGRATION_PERFORMED, false)) { TagService.Tag[] allTagData = TagService.getInstance().getGroupedTags( - TagService.GROUPED_TAGS_BY_ALPHA, Criterion.all); + TagService.GROUPED_TAGS_BY_ALPHA, Criterion.all, false); boolean shouldShowDialog = false; for (int i = 0; i < allTagData.length - 1; i++) { diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java index be9d7d32d..ebb821d15 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagCustomFilterCriteriaExposer.java @@ -35,7 +35,7 @@ public class TagCustomFilterCriteriaExposer extends BroadcastReceiver { // built in criteria: tags { TagService.Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, - TaskDao.TaskCriteria.activeAndVisible()); + TaskDao.TaskCriteria.activeAndVisible(), false); String[] tagNames = new String[tags.length]; for(int i = 0; i < tags.length; i++) tagNames[i] = tags[i].tag; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java index 3d890d606..70ef269e0 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagDetailExposer.java @@ -37,7 +37,7 @@ public class TagDetailExposer extends BroadcastReceiver { } public String getTaskDetails(long id) { - String tagList = TagService.getInstance().getTagsAsString(id); + String tagList = TagService.getInstance().getTagsAsString(id, false); if(tagList.length() == 0) return null; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index e65dc142e..45482efdd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -193,10 +193,15 @@ public final class TagService { * @param activeStatus criterion for specifying completed or uncompleted * @return empty array if no tags, otherwise array */ - public Tag[] getGroupedTags(Order order, Criterion activeStatus) { + public Tag[] getGroupedTags(Order order, Criterion activeStatus, boolean includeEmergent) { + Criterion criterion; + if (includeEmergent) + criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(KEY)); + else + criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(KEY), Criterion.not(TAG.in(getEmergentTags()))); Query query = Query.select(TAG, REMOTE_ID, COUNT). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). - where(Criterion.and(activeStatus, MetadataCriteria.withKey(KEY))). + where(criterion). orderBy(order).groupBy(TAG); TodorooCursor cursor = metadataDao.query(query); try { @@ -211,15 +216,38 @@ public final class TagService { } } + private String[] getEmergentTags() { + TodorooCursor emergent = tagDataService.query(Query.select(TagData.NAME) + .where(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_EMERGENT).gt(0))); + try { + String[] tags = new String[emergent.getCount()]; + TagData data = new TagData(); + for (int i = 0; i < emergent.getCount(); i++) { + emergent.moveToPosition(i); + data.readFromCursor(emergent); + tags[i] = data.getValue(TagData.NAME); + } + return tags; + } finally { + emergent.close(); + } + } + /** * Return tags on the given task * * @param taskId * @return cursor. PLEASE CLOSE THE CURSOR! */ - public TodorooCursor getTags(long taskId) { - Query query = Query.select(TAG, REMOTE_ID).where(Criterion.and(MetadataCriteria.withKey(KEY), - MetadataCriteria.byTask(taskId))).orderBy(Order.asc(Functions.upper(TAG))); + public TodorooCursor getTags(long taskId, boolean includeEmergent) { + Criterion criterion; + if (includeEmergent) + criterion = Criterion.and(MetadataCriteria.withKey(KEY), + MetadataCriteria.byTask(taskId)); + else + criterion = Criterion.and(MetadataCriteria.withKey(KEY), + MetadataCriteria.byTask(taskId), Criterion.not(TAG.in(getEmergentTags()))); + Query query = Query.select(TAG, REMOTE_ID).where(criterion).orderBy(Order.asc(Functions.upper(TAG))); return metadataDao.query(query); } @@ -229,8 +257,8 @@ public final class TagService { * @param taskId * @return empty string if no tags, otherwise string */ - public String getTagsAsString(long taskId) { - return getTagsAsString(taskId, ", "); + public String getTagsAsString(long taskId, boolean includeEmergent) { + return getTagsAsString(taskId, ", ", includeEmergent); } /** @@ -239,9 +267,9 @@ public final class TagService { * @param taskId * @return empty string if no tags, otherwise string */ - public String getTagsAsString(long taskId, String separator) { + protected String getTagsAsString(long taskId, String separator, boolean includeEmergent) { StringBuilder tagBuilder = new StringBuilder(); - TodorooCursor tags = getTags(taskId); + TodorooCursor tags = getTags(taskId, includeEmergent); try { int length = tags.getCount(); Metadata metadata = new Metadata(); @@ -285,7 +313,7 @@ public final class TagService { HashMap tags = new HashMap(); Tag[] tagsByAlpha = getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA, - TaskCriteria.activeAndVisible()); + TaskCriteria.activeAndVisible(), false); for(Tag tag : tagsByAlpha) if(!TextUtils.isEmpty(tag.tag)) tags.put(tag.tag, tag); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java index d538975c6..c1334d12a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java @@ -223,7 +223,7 @@ public final class TagsControlSet extends PopupControlSet { public void readFromTask(Task task) { super.readFromTask(task); if(model.getId() != AbstractModel.NO_ID) { - TodorooCursor cursor = tagService.getTags(model.getId()); + TodorooCursor cursor = tagService.getTags(model.getId(), false); LinkedHashSet tags = new LinkedHashSet(cursor.getCount()); try { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { diff --git a/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java b/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java index ca5345d6a..5b4fc9f01 100644 --- a/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java +++ b/astrid/src/com/todoroo/astrid/provider/Astrid2TaskProvider.java @@ -138,7 +138,7 @@ public class Astrid2TaskProvider extends ContentProvider { public Cursor getTags() { Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, - Criterion.all); + Criterion.all, true); MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST); @@ -195,7 +195,7 @@ public class Astrid2TaskProvider extends ContentProvider { task.readFromCursor(cursor); StringBuilder taskTags = new StringBuilder(); - TodorooCursor tagCursor = TagService.getInstance().getTags(task.getId()); + TodorooCursor tagCursor = TagService.getInstance().getTags(task.getId(), true); try { for(tagCursor.moveToFirst(); !tagCursor.isAfterLast(); tagCursor.moveToNext()) taskTags.append(tagCursor.get(TagService.TAG)).append(TAG_SEPARATOR); From 6060b217574fca1a55ce17bf679c9ca9c1798c06 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 7 May 2012 20:38:57 -0700 Subject: [PATCH 02/13] Fixed a bug in StringProperty.in(String[]) that makes hiding emergent tags work --- api/src/com/todoroo/andlib/data/Property.java | 22 ++++++++++++ api/src/com/todoroo/andlib/sql/Criterion.java | 2 +- .../com/todoroo/andlib/sql/SqlConstants.java | 36 +++++++++---------- .../com/todoroo/astrid/tags/TagService.java | 2 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/api/src/com/todoroo/andlib/data/Property.java b/api/src/com/todoroo/andlib/data/Property.java index b1526e629..40bfb08f7 100644 --- a/api/src/com/todoroo/andlib/data/Property.java +++ b/api/src/com/todoroo/andlib/data/Property.java @@ -5,7 +5,14 @@ */ package com.todoroo.andlib.data; +import static com.todoroo.andlib.sql.SqlConstants.COMMA; +import static com.todoroo.andlib.sql.SqlConstants.LEFT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.RIGHT_PARENTHESIS; +import static com.todoroo.andlib.sql.SqlConstants.SPACE; + +import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; +import com.todoroo.andlib.sql.Operator; /** * Property represents a typed column in a database. @@ -150,6 +157,21 @@ public abstract class Property extends Field implements Cloneable { PropertyVisitor visitor, PARAMETER data) { return visitor.visitString(this, data); } + + public Criterion in(final String[] value) { + final Field field = this; + return new Criterion(Operator.in) { + + @Override + protected void populate(StringBuilder sb) { + sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(SPACE); + for (String s : value) { + sb.append("\"").append(s.toString()).append("\"").append(COMMA); + } + sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS); + } + }; + } } /** diff --git a/api/src/com/todoroo/andlib/sql/Criterion.java b/api/src/com/todoroo/andlib/sql/Criterion.java index 5acdc6535..9059bc8f1 100644 --- a/api/src/com/todoroo/andlib/sql/Criterion.java +++ b/api/src/com/todoroo/andlib/sql/Criterion.java @@ -11,7 +11,7 @@ import static com.todoroo.andlib.sql.SqlConstants.SPACE; public abstract class Criterion { protected final Operator operator; - Criterion(Operator operator) { + public Criterion(Operator operator) { this.operator = operator; } diff --git a/api/src/com/todoroo/andlib/sql/SqlConstants.java b/api/src/com/todoroo/andlib/sql/SqlConstants.java index fa9d647fc..4739acfeb 100644 --- a/api/src/com/todoroo/andlib/sql/SqlConstants.java +++ b/api/src/com/todoroo/andlib/sql/SqlConstants.java @@ -2,24 +2,24 @@ package com.todoroo.andlib.sql; @SuppressWarnings("nls") public final class SqlConstants { - static final String SELECT = "SELECT"; - static final String DISTINCT = "DISTINCT"; - static final String SPACE = " "; - static final String AS = "AS"; - static final String COMMA = ","; - static final String FROM = "FROM"; - static final String ON = "ON"; - static final String JOIN = "JOIN"; - static final String ALL = "*"; - static final String LEFT_PARENTHESIS = "("; - static final String RIGHT_PARENTHESIS = ")"; - static final String AND = "AND"; - static final String BETWEEN = "BETWEEN"; - static final String LIKE = "LIKE"; - static final String OR = "OR"; - static final String ORDER_BY = "ORDER BY"; - static final String GROUP_BY = "GROUP BY"; - static final String WHERE = "WHERE"; + public static final String SELECT = "SELECT"; + public static final String DISTINCT = "DISTINCT"; + public static final String SPACE = " "; + public static final String AS = "AS"; + public static final String COMMA = ","; + public static final String FROM = "FROM"; + public static final String ON = "ON"; + public static final String JOIN = "JOIN"; + public static final String ALL = "*"; + public static final String LEFT_PARENTHESIS = "("; + public static final String RIGHT_PARENTHESIS = ")"; + public static final String AND = "AND"; + public static final String BETWEEN = "BETWEEN"; + public static final String LIKE = "LIKE"; + public static final String OR = "OR"; + public static final String ORDER_BY = "ORDER BY"; + public static final String GROUP_BY = "GROUP BY"; + public static final String WHERE = "WHERE"; public static final String EXISTS = "EXISTS"; public static final String NOT = "NOT"; public static final String LIMIT = "LIMIT"; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index 45482efdd..12eb7339a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java @@ -325,7 +325,7 @@ public final class TagService { tagData.readFromCursor(cursor); String tagName = tagData.getValue(TagData.NAME).trim(); Tag tag = new Tag(tagData); - if(tagData.getValue(TagData.DELETION_DATE) > 0) { + if(tagData.getValue(TagData.DELETION_DATE) > 0 || tagData.getFlag(TagData.FLAGS, TagData.FLAG_EMERGENT)) { tags.remove(tagName); continue; } From 0ed664a6638f7e60d82f6090308af415947652f2 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 8 May 2012 16:57:37 -0700 Subject: [PATCH 03/13] Commit all the things--mostly working people view --- api/src/com/todoroo/astrid/data/User.java | 8 ++ astrid/AndroidManifest.xml | 10 ++ .../todoroo/astrid/core/PluginServices.java | 8 ++ .../astrid/people/PeopleFilterAdapter.java | 38 ++++++ .../astrid/people/PeopleFilterExposer.java | 113 ++++++++++++++++++ .../astrid/people/PeopleListFragment.java | 20 ++++ .../astrid/people/PeopleViewActivity.java | 80 +++++++++++++ .../astrid/people/PersonViewFragment.java | 23 ++++ astrid/res/layout/header_people_view.xml | 76 ++++++++++++ astrid/res/layout/people_list_fragment.xml | 20 ++++ .../layout/people_view_wrapper_activity.xml | 8 ++ astrid/res/layout/task_list_body_person.xml | 11 ++ .../astrid/activity/FilterListFragment.java | 40 ++++--- .../astrid/activity/TaskListActivity.java | 61 ++++++++-- .../astrid/activity/TaskListFragment.java | 4 +- .../todoroo/astrid/adapter/FilterAdapter.java | 2 +- .../astrid/service/StartupService.java | 1 + .../todoroo/astrid/ui/MainMenuPopover.java | 12 +- 18 files changed, 502 insertions(+), 33 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterAdapter.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterExposer.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PersonViewFragment.java create mode 100644 astrid/res/layout/header_people_view.xml create mode 100644 astrid/res/layout/people_list_fragment.xml create mode 100644 astrid/res/layout/people_view_wrapper_activity.xml create mode 100644 astrid/res/layout/task_list_body_person.xml diff --git a/api/src/com/todoroo/astrid/data/User.java b/api/src/com/todoroo/astrid/data/User.java index 0d6d6e2cc..f8cf69c82 100644 --- a/api/src/com/todoroo/astrid/data/User.java +++ b/api/src/com/todoroo/astrid/data/User.java @@ -8,6 +8,7 @@ package com.todoroo.astrid.data; import android.content.ContentValues; import android.net.Uri; +import android.text.TextUtils; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; @@ -91,6 +92,13 @@ public final class User extends RemoteModel { super.readPropertiesFromCursor(cursor); } + public String getDisplayName() { + String name = getValue(NAME); + if (!TextUtils.isEmpty(name)) + return name; + return getValue(EMAIL); + } + @Override public long getId() { return getIdHelper(ID); diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index fa56190d6..91e447e20 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -320,6 +320,16 @@ + + + + + + + + + diff --git a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java index b366713a8..ff50eabd6 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java @@ -8,6 +8,7 @@ import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.StoreObjectDao; +import com.todoroo.astrid.dao.UserDao; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.service.AddOnService; import com.todoroo.astrid.service.AstridDependencyInjector; @@ -44,6 +45,9 @@ public final class PluginServices { @Autowired StoreObjectDao storeObjectDao; + @Autowired + UserDao userDao; + private static PluginServices instance; static { @@ -86,6 +90,10 @@ public final class PluginServices { return getInstance().storeObjectDao; } + public static UserDao getUserDao() { + return getInstance().userDao; + } + // -- helpers /** diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterAdapter.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterAdapter.java new file mode 100644 index 000000000..55147ed6b --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterAdapter.java @@ -0,0 +1,38 @@ +package com.todoroo.astrid.people; + +import android.app.Activity; +import android.content.Intent; +import android.content.IntentFilter; +import android.widget.ListView; + +import com.todoroo.astrid.adapter.FilterAdapter; +import com.todoroo.astrid.utility.Constants; + +public class PeopleFilterAdapter extends FilterAdapter { + + public static final String BROADCAST_REQUEST_PEOPLE_FILTERS = Constants.PACKAGE + ".REQUEST_PEOPLE_FILTERS"; //$NON-NLS-1$ + public static final String BROADCAST_SEND_PEOPLE_FILTERS = Constants.PACKAGE + ".SEND_PEOPLE_FILTERS"; //$NON-NLS-1$ + + public PeopleFilterAdapter(Activity activity, ListView listView, + int rowLayout, boolean skipIntentFilters) { + super(activity, listView, rowLayout, skipIntentFilters); + } + + @Override + public void getLists() { + Intent broadcastIntent = new Intent(BROADCAST_REQUEST_PEOPLE_FILTERS); + activity.sendBroadcast(broadcastIntent); + } + + @Override + public void registerRecevier() { + IntentFilter peopleFilter = new IntentFilter(BROADCAST_SEND_PEOPLE_FILTERS); + activity.registerReceiver(filterReceiver, peopleFilter); + getLists(); + } + + @Override + public void unregisterRecevier() { + activity.unregisterReceiver(filterReceiver); + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterExposer.java new file mode 100644 index 000000000..859430ced --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterExposer.java @@ -0,0 +1,113 @@ +package com.todoroo.astrid.people; + +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Field; +import com.todoroo.andlib.sql.Join; +import com.todoroo.andlib.sql.Order; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.sql.QueryTemplate; +import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.api.FilterWithCustomIntent; +import com.todoroo.astrid.api.FilterWithUpdate; +import com.todoroo.astrid.core.PluginServices; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.TagData; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.data.User; +import com.todoroo.astrid.tags.TagService; + +public class PeopleFilterExposer extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + FilterListItem[] listAsArray = prepareFilters(context); + + Intent broadcastIntent = new Intent(PeopleFilterAdapter.BROADCAST_SEND_PEOPLE_FILTERS); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, listAsArray); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, "people"); //$NON-NLS-1$ + context.sendBroadcast(broadcastIntent); + } + + private FilterListItem[] prepareFilters(Context context) { + TodorooCursor users = PluginServices.getUserDao().query(Query.select(User.PROPERTIES) + .orderBy(Order.asc(User.NAME), Order.asc(User.EMAIL))); + try { + FilterListItem[] items = new FilterListItem[users.getCount()]; + User user = new User(); + int i = 0; + for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) { + user.readFromCursor(users); + Filter currFilter = filterFromUserData(user); + items[i] = currFilter; + i++; + } + return items; + } finally { + users.close(); + } + } + + @SuppressWarnings("nls") + public static FilterWithCustomIntent filterFromUserData(User user) { + String email = user.getValue(User.EMAIL); + String[] tags; + + TodorooCursor tagsWithUser = PluginServices.getTagDataService().query(Query.select(TagData.NAME) + .where(Criterion.or( + TagData.MEMBERS.like("%" + email + "%"), + TagData.USER.like("%" + email + "%"), + TagData.USER_ID.eq(user.getId())))); + try { + if (tagsWithUser.getCount() == 0) { + tags = new String[1]; + tags[0] = "\"\""; + } else { + tags = new String[tagsWithUser.getCount()]; + int i = 0; + TagData curr = new TagData(); + for (tagsWithUser.moveToFirst(); !tagsWithUser.isAfterLast(); tagsWithUser.moveToNext()) { + curr.readFromCursor(tagsWithUser); + tags[i] = "\"" + curr.getValue(TagData.NAME) + "\""; + i++; + } + } + } finally { + tagsWithUser.close(); + } + + String title = user.getDisplayName(); + QueryTemplate userTemplate = new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"), + Criterion.and(Task.ID.eq(Field.field("mtags." + Metadata.TASK.name)), + Field.field("mtags." + Metadata.KEY.name).eq(TagService.KEY), + Field.field("mtags." + TagService.TAG.name).in(tags), + Criterion.or(Task.USER.like("%" + email + "%"), + Task.USER_ID.eq(user.getValue(User.REMOTE_ID)))))); + + FilterWithUpdate filter = new FilterWithUpdate(title, title, userTemplate, null); + + filter.customTaskList = new ComponentName(ContextManager.getContext(), PersonViewFragment.class); + + ContentValues values = new ContentValues(); + values.put(Task.USER_ID.name, user.getValue(User.REMOTE_ID)); + filter.valuesForNewTasks = values; + + String imageUrl = user.getValue(User.PICTURE); + filter.imageUrl = imageUrl; + + Bundle extras = new Bundle(); + extras.putLong(PersonViewFragment.EXTRA_USER_ID_LOCAL, user.getId()); + filter.customExtras = extras; + + return filter; + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java new file mode 100644 index 000000000..db7f38e8c --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java @@ -0,0 +1,20 @@ +package com.todoroo.astrid.people; + +import android.app.Activity; + +import com.timsu.astrid.R; +import com.todoroo.astrid.activity.FilterListFragment; +import com.todoroo.astrid.adapter.FilterAdapter; + +public class PeopleListFragment extends FilterListFragment { + + @Override + protected FilterAdapter instantiateAdapter() { + return new PeopleFilterAdapter(getActivity(), null, R.layout.filter_adapter_row, false); + } + + @Override + protected int getLayout(Activity activity) { + return R.layout.people_list_fragment; + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java new file mode 100644 index 000000000..27272f3b4 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java @@ -0,0 +1,80 @@ +package com.todoroo.astrid.people; + +import android.content.Intent; +import android.os.Bundle; + +import com.timsu.astrid.R; +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.astrid.activity.FilterListFragment; +import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.api.FilterWithUpdate; +import com.todoroo.astrid.helper.AsyncImageView; +import com.todoroo.astrid.ui.MainMenuPopover; + +public class PeopleViewActivity extends TaskListActivity { + + private AsyncImageView imageView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + imageView = (AsyncImageView) findViewById(R.id.person_image); + imageView.setDefaultImageResource(R.drawable.icn_default_person_image); + } + + @Override + protected int getContentView() { + return R.layout.people_view_wrapper_activity; + } + + @Override + protected Filter getDefaultFilter() { + // TODO More suitable default + return super.getDefaultFilter(); + } + + @Override + protected Class getFilterListClass() { + return PeopleListFragment.class; + } + + @Override + protected int getHeaderView() { + return R.layout.header_people_view; + } + + @Override + public boolean onFilterItemClicked(FilterListItem item) { + boolean result = super.onFilterItemClicked(item); + if (result && item instanceof FilterWithUpdate) + imageView.setUrl(((FilterWithUpdate) item).imageUrl); + else + imageView.setUrl(null); + return result; + } + + private static final int[] FORBIDDEN_MENU_ITEMS = { + TaskListFragment.MENU_NEW_FILTER_ID, + TaskListFragment.MENU_ADDONS_ID, + MainMenuPopover.MAIN_MENU_ITEM_FRIENDS + }; + + @Override + public boolean shouldAddMenuItem(int itemId) { + return AndroidUtilities.indexOf(FORBIDDEN_MENU_ITEMS, itemId) < 0; + } + + @Override + public void mainMenuItemSelected(int item, Intent customIntent) { + if (item == MainMenuPopover.MAIN_MENU_ITEM_LISTS) { + finish(); + return; + } + + super.mainMenuItemSelected(item, customIntent); + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PersonViewFragment.java b/astrid/plugin-src/com/todoroo/astrid/people/PersonViewFragment.java new file mode 100644 index 000000000..05056c817 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PersonViewFragment.java @@ -0,0 +1,23 @@ +package com.todoroo.astrid.people; + +import android.view.View; +import android.view.ViewGroup; + +import com.timsu.astrid.R; +import com.todoroo.astrid.activity.TaskListFragment; + +public class PersonViewFragment extends TaskListFragment { + + public static final String EXTRA_USER_ID_LOCAL = "user_local_id"; //$NON-NLS-1$ + + @Override + protected View getListBody(ViewGroup root) { + ViewGroup parent = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.task_list_body_person, root, false); + + View taskListView = super.getListBody(parent); + parent.addView(taskListView); + + return parent; + } + +} diff --git a/astrid/res/layout/header_people_view.xml b/astrid/res/layout/header_people_view.xml new file mode 100644 index 000000000..b25ced504 --- /dev/null +++ b/astrid/res/layout/header_people_view.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + +