Fixed crashing issues with RTM sync (thanks Arne Jans!). Also added an 'Ongoing' status for sync

pull/14/head
Tim Su 14 years ago
parent a8ca8f346d
commit 695f865c23

@ -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<TYPE extends TaskContainer> {
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<TYPE>)data.remoteUpdated, local);

@ -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))

@ -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,

@ -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();
}

@ -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);
}

@ -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<RTMTaskContainer> {
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<RTMTaskContainer> {
// occurs when application was closed
} catch (Exception e) {
handleRtmException(context, "rtm-authenticate", e, true);
} finally {
Utilities.stopOngoing();
}
}

@ -44,10 +44,14 @@ public class RTMTaskContainer extends TaskContainer {
for(Iterator<Metadata> 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;
}

@ -54,6 +54,8 @@
<!-- Status: log in -->
<string name="rmilk_status_loggedout">Please Log In To RTM!</string>
<!-- Status: ongoing -->
<string name="rmilk_status_ongoing">Sync Ongoing...</string>
<!-- Status: success (%s -> last sync date) -->
<string name="rmilk_status_success">Last Sync: %s</string>
<!-- Status: error (%s -> last attempted sync date) -->

@ -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);
}
}

Loading…
Cancel
Save