Merge remote-tracking branch 'sbosley/120329_sb_astrid_sync_fixes'

pull/14/head
Tim Su 13 years ago
commit 1576702202

@ -12,6 +12,7 @@ import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ByteArrayBody; import org.apache.http.entity.mime.content.ByteArrayBody;
@ -22,6 +23,7 @@ import org.json.JSONObject;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.ConditionVariable;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.TextUtils; import android.text.TextUtils;
@ -112,8 +114,10 @@ public final class ActFmSyncService {
} }
private final List<FailedPush> failedPushes = Collections.synchronizedList(new LinkedList<FailedPush>()); private final List<FailedPush> failedPushes = Collections.synchronizedList(new LinkedList<FailedPush>());
Thread pushRetryThread = null; private Thread pushRetryThread = null;
Runnable pushRetryRunnable; private Runnable pushRetryRunnable;
private final AtomicInteger taskPushThreads = new AtomicInteger(0);
private final ConditionVariable waitUntilEmpty = new ConditionVariable();
public void initialize() { public void initialize() {
initializeRetryRunnable(); initializeRetryRunnable();
@ -135,9 +139,17 @@ public final class ActFmSyncService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
waitUntilEmpty.close();
taskPushThreads.incrementAndGet();
// sleep so metadata associated with task is saved // sleep so metadata associated with task is saved
AndroidUtilities.sleepDeep(1000L); try {
pushTaskOnSave(model, setValues); AndroidUtilities.sleepDeep(1000L);
pushTaskOnSave(model, setValues);
} finally {
if (taskPushThreads.decrementAndGet() == 0) {
waitUntilEmpty.open();
}
}
} }
}).start(); }).start();
} }
@ -235,6 +247,10 @@ public final class ActFmSyncService {
} }
} }
public void waitUntilEmpty() {
waitUntilEmpty.block();
}
// --- data push methods // --- data push methods
/** /**

@ -106,21 +106,26 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
// --- synchronize active tasks // --- synchronize active tasks
@Override @Override
public void synchronizeActiveTasks(boolean manual, public void synchronizeActiveTasks(final boolean manual,
final SyncResultCallback callback) { final SyncResultCallback callback) {
callback.started(); new Thread(new Runnable() {
callback.incrementMax(100); public void run() {
callback.started();
callback.incrementMax(100);
final AtomicInteger finisher = new AtomicInteger(2); final AtomicInteger finisher = new AtomicInteger(2);
actFmPreferenceService.recordSyncStart(); actFmPreferenceService.recordSyncStart();
startTagFetcher(callback, finisher); startTagFetcher(callback, finisher);
startTaskFetcher(manual, callback, finisher); actFmSyncService.waitUntilEmpty();
startTaskFetcher(manual, callback, finisher);
callback.incrementProgress(50); callback.incrementProgress(50);
}
}).start();
} }
/** fetch changes to tags */ /** fetch changes to tags */
@ -238,28 +243,33 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
// --- synchronize list // --- synchronize list
@Override @Override
public void synchronizeList(Object list, boolean manual, public void synchronizeList(Object list, final boolean manual,
final SyncResultCallback callback) { final SyncResultCallback callback) {
if(!(list instanceof TagData)) if(!(list instanceof TagData))
return; return;
TagData tagData = (TagData) list; final TagData tagData = (TagData) list;
final boolean noRemoteId = tagData.getValue(TagData.REMOTE_ID) == 0; final boolean noRemoteId = tagData.getValue(TagData.REMOTE_ID) == 0;
callback.started(); new Thread(new Runnable() {
callback.incrementMax(100); public void run() {
callback.started();
callback.incrementMax(100);
final AtomicInteger finisher = new AtomicInteger(3); final AtomicInteger finisher = new AtomicInteger(3);
fetchTagData(tagData, noRemoteId, manual, callback, finisher); fetchTagData(tagData, noRemoteId, manual, callback, finisher);
if(!noRemoteId) { if(!noRemoteId) {
fetchTasksForTag(tagData, manual, callback, finisher); actFmSyncService.waitUntilEmpty();
fetchUpdatesForTag(tagData, manual, callback, finisher); fetchTasksForTag(tagData, manual, callback, finisher);
} fetchUpdatesForTag(tagData, manual, callback, finisher);
}
callback.incrementProgress(50); callback.incrementProgress(50);
}
}).start();
} }
private void fetchTagData(final TagData tagData, final boolean noRemoteId, private void fetchTagData(final TagData tagData, final boolean noRemoteId,

Loading…
Cancel
Save