diff --git a/app/src/org/commcare/tasks/EntityLoaderHelper.kt b/app/src/org/commcare/tasks/EntityLoaderHelper.kt new file mode 100644 index 0000000000..d1b048fff5 --- /dev/null +++ b/app/src/org/commcare/tasks/EntityLoaderHelper.kt @@ -0,0 +1,65 @@ +package org.commcare.tasks + +import android.util.Pair +import io.reactivex.functions.Cancellable +import org.commcare.activities.EntitySelectActivity +import org.commcare.cases.entity.AsyncNodeEntityFactory +import org.commcare.cases.entity.Entity +import org.commcare.cases.entity.EntityStorageCache +import org.commcare.cases.entity.NodeEntityFactory +import org.commcare.models.database.user.models.CommCareEntityStorageCache +import org.commcare.preferences.DeveloperPreferences +import org.commcare.suite.model.Detail +import org.javarosa.core.model.condition.EvaluationContext +import org.javarosa.core.model.instance.TreeReference + +class EntityLoaderHelper( + detail: Detail, + evalCtx: EvaluationContext +) : Cancellable { + + var focusTargetIndex: Int = -1 + private var stopLoading: Boolean = false + var factory: NodeEntityFactory + + init { + evalCtx.addFunctionHandler(EntitySelectActivity.getHereFunctionHandler()) + if (detail.useAsyncStrategy()) { + val entityStorageCache: EntityStorageCache = CommCareEntityStorageCache("case") + factory = AsyncNodeEntityFactory(detail, evalCtx, entityStorageCache) + } else { + factory = NodeEntityFactory(detail, evalCtx) + if (DeveloperPreferences.collectAndDisplayEntityTraces()) { + factory.activateDebugTraceOutput() + } + } + } + + fun loadEntities(nodeset: TreeReference): Pair>, List>? { + val references = factory.expandReferenceList(nodeset) + val full: MutableList> = ArrayList() + focusTargetIndex = -1 + var indexInFullList = 0 + for (ref in references) { + if (stopLoading) { + return null + } + val e = factory.getEntity(ref) + if (e != null) { + full.add(e) + if (e.shouldReceiveFocus()) { + focusTargetIndex = indexInFullList + } + indexInFullList++ + } + } + + factory.prepareEntities(full) + factory.printAndClearTraces("build") + return Pair>, List>(full, references) + } + + override fun cancel() { + stopLoading = true + } +} diff --git a/app/src/org/commcare/tasks/EntityLoaderTask.java b/app/src/org/commcare/tasks/EntityLoaderTask.java index 3bbaec7adf..2681b3783c 100644 --- a/app/src/org/commcare/tasks/EntityLoaderTask.java +++ b/app/src/org/commcare/tasks/EntityLoaderTask.java @@ -2,15 +2,9 @@ import android.util.Pair; -import org.commcare.activities.EntitySelectActivity; import org.commcare.android.logging.ForceCloseLogger; -import org.commcare.cases.entity.AsyncNodeEntityFactory; import org.commcare.cases.entity.Entity; -import org.commcare.cases.entity.EntityStorageCache; -import org.commcare.cases.entity.NodeEntityFactory; import org.commcare.logging.XPathErrorLogger; -import org.commcare.models.database.user.models.CommCareEntityStorageCache; -import org.commcare.preferences.DeveloperPreferences; import org.commcare.suite.model.Detail; import org.commcare.tasks.templates.ManagedAsyncTask; import org.javarosa.core.model.condition.EvaluationContext; @@ -18,7 +12,6 @@ import org.javarosa.core.services.Logger; import org.javarosa.xpath.XPathException; -import java.util.ArrayList; import java.util.List; /** @@ -30,53 +23,20 @@ public class EntityLoaderTask private final static Object lock = new Object(); private static EntityLoaderTask pendingTask = null; - private final NodeEntityFactory factory; private EntityLoaderListener listener; + private final EntityLoaderHelper entityLoaderHelper; private Exception mException = null; - private int focusTargetIndex; public EntityLoaderTask(Detail detail, EvaluationContext evalCtx) { - evalCtx.addFunctionHandler(EntitySelectActivity.getHereFunctionHandler()); - if (detail.useAsyncStrategy()) { - EntityStorageCache entityStorageCache = new CommCareEntityStorageCache("case"); - this.factory = new AsyncNodeEntityFactory(detail, evalCtx, entityStorageCache); - } else { - this.factory = new NodeEntityFactory(detail, evalCtx); - if (DeveloperPreferences.collectAndDisplayEntityTraces()) { - this.factory.activateDebugTraceOutput(); - } - } + entityLoaderHelper = new EntityLoaderHelper(detail, evalCtx); } @Override protected Pair>, List> doInBackground(TreeReference... nodeset) { try { - List references = factory.expandReferenceList(nodeset[0]); - - List> full = new ArrayList<>(); - focusTargetIndex = -1; - int indexInFullList = 0; - for (TreeReference ref : references) { - if (this.isCancelled()) { - return null; - } - - Entity e = factory.getEntity(ref); - if (e != null) { - full.add(e); - if (e.shouldReceiveFocus()) { - focusTargetIndex = indexInFullList; - } - indexInFullList++; - } - } - - factory.prepareEntities(full); - factory.printAndClearTraces("build"); - return new Pair<>(full, references); + return entityLoaderHelper.loadEntities(nodeset[0]); } catch (XPathException xe) { XPathErrorLogger.INSTANCE.logErrorToCurrentApp(xe); - xe.printStackTrace(); Logger.exception("Error during EntityLoaderTask: " + ForceCloseLogger.getStackTrace(xe), xe); mException = xe; return null; @@ -99,8 +59,8 @@ protected void onPostExecute(Pair>, List