package org.commcare.android.tasks;
import org.commcare.android.util.AndroidCommCarePlatform;
import org.commcare.android.util.SessionUnavailableException;
import org.commcare.dalvik.activities.CommCareVerificationActivity;
import org.commcare.dalvik.application.CommCareApplication;
import org.commcare.resources.model.MissingMediaException;
import org.commcare.resources.model.Resource;
import org.commcare.resources.model.ResourceTable;
import org.commcare.resources.model.TableStateListener;
import org.javarosa.core.util.SizeBoundUniqueVector;
import org.javarosa.core.util.SizeBoundVector;
import android.content.Context;
import android.os.AsyncTask;
/**
* This task is responsible for
*
* @author ctsims
*
*/
public class VerificationTask extends AsyncTask<String, int[], SizeBoundVector<MissingMediaException>> implements TableStateListener {
VerificationTaskListener listener;
Context c;
public static final int PHASE_CHECKING = 0;
public static final int PHASE_DOWNLOAD = 1;
public static final int PHASE_COMMIT = 2;
Resource missingResource = null;
int badReqCode = -1;
private int phase = -1;
//Results passed by inherited AsyncTask functions to determine exit behavior
public static final int STATUS_VERIFY_SUCCESS = 0;
public static final int STATUS_VERIFY_FAIL = 1;
public static final int STATUS_FAIL_UNKNOWN = 2;
public VerificationTask(Context c) throws SessionUnavailableException{
this.c = c;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
protected SizeBoundVector<MissingMediaException> doInBackground(String... profileRefs) {
AndroidCommCarePlatform platform = CommCareApplication._().getCommCarePlatform();
try {
//This is replicated in the application in a few places.
ResourceTable global = platform.getGlobalResourceTable();
SizeBoundUniqueVector<MissingMediaException> problems = new SizeBoundUniqueVector<MissingMediaException>(10);
global.setStateListener(this);
global.verifyInstallation(problems);
if(problems.size()>0){
return problems;
}
return null;
}
catch(Exception e) {
// to-do: make non-resource missing failures have a better exception
return null;
}
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onProgressUpdate(Progress[])
*/
@Override
protected void onProgressUpdate(int[]... values) {
super.onProgressUpdate(values);
if(listener != null) {
((CommCareVerificationActivity)listener).updateVerifyProgress(values[0][0], values[0][1]);
}
}
public void setListener(VerificationTaskListener listener) {
this.listener = listener;
}
/*
* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(SizeBoundVector<MissingMediaException> problems) {
if(problems == null){
listener.success();
}
else if(listener != null) {
if(problems.size() == 0){
listener.success();
} else if(problems.size() > 0){
listener.onFinished(problems);
} else{
listener.failUnknown();
}
}
listener = null;
c = null;
}
public void incrementProgress(int complete, int total) {
this.publishProgress(new int[] {complete, total});
}
/*
* (non-Javadoc)
* @see org.commcare.resources.model.TableStateListener#resourceStateUpdated(org.commcare.resources.model.ResourceTable)
*/
@Override
public void resourceStateUpdated(ResourceTable table) {
// TODO Auto-generated method stub
}
}