Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add enum to replace booleans
  • Loading branch information
seadowg committed Nov 26, 2025
commit acb89bfe98789dd97e1981df3386b620614e6342
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,52 @@ package org.odk.collect.android.formmanagement
import org.odk.collect.forms.ManifestFile
import java.io.Serializable

data class ServerFormDetails(
data class ServerFormDetails @JvmOverloads constructor(
val formName: String?,
val downloadUrl: String?,
val formId: String?,
val formVersion: String?,
val hash: String?,
val isNotOnDevice: Boolean,
val isUpdated: Boolean,
val manifest: ManifestFile?
@Deprecated(
message = "Use type instead",
replaceWith = ReplaceWith("type")
) val isNotOnDevice: Boolean,
@Deprecated(
message = "Use type instead",
replaceWith = ReplaceWith("type")
) val isUpdated: Boolean,
val manifest: ManifestFile?,
val type: Type? = null
) : Serializable {

companion object {
private const val serialVersionUID = 3L
}

enum class Type {
/**
* The form is on the device already
*/
OnDevice,

/**
* The form is not on the device
*/
New,

/**
* The form is on the device, but this is a new version with a new version and hash
*/
UpdatedVersion,

/**
* The form is on the device, but this is a new version with a new hash
*/
UpdatedHash,

/**
* This version of the form is on the device, but new/updated media files are available
*/
UpdatedMedia
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,8 @@ object ServerFormUseCases {
}

val isNewerFormVersionAvailable = listItem.hash.let {
if (it == null) {
false
} else if (thisFormAlreadyDownloaded) {
existingForm == null || existingForm.isDeleted
if (thisFormAlreadyDownloaded) {
existingForm == null
} else {
false
}
Expand All @@ -62,6 +60,26 @@ object ServerFormUseCases {
false
}

val type = if (existingForm != null) {
if (existingForm.isDeleted) {
ServerFormDetails.Type.New
} else if (areNewerMediaFilesAvailable) {
ServerFormDetails.Type.UpdatedMedia
} else {
ServerFormDetails.Type.OnDevice
}
} else if (thisFormAlreadyDownloaded) {
if (listItem.hash == null) {
ServerFormDetails.Type.OnDevice
} else if (forms.any { it.version == listItem.version }) {
ServerFormDetails.Type.UpdatedHash
} else {
ServerFormDetails.Type.UpdatedVersion
}
} else {
ServerFormDetails.Type.New
}

ServerFormDetails(
listItem.name,
listItem.downloadURL,
Expand All @@ -70,7 +88,8 @@ object ServerFormUseCases {
listItem.hash,
!thisFormAlreadyDownloaded,
isNewerFormVersionAvailable || areNewerMediaFilesAvailable,
manifestFile
manifestFile,
type
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package org.odk.collect.android.formmanagement

import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.contains
import org.hamcrest.Matchers.`is`
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.nullValue
import org.junit.Test
import org.mockito.kotlin.doReturn
Expand Down Expand Up @@ -54,7 +54,8 @@ class FetchFormDetailsServerFormUseCasesTest {
whenever(formSource.fetchFormList()).thenReturn(listOf(FORM_WITHOUT_MANIFEST))

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-1").isNotOnDevice, `is`(true))
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.type, equalTo(ServerFormDetails.Type.New))
}

@Test
Expand All @@ -71,11 +72,12 @@ class FetchFormDetailsServerFormUseCasesTest {
)

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-1").isNotOnDevice, `is`(true))
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.type, equalTo(ServerFormDetails.Type.New))
}

@Test
fun whenAFormExists_andListContainsVersionWithDifferentHash_isUpdated() {
fun whenAFormExists_andListContainsNewVersionWithDifferentHash_isUpdated() {
whenever(formSource.fetchFormList()).thenReturn(listOf(FORM_WITHOUT_MANIFEST))
formsRepository.save(
Form.Builder()
Expand All @@ -86,7 +88,25 @@ class FetchFormDetailsServerFormUseCasesTest {
)

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-1").isUpdated, `is`(true))
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.type, equalTo(ServerFormDetails.Type.UpdatedVersion))
}

@Test
fun whenAFormExists_andListContainsSameVersionWithDifferentHash_isUpdated() {
whenever(formSource.fetchFormList()).thenReturn(listOf(FORM_WITHOUT_MANIFEST))
formsRepository.save(
Form.Builder()
.formId("form-1")
.version("1")
.md5Hash("form-1-hash-old")
.formFilePath(FormUtils.createXFormFile("form-1", null).absolutePath)
.build()
)

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.type, equalTo(ServerFormDetails.Type.UpdatedHash))
}

@Test
Expand All @@ -103,7 +123,8 @@ class FetchFormDetailsServerFormUseCasesTest {
)

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-2").isUpdated, `is`(true))
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.type, equalTo(ServerFormDetails.Type.UpdatedMedia))
}

@Test
Expand All @@ -124,7 +145,8 @@ class FetchFormDetailsServerFormUseCasesTest {
writeToFile(oldMediaFile, "blah before")

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-2").isUpdated, `is`(true))
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.type, equalTo(ServerFormDetails.Type.UpdatedMedia))
}

@Test
Expand Down Expand Up @@ -159,12 +181,11 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.isUpdated, `is`(false))
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.OnDevice))
}

@Test
fun whenAFormExists_andItsNewerVersionHasBeenAlreadyDownloadedButThenSoftDeleted_isUpdated() {
fun whenAFormExists_andItsNewerVersionHasBeenAlreadyDownloadedButThenSoftDeleted_isNew() {
whenever(formSource.fetchFormList()).thenReturn(listOf(FORM_WITHOUT_MANIFEST))

formsRepository.save(
Expand All @@ -187,12 +208,11 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.isUpdated, `is`(true))
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.New))
}

@Test
fun whenAFormExists_andItsNewerVersionWithMediaFilesHasBeenAlreadyDownloadedButThenSoftDeleted_isUpdated() {
fun whenAFormExists_andItsNewerVersionWithMediaFilesHasBeenAlreadyDownloadedButThenSoftDeleted_isNew() {
whenever(formSource.fetchFormList()).thenReturn(listOf(FORM_WITH_MANIFEST))

val mediaDir1 = TempFiles.createTempDir()
Expand Down Expand Up @@ -224,8 +244,7 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.isUpdated, `is`(true))
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.New))
}

@Test
Expand All @@ -243,8 +262,7 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-1")
assertThat(form.isUpdated, `is`(false))
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.OnDevice))
}

@Test
Expand All @@ -266,8 +284,7 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.isUpdated, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.OnDevice))
}

@Test
Expand All @@ -287,7 +304,8 @@ class FetchFormDetailsServerFormUseCasesTest {
writeToFile(localMediaFile, FILE_CONTENT)

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
assertThat(getFormFromList(serverFormDetails, "form-2").isUpdated, `is`(true))
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.type, equalTo(ServerFormDetails.Type.UpdatedVersion))
}

@Test
Expand All @@ -307,8 +325,7 @@ class FetchFormDetailsServerFormUseCasesTest {

val serverFormDetails = ServerFormUseCases.fetchFormDetails(formsRepository, formSource)
val form = getFormFromList(serverFormDetails, "form-2")
assertThat(form.isUpdated, `is`(false))
assertThat(form.isNotOnDevice, `is`(false))
assertThat(form.type, equalTo(ServerFormDetails.Type.OnDevice))
}

private fun writeToFile(mediaFile: File, blah: String) {
Expand Down