From 695f865c238a9c3f5457fcfe318529537e9b14b2 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 20 Jul 2010 01:44:03 -0700 Subject: [PATCH] Fixed crashing issues with RTM sync (thanks Arne Jans!). Also added an 'Ongoing' status for sync --- .../astrid/api/SynchronizationProvider.java | 4 +++- .../com/todoroo/andlib/data/AbstractModel.java | 2 +- .../com/todoroo/astrid/rmilk/MilkPreferences.java | 5 +++++ .../com/todoroo/astrid/rmilk/Utilities.java | 15 +++++++++++++++ .../com/todoroo/astrid/rmilk/api/ServiceImpl.java | 2 +- .../astrid/rmilk/sync/RTMSyncProvider.java | 10 ++++++---- .../astrid/rmilk/sync/RTMTaskContainer.java | 12 ++++++++---- astrid/res/values/strings-rmilk.xml | 2 ++ .../com/todoroo/astrid/adapter/TaskAdapter.java | 9 +++++---- 9 files changed, 46 insertions(+), 15 deletions(-) diff --git a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java index 763307caf..3eb40d929 100644 --- a/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java +++ b/astrid/api-src/com/todoroo/astrid/api/SynchronizationProvider.java @@ -17,8 +17,8 @@ import android.content.Intent; import android.widget.Toast; import com.timsu.astrid.R; -import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; @@ -238,6 +238,8 @@ public abstract class SynchronizationProvider { for(int i = 0; i < length; i++) { data.localUpdated.moveToNext(); TYPE local = read(data.localUpdated); + if(local.task == null) + continue; // if there is a conflict, merge int remoteIndex = matchTask((ArrayList)data.remoteUpdated, local); diff --git a/astrid/common-src/com/todoroo/andlib/data/AbstractModel.java b/astrid/common-src/com/todoroo/andlib/data/AbstractModel.java index a0b0cef9f..5a0f68418 100644 --- a/astrid/common-src/com/todoroo/andlib/data/AbstractModel.java +++ b/astrid/common-src/com/todoroo/andlib/data/AbstractModel.java @@ -154,7 +154,7 @@ public abstract class AbstractModel implements Parcelable { if(setValues != null && setValues.containsKey(property.name)) value = setValues.get(property.name); - else if(values != null && values.containsKey(property.name)) + else if(values != null && values.containsKey(property.name) && (values.get(property.name) != null)) value = values.get(property.name); else if(getDefaultValues().containsKey(property.name)) diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java index a9590116e..fa9303d54 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/MilkPreferences.java @@ -99,6 +99,11 @@ public class MilkPreferences extends TodorooPreferences { } }); } + // sync is occurring + else if(Utilities.isOngoing()) { + status = r.getString(R.string.rmilk_status_ongoing); + statusColor = Color.rgb(0, 0, 100); + } // last sync was error else if(Utilities.getLastAttemptedSyncDate() != 0) { status = r.getString(R.string.rmilk_status_failed, diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java index 22e82ef1a..3a829831d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/Utilities.java @@ -64,6 +64,8 @@ public class Utilities { private static final String PREF_LAST_ERROR = "rmilk_last_error"; + private static final String PREF_ONGOING = "rmilk_ongoing"; + // --- Preference Utility Methods /** Get preferences object from the context */ @@ -105,6 +107,11 @@ public class Utilities { return getPrefs().getString(PREF_LAST_ERROR, null); } + /** @return RTM Last Error, or null if no last error */ + public static boolean isOngoing() { + return getPrefs().getBoolean(PREF_ONGOING, false); + } + /** Deletes RTM Last Successful Sync Date */ public static void clearLastSyncDate() { Editor editor = getPrefs().edit(); @@ -119,6 +126,13 @@ public class Utilities { editor.commit(); } + /** Set RTM Ongoing */ + public static void stopOngoing() { + Editor editor = getPrefs().edit(); + editor.putBoolean(PREF_ONGOING, false); + editor.commit(); + } + /** Set RTM Last Successful Sync Date */ public static void recordSuccessfulSync() { Editor editor = getPrefs().edit(); @@ -132,6 +146,7 @@ public class Utilities { Editor editor = getPrefs().edit(); editor.putLong(PREF_LAST_ATTEMPTED_SYNC, DateUtilities.now()); editor.putString(PREF_LAST_ERROR, null); + editor.putBoolean(PREF_ONGOING, true); editor.commit(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/api/ServiceImpl.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/api/ServiceImpl.java index d298c269a..58a212f78 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/api/ServiceImpl.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/api/ServiceImpl.java @@ -374,7 +374,7 @@ public class ServiceImpl params.add(new Param("method", "rtm.tasks.getList")); params.add(new Param("auth_token", currentAuthToken)); params.add(new Param("api_key", applicationInfo.getApiKey())); - params.add(new Param("filter", "name:" + taskName)); + params.add(new Param("filter", "name:\"" + taskName+"\"")); RtmTasks rtmTasks = new RtmTasks(invoker.invoke(params.toArray(new Param[params.size()]))); return findTask(taskSeriesId, rtmTasks); } 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 c9d7deb9a..110c4513b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMSyncProvider.java @@ -32,20 +32,20 @@ import com.todoroo.astrid.api.TaskContainer; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; import com.todoroo.astrid.rmilk.MilkLoginActivity; -import com.todoroo.astrid.rmilk.MilkLoginActivity.SyncLoginCallback; import com.todoroo.astrid.rmilk.Utilities; +import com.todoroo.astrid.rmilk.MilkLoginActivity.SyncLoginCallback; import com.todoroo.astrid.rmilk.api.ApplicationInfo; import com.todoroo.astrid.rmilk.api.ServiceImpl; import com.todoroo.astrid.rmilk.api.ServiceInternalException; -import com.todoroo.astrid.rmilk.api.data.RtmAuth.Perms; import com.todoroo.astrid.rmilk.api.data.RtmList; import com.todoroo.astrid.rmilk.api.data.RtmLists; import com.todoroo.astrid.rmilk.api.data.RtmTask; -import com.todoroo.astrid.rmilk.api.data.RtmTask.Priority; import com.todoroo.astrid.rmilk.api.data.RtmTaskList; import com.todoroo.astrid.rmilk.api.data.RtmTaskNote; import com.todoroo.astrid.rmilk.api.data.RtmTaskSeries; import com.todoroo.astrid.rmilk.api.data.RtmTasks; +import com.todoroo.astrid.rmilk.api.data.RtmAuth.Perms; +import com.todoroo.astrid.rmilk.api.data.RtmTask.Priority; import com.todoroo.astrid.rmilk.data.MilkDataService; import com.todoroo.astrid.rmilk.data.MilkNote; import com.todoroo.astrid.service.AstridDependencyInjector; @@ -106,7 +106,7 @@ public class RTMSyncProvider extends SynchronizationProvider { private void handleRtmException(Context context, String tag, Exception e, boolean showErrorIfNeeded) { - Utilities.setLastError(e.getMessage()); + Utilities.setLastError(e.toString()); // occurs when application was closed if(e instanceof IllegalStateException) { @@ -217,6 +217,8 @@ public class RTMSyncProvider extends SynchronizationProvider { // occurs when application was closed } catch (Exception e) { handleRtmException(context, "rtm-authenticate", e, true); + } finally { + Utilities.stopOngoing(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMTaskContainer.java b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMTaskContainer.java index 857ca0039..0324ed976 100644 --- a/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMTaskContainer.java +++ b/astrid/plugin-src/com/todoroo/astrid/rmilk/sync/RTMTaskContainer.java @@ -44,10 +44,14 @@ public class RTMTaskContainer extends TaskContainer { for(Iterator iterator = metadata.iterator(); iterator.hasNext(); ) { Metadata item = iterator.next(); if(MilkTask.METADATA_KEY.equals(item.getValue(Metadata.KEY))) { - listId = item.getValue(MilkTask.LIST_ID); - taskSeriesId = item.getValue(MilkTask.TASK_SERIES_ID); - taskId = item.getValue(MilkTask.TASK_ID); - repeating = item.getValue(MilkTask.REPEATING) == 1; + if(item.containsValue(MilkTask.LIST_ID)) + listId = item.getValue(MilkTask.LIST_ID); + if(item.containsValue(MilkTask.TASK_SERIES_ID)) + taskSeriesId = item.getValue(MilkTask.TASK_SERIES_ID); + if(item.containsValue(MilkTask.TASK_ID)) + taskId = item.getValue(MilkTask.TASK_ID); + if(item.containsValue(MilkTask.REPEATING)) + repeating = item.getValue(MilkTask.REPEATING) == 1; iterator.remove(); break; } diff --git a/astrid/res/values/strings-rmilk.xml b/astrid/res/values/strings-rmilk.xml index 044bf1b81..474e1bf5e 100644 --- a/astrid/res/values/strings-rmilk.xml +++ b/astrid/res/values/strings-rmilk.xml @@ -54,6 +54,8 @@ Please Log In To RTM! + + Sync Ongoing... Last Sync: %s diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 16d54d356..53d815322 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -15,12 +15,12 @@ import android.graphics.Color; import android.graphics.Paint; import android.text.Html; import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; -import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.CheckBox; @@ -575,9 +575,10 @@ public class TaskAdapter extends CursorAdapter { } else { expanded = taskId; } - notifyDataSetChanged(); ListView listView = activity.getListView(); - listView.setSelection(listView.indexOfChild(viewHolder.view)); + int scrollPos = listView.getScrollY(); + notifyDataSetChanged(); + listView.scrollTo(0, scrollPos); } }