Basic logic for syncing filter ordering

pull/14/head
Sam Bosley 13 years ago
parent 2ced210f91
commit df1fae5f70

@ -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<Long> tagOrderQueue = Collections.synchronizedList(new LinkedList<Long>());
private final List<Object> pushOrderQueue = Collections.synchronizedList(new LinkedList<Object>());
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<Object> params = new ArrayList<Object>();
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;

@ -44,31 +44,6 @@ public abstract class SubtasksUpdater<T> extends AstridOrderedListUpdater<T> {
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());
// }
// }
}

Loading…
Cancel
Save