Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@ 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
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<EntitiesRepository>,
private val settingsProvider: SettingsProvider
private val formSessionRepository: FormSessionRepository
) {

fun initialize() {
Expand Down Expand Up @@ -53,7 +53,7 @@ class JavaRosaInitializer(

val localEntitiesExternalInstanceParserFactory = LocalEntitiesExternalInstanceParserFactory(
{ entitiesRepositoryProvider.create(projectsDataService.requireCurrentProject().uuid) },
{ true }
{ formSessionRepository.currentForm!!.usesEntities() }
)

XFormUtils.setExternalInstanceParserFactory(localEntitiesExternalInstanceParserFactory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -71,6 +72,9 @@ class FormUriActivity : LocalizedActivity() {
@Inject
lateinit var changeLockProvider: ChangeLockProvider

@Inject
lateinit var formSessionRepository: FormSessionRepository

private var formFillingAlreadyStarted = false

private val openForm =
Expand All @@ -93,7 +97,8 @@ class FormUriActivity : LocalizedActivity() {
settingsProvider,
savepointsRepositoryProvider,
changeLockProvider,
resources
resources,
formSessionRepository
) as T
}
}
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<FormSession>
fun clear(id: String)
Expand All @@ -24,6 +26,7 @@ interface FormSessionRepository {
}

class AppStateFormSessionRepository(application: Application) : FormSessionRepository {
override var currentForm: Form? = null

private val appState = application.getState()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ public ExternalAppIntentProvider providesExternalAppIntentProvider() {
}

@Provides
@Singleton
public FormSessionRepository providesFormSessionStore(Application application) {
return new AppStateFormSessionRepository(application);
}
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, MutableLiveData<FormSession>>()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand Down
35 changes: 35 additions & 0 deletions test-forms/src/main/resources/forms/select-one-person.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0"?>
<h:html
xmlns="http://www.w3.org/2002/xforms"
xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jr="http://openrosa.org/javarosa"
xmlns:orx="http://openrosa.org/xforms"
xmlns:odk="http://www.opendatakit.org/xforms">
<h:head>
<h:title>Select one person</h:title>
<model odk:xforms-version="1.0.0">
<instance>
<data id="select-one-person">
<Person/>
<meta>
<instanceID/>
</meta>
</data>
</instance>
<instance id="people" src="jr://file-csv/people.csv"/>
<bind nodeset="/data/Person" type="string"/>
<bind nodeset="/data/meta/instanceID" type="string" readonly="true()" jr:preload="uid"/>
</model>
</h:head>
<h:body>
<select1 ref="/data/Person">
<label>Select person</label>
<itemset nodeset="instance('people')/root/item">
<value ref="name"/>
<label ref="label"/>
</itemset>
</select1>
</h:body>
</h:html>