diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/FetchHistory.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/FetchHistory.java new file mode 100644 index 000000000..7d56523bd --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/FetchHistory.java @@ -0,0 +1,108 @@ +package com.todoroo.astrid.actfm.sync.messages; + +import java.io.IOException; +import java.util.ArrayList; + +import org.json.JSONArray; +import org.json.JSONObject; + +import android.text.TextUtils; +import android.util.Log; + +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.actfm.sync.ActFmInvoker; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; +import com.todoroo.astrid.dao.HistoryDao; +import com.todoroo.astrid.data.History; + +public class FetchHistory { + + private static final String ERROR_TAG = "actfm-fetch-history"; //$NON-NLS-1$ + + private final String table; + private final String uuid; + private final long modifiedAfter; + private final boolean includeTaskHistory; + + @Autowired + private ActFmInvoker actFmInvoker; + + @Autowired + private HistoryDao historyDao; + + @Autowired + private ActFmPreferenceService actFmPreferenceService; + + public FetchHistory(String table, String uuid, long modifiedAfter, boolean includeTaskHistory) { + this.table = table; + this.uuid = uuid; + this.modifiedAfter = modifiedAfter; + this.includeTaskHistory = includeTaskHistory; + } + + @SuppressWarnings("nls") + public void execute() { + new Thread(new Runnable() { + @Override + public void run() { + String token = actFmPreferenceService.getToken(); + if (TextUtils.isEmpty(token) || TextUtils.isEmpty(uuid)) + return; + + ArrayList params = new ArrayList(); + if (NameMaps.TABLE_ID_TASKS.equals(table)) + params.add("task_id"); + else if (NameMaps.TABLE_ID_TAGS.equals(table)) + params.add("tag_id"); + else + return; + + params.add(uuid); + + if (includeTaskHistory) { + params.add("include_tasks"); params.add(1); + } + + if (modifiedAfter > 0) { + params.add("modified_after"); params.add(DateUtilities.timeToIso8601(modifiedAfter, true)); + } + + params.add("token"); params.add(token); + try { + JSONObject result = actFmInvoker.invoke("model_history_list", params.toArray(new Object[params.size()])); + JSONArray list = result.optJSONArray("list"); + if (list != null) { + for (int i = 0; i < list.length(); i++) { + JSONObject historyJson = list.optJSONObject(i); + if (historyJson != null) { + try { + History history = MakeChanges.changesToModel(historyDao, historyJson, table); + history.setValue(History.TABLE_ID, table); + history.setValue(History.TARGET_ID, uuid); + + JSONArray taskObj = historyJson.optJSONArray("task"); + if (taskObj != null) { + history.setValue(History.TABLE_ID, NameMaps.TABLE_ID_TASKS); + history.setValue(History.TARGET_ID, taskObj.optString(0)); + } + + if (historyDao.update(History.UUID.eq(history.getUuid()), history) <= 0) { + historyDao.createNew(history); + } + } catch (InstantiationException e) { + Log.e(ERROR_TAG, "Error instantiating history", e); + } catch (IllegalAccessException e) { + Log.e(ERROR_TAG, "Error instantiating history", e); + } + } + } + } + } catch (IOException e) { + Log.e(ERROR_TAG, "Error getting model history", e); + } + } + }); + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java index eec5bb4c4..cf894db9f 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java @@ -258,7 +258,7 @@ public class NameMaps { HISTORY_COLUMNS_LOCAL_TO_SERVER = new HashMap(); HISTORY_PROPERTIES_EXCLUDED = new HashSet(); - putHistoryPropertyToServerName(History.UUID, "uuid", false); + putHistoryPropertyToServerName(History.UUID, "id", false); putHistoryPropertyToServerName(History.CREATED_AT, "created_at", false); putHistoryPropertyToServerName(History.USER_UUID, "user_id", false); putHistoryPropertyToServerName(History.COLUMN, "column", false); diff --git a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java index 01acb14c5..327e00488 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java @@ -11,6 +11,7 @@ import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.HistoryDao; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.TagDataDao; @@ -81,6 +82,9 @@ public final class PluginServices { @Autowired TagOutstandingDao tagOutstandingDao; + @Autowired + HistoryDao historyDao; + private static volatile PluginServices instance; static { @@ -164,6 +168,10 @@ public final class PluginServices { return getInstance().userDao; } + public static HistoryDao getHistoryDao() { + return getInstance().historyDao; + } + // -- helpers /** diff --git a/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java b/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java index 87794f800..885b002d5 100644 --- a/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java +++ b/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java @@ -16,6 +16,7 @@ import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.dao.ABTestEventDao; import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.HistoryDao; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.TagDataDao; @@ -82,6 +83,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector { injectables.put("taskOutstandingDao", TaskOutstandingDao.class); injectables.put("tagOutstandingDao", TagOutstandingDao.class); injectables.put("userActivityOutstandingDao", UserActivityOutstandingDao.class); + injectables.put("historyDao", HistoryDao.class); // com.todoroo.astrid.service injectables.put("taskService", TaskService.class);