From da8dcc04327162fc96095cd4a30f2fd68a0a155f Mon Sep 17 00:00:00 2001 From: Tim Su Date: Thu, 15 Jul 2010 01:43:29 -0700 Subject: [PATCH] Awesome better remember the milk --- astrid/AndroidManifest.xml | 8 +- .../todoroo/astrid/api/FilterCategory.java | 19 +- .../todoroo/astrid/api/FilterListHeader.java | 18 +- .../astrid/api/SynchronizationProvider.java | 9 +- .../andlib/utility/DialogUtilities.java | 2 +- .../andlib/widget/TodorooPreferences.java | 18 +- .../astrid/core/CoreFilterExposer.java | 4 +- ...ailExposer.java => MilkDetailExposer.java} | 33 ++- ...terExposer.java => MilkFilterExposer.java} | 9 +- .../todoroo/astrid/rmilk/MilkPreferences.java | 209 ++++++++++-------- .../com/todoroo/astrid/rmilk/Utilities.java | 44 +++- .../astrid/rmilk/data/MilkDataService.java | 9 +- .../astrid/rmilk/sync/RTMSyncProvider.java | 24 +- .../todoroo/astrid/tags/TagFilterExposer.java | 11 +- astrid/res/values/strings-rmilk.xml | 7 + 15 files changed, 250 insertions(+), 174 deletions(-) rename astrid/plugin-src/com/todoroo/astrid/rmilk/{DetailExposer.java => MilkDetailExposer.java} (66%) rename astrid/plugin-src/com/todoroo/astrid/rmilk/{FilterExposer.java => MilkFilterExposer.java} (88%) diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 6737fe6d3..cfdfb1068 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -232,12 +232,18 @@ android:taskAffinity="" /> - + + + + + + + CREATOR = new Parcelable.Creator() { public FilterListHeader createFromParcel(Parcel source) { - FilterListHeader item = new FilterListHeader(source.readString()); + FilterListHeader item = new FilterListHeader(); item.readFromParcel(source); return item; } diff --git a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java index 2ce821401..45f1f5e82 100644 --- a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java +++ b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java @@ -45,8 +45,9 @@ public abstract class SynchronizationProvider { /** * Perform authenticate and other pre-synchronization steps, then * synchronize. + * @param context either the parent activity, or a background service */ - abstract protected void initiate(); + abstract protected void initiate(Context context); /** * Push variables from given task to the remote server. @@ -112,9 +113,7 @@ public abstract class SynchronizationProvider { notification = new Notification(icon, null, when); } - public void synchronize() { - Context context = ContextManager.getContext(); - + public void synchronize(final Context context) { // display notification notificationIntent = PendingIntent.getActivity(context, 0, new Intent(), 0); postUpdate(context, context.getString(R.string.SyP_progress_starting)); @@ -125,7 +124,7 @@ public abstract class SynchronizationProvider { new Thread(new Runnable() { public void run() { try { - initiate(); + initiate(context); } finally { nm.cancel(Constants.NOTIFICATION_SYNC); } diff --git a/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java index 8d6f3e4f6..e25fc496f 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java @@ -127,7 +127,7 @@ public class DialogUtilities { activity.runOnUiThread(new Runnable() { public void run() { new AlertDialog.Builder(activity) - .setTitle(informationDialogTitleResource) + .setTitle(confirmDialogTitleResource) .setMessage(text) .setIcon(android.R.drawable.ic_dialog_alert) .setPositiveButton(android.R.string.ok, okListener) diff --git a/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java b/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java index 11fa3791d..adc082fec 100644 --- a/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java +++ b/astrid/common-src/com/todoroo/andlib/widget/TodorooPreferences.java @@ -3,16 +3,19 @@ */ package com.todoroo.andlib.widget; +import android.content.Intent; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import android.preference.RingtonePreference; +import android.preference.Preference.OnPreferenceChangeListener; + +import com.todoroo.andlib.service.DependencyInjectionService; /** * Displays a preference screen for users to edit their preferences. Override @@ -36,13 +39,14 @@ abstract public class TodorooPreferences extends PreferenceActivity { super.onCreate(savedInstanceState); addPreferencesFromResource(getPreferenceResource()); + DependencyInjectionService.getInstance().inject(this); PreferenceScreen screen = getPreferenceScreen(); initializePreference(screen); } - private void initializePreference(Preference preference) { + protected void initializePreference(Preference preference) { if(preference instanceof PreferenceGroup) { PreferenceGroup group = (PreferenceGroup)preference; for(int i = 0; i < group.getPreferenceCount(); i++) { @@ -56,11 +60,10 @@ abstract public class TodorooPreferences extends PreferenceActivity { value = ((CheckBoxPreference)preference).isChecked(); else if(preference instanceof EditTextPreference) value = ((EditTextPreference)preference).getText(); - else if(preference instanceof RingtonePreference) { + else if(preference instanceof RingtonePreference) value = getPreferenceManager().getSharedPreferences().getString(preference.getKey(), null); - } - if(value != null) + if(value != null || Preference.class.equals(preference.getClass())) updatePreferences(preference, value); preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @@ -72,4 +75,9 @@ abstract public class TodorooPreferences extends PreferenceActivity { } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + initializePreference(getPreferenceScreen()); + } + } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java index 12653bacd..2cf3e9457 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java @@ -44,8 +44,8 @@ public final class CoreFilterExposer extends BroadcastReceiver { searchFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_search)).getBitmap(); // extended - FilterCategory extended = new FilterCategory(CorePlugin.IDENTIFIER, - r.getString(R.string.BFE_Extended), new Filter[5]); + FilterCategory extended = new FilterCategory(r.getString(R.string.BFE_Extended), + new Filter[5]); Filter alphabetical = new Filter(r.getString(R.string.BFE_Alphabetical), r.getString(R.string.BFE_Alphabetical), diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/DetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java similarity index 66% rename from astrid/plugin-src/com/todoroo/astrid/rmilk/DetailExposer.java rename to astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java index f40df01e0..e2abef3f7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/DetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkDetailExposer.java @@ -22,7 +22,7 @@ import com.todoroo.astrid.rmilk.data.MilkDataService; * @author Tim Su * */ -public class DetailExposer extends BroadcastReceiver { +public class MilkDetailExposer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { @@ -38,27 +38,24 @@ public class DetailExposer extends BroadcastReceiver { if(metadata == null) return; - TaskDetail[] details = new TaskDetail[2]; + Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, Utilities.IDENTIFIER); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); long listId = metadata.getValue(MilkDataService.LIST_ID); - if(listId > 0) - details[0] = new TaskDetail(context.getString(R.string.rmilk_TLA_list, - MilkDataService.getInstance().getListName(listId))); - else - details[0] = null; + if(listId > 0) { + TaskDetail detail = new TaskDetail(context.getString(R.string.rmilk_TLA_list, + MilkDataService.getInstance().getListName(listId))); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, detail); + context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); + } int repeat = metadata.getValue(MilkDataService.REPEATING); - if(repeat != 0) - details[1] = new TaskDetail(context.getString(R.string.rmilk_TLA_repeat)); - else - details[1] = null; - - // transmit - Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS); - broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, Utilities.IDENTIFIER); - broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, details); - broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); - context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); + if(repeat != 0) { + TaskDetail detail = new TaskDetail(context.getString(R.string.rmilk_TLA_repeat)); + broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, detail); + context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); + } } } diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/FilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkFilterExposer.java similarity index 88% rename from astrid/plugin-src/com/todoroo/astrid/rmilk/FilterExposer.java rename to astrid/plugin-src/com/todoroo/astrid/rmilk/MilkFilterExposer.java index 4084ee119..99564e43d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/FilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkFilterExposer.java @@ -25,7 +25,7 @@ import com.todoroo.astrid.rmilk.data.MilkDataService; * @author Tim Su * */ -public class FilterExposer extends BroadcastReceiver { +public class MilkFilterExposer extends BroadcastReceiver { @SuppressWarnings("nls") private Filter filterFromList(Context context, ListContainer list) { @@ -57,10 +57,9 @@ public class FilterExposer extends BroadcastReceiver { for(int i = 0; i < lists.length; i++) listFilters[i] = filterFromList(context, lists[i]); - FilterListHeader rtmHeader = new FilterListHeader(Utilities.IDENTIFIER, - context.getString(R.string.rmilk_FEx_header)); - FilterCategory rtmLists = new FilterCategory(Utilities.IDENTIFIER, - context.getString(R.string.rmilk_FEx_list), listFilters); + FilterListHeader rtmHeader = new FilterListHeader(context.getString(R.string.rmilk_FEx_header)); + FilterCategory rtmLists = new FilterCategory(context.getString(R.string.rmilk_FEx_list), + listFilters); // transmit filter list FilterListItem[] list = new FilterListItem[2]; diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java index 84f705ba8..72c72eaf8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java @@ -1,23 +1,23 @@ package com.todoroo.astrid.rmilk; +import java.util.Date; + +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.res.Resources; import android.graphics.Color; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceGroup; -import android.preference.PreferenceScreen; -import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.view.View; import android.view.ViewGroup.OnHierarchyChangeListener; import android.widget.ListView; import com.timsu.astrid.R; +import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.andlib.widget.TodorooPreferences; import com.todoroo.astrid.rmilk.sync.RTMSyncProvider; /** @@ -27,106 +27,139 @@ import com.todoroo.astrid.rmilk.sync.RTMSyncProvider; * @author timsu * */ -public class MilkPreferences extends PreferenceActivity { - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.preferences_rmilk); - - PreferenceScreen screen = getPreferenceScreen(); - initializePreference(screen); - - // status - boolean loggedIn = Utilities.isLoggedIn(); - final String status = "Please Log In To RTM!"; //$NON-NLS-1$ - final int statusColor = Color.RED; - - Resources r = getResources(); - Preference preference = screen.findPreference(r.getString(R.string.rmilk_MPr_status_key)); - preference.setTitle(status); - - getListView().setOnHierarchyChangeListener(new OnHierarchyChangeListener() { - public void onChildViewRemoved(View arg0, View arg1) { - // - } - public void onChildViewAdded(View parent, View child) { - if(((ListView)parent).getChildCount() == 2) { - child.setBackgroundColor(statusColor); - } - } - }); - - // action buttons - Preference syncAction = screen.getPreferenceManager().findPreference( - getString(R.string.rmilk_MPr_sync_key)); - syncAction.setOnPreferenceClickListener(new OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference p) { - new RTMSyncProvider().synchronize(); - return true; - } - }); - Preference clearDataPreference = screen.getPreferenceManager().findPreference( - getString(R.string.rmilk_MPr_forget_key)); - if(!loggedIn) { - syncAction.setTitle(R.string.rmilk_MPr_sync_log_in); - clearDataPreference.setEnabled(false); - } - } +public class MilkPreferences extends TodorooPreferences { - private void initializePreference(Preference preference) { - if(preference instanceof PreferenceGroup) { - PreferenceGroup group = (PreferenceGroup)preference; - for(int i = 0; i < group.getPreferenceCount(); i++) { - initializePreference(group.getPreference(i)); - } - } else { - Object value = null; - if(preference instanceof ListPreference) - value = ((ListPreference)preference).getValue(); - else if(preference instanceof CheckBoxPreference) - value = ((CheckBoxPreference)preference).isChecked(); - else if(preference instanceof EditTextPreference) - value = ((EditTextPreference)preference).getText(); - else - return; - - updatePreferences(preference, value); + @Autowired + DialogUtilities dialogUtilities; - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference myPreference, Object newValue) { - return updatePreferences(myPreference, newValue); - } - }); - } + @Override + public int getPreferenceResource() { + return R.xml.preferences_rmilk; } /** * - * @param resource if null, updates all resources + * @param resource + * if null, updates all resources */ - protected boolean updatePreferences(Preference preference, Object value) { - Resources r = getResources(); + @Override + public void updatePreferences(Preference preference, Object value) { + final Resources r = getResources(); // interval - if(r.getString(R.string.rmilk_MPr_interval_key).equals(preference.getKey())) { - int index = AndroidUtilities.indexOf(r.getStringArray(R.array.rmilk_MPr_interval_values), (String)value); - if(index <= 0) + if (r.getString(R.string.rmilk_MPr_interval_key).equals( + preference.getKey())) { + int index = AndroidUtilities.indexOf( + r.getStringArray(R.array.rmilk_MPr_interval_values), + (String) value); + if (index <= 0) preference.setSummary(R.string.rmilk_MPr_interval_desc_disabled); else - preference.setSummary(r.getString(R.string.rmilk_MPr_interval_desc, + preference.setSummary(r.getString( + R.string.rmilk_MPr_interval_desc, r.getStringArray(R.array.rmilk_MPr_interval_entries)[index])); } // shortcut - else if(r.getString(R.string.rmilk_MPr_shortcut_key).equals(preference.getKey())) { - if((Boolean)value) { + else if (r.getString(R.string.rmilk_MPr_shortcut_key).equals( + preference.getKey())) { + if ((Boolean) value) { preference.setSummary(R.string.rmilk_MPr_shortcut_desc_enabled); } else { preference.setSummary(R.string.rmilk_MPr_shortcut_desc_disabled); } } - return true; + // status + else if (r.getString(R.string.rmilk_MPr_status_key).equals(preference.getKey())) { + boolean loggedIn = Utilities.isLoggedIn(); + String status; + String subtitle = ""; //$NON-NLS-1$ + int statusColor; + + // ! logged in - display message, click -> sync + if(!loggedIn) { + status = r.getString(R.string.rmilk_status_loggedout); + statusColor = Color.RED; + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference p) { + new RTMSyncProvider().synchronize(MilkPreferences.this); + return true; + } + }); + } + // last sync was error + else if(Utilities.getLastAttemptedSyncDate() != 0) { + status = r.getString(R.string.rmilk_status_failed, + DateUtilities.getDateWithTimeFormat(MilkPreferences.this). + format(new Date(Utilities.getLastAttemptedSyncDate()))); + if(Utilities.getLastSyncDate() > 0) { + subtitle = r.getString(R.string.rmilk_status_success, + DateUtilities.getDateWithTimeFormat(MilkPreferences.this). + format(new Date(Utilities.getLastSyncDate()))); + } + statusColor = Color.rgb(100, 0, 0); + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference p) { + String error = Utilities.getLastError(); + if(error != null) + dialogUtilities.okDialog(MilkPreferences.this, error, null); + return true; + } + }); + } else { + status = r.getString(R.string.rmilk_status_success, + DateUtilities.getDateWithTimeFormat(MilkPreferences.this). + format(new Date(Utilities.getLastSyncDate()))); + statusColor = Color.rgb(0, 100, 0); + } + preference.setTitle(status); + preference.setSummary(subtitle); + final int statusColorSetting = statusColor; + getListView().setOnHierarchyChangeListener(new OnHierarchyChangeListener() { + public void onChildViewRemoved(View arg0, View arg1) { + // + } + public void onChildViewAdded(View parent, View child) { + if(((ListView)parent).getChildCount() == 2) { + child.setBackgroundColor(statusColorSetting); + } + } + }); + } + + // sync button + else if (r.getString(R.string.rmilk_MPr_sync_key).equals(preference.getKey())) { + boolean loggedIn = Utilities.isLoggedIn(); + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference p) { + new RTMSyncProvider().synchronize(MilkPreferences.this); + return true; + } + }); + if(!loggedIn) + preference.setTitle(R.string.rmilk_MPr_sync_log_in); + } + + // log out button + else if (r.getString(R.string.rmilk_MPr_forget_key).equals(preference.getKey())) { + boolean loggedIn = Utilities.isLoggedIn(); + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference p) { + dialogUtilities.okCancelDialog(MilkPreferences.this, + r.getString(R.string.rmilk_forget_confirm), new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, + int which) { + new RTMSyncProvider().signOut(); + initializePreference(getPreferenceScreen()); + } + }, null); + return true; + } + }); + if(!loggedIn) + preference.setEnabled(false); + } } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java index ac95da289..22e82ef1a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java @@ -9,6 +9,7 @@ import android.preference.PreferenceManager; import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.rmilk.data.MilkList; /** @@ -59,6 +60,10 @@ public class Utilities { private static final String PREF_LAST_SYNC = "rmilk_last_sync"; + private static final String PREF_LAST_ATTEMPTED_SYNC = "rmilk_last_attempted"; + + private static final String PREF_LAST_ERROR = "rmilk_last_error"; + // --- Preference Utility Methods /** Get preferences object from the context */ @@ -85,15 +90,48 @@ public class Utilities { editor.commit(); } - /** RTM Last Successful Sync Date, or 0 */ + /** @return RTM Last Successful Sync Date, or 0 */ public static long getLastSyncDate() { return getPrefs().getLong(PREF_LAST_SYNC, 0); } + /** @return RTM Last Attempted Sync Date, or 0 if it was successful */ + public static long getLastAttemptedSyncDate() { + return getPrefs().getLong(PREF_LAST_ATTEMPTED_SYNC, 0); + } + + /** @return RTM Last Error, or null if no last error */ + public static String getLastError() { + return getPrefs().getString(PREF_LAST_ERROR, null); + } + + /** Deletes RTM Last Successful Sync Date */ + public static void clearLastSyncDate() { + Editor editor = getPrefs().edit(); + editor.remove(PREF_LAST_SYNC); + editor.commit(); + } + /** Set RTM Last Successful Sync Date */ - public static void setLastSyncDate(long time) { + public static void setLastError(String error) { + Editor editor = getPrefs().edit(); + editor.putString(PREF_LAST_ERROR, error); + editor.commit(); + } + + /** Set RTM Last Successful Sync Date */ + public static void recordSuccessfulSync() { + Editor editor = getPrefs().edit(); + editor.putLong(PREF_LAST_SYNC, DateUtilities.now()); + editor.putLong(PREF_LAST_ATTEMPTED_SYNC, 0); + editor.commit(); + } + + /** Set RTM Last Attempted Sync Date */ + public static void recordSyncStart() { Editor editor = getPrefs().edit(); - editor.putLong(PREF_LAST_SYNC, time); + editor.putLong(PREF_LAST_ATTEMPTED_SYNC, DateUtilities.now()); + editor.putString(PREF_LAST_ERROR, null); editor.commit(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java index d52b2f26e..8a3261341 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/data/MilkDataService.java @@ -109,8 +109,10 @@ public final class MilkDataService { */ public TodorooCursor getLocallyCreated(Property[] properties) { return - taskDao.query(Query.select(properties).join(METADATA_JOIN).where( - Criterion.or(TASK_ID.eq(0), Metadata.TASK.isNull()))); + taskDao.query(Query.select(properties).join(METADATA_JOIN).where(Criterion.and( + Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE). + where(Criterion.and(MetadataCriteria.withKey(METADATA_KEY), TASK_SERIES_ID.gt(0))))), + TaskCriteria.isActive()))); } /** @@ -178,7 +180,8 @@ public final class MilkDataService { * @return null if no metadata found */ public Metadata getTaskMetadata(long taskId) { - TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where( + TodorooCursor cursor = metadataDao.query(Query.select( + LIST_ID, TASK_SERIES_ID, TASK_ID, REPEATING).where( MetadataCriteria.byTaskAndwithKey(taskId, METADATA_KEY))); try { if(cursor.getCount() == 0) diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java index 69383baa5..aa305be0c 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Date; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -18,7 +19,6 @@ import com.timsu.astrid.R; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; -import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.utility.AndroidUtilities; @@ -73,7 +73,9 @@ public class RTMSyncProvider extends SynchronizationProvider { */ public void signOut() { Utilities.setToken(null); - Utilities.setLastSyncDate(0); + Utilities.clearLastSyncDate(); + + dataService = MilkDataService.getInstance(); dataService.clearMetadata(); } @@ -95,6 +97,9 @@ public class RTMSyncProvider extends SynchronizationProvider { */ private void handleRtmException(Context context, String tag, Exception e, boolean showErrorIfNeeded) { + + Utilities.setLastError(e.getMessage()); + // occurs when application was closed if(e instanceof IllegalStateException) { exceptionService.reportError(tag + "-caught", e); //$NON-NLS-1$ @@ -119,8 +124,7 @@ public class RTMSyncProvider extends SynchronizationProvider { } @Override - protected void initiate() { - Context context = ContextManager.getContext(); + protected void initiate(Context context) { dataService = MilkDataService.getInstance(); // authenticate the user. this will automatically call the next step @@ -137,6 +141,8 @@ public class RTMSyncProvider extends SynchronizationProvider { final Resources r = context.getResources(); FlurryAgent.onEvent("rtm-started"); + Utilities.recordSyncStart(); + try { String appName = null; String authToken = Utilities.getToken(); @@ -180,7 +186,7 @@ public class RTMSyncProvider extends SynchronizationProvider { try { String token = rtmService.completeAuthorization(); Utilities.setToken(token); - // TODO proceed with sync + synchronize(context); return null; } catch (Exception e) { // didn't work @@ -193,7 +199,10 @@ public class RTMSyncProvider extends SynchronizationProvider { } }); intent.putExtra(MilkLoginActivity.URL_TOKEN, url); - context.startActivity(intent); + if(context instanceof Activity) + ((Activity)context).startActivityForResult(intent, 0); + else + context.startActivity(intent); } else { performSync(context); @@ -256,7 +265,7 @@ public class RTMSyncProvider extends SynchronizationProvider { SyncData syncData = populateSyncData(remoteChanges); synchronizeTasks(syncData); - Utilities.setLastSyncDate(DateUtilities.now()); + Utilities.recordSuccessfulSync(); FlurryAgent.onEvent("rtm-sync-finished"); //$NON-NLS-1$ } catch (IllegalStateException e) { @@ -381,7 +390,6 @@ public class RTMSyncProvider extends SynchronizationProvider { // TODO tags, notes, url, ... - if(remoteTask != null && shouldTransmit(task, MilkDataService.LIST_ID, remoteTask) && task.getValue(MilkDataService.LIST_ID) != 0) rtmService.tasks_moveTo(timeline, Long.toString(remoteTask.getValue(MilkDataService.LIST_ID)), diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java index 597207390..ba8f91045 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java @@ -76,18 +76,17 @@ public class TagFilterExposer extends BroadcastReceiver { for(int i = 0; i < tagsBySize.length; i++) filtersBySize[i] = filterFromTag(context, tagsBySize[i]); - FilterListHeader tagsHeader = new FilterListHeader(TagsPlugin.IDENTIFIER, - context.getString(R.string.tag_FEx_header)); + FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header)); Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged), r.getString(R.string.tag_FEx_untagged), tagService.untaggedTemplate(), null); untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap(); - FilterCategory tagsCategoryBySize = new FilterCategory(TagsPlugin.IDENTIFIER, - context.getString(R.string.tag_FEx_by_size), filtersBySize); + FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size), + filtersBySize); tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap(); - FilterCategory tagsCategoryByAlpha = new FilterCategory(TagsPlugin.IDENTIFIER, - context.getString(R.string.tag_FEx_alpha), filtersByAlpha); + FilterCategory tagsCategoryByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha), + filtersByAlpha); tagsCategoryByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap(); // transmit filter list diff --git a/astrid/res/values/strings-rmilk.xml b/astrid/res/values/strings-rmilk.xml index cfd97d89d..4cf5bc029 100644 --- a/astrid/res/values/strings-rmilk.xml +++ b/astrid/res/values/strings-rmilk.xml @@ -51,6 +51,13 @@ Status rmilk_status + + + Please Log In To RTM! + + Last Sync: %s + + Sync Failed On: %s Options