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
try {
AndroidUtilities.sleepDeep(1000L); AndroidUtilities.sleepDeep(1000L);
pushTaskOnSave(model, setValues); 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,9 +106,11 @@ 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) {
new Thread(new Runnable() {
public void run() {
callback.started(); callback.started();
callback.incrementMax(100); callback.incrementMax(100);
@ -118,10 +120,13 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
startTagFetcher(callback, finisher); startTagFetcher(callback, finisher);
actFmSyncService.waitUntilEmpty();
startTaskFetcher(manual, callback, finisher); startTaskFetcher(manual, callback, finisher);
callback.incrementProgress(50); callback.incrementProgress(50);
} }
}).start();
}
/** fetch changes to tags */ /** fetch changes to tags */
private void startTagFetcher(final SyncResultCallback callback, private void startTagFetcher(final SyncResultCallback callback,
@ -238,15 +243,17 @@ 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;
new Thread(new Runnable() {
public void run() {
callback.started(); callback.started();
callback.incrementMax(100); callback.incrementMax(100);
@ -255,12 +262,15 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
fetchTagData(tagData, noRemoteId, manual, callback, finisher); fetchTagData(tagData, noRemoteId, manual, callback, finisher);
if(!noRemoteId) { if(!noRemoteId) {
actFmSyncService.waitUntilEmpty();
fetchTasksForTag(tagData, manual, callback, finisher); fetchTasksForTag(tagData, manual, callback, finisher);
fetchUpdatesForTag(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,
final boolean manual, final SyncResultCallback callback, final boolean manual, final SyncResultCallback callback,

Loading…
Cancel
Save