package com.rapidftr.controllers; import com.rapidftr.controllers.internal.Controller; import com.rapidftr.controllers.internal.Dispatcher; import com.rapidftr.model.Child; import com.rapidftr.net.HttpBatchRequestHandler; import com.rapidftr.process.ChildSyncProcess; import com.rapidftr.process.FormSyncProcess; import com.rapidftr.process.Process; import com.rapidftr.process.SyncAllProcess; import com.rapidftr.screens.SyncScreen; import com.rapidftr.screens.internal.CustomScreen; import com.rapidftr.screens.internal.UiStack; import com.rapidftr.services.*; public class SyncController extends Controller implements ControllerCallback { private Process currentRunningProcess; final ChildSyncProcess childSyncProcess; final Process syncAllProcess; final Process formSyncProcess; protected HttpBatchRequestHandler requestHandler; private ScreenCallBack screenCallBack; public SyncController(CustomScreen screen, UiStack uiStack, ChildSyncService childSyncService, FormService formSyncService, Dispatcher dispatcher) { super(screen, uiStack, dispatcher); screen.setController(this); screenCallBack = (ScreenCallBack) screen; setUpRequestHandlerForService(formSyncService); setUpRequestHandlerForService(childSyncService); childSyncProcess = new ChildSyncProcess(childSyncService); syncAllProcess = new SyncAllProcess(childSyncService, formSyncService); formSyncProcess = new FormSyncProcess(formSyncService); } private void setUpRequestHandlerForService(RequestAwareService service) { requestHandler = service.getRequestHandler(); if (requestHandler != null) { ((RequestCallBackImpl) requestHandler.getRequestCallBack()) .setScreenCallback(screenCallBack); ((RequestCallBackImpl) requestHandler.getRequestCallBack()) .setControllerCallback(this); } } public void syncChildRecord(Child child) { childSyncProcess.setChild(child); setAndStartCurrentProcess(childSyncProcess); } public void synchronize() { setAndStartCurrentProcess(syncAllProcess); } public void synchronizeForms() { setAndStartCurrentProcess(formSyncProcess); } private void setAndStartCurrentProcess(Process process) { if (this.currentRunningProcess == null) { this.currentRunningProcess = process; ((SyncScreen) currentScreen).attachProcess(this.currentRunningProcess); if (process.isNotBackGround()) { show(); } this.currentRunningProcess.startProcess(); } else if (this.currentRunningProcess == process) { if (this.currentRunningProcess.isCanceled()) { this.currentRunningProcess.startProcess(); } if (process.isNotBackGround()) { show(); } } else { ((SyncScreen) currentScreen).showRunninngProcessAlert(); } } public void onProcessComplete(boolean status) { currentRunningProcess = null; } public void beforeProcessStart() { ((SyncScreen) currentScreen).onProcessStart(); } public void clearProcess() { currentRunningProcess.stopProcess(); currentRunningProcess = null; } }