package org.commcare.tasks; import org.commcare.CommCareApplication; import org.commcare.resources.model.InstallCancelled; import org.commcare.resources.model.MissingMediaException; import org.commcare.resources.model.ResourceTable; import org.commcare.resources.model.TableStateListener; import org.commcare.tasks.templates.CommCareTask; import org.commcare.utils.AndroidCommCarePlatform; import org.javarosa.core.util.SizeBoundUniqueVector; import org.javarosa.core.util.SizeBoundVector; /** * This task is responsible for validating app's installed media * * @author ctsims */ public abstract class VerificationTask<Reciever> extends CommCareTask<Void, int[], SizeBoundVector<MissingMediaException>, Reciever> implements TableStateListener, InstallCancelled { public VerificationTask(int taskId) { this.taskId = taskId; } @Override protected SizeBoundVector<MissingMediaException> doTaskBackground(Void... params) { AndroidCommCarePlatform platform = CommCareApplication.instance().getCommCarePlatform(); // This is replicated in the application in a few places. ResourceTable global = platform.getGlobalResourceTable(); SizeBoundUniqueVector<MissingMediaException> problems = new SizeBoundUniqueVector<>(10); setTableListeners(global); global.verifyInstallation(problems); unsetTableListeners(global); if (problems.size() > 0) { return problems; } return null; } private void setTableListeners(ResourceTable table) { table.setStateListener(this); table.setInstallCancellationChecker(this); } private static void unsetTableListeners(ResourceTable table) { table.setInstallCancellationChecker(null); table.setStateListener(null); } @Override public void incrementProgress(int complete, int total) { this.publishProgress(new int[]{complete, total}); } @Override public void compoundResourceAdded(ResourceTable table) { } @Override public void simpleResourceAdded() { } @Override public boolean wasInstallCancelled() { return isCancelled(); } }