diff --git a/collect_app/src/androidTest/java/org/odk/collect/android/feature/formentry/EntityFormTest.kt b/collect_app/src/androidTest/java/org/odk/collect/android/feature/formentry/EntityFormTest.kt index 74db93e4147..de890aa9ab1 100644 --- a/collect_app/src/androidTest/java/org/odk/collect/android/feature/formentry/EntityFormTest.kt +++ b/collect_app/src/androidTest/java/org/odk/collect/android/feature/formentry/EntityFormTest.kt @@ -8,6 +8,7 @@ import org.junit.Test import org.junit.rules.RuleChain import org.junit.runner.RunWith import org.odk.collect.android.support.StubOpenRosaServer.EntityListItem +import org.odk.collect.android.support.StubOpenRosaServer.MediaFileItem import org.odk.collect.android.support.TestDependencies import org.odk.collect.android.support.pages.FormEntryPage import org.odk.collect.android.support.pages.MainMenuPage @@ -389,4 +390,17 @@ class EntityFormTest { .assertText("Romulus Roy") .assertTextDoesNotExist("Roman Roy") } + + @Test // https://github.com/getodk/collect/issues/6425 + fun nonEntityFormWithCsvMatchingEntityList_usesCsvChoices() { + testDependencies.server.addForm("one-question-entity-registration.xml", listOf(EntityListItem("people.csv"))) + testDependencies.server.addForm("select-one-person.xml", listOf(MediaFileItem("people.csv"))) + + rule.withProject(testDependencies.server.url, matchExactly = true) + .startBlankForm("One Question Entity Registration") + .fillOutAndFinalize(FormEntryPage.QuestionAndAnswer("Name", "Logan Roy")) + .startBlankForm("Select one person") + .assertText("Roman Roy") + .assertTextDoesNotExist("Logan Roy") + } } diff --git a/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt b/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt index f9098527579..83a3e698cfa 100644 --- a/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt +++ b/collect_app/src/main/java/org/odk/collect/android/application/initialization/ApplicationInitializer.kt @@ -9,6 +9,7 @@ import org.odk.collect.android.BuildConfig import org.odk.collect.android.application.Collect import org.odk.collect.android.application.initialization.upgrade.UpgradeInitializer import org.odk.collect.android.entities.EntitiesRepositoryProvider +import org.odk.collect.android.formentry.FormSessionRepository import org.odk.collect.android.projects.ProjectsDataService import org.odk.collect.androidshared.ui.ToastUtils import org.odk.collect.async.Scheduler @@ -29,6 +30,7 @@ class ApplicationInitializer( private val analyticsInitializer: AnalyticsInitializer, private val mapsInitializer: MapsInitializer, private val projectsRepository: ProjectsRepository, + private val formSessionRepository: FormSessionRepository, private val settingsProvider: SettingsProvider, private val entitiesRepositoryProvider: EntitiesRepositoryProvider, private val projectsDataService: ProjectsDataService, @@ -55,7 +57,7 @@ class ApplicationInitializer( formsRepositoryProvider ).initialize() mapsInitializer.initialize() - JavaRosaInitializer(propertyManager, projectsDataService, entitiesRepositoryProvider, settingsProvider).initialize() + JavaRosaInitializer(propertyManager, projectsDataService, entitiesRepositoryProvider, formSessionRepository).initialize() SystemThemeMismatchFixInitializer(context).initialize() } diff --git a/collect_app/src/main/java/org/odk/collect/android/application/initialization/JavaRosaInitializer.kt b/collect_app/src/main/java/org/odk/collect/android/application/initialization/JavaRosaInitializer.kt index 0fd0346311f..4c72fc9293b 100644 --- a/collect_app/src/main/java/org/odk/collect/android/application/initialization/JavaRosaInitializer.kt +++ b/collect_app/src/main/java/org/odk/collect/android/application/initialization/JavaRosaInitializer.kt @@ -8,6 +8,7 @@ import org.javarosa.xform.parse.XFormParser import org.javarosa.xform.parse.XFormParserFactory import org.javarosa.xform.util.XFormUtils import org.odk.collect.android.dynamicpreload.DynamicPreloadXFormParserFactory +import org.odk.collect.android.formentry.FormSessionRepository import org.odk.collect.android.logic.actions.setgeopoint.CollectSetGeopointActionHandler import org.odk.collect.android.projects.ProjectsDataService import org.odk.collect.entities.javarosa.intance.LocalEntitiesExternalInstanceParserFactory @@ -15,13 +16,12 @@ import org.odk.collect.entities.javarosa.parse.EntityXFormParserFactory import org.odk.collect.entities.storage.EntitiesRepository import org.odk.collect.metadata.PropertyManager import org.odk.collect.projects.ProjectDependencyFactory -import org.odk.collect.settings.SettingsProvider class JavaRosaInitializer( private val propertyManager: PropertyManager, private val projectsDataService: ProjectsDataService, private val entitiesRepositoryProvider: ProjectDependencyFactory, - private val settingsProvider: SettingsProvider + private val formSessionRepository: FormSessionRepository ) { fun initialize() { @@ -53,7 +53,7 @@ class JavaRosaInitializer( val localEntitiesExternalInstanceParserFactory = LocalEntitiesExternalInstanceParserFactory( { entitiesRepositoryProvider.create(projectsDataService.requireCurrentProject().uuid) }, - { true } + { formSessionRepository.currentForm!!.usesEntities() } ) XFormUtils.setExternalInstanceParserFactory(localEntitiesExternalInstanceParserFactory) diff --git a/collect_app/src/main/java/org/odk/collect/android/external/FormUriActivity.kt b/collect_app/src/main/java/org/odk/collect/android/external/FormUriActivity.kt index e6f4ee52542..ff22b00f75c 100644 --- a/collect_app/src/main/java/org/odk/collect/android/external/FormUriActivity.kt +++ b/collect_app/src/main/java/org/odk/collect/android/external/FormUriActivity.kt @@ -18,6 +18,7 @@ import org.odk.collect.android.R import org.odk.collect.android.activities.FormFillingActivity import org.odk.collect.android.analytics.AnalyticsEvents import org.odk.collect.android.formentry.FormOpeningMode +import org.odk.collect.android.formentry.FormSessionRepository import org.odk.collect.android.injection.DaggerUtils import org.odk.collect.android.instancemanagement.InstanceDeleter import org.odk.collect.android.instancemanagement.canBeEdited @@ -71,6 +72,9 @@ class FormUriActivity : LocalizedActivity() { @Inject lateinit var changeLockProvider: ChangeLockProvider + @Inject + lateinit var formSessionRepository: FormSessionRepository + private var formFillingAlreadyStarted = false private val openForm = @@ -93,7 +97,8 @@ class FormUriActivity : LocalizedActivity() { settingsProvider, savepointsRepositoryProvider, changeLockProvider, - resources + resources, + formSessionRepository ) as T } } @@ -180,7 +185,8 @@ private class FormUriViewModel( private val settingsProvider: SettingsProvider, private val savepointsRepositoryProvider: SavepointsRepositoryProvider, private val changeLockProvider: ChangeLockProvider, - private val resources: Resources + private val resources: Resources, + private val formSessionRepository: FormSessionRepository ) : ViewModel() { private val uri: Uri? = intent.data @@ -336,6 +342,8 @@ private class FormUriViewModel( formsRepositoryProvider.create().getAllByFormIdAndVersion(instance.formId, instance.formVersion).first() } + formSessionRepository.currentForm = form + if (form.usesEntities()) { val formsLock = changeLockProvider.create(projectId).formsLock val isLocAcquired = formsLock.tryLock(FORM_ENTRY_TOKEN) diff --git a/collect_app/src/main/java/org/odk/collect/android/formentry/FormSessionRepository.kt b/collect_app/src/main/java/org/odk/collect/android/formentry/FormSessionRepository.kt index 4a2db0acf60..29b84aaa116 100644 --- a/collect_app/src/main/java/org/odk/collect/android/formentry/FormSessionRepository.kt +++ b/collect_app/src/main/java/org/odk/collect/android/formentry/FormSessionRepository.kt @@ -10,6 +10,8 @@ import org.odk.collect.forms.instances.Instance import org.odk.collect.shared.strings.UUIDGenerator interface FormSessionRepository { + var currentForm: Form? + fun create(): String fun get(id: String): LiveData fun clear(id: String) @@ -24,6 +26,7 @@ interface FormSessionRepository { } class AppStateFormSessionRepository(application: Application) : FormSessionRepository { + override var currentForm: Form? = null private val appState = application.getState() diff --git a/collect_app/src/main/java/org/odk/collect/android/injection/config/AppDependencyModule.java b/collect_app/src/main/java/org/odk/collect/android/injection/config/AppDependencyModule.java index 63c633458bb..1126f074c92 100644 --- a/collect_app/src/main/java/org/odk/collect/android/injection/config/AppDependencyModule.java +++ b/collect_app/src/main/java/org/odk/collect/android/injection/config/AppDependencyModule.java @@ -385,6 +385,7 @@ public ExternalAppIntentProvider providesExternalAppIntentProvider() { } @Provides + @Singleton public FormSessionRepository providesFormSessionStore(Application application) { return new AppStateFormSessionRepository(application); } @@ -531,8 +532,8 @@ public UpgradeInitializer providesUpgradeInitializer(Context context, SettingsPr } @Provides - public ApplicationInitializer providesApplicationInitializer(Application context, PropertyManager propertyManager, Analytics analytics, UpgradeInitializer upgradeInitializer, AnalyticsInitializer analyticsInitializer, ProjectsRepository projectsRepository, SettingsProvider settingsProvider, MapsInitializer mapsInitializer, EntitiesRepositoryProvider entitiesRepositoryProvider, ProjectsDataService projectsDataService, Scheduler scheduler, InstancesRepositoryProvider instancesRepositoryProvider, FormsRepositoryProvider formsRepositoryProvider) { - return new ApplicationInitializer(context, propertyManager, analytics, upgradeInitializer, analyticsInitializer, mapsInitializer, projectsRepository, settingsProvider, entitiesRepositoryProvider, projectsDataService, scheduler, instancesRepositoryProvider, formsRepositoryProvider); + public ApplicationInitializer providesApplicationInitializer(Application context, PropertyManager propertyManager, Analytics analytics, UpgradeInitializer upgradeInitializer, AnalyticsInitializer analyticsInitializer, ProjectsRepository projectsRepository, FormSessionRepository formSessionRepository, SettingsProvider settingsProvider, MapsInitializer mapsInitializer, EntitiesRepositoryProvider entitiesRepositoryProvider, ProjectsDataService projectsDataService, Scheduler scheduler, InstancesRepositoryProvider instancesRepositoryProvider, FormsRepositoryProvider formsRepositoryProvider) { + return new ApplicationInitializer(context, propertyManager, analytics, upgradeInitializer, analyticsInitializer, mapsInitializer, projectsRepository, formSessionRepository, settingsProvider, entitiesRepositoryProvider, projectsDataService, scheduler, instancesRepositoryProvider, formsRepositoryProvider); } @Provides diff --git a/collect_app/src/test/java/org/odk/collect/android/formentry/support/InMemFormSessionRepository.kt b/collect_app/src/test/java/org/odk/collect/android/formentry/support/InMemFormSessionRepository.kt index 6d0076d7f67..7cc51fe3683 100644 --- a/collect_app/src/test/java/org/odk/collect/android/formentry/support/InMemFormSessionRepository.kt +++ b/collect_app/src/test/java/org/odk/collect/android/formentry/support/InMemFormSessionRepository.kt @@ -10,6 +10,7 @@ import org.odk.collect.forms.instances.Instance import org.odk.collect.shared.strings.UUIDGenerator class InMemFormSessionRepository : FormSessionRepository { + override var currentForm: Form? = null private val map = mutableMapOf>() diff --git a/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesExternalInstanceParserFactory.kt b/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesExternalInstanceParserFactory.kt index c536e90f0ec..01a78ab8572 100644 --- a/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesExternalInstanceParserFactory.kt +++ b/entities/src/main/java/org/odk/collect/entities/javarosa/intance/LocalEntitiesExternalInstanceParserFactory.kt @@ -6,12 +6,12 @@ import org.odk.collect.entities.storage.EntitiesRepository class LocalEntitiesExternalInstanceParserFactory( private val entitiesRepositoryProvider: () -> EntitiesRepository, - private val enabled: () -> Boolean + private val usesEntities: () -> Boolean ) : ExternalInstanceParserFactory { override fun getExternalInstanceParser(): ExternalInstanceParser { val parser = ExternalInstanceParser() - if (enabled()) { + if (usesEntities()) { parser.addInstanceProvider(LocalEntitiesInstanceProvider(entitiesRepositoryProvider)) } diff --git a/test-forms/src/main/resources/forms/select-one-person.xml b/test-forms/src/main/resources/forms/select-one-person.xml new file mode 100644 index 00000000000..d330080634f --- /dev/null +++ b/test-forms/src/main/resources/forms/select-one-person.xml @@ -0,0 +1,35 @@ + + + + Select one person + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file