package com.gettingmobile.goodnews.sync;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import com.gettingmobile.google.reader.sync.SyncCallback;
import com.gettingmobile.google.reader.sync.SyncContext;
import com.gettingmobile.google.reader.sync.Synchronizer;
final class SyncThread extends HandlerThread {
private final Object startEvent = new Object();
private final Synchronizer synchronizer;
private final SyncCallback callback;
private SyncThreadHandler syncThreadHandler = null;
public SyncThread(SyncContext context, SyncCallback callback) {
super(SyncThread.class.getName());
this.synchronizer = new Synchronizer(context);
this.callback = callback;
}
public Synchronizer getSynchronizer() {
return synchronizer;
}
/*
* life cycle management
*/
@Override
public void start() {
synchronized (startEvent) {
super.start();
try {
startEvent.wait();
} catch (InterruptedException ex) {
// ignore
}
}
}
@Override
protected void onLooperPrepared() {
syncThreadHandler = new SyncThreadHandler();
synchronized (startEvent) {
startEvent.notifyAll();
}
/*
* decrease priority to provide more time to the UI thread.
*/
setPriority(NORM_PRIORITY - 1);
super.onLooperPrepared();
}
public void shutdown() {
final Looper l = getLooper();
if (l != null) {
l.quit();
}
}
/*
* public interface
*/
public void startFullSync() {
syncThreadHandler.sendStartFullSync();
}
public void startPushSync() {
syncThreadHandler.sendStartPushSync();
}
/*
* logic
*/
private void doFullSync() {
synchronizer.fullSync(callback);
}
private void doPushSync() {
synchronizer.pushSync(callback);
}
/*
* inner classes
*/
final class SyncThreadHandler extends Handler {
private static final int MSG_FULL_SYNC = 1;
private static final int MSG_PUSH_SYNC = 2;
public void sendStartFullSync() {
sendMessage(obtainMessage(MSG_FULL_SYNC));
}
public void sendStartPushSync() {
sendMessage(obtainMessage(MSG_PUSH_SYNC));
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FULL_SYNC:
doFullSync();
break;
case MSG_PUSH_SYNC:
doPushSync();
break;
}
super.handleMessage(msg);
}
}
}