package com.gettingmobile.google.reader.sync; import android.util.Log; import com.gettingmobile.rest.RequestProcessor; public final class Synchronizer { public static final String LOG_TAG = "goodnews.Synchronizer"; private final SyncSettings settings; private final CallbackHandler callbackHandler; private final PushSynchronizer pushSynchronizer; private final PullSynchronizer pullSynchronizer; public Synchronizer(SyncContext context) { settings = context.getSettings(); callbackHandler = new CallbackHandler(); pushSynchronizer = new PushSynchronizer(context); pullSynchronizer = new PullSynchronizer(context); } protected PushSynchronizer getPushSynchronizer() { return pushSynchronizer; } protected PullSynchronizer getPullSynchronizer() { return pullSynchronizer; } public void fullSync(SyncCallback callback) { if (!pullSynchronizer.isSyncing() && !pushSynchronizer.isSyncing()) { resetCancelled(); final SyncCallbackHelper c = new SimpleSyncCallbackHelper(callbackHandler, callback); try { c.setMaxProgress(pushSynchronizer.forecastMaxProgress() + pullSynchronizer.forecastMaxProgress()); final RequestProcessor requestProcessor = new RequestProcessor(); pushSynchronizer.sync(requestProcessor, c); pullSynchronizer.sync(requestProcessor, c); c.onSyncFinished(null); } catch (SyncException error) { Log.e(LOG_TAG, "Full sync failed", error); settings.updateLastFailedSyncTimestamp(); c.onSyncFinished(error); } catch (Throwable error) { Log.e(LOG_TAG, "Full sync failed", error); settings.updateLastFailedSyncTimestamp(); c.onSyncFinished(new SyncException(error)); } } } public void pushSync(SyncCallback callback) { if (!pullSynchronizer.isSyncing() && !pushSynchronizer.isSyncing()) { resetCancelled(); final SyncCallbackHelper c = new SimpleSyncCallbackHelper(callbackHandler, callback); try { c.setMaxProgress(pushSynchronizer.forecastMaxProgress()); final RequestProcessor requestProcessor = new RequestProcessor(); pushSynchronizer.sync(requestProcessor, c); c.onSyncFinished(null); } catch (SyncException error) { Log.e(LOG_TAG, "Push sync failed", error); settings.updateLastFailedSyncTimestamp(); c.onSyncFinished(error); } catch (Throwable error) { Log.e(LOG_TAG, "Push sync failed", error); settings.updateLastFailedSyncTimestamp(); c.onSyncFinished(new SyncException(error)); } } } public void cancel() { pullSynchronizer.cancel(); pushSynchronizer.cancel(); } private void resetCancelled() { pullSynchronizer.resetCancelled(); pushSynchronizer.resetCancelled(); } public boolean isPushRequired() { return pushSynchronizer.isPushRequired(); } }