From a033a856c68c6891ff3d34ab8454b110fa634061 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 11 Jun 2012 20:26:18 -0700 Subject: [PATCH 01/12] Sequential activation of sync providers --- .../todoroo/astrid/service/SyncV2Service.java | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/astrid/src/com/todoroo/astrid/service/SyncV2Service.java b/astrid/src/com/todoroo/astrid/service/SyncV2Service.java index eb50ea826..c06f5ae96 100644 --- a/astrid/src/com/todoroo/astrid/service/SyncV2Service.java +++ b/astrid/src/com/todoroo/astrid/service/SyncV2Service.java @@ -55,10 +55,39 @@ public class SyncV2Service { * @param manual if manual sync * @param callback result callback */ - public void synchronizeActiveTasks(boolean manual, SyncResultCallback callback) { - for(SyncV2Provider provider : providers) { - if(provider.isActive()) - provider.synchronizeActiveTasks(manual, callback); + public void synchronizeActiveTasks(final boolean manual, final SyncResultCallback callback) { + final List active = activeProviders(); + + if (active.size() > 1) { + SyncResultCallback newCallback = new SyncResultCallback() { + private int next = 1; + + @Override + public void started() { + callback.started(); + } + + @Override + public void incrementProgress(int incrementBy) { + callback.incrementProgress(incrementBy); + } + + @Override + public void incrementMax(int incrementBy) { + callback.incrementMax(incrementBy); + } + + @Override + public void finished() { + callback.finished(); + if (next < active.size()) + active.get(next++).synchronizeActiveTasks(manual, this); + } + }; + + active.get(0).synchronizeActiveTasks(manual, newCallback); + } else if (active.size() == 1) { + active.get(0).synchronizeActiveTasks(manual, callback); } } From 268d57d498e6d170860b2483d7b244c0ed4535f4 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 12 Jun 2012 13:45:49 -0700 Subject: [PATCH 02/12] Warn when logging into your second sync provider --- .../astrid/actfm/ActFmPreferences.java | 22 +++++++++++++++++-- .../astrid/gtasks/GtasksPreferences.java | 22 +++++++++++++++++-- astrid/res/values/strings-actfm.xml | 4 ++++ astrid/res/values/strings-core.xml | 2 ++ astrid/res/values/strings-gtasks.xml | 3 +++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java index 3980ae393..1e5fb59a3 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmPreferences.java @@ -1,5 +1,6 @@ package com.todoroo.astrid.actfm; +import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.preference.Preference; @@ -7,8 +8,10 @@ import android.preference.PreferenceCategory; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmSyncV2Provider; +import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.sync.SyncProviderPreferences; import com.todoroo.astrid.sync.SyncProviderUtilities; @@ -22,6 +25,7 @@ import com.todoroo.astrid.sync.SyncProviderUtilities; public class ActFmPreferences extends SyncProviderPreferences { @Autowired ActFmPreferenceService actFmPreferenceService; + @Autowired GtasksPreferenceService gtasksPreferenceService; @Override public int getPreferenceResource() { @@ -31,14 +35,28 @@ public class ActFmPreferences extends SyncProviderPreferences { @Override public void startSync() { if (!actFmPreferenceService.isLoggedIn()) { - Intent intent = new Intent(this, ActFmLoginActivity.class); - startActivityForResult(intent, REQUEST_LOGIN); + if (gtasksPreferenceService.isLoggedIn()) { + DialogUtilities.okCancelDialog(this, getString(R.string.DLG_warning), getString(R.string.actfm_dual_sync_warning), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + startLogin(); + } + }, null); + } else { + startLogin(); + } } else { setResult(RESULT_CODE_SYNCHRONIZE); finish(); } } + private void startLogin() { + Intent intent = new Intent(this, ActFmLoginActivity.class); + startActivityForResult(intent, REQUEST_LOGIN); + } + @Override public void logOut() { new ActFmSyncV2Provider().signOut(); diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksPreferences.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksPreferences.java index 48ea5f42e..6209bfaa9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksPreferences.java @@ -1,11 +1,14 @@ package com.todoroo.astrid.gtasks; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity; import com.todoroo.astrid.gtasks.sync.GtasksSyncV2Provider; import com.todoroo.astrid.sync.SyncProviderPreferences; @@ -21,6 +24,7 @@ import com.todoroo.astrid.sync.SyncProviderUtilities; public class GtasksPreferences extends SyncProviderPreferences { @Autowired private GtasksPreferenceService gtasksPreferenceService; + @Autowired private ActFmPreferenceService actFmPreferenceService; public GtasksPreferences() { super(); @@ -40,14 +44,28 @@ public class GtasksPreferences extends SyncProviderPreferences { @Override public void startSync() { if (!gtasksPreferenceService.isLoggedIn()) { - Intent intent = new Intent(this, GtasksLoginActivity.class); - startActivityForResult(intent, REQUEST_LOGIN); + if (actFmPreferenceService.isLoggedIn()) { + DialogUtilities.okCancelDialog(this, getString(R.string.DLG_warning), getString(R.string.gtasks_dual_sync_warning), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + startLogin(); + } + }, null); + } else { + startLogin(); + } } else { setResult(RESULT_CODE_SYNCHRONIZE); finish(); } } + private void startLogin() { + Intent intent = new Intent(this, GtasksLoginActivity.class); + startActivityForResult(intent, REQUEST_LOGIN); + } + @Override public void logOut() { GtasksSyncV2Provider.getInstance().signOut(); diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml index 43415617a..7fc6d3fb0 100644 --- a/astrid/res/values/strings-actfm.xml +++ b/astrid/res/values/strings-actfm.xml @@ -287,5 +287,9 @@ New comments received / click for more details + You are currently synchronizing with Google Tasks. + Be advised that synchronizing with both services can in some cases lead to unexpected results. + Are you sure you want to sync with Astrid.com? + diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml index 4c806f404..5742df960 100644 --- a/astrid/res/values/strings-core.xml +++ b/astrid/res/values/strings-core.xml @@ -67,6 +67,8 @@ Undo + Warning + diff --git a/astrid/res/values/strings-gtasks.xml b/astrid/res/values/strings-gtasks.xml index 9c3c3f65d..e9754ebb3 100644 --- a/astrid/res/values/strings-gtasks.xml +++ b/astrid/res/values/strings-gtasks.xml @@ -104,6 +104,9 @@ Error authenticating in background. Please try initiating a sync while Astrid is running. + You are currently synchronizing with Astrid.com. + Be advised that synchronizing with both services can in some cases lead to unexpected results. + Are you sure you want to sync with Google Tasks? From aa775fdacf3f5a5e8e1a83b951f8db2757704da1 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 12 Jun 2012 16:30:53 -0700 Subject: [PATCH 03/12] Title match when syncing with both services --- .../astrid/actfm/sync/ActFmSyncService.java | 25 +++++++++++++++++ .../gtasks/sync/GtasksSyncV2Provider.java | 27 +++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java index a4d489c61..bd6561739 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -39,6 +39,7 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; @@ -59,6 +60,8 @@ import com.todoroo.astrid.data.TaskApiDao; import com.todoroo.astrid.data.Update; import com.todoroo.astrid.data.User; import com.todoroo.astrid.files.FileMetadata; +import com.todoroo.astrid.gtasks.GtasksMetadata; +import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.StatisticsConstants; @@ -84,6 +87,7 @@ public final class ActFmSyncService { @Autowired MetadataService metadataService; @Autowired TaskService taskService; @Autowired ActFmPreferenceService actFmPreferenceService; + @Autowired GtasksPreferenceService gtasksPreferenceService; @Autowired ActFmInvoker actFmInvoker; @Autowired ActFmDataService actFmDataService; @Autowired TaskDao taskDao; @@ -1139,6 +1143,11 @@ public final class ActFmSyncService { remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true); if (remote.getValue(Task.USER_ID) != Task.USER_ID_SELF) remote.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); + + if (!remote.isSaved() && gtasksPreferenceService.isLoggedIn()) { + titleMatchOnGoogleTask(remote); + } + taskService.save(remote); ids.add(remote.getId()); metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY)); @@ -1152,6 +1161,22 @@ public final class ActFmSyncService { } } + private void titleMatchOnGoogleTask(Task remote) { + String title = remote.getValue(Task.TITLE); + TodorooCursor match = taskService.query(Query.select(Task.ID) + .join(Join.inner(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), Metadata.TASK.eq(Task.ID)))) + .where(Criterion.and(Task.TITLE.eq(title), Task.REMOTE_ID.isNull()))); + try { + if (match.getCount() > 0) { + match.moveToFirst(); + Task matchedTitle = new Task(match); + remote.setId(matchedTitle.getId()); + } + } finally { + match.close(); + } + } + protected void deleteExtras(Long[] localIds) { taskService.deleteWhere(Criterion.and(TaskCriteria.activeVisibleMine(), Task.REMOTE_ID.isNotNull(), diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 3063e1a20..148057204 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -22,6 +22,7 @@ import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.StoreObjectDao; @@ -53,6 +54,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider { @Autowired TaskService taskService; @Autowired MetadataService metadataService; @Autowired StoreObjectDao storeObjectDao; + @Autowired ActFmPreferenceService actFmPreferenceService; @Autowired GtasksPreferenceService gtasksPreferenceService; @Autowired GtasksSyncService gtasksSyncService; @Autowired GtasksListService gtasksListService; @@ -126,8 +128,6 @@ public class GtasksSyncV2Provider extends SyncV2Provider { callback.incrementMax(25 * lists.length); final AtomicInteger finisher = new AtomicInteger(lists.length); - pushUpdated(invoker, callback); - for (final StoreObject list : lists) { new Thread(new Runnable() { @Override @@ -140,6 +140,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider { } }).start(); } + + pushUpdated(invoker, callback); } }).start(); } @@ -303,6 +305,9 @@ public class GtasksSyncV2Provider extends SyncV2Provider { private void write(GtasksTaskContainer task) throws IOException { // merge astrid dates with google dates + if (!task.task.isSaved() && actFmPreferenceService.isLoggedIn()) + titleMatchWithActFm(task.task); + if(task.task.isSaved()) { Task local = PluginServices.getTaskService().fetchById(task.task.getId(), Task.DUE_DATE, Task.COMPLETION_DATE); if (local == null) { @@ -321,6 +326,24 @@ public class GtasksSyncV2Provider extends SyncV2Provider { } } + private void titleMatchWithActFm(Task task) { + String title = task.getValue(Task.TITLE); + System.err.println("GTASKS Trying to match on title " + title); + TodorooCursor match = taskService.query(Query.select(Task.ID) + .join(Join.left(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), Metadata.TASK.eq(Task.ID)))) + .where(Criterion.and(Task.TITLE.eq(title), GtasksMetadata.ID.isNull()))); + try { + System.err.println("Found: " + match.getCount()); + if (match.getCount() > 0) { + match.moveToFirst(); + Task matchedTask = new Task(match); + task.setId(matchedTask.getId()); + } + } finally { + match.close(); + } + } + private void mergeDates(Task remote, Task local) { if(remote.hasDueDate() && local.hasDueTime()) { Date newDate = new Date(remote.getValue(Task.DUE_DATE)); From 15b54277897b0f32b128be07c98ba78b211d7bac Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 13 Jun 2012 16:18:33 -0700 Subject: [PATCH 04/12] Fixed bugs with title matching when syncing with gtasks second --- .../com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 148057204..4f22a14c8 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -135,13 +135,13 @@ public class GtasksSyncV2Provider extends SyncV2Provider { synchronizeListHelper(list, invoker, manual, handler, callback); callback.incrementProgress(25); if (finisher.decrementAndGet() == 0) { + pushUpdated(invoker, callback); finishSync(callback); } } }).start(); } - pushUpdated(invoker, callback); } }).start(); } From ba91659a3070a059a517abc7fd09ac88991ea6ff Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 13 Jun 2012 16:32:53 -0700 Subject: [PATCH 05/12] Use default importance for newly created gtasks --- .../com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 4f22a14c8..dd4612833 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -317,7 +317,9 @@ public class GtasksSyncV2Provider extends SyncV2Provider { if(task.task.isCompleted() && !local.isCompleted()) StatisticsService.reportEvent(StatisticsConstants.GTASKS_TASK_COMPLETED); } - } else { // Set default reminders for remotely created tasks + } else { // Set default importance and reminders for remotely created tasks + task.task.setValue(Task.IMPORTANCE, Preferences.getIntegerFromString( + R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); TaskDao.setDefaultReminders(task.task); } if (!TextUtils.isEmpty(task.task.getValue(Task.TITLE))) { From f0386709872be9332cf0676971acfddd40927cba Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 14 Jun 2012 12:25:20 -0700 Subject: [PATCH 06/12] Removed printlns --- .../com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index dd4612833..fae330443 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -330,12 +330,10 @@ public class GtasksSyncV2Provider extends SyncV2Provider { private void titleMatchWithActFm(Task task) { String title = task.getValue(Task.TITLE); - System.err.println("GTASKS Trying to match on title " + title); TodorooCursor match = taskService.query(Query.select(Task.ID) .join(Join.left(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), Metadata.TASK.eq(Task.ID)))) .where(Criterion.and(Task.TITLE.eq(title), GtasksMetadata.ID.isNull()))); try { - System.err.println("Found: " + match.getCount()); if (match.getCount() > 0) { match.moveToFirst(); Task matchedTask = new Task(match); From 54813cc00f2ff527fb58db3badf5ab0373acc37e Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 14 Jun 2012 16:09:28 -0700 Subject: [PATCH 07/12] Sync both services sequentially when manually syncing --- .../astrid/helper/SyncActionHelper.java | 58 +++++++++---------- .../todoroo/astrid/service/SyncV2Service.java | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java index f1fdc3d04..12c673471 100644 --- a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java +++ b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java @@ -9,7 +9,6 @@ import org.weloveastrid.rmilk.MilkUtilities; import android.app.Activity; import android.app.AlertDialog; -import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -20,7 +19,6 @@ import android.content.pm.ResolveInfo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.widget.ArrayAdapter; -import android.widget.Toast; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; @@ -231,33 +229,35 @@ public class SyncActionHelper { } else { // We have sync actions, pop up a dialogue so the user can // select just one of them (only sync one at a time) - final Object[] actions = new Object[activeSyncs]; - - int i; - for (i = 0; i < activeV2Providers.size(); i++) - actions[i] = activeV2Providers.get(i); - for (SyncAction syncAction : syncActions) - actions[i++] = syncAction; - - DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface click, int which) { - if (actions[which] instanceof SyncAction) { - try { - ((SyncAction) actions[which]).intent.send(); - Toast.makeText(activity, - R.string.SyP_progress_toast, - Toast.LENGTH_LONG).show(); - } catch (CanceledException e) { - // - } - } else { - ((SyncV2Provider) actions[which]).synchronizeActiveTasks( - true, syncResultCallback); - } - } - }; - showSyncOptionMenu(actions, listener); +// final Object[] actions = new Object[activeSyncs]; +// +// int i; +// for (i = 0; i < activeV2Providers.size(); i++) +// actions[i] = activeV2Providers.get(i); +// for (SyncAction syncAction : syncActions) +// actions[i++] = syncAction; +// +// DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface click, int which) { +// if (actions[which] instanceof SyncAction) { +// try { +// ((SyncAction) actions[which]).intent.send(); +// Toast.makeText(activity, +// R.string.SyP_progress_toast, +// Toast.LENGTH_LONG).show(); +// } catch (CanceledException e) { +// // +// } +// } else { +// ((SyncV2Provider) actions[which]).synchronizeActiveTasks( +// true, syncResultCallback); +// } +// } +// }; +// showSyncOptionMenu(actions, listener); + + syncService.synchronizeActiveTasks(true, syncResultCallback); } } diff --git a/astrid/src/com/todoroo/astrid/service/SyncV2Service.java b/astrid/src/com/todoroo/astrid/service/SyncV2Service.java index c06f5ae96..0265450f0 100644 --- a/astrid/src/com/todoroo/astrid/service/SyncV2Service.java +++ b/astrid/src/com/todoroo/astrid/service/SyncV2Service.java @@ -24,8 +24,8 @@ public class SyncV2Service { * for responding to sync requests through this new API. */ private static final SyncV2Provider[] providers = new SyncV2Provider[] { + GtasksSyncV2Provider.getInstance(), new ActFmSyncV2Provider(), - GtasksSyncV2Provider.getInstance() }; /** From 560cdd54242c60e9df504b75bc8b3862be5a2711 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 15 Jun 2012 11:03:31 -0700 Subject: [PATCH 08/12] Delete gtasks when they become not assigned to me --- api/src/com/todoroo/andlib/sql/Join.java | 7 +++++-- .../astrid/gtasks/sync/GtasksSyncService.java | 14 +++++++++++--- .../astrid/gtasks/sync/GtasksSyncV2Provider.java | 9 +++------ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/api/src/com/todoroo/andlib/sql/Join.java b/api/src/com/todoroo/andlib/sql/Join.java index ac8a479f2..b76011ab8 100644 --- a/api/src/com/todoroo/andlib/sql/Join.java +++ b/api/src/com/todoroo/andlib/sql/Join.java @@ -1,5 +1,6 @@ package com.todoroo.andlib.sql; +import static com.todoroo.andlib.sql.SqlConstants.AND; import static com.todoroo.andlib.sql.SqlConstants.JOIN; import static com.todoroo.andlib.sql.SqlConstants.ON; import static com.todoroo.andlib.sql.SqlConstants.SPACE; @@ -35,8 +36,10 @@ public class Join { public String toString() { StringBuilder sb = new StringBuilder(); sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); - for (Criterion criterion : criterions) { - sb.append(SPACE).append(criterion); + for (int i = 0; i < criterions.length; i++) { + sb.append(SPACE).append(criterions[i]); + if (i < criterions.length - 1) + sb.append(SPACE).append(AND); } return sb.toString(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java index 3be83c10d..cb62fcad2 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java @@ -108,9 +108,6 @@ public final class GtasksSyncService { return; Task toPush = taskDao.fetch(model.getId(), TASK_PROPERTIES); - if (toPush.getValue(Task.USER_ID) != Task.USER_ID_SELF) - return; - operationQueue.offer(new TaskPushOp(toPush)); } }); @@ -197,6 +194,17 @@ public final class GtasksSyncService { com.google.api.services.tasks.model.Task remoteModel = null; boolean newlyCreated = false; + if (values.containsKey(Task.USER_ID.name) && values.getAsLong(Task.USER_ID.name) != Task.USER_ID_SELF) { + if (gtasksMetadata != null && !TextUtils.isEmpty(gtasksMetadata.getValue(GtasksMetadata.ID))) { + try { + invoker.deleteGtask(gtasksMetadata.getValue(GtasksMetadata.LIST_ID), gtasksMetadata.getValue(GtasksMetadata.ID)); + } catch (IOException e) { + metadataDao.delete(gtasksMetadata.getId()); + } + } + return; + } + String remoteId = null; String listId = Preferences.getStringValue(GtasksPreferenceService.PREF_DEFAULT_LIST); if (listId == null) { diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index fae330443..8a6ec5490 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -148,12 +148,9 @@ public class GtasksSyncV2Provider extends SyncV2Provider { private synchronized void pushUpdated(GtasksInvoker invoker, SyncResultCallback callback) { TodorooCursor queued = taskService.query(Query.select(Task.PROPERTIES). - join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where( - Criterion.and(Task.USER_ID.eq(Task.USER_ID_SELF), - Criterion.or( - Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), - Task.MODIFICATION_DATE.gt(GtasksMetadata.LAST_SYNC)), - Metadata.KEY.isNull())))); + join(Join.left(Metadata.TABLE, Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), Task.ID.eq(Metadata.TASK)))).where( + Criterion.or(Task.MODIFICATION_DATE.gt(GtasksMetadata.LAST_SYNC), + Metadata.KEY.isNull()))); callback.incrementMax(queued.getCount() * 10); try { Task task = new Task(); From 316aee0320f1c6c0ec2fc08adf7be5694c4f8ad9 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 15 Jun 2012 11:38:28 -0700 Subject: [PATCH 09/12] Don't allow tasks not assigned to me to be on gtasks --- .../com/todoroo/astrid/gtasks/sync/GtasksSyncService.java | 5 +++-- .../com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java index cb62fcad2..6a2665816 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java @@ -151,7 +151,7 @@ public final class GtasksSyncService { } private static final Property[] TASK_PROPERTIES = { Task.ID, Task.TITLE, - Task.NOTES, Task.DUE_DATE, Task.COMPLETION_DATE, Task.DELETION_DATE }; + Task.NOTES, Task.DUE_DATE, Task.COMPLETION_DATE, Task.DELETION_DATE, Task.USER_ID }; /** * Checks to see if any of the values changed are among the properties we sync @@ -198,8 +198,9 @@ public final class GtasksSyncService { if (gtasksMetadata != null && !TextUtils.isEmpty(gtasksMetadata.getValue(GtasksMetadata.ID))) { try { invoker.deleteGtask(gtasksMetadata.getValue(GtasksMetadata.LIST_ID), gtasksMetadata.getValue(GtasksMetadata.ID)); - } catch (IOException e) { metadataDao.delete(gtasksMetadata.getId()); + } catch (IOException e) { + // } } return; diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 8a6ec5490..f60331727 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -150,6 +150,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider { TodorooCursor queued = taskService.query(Query.select(Task.PROPERTIES). join(Join.left(Metadata.TABLE, Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), Task.ID.eq(Metadata.TASK)))).where( Criterion.or(Task.MODIFICATION_DATE.gt(GtasksMetadata.LAST_SYNC), + Criterion.and(Task.USER_ID.neq(Task.USER_ID_SELF), GtasksMetadata.ID.isNotNull()), Metadata.KEY.isNull()))); callback.incrementMax(queued.getCount() * 10); try { From 1c22bf413d3c5b074532bc27c99e58ece707d82e Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 15 Jun 2012 12:51:32 -0700 Subject: [PATCH 10/12] Don't push to gtasks when receiving c2dm --- astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java b/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java index 2dc07e324..b3a7f7471 100644 --- a/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java +++ b/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java @@ -159,6 +159,7 @@ public class C2DMReceiver extends BroadcastReceiver { task.readFromCursor(cursor); } + task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); actFmSyncService.fetchTask(task); } catch(NumberFormatException e) { // invalid task id @@ -300,6 +301,7 @@ public class C2DMReceiver extends BroadcastReceiver { task.setValue(Task.TITLE, intent.getStringExtra("title")); task.setValue(Task.REMOTE_ID, Long.parseLong(intent.getStringExtra("task_id"))); task.setValue(Task.USER_ID, Task.USER_ID_UNASSIGNED); + task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true); taskService.save(task); From b0228ea1d70a850f3d26d48e1593f7896092cef1 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 15 Jun 2012 18:23:26 -0700 Subject: [PATCH 11/12] Cleaned up with Tim's suggestions --- api/src/com/todoroo/andlib/sql/Join.java | 6 ++-- .../astrid/actfm/sync/ActFmSyncService.java | 3 +- .../gtasks/sync/GtasksSyncV2Provider.java | 3 +- .../astrid/helper/SyncActionHelper.java | 30 ------------------- 4 files changed, 6 insertions(+), 36 deletions(-) diff --git a/api/src/com/todoroo/andlib/sql/Join.java b/api/src/com/todoroo/andlib/sql/Join.java index b76011ab8..50f68d0c9 100644 --- a/api/src/com/todoroo/andlib/sql/Join.java +++ b/api/src/com/todoroo/andlib/sql/Join.java @@ -33,14 +33,16 @@ public class Join { } @Override + @SuppressWarnings("nls") public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON); + sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON).append(SPACE).append("("); for (int i = 0; i < criterions.length; i++) { - sb.append(SPACE).append(criterions[i]); + sb.append(criterions[i]); if (i < criterions.length - 1) sb.append(SPACE).append(AND); } + sb.append(")"); return sb.toString(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java index bd6561739..f5b0060fe 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -1169,8 +1169,7 @@ public final class ActFmSyncService { try { if (match.getCount() > 0) { match.moveToFirst(); - Task matchedTitle = new Task(match); - remote.setId(matchedTitle.getId()); + remote.setId(match.get(Task.ID)); } } finally { match.close(); diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index f60331727..74d449679 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -334,8 +334,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider { try { if (match.getCount() > 0) { match.moveToFirst(); - Task matchedTask = new Task(match); - task.setId(matchedTask.getId()); + task.setId(match.get(Task.ID)); } } finally { match.close(); diff --git a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java index 12c673471..5e384738a 100644 --- a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java +++ b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java @@ -227,36 +227,6 @@ public class SyncActionHelper { showSyncOptionMenu(actions, listener); } else { - // We have sync actions, pop up a dialogue so the user can - // select just one of them (only sync one at a time) -// final Object[] actions = new Object[activeSyncs]; -// -// int i; -// for (i = 0; i < activeV2Providers.size(); i++) -// actions[i] = activeV2Providers.get(i); -// for (SyncAction syncAction : syncActions) -// actions[i++] = syncAction; -// -// DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { -// @Override -// public void onClick(DialogInterface click, int which) { -// if (actions[which] instanceof SyncAction) { -// try { -// ((SyncAction) actions[which]).intent.send(); -// Toast.makeText(activity, -// R.string.SyP_progress_toast, -// Toast.LENGTH_LONG).show(); -// } catch (CanceledException e) { -// // -// } -// } else { -// ((SyncV2Provider) actions[which]).synchronizeActiveTasks( -// true, syncResultCallback); -// } -// } -// }; -// showSyncOptionMenu(actions, listener); - syncService.synchronizeActiveTasks(true, syncResultCallback); } } From 66df75c4398798db7fe021c56ea81d574d0f261a Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 15 Jun 2012 18:24:47 -0700 Subject: [PATCH 12/12] Fixed a bug in the join string --- api/src/com/todoroo/andlib/sql/Join.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/com/todoroo/andlib/sql/Join.java b/api/src/com/todoroo/andlib/sql/Join.java index 50f68d0c9..dd2777ada 100644 --- a/api/src/com/todoroo/andlib/sql/Join.java +++ b/api/src/com/todoroo/andlib/sql/Join.java @@ -40,7 +40,7 @@ public class Join { for (int i = 0; i < criterions.length; i++) { sb.append(criterions[i]); if (i < criterions.length - 1) - sb.append(SPACE).append(AND); + sb.append(SPACE).append(AND).append(SPACE); } sb.append(")"); return sb.toString();