|
|
|
|
@ -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;
|
|
|
|
|
|