First draft at what a Gtasks import might look like

pull/14/head
Sam Bosley 12 years ago
parent 6524d1b0a0
commit 47b8fa96b4

@ -8,6 +8,7 @@ package com.todoroo.astrid.data;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.content.ContentValues;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.text.TextUtils; import android.text.TextUtils;
@ -77,6 +78,16 @@ abstract public class RemoteModel extends AbstractModel {
return NO_UUID; return NO_UUID;
} }
public void setUuid(String uuid) {
if (setValues == null)
setValues = new ContentValues();
if(NO_UUID.equals(uuid))
clearValue(UUID_PROPERTY);
else
setValues.put(UUID_PROPERTY_NAME, uuid);
}
public static boolean isUuidEmpty(String uuid) { public static boolean isUuidEmpty(String uuid) {
return NO_UUID.equals(uuid) || TextUtils.isEmpty(uuid); return NO_UUID.equals(uuid) || TextUtils.isEmpty(uuid);
} }

@ -24,6 +24,7 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.AstridFilterExposer;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -48,6 +49,7 @@ public class GtasksFilterExposer extends BroadcastReceiver implements AstridFilt
@Autowired private GtasksListService gtasksListService; @Autowired private GtasksListService gtasksListService;
@Autowired private GtasksPreferenceService gtasksPreferenceService; @Autowired private GtasksPreferenceService gtasksPreferenceService;
@Autowired private ActFmPreferenceService actFmPreferenceService;
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
@ -92,8 +94,8 @@ public class GtasksFilterExposer extends BroadcastReceiver implements AstridFilt
private FilterListItem[] prepareFilters(Context context) { private FilterListItem[] prepareFilters(Context context) {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
// if we aren't logged in, don't expose features // if we aren't logged in (or we are logged in to astrid.com), don't expose features
if(!gtasksPreferenceService.isLoggedIn()) if(!gtasksPreferenceService.isLoggedIn() || actFmPreferenceService.isLoggedIn())
return null; return null;
lists = gtasksListService.getLists(); lists = gtasksListService.getLists();

@ -20,6 +20,7 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
@ -43,6 +44,7 @@ public final class GtasksSyncService {
@Autowired GtasksMetadataService gtasksMetadataService; @Autowired GtasksMetadataService gtasksMetadataService;
@Autowired TaskDao taskDao; @Autowired TaskDao taskDao;
@Autowired GtasksPreferenceService gtasksPreferenceService; @Autowired GtasksPreferenceService gtasksPreferenceService;
@Autowired ActFmPreferenceService actFmPreferenceService;
public GtasksSyncService() { public GtasksSyncService() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
@ -104,6 +106,8 @@ public final class GtasksSyncService {
public void onModelUpdated(final Task model, boolean outstandingEntries) { public void onModelUpdated(final Task model, boolean outstandingEntries) {
if(model.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) if(model.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC))
return; return;
if (actFmPreferenceService.isLoggedIn())
return;
if (gtasksPreferenceService.isOngoing() && !model.checkTransitory(TaskService.TRANS_REPEAT_COMPLETE)) //Don't try and sync changes that occur during a normal sync if (gtasksPreferenceService.isOngoing() && !model.checkTransitory(TaskService.TRANS_REPEAT_COMPLETE)) //Don't try and sync changes that occur during a normal sync
return; return;
final ContentValues setValues = model.getSetValues(); final ContentValues setValues = model.getSetValues();
@ -178,6 +182,8 @@ public final class GtasksSyncService {
return; return;
if (metadata.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC)) if (metadata.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC))
return; return;
if (actFmPreferenceService.isLoggedIn())
return;
if (!metadata.getValue(Metadata.KEY).equals(GtasksMetadata.METADATA_KEY)) //Don't care about non-gtasks metadata if (!metadata.getValue(Metadata.KEY).equals(GtasksMetadata.METADATA_KEY)) //Don't care about non-gtasks metadata
return; return;
if (gtasksPreferenceService.isOngoing()) //Don't try and sync changes that occur during a normal sync if (gtasksPreferenceService.isOngoing()) //Don't try and sync changes that occur during a normal sync
@ -192,6 +198,9 @@ public final class GtasksSyncService {
* Synchronize with server when data changes * Synchronize with server when data changes
*/ */
public void pushTaskOnSave(Task task, ContentValues values, GtasksInvoker invoker, boolean sleep) throws IOException { public void pushTaskOnSave(Task task, ContentValues values, GtasksInvoker invoker, boolean sleep) throws IOException {
if (actFmPreferenceService.isLoggedIn())
return;
if (sleep) if (sleep)
AndroidUtilities.sleepDeep(1000L); //Wait for metadata to be saved AndroidUtilities.sleepDeep(1000L); //Wait for metadata to be saved
@ -297,6 +306,8 @@ public final class GtasksSyncService {
} }
public void pushMetadataOnSave(Metadata model, GtasksInvoker invoker) throws IOException { public void pushMetadataOnSave(Metadata model, GtasksInvoker invoker) throws IOException {
if (actFmPreferenceService.isLoggedIn())
return;
AndroidUtilities.sleepDeep(1000L); AndroidUtilities.sleepDeep(1000L);
String taskId = model.getValue(GtasksMetadata.ID); String taskId = model.getValue(GtasksMetadata.ID);

@ -25,16 +25,20 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksList; import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.gtasks.GtasksListService; import com.todoroo.astrid.gtasks.GtasksListService;
@ -53,6 +57,7 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.sync.SyncResultCallback; import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.sync.SyncV2Provider; import com.todoroo.astrid.sync.SyncV2Provider;
import com.todoroo.astrid.tags.TagService;
public class GtasksSyncV2Provider extends SyncV2Provider { public class GtasksSyncV2Provider extends SyncV2Provider {
@ -65,6 +70,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
@Autowired GtasksListService gtasksListService; @Autowired GtasksListService gtasksListService;
@Autowired GtasksMetadataService gtasksMetadataService; @Autowired GtasksMetadataService gtasksMetadataService;
@Autowired GtasksTaskListUpdater gtasksTaskListUpdater; @Autowired GtasksTaskListUpdater gtasksTaskListUpdater;
@Autowired TagService tagService;
@Autowired TagDataDao tagDataDao;
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
@ -110,6 +117,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
callback.started(); callback.started();
callback.incrementMax(100); callback.incrementMax(100);
final boolean isImport = actFmPreferenceService.isLoggedIn();
gtasksPreferenceService.recordSyncStart(); gtasksPreferenceService.recordSyncStart();
new Thread(new Runnable() { new Thread(new Runnable() {
@ -137,10 +146,13 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
synchronizeListHelper(list, invoker, manual, handler, callback); synchronizeListHelper(list, invoker, manual, handler, callback, isImport);
callback.incrementProgress(25); callback.incrementProgress(25);
if (finisher.decrementAndGet() == 0) { if (finisher.decrementAndGet() == 0) {
if (!isImport)
pushUpdated(invoker, callback); pushUpdated(invoker, callback);
else
finishImport();
finishSync(callback); finishSync(callback);
} }
} }
@ -186,6 +198,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
if (!GtasksList.TYPE.equals(gtasksList.getValue(StoreObject.TYPE))) if (!GtasksList.TYPE.equals(gtasksList.getValue(StoreObject.TYPE)))
return; return;
final boolean isImport = actFmPreferenceService.isLoggedIn();
callback.started(); callback.started();
callback.incrementMax(100); callback.incrementMax(100);
@ -198,7 +212,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
gtasksSyncService.waitUntilEmpty(); gtasksSyncService.waitUntilEmpty();
callback.incrementProgress(13); callback.incrementProgress(13);
final GtasksInvoker service = new GtasksInvoker(authToken); final GtasksInvoker service = new GtasksInvoker(authToken);
synchronizeListHelper(gtasksList, service, manual, null, callback); synchronizeListHelper(gtasksList, service, manual, null, callback, isImport);
} finally { } finally {
callback.incrementProgress(25); callback.incrementProgress(25);
callback.finished(); callback.finished();
@ -221,7 +235,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
private synchronized void synchronizeListHelper(StoreObject list, GtasksInvoker invoker, private synchronized void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
boolean manual, SyncExceptionHandler errorHandler, SyncResultCallback callback) { boolean manual, SyncExceptionHandler errorHandler, SyncResultCallback callback, boolean isImport) {
String listId = list.getValue(GtasksList.REMOTE_ID); String listId = list.getValue(GtasksList.REMOTE_ID);
long lastSyncDate; long lastSyncDate;
if (!manual && list.containsNonNullValue(GtasksList.LAST_SYNC)) { if (!manual && list.containsNonNullValue(GtasksList.LAST_SYNC)) {
@ -253,7 +267,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
list.setValue(GtasksList.LAST_SYNC, DateUtilities.now()); list.setValue(GtasksList.LAST_SYNC, DateUtilities.now());
storeObjectDao.persist(list); storeObjectDao.persist(list);
if(lastSyncDate == 0) { if(lastSyncDate == 0 && !isImport) {
Long[] localIdArray = localIds.toArray(new Long[localIds.size()]); Long[] localIdArray = localIds.toArray(new Long[localIds.size()]);
Criterion delete = Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), Criterion delete = Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY),
GtasksMetadata.LIST_ID.eq(listId), GtasksMetadata.LIST_ID.eq(listId),
@ -358,4 +372,42 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
remote.setValue(Task.DUE_DATE, setDate); remote.setValue(Task.DUE_DATE, setDate);
} }
} }
private void finishImport() {
TodorooCursor<Task> tasks = taskService.query(Query.select(AndroidUtilities.addToArray(Task.PROPERTIES, GtasksList.NAME))
.join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK)))
.join(Join.left(StoreObject.TABLE, GtasksMetadata.LIST_ID.eq(GtasksList.REMOTE_ID)))
.where(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY)));
try {
for (tasks.moveToFirst(); tasks.isAfterLast(); tasks.moveToNext()) {
String listName = tasks.get(GtasksList.NAME);
String tagUuid = RemoteModel.NO_UUID;
if (!TextUtils.isEmpty(listName)) {
TodorooCursor<TagData> existingTag = tagDataDao.query(Query.select(TagData.UUID).where(TagData.NAME.eq(listName)));
try {
if (existingTag.getCount() > 0) {
existingTag.moveToFirst();
tagUuid = existingTag.get(TagData.UUID);
} else {
TagData td = new TagData();
td.setValue(TagData.NAME, listName);
tagDataDao.createNew(td);
tagUuid = td.getUuid();
}
} finally {
existingTag.close();
}
if (!RemoteModel.isUuidEmpty(tagUuid)) {
Task task = new Task();
task.setId(tasks.get(Task.ID));
task.setUuid(tasks.get(Task.UUID));
tagService.createLink(task, listName, tagUuid);
}
}
}
} finally {
tasks.close();
}
}
} }

Loading…
Cancel
Save