diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponents.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponents.kt index 1837ee1329..f3f8199067 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponents.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponents.kt @@ -18,6 +18,7 @@ package com.google.android.fhir.datacapture import android.text.Spanned import androidx.core.text.HtmlCompat +import androidx.core.text.toSpanned import com.google.android.fhir.getLocalizedText import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CodeType @@ -183,6 +184,19 @@ private fun String.toSpanned(): Spanned { val Questionnaire.QuestionnaireItemComponent.localizedTextSpanned: Spanned? get() = textElement?.getLocalizedText()?.toSpanned() +/** + * `*` value is appended to [Questionnaire.QuestionnaireItemComponent.localizedTextSpanned] if + * [Questionnaire.QuestionnaireItemComponent.required] is true. + */ +internal val Questionnaire.QuestionnaireItemComponent.localizedTextSpannedWithAsterisk: Spanned? + get() { + return if (required) { + localizedTextSpanned?.toString()?.plus("*")?.toSpanned() + } else { + localizedTextSpanned + } + } + /** * Localized and spanned value of [Questionnaire.QuestionnaireItemComponent.prefix] if translation * is present. Default value otherwise. diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderView.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderView.kt index 039ae2e79b..7889c82d8c 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderView.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderView.kt @@ -24,7 +24,7 @@ import android.widget.TextView import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.localizedInstructionsSpanned import com.google.android.fhir.datacapture.localizedPrefixSpanned -import com.google.android.fhir.datacapture.localizedTextSpanned +import com.google.android.fhir.datacapture.localizedTextSpannedWithAsterisk import org.hl7.fhir.r4.model.Questionnaire internal class QuestionnaireGroupTypeHeaderView(context: Context, attrs: AttributeSet?) : @@ -40,7 +40,7 @@ internal class QuestionnaireGroupTypeHeaderView(context: Context, attrs: Attribu val hint = findViewById(R.id.hint) initHelpButton(this, questionnaireItem) prefix.updateTextAndVisibility(questionnaireItem.localizedPrefixSpanned) - question.updateTextAndVisibility(questionnaireItem.localizedTextSpanned) + question.updateTextAndVisibility(questionnaireItem.localizedTextSpannedWithAsterisk) hint.updateTextAndVisibility(questionnaireItem.localizedInstructionsSpanned) visibility = getViewGroupVisibility(prefix, question, hint) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderView.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderView.kt index 8a5e627b2e..e3f353f3fb 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderView.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderView.kt @@ -31,7 +31,7 @@ import com.google.android.fhir.datacapture.hasHelpButton import com.google.android.fhir.datacapture.localizedHelpSpanned import com.google.android.fhir.datacapture.localizedInstructionsSpanned import com.google.android.fhir.datacapture.localizedPrefixSpanned -import com.google.android.fhir.datacapture.localizedTextSpanned +import com.google.android.fhir.datacapture.localizedTextSpannedWithAsterisk import com.google.android.material.card.MaterialCardView import org.hl7.fhir.r4.model.Questionnaire @@ -49,7 +49,7 @@ internal class QuestionnaireItemHeaderView(context: Context, attrs: AttributeSet fun bind(questionnaireItem: Questionnaire.QuestionnaireItemComponent) { prefix.updateTextAndVisibility(questionnaireItem.localizedPrefixSpanned) - question.updateTextAndVisibility(questionnaireItem.localizedTextSpanned) + question.updateTextAndVisibility(questionnaireItem.localizedTextSpannedWithAsterisk) hint.updateTextAndVisibility(questionnaireItem.localizedInstructionsSpanned) initHelpButton(this, questionnaireItem) // Make the entire view GONE if there is nothing to show. This is to avoid an empty row in the diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponentsTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponentsTest.kt index 94f30ae42e..43c5adf0b1 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponentsTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemComponentsTest.kt @@ -530,6 +530,27 @@ class MoreQuestionnaireItemComponentsTest { assertThat(questionnaireItem.localizedTextSpanned.toString()).isEqualTo("Thông tin bệnh nhân") } + @Test + fun `localizedTextSpannedWithAsterisk returns localizedTextSpanned appended by *`() { + val questionnaireItem = + Questionnaire.QuestionnaireItemComponent().apply { + text = "Patient Information" + required = true + } + Locale.setDefault(Locale.US) + assertThat(questionnaireItem.localizedTextSpannedWithAsterisk.toString()) + .isEqualTo("Patient Information*") + } + + @Test + fun `localizedTextSpannedWithAsterisk returns localizedTextSpanned`() { + val questionnaireItem = + Questionnaire.QuestionnaireItemComponent().apply { text = "Patient Information" } + Locale.setDefault(Locale.US) + assertThat(questionnaireItem.localizedTextSpannedWithAsterisk.toString()) + .isEqualTo("Patient Information") + } + @Test fun localizedPrefixSpanned_noPrefix_shouldReturnNull() { val questionnaireItem = Questionnaire.QuestionnaireItemComponent() diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderViewTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderViewTest.kt index e7c32a7151..5d4177fc65 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderViewTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireGroupTypeHeaderViewTest.kt @@ -74,6 +74,18 @@ class QuestionnaireGroupTypeHeaderViewTest { assertThat(view.findViewById(R.id.question).text.toString()).isEqualTo("Question?") } + @Test + fun `shows * at the end of question text`() { + view.bind( + Questionnaire.QuestionnaireItemComponent().apply { + text = "Question?" + required = true + } + ) + + assertThat(view.findViewById(R.id.question).text.toString()).isEqualTo("Question?*") + } + @Test fun `shows instructions`() { view.bind( diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderViewTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderViewTest.kt index 8bdb83edfe..80baf39bac 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderViewTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemHeaderViewTest.kt @@ -74,6 +74,18 @@ class QuestionnaireItemHeaderViewTest { assertThat(view.findViewById(R.id.question).text.toString()).isEqualTo("Question?") } + @Test + fun `shows * at the end of question text`() { + view.bind( + Questionnaire.QuestionnaireItemComponent().apply { + text = "Question?" + required = true + } + ) + + assertThat(view.findViewById(R.id.question).text.toString()).isEqualTo("Question?*") + } + @Test fun `shows instructions`() { view.bind(