diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevBackgroundService.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevBackgroundService.java index 667d425d2..0d1a64bad 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevBackgroundService.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevBackgroundService.java @@ -8,11 +8,13 @@ import android.content.Intent; import android.os.IBinder; import android.util.Log; +import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider; +import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Preferences; /** @@ -54,7 +56,9 @@ public class ProducteevBackgroundService extends Service { return; PluginServices.getTaskService(); + FlurryAgent.onStartSession(context, Constants.FLURRY_KEY); new ProducteevSyncProvider().synchronize(context); + FlurryAgent.onEndSession(context); } // --- alarm management diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java index 1d952d277..dc7cbd2a9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java @@ -188,7 +188,7 @@ public class ProducteevControlSet implements TaskEditControlSet { else metadata.setValue(ProducteevTask.RESPONSIBLE_ID, responsibleUser.getId()); - if(metadata.getSetValues().size() > 0 ) { + if(metadata.getSetValues().size() > 0) { metadataService.save(metadata); task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java index f75edd9ce..d7d8899bd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevInvoker.java @@ -2,13 +2,12 @@ package com.todoroo.astrid.producteev.api; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.math.BigInteger; import java.net.URLEncoder; -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.TreeMap; +import org.apache.commons.codec.digest.DigestUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -509,8 +508,7 @@ public class ProducteevInvoker { } sigBuilder.append(apiSecret); - byte[] digest = MessageDigest.getInstance("MD5").digest(sigBuilder.toString().getBytes("UTF-8")); - String signature = String.format("%1$032X", new BigInteger(1, digest).toString(16)); + String signature = DigestUtils.md5Hex(sigBuilder.toString()); requestBuilder.append("api_sig").append('=').append(signature); return requestBuilder.toString(); } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java index 32a2518df..f089b0c4d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java @@ -20,17 +20,17 @@ import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; -import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.dao.StoreObjectDao; -import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria; +import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.StoreObject; import com.todoroo.astrid.model.Task; import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.rmilk.data.MilkNote; +import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.tags.TagService; public final class ProducteevDataService { @@ -58,7 +58,7 @@ public final class ProducteevDataService { private TaskDao taskDao; @Autowired - private MetadataDao metadataDao; + private MetadataService metadataService; @Autowired private StoreObjectDao storeObjectDao; @@ -75,11 +75,11 @@ public final class ProducteevDataService { // --- task and metadata methods /** - * Clears RTM metadata information. Used when user logs out of RTM + * Clears metadata information. Used when user logs out of service */ public void clearMetadata() { - metadataDao.deleteWhere(Metadata.KEY.eq(ProducteevTask.METADATA_KEY)); - metadataDao.deleteWhere(Metadata.KEY.eq(ProducteevNote.METADATA_KEY)); + metadataService.deleteWhere(Metadata.KEY.eq(ProducteevTask.METADATA_KEY)); + metadataService.deleteWhere(Metadata.KEY.eq(ProducteevNote.METADATA_KEY)); storeObjectDao.deleteWhere(StoreObject.TYPE.eq(ProducteevDashboard.TYPE)); } @@ -140,16 +140,11 @@ public final class ProducteevDataService { public void saveTaskAndMetadata(ProducteevTaskContainer task) { taskDao.save(task.task, true); - metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(task.task.getId()), + task.metadata.add(task.pdvTask); + metadataService.synchronizeMetadata(task.task.getId(), task.metadata, Criterion.or(MetadataCriteria.withKey(ProducteevTask.METADATA_KEY), MetadataCriteria.withKey(ProducteevNote.METADATA_KEY), - MetadataCriteria.withKey(TagService.KEY)))); - task.metadata.add(task.pdvTask); - task.pdvTask.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); - for(Metadata metadata : task.metadata) { - metadata.setValue(Metadata.TASK, task.task.getId()); - metadataDao.persist(metadata); - } + MetadataCriteria.withKey(TagService.KEY))); } /** @@ -162,7 +157,7 @@ public final class ProducteevDataService { // read tags, notes, etc ArrayList metadata = new ArrayList(); - TodorooCursor metadataCursor = metadataDao.query(Query.select(Metadata.PROPERTIES). + TodorooCursor metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES). where(Criterion.and(MetadataCriteria.byTask(task.getId()), Criterion.or(MetadataCriteria.withKey(TagService.KEY), MetadataCriteria.withKey(ProducteevTask.METADATA_KEY), @@ -184,7 +179,7 @@ public final class ProducteevDataService { * @return null if no metadata found */ public Metadata getTaskMetadata(long taskId) { - TodorooCursor cursor = metadataDao.query(Query.select( + TodorooCursor cursor = metadataService.query(Query.select( Metadata.PROPERTIES).where( MetadataCriteria.byTaskAndwithKey(taskId, ProducteevTask.METADATA_KEY))); try { @@ -201,7 +196,7 @@ public final class ProducteevDataService { * Reads task notes out of a task */ public TodorooCursor getTaskNotesCursor(long taskId) { - TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES). + TodorooCursor cursor = metadataService.query(Query.select(Metadata.PROPERTIES). where(MetadataCriteria.byTaskAndwithKey(taskId, ProducteevNote.METADATA_KEY))); return cursor; } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java index 7d7330780..29dbdcd12 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevSyncProvider.java @@ -203,8 +203,6 @@ public class ProducteevSyncProvider extends SyncProvider metadata, + Criterion metadataCriterion) { + HashSet newMetadataValues = new HashSet(); + for(Metadata metadatum : metadata) { + metadatum.setValue(Metadata.TASK, taskId); + metadatum.clearValue(Metadata.ID); + newMetadataValues.add(metadatum.getMergedValues()); + } + + Metadata item = new Metadata(); + TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where(Criterion.and(MetadataCriteria.byTask(taskId), + metadataCriterion))); + try { + // try to find matches within our metadata list + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + item.readFromCursor(cursor); + long id = item.getId(); + + // clear item id when matching with incoming values + item.clearValue(Metadata.ID); + ContentValues itemMergedValues = item.getMergedValues(); + if(newMetadataValues.contains(itemMergedValues)) { + newMetadataValues.remove(itemMergedValues); + continue; + } + + // not matched. cut it + metadataDao.delete(id); + } + } finally { + cursor.close(); + } + + // everything that remains shall be written + for(ContentValues values : newMetadataValues) { + item.clear(); + item.mergeWith(values); + metadataDao.persist(item); + } + } }