From fb31c93ca3c08124bef3f0a26fc941204b17437c Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Sun, 23 Feb 2025 18:17:00 +0100 Subject: [PATCH 1/2] Added a failing test --- .../formstest/FormsRepositoryTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/forms-test/src/main/java/org/odk/collect/formstest/FormsRepositoryTest.java b/forms-test/src/main/java/org/odk/collect/formstest/FormsRepositoryTest.java index 2301451d895..8d1d02c52c4 100644 --- a/forms-test/src/main/java/org/odk/collect/formstest/FormsRepositoryTest.java +++ b/forms-test/src/main/java/org/odk/collect/formstest/FormsRepositoryTest.java @@ -251,6 +251,25 @@ public void save_whenFormHasId_updatesHash() throws IOException { assertThat(formsRepository.get(originalForm.getDbId()).getMD5Hash(), is(expectedHash)); } + @Test + public void save_withNewFormVersion_copiesLanguageFromLatestFormVersion() { + FormsRepository formsRepository = buildSubject(); + + Form formV1 = formsRepository.save(FormUtils.buildForm("id", "1", getFormFilesPath()).build()); + formsRepository.save(new Form.Builder(formV1) + .language("Spanish") + .build()); + + Form formV2 = formsRepository.save(FormUtils.buildForm(formV1.getFormId(), "2", getFormFilesPath()).build()); + formsRepository.save(new Form.Builder(formV2) + .language("Polish") + .build()); + + Form formV3 = formsRepository.save(FormUtils.buildForm(formV1.getFormId(), "3", getFormFilesPath()).build()); + + assertThat(formsRepository.get(formV3.getDbId()).getLanguage(), is("Polish")); + } + @Test public void delete_deletesFiles() throws Exception { FormsRepository formsRepository = buildSubject(); From af4972f378dc748d00fe7892acf10fd8308f30b1 Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Sun, 23 Feb 2025 18:17:23 +0100 Subject: [PATCH 2/2] Carry form language selection over to new form version --- .../android/database/forms/DatabaseFormsRepository.java | 7 +++++++ .../org/odk/collect/formstest/InMemFormsRepository.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/collect_app/src/main/java/org/odk/collect/android/database/forms/DatabaseFormsRepository.java b/collect_app/src/main/java/org/odk/collect/android/database/forms/DatabaseFormsRepository.java index ceca32911ec..3d3db334204 100644 --- a/collect_app/src/main/java/org/odk/collect/android/database/forms/DatabaseFormsRepository.java +++ b/collect_app/src/main/java/org/odk/collect/android/database/forms/DatabaseFormsRepository.java @@ -46,6 +46,7 @@ import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -171,6 +172,12 @@ public Form save(@NotNull Form form) { if (form.getDbId() == null) { values.put(DATE, clock.get()); + List
existingFormsWithSameFormId = getAllByFormId(form.getFormId()); + if (!existingFormsWithSameFormId.isEmpty()) { + Form latestFormWithSameFormId = Collections.max(existingFormsWithSameFormId, Comparator.comparing(Form::getDate)); + values.put(LANGUAGE, latestFormWithSameFormId.getLanguage()); + } + Long idFromUri = insertForm(values); if (idFromUri == -1) { return getOneByMd5Hash(md5Hash); diff --git a/forms-test/src/main/java/org/odk/collect/formstest/InMemFormsRepository.java b/forms-test/src/main/java/org/odk/collect/formstest/InMemFormsRepository.java index 9ed36152404..ba09be381fb 100644 --- a/forms-test/src/main/java/org/odk/collect/formstest/InMemFormsRepository.java +++ b/forms-test/src/main/java/org/odk/collect/formstest/InMemFormsRepository.java @@ -11,6 +11,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -141,6 +142,12 @@ public Form save(@NotNull Form form) { builder.jrCacheFilePath(TempFiles.getPathInTempDir(hash, ".formdef")); } + List existingFormsWithSameFormId = getAllByFormId(form.getFormId()); + if (!existingFormsWithSameFormId.isEmpty()) { + Form latestFormWithSameFormId = Collections.max(existingFormsWithSameFormId, Comparator.comparing(Form::getDate)); + builder.language(latestFormWithSameFormId.getLanguage()); + } + Form formToSave = builder.build(); forms.add(formToSave); return formToSave;