From d3ec65837bcf0f6077e6864e2502cab671f042df Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 25 May 2012 15:57:24 -0700 Subject: [PATCH] Sync file metadata when processing task list (doesn't fetch the actual files yet) --- .../astrid/actfm/sync/ActFmSyncService.java | 49 +++++++++++++++++++ .../todoroo/astrid/files/FilesControlSet.java | 4 +- 2 files changed, 52 insertions(+), 1 deletion(-) 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 bdefb8f9b..f2578a054 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -4,6 +4,7 @@ package com.todoroo.astrid.actfm.sync; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -12,6 +13,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.apache.http.entity.mime.MultipartEntity; @@ -1011,6 +1013,7 @@ public final class ActFmSyncService { JsonHelper.taskFromJson(item, remote, metadata); + if(remote.getValue(Task.USER_ID) == 0) { if(!remote.isSaved()) StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_CREATED); @@ -1028,6 +1031,7 @@ public final class ActFmSyncService { taskService.save(remote); ids.add(remote.getId()); metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY)); + synchronizeAttachments(item, remote); remote.clear(); } @@ -1062,6 +1066,51 @@ public final class ActFmSyncService { return Task.class; } + private void synchronizeAttachments(JSONObject item, Task model) { + TodorooCursor attachments = metadataService.query(Query.select(Metadata.PROPERTIES) + .where(Criterion.and(MetadataCriteria.byTaskAndwithKey(model.getId(), + FileMetadata.METADATA_KEY), FileMetadata.REMOTE_ID.gt(0)))); + try { + HashMap currentFiles = new HashMap(); + for (attachments.moveToFirst(); !attachments.isAfterLast(); attachments.moveToNext()) { + Metadata m = new Metadata(attachments); + currentFiles.put(m.getValue(FileMetadata.REMOTE_ID), m); + } + + JSONArray remoteFiles = item.getJSONArray("attachments"); + for (int i = 0; i < remoteFiles.length(); i++) { + JSONObject file = remoteFiles.getJSONObject(i); + + long id = file.optLong("id"); + if (currentFiles.containsKey(id)) { + // Match, nothing to do + currentFiles.remove(id); + } else { + // Create new file attachment + Metadata newAttachment = FileMetadata.createNewFileMetadata(model.getId(), null, file.getString("content_type")); + newAttachment.setValue(FileMetadata.URL, file.getString("url")); + newAttachment.setValue(FileMetadata.REMOTE_ID, id); + metadataService.save(newAttachment); + } + } + + // Remove all the leftovers + Set attachmentsToDelete = currentFiles.keySet(); + for (Long remoteId : attachmentsToDelete) { + Metadata toDelete = currentFiles.get(remoteId); + File f = new File(toDelete.getValue(FileMetadata.FILE_PATH)); + if (f.delete()) { + metadataService.delete(toDelete); + } + } + + } catch (JSONException e) { + // Ignored + } finally { + attachments.close(); + } + } + } /** Call sync method */ diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java index 928d0cacc..40a03a829 100644 --- a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java @@ -24,6 +24,7 @@ import com.todoroo.aacenc.RecognizerApi; 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.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; @@ -75,7 +76,8 @@ public class FilesControlSet extends PopupControlSet { public void refreshMetadata() { TodorooCursor cursor = metadataService.query( Query.select(Metadata.PROPERTIES) - .where(MetadataCriteria.byTaskAndwithKey(model.getId(), FileMetadata.METADATA_KEY))); + .where(Criterion.and(MetadataCriteria.byTaskAndwithKey(model.getId(), FileMetadata.METADATA_KEY), + FileMetadata.FILE_PATH.isNotNull()))); try { files.clear(); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {