From e4295194a55829d3308c59076797d474c1d6abed Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 17:09:13 -0700 Subject: [PATCH 01/21] Started with infrastructure for featured lists --- api/src/com/todoroo/astrid/data/TagData.java | 3 ++ astrid/AndroidManifest.xml | 9 +++++ .../astrid/actfm/sync/ActFmDataService.java | 23 ++++++++++++ .../astrid/actfm/sync/ActFmSyncService.java | 14 +++++++ .../actfm/sync/ActFmSyncV2Provider.java | 31 +++++++++++++++- .../astrid/people/PeopleListFragment.java | 4 +- .../todoroo/astrid/tags/TagFilterExposer.java | 9 ++++- .../com/todoroo/astrid/tags/TagService.java | 33 ++++++++++++++++- .../reusable/FeaturedListFilterAdapter.java | 37 +++++++++++++++++++ .../reusable/FeaturedListFilterExposer.java | 30 +++++++++++++++ ...l => filter_list_fragment_alternative.xml} | 2 + ...l => filter_list_fragment_alternative.xml} | 2 + ...ilter_list_fragment_alternative_3pane.xml} | 2 + 13 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterAdapter.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java rename astrid/res/layout-land/{people_list_fragment.xml => filter_list_fragment_alternative.xml} (88%) rename astrid/res/layout/{people_list_fragment.xml => filter_list_fragment_alternative.xml} (88%) rename astrid/res/layout/{people_list_fragment_3pane.xml => filter_list_fragment_alternative_3pane.xml} (87%) diff --git a/api/src/com/todoroo/astrid/data/TagData.java b/api/src/com/todoroo/astrid/data/TagData.java index 9ce7b5de6..8d5e0f061 100644 --- a/api/src/com/todoroo/astrid/data/TagData.java +++ b/api/src/com/todoroo/astrid/data/TagData.java @@ -128,6 +128,9 @@ public final class TagData extends RemoteModel { /** whether tag is emergent */ public static final int FLAG_EMERGENT = 1 << 2; + /** whether tag represents a featured list */ + public static final int FLAG_FEATURED = 1 << 3; + // --- defaults /** Default values container */ diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 361d0f89c..91713d617 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -339,6 +339,15 @@ + + + + + + + + + diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java index 9492b0c11..0f16e69d2 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java @@ -17,6 +17,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; @@ -202,6 +203,28 @@ public final class ActFmDataService { } } + @SuppressWarnings("nls") + public void saveFeaturedList(JSONObject featObject) throws JSONException { + TodorooCursor cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where( + Criterion.and(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0),TagData.REMOTE_ID.eq(featObject.get("id"))))); + try { + cursor.moveToNext(); + TagData tagData = new TagData(); + if (!cursor.isAfterLast()) { + tagData.readFromCursor(cursor); + if(!tagData.getValue(TagData.NAME).equals(featObject.getString("name"))) + TagService.getInstance().rename(tagData.getValue(TagData.NAME), featObject.getString("name")); + cursor.moveToNext(); + } + ActFmSyncService.JsonHelper.tagFromJson(featObject, tagData); + tagData.setFlag(TagData.FLAGS, TagData.FLAG_FEATURED, true); + tagDataService.save(tagData); + + } finally { + cursor.close(); + } + } + /** * Save / Merge JSON user * @param userObject 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 b12d75935..040b76880 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -833,6 +833,20 @@ public final class ActFmSyncService { return result.optInt("time", 0); } + public int fetchFeaturedLists(int serverTime) throws JSONException, IOException { + if (!checkForToken()) + return 0; + JSONObject result = actFmInvoker.invoke("featured_lists", + "token", token, "modified_after", serverTime); + JSONArray featuredLists = result.getJSONArray("list"); + for (int i = 0; i < featuredLists.length(); i++) { + JSONObject featObject = featuredLists.getJSONObject(i); + actFmDataService.saveFeaturedList(featObject); + } + + return result.optInt("time", 0); + } + public int fetchUsers() throws JSONException, IOException { if (!checkForToken()) return 0; diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java index cd706d1f6..ac243cda7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java @@ -132,6 +132,8 @@ public class ActFmSyncV2Provider extends SyncV2Provider { private static final String LAST_TAG_FETCH_TIME = "actfm_lastTag"; //$NON-NLS-1$ + private static final String LAST_FEATURED_TAG_FETCH_TIME = "actfm_last_featuredTag"; //$NON-NLS-1$ + private static final String LAST_USERS_FETCH_TIME = "actfm_lastUsers"; //$NON-NLS-1$ // --- synchronize active tasks @@ -143,9 +145,9 @@ public class ActFmSyncV2Provider extends SyncV2Provider { new Thread(new Runnable() { public void run() { callback.started(); - callback.incrementMax(140); + callback.incrementMax(160); - final AtomicInteger finisher = new AtomicInteger(4); + final AtomicInteger finisher = new AtomicInteger(5); actFmPreferenceService.recordSyncStart(); updateUserStatus(); @@ -156,6 +158,8 @@ public class ActFmSyncV2Provider extends SyncV2Provider { startUpdatesFetcher(manual, callback, finisher); + startFeaturedListFetcher(callback, finisher); + actFmSyncService.waitUntilEmpty(); startTaskFetcher(manual, callback, finisher); @@ -252,7 +256,30 @@ public class ActFmSyncV2Provider extends SyncV2Provider { } } }); + } + /** fetch changes to tags */ + private void startFeaturedListFetcher(final SyncResultCallback callback, + final AtomicInteger finisher) { + new Thread(new Runnable() { + @Override + public void run() { + int time = Preferences.getInt(LAST_FEATURED_TAG_FETCH_TIME, 0); + try { + time = actFmSyncService.fetchFeaturedLists(time); + Preferences.setInt(LAST_FEATURED_TAG_FETCH_TIME, time); + } catch (JSONException e) { + handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$ + } catch (IOException e) { + handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$ + } finally { + callback.incrementProgress(20); + if(finisher.decrementAndGet() == 0) { + finishSync(callback); + } + } + } + }).start(); } /** @return runnable to fetch changes to tags */ diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java index 7d4dc5ea5..13b296e23 100644 --- a/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleListFragment.java @@ -17,8 +17,8 @@ public class PeopleListFragment extends FilterListFragment { @Override protected int getLayout(Activity activity) { if (AndroidUtilities.isTabletSized(activity)) - return R.layout.people_list_fragment_3pane; + return R.layout.filter_list_fragment_alternative_3pane; else - return R.layout.people_list_fragment; + return R.layout.filter_list_fragment_alternative; } } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index b25a57506..306f734a7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -4,6 +4,7 @@ package com.todoroo.astrid.tags; import java.util.ArrayList; +import java.util.List; import android.app.Activity; import android.content.BroadcastReceiver; @@ -140,7 +141,7 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); } - private FilterListItem[] prepareFilters(Context context) { + protected FilterListItem[] prepareFilters(Context context) { DependencyInjectionService.getInstance().inject(this); ContextManager.setContext(context); @@ -154,11 +155,15 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE } private void addTags(ArrayList list) { - ArrayList tagList = TagService.getInstance().getTagList(); + List tagList = getTagList(); list.add(filterFromTags(tagList.toArray(new Tag[tagList.size()]), R.string.tag_FEx_header)); } + protected List getTagList() { + return TagService.getInstance().getTagList(); + } + private FilterCategory filterFromTags(Tag[] tags, int name) { Filter[] filters = new Filter[tags.length + 1]; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java index 12eb7339a..478b58608 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 || tagData.getFlag(TagData.FLAGS, TagData.FLAG_EMERGENT)) { + if(tagData.getValue(TagData.DELETION_DATE) > 0 || tagData.getFlag(TagData.FLAGS, TagData.FLAG_EMERGENT) || tagData.getFlag(TagData.FLAGS, TagData.FLAG_FEATURED)) { tags.remove(tagName); continue; } @@ -351,6 +351,37 @@ public final class TagService { return tagList; } + public ArrayList getFeaturedLists() { + HashMap tags = new HashMap(); + + TodorooCursor cursor = tagDataService.query(Query.select(TagData.PROPERTIES) + .where(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0))); + try { + TagData tagData = new TagData(); + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + tagData.readFromCursor(cursor); + if (tagData.getValue(TagData.DELETION_DATE) > 0) + continue; + String tagName = tagData.getValue(TagData.NAME).trim(); + Tag tag = new Tag(tagData); + if(TextUtils.isEmpty(tag.tag)) + continue; + tags.put(tagName, tag); + } + } finally { + cursor.close(); + } + ArrayList tagList = new ArrayList(tags.values()); + Collections.sort(tagList, + new Comparator() { + @Override + public int compare(Tag object1, Tag object2) { + return object1.tag.compareToIgnoreCase(object2.tag); + } + }); + return tagList; + } + /** * Save the given array of tags into the database * @param taskId diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterAdapter.java new file mode 100644 index 000000000..9b45cc937 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterAdapter.java @@ -0,0 +1,37 @@ +package com.todoroo.astrid.tags.reusable; + +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 FeaturedListFilterAdapter extends FilterAdapter { + public static final String BROADCAST_REQUEST_FEATURED_LISTS = Constants.PACKAGE + ".REQUEST_FEATURED_LISTS"; //$NON-NLS-1$ + public static final String BROADCAST_SEND_FEATURED_LISTS = Constants.PACKAGE + ".SEND_FEATURED_LISTS"; //$NON-NLS-1$ + + public FeaturedListFilterAdapter(Activity activity, ListView listView, + int rowLayout, boolean skipIntentFilters) { + super(activity, listView, rowLayout, skipIntentFilters); + } + + @Override + public void getLists() { + Intent broadcastIntent = new Intent(BROADCAST_REQUEST_FEATURED_LISTS); + activity.sendBroadcast(broadcastIntent); + } + + @Override + public void registerRecevier() { + IntentFilter peopleFilter = new IntentFilter(BROADCAST_SEND_FEATURED_LISTS); + activity.registerReceiver(filterReceiver, peopleFilter); + getLists(); + } + + @Override + public void unregisterRecevier() { + activity.unregisterReceiver(filterReceiver); + } +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java new file mode 100644 index 000000000..f464bc8ab --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -0,0 +1,30 @@ +package com.todoroo.astrid.tags.reusable; + +import java.util.List; + +import android.content.Context; +import android.content.Intent; + +import com.todoroo.astrid.api.AstridApiConstants; +import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.tags.TagFilterExposer; +import com.todoroo.astrid.tags.TagService; +import com.todoroo.astrid.tags.TagService.Tag; + +public class FeaturedListFilterExposer extends TagFilterExposer { + + @Override + public void onReceive(Context context, Intent intent) { + FilterListItem[] listAsArray = prepareFilters(context); + + Intent broadcastIntent = new Intent(FeaturedListFilterAdapter.BROADCAST_SEND_FEATURED_LISTS); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, listAsArray); + context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); + } + + @Override + protected List getTagList() { + return TagService.getInstance().getFeaturedLists(); + } + +} diff --git a/astrid/res/layout-land/people_list_fragment.xml b/astrid/res/layout-land/filter_list_fragment_alternative.xml similarity index 88% rename from astrid/res/layout-land/people_list_fragment.xml rename to astrid/res/layout-land/filter_list_fragment_alternative.xml index bcb442a22..04cad0a51 100644 --- a/astrid/res/layout-land/people_list_fragment.xml +++ b/astrid/res/layout-land/filter_list_fragment_alternative.xml @@ -14,6 +14,8 @@ android:layout_alignParentTop="true" android:scrollbars="vertical" android:divider="@android:color/transparent" + android:dividerHeight="1px" + android:background="@android:color/transparent" android:cacheColorHint="#00000000"/> diff --git a/astrid/res/layout/people_list_fragment.xml b/astrid/res/layout/filter_list_fragment_alternative.xml similarity index 88% rename from astrid/res/layout/people_list_fragment.xml rename to astrid/res/layout/filter_list_fragment_alternative.xml index 32fc8e66e..f1fd0d3ac 100644 --- a/astrid/res/layout/people_list_fragment.xml +++ b/astrid/res/layout/filter_list_fragment_alternative.xml @@ -14,6 +14,8 @@ android:layout_alignParentTop="true" android:scrollbars="vertical" android:divider="@android:color/transparent" + android:dividerHeight="1px" + android:background="@android:color/transparent" android:cacheColorHint="#00000000"/> diff --git a/astrid/res/layout/people_list_fragment_3pane.xml b/astrid/res/layout/filter_list_fragment_alternative_3pane.xml similarity index 87% rename from astrid/res/layout/people_list_fragment_3pane.xml rename to astrid/res/layout/filter_list_fragment_alternative_3pane.xml index 5bd3072bb..cc6a83fbc 100644 --- a/astrid/res/layout/people_list_fragment_3pane.xml +++ b/astrid/res/layout/filter_list_fragment_alternative_3pane.xml @@ -14,6 +14,8 @@ android:layout_alignParentTop="true" android:scrollbars="vertical" android:divider="@android:color/transparent" + android:dividerHeight="1px" + android:background="@android:color/transparent" android:cacheColorHint="#00000000"/> From 1cd9f08c28d51d5d4080180a52be56fffd093555 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 19:51:26 -0700 Subject: [PATCH 02/21] More work on the featured lists view --- .../tags/reusable/FeaturedListActivity.java | 28 +++++++++++++++++++ .../tags/reusable/FeaturedListFragment.java | 25 +++++++++++++++++ .../tags/reusable/ReusableListActivity.java | 9 ++++++ astrid/res/layout/featured_list_activity.xml | 11 ++++++++ astrid/res/values/strings-core.xml | 3 ++ .../astrid/activity/TaskListActivity.java | 5 ++++ .../todoroo/astrid/ui/MainMenuPopover.java | 5 ++++ 7 files changed, 86 insertions(+) create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFragment.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableListActivity.java create mode 100644 astrid/res/layout/featured_list_activity.xml diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java new file mode 100644 index 000000000..8d1c353fd --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java @@ -0,0 +1,28 @@ +package com.todoroo.astrid.tags.reusable; + +import android.content.Intent; +import android.os.Bundle; + +import com.timsu.astrid.R; +import com.todoroo.astrid.activity.AstridActivity; +import com.todoroo.astrid.activity.TaskListActivity; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.api.FilterListItem; + +public class FeaturedListActivity extends AstridActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.featured_list_activity); + } + + @Override + public boolean onFilterItemClicked(FilterListItem item) { + Intent taskList = new Intent(this, TaskListActivity.class); + taskList.putExtra(TaskListFragment.TOKEN_FILTER, item); + startActivity(taskList); + return true; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFragment.java new file mode 100644 index 000000000..55fe921a3 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFragment.java @@ -0,0 +1,25 @@ +package com.todoroo.astrid.tags.reusable; + +import android.app.Activity; + +import com.timsu.astrid.R; +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.astrid.activity.FilterListFragment; +import com.todoroo.astrid.adapter.FilterAdapter; + +public class FeaturedListFragment extends FilterListFragment { + + @Override + protected FilterAdapter instantiateAdapter() { + return new FeaturedListFilterAdapter(getActivity(), null, R.layout.filter_adapter_row, false); + } + + @Override + protected int getLayout(Activity activity) { + if (AndroidUtilities.isTabletSized(activity)) + return R.layout.filter_list_fragment_alternative_3pane; + else + return R.layout.filter_list_fragment_alternative; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableListActivity.java new file mode 100644 index 000000000..0f555d79f --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableListActivity.java @@ -0,0 +1,9 @@ +package com.todoroo.astrid.tags.reusable; + +import android.app.Activity; + +public class ReusableListActivity extends Activity { + + // + +} diff --git a/astrid/res/layout/featured_list_activity.xml b/astrid/res/layout/featured_list_activity.xml new file mode 100644 index 000000000..99789bebb --- /dev/null +++ b/astrid/res/layout/featured_list_activity.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 378188a0f..5253d5126 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -124,6 +124,9 @@ People + + Featured Lists + Suggestions diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index cda9d8c68..7c2dd6fcc 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -49,6 +49,7 @@ import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.abtesting.ABTestEventReportingService; import com.todoroo.astrid.tags.TagService; +import com.todoroo.astrid.tags.reusable.FeaturedListActivity; import com.todoroo.astrid.ui.DateChangedAlerts; import com.todoroo.astrid.ui.FragmentPopover; import com.todoroo.astrid.ui.MainMenuPopover; @@ -642,6 +643,10 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener case MainMenuPopover.MAIN_MENU_ITEM_SEARCH: onSearchRequested(); return; + case MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS: + Intent featured = new Intent(this, FeaturedListActivity.class); + startActivity(featured); + return; case MainMenuPopover.MAIN_MENU_ITEM_FRIENDS: if (fragmentLayout != LAYOUT_SINGLE) { togglePeopleView(); diff --git a/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java index e47292fae..d87242d4a 100644 --- a/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java +++ b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java @@ -24,6 +24,7 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi public static final int MAIN_MENU_ITEM_LISTS = R.string.TLA_menu_lists; public static final int MAIN_MENU_ITEM_FRIENDS = R.string.TLA_menu_friends; + public static final int MAIN_MENU_ITEM_FEATURED_LISTS = R.string.TLA_menu_featured_lists; public static final int MAIN_MENU_ITEM_SEARCH = R.string.TLA_menu_search; public static final int MAIN_MENU_ITEM_SUGGESTIONS = R.string.TLA_menu_suggestions; public static final int MAIN_MENU_ITEM_SETTINGS = R.string.TLA_menu_settings; @@ -107,6 +108,10 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi ThemeService.getDrawable(R.drawable.icn_menu_friends, themeFlags), MAIN_MENU_ITEM_FRIENDS, null, topFixed); + addMenuItem(R.string.TLA_menu_featured_lists, + 0, + MAIN_MENU_ITEM_FEATURED_LISTS, null, topFixed); + addMenuItem(R.string.TLA_menu_search, ThemeService.getDrawable(R.drawable.icn_menu_search, themeFlags), MAIN_MENU_ITEM_SEARCH, null, topFixed); From fd413fab3513f310171a0e715f9c98af44c89561 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 20:04:44 -0700 Subject: [PATCH 03/21] Fixes to featured list filter exposer and json parsing --- .../astrid/actfm/sync/ActFmDataService.java | 3 +- .../astrid/actfm/sync/ActFmSyncService.java | 13 +++++- .../todoroo/astrid/tags/TagFilterExposer.java | 6 ++- .../reusable/FeaturedListFilterExposer.java | 41 +++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java index 0f16e69d2..56d18b15d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java @@ -216,8 +216,7 @@ public final class ActFmDataService { TagService.getInstance().rename(tagData.getValue(TagData.NAME), featObject.getString("name")); cursor.moveToNext(); } - ActFmSyncService.JsonHelper.tagFromJson(featObject, tagData); - tagData.setFlag(TagData.FLAGS, TagData.FLAG_FEATURED, true); + ActFmSyncService.JsonHelper.featuredListFromJson(featObject, tagData); tagDataService.save(tagData); } finally { 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 040b76880..0e82378aa 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -1424,10 +1424,21 @@ public final class ActFmSyncService { * @throws JSONException */ public static void tagFromJson(JSONObject json, TagData model) throws JSONException { + parseTagDataFromJson(json, model, false); + } + + public static void featuredListFromJson(JSONObject json, TagData model) throws JSONException { + parseTagDataFromJson(json, model, true); + } + + private static void parseTagDataFromJson(JSONObject json, TagData model, boolean featuredList) throws JSONException { model.clearValue(TagData.REMOTE_ID); model.setValue(TagData.REMOTE_ID, json.getLong("id")); model.setValue(TagData.NAME, json.getString("name")); - readUser(json.getJSONObject("user"), model, TagData.USER_ID, TagData.USER); + readUser(json.getJSONObject(featuredList ? "author" : "user"), model, TagData.USER_ID, TagData.USER); + + if (featuredList) + model.setFlag(TagData.FLAGS, TagData.FLAG_FEATURED, true); if(json.has("picture")) model.setValue(TagData.PICTURE, json.optString("picture", "")); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index 306f734a7..bccc43efb 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -185,11 +185,15 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE filters[0] = untagged; for(int i = 0; i < tags.length; i++) - filters[i+1] = filterFromTag(context, tags[i], TaskCriteria.activeAndVisible()); + filters[i+1] = constructFilter(context, tags[i]); FilterCategory filter = new FilterCategory(context.getString(name), filters); return filter; } + protected Filter constructFilter(Context context, Tag tag) { + return filterFromTag(context, tag, TaskCriteria.activeAndVisible()); + } + // --- tag manipulation activities public abstract static class TagActivity extends Activity { diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java index f464bc8ab..a1e172de7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -2,11 +2,23 @@ package com.todoroo.astrid.tags.reusable; import java.util.List; +import android.content.ComponentName; +import android.content.ContentValues; import android.content.Context; import android.content.Intent; +import android.os.Bundle; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.QueryTemplate; +import com.todoroo.astrid.actfm.TagViewFragment; 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.data.Metadata; +import com.todoroo.astrid.data.TaskApiDao.TaskCriteria; import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService.Tag; @@ -22,6 +34,35 @@ public class FeaturedListFilterExposer extends TagFilterExposer { context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); } + private static FilterWithCustomIntent filterFromFeaturedList(Tag tag, Criterion criterion) { + String title = tag.tag; + QueryTemplate tagTemplate = tag.queryTemplate(criterion); + ContentValues contentValues = new ContentValues(); + contentValues.put(Metadata.KEY.name, TagService.KEY); + contentValues.put(TagService.TAG.name, tag.tag); + + FilterWithUpdate filter = new FilterWithUpdate(tag.tag, + title, tagTemplate, + contentValues); + + Class fragmentClass = FeaturedListFragment.class; + filter.customTaskList = new ComponentName(ContextManager.getContext(), fragmentClass); + if(tag.image != null) + filter.imageUrl = tag.image; + + Bundle extras = new Bundle(); + extras.putString(TagViewFragment.EXTRA_TAG_NAME, tag.tag); + extras.putLong(TagViewFragment.EXTRA_TAG_REMOTE_ID, tag.remoteId); + filter.customExtras = extras; + + return filter; + } + + @Override + protected Filter constructFilter(Context context, Tag tag) { + return filterFromFeaturedList(tag, TaskCriteria.activeAndVisible()); + } + @Override protected List getTagList() { return TagService.getInstance().getFeaturedLists(); From b409497c8df6449009303f98a256eae77286fc39 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 20:15:26 -0700 Subject: [PATCH 04/21] More json fixes and manifest declarations --- astrid/AndroidManifest.xml | 2 ++ .../com/todoroo/astrid/actfm/sync/ActFmSyncService.java | 3 ++- .../astrid/tags/reusable/FeaturedListFilterExposer.java | 2 +- .../astrid/tags/reusable/FeaturedTaskListFragment.java | 7 +++++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 91713d617..81de9a547 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -347,6 +347,8 @@ + 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 0e82378aa..3ca2372b8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -1435,7 +1435,8 @@ public final class ActFmSyncService { model.clearValue(TagData.REMOTE_ID); model.setValue(TagData.REMOTE_ID, json.getLong("id")); model.setValue(TagData.NAME, json.getString("name")); - readUser(json.getJSONObject(featuredList ? "author" : "user"), model, TagData.USER_ID, TagData.USER); + if (!featuredList) + readUser(json.getJSONObject("user"), model, TagData.USER_ID, TagData.USER); if (featuredList) model.setFlag(TagData.FLAGS, TagData.FLAG_FEATURED, true); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java index a1e172de7..f6b171c5a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -45,7 +45,7 @@ public class FeaturedListFilterExposer extends TagFilterExposer { title, tagTemplate, contentValues); - Class fragmentClass = FeaturedListFragment.class; + Class fragmentClass = FeaturedTaskListFragment.class; filter.customTaskList = new ComponentName(ContextManager.getContext(), fragmentClass); if(tag.image != null) filter.imageUrl = tag.image; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java new file mode 100644 index 000000000..8ac8da6e4 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -0,0 +1,7 @@ +package com.todoroo.astrid.tags.reusable; + +import com.todoroo.astrid.activity.TaskListFragment; + +public class FeaturedTaskListFragment extends TaskListFragment { + +} From fb51a7334c1e3b1e7403b29dcdee62657833895d Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 21:09:15 -0700 Subject: [PATCH 05/21] Started on reusable task adapter --- .../reusable/FeaturedTaskListFragment.java | 10 +++++++ .../tags/reusable/ReusableTaskAdapter.java | 18 ++++++++++++ .../res/layout/reusable_task_adapter_row.xml | 28 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java create mode 100644 astrid/res/layout/reusable_task_adapter_row.xml diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 8ac8da6e4..de3d09b89 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -1,7 +1,17 @@ package com.todoroo.astrid.tags.reusable; +import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.TaskAdapter; +import com.todoroo.astrid.data.Task; public class FeaturedTaskListFragment extends TaskListFragment { + @Override + protected TaskAdapter createTaskAdapter(TodorooCursor cursor) { + return new ReusableTaskAdapter(this, R.layout.reusable_task_adapter_row, + cursor, sqlQueryTemplate, false, null); + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java new file mode 100644 index 000000000..c9fd5bf83 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -0,0 +1,18 @@ +package com.todoroo.astrid.tags.reusable; + +import java.util.concurrent.atomic.AtomicReference; + +import android.database.Cursor; + +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.TaskAdapter; + +public class ReusableTaskAdapter extends TaskAdapter { + + public ReusableTaskAdapter(TaskListFragment fragment, int resource, + Cursor c, AtomicReference query, boolean autoRequery, + OnCompletedTaskListener onCompletedTaskListener) { + super(fragment, resource, c, query, autoRequery, onCompletedTaskListener); + } + +} diff --git a/astrid/res/layout/reusable_task_adapter_row.xml b/astrid/res/layout/reusable_task_adapter_row.xml new file mode 100644 index 000000000..342b1c927 --- /dev/null +++ b/astrid/res/layout/reusable_task_adapter_row.xml @@ -0,0 +1,28 @@ + + + + + + + + + + From ba80ac686c156e5bf6aacb0329f95164b0c8e168 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 12:25:12 -0700 Subject: [PATCH 06/21] Featured lists fragment now mostly working, needs polish --- .../todoroo/astrid/actfm/TagViewFragment.java | 10 +-- .../todoroo/astrid/tags/TagFilterExposer.java | 33 ++++++---- .../tags/reusable/FeaturedListActivity.java | 37 +++++++---- .../reusable/FeaturedListFilterExposer.java | 1 + .../reusable/FeaturedTaskListFragment.java | 34 +++++++++- .../tags/reusable/ReusableTaskAdapter.java | 62 +++++++++++++++++++ .../layout/task_list_body_featured_list.xml | 56 +++++++++++++++++ astrid/res/values/strings-actfm.xml | 4 ++ .../todoroo/astrid/adapter/TaskAdapter.java | 7 +-- 9 files changed, 208 insertions(+), 36 deletions(-) create mode 100644 astrid/res/layout/task_list_body_featured_list.xml diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java index ba8777a23..c50f01d50 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java @@ -96,8 +96,6 @@ public class TagViewFragment extends TaskListFragment { private Filter originalFilter; - //private ImageAdapter galleryAdapter; - // --- UI initialization @Override @@ -142,7 +140,7 @@ public class TagViewFragment extends TaskListFragment { */ @Override protected View getListBody(ViewGroup root) { - ViewGroup parent = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.task_list_body_tag, root, false); + ViewGroup parent = (ViewGroup) getActivity().getLayoutInflater().inflate(getTaskListBodyLayout(), root, false); taskListView = super.getListBody(parent); parent.addView(taskListView); @@ -150,6 +148,10 @@ public class TagViewFragment extends TaskListFragment { return parent; } + protected int getTaskListBodyLayout() { + return R.layout.task_list_body_tag; + } + private void showListSettingsPopover() { if (!AstridPreferences.canShowPopover()) return; @@ -295,7 +297,7 @@ public class TagViewFragment extends TaskListFragment { Preferences.setLong(LAST_FETCH_KEY + tagData.getId(), DateUtilities.now()); } - private void setUpMembersGallery() { + protected void setUpMembersGallery() { LinearLayout membersView = (LinearLayout)getView().findViewById(R.id.shared_with); membersView.setOnClickListener(settingsListener); try { diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index bccc43efb..f3d9d4dd9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -63,6 +63,8 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE @Autowired TagDataService tagDataService; @Autowired GtasksPreferenceService gtasksPreferenceService; + protected boolean addUntaggedFilter = true; + /** Create filter from new tag object */ @SuppressWarnings("nls") public static FilterWithCustomIntent filterFromTag(Context context, Tag tag, Criterion criterion) { @@ -165,7 +167,8 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE } private FilterCategory filterFromTags(Tag[] tags, int name) { - Filter[] filters = new Filter[tags.length + 1]; + int length = addUntaggedFilter ? tags.length + 1 : tags.length; + Filter[] filters = new Filter[length]; Context context = ContextManager.getContext(); Resources r = context.getResources(); @@ -174,18 +177,22 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0; // --- untagged - int untaggedLabel = gtasksPreferenceService.isLoggedIn() ? - R.string.tag_FEx_untagged_w_astrid : R.string.tag_FEx_untagged; - Filter untagged = new Filter(r.getString(untaggedLabel), - r.getString(R.string.tag_FEx_untagged), - TagService.untaggedTemplate(), - null); - untagged.listingIcon = ((BitmapDrawable)r.getDrawable( - ThemeService.getDrawable(R.drawable.gl_lists, themeFlags))).getBitmap(); - filters[0] = untagged; - - for(int i = 0; i < tags.length; i++) - filters[i+1] = constructFilter(context, tags[i]); + if (addUntaggedFilter) { + int untaggedLabel = gtasksPreferenceService.isLoggedIn() ? + R.string.tag_FEx_untagged_w_astrid : R.string.tag_FEx_untagged; + Filter untagged = new Filter(r.getString(untaggedLabel), + r.getString(R.string.tag_FEx_untagged), + TagService.untaggedTemplate(), + null); + untagged.listingIcon = ((BitmapDrawable)r.getDrawable( + ThemeService.getDrawable(R.drawable.gl_lists, themeFlags))).getBitmap(); + filters[0] = untagged; + } + + for(int i = 0; i < tags.length; i++) { + int index = addUntaggedFilter ? i + 1 : i; + filters[index] = constructFilter(context, tags[i]); + } FilterCategory filter = new FilterCategory(context.getString(name), filters); return filter; } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java index 8d1c353fd..f8b9dea97 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java @@ -1,28 +1,39 @@ package com.todoroo.astrid.tags.reusable; import android.content.Intent; -import android.os.Bundle; -import com.timsu.astrid.R; -import com.todoroo.astrid.activity.AstridActivity; +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.FilterListItem; +import com.todoroo.astrid.ui.MainMenuPopover; -public class FeaturedListActivity extends AstridActivity { +public class FeaturedListActivity extends TaskListActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.featured_list_activity); + protected Class getFilterListClass() { + return FeaturedListFragment.class; } + + private static final int[] FORBIDDEN_MENU_ITEMS = { + TaskListFragment.MENU_NEW_FILTER_ID, + TaskListFragment.MENU_ADDONS_ID, + MainMenuPopover.MAIN_MENU_ITEM_FRIENDS + }; + @Override - public boolean onFilterItemClicked(FilterListItem item) { - Intent taskList = new Intent(this, TaskListActivity.class); - taskList.putExtra(TaskListFragment.TOKEN_FILTER, item); - startActivity(taskList); - return true; + 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/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java index f6b171c5a..56b78992d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -27,6 +27,7 @@ public class FeaturedListFilterExposer extends TagFilterExposer { @Override public void onReceive(Context context, Intent intent) { + addUntaggedFilter = false; FilterListItem[] listAsArray = prepareFilters(context); Intent broadcastIntent = new Intent(FeaturedListFilterAdapter.BROADCAST_SEND_FEATURED_LISTS); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index de3d09b89..955ec118e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -1,12 +1,15 @@ package com.todoroo.astrid.tags.reusable; +import android.view.View; +import android.view.View.OnClickListener; + import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; -import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.data.Task; -public class FeaturedTaskListFragment extends TaskListFragment { +public class FeaturedTaskListFragment extends TagViewFragment { @Override protected TaskAdapter createTaskAdapter(TodorooCursor cursor) { @@ -14,4 +17,31 @@ public class FeaturedTaskListFragment extends TaskListFragment { cursor, sqlQueryTemplate, false, null); } + @Override + protected void setupQuickAddBar() { + super.setupQuickAddBar(); + quickAddBar.setVisibility(View.GONE); + } + + @Override + public void onTaskListItemClicked(long taskId) { + // Do nothing + } + + @Override + protected int getTaskListBodyLayout() { + return R.layout.task_list_body_featured_list; + } + + @Override + protected void setUpMembersGallery() { + View clone = getView().findViewById(R.id.clone_list); + clone.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + System.err.println("Cloning list"); + } + }); + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java index c9fd5bf83..a314e3e6a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -2,10 +2,20 @@ package com.todoroo.astrid.tags.reusable; import java.util.concurrent.atomic.AtomicReference; +import android.content.Context; import android.database.Cursor; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.adapter.TaskAdapter; +import com.todoroo.astrid.data.Task; public class ReusableTaskAdapter extends TaskAdapter { @@ -15,4 +25,56 @@ public class ReusableTaskAdapter extends TaskAdapter { super(fragment, resource, c, query, autoRequery, onCompletedTaskListener); } + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + ViewGroup view = (ViewGroup)inflater.inflate(resource, parent, false); + + ReusableTaskViewHolder viewHolder = new ReusableTaskViewHolder(); + viewHolder.task = new Task(); + viewHolder.clone = (ImageView) view.findViewById(R.id.clone_task); + viewHolder.title = (TextView) view.findViewById(R.id.title); + + boolean showFullTaskTitle = Preferences.getBoolean(R.string.p_fullTaskTitle, false); + if (showFullTaskTitle) { + viewHolder.title.setMaxLines(Integer.MAX_VALUE); + } + + view.setTag(viewHolder); + for(int i = 0; i < view.getChildCount(); i++) + view.getChildAt(i).setTag(viewHolder); + + viewHolder.clone.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + // Clone task + System.err.println("Cloning task"); + } + }); + + return view; + } + + @Override + public void bindView(View view, Context context, Cursor c) { + TodorooCursor cursor = (TodorooCursor)c; + ReusableTaskViewHolder viewHolder = (ReusableTaskViewHolder) view.getTag(); + + Task task = viewHolder.task; + task.clear(); + task.readFromCursor(cursor); + + viewHolder.title.setText(task.getValue(Task.TITLE)); + if (Preferences.getBoolean(R.string.p_allowCompressedTaskRows, false)) { + view.setMinimumHeight(0); + } else { + view.setMinimumHeight(minRowHeight); + } + } + + public static class ReusableTaskViewHolder { + public Task task; + public ImageView clone; + public TextView title; + } + } diff --git a/astrid/res/layout/task_list_body_featured_list.xml b/astrid/res/layout/task_list_body_featured_list.xml new file mode 100644 index 000000000..1c3093292 --- /dev/null +++ b/astrid/res/layout/task_list_body_featured_list.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml index 2ace9f4e0..d9dbb2fe1 100644 --- a/astrid/res/values/strings-actfm.xml +++ b/astrid/res/values/strings-actfm.xml @@ -270,6 +270,10 @@ Please log in: + + + Copy this list + Status - Logged in as %s diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 9bbd5f059..a27983c51 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -163,8 +163,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable { protected final HashMap completedItems = new HashMap(0); protected OnCompletedTaskListener onCompletedTaskListener = null; public boolean isFling = false; - private final int resource; - private final LayoutInflater inflater; + protected final int resource; + protected final LayoutInflater inflater; private DetailLoaderThread detailLoader; private ActionsLoaderThread actionsLoader; private int fontSize; @@ -174,7 +174,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { private final AtomicReference query; - private final int minRowHeight; + protected final int minRowHeight; // measure utilities protected final Paint paint; @@ -1008,7 +1008,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable { public void notifyDataSetChanged() { super.notifyDataSetChanged(); fontSize = Preferences.getIntegerFromString(R.string.p_fontSize, 18); - } protected final View.OnClickListener completeBoxListener = new View.OnClickListener() { From aac0b196fecb3c6c95893f5c97fd865e266f8d8c Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 14:30:02 -0700 Subject: [PATCH 07/21] Cloning individual reusable tasks --- .../tags/reusable/ReusableTaskAdapter.java | 6 ++++-- astrid/res/drawable-hdpi/icn_clone_down.png | Bin 0 -> 1349 bytes astrid/res/drawable-hdpi/icn_clone_up.png | Bin 0 -> 1410 bytes astrid/res/drawable/btn_clone.xml | 7 +++++++ astrid/res/drawable/icn_clone_down.png | Bin 0 -> 2613 bytes astrid/res/drawable/icn_clone_up.png | Bin 0 -> 2624 bytes astrid/res/layout/reusable_task_adapter_row.xml | 8 ++++++-- .../com/todoroo/astrid/adapter/TaskAdapter.java | 2 +- .../com/todoroo/astrid/service/TaskService.java | 13 +++++++++++++ 9 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 astrid/res/drawable-hdpi/icn_clone_down.png create mode 100644 astrid/res/drawable-hdpi/icn_clone_up.png create mode 100644 astrid/res/drawable/btn_clone.xml create mode 100644 astrid/res/drawable/icn_clone_down.png create mode 100644 astrid/res/drawable/icn_clone_up.png diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java index a314e3e6a..d9417f108 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -16,6 +16,7 @@ import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.utility.Flags; public class ReusableTaskAdapter extends TaskAdapter { @@ -46,8 +47,9 @@ public class ReusableTaskAdapter extends TaskAdapter { viewHolder.clone.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - // Clone task - System.err.println("Cloning task"); + ReusableTaskViewHolder holder = (ReusableTaskViewHolder) v.getTag(); + taskService.cloneReusableTask(holder.task); + Flags.set(Flags.REFRESH); } }); diff --git a/astrid/res/drawable-hdpi/icn_clone_down.png b/astrid/res/drawable-hdpi/icn_clone_down.png new file mode 100644 index 0000000000000000000000000000000000000000..d99f8ad7f98655726782639ae63c93bc1d5ec00e GIT binary patch literal 1349 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 + + + + + \ No newline at end of file diff --git a/astrid/res/drawable/icn_clone_down.png b/astrid/res/drawable/icn_clone_down.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c4bf5b194425a0a2b4db5b0060f695b142ecd9 GIT binary patch literal 2613 zcmV-53d;3~P)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zq$gGR9J<* zm(Oq9))B`)LvnY?)ymRFu>skD1lv`8knLJPFP7bl6ST>xsB_H4K!N7oOA6!=`wwW4 zG$8-c)*DXbX#6cY&9M_O5s|gCksarR70Cg=X(Jsli%b6VbLt3lR3Wd@E-Yy>> z`QCSCzVm~a8D<8T@yhG}#{i_f4gjuPx#HQ&ri+VDRh_G)600GR5Ocm$SzdZQoKYo1g z-n|=u6EkCRaWQH(TYs!K8t41{zM7ft?^*E#8<+xt?H?8Xn~0g2=Xs2` z#?JyrJrNO6J%}2Z31*BOs`w(*Yc=XYK)qJO_XJc&zdJm}fFr@NW5*7dWn*d{d!mAY z=X*R_d&Iv#eMr4tBXy1=hYvH^ocdqfo6Kzy?S7ytgCV&JmRotwS$gbl1J|BO4pO;=b%f*X7 zpx29OHY36?G_|8MER%wm_IEraLWRX868O5NxH5dM#k` zKnu_FhMx5b5VfGjc1;F@0a=z+AivTQs^I&>AW8shYiq2mEaUs*WSKHO-R9xLe-X!V zp4!b25qgC?mY47H*=OqnfyZF*1@rT#Xt&!#K&mJxL3BFMZd=8RQheX1)9LWcGvDL# z<(Em4q%wOP$DBHK3g;ZY@8evbGiT25=9|A{Y-|iOLsbdGkn7j4^Y+_+;LxE%WZ3|a z!U{_1{9tOTgIOChe+P(>M9qA2+ld2%kMdtGCzNkg@uJ`4^^en zsI#%L&TFr|%JlR!gTWwYO~HqX6P?Z!6B9PX>QWPkh~pk{oUpmMS%D~BwH;KNCiHsU z%H*m_tJR{{>lO11)l$iP|8gDxWSJtOsAd(qJbT83QA8AlMHKiz&H>l&fP)mU0u;)NG}wBxz))&$4Dahx=DRY}QDki5z-}o=_meRCi>|G73s5i_`WZl^>AL<0K|Y(j68Vk}85qPC#C83^FxFb(ZCeWdx}z zS+>P|RYgY?u<~EGaU$2MWb5wDKTah$WCDCQahU?(Xe_DKA_`mT4bIi)7V*k0AKI8B(+wdo<|I?e{36 zS%yoK`@o|BV10f4*OQa&OTO=aOLJm;ogW?|BGMlWR=d6K4eIp=Lh&&&IXU@MqY?ew z_v8e~|7?q0#qysl%T_nLn{PSie$#HZKae8z3Q&)t=-W{vy5#xZSwqIaJoX2UQDpH! zzkk0M$2U~#ZfK6B85nS65fNW@cXk XV-z%iWcGxA00000NkvXXu0mjf@RJD} literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_clone_up.png b/astrid/res/drawable/icn_clone_up.png new file mode 100644 index 0000000000000000000000000000000000000000..30cd930ab0e94cfa5d9657d98f902210bcc96264 GIT binary patch literal 2624 zcmV-G3cvM4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p z4XxBhQ9wwvzyq)JA+e~$1Al~_chpB7 zKvgK>rJ^XM4?GY>LXc9FrfD5V`5_+o5zDb4Stqu4W_D)oIXuknbk}L(g{BTLUxD6OU&C=46U0ht06DNN3g<8Gxt8%$?)bo6d`Sg453{@q| zGU7P8xN>>r$M3!Or;FOBWMScWrBZ$7_qAH>XcR?a41)G>KKighP_cLKZd`u*%x`|s zZnv*n06#eNisyMp!>}VF&NwH&6Y-t$g#W;6{HYc1A#fMPH>5kwp#t~aVaiqwGp{_*3- z>tA}}$uZ{~BFZQ%SZmnc?y$ABjj;xCLZeZqR;wW*BY*%A!DVWIir;RR_3tyXKKJmLiHf%PXR!Kp*UjkZ_>RVD7m#BrBSr-SEtL{UUH zj>%;mEl=(t@Yh*qpF4nvj=b18hk>3s^I?p^^$zmi90tH=eG+N9BEfLvRp5DEamVv4 zpVU!}F_cT?p}D{SGsE-q!$=PV>p0iMbN4f0tz~O#n~jYPthJ~rK@f29(q&FYQ31pl zLli}P^wA}n`#wjSWtbj-W^*sKTK&GOxbo8^1o{SI;5#adgOJWW%QBq>15&CStjwTc`fLZuS0v9ZCg-+GI^dyfp| z-@ybpCs^ljZkP#B;wT~vBRZW<0iyqW5LCC@B@DwtqW&gfr&CnTV18rFpeI1oA>!?z zOXwyEK@c!DR>kwYp-qz{AxRR9F@;ykh6@#;S6vM= zG`$Z*zq1Z8p#zgL=V;VxoPYPvy#D%WvNXjxWny9v|M=(MIDPsT9654?FbpY|%PcQ1 z^XjWV-1W=c_7Fl)t`%piI49&#Ryk6whUsgP@wrI4B1qs(sydNsuN9(^He2KmRWG?%pK~ zLn_rOmp=G_uRJ|Vk|aY0e-IOD%*Q3_oHL>_^7n*GQyPs1XV0GHwby=9-2d_uPck(< zO_pW5{w}EGOcW)0<;s=q7hgOU8Y?()BYopK5t_{=-}vUYa^{S|Wf_@snBAlx-@=H& zi8Fxa#uRr)#iFv)!w-%$%Sh8SH`$I2c1NK|Ztes~eSkFWo-@XLUqoyl=!jVUm(U!C za&L3<8nEdDtgWrRIW;wXvQ#S1XIUo37|}=Z5Bh-cecy&*cyo32<~iWD0gS5Z!Gi~% zYc?PIneTfoW6VyLA4#a@3?xbS=B-<6KfQD3&hKVsX8vk4uUP}wdc8h(;K1ikluG4e z#!$-vJ|bxh29+cXqieVRwSF#*we7u0000 + android:orientation="horizontal" + android:gravity="center_vertical"> + android:src="@drawable/btn_clone" + android:scaleType="fitCenter" + android:padding="6dip"/> Date: Tue, 26 Jun 2012 16:52:07 -0700 Subject: [PATCH 08/21] Cloning reusable lists working, naming of copies not handled well --- .../astrid/actfm/sync/ActFmDataService.java | 2 +- .../astrid/actfm/sync/ActFmSyncService.java | 7 ++- .../actfm/sync/ActFmSyncV2Provider.java | 7 ++- .../tags/reusable/FeaturedListActivity.java | 4 +- .../reusable/FeaturedTaskListFragment.java | 59 +++++++++++++++++-- .../tags/reusable/ReusableTaskAdapter.java | 2 +- .../astrid/activity/TaskListFragment.java | 2 +- .../todoroo/astrid/adapter/TaskAdapter.java | 4 ++ .../todoroo/astrid/service/TaskService.java | 12 +++- 9 files changed, 85 insertions(+), 14 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java index 56d18b15d..6339904a0 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmDataService.java @@ -206,7 +206,7 @@ public final class ActFmDataService { @SuppressWarnings("nls") public void saveFeaturedList(JSONObject featObject) throws JSONException { TodorooCursor cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where( - Criterion.and(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0),TagData.REMOTE_ID.eq(featObject.get("id"))))); + Criterion.and(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0), TagData.REMOTE_ID.eq(featObject.get("id"))))); try { cursor.moveToNext(); TagData tagData = new TagData(); 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 3ca2372b8..0d2dd8f9a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -40,6 +40,7 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Query; @@ -827,7 +828,9 @@ public final class ActFmSyncService { if(serverTime == 0) { Long[] remoteIdArray = remoteIds.toArray(new Long[remoteIds.size()]); - tagDataService.deleteWhere(Criterion.not(TagData.REMOTE_ID.in(remoteIdArray))); + tagDataService.deleteWhere(Criterion.and( + Criterion.not(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0)), + Criterion.not(TagData.REMOTE_ID.in(remoteIdArray)))); } return result.optInt("time", 0); @@ -1201,6 +1204,7 @@ public final class ActFmSyncService { } catch (SQLiteConstraintException e) { taskDao.handleSQLiteConstraintException(remote); } + ids.add(remote.getId()); metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY)); synchronizeAttachments(item, remote); @@ -1435,6 +1439,7 @@ public final class ActFmSyncService { model.clearValue(TagData.REMOTE_ID); model.setValue(TagData.REMOTE_ID, json.getLong("id")); model.setValue(TagData.NAME, json.getString("name")); + if (!featuredList) readUser(json.getJSONObject("user"), model, TagData.USER_ID, TagData.USER); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java index ac243cda7..886ea55a4 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java @@ -19,6 +19,7 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.Preferences; @@ -366,10 +367,12 @@ public class ActFmSyncV2Provider extends SyncV2Provider { private void pushQueuedTags(final SyncResultCallback callback, final AtomicInteger finisher, int lastTagSyncTime) { TodorooCursor tagDataCursor = tagDataService.query(Query.select(TagData.PROPERTIES) - .where(Criterion.or( + .where(Criterion.and( + Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).eq(0), + Criterion.or( TagData.REMOTE_ID.eq(0), Criterion.and(TagData.REMOTE_ID.gt(0), - TagData.MODIFICATION_DATE.gt(lastTagSyncTime))))); + TagData.MODIFICATION_DATE.gt(lastTagSyncTime)))))); try { pushQueued(callback, finisher, tagDataCursor, true, tagPusher); } finally { diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java index f8b9dea97..2b0708c99 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java @@ -19,7 +19,9 @@ public class FeaturedListActivity extends TaskListActivity { private static final int[] FORBIDDEN_MENU_ITEMS = { TaskListFragment.MENU_NEW_FILTER_ID, TaskListFragment.MENU_ADDONS_ID, - MainMenuPopover.MAIN_MENU_ITEM_FRIENDS + TaskListFragment.MENU_SORT_ID, + MainMenuPopover.MAIN_MENU_ITEM_FRIENDS, + MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS, }; @Override diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 955ec118e..1985ef82d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -2,15 +2,23 @@ package com.todoroo.astrid.tags.reusable; import android.view.View; import android.view.View.OnClickListener; +import android.widget.TextView; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.adapter.TaskAdapter; +import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.service.TagDataService; public class FeaturedTaskListFragment extends TagViewFragment { + @Autowired private TagDataService tagDataService; + @Override protected TaskAdapter createTaskAdapter(TodorooCursor cursor) { return new ReusableTaskAdapter(this, R.layout.reusable_task_adapter_row, @@ -35,13 +43,52 @@ public class FeaturedTaskListFragment extends TagViewFragment { @Override protected void setUpMembersGallery() { + // Repurposed this method to set up listener for clone list button View clone = getView().findViewById(R.id.clone_list); - clone.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - System.err.println("Cloning list"); - } - }); + if (taskAdapter == null || taskAdapter.getCount() == 0) { + clone.setOnClickListener(null); + } else { + clone.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + // Clone list + String localName = tagData.getValue(TagData.NAME) + " (Copy)"; + long remoteId = 0; + TodorooCursor existing = tagDataService.query(Query.select(TagData.REMOTE_ID) + .where(TagData.NAME.eqCaseInsensitive(localName))); + try { + if (existing.getCount() > 0) { + existing.moveToFirst(); + TagData match = new TagData(existing); + remoteId = match.getValue(TagData.REMOTE_ID); + } + + } finally { + existing.close(); + } + + TodorooCursor tasks = taskService.fetchFiltered(taskAdapter.getQuery(), null, Task.PROPERTIES); + try { + Task t = new Task(); + for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { + t.readFromCursor(tasks); + taskService.cloneReusableTask(t, + localName, remoteId); + } + DialogUtilities.okDialog(getActivity(), "Success!", null); + } finally { + tasks.close(); + } + } + }); + } + } + + @Override + protected void refresh() { + loadTaskListContent(true); + ((TextView)taskListView.findViewById(android.R.id.empty)).setText(R.string.TLA_no_items); + setUpMembersGallery(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java index d9417f108..48a1d8dc9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -48,7 +48,7 @@ public class ReusableTaskAdapter extends TaskAdapter { @Override public void onClick(View v) { ReusableTaskViewHolder holder = (ReusableTaskViewHolder) v.getTag(); - taskService.cloneReusableTask(holder.task); + taskService.cloneReusableTask(holder.task, null, 0); Flags.set(Flags.REFRESH); } }); diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index 4f1fc8618..7cc0cc1fc 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -127,7 +127,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, public static final int MENU_ADDONS_ID = R.string.TLA_menu_addons; protected static final int MENU_SETTINGS_ID = R.string.TLA_menu_settings; - protected static final int MENU_SORT_ID = R.string.TLA_menu_sort; + public static final int MENU_SORT_ID = R.string.TLA_menu_sort; protected static final int MENU_SYNC_ID = R.string.TLA_menu_sync; protected static final int MENU_SUPPORT_ID = R.string.TLA_menu_support; public static final int MENU_NEW_FILTER_ID = R.string.FLA_new_filter; diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 98952c931..ce31dba71 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -258,6 +258,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable { return newCursor; } + public String getQuery() { + return query.get(); + } + /* ====================================================================== * =========================================================== view setup * ====================================================================== */ diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java index 9740246ab..061e9a11a 100644 --- a/astrid/src/com/todoroo/astrid/service/TaskService.java +++ b/astrid/src/com/todoroo/astrid/service/TaskService.java @@ -184,7 +184,7 @@ public class TaskService { return newTask; } - public Task cloneReusableTask(Task task) { + public Task cloneReusableTask(Task task, String listName, long remoteId) { Task newTask = fetchById(task.getId(), Task.PROPERTIES); if (newTask == null) return new Task(); @@ -194,6 +194,16 @@ public class TaskService { newTask.clearValue(Task.USER_ID); taskDao.save(newTask); + + if (listName != null) { + Metadata tag = new Metadata(); + tag.setValue(Metadata.TASK, newTask.getId()); + tag.setValue(Metadata.KEY, TagService.KEY); + tag.setValue(TagService.TAG, listName); + if (remoteId > 0) + tag.setValue(TagService.REMOTE_ID, remoteId); + metadataDao.createNew(tag); + } return newTask; } From 52494f1009d06da9ef6b63040cf673d9c84745ac Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 16:53:54 -0700 Subject: [PATCH 09/21] Forgot to set a flag --- .../todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 1985ef82d..611daa12a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -14,6 +14,7 @@ import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.TagDataService; +import com.todoroo.astrid.utility.Flags; public class FeaturedTaskListFragment extends TagViewFragment { @@ -75,6 +76,7 @@ public class FeaturedTaskListFragment extends TagViewFragment { taskService.cloneReusableTask(t, localName, remoteId); } + Flags.set(Flags.REFRESH); DialogUtilities.okDialog(getActivity(), "Success!", null); } finally { tasks.close(); From 0050f1caffb440a307ab38b63790a9d3078e55c5 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 17:03:04 -0700 Subject: [PATCH 10/21] Don't allow adding tasks on featured lists --- .../todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 611daa12a..ccc212feb 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -30,6 +30,7 @@ public class FeaturedTaskListFragment extends TagViewFragment { protected void setupQuickAddBar() { super.setupQuickAddBar(); quickAddBar.setVisibility(View.GONE); + ((TextView) getView().findViewById(android.R.id.empty)).setOnClickListener(null); } @Override From ff853e0ce04683f7fa6f324dc18dee60f8673872 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 17:55:11 -0700 Subject: [PATCH 11/21] Localized strings and added progress dialog to cloning process --- .../reusable/FeaturedTaskListFragment.java | 84 +++++++++++-------- .../tags/reusable/ReusableTaskAdapter.java | 2 + astrid/res/values/strings-actfm.xml | 10 +++ 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index ccc212feb..43e8d6851 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -1,8 +1,11 @@ package com.todoroo.astrid.tags.reusable; +import android.app.Activity; +import android.app.ProgressDialog; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; +import android.widget.Toast; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; @@ -47,44 +50,57 @@ public class FeaturedTaskListFragment extends TagViewFragment { protected void setUpMembersGallery() { // Repurposed this method to set up listener for clone list button View clone = getView().findViewById(R.id.clone_list); - if (taskAdapter == null || taskAdapter.getCount() == 0) { - clone.setOnClickListener(null); - } else { - clone.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - // Clone list - String localName = tagData.getValue(TagData.NAME) + " (Copy)"; - long remoteId = 0; - TodorooCursor existing = tagDataService.query(Query.select(TagData.REMOTE_ID) - .where(TagData.NAME.eqCaseInsensitive(localName))); - try { - if (existing.getCount() > 0) { - existing.moveToFirst(); - TagData match = new TagData(existing); - remoteId = match.getValue(TagData.REMOTE_ID); - } - - } finally { - existing.close(); + clone.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + // Clone list + if (taskAdapter == null || taskAdapter.getCount() == 0) { + Toast.makeText(getActivity(), R.string.actfm_feat_list_clone_empty, Toast.LENGTH_LONG); + return; + } + final String localName = tagData.getValue(TagData.NAME) + " " + getString(R.string.actfm_feat_list_suffix); //$NON-NLS-1$ + long remoteId = 0; + TodorooCursor existing = tagDataService.query(Query.select(TagData.REMOTE_ID) + .where(TagData.NAME.eqCaseInsensitive(localName))); + try { + if (existing.getCount() > 0) { + existing.moveToFirst(); + TagData match = new TagData(existing); + remoteId = match.getValue(TagData.REMOTE_ID); } - TodorooCursor tasks = taskService.fetchFiltered(taskAdapter.getQuery(), null, Task.PROPERTIES); - try { - Task t = new Task(); - for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { - t.readFromCursor(tasks); - taskService.cloneReusableTask(t, - localName, remoteId); + } finally { + existing.close(); + } + + final ProgressDialog pd = DialogUtilities.progressDialog(getActivity(), getString(R.string.actfm_feat_list_cloning)); + + final long finalRemoteId = remoteId; + new Thread(new Runnable() { + @Override + public void run() { + TodorooCursor tasks = taskService.fetchFiltered(taskAdapter.getQuery(), null, Task.PROPERTIES); + try { + Task t = new Task(); + for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { + t.readFromCursor(tasks); + taskService.cloneReusableTask(t, + localName, finalRemoteId); + } + Activity activity = getActivity(); + if (activity != null) { + DialogUtilities.dismissDialog(activity, pd); + DialogUtilities.okDialog(activity, getString(R.string.actfm_feat_list_clone_success), null); + } + + Flags.set(Flags.REFRESH); + } finally { + tasks.close(); } - Flags.set(Flags.REFRESH); - DialogUtilities.okDialog(getActivity(), "Success!", null); - } finally { - tasks.close(); } - } - }); - } + }).start(); + } + }); } @Override diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java index 48a1d8dc9..f36de3c78 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -9,6 +9,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; @@ -49,6 +50,7 @@ public class ReusableTaskAdapter extends TaskAdapter { public void onClick(View v) { ReusableTaskViewHolder holder = (ReusableTaskViewHolder) v.getTag(); taskService.cloneReusableTask(holder.task, null, 0); + Toast.makeText(fragment.getActivity(), R.string.actfm_feat_list_task_clone_success, Toast.LENGTH_LONG); Flags.set(Flags.REFRESH); } }); diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml index d9dbb2fe1..20f9c061c 100644 --- a/astrid/res/values/strings-actfm.xml +++ b/astrid/res/values/strings-actfm.xml @@ -274,6 +274,16 @@ Copy this list + (Copy) + + Copying... + + Success! + + Task copied + + No tasks to copy + Status - Logged in as %s From 65ec913ed4d3184de02bf1ba1414c62e2307f0f6 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 18:05:40 -0700 Subject: [PATCH 12/21] Fixed a couple toast calls --- .../todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java | 2 +- .../com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java index 43e8d6851..58968b738 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedTaskListFragment.java @@ -55,7 +55,7 @@ public class FeaturedTaskListFragment extends TagViewFragment { public void onClick(View v) { // Clone list if (taskAdapter == null || taskAdapter.getCount() == 0) { - Toast.makeText(getActivity(), R.string.actfm_feat_list_clone_empty, Toast.LENGTH_LONG); + Toast.makeText(getActivity(), R.string.actfm_feat_list_clone_empty, Toast.LENGTH_LONG).show(); return; } final String localName = tagData.getValue(TagData.NAME) + " " + getString(R.string.actfm_feat_list_suffix); //$NON-NLS-1$ diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java index f36de3c78..afce2760b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/ReusableTaskAdapter.java @@ -50,7 +50,7 @@ public class ReusableTaskAdapter extends TaskAdapter { public void onClick(View v) { ReusableTaskViewHolder holder = (ReusableTaskViewHolder) v.getTag(); taskService.cloneReusableTask(holder.task, null, 0); - Toast.makeText(fragment.getActivity(), R.string.actfm_feat_list_task_clone_success, Toast.LENGTH_LONG); + Toast.makeText(fragment.getActivity(), R.string.actfm_feat_list_task_clone_success, Toast.LENGTH_LONG).show(); Flags.set(Flags.REFRESH); } }); From 91935162ab7910eeeb6117153f92cf08f60d61ee Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 26 Jun 2012 19:14:50 -0700 Subject: [PATCH 13/21] Added featured lists icon to the menu --- .../res/drawable-hdpi/icn_featured_lists.png | Bin 0 -> 2664 bytes .../drawable-hdpi/icn_featured_lists_dark.png | Bin 0 -> 2693 bytes astrid/res/drawable/icn_featured_lists.png | Bin 2206 -> 2315 bytes .../res/drawable/icn_featured_lists_dark.png | Bin 0 -> 2242 bytes .../todoroo/astrid/service/ThemeService.java | 2 ++ .../todoroo/astrid/ui/MainMenuPopover.java | 2 +- 6 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 astrid/res/drawable-hdpi/icn_featured_lists.png create mode 100644 astrid/res/drawable-hdpi/icn_featured_lists_dark.png create mode 100644 astrid/res/drawable/icn_featured_lists_dark.png diff --git a/astrid/res/drawable-hdpi/icn_featured_lists.png b/astrid/res/drawable-hdpi/icn_featured_lists.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bda464fdf433c87918b405a9f8aadf291fa0dc GIT binary patch literal 2664 zcmZWq2{hDe8~dMwdRMKDwH8b{QjBTt_wya}k7~5DTGZ;&_A;b{jqCr`%#w`sq0RZ&HPhZ~>t*;NZ3<>u33%~(@OeV$leejr#piWA#bJ;1Kd)4W@ zLaB6HYp43NXC5&*(Ra!}qt4X7`Ae?sWoXbD>tWTW1A(^18%Khn2E+i?QY_2<7&r7=l6-BcC-o*qzDyYuXSB) z#V;DdY(_+dQJwLn_4!^kozdrv8$x8 z9l*UNdV?Wp0i8S3@H+Bp*kXZ4Kc>OLa=%w4Sk-YQa^>^tv~lmxiWfdPQ8|FhoRQSc@g_cWOOBeSRQI*YFF{SG9b-<-mr5-e6D9_j-N{k> zv9qIdM|&MGzk9o~_YyCryYUkFhoH4KpR`j9n(r}nmxe2tbx@5DQ{o{`iY`j&f~dVL zPtMxp`pmT;{YMGZvjum%i8`OO8FKe~2dgS`an0upqD9iBl<&E>b1xwF`SnhoTuKnVOA<(2=$Zk`X6bw7 zrNx7`_~L3c3f2@=J3se}DU#Mo8>9VekZb7=8Y4OLs}|#CtF4J= zkoWDkNNuCrNy6P=*LGZVbRS_K6cLv8ObYu3F)ZMRxiEXIJV{D@>^wSWB3ma%h<$?H z6cX*|*Imh0AOugNTe!xp+uB3jZpt&lY}3x z;uMK~bs26#H|cy)JP74Md-jVBE{r3ek(oQF{T z<8`EXUxe=U$Wb5R#RrSjYm|`&__B5OFk3mM@`3Z?^|lxXB{L1nh?*-}bFjWS@Z)80 zYsvWsZJW^QwMfX?1gHAC@VJAT#0UxW0nc}DhhZ|56#lWcn8R89p4z*_FFh8J7>+Og zJDV%9E~lIB2C3ZT`_eMEb<}-o%6qMt?M4n__n9H0RJNk$x~fjE)}m>d`oL`0Ca zB)%gM2l}BIE&=`yA>p+oFlLru{ooKBSQ(}alb6uu0)xTG5HD|pm4VTJ+z)PA622r7 z0Re}Hhlj($m0-akK5zvM4Gp-wB3w}sdVqiuBZ5dCWM~jk@^6y=@)+QVo*{k&l3#ET z_>k8F8yrf~l8`tI^ke;y6**`Jbd8)FeBmrk4C}|Gx|q{f0zH=dQiVM7ZU!Xm)cxx9UeUZI9i4_ z(6jOVb+O=z?^$D!uKn85nW_@O?!Gu8;eCHx+Xr347v)JeWN-AlI?565XHz3hfBv;k z8K$lw^{P!clZXzGPlS9xg5B@-m$*0DB}!WQ4JMUg=mvkWs_cgRe^1K!Mdi8|b!o_| zk1wImUwLBF)4Sz;q0l6C%FtkR{^&vpd(QKdO7K_E8X5O77SsE+)+b0PO9qY?3BLS*fIy(DGanfo~V`j^e6F1m?rV0XqmRa+m>2~N`T)uyS_w#K3C$5~p#}%@3LzO0=&SBEt-u|jN zYIC|Mr)y&)Y~}f{Ah?c_2S#0JW_nsXLAH}a-fUn_9v2480?L3KU^^Vj2o3Ndkp`o- zSJ@U1UzJjD*f#esZ^+0PgeWgxyJ$XV9HQvBEyuUDR z>i%ZNd7V8(Q8G>5*c@~Z3WYX@&i3862$y6y1;}o){28JYqu7M{@dEjZX~Lvm=@v&< z*F7Lk?U$5jeCUGtCE?Vrsfi26Vy)>^Fcpsn| zF)u6(eN1uC3*R<}yFR=2;!(`YoOM=C7Y@>?4$6>OTq^uHq6*y_57xj|Z@m!dbGH?!*58ZD?*#g>t{~Z$p&W)Bpeg literal 0 HcmV?d00001 diff --git a/astrid/res/drawable-hdpi/icn_featured_lists_dark.png b/astrid/res/drawable-hdpi/icn_featured_lists_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a764b1bf6c5f8868338f53a0a5d15b2c1ce69ea6 GIT binary patch literal 2693 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 literal 0 HcmV?d00001 diff --git a/astrid/res/drawable/icn_featured_lists.png b/astrid/res/drawable/icn_featured_lists.png index e2e8f5916438d4737f8aaef83560528c75ce626c..9ffff80740b6d05a76a13e11164ecb110ab4af5a 100644 GIT binary patch literal 2315 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 aZw!Z#q}_YV_>*+Q9|ME7m3lUSllfoMA(S!z diff --git a/astrid/res/drawable/icn_featured_lists_dark.png b/astrid/res/drawable/icn_featured_lists_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7b34e0deb6fcce54b0c5173e34dba48f0d329e7d GIT binary patch literal 2242 zcmV;z2tD_SP)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zNU`IG8#P?7#L{yY`401@1D;M%uD-aY9gYoptg)cZ*OlX7K^}XJ*<10A^+)B1uF)G4t|PP{s?Bh?)7=v167}>IM-dnOQUQUU-d(h{EA8wAMoa z?q;)D3BYRzR9CrN)}c^nk%*)a!o?n#pNLp%O}_7Unx^Rjfa5r=rOdJ{;ks@o5p@z# zrCEfChyh@`wAQmDr8J2s3;=~f;iWlS0x6}4nIl9bJcNEz7arKQ{fLF?!^DAkge6$P1MC1~YVrE36(Oh?T_g|Gt1<7Rc zcK{GVxJ0Ca-PyKUZ4V59q?Fa6p`p*C(db60R5~1s#n!vJx|Yi2vc7on;@9bP`VYe} z!ihv;{r>&?{WCK&9|$4Zs$;DJ5diqUZ!Rn>bX~b}<(uQjk3Y%h^Wlw+4OUA1n@lEG z&YwL$r-U+Z-MaP8;^N|4Kx=8*3DEzVo}T_Vm&^5LGMO8hOy)P&bvL!v>y~AeCw`cS z-??+=qg*a`Rcjp$c2iqG?Rtoa2#+5>K0P%x^t_3PI^TwPr~ef#$9&u-ql`R(N7^!<9eR{Z zCMP}5Gl5!5QA(MKL}D$SPR{~BHk;LZ0`wfrQxR&0XRWo6QYynRT&;Cj2;o<&Roii# zzlVp1e@v&-MF1Eb9et_a?dIUMl@F-y4`vox>ku=G&CSh@qeqYaGdMW-eMd*fMzL6I z_}y1|4dNg&5yx>JUb=K?B9%%#sZ=Ue+qN6_xn?QTLHDj7Ct3yx-s@MZRXdSLJRBJr z8Fw6Kqf{y>Ddie7y8sXvz9|p^V9)bNO4$(#g`l-Ic2ek=`HfU6_1(b0z|Zk`yizKa zSZlpz+xCi5$_>UeKT`+M0DzKV81H+YX9Mts5N#1@t%YS-<#XrG&73-Qsxm)6FCvkM zyR@|Anx^TVIdjHqG Date: Tue, 26 Jun 2012 20:17:12 -0700 Subject: [PATCH 14/21] Refactor filter list toggling to support multiple modes --- .../astrid/activity/TaskListActivity.java | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 7c2dd6fcc..a128a7ffd 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -50,6 +50,7 @@ import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.abtesting.ABTestEventReportingService; import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.reusable.FeaturedListActivity; +import com.todoroo.astrid.tags.reusable.FeaturedListFragment; import com.todoroo.astrid.ui.DateChangedAlerts; import com.todoroo.astrid.ui.FragmentPopover; import com.todoroo.astrid.ui.MainMenuPopover; @@ -69,7 +70,10 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener public static final String OPEN_TASK = "openTask"; //$NON-NLS-1$ - private static final String PEOPLE_VIEW = "peopleView"; //$NON-NLS-1$ + private static final String FILTER_MODE = "filterMode"; //$NON-NLS-1$ + private static final int FILTER_MODE_NORMAL = 0; + private static final int FILTER_MODE_PEOPLE = 1; + private static final int FILTER_MODE_FEATURED = 2; @Autowired private ABTestEventReportingService abTestEventReportingService; @@ -78,6 +82,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener private TextView lists; private ImageView mainMenu; private Button commentsButton; + private int filterMode; private TaskListFragmentPager tlfPager; private TaskListFragmentPagerAdapter tlfPagerAdapter; @@ -251,6 +256,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener protected void initializeFragments(ActionBar actionBar) { View filterFragment = findViewById(R.id.filterlist_fragment_container); View editFragment = findViewById(R.id.taskedit_fragment_container); + filterMode = getIntent().getIntExtra(FILTER_MODE, FILTER_MODE_NORMAL); if (filterFragment != null) { actionBar.setDisplayHomeAsUpEnabled(false); @@ -267,12 +273,8 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener } } - boolean peopleView = getIntent().getBooleanExtra(PEOPLE_VIEW, false); - Class filterFragmentClass = - peopleView ? PeopleListFragment.class : FilterListFragment.class; - setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, - R.id.filterlist_fragment_container, filterFragmentClass, false, false); + R.id.filterlist_fragment_container, getFilterFragmentClass(filterMode), false, false); } else { fragmentLayout = LAYOUT_SINGLE; actionBar.setDisplayHomeAsUpEnabled(true); @@ -320,7 +322,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener }); if (isTablet) - setupMainMenuForPeopleViewState(getIntent().getBooleanExtra(PEOPLE_VIEW, false)); + refreshMainMenuForFilterMode(filterMode); } private void setupPopoverWithFragment(FragmentPopover popover, Fragment frag, LayoutParams params) { @@ -635,21 +637,25 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener TaskListFragment tlf = getTaskListFragment(); switch (item) { case MainMenuPopover.MAIN_MENU_ITEM_LISTS: - if (fragmentLayout == LAYOUT_SINGLE) + if (fragmentLayout == LAYOUT_SINGLE || filterMode == FILTER_MODE_NORMAL) listsNav.performClick(); else - togglePeopleView(); + setFilterMode(FILTER_MODE_NORMAL); return; case MainMenuPopover.MAIN_MENU_ITEM_SEARCH: onSearchRequested(); return; case MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS: - Intent featured = new Intent(this, FeaturedListActivity.class); - startActivity(featured); + if (fragmentLayout != LAYOUT_SINGLE) { + setFilterMode(FILTER_MODE_FEATURED); + } else { + Intent featured = new Intent(this, FeaturedListActivity.class); + startActivity(featured); + } return; case MainMenuPopover.MAIN_MENU_ITEM_FRIENDS: if (fragmentLayout != LAYOUT_SINGLE) { - togglePeopleView(); + setFilterMode(FILTER_MODE_PEOPLE); } else { Intent peopleIntent = new Intent(this, PeopleViewActivity.class); startActivity(peopleIntent); @@ -666,27 +672,28 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener tlf.handleOptionsMenuItemSelected(item, customIntent); } - private void togglePeopleView() { - FilterListFragment flf = getFilterListFragment(); - boolean peopleMode = !(flf instanceof PeopleListFragment); - if (peopleMode) - setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, R.id.filterlist_fragment_container, - PeopleListFragment.class, false, true); - else - setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, - R.id.filterlist_fragment_container, FilterListFragment.class, false, true); - - setupMainMenuForPeopleViewState(peopleMode); - getIntent().putExtra(PEOPLE_VIEW, peopleMode); + private Class getFilterFragmentClass(int mode) { + switch (mode) { + case FILTER_MODE_PEOPLE: + return PeopleListFragment.class; + case FILTER_MODE_FEATURED: + return FeaturedListFragment.class; + case FILTER_MODE_NORMAL: + default: + return FilterListFragment.class; + } } - private void setupMainMenuForPeopleViewState(boolean inPeopleMode) { - mainMenuPopover.setFixedItemVisibility(0, inPeopleMode ? View.VISIBLE : View.GONE, true); - mainMenuPopover.setFixedItemVisibility(1, inPeopleMode ? View.GONE : View.VISIBLE, true); + private void setFilterMode(int mode) { + filterMode = mode; + setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, R.id.filterlist_fragment_container, + getFilterFragmentClass(mode), false, true); + refreshMainMenuForFilterMode(mode); + getIntent().putExtra(FILTER_MODE, mode); + } - TypedValue tv = new TypedValue(); - getTheme().resolveAttribute(inPeopleMode ? R.attr.asPeopleMenu : R.attr.asMainMenu, tv, false); - mainMenu.setImageResource(tv.data); + private void refreshMainMenuForFilterMode(int filterMode) { + // TODO: IMPLEMENT ME! } public MainMenuPopover getMainMenuPopover() { From d75649702aa3273a67c18c762d9801fe7ee15074 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 27 Jun 2012 11:03:39 -0700 Subject: [PATCH 15/21] Toggle filter list fragments on phones and tablets without launching new activity. Bugs exist in the action bar display --- .../astrid/people/PeopleViewActivity.java | 2 +- .../tags/reusable/FeaturedListActivity.java | 4 +- .../astrid/activity/TaskListActivity.java | 49 ++++++++++++------- .../todoroo/astrid/ui/MainMenuPopover.java | 13 ++++- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java index ed5f7e057..53a4b3ad3 100644 --- a/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java @@ -57,7 +57,7 @@ public class PeopleViewActivity extends TaskListActivity { return result; } - private static final int[] FORBIDDEN_MENU_ITEMS = { + public static final int[] FORBIDDEN_MENU_ITEMS = { TaskListFragment.MENU_NEW_FILTER_ID, TaskListFragment.MENU_ADDONS_ID, MainMenuPopover.MAIN_MENU_ITEM_FRIENDS diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java index 2b0708c99..6205c8b0d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java @@ -16,11 +16,9 @@ public class FeaturedListActivity extends TaskListActivity { } - private static final int[] FORBIDDEN_MENU_ITEMS = { + public static final int[] FORBIDDEN_MENU_ITEMS = { TaskListFragment.MENU_NEW_FILTER_ID, TaskListFragment.MENU_ADDONS_ID, - TaskListFragment.MENU_SORT_ID, - MainMenuPopover.MAIN_MENU_ITEM_FRIENDS, MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS, }; diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index a128a7ffd..817e65489 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -83,6 +83,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener private ImageView mainMenu; private Button commentsButton; private int filterMode; + private int[] forbiddenMenuItems = {}; private TaskListFragmentPager tlfPager; private TaskListFragmentPagerAdapter tlfPagerAdapter; @@ -281,7 +282,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener listsNav.setOnClickListener(popupMenuClickListener); createListsPopover(); setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, - getFilterListClass(), true, false)); + getFilterFragmentClass(filterMode), true, false)); } } @@ -629,7 +630,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener @Override public boolean shouldAddMenuItem(int itemId) { - return true; + return AndroidUtilities.indexOf(forbiddenMenuItems, itemId) < 0; } @Override @@ -637,7 +638,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener TaskListFragment tlf = getTaskListFragment(); switch (item) { case MainMenuPopover.MAIN_MENU_ITEM_LISTS: - if (fragmentLayout == LAYOUT_SINGLE || filterMode == FILTER_MODE_NORMAL) + if (filterMode == FILTER_MODE_NORMAL) listsNav.performClick(); else setFilterMode(FILTER_MODE_NORMAL); @@ -646,20 +647,10 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener onSearchRequested(); return; case MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS: - if (fragmentLayout != LAYOUT_SINGLE) { - setFilterMode(FILTER_MODE_FEATURED); - } else { - Intent featured = new Intent(this, FeaturedListActivity.class); - startActivity(featured); - } + setFilterMode(FILTER_MODE_FEATURED); return; case MainMenuPopover.MAIN_MENU_ITEM_FRIENDS: - if (fragmentLayout != LAYOUT_SINGLE) { - setFilterMode(FILTER_MODE_PEOPLE); - } else { - Intent peopleIntent = new Intent(this, PeopleViewActivity.class); - startActivity(peopleIntent); - } + setFilterMode(FILTER_MODE_PEOPLE); return; case MainMenuPopover.MAIN_MENU_ITEM_SUGGESTIONS: // Doesn't exist yet @@ -686,14 +677,34 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener private void setFilterMode(int mode) { filterMode = mode; - setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, R.id.filterlist_fragment_container, - getFilterFragmentClass(mode), false, true); refreshMainMenuForFilterMode(mode); + if (fragmentLayout == LAYOUT_SINGLE) { + createListsPopover(); + setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, + getFilterFragmentClass(filterMode), true, true)); + listsNav.performClick(); + } else { + setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, R.id.filterlist_fragment_container, + getFilterFragmentClass(mode), false, true); + } getIntent().putExtra(FILTER_MODE, mode); } - private void refreshMainMenuForFilterMode(int filterMode) { - // TODO: IMPLEMENT ME! + private void refreshMainMenuForFilterMode(int mode) { + switch (mode) { + case FILTER_MODE_PEOPLE: + forbiddenMenuItems = PeopleViewActivity.FORBIDDEN_MENU_ITEMS; + break; + case FILTER_MODE_FEATURED: + forbiddenMenuItems = FeaturedListActivity.FORBIDDEN_MENU_ITEMS; + break; + case FILTER_MODE_NORMAL: + default: + forbiddenMenuItems = new int[0]; + break; + } + + mainMenuPopover.refreshFixedItems(); } public MainMenuPopover getMainMenuPopover() { diff --git a/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java index ffb6cfc06..566619310 100644 --- a/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java +++ b/astrid/src/com/todoroo/astrid/ui/MainMenuPopover.java @@ -41,6 +41,7 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi private final LinearLayout bottomFixed; private final int rowLayout; private boolean suppressNextKeyEvent = false; + private final boolean isTablet; public void setMenuListener(MainMenuListener listener) { this.mListener = listener; @@ -71,9 +72,11 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi topFixed = (LinearLayout) getContentView().findViewById(R.id.topFixedItems); bottomFixed = (LinearLayout) getContentView().findViewById(R.id.bottomFixedItems); + this.isTablet = isTablet; + mListener = listener; - addFixedItems(isTablet); + addFixedItems(); } public boolean didInterceptTouch(KeyEvent event) { @@ -97,7 +100,7 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi super.setBackgroundDrawable(null); } - private void addFixedItems(boolean isTablet) { + private void addFixedItems() { int themeFlags = isTablet ? ThemeService.FLAG_FORCE_DARK : 0; addMenuItem(R.string.TLA_menu_lists, ThemeService.getDrawable(R.drawable.icn_menu_lists, themeFlags), @@ -120,6 +123,12 @@ public class MainMenuPopover extends FragmentPopover implements InterceptTouchLi MAIN_MENU_ITEM_SETTINGS, null, bottomFixed); // Settings item } + public void refreshFixedItems() { + topFixed.removeAllViews(); + bottomFixed.removeAllViews(); + addFixedItems(); + } + public void setFixedItemVisibility(int index, int visibility, boolean top) { LinearLayout container = top ? topFixed : bottomFixed; if (index < 0 || index >= container.getChildCount()) From f1cffcc70438e5003d93ff4123ff43b57f7bd8ea Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 27 Jun 2012 11:33:45 -0700 Subject: [PATCH 16/21] Introduced a filter mode spec to replace TLA subclasses. Unfinished --- .../astrid/people/PeopleFilterMode.java | 53 ++++++++++++ .../astrid/people/PeopleViewActivity.java | 80 ------------------- .../astrid/activity/FilterModeSpec.java | 16 ++++ .../astrid/activity/TaskListActivity.java | 32 +++----- 4 files changed, 82 insertions(+), 99 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java delete mode 100644 astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java create mode 100644 astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java new file mode 100644 index 000000000..c14e60c7c --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java @@ -0,0 +1,53 @@ +package com.todoroo.astrid.people; + +import android.content.Context; + +import com.todoroo.astrid.activity.FilterListFragment; +import com.todoroo.astrid.activity.FilterModeSpec; +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 PeopleFilterMode implements FilterModeSpec { + + private AsyncImageView imageView; + + @Override + public Filter getDefaultFilter(Context context) { + Filter defaultFilter = PeopleFilterExposer.mySharedTasks(context); + return defaultFilter; + } + + @Override + public Class getFilterListClass() { + return PeopleListFragment.class; + } + + @Override + public void onFilterItemClickedCallback(FilterListItem item) { + if (imageView == null) + return; + if (item instanceof FilterWithUpdate) + imageView.setUrl(((FilterWithUpdate) item).imageUrl); + else + imageView.setUrl(null); + } + + public void setImageView(AsyncImageView imageView) { + this.imageView = imageView; + } + + @Override + public int[] getForbiddenMenuItems() { + return FORBIDDEN_MENU_ITEMS; + } + + private static final int[] FORBIDDEN_MENU_ITEMS = { + TaskListFragment.MENU_NEW_FILTER_ID, + TaskListFragment.MENU_ADDONS_ID, + MainMenuPopover.MAIN_MENU_ITEM_FRIENDS + }; +} diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java deleted file mode 100644 index 53a4b3ad3..000000000 --- a/astrid/plugin-src/com/todoroo/astrid/people/PeopleViewActivity.java +++ /dev/null @@ -1,80 +0,0 @@ -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() { - Filter defaultFilter = PeopleFilterExposer.mySharedTasks(this); - return defaultFilter; - } - - @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; - } - - public 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/src/com/todoroo/astrid/activity/FilterModeSpec.java b/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java new file mode 100644 index 000000000..256d2a754 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java @@ -0,0 +1,16 @@ +package com.todoroo.astrid.activity; + +import android.content.Context; + +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; + + +public interface FilterModeSpec { + + public int[] getForbiddenMenuItems(); + public Class getFilterListClass(); + public Filter getDefaultFilter(Context context); + public void onFilterItemClickedCallback(FilterListItem item); + +} diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 817e65489..81e91b103 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -42,14 +42,13 @@ import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.core.CoreFilterExposer; import com.todoroo.astrid.core.CustomFilterExposer; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.people.PeopleFilterMode; import com.todoroo.astrid.people.PeopleListFragment; -import com.todoroo.astrid.people.PeopleViewActivity; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.abtesting.ABTestEventReportingService; import com.todoroo.astrid.tags.TagService; -import com.todoroo.astrid.tags.reusable.FeaturedListActivity; import com.todoroo.astrid.tags.reusable.FeaturedListFragment; import com.todoroo.astrid.ui.DateChangedAlerts; import com.todoroo.astrid.ui.FragmentPopover; @@ -83,7 +82,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener private ImageView mainMenu; private Button commentsButton; private int filterMode; - private int[] forbiddenMenuItems = {}; + private FilterModeSpec filterModeSpec; private TaskListFragmentPager tlfPager; private TaskListFragmentPagerAdapter tlfPagerAdapter; @@ -323,7 +322,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener }); if (isTablet) - refreshMainMenuForFilterMode(filterMode); + mainMenuPopover.refreshFixedItems(); } private void setupPopoverWithFragment(FragmentPopover popover, Fragment frag, LayoutParams params) { @@ -359,7 +358,9 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener if (tef != null) onBackPressed(); - return super.onFilterItemClicked(item); + boolean result = super.onFilterItemClicked(item); + filterModeSpec.onFilterItemClickedCallback(item); + return result; } private void setListsDropdownSelected(boolean selected) { @@ -630,7 +631,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener @Override public boolean shouldAddMenuItem(int itemId) { - return AndroidUtilities.indexOf(forbiddenMenuItems, itemId) < 0; + return AndroidUtilities.indexOf(filterModeSpec.getForbiddenMenuItems(), itemId) < 0; } @Override @@ -677,7 +678,8 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener private void setFilterMode(int mode) { filterMode = mode; - refreshMainMenuForFilterMode(mode); + filterModeSpec = getFilterModeSpec(); + mainMenuPopover.refreshFixedItems(); if (fragmentLayout == LAYOUT_SINGLE) { createListsPopover(); setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, @@ -690,21 +692,13 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener getIntent().putExtra(FILTER_MODE, mode); } - private void refreshMainMenuForFilterMode(int mode) { - switch (mode) { + private FilterModeSpec getFilterModeSpec() { + switch(filterMode) { case FILTER_MODE_PEOPLE: - forbiddenMenuItems = PeopleViewActivity.FORBIDDEN_MENU_ITEMS; - break; - case FILTER_MODE_FEATURED: - forbiddenMenuItems = FeaturedListActivity.FORBIDDEN_MENU_ITEMS; - break; - case FILTER_MODE_NORMAL: + return new PeopleFilterMode(); default: - forbiddenMenuItems = new int[0]; - break; + return null; } - - mainMenuPopover.refreshFixedItems(); } public MainMenuPopover getMainMenuPopover() { From 7cb1a40923a64bac51d5e7cd2651e7d7a91d0184 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 27 Jun 2012 12:00:13 -0700 Subject: [PATCH 17/21] Finished implementing filter mode specs for all three filter modes --- .../astrid/people/PeopleFilterMode.java | 6 ++ .../todoroo/astrid/tags/TagFilterExposer.java | 2 +- .../tags/reusable/FeaturedListActivity.java | 39 ------------- .../reusable/FeaturedListFilterExposer.java | 25 ++++++++ .../tags/reusable/FeaturedListFilterMode.java | 53 +++++++++++++++++ .../astrid/activity/DefaultFilterMode.java | 37 ++++++++++++ .../astrid/activity/FilterModeSpec.java | 1 + .../astrid/activity/TaskListActivity.java | 57 ++++++++++--------- 8 files changed, 153 insertions(+), 67 deletions(-) delete mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterMode.java create mode 100644 astrid/src/com/todoroo/astrid/activity/DefaultFilterMode.java diff --git a/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java index c14e60c7c..8828eacfa 100644 --- a/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java +++ b/astrid/plugin-src/com/todoroo/astrid/people/PeopleFilterMode.java @@ -2,6 +2,7 @@ package com.todoroo.astrid.people; import android.content.Context; +import com.timsu.astrid.R; import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.activity.FilterModeSpec; import com.todoroo.astrid.activity.TaskListFragment; @@ -45,6 +46,11 @@ public class PeopleFilterMode implements FilterModeSpec { return FORBIDDEN_MENU_ITEMS; } + @Override + public int getMainMenuIconAttr() { + return R.attr.asPeopleMenu; + } + private static final int[] FORBIDDEN_MENU_ITEMS = { TaskListFragment.MENU_NEW_FILTER_ID, TaskListFragment.MENU_ADDONS_ID, diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index f3d9d4dd9..d32a24e77 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -60,7 +60,7 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE private static final String TAG = "tag"; //$NON-NLS-1$ - @Autowired TagDataService tagDataService; + @Autowired protected TagDataService tagDataService; @Autowired GtasksPreferenceService gtasksPreferenceService; protected boolean addUntaggedFilter = true; diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java deleted file mode 100644 index 6205c8b0d..000000000 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListActivity.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.todoroo.astrid.tags.reusable; - -import android.content.Intent; - -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.ui.MainMenuPopover; - -public class FeaturedListActivity extends TaskListActivity { - - @Override - protected Class getFilterListClass() { - return FeaturedListFragment.class; - } - - - public static final int[] FORBIDDEN_MENU_ITEMS = { - TaskListFragment.MENU_NEW_FILTER_ID, - TaskListFragment.MENU_ADDONS_ID, - MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS, - }; - - @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/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java index 56b78992d..1677931d2 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -8,8 +8,11 @@ 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.Functions; +import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.astrid.actfm.TagViewFragment; import com.todoroo.astrid.api.AstridApiConstants; @@ -17,7 +20,9 @@ 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.TaskApiDao.TaskCriteria; import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.tags.TagService; @@ -59,6 +64,26 @@ public class FeaturedListFilterExposer extends TagFilterExposer { return filter; } + public static Filter getDefaultFilter() { + TodorooCursor firstFilter = PluginServices.getTagDataService() + .query(Query.select(TagData.PROPERTIES) + .where(Criterion.and( + Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0), + TagData.DELETION_DATE.eq(0))).limit(1)); + try { + if (firstFilter.getCount() > 0) { + firstFilter.moveToFirst(); + TagData tagData = new TagData(firstFilter); + Tag tag = new Tag(tagData); + return filterFromFeaturedList(tag, TaskCriteria.activeAndVisible()); + } else { + return null; + } + } finally { + firstFilter.close(); + } + } + @Override protected Filter constructFilter(Context context, Tag tag) { return filterFromFeaturedList(tag, TaskCriteria.activeAndVisible()); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterMode.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterMode.java new file mode 100644 index 000000000..17b88d631 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterMode.java @@ -0,0 +1,53 @@ +package com.todoroo.astrid.tags.reusable; + +import android.content.Context; + +import com.timsu.astrid.R; +import com.todoroo.astrid.activity.FilterListFragment; +import com.todoroo.astrid.activity.FilterModeSpec; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.core.CoreFilterExposer; +import com.todoroo.astrid.ui.MainMenuPopover; + +public class FeaturedListFilterMode implements FilterModeSpec { + + @Override + public int[] getForbiddenMenuItems() { + return FORBIDDEN_MENU_ITEMS; + } + + private static final int[] FORBIDDEN_MENU_ITEMS = { + TaskListFragment.MENU_NEW_FILTER_ID, + TaskListFragment.MENU_ADDONS_ID, + MainMenuPopover.MAIN_MENU_ITEM_FEATURED_LISTS + }; + + @Override + public Class getFilterListClass() { + return FeaturedListFragment.class; + } + + @Override + public Filter getDefaultFilter(Context context) { + Filter defaultFilter = FeaturedListFilterExposer.getDefaultFilter(); + if (defaultFilter == null) + return CoreFilterExposer.buildInboxFilter(context.getResources()); + else + return defaultFilter; + } + + @Override + public int getMainMenuIconAttr() { + return R.attr.asMainMenu; + } + + @Override + public void onFilterItemClickedCallback(FilterListItem item) { + // + } + + + +} diff --git a/astrid/src/com/todoroo/astrid/activity/DefaultFilterMode.java b/astrid/src/com/todoroo/astrid/activity/DefaultFilterMode.java new file mode 100644 index 000000000..7a0c68155 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/activity/DefaultFilterMode.java @@ -0,0 +1,37 @@ +package com.todoroo.astrid.activity; + +import android.content.Context; + +import com.timsu.astrid.R; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.core.CoreFilterExposer; + +public class DefaultFilterMode implements FilterModeSpec { + + @Override + public int[] getForbiddenMenuItems() { + return new int[0]; + } + + @Override + public Class getFilterListClass() { + return FilterListFragment.class; + } + + @Override + public Filter getDefaultFilter(Context context) { + return CoreFilterExposer.buildInboxFilter(context.getResources()); + } + + @Override + public int getMainMenuIconAttr() { + return R.attr.asMainMenu; + } + + @Override + public void onFilterItemClickedCallback(FilterListItem item) { + // + } + +} diff --git a/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java b/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java index 256d2a754..396c5fd8a 100644 --- a/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java +++ b/astrid/src/com/todoroo/astrid/activity/FilterModeSpec.java @@ -11,6 +11,7 @@ public interface FilterModeSpec { public int[] getForbiddenMenuItems(); public Class getFilterListClass(); public Filter getDefaultFilter(Context context); + public int getMainMenuIconAttr(); public void onFilterItemClickedCallback(FilterListItem item); } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 81e91b103..9eba6baf0 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -39,17 +39,15 @@ import com.todoroo.astrid.adapter.TaskListFragmentPagerAdapter; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; -import com.todoroo.astrid.core.CoreFilterExposer; import com.todoroo.astrid.core.CustomFilterExposer; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.people.PeopleFilterMode; -import com.todoroo.astrid.people.PeopleListFragment; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.abtesting.ABTestEventReportingService; import com.todoroo.astrid.tags.TagService; -import com.todoroo.astrid.tags.reusable.FeaturedListFragment; +import com.todoroo.astrid.tags.reusable.FeaturedListFilterMode; import com.todoroo.astrid.ui.DateChangedAlerts; import com.todoroo.astrid.ui.FragmentPopover; import com.todoroo.astrid.ui.MainMenuPopover; @@ -223,7 +221,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener } protected Filter getDefaultFilter() { - return CoreFilterExposer.buildInboxFilter(getResources()); + return filterModeSpec.getDefaultFilter(this); } private boolean swipeIsEnabled() { @@ -257,6 +255,7 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener View filterFragment = findViewById(R.id.filterlist_fragment_container); View editFragment = findViewById(R.id.taskedit_fragment_container); filterMode = getIntent().getIntExtra(FILTER_MODE, FILTER_MODE_NORMAL); + updateFilterModeSpec(filterMode); if (filterFragment != null) { actionBar.setDisplayHomeAsUpEnabled(false); @@ -274,14 +273,14 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener } setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, - R.id.filterlist_fragment_container, getFilterFragmentClass(filterMode), false, false); + R.id.filterlist_fragment_container, filterModeSpec.getFilterListClass(), false, false); } else { fragmentLayout = LAYOUT_SINGLE; actionBar.setDisplayHomeAsUpEnabled(true); listsNav.setOnClickListener(popupMenuClickListener); createListsPopover(); setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, - getFilterFragmentClass(filterMode), true, false)); + filterModeSpec.getFilterListClass(), true, false)); } } @@ -664,40 +663,44 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener tlf.handleOptionsMenuItemSelected(item, customIntent); } - private Class getFilterFragmentClass(int mode) { - switch (mode) { - case FILTER_MODE_PEOPLE: - return PeopleListFragment.class; - case FILTER_MODE_FEATURED: - return FeaturedListFragment.class; - case FILTER_MODE_NORMAL: - default: - return FilterListFragment.class; - } - } - private void setFilterMode(int mode) { filterMode = mode; - filterModeSpec = getFilterModeSpec(); - mainMenuPopover.refreshFixedItems(); + updateFilterModeSpec(mode); + + refreshMainMenu(); if (fragmentLayout == LAYOUT_SINGLE) { createListsPopover(); setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, - getFilterFragmentClass(filterMode), true, true)); - listsNav.performClick(); + filterModeSpec.getFilterListClass(), true, true)); } else { setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, R.id.filterlist_fragment_container, - getFilterFragmentClass(mode), false, true); + filterModeSpec.getFilterListClass(), false, true); } + + onFilterItemClicked(getDefaultFilter()); + if (fragmentLayout == LAYOUT_SINGLE) + listsNav.performClick(); getIntent().putExtra(FILTER_MODE, mode); } - private FilterModeSpec getFilterModeSpec() { - switch(filterMode) { + private void refreshMainMenu() { + mainMenuPopover.refreshFixedItems(); + TypedValue tv = new TypedValue(); + getTheme().resolveAttribute(filterModeSpec.getMainMenuIconAttr(), tv, false); + mainMenu.setImageResource(tv.data); + } + + private void updateFilterModeSpec(int mode) { + switch(mode) { case FILTER_MODE_PEOPLE: - return new PeopleFilterMode(); + filterModeSpec = new PeopleFilterMode(); + break; + case FILTER_MODE_FEATURED: + filterModeSpec = new FeaturedListFilterMode(); + break; + case FILTER_MODE_NORMAL: default: - return null; + filterModeSpec = new DefaultFilterMode(); } } From fdb7326f5dec34b76d74eff0396b8fee72734c24 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 27 Jun 2012 12:26:25 -0700 Subject: [PATCH 18/21] Adjusted how default featured list is computed --- .../astrid/tags/reusable/FeaturedListFilterExposer.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java index 1677931d2..bedd759bc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/reusable/FeaturedListFilterExposer.java @@ -12,6 +12,7 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Functions; +import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.astrid.actfm.TagViewFragment; @@ -69,7 +70,11 @@ public class FeaturedListFilterExposer extends TagFilterExposer { .query(Query.select(TagData.PROPERTIES) .where(Criterion.and( Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0), - TagData.DELETION_DATE.eq(0))).limit(1)); + TagData.DELETION_DATE.eq(0), + TagData.NAME.isNotNull(), + TagData.NAME.neq(""))) //$NON-NLS-1$ + .orderBy(Order.asc(TagData.NAME)) + .limit(1)); try { if (firstFilter.getCount() > 0) { firstFilter.moveToFirst(); From 7ff311f76d331e03316e1d16e3715dd70b13d2b8 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 27 Jun 2012 13:36:24 -0700 Subject: [PATCH 19/21] Show people's images when in people mode --- astrid/res/layout/header_nav_views.xml | 7 ++ astrid/res/layout/header_people_view.xml | 76 ------------------- .../astrid/activity/TaskListActivity.java | 12 +++ 3 files changed, 19 insertions(+), 76 deletions(-) delete mode 100644 astrid/res/layout/header_people_view.xml diff --git a/astrid/res/layout/header_nav_views.xml b/astrid/res/layout/header_nav_views.xml index 32c20c671..7e5f1f2ae 100644 --- a/astrid/res/layout/header_nav_views.xml +++ b/astrid/res/layout/header_nav_views.xml @@ -49,6 +49,13 @@ + +