From 9f8d3cca1c15fa5005daae33fabf94f8050d3a87 Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 1 Jan 2024 16:56:57 +0500 Subject: [PATCH 1/7] quantity unit with initial fix --- .../behavior_calculated_expression.json | 33 +++++++-- .../MoreQuestionnaireItemComponents.kt | 11 ++- .../fhir/datacapture/extensions/MoreTypes.kt | 7 +- .../factories/QuantityViewHolderFactory.kt | 13 ++-- .../MoreQuestionnaireItemComponentsTest.kt | 69 ++++++++++++++++++- .../datacapture/extensions/MoreTypesTest.kt | 14 +++- .../QuantityViewHolderFactoryTest.kt | 31 ++++++++- 7 files changed, 163 insertions(+), 15 deletions(-) diff --git a/catalog/src/main/assets/behavior_calculated_expression.json b/catalog/src/main/assets/behavior_calculated_expression.json index e2fa4764d3..1a4be1e4d0 100644 --- a/catalog/src/main/assets/behavior_calculated_expression.json +++ b/catalog/src/main/assets/behavior_calculated_expression.json @@ -19,13 +19,34 @@ "linkId": "a-age-years", "text": "Age years", "type": "quantity", - "initial": [{ - "valueQuantity": { - "unit": "years", - "system": "http://unitsofmeasure.org", - "code": "years" + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-unitOption", + "valueCoding": { + "system": "http://unitsofmeasure.org", + "code": "years", + "display": "years" + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-unitOption", + "valueCoding": { + "system": "http://unitsofmeasure.org", + "code": "months", + "display": "months" + } } - }] + ], + "initial": [ + { + "valueQuantity": { + "value": 1, + "unit": "years", + "system": "http://unitsofmeasure.org", + "code": "months" + } + } + ] } ] } \ No newline at end of file diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt index bffc30bbfe..52328ab57e 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -581,6 +581,15 @@ internal val Questionnaire.QuestionnaireItemComponent.unitOption: List return this.extension .filter { it.url == EXTENSION_QUESTIONNAIRE_UNIT_OPTION_URL } .map { it.value as Coding } + .ifEmpty { + // https://build.fhir.org/ig/HL7/sdc/behavior.html#initial + // quantity given as initial without value is for default unit reference purpose + if (this.hasInitial()) { + listOf(this.initialFirstRep.valueQuantity.toCoding()) + } else { + listOf() + } + } } // ********************************************************************************************** // diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 7df499a385..513ec7cfad 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -124,6 +124,11 @@ internal fun Coding.toCodeType(): CodeType { return CodeType(code) } +/** Converts Quantity to Coding. */ +internal fun Quantity.toCoding(): Coding { + return Coding(this.system, this.code, this.unit) +} + fun Type.valueOrCalculateValue(): Type { return if (this.hasExtension()) { this.extension diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt index 6001248412..2d20a47193 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import androidx.core.widget.doAfterTextChanged import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.extensions.getRequiredOrOptionalText import com.google.android.fhir.datacapture.extensions.localizedFlyoverSpanned +import com.google.android.fhir.datacapture.extensions.toCoding import com.google.android.fhir.datacapture.extensions.unitOption import com.google.android.fhir.datacapture.validation.Invalid import com.google.android.fhir.datacapture.validation.NotValidated @@ -112,6 +113,7 @@ internal object QuantityViewHolderFactory : textInputEditText.removeTextChangedListener(textWatcher) updateUI() + textWatcher = textInputEditText.doAfterTextChanged { editable: Editable? -> handleInput(editable!!, null) @@ -157,10 +159,8 @@ internal object QuantityViewHolderFactory : editable?.toString()?.let { decimal = it.toBigDecimalOrNull() } unitDropDown?.let { unit = it } - if (decimal == null && unit == null) { + if (decimal == null) { questionnaireViewItem.clearAnswer() - } else if (decimal == null) { - questionnaireViewItem.setDraftAnswer(unit) } else if (unit == null) { questionnaireViewItem.setDraftAnswer(decimal) } else { @@ -189,6 +189,11 @@ internal object QuantityViewHolderFactory : Coding(it.system, it.code, it.unit) } ?: questionnaireViewItem.draftAnswer?.let { if (it is Coding) it else null } + ?: questionnaireViewItem.questionnaireItem + .takeIf { it.hasInitial() } + ?.initialFirstRep + ?.valueQuantity + ?.toCoding() unitAutoCompleteTextView.setText(unit?.display ?: "") val unitAdapter = diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt index 9def709e9b..7782dd8f84 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1498,6 +1498,73 @@ class MoreQuestionnaireItemComponentsTest { assertThat(questionItemList.first().localizedFlyoverSpanned.toString()).isEqualTo("gợi ý") } + @Test + fun `unitOption should return list of coding for multiple available unit options`() { + val question = + Questionnaire.QuestionnaireItemComponent().apply { + addExtension( + EXTENSION_QUESTIONNAIRE_UNIT_OPTION_URL, + Coding("http://unit.org", "yr", "years"), + ) + addExtension( + EXTENSION_QUESTIONNAIRE_UNIT_OPTION_URL, + Coding("http://unit.org", "mn", "months"), + ) + } + + val result = question.unitOption + + assertThat(result).hasSize(2) + assertThat((result[0].equalsDeep(Coding("http://unit.org", "yr", "years")))) + assertThat((result[1].equalsDeep(Coding("http://unit.org", "mn", "months")))) + } + + @Test + fun `unitOption should return list with single coding for single available unit option`() { + val question = + Questionnaire.QuestionnaireItemComponent().apply { + addExtension( + EXTENSION_QUESTIONNAIRE_UNIT_OPTION_URL, + Coding("http://unit.org", "yr", "years"), + ) + } + + val result = question.unitOption + + assertThat(result).hasSize(1) + assertThat((result[0].equalsDeep(Coding("http://unit.org", "yr", "years")))) + } + + @Test + fun `unitOption should return empty list for no available unit option`() { + val question = Questionnaire.QuestionnaireItemComponent() + + val result = question.unitOption + + assertThat(result).hasSize(0) + } + + @Test + fun `unitOption should return list with single coding when initial value of type quantity is defined`() { + val question = + Questionnaire.QuestionnaireItemComponent().apply { + addInitial( + Questionnaire.QuestionnaireItemInitialComponent( + Quantity().apply { + this.system = "http://unit.org" + this.code = "yr" + this.unit = "years" + }, + ), + ) + } + + val result = question.unitOption + + assertThat(result).hasSize(1) + assertThat((result[0].equalsDeep(Coding("http://unit.org", "yr", "years")))) + } + @Test fun createQuestionResponseWithoutGroupAndNestedQuestions() { val question = diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt index 533acf8488..64d845aa5b 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -205,6 +205,18 @@ class MoreTypesTest { assertThat(code.equalsDeep(CodeType("fakeCode"))).isTrue() } + @Test + fun `should return coding for quantity`() { + val quantity = + Quantity(1).apply { + this.code = "yr" + this.unit = "years" + this.system = "http://unit.org" + } + val result = quantity.toCoding() + assertThat(result.equalsDeep(Coding("http://unit.org", "yr", "years"))) + } + @Test fun `should return identifier string for coding containing system, version and code`() { val coding = Coding("fakeSystem", "fakeCode", "fakeDisplay").apply { version = "2.0" } diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactoryTest.kt index b1ce7d53cd..255aef33ff 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactoryTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -149,6 +149,35 @@ class QuantityViewHolderFactoryTest { .isEqualTo("kg") } + @Test + fun `should set unit value from initial when answer is missing`() { + viewHolder.bind( + QuestionnaireViewItem( + Questionnaire.QuestionnaireItemComponent().apply { + addInitial( + Questionnaire.QuestionnaireItemInitialComponent( + Quantity().apply { + this.unit = "kg" + this.code = "kilo" + }, + ), + ) + }, + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + ), + ) + + assertThat( + viewHolder.itemView + .findViewById(R.id.unit_auto_complete) + .text + .toString(), + ) + .isEqualTo("kg") + } + @Test fun `should clear unit value`() { viewHolder.bind( From b46c75100b41eabb62ae631ad6c20eee2c936741 Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 1 Jan 2024 19:04:49 +0500 Subject: [PATCH 2/7] quantity view factory android test fix --- catalog/src/main/assets/behavior_calculated_expression.json | 2 +- .../datacapture/views/factories/QuantityViewHolderFactory.kt | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/catalog/src/main/assets/behavior_calculated_expression.json b/catalog/src/main/assets/behavior_calculated_expression.json index 1a4be1e4d0..7ed190b4ae 100644 --- a/catalog/src/main/assets/behavior_calculated_expression.json +++ b/catalog/src/main/assets/behavior_calculated_expression.json @@ -41,7 +41,7 @@ { "valueQuantity": { "value": 1, - "unit": "years", + "unit": "months", "system": "http://unitsofmeasure.org", "code": "months" } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt index 2d20a47193..fa762fc6c5 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt @@ -159,8 +159,10 @@ internal object QuantityViewHolderFactory : editable?.toString()?.let { decimal = it.toBigDecimalOrNull() } unitDropDown?.let { unit = it } - if (decimal == null) { + if (decimal == null && unit == null) { questionnaireViewItem.clearAnswer() + } else if (decimal == null) { + questionnaireViewItem.setDraftAnswer(unit) } else if (unit == null) { questionnaireViewItem.setDraftAnswer(decimal) } else { From b68998cc8eff1f6c891446771d566a67a8f782c4 Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 1 Jan 2024 22:50:44 +0500 Subject: [PATCH 3/7] remove failing time unit from test --- .../android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt index 96b75cba10..7f6328a939 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt @@ -214,7 +214,6 @@ class QuestionnaireUiEspressoTest { .perform(ViewActions.typeTextIntoFocusedView("01052005")) onView(withId(R.id.time_input_layout)).perform(clickIcon(true)) - clickOnText("AM") clickOnText("6") clickOnText("10") clickOnText("OK") From b12427b52d03cf0a01f2a1f5a30803c7b9375f13 Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 1 Jan 2024 22:53:59 +0500 Subject: [PATCH 4/7] spotless fix --- .../fhir/datacapture/test/QuestionnaireUiEspressoTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt index 7f6328a939..67c2819f2c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/QuestionnaireUiEspressoTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 528bdba350eb693c902260ec86cec416fa2fd4c6 Mon Sep 17 00:00:00 2001 From: Maimoona Kausar <4829880+maimoonak@users.noreply.github.com> Date: Fri, 9 Feb 2024 12:27:15 +0500 Subject: [PATCH 5/7] Update datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt Co-authored-by: Jing Tang --- .../datacapture/views/factories/QuantityViewHolderFactory.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt index fa762fc6c5..a7840fd873 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt @@ -192,8 +192,8 @@ internal object QuantityViewHolderFactory : } ?: questionnaireViewItem.draftAnswer?.let { if (it is Coding) it else null } ?: questionnaireViewItem.questionnaireItem - .takeIf { it.hasInitial() } - ?.initialFirstRep + .initial + ?.firstOrNull() ?.valueQuantity ?.toCoding() unitAutoCompleteTextView.setText(unit?.display ?: "") From f41d6c9e046192e00c84b1c75e3b11040ab3f7b4 Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 12 Feb 2024 18:56:08 +0500 Subject: [PATCH 6/7] Deduplicate unit options --- .../behavior_calculated_expression.json | 4 +- .../extensions/MoreEnumerations.kt | 4 +- .../MoreQuestionnaireItemComponents.kt | 11 ++--- .../fhir/datacapture/extensions/MoreTypes.kt | 7 +++- .../datacapture/mapping/ResourceMapper.kt | 6 +-- .../factories/QuantityViewHolderFactory.kt | 11 ++--- .../extensions/MoreEnumerationsTest.kt | 4 +- .../MoreQuestionnaireItemComponentsTest.kt | 40 +++++++++++++++++++ .../datacapture/extensions/MoreTypesTest.kt | 2 +- 9 files changed, 63 insertions(+), 26 deletions(-) diff --git a/catalog/src/main/assets/behavior_calculated_expression.json b/catalog/src/main/assets/behavior_calculated_expression.json index 7ed190b4ae..1e0f1bb17d 100644 --- a/catalog/src/main/assets/behavior_calculated_expression.json +++ b/catalog/src/main/assets/behavior_calculated_expression.json @@ -3,7 +3,7 @@ "item": [ { "linkId": "a-birthdate", - "text": "Birth Date", + "text": "Birth Date (select age to auto calculate if not known)", "type": "date", "extension": [ { @@ -17,7 +17,7 @@ }, { "linkId": "a-age-years", - "text": "Age years", + "text": "Age", "type": "quantity", "extension": [ { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt index 4db09ba3b4..f7fccdff70 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ import org.hl7.fhir.r4.model.Enumeration * client, we have to call the desired api on the GenericType passed to the [Enumeration] and get * the desired value by calling the api's as described above. */ -internal fun Enumeration<*>.toCoding(): Coding { +internal fun Enumeration<*>.toCodingUnit(): Coding { val enumeration = this return Coding().apply { display = diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt index 81d5793d2a..29f1f54b4b 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt @@ -582,15 +582,12 @@ internal val Questionnaire.QuestionnaireItemComponent.unitOption: List return this.extension .filter { it.url == EXTENSION_QUESTIONNAIRE_UNIT_OPTION_URL } .map { it.value as Coding } - .ifEmpty { + .plus( // https://build.fhir.org/ig/HL7/sdc/behavior.html#initial // quantity given as initial without value is for default unit reference purpose - if (this.hasInitial()) { - listOf(this.initialFirstRep.valueQuantity.toCoding()) - } else { - listOf() - } - } + this.initial.map { it.valueQuantity.toCodingUnit() }, + ) + .distinctBy { it.code } } // ********************************************************************************************** // diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 543745f9bc..1c40a6ca22 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -124,8 +124,11 @@ internal fun Coding.toCodeType(): CodeType { return CodeType(code) } -/** Converts Quantity to Coding. */ -internal fun Quantity.toCoding(): Coding { +/** + * Converts Quantity to Coding type. The resulting Coding properties are equivalent of Coding.system + * = Quantity.system Coding.code = Quantity.code Coding.display = Quantity.unit + */ +internal fun Quantity.toCodingUnit(): Coding { return Coding(this.system, this.code, this.unit) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt index 6ad8088ad3..897e3ec9f2 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import com.google.android.fhir.datacapture.extensions.logicalId import com.google.android.fhir.datacapture.extensions.questionnaireLaunchContexts import com.google.android.fhir.datacapture.extensions.targetStructureMap import com.google.android.fhir.datacapture.extensions.toCodeType -import com.google.android.fhir.datacapture.extensions.toCoding +import com.google.android.fhir.datacapture.extensions.toCodingUnit import com.google.android.fhir.datacapture.extensions.toIdType import com.google.android.fhir.datacapture.extensions.toUriType import com.google.android.fhir.datacapture.extensions.validateLaunchContextExtensions @@ -743,7 +743,7 @@ private fun Base.asExpectedType( return when { questionnaireItemType == Questionnaire.QuestionnaireItemType.REFERENCE -> asExpectedReferenceType() - this is Enumeration<*> -> toCoding() + this is Enumeration<*> -> toCodingUnit() this is IdType -> StringType(idPart) else -> this as Type } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt index a7840fd873..383b776330 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt @@ -28,7 +28,7 @@ import androidx.core.widget.doAfterTextChanged import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.extensions.getRequiredOrOptionalText import com.google.android.fhir.datacapture.extensions.localizedFlyoverSpanned -import com.google.android.fhir.datacapture.extensions.toCoding +import com.google.android.fhir.datacapture.extensions.toCodingUnit import com.google.android.fhir.datacapture.extensions.unitOption import com.google.android.fhir.datacapture.validation.Invalid import com.google.android.fhir.datacapture.validation.NotValidated @@ -187,15 +187,12 @@ internal object QuantityViewHolderFactory : } val unit = - questionnaireViewItem.answers.singleOrNull()?.valueQuantity?.let { - Coding(it.system, it.code, it.unit) - } + questionnaireViewItem.answers.singleOrNull()?.valueQuantity?.toCodingUnit() ?: questionnaireViewItem.draftAnswer?.let { if (it is Coding) it else null } - ?: questionnaireViewItem.questionnaireItem - .initial + ?: questionnaireViewItem.questionnaireItem.initial ?.firstOrNull() ?.valueQuantity - ?.toCoding() + ?.toCodingUnit() unitAutoCompleteTextView.setText(unit?.display ?: "") val unitAdapter = diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt index 74d2de1eb1..9489f93f45 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ class MoreEnumerationsTest { @Test fun enumeration_should_return_coding() { val maleEnumerationCoding = - Enumeration(Enumerations.AdministrativeGenderEnumFactory(), "male").toCoding() + Enumeration(Enumerations.AdministrativeGenderEnumFactory(), "male").toCodingUnit() val coding = Coding().apply { display = "Male" diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt index 7782dd8f84..32c60eec04 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponentsTest.kt @@ -1565,6 +1565,46 @@ class MoreQuestionnaireItemComponentsTest { assertThat((result[0].equalsDeep(Coding("http://unit.org", "yr", "years")))) } + @Test + fun `unitOption should return list with de-duplicated coding when multiple initial values of type quantity is defined`() { + val question = + Questionnaire.QuestionnaireItemComponent().apply { + addInitial( + Questionnaire.QuestionnaireItemInitialComponent( + Quantity().apply { + this.system = "http://unit.org" + this.code = "yr" + this.unit = "years" + }, + ), + ) + addInitial( + Questionnaire.QuestionnaireItemInitialComponent( + Quantity().apply { + this.system = "http://unit.org" + this.code = "yr" + this.unit = "years" + }, + ), + ) + addInitial( + Questionnaire.QuestionnaireItemInitialComponent( + Quantity().apply { + this.system = "http://unit.org" + this.code = "mo" + this.unit = "months" + }, + ), + ) + } + + val result = question.unitOption + + assertThat(result).hasSize(2) + assertThat((result[0].equalsDeep(Coding("http://unit.org", "yr", "years")))) + assertThat((result[1].equalsDeep(Coding("http://unit.org", "mo", "months")))) + } + @Test fun createQuestionResponseWithoutGroupAndNestedQuestions() { val question = diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt index 64d845aa5b..1a4f972add 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt @@ -213,7 +213,7 @@ class MoreTypesTest { this.unit = "years" this.system = "http://unit.org" } - val result = quantity.toCoding() + val result = quantity.toCodingUnit() assertThat(result.equalsDeep(Coding("http://unit.org", "yr", "years"))) } From 3f0239915ff04c24098c1868660a67aa2c1891bb Mon Sep 17 00:00:00 2001 From: maimoonak Date: Mon, 26 Feb 2024 14:39:13 +0500 Subject: [PATCH 7/7] Rename to toCoding from toCodingUnit --- .../android/fhir/datacapture/extensions/MoreEnumerations.kt | 2 +- .../extensions/MoreQuestionnaireItemComponents.kt | 2 +- .../google/android/fhir/datacapture/extensions/MoreTypes.kt | 2 +- .../android/fhir/datacapture/mapping/ResourceMapper.kt | 4 ++-- .../views/factories/QuantityViewHolderFactory.kt | 6 +++--- .../fhir/datacapture/extensions/MoreEnumerationsTest.kt | 2 +- .../android/fhir/datacapture/extensions/MoreTypesTest.kt | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt index f7fccdff70..a211def7d2 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreEnumerations.kt @@ -29,7 +29,7 @@ import org.hl7.fhir.r4.model.Enumeration * client, we have to call the desired api on the GenericType passed to the [Enumeration] and get * the desired value by calling the api's as described above. */ -internal fun Enumeration<*>.toCodingUnit(): Coding { +internal fun Enumeration<*>.toCoding(): Coding { val enumeration = this return Coding().apply { display = diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt index 29f1f54b4b..d4897c94e9 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt @@ -585,7 +585,7 @@ internal val Questionnaire.QuestionnaireItemComponent.unitOption: List .plus( // https://build.fhir.org/ig/HL7/sdc/behavior.html#initial // quantity given as initial without value is for default unit reference purpose - this.initial.map { it.valueQuantity.toCodingUnit() }, + this.initial.map { it.valueQuantity.toCoding() }, ) .distinctBy { it.code } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt index 1c40a6ca22..7ac598930c 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreTypes.kt @@ -128,7 +128,7 @@ internal fun Coding.toCodeType(): CodeType { * Converts Quantity to Coding type. The resulting Coding properties are equivalent of Coding.system * = Quantity.system Coding.code = Quantity.code Coding.display = Quantity.unit */ -internal fun Quantity.toCodingUnit(): Coding { +internal fun Quantity.toCoding(): Coding { return Coding(this.system, this.code, this.unit) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt index 897e3ec9f2..9876f813ac 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt @@ -24,7 +24,7 @@ import com.google.android.fhir.datacapture.extensions.logicalId import com.google.android.fhir.datacapture.extensions.questionnaireLaunchContexts import com.google.android.fhir.datacapture.extensions.targetStructureMap import com.google.android.fhir.datacapture.extensions.toCodeType -import com.google.android.fhir.datacapture.extensions.toCodingUnit +import com.google.android.fhir.datacapture.extensions.toCoding import com.google.android.fhir.datacapture.extensions.toIdType import com.google.android.fhir.datacapture.extensions.toUriType import com.google.android.fhir.datacapture.extensions.validateLaunchContextExtensions @@ -743,7 +743,7 @@ private fun Base.asExpectedType( return when { questionnaireItemType == Questionnaire.QuestionnaireItemType.REFERENCE -> asExpectedReferenceType() - this is Enumeration<*> -> toCodingUnit() + this is Enumeration<*> -> toCoding() this is IdType -> StringType(idPart) else -> this as Type } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt index 383b776330..27d1910fa7 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/QuantityViewHolderFactory.kt @@ -28,7 +28,7 @@ import androidx.core.widget.doAfterTextChanged import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.extensions.getRequiredOrOptionalText import com.google.android.fhir.datacapture.extensions.localizedFlyoverSpanned -import com.google.android.fhir.datacapture.extensions.toCodingUnit +import com.google.android.fhir.datacapture.extensions.toCoding import com.google.android.fhir.datacapture.extensions.unitOption import com.google.android.fhir.datacapture.validation.Invalid import com.google.android.fhir.datacapture.validation.NotValidated @@ -187,12 +187,12 @@ internal object QuantityViewHolderFactory : } val unit = - questionnaireViewItem.answers.singleOrNull()?.valueQuantity?.toCodingUnit() + questionnaireViewItem.answers.singleOrNull()?.valueQuantity?.toCoding() ?: questionnaireViewItem.draftAnswer?.let { if (it is Coding) it else null } ?: questionnaireViewItem.questionnaireItem.initial ?.firstOrNull() ?.valueQuantity - ?.toCodingUnit() + ?.toCoding() unitAutoCompleteTextView.setText(unit?.display ?: "") val unitAdapter = diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt index 9489f93f45..00a95fdc41 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreEnumerationsTest.kt @@ -30,7 +30,7 @@ class MoreEnumerationsTest { @Test fun enumeration_should_return_coding() { val maleEnumerationCoding = - Enumeration(Enumerations.AdministrativeGenderEnumFactory(), "male").toCodingUnit() + Enumeration(Enumerations.AdministrativeGenderEnumFactory(), "male").toCoding() val coding = Coding().apply { display = "Male" diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt index 1a4f972add..64d845aa5b 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/extensions/MoreTypesTest.kt @@ -213,7 +213,7 @@ class MoreTypesTest { this.unit = "years" this.system = "http://unit.org" } - val result = quantity.toCodingUnit() + val result = quantity.toCoding() assertThat(result.equalsDeep(Coding("http://unit.org", "yr", "years"))) }