package org.commcare.logic; import android.widget.Toast; import org.commcare.CommCareApplication; import org.commcare.activities.FormRecordListActivity; import org.commcare.preferences.DeveloperPreferences; import org.commcare.tasks.DataPullTask; import org.commcare.tasks.FormRecordCleanupTask; import org.commcare.tasks.ResultAndError; import org.commcare.util.CommCarePlatform; import org.javarosa.core.model.User; import org.javarosa.core.services.locale.Localization; /** * Only used for developer debugging. * * Load saved form instances manually from a xml payload. * * @author Phillip Mates (pmates@dimagi.com). */ public class ArchivedFormRemoteRestore { public static final int CLEANUP_ID = 1; public static void pullArchivedFormsFromServer(String remoteUrl, final FormRecordListActivity activity, final CommCarePlatform platform) { User u = CommCareApplication.instance().getSession().getLoggedInUser(); // We should go digest auth this user on the server and see whether to pull them down. DataPullTask<FormRecordListActivity> pull = new DataPullTask<FormRecordListActivity>(u.getUsername(), u.getCachedPwd(), u.getUniqueId(), remoteUrl, activity) { @Override protected void deliverResult(FormRecordListActivity receiver, ResultAndError<PullTaskResult> statusAndErrorMessage) { PullTaskResult status = statusAndErrorMessage.data; switch (status) { case DOWNLOAD_SUCCESS: downloadForms(activity, platform); break; case UNKNOWN_FAILURE: Toast.makeText(receiver, "Failure retrieving or processing data, please try again later...", Toast.LENGTH_LONG).show(); break; case ACTIONABLE_FAILURE: Toast.makeText(receiver, statusAndErrorMessage.errorMessage, Toast.LENGTH_LONG).show(); break; case AUTH_FAILED: Toast.makeText(receiver, "Authentication failure. Please logout and resync with the server and try again.", Toast.LENGTH_LONG).show(); break; case BAD_DATA: case BAD_DATA_REQUIRES_INTERVENTION: Toast.makeText(receiver, "Bad data from server. Please talk with your supervisor.", Toast.LENGTH_LONG).show(); break; case CONNECTION_TIMEOUT: Toast.makeText(receiver, "The server took too long to generate a response. Please try again later, and ask your supervisor if the problem persists.", Toast.LENGTH_LONG).show(); break; case SERVER_ERROR: Toast.makeText(receiver, "The server had an error processing your data. Please try again later, and contact technical support if the problem persists.", Toast.LENGTH_LONG).show(); break; case UNREACHABLE_HOST: Toast.makeText(receiver, "Couldn't contact server, please check your network connection and try again.", Toast.LENGTH_LONG).show(); break; } } @Override protected void deliverUpdate(FormRecordListActivity receiver, Integer... update) { switch (update[0]) { case DataPullTask.PROGRESS_AUTHED: receiver.updateProgress("Authed with server, downloading forms" + (update[1] == 0 ? "" : " (" + update[1] + ")"), DataPullTask.DATA_PULL_TASK_ID); break; } } @Override protected void deliverError(FormRecordListActivity receiver, Exception e) { Toast.makeText(receiver, Localization.get("activity.task.error.generic", new String[]{e.getMessage()}), Toast.LENGTH_LONG).show(); } }; pull.connect(activity); pull.executeParallel(); } private static void downloadForms(FormRecordListActivity activity, CommCarePlatform platform) { FormRecordCleanupTask<FormRecordListActivity> task = new FormRecordCleanupTask<FormRecordListActivity>(activity, platform, CLEANUP_ID, DeveloperPreferences.formLoadPayloadStatus()) { @Override protected void deliverResult(FormRecordListActivity receiver, Integer result) { receiver.refreshView(); } @Override protected void deliverUpdate(FormRecordListActivity receiver, Integer... values) { if (values[0] < 0) { if (values[0] == FormRecordCleanupTask.STATUS_CLEANUP) { receiver.updateProgress("Forms Processed. " + "Cleaning up form records...", CLEANUP_ID); } } else { receiver.updateProgress("Forms downloaded. Processing " + values[0] + " of " + values[1] + "...", CLEANUP_ID); } } @Override protected void deliverError(FormRecordListActivity receiver, Exception e) { Toast.makeText(receiver, Localization.get("activity.task.error.generic", new String[]{e.getMessage()}), Toast.LENGTH_LONG).show(); } }; task.connect(activity); task.executeParallel(); } }