package org.commcare.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;
import org.commcare.CommCareApplication;
import org.commcare.dalvik.R;
import org.commcare.preferences.CommCareServerPreferences;
import org.commcare.tasks.LogSubmissionTask;
import org.javarosa.core.model.instance.FormInstance;
import org.javarosa.core.model.instance.TreeReference;
import org.javarosa.core.services.storage.IStorageUtilityIndexed;
import org.javarosa.core.util.ArrayUtilities;
import org.javarosa.xpath.expr.XPathExpression;
import java.util.Vector;
/**
* Basically Copy+Paste code from CCJ2ME that needs to be unified or re-indexed to somewhere more reasonable.
*
* @author ctsims
*/
public class CommCareUtil {
public static FormInstance loadFixture(String refId, String userId) {
IStorageUtilityIndexed<FormInstance> userFixtureStorage = CommCareApplication.instance().getUserStorage("fixture", FormInstance.class);
IStorageUtilityIndexed<FormInstance> appFixtureStorage = CommCareApplication.instance().getAppStorage("fixture", FormInstance.class);
Vector<Integer> userFixtures = userFixtureStorage.getIDsForValue(FormInstance.META_ID, refId);
///... Nooooot so clean.
if (userFixtures.size() == 1) {
//easy case, one fixture, use it
return userFixtureStorage.read(userFixtures.elementAt(0));
//TODO: Userid check anyway?
} else if (userFixtures.size() > 1) {
//intersect userid and fixtureid set.
//TODO: Replace context call here with something from the session, need to stop relying on that coupling
Vector<Integer> relevantUserFixtures = userFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, userId);
if (relevantUserFixtures.size() != 0) {
Integer userFixture = ArrayUtilities.intersectSingle(userFixtures, relevantUserFixtures);
if (userFixture != null) {
return userFixtureStorage.read(userFixture);
}
}
}
//ok, so if we've gotten here there were no fixtures for the user, let's try the app fixtures.
Vector<Integer> appFixtures = appFixtureStorage.getIDsForValue(FormInstance.META_ID, refId);
Integer globalFixture = ArrayUtilities.intersectSingle(appFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, ""), appFixtures);
if (globalFixture != null) {
return appFixtureStorage.read(globalFixture);
} else {
//See if we have one manually placed in the suite
Integer userFixture = ArrayUtilities.intersectSingle(appFixtureStorage.getIDsForValue(FormInstance.META_XMLNS, userId), appFixtures);
if (userFixture != null) {
return appFixtureStorage.read(userFixture);
}
//Otherwise, nothing
return null;
}
}
/**
* Used around to count up the degree of specificity for this reference
*/
public static int countPreds(TreeReference reference) {
int preds = 0;
if (reference == null) {
return 0;
}
for (int i = 0; i < reference.size(); ++i) {
Vector<XPathExpression> predicates = reference.getPredicate(i);
if (predicates != null) {
preds += predicates.size();
}
}
return preds;
}
public static void triggerLogSubmission(Context c) {
String url = LogSubmissionTask.getSubmissionUrl(CommCareApplication.instance().getCurrentApp().getAppPreferences());
if (url == null) {
//This is mostly for dev purposes
Toast.makeText(c, "Couldn't submit logs! Invalid submission URL...", Toast.LENGTH_LONG).show();
} else {
LogSubmissionTask reportSubmitter =
new LogSubmissionTask(true,
CommCareApplication.instance().getSession().getListenerForSubmissionNotification(R.string.submission_logs_title),
url);
reportSubmitter.execute();
}
}
}