From df1fae5f70abff2c93b56bfabea3546c3843c070 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 5 Dec 2012 15:37:07 -0800 Subject: [PATCH] Basic logic for syncing filter ordering --- .../astrid/actfm/sync/ActFmSyncService.java | 81 ++++++++++++++----- .../astrid/subtasks/SubtasksUpdater.java | 25 ------ 2 files changed, 63 insertions(+), 43 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 81844b58d..0dfc94744 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -132,9 +132,9 @@ public final class ActFmSyncService { private Thread pushRetryThread = null; private Runnable pushRetryRunnable; - private Thread pushTagOrder = null; + private Thread pushOrderThread = null; private Runnable pushTagOrderRunnable; - private final List tagOrderQueue = Collections.synchronizedList(new LinkedList()); + private final List pushOrderQueue = Collections.synchronizedList(new LinkedList()); private final AtomicInteger taskPushThreads = new AtomicInteger(0); private final ConditionVariable waitUntilEmpty = new ConditionVariable(true); @@ -264,19 +264,25 @@ public final class ActFmSyncService { @Override public void run() { while (true) { - if(tagOrderQueue.isEmpty()) { + if(pushOrderQueue.isEmpty()) { synchronized(ActFmSyncService.this) { - pushTagOrder = null; + pushOrderThread = null; return; } } - if (tagOrderQueue.size() > 0) { + if (pushOrderQueue.size() > 0) { AndroidUtilities.sleepDeep(WAIT_BEFORE_PUSH_ORDER); try { - Long tagDataId = tagOrderQueue.remove(0); - TagData td = tagDataService.fetchById(tagDataId, TagData.ID, TagData.REMOTE_ID, TagData.TAG_ORDERING); - if (td != null) { - pushTagOrdering(td); + Object id = pushOrderQueue.remove(0); + if (id instanceof Long) { + Long tagDataId = (Long) id; + TagData td = tagDataService.fetchById(tagDataId, TagData.ID, TagData.REMOTE_ID, TagData.TAG_ORDERING); + if (td != null) { + pushTagOrdering(td); + } + } else if (id instanceof String) { + String filterId = (String) id; + pushFilterOrdering(filterId); } } catch (IndexOutOfBoundsException e) { // In case element was removed @@ -585,28 +591,44 @@ public final class ActFmSyncService { pushUpdateOnSave(update, update.getMergedValues(), imageData); } + //----------------- Push ordering public void pushTagOrderingOnSave(long tagDataId) { - if (!tagOrderQueue.contains(tagDataId)) { - tagOrderQueue.add(tagDataId); + pushOrderingOnSave(tagDataId); + } + + public void pushFilterOrderingOnSave(String filterId) { + pushOrderingOnSave(filterId); + } + + private void pushOrderingOnSave(Object id) { + if (!pushOrderQueue.contains(id)) { + pushOrderQueue.add(id); synchronized(this) { - if(pushTagOrder == null) { - pushTagOrder = new Thread(pushTagOrderRunnable); - pushTagOrder.start(); + if(pushOrderThread == null) { + pushOrderThread = new Thread(pushTagOrderRunnable); + pushOrderThread.start(); } } } } public void pushTagOrderingImmediately(TagData tagData) { - if (tagOrderQueue.contains(tagData.getId())) { - tagOrderQueue.remove(tagData.getId()); + if (pushOrderQueue.contains(tagData.getId())) { + pushOrderQueue.remove(tagData.getId()); } pushTagOrdering(tagData); } + public void pushFilterOrderingImmediately(String filterId) { + if (pushOrderQueue.contains(filterId)) { + pushOrderQueue.remove(filterId); + } + pushFilterOrdering(filterId); + } + public boolean cancelTagOrderingPush(long tagDataId) { - if (tagOrderQueue.contains(tagDataId)) { - tagOrderQueue.remove(tagDataId); + if (pushOrderQueue.contains(tagDataId)) { + pushOrderQueue.remove(tagDataId); return true; } return false; @@ -637,6 +659,29 @@ public final class ActFmSyncService { } } + private void pushFilterOrdering(String filterId) { + if (!checkForToken()) + return; + + // Make sure that all tasks are pushed before attempting to sync filter ordering + waitUntilEmpty(); + + ArrayList params = new ArrayList(); + String order = Preferences.getStringValue(filterId); + if (order == null || "null".equals(order)) + order = "[]"; + + params.add("filter_id"); params.add(filterId); + params.add("order"); params.add(order); + params.add("token"); params.add(token); + + try { + actFmInvoker.invoke("filter_order_save", params.toArray(new Object[params.size()])); + } catch (IOException e) { + handleException("push-filter-order", e); + } + } + public void fetchTagOrder(TagData tagData) { if (!checkForToken()) return; diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java index 6c070f93e..5d8e40035 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java @@ -44,31 +44,6 @@ public abstract class SubtasksUpdater extends AstridOrderedListUpdater { filter.setFilterQueryOverride(query); } -// @Override -// protected String getSerializedTree(TagData list, Filter filter) { -// String order; -// if (list == null) { -// order = Preferences.getStringValue(ACTIVE_TASKS_ORDER); -// } else { -// order = list.getValue(TagData.TAG_ORDERING); -// } -// if (order == null || "null".equals(order)) //$NON-NLS-1$ -// order = "[]"; //$NON-NLS-1$ -// -// return order; -// } -// -// @Override -// protected void writeSerialization(TagData list, String serialized) { -// if (list == null) { -// Preferences.setString(ACTIVE_TASKS_ORDER, serialized); -// } else { -// list.setValue(TagData.TAG_ORDERING, serialized); -// tagDataService.save(list); -// actFmSyncService.pushTagOrderingOnSave(list.getId()); -// } -// } - }