diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt index 613c094e4a..b199a6a9cd 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireViewModel.kt @@ -606,7 +606,8 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat // Determine the validation result, which will be displayed on the item itself val validationResult = if (modifiedQuestionnaireResponseItemSet.contains(questionnaireResponseItem) || - forceValidation + forceValidation || + isInReviewModeFlow.value ) { QuestionnaireResponseItemValidator.validate( questionnaireItem, diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreHeaderViews.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreHeaderViews.kt new file mode 100644 index 0000000000..a0e80f273c --- /dev/null +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreHeaderViews.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.fhir.datacapture.extensions + +import android.text.Spanned +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.Button +import android.widget.TextView +import com.google.android.fhir.datacapture.hasHelpButton +import com.google.android.fhir.datacapture.localizedHelpSpanned +import com.google.android.material.card.MaterialCardView +import org.hl7.fhir.r4.model.Questionnaire + +internal fun TextView.updateTextAndVisibility(localizedText: Spanned? = null) { + text = localizedText + visibility = + if (localizedText.isNullOrEmpty()) { + GONE + } else { + VISIBLE + } +} + +/** Returns [VISIBLE] if any of the [view] is visible, [GONE] otherwise. */ +internal fun getHeaderViewVisibility(vararg view: TextView): Int { + if (view.any { it.visibility == VISIBLE }) { + return VISIBLE + } + return GONE +} + +/** + * Initializes the text for [helpTextView] with instructions on how to use the feature, and sets the + * visibility and click listener for the [helpButton] to allow users to access the help information + * and toggles the visibility for view [helpCardView]. + */ +internal fun initHelpViews( + helpButton: Button, + helpCardView: MaterialCardView, + helpTextView: TextView, + questionnaireItem: Questionnaire.QuestionnaireItemComponent +) { + helpButton.visibility = + if (questionnaireItem.hasHelpButton) { + VISIBLE + } else { + GONE + } + helpButton.setOnClickListener { + helpCardView.visibility = + when (helpCardView.visibility) { + VISIBLE -> GONE + else -> VISIBLE + } + } + helpTextView.updateTextAndVisibility(questionnaireItem.localizedHelpSpanned) +} diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/GroupHeaderView.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/GroupHeaderView.kt index f507c0340a..b149345343 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/GroupHeaderView.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/GroupHeaderView.kt @@ -22,6 +22,9 @@ import android.view.LayoutInflater import android.widget.LinearLayout import android.widget.TextView import com.google.android.fhir.datacapture.R +import com.google.android.fhir.datacapture.extensions.getHeaderViewVisibility +import com.google.android.fhir.datacapture.extensions.initHelpViews +import com.google.android.fhir.datacapture.extensions.updateTextAndVisibility import com.google.android.fhir.datacapture.localizedInstructionsSpanned import com.google.android.fhir.datacapture.localizedPrefixSpanned import com.google.android.fhir.datacapture.localizedTextSpanned @@ -38,10 +41,15 @@ internal class GroupHeaderView(context: Context, attrs: AttributeSet?) : val prefix = findViewById(R.id.prefix) val question = findViewById(R.id.question) val hint = findViewById(R.id.hint) - initHelpButton(this, questionnaireItem) + initHelpViews( + helpButton = findViewById(R.id.helpButton), + helpCardView = findViewById(R.id.helpCardView), + helpTextView = findViewById(R.id.helpText), + questionnaireItem + ) prefix.updateTextAndVisibility(questionnaireItem.localizedPrefixSpanned) question.updateTextAndVisibility(questionnaireItem.localizedTextSpanned) hint.updateTextAndVisibility(questionnaireItem.localizedInstructionsSpanned) - visibility = getViewGroupVisibility(prefix, question, hint) + visibility = getHeaderViewVisibility(prefix, question, hint) } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/HeaderView.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/HeaderView.kt index bc7cc984d2..79fef23e70 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/HeaderView.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/HeaderView.kt @@ -17,22 +17,17 @@ package com.google.android.fhir.datacapture.views import android.content.Context -import android.text.Spanned import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View -import android.view.View.GONE -import android.view.View.VISIBLE -import android.widget.Button import android.widget.LinearLayout import android.widget.TextView import com.google.android.fhir.datacapture.R -import com.google.android.fhir.datacapture.hasHelpButton -import com.google.android.fhir.datacapture.localizedHelpSpanned +import com.google.android.fhir.datacapture.extensions.getHeaderViewVisibility +import com.google.android.fhir.datacapture.extensions.initHelpViews +import com.google.android.fhir.datacapture.extensions.updateTextAndVisibility 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.material.card.MaterialCardView import org.hl7.fhir.r4.model.Questionnaire /** View for the prefix, question, and hint of a questionnaire item. */ @@ -51,10 +46,15 @@ internal class HeaderView(context: Context, attrs: AttributeSet?) : LinearLayout prefix.updateTextAndVisibility(questionnaireItem.localizedPrefixSpanned) question.updateTextAndVisibility(questionnaireItem.localizedTextSpanned) hint.updateTextAndVisibility(questionnaireItem.localizedInstructionsSpanned) - initHelpButton(this, questionnaireItem) + initHelpViews( + helpButton = findViewById(R.id.helpButton), + helpCardView = findViewById(R.id.helpCardView), + helpTextView = findViewById(R.id.helpText), + questionnaireItem + ) // Make the entire view GONE if there is nothing to show. This is to avoid an empty row in the // questionnaire. - visibility = getViewGroupVisibility(prefix, question, hint) + visibility = getHeaderViewVisibility(prefix, question, hint) } /** @@ -74,49 +74,3 @@ internal class HeaderView(context: Context, attrs: AttributeSet?) : LinearLayout errorTextView.text = errorText } } - -internal fun TextView.updateTextAndVisibility(localizedText: Spanned? = null) { - text = localizedText - visibility = - if (localizedText.isNullOrEmpty()) { - GONE - } else { - VISIBLE - } -} - -/** Returns [VISIBLE] if any of the [view] is visible, else returns [GONE]. */ -internal fun getViewGroupVisibility(vararg view: TextView): Int { - if (view.any { it.visibility == VISIBLE }) { - return VISIBLE - } - return GONE -} - -internal fun initHelpButton( - view: View, - questionnaireItem: Questionnaire.QuestionnaireItemComponent -) { - val helpButton = view.findViewById