diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireFragment.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireFragment.kt index 38cc2611f7..70a9c48a17 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireFragment.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireFragment.kt @@ -34,6 +34,7 @@ import com.google.android.fhir.datacapture.validation.Invalid import com.google.android.fhir.datacapture.views.QuestionnaireItemViewHolderFactory import com.google.android.material.progressindicator.LinearProgressIndicator import org.hl7.fhir.r4.model.Questionnaire +import timber.log.Timber /** * A [Fragment] for displaying FHIR Questionnaires and getting user responses as FHIR @@ -131,7 +132,7 @@ open class QuestionnaireFragment : Fragment() { questionnaireReviewRecyclerView.visibility = View.VISIBLE // Set button visibility - submitButton.visibility = View.GONE + submitButton.visibility = if (displayMode.showSubmitButton) View.VISIBLE else View.GONE reviewModeButton.visibility = View.GONE reviewModeEditButton.visibility = if (displayMode.showEditButton) { @@ -202,7 +203,21 @@ open class QuestionnaireFragment : Fragment() { requireActivity().supportFragmentManager.setFragmentResultListener( QuestionnaireValidationErrorMessageDialogFragment.RESULT_CALLBACK, viewLifecycleOwner - ) { _, _ -> setFragmentResult(SUBMIT_REQUEST_KEY, Bundle.EMPTY) } + ) { _, bundle -> + when (bundle[QuestionnaireValidationErrorMessageDialogFragment.RESULT_KEY]) { + QuestionnaireValidationErrorMessageDialogFragment.RESULT_VALUE_FIX -> { + // Go back to the Edit mode if currently in the Review mode. + viewModel.setReviewMode(false) + } + QuestionnaireValidationErrorMessageDialogFragment.RESULT_VALUE_SUBMIT -> { + setFragmentResult(SUBMIT_REQUEST_KEY, Bundle.EMPTY) + } + else -> + Timber.e( + "Unknown fragment result ${bundle[QuestionnaireValidationErrorMessageDialogFragment.RESULT_KEY]}" + ) + } + } } /** Calculates the progress percentage from given [count] and [totalCount] values. */ 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 580ea3521a..9f100614b5 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 @@ -24,6 +24,7 @@ import android.widget.TextView import androidx.annotation.VisibleForTesting import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.res.use +import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResult @@ -51,10 +52,11 @@ internal class QuestionnaireValidationErrorMessageDialogFragment( return MaterialAlertDialogBuilder(requireContext()) .setView(onCreateCustomView()) .setPositiveButton(R.string.questionnaire_validation_error_fix_button_text) { dialog, _ -> + setFragmentResult(RESULT_CALLBACK, bundleOf(RESULT_KEY to RESULT_VALUE_FIX)) dialog?.dismiss() } .setNegativeButton(R.string.questionnaire_validation_error_submit_button_text) { dialog, _ -> - setFragmentResult(RESULT_CALLBACK, Bundle.EMPTY) + setFragmentResult(RESULT_CALLBACK, bundleOf(RESULT_KEY to RESULT_VALUE_SUBMIT)) dialog?.dismiss() } .create() @@ -90,6 +92,9 @@ internal class QuestionnaireValidationErrorMessageDialogFragment( companion object { const val TAG = "QuestionnaireValidationErrorMessageDialogFragment" const val RESULT_CALLBACK = "QuestionnaireValidationResultCallback" + const val RESULT_KEY = "result" + const val RESULT_VALUE_FIX = "result_fix" + const val RESULT_VALUE_SUBMIT = "result_submit" } } 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 f4fb20e89e..b081c661c2 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 @@ -509,7 +509,11 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat if (isReadOnly || isInReviewModeFlow.value) { return QuestionnaireState( items = questionnaireItemViewItems, - displayMode = DisplayMode.ReviewMode(showEditButton = !isReadOnly) + displayMode = + DisplayMode.ReviewMode( + showEditButton = !isReadOnly, + showSubmitButton = !isReadOnly && shouldShowSubmitButton + ) ) } @@ -777,7 +781,7 @@ internal data class QuestionnaireState( internal sealed class DisplayMode { class EditMode(val pagination: QuestionnairePagination) : DisplayMode() - class ReviewMode(val showEditButton: Boolean) : DisplayMode() + data class ReviewMode(val showEditButton: Boolean, val showSubmitButton: Boolean) : DisplayMode() } /** diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireFragmentTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireFragmentTest.kt index 81ff9dbfc3..6204dc6394 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireFragmentTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireFragmentTest.kt @@ -17,13 +17,17 @@ package com.google.android.fhir.datacapture import android.os.Build +import android.view.View +import android.widget.Button import androidx.core.os.bundleOf import androidx.fragment.app.testing.launchFragmentInContainer import androidx.fragment.app.testing.withFragment import androidx.lifecycle.Lifecycle import ca.uhn.fhir.context.FhirContext import ca.uhn.fhir.context.FhirVersionEnum +import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_ENABLE_REVIEW_PAGE import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_QUESTIONNAIRE_JSON_STRING +import com.google.android.fhir.datacapture.QuestionnaireFragment.Companion.EXTRA_SHOW_REVIEW_PAGE_FIRST import com.google.common.truth.Truth.assertThat import org.hl7.fhir.r4.model.Questionnaire import org.junit.Test @@ -88,4 +92,34 @@ class QuestionnaireFragmentTest { assertThat(calculateProgressPercentage(count = 10, totalCount = 50)).isEqualTo(20) } } + + @Test + fun `review page should show both edit and submit button`() { + val questionnaire = + Questionnaire().apply { + id = "a-questionnaire" + addItem( + Questionnaire.QuestionnaireItemComponent().apply { + linkId = "a-link-id" + type = Questionnaire.QuestionnaireItemType.BOOLEAN + } + ) + } + val questionnaireJson = parser.encodeResourceToString(questionnaire) + val scenario = + launchFragmentInContainer( + bundleOf( + EXTRA_QUESTIONNAIRE_JSON_STRING to questionnaireJson, + EXTRA_ENABLE_REVIEW_PAGE to true, + EXTRA_SHOW_REVIEW_PAGE_FIRST to true + ) + ) + scenario.moveToState(Lifecycle.State.RESUMED) + val view = scenario.withFragment { requireView() } + + assertThat(view.findViewById