diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireValidationErrorMessageDialogFragment.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireValidationErrorMessageDialogFragment.kt
index 685da30678..8f56b8b90e 100644
--- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireValidationErrorMessageDialogFragment.kt
+++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireValidationErrorMessageDialogFragment.kt
@@ -18,6 +18,7 @@ package com.google.android.fhir.datacapture
import android.app.Dialog
import android.os.Bundle
+import android.text.Spanned
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
@@ -32,6 +33,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.google.android.fhir.datacapture.extensions.flattened
import com.google.android.fhir.datacapture.extensions.localizedFlyoverSpanned
+import com.google.android.fhir.datacapture.extensions.localizedPrefixSpanned
+import com.google.android.fhir.datacapture.extensions.localizedTextSpanned
import com.google.android.fhir.datacapture.extensions.toSpanned
import com.google.android.fhir.datacapture.validation.Invalid
import com.google.android.fhir.datacapture.validation.ValidationResult
@@ -93,7 +96,7 @@ internal class QuestionnaireValidationErrorMessageDialogFragment(
text =
viewModel
.getItemsTextWithValidationErrors()
- .joinToString(separator = "\n") {
+ .joinToString(separator = "
") {
context.getString(R.string.questionnaire_validation_error_item_text_with_bullet, it)
}
.toSpanned()
@@ -129,14 +132,22 @@ internal class QuestionnaireValidationErrorViewModel : ViewModel() {
}
/** @return Texts associated with the failing [Questionnaire.QuestionnaireItemComponent]s. */
- fun getItemsTextWithValidationErrors(): List {
+ fun getItemsTextWithValidationErrors(): List {
val invalidFields =
validation?.filterValues { it.filterIsInstance().isNotEmpty() } ?: emptyMap()
return questionnaire
?.item
?.flattened()
?.filter { invalidFields.contains(it.linkId) }
- ?.map { if (it.text.isNullOrEmpty()) it.localizedFlyoverSpanned.toString() else it.text }
+ ?.mapNotNull {
+ // Use the question text if available, otherwise fall back to the fly-over and then the
+ // prefix.
+ it.localizedTextSpanned?.takeIfNotBlank()
+ ?: it.localizedFlyoverSpanned?.takeIfNotBlank()
+ ?: it.localizedPrefixSpanned?.takeIfNotBlank()
+ }
?: emptyList()
}
+
+ private fun Spanned.takeIfNotBlank(): Spanned? = takeIf { it.isNotBlank() }
}
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 a29e0151e8..f0e9570535 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-2024 Google LLC
+ * Copyright 2023-2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.