From e4295194a55829d3308c59076797d474c1d6abed Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 25 Jun 2012 17:09:13 -0700 Subject: [PATCH] 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"/>