package org.commcare.engine.resource.installers;
import org.commcare.CommCareApp;
import org.commcare.activities.CommCareSetupActivity;
import org.commcare.engine.resource.AppInstallStatus;
import org.commcare.tasks.ResourceEngineTask;
/**
* Install CC app from the APK's asset directory
*
* @author Phillip Mates (pmates@dimagi.com).
*/
public class SingleAppInstallation {
public static final String SINGLE_APP_REFERENCE = "jr://asset/direct_install/profile.ccpr";
public static final String LOCAL_RESTORE_REFERENCE = "jr://asset/local_restore_payload.xml";
/**
* Install the app present in "assets/direct_install/", without offering
* any failure modes. Useful for installing an app automatically
* without prompting the user.
*/
public static void installSingleApp(CommCareSetupActivity activity, int dialogId) {
CommCareApp app = CommCareSetupActivity.getCommCareApp();
ResourceEngineTask<CommCareSetupActivity> task =
new ResourceEngineTask<CommCareSetupActivity>(app, dialogId, false) {
@Override
protected void deliverResult(CommCareSetupActivity receiver,
AppInstallStatus result) {
switch (result) {
case Installed:
receiver.reportSuccess(true);
break;
case DuplicateApp:
receiver.failWithNotification(AppInstallStatus.DuplicateApp);
break;
case UpdateStaged:
// this should never occur
receiver.reportSuccess(false);
break;
case UpToDate:
// this should never occur
receiver.reportSuccess(false);
break;
case MissingResourcesWithMessage:
// fall through to more general case:
case MissingResources:
receiver.failMissingResource(this.missingResourceException, result);
break;
case InvalidResource:
receiver.failInvalidResource(this.invalidResourceException, result);
break;
case IncompatibleReqs:
receiver.failBadReqs(badReqCode, vRequired, vAvailable, majorIsProblem);
break;
case UnknownFailure:
receiver.failWithNotification(AppInstallStatus.UnknownFailure);
break;
case NoLocalStorage:
receiver.failWithNotification(AppInstallStatus.NoLocalStorage);
break;
case NoConnection:
receiver.failWithNotification(AppInstallStatus.NoConnection);
break;
case BadCertificate:
receiver.failWithNotification(AppInstallStatus.BadCertificate);
break;
default:
receiver.failUnknown(AppInstallStatus.UnknownFailure);
break;
}
}
@Override
protected void deliverUpdate(CommCareSetupActivity receiver,
int[]... update) {
receiver.updateResourceProgress(update[0][0], update[0][1], update[0][2]);
}
@Override
protected void deliverError(CommCareSetupActivity receiver,
Exception e) {
receiver.failUnknown(AppInstallStatus.UnknownFailure);
}
};
task.connect(activity);
task.executeParallel(SINGLE_APP_REFERENCE);
}
}