Skip to content

Commit

Permalink
Show submit button in review mode. (#1826)
Browse files Browse the repository at this point in the history
* Show submit button in review mode

* Added tests

* Review comments: Updated the fragment result listener to check explicit result values
  • Loading branch information
aditya-07 committed Feb 6, 2023
1 parent 5f17993 commit fd6950d
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
)
}

Expand Down Expand Up @@ -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()
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<QuestionnaireFragment>(
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<Button>(R.id.review_mode_edit_button).visibility)
.isEqualTo(View.VISIBLE)
assertThat(view.findViewById<Button>(R.id.submit_questionnaire).visibility)
.isEqualTo(View.VISIBLE)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3294,6 +3294,8 @@ class QuestionnaireViewModelTest {
viewModel.setReviewMode(true)
assertThat(viewModel.questionnaireStateFlow.first().displayMode)
.isInstanceOf(DisplayMode.ReviewMode::class.java)
assertThat(viewModel.questionnaireStateFlow.first().displayMode)
.isEqualTo(DisplayMode.ReviewMode(showEditButton = true, showSubmitButton = true))
}
}

Expand Down

0 comments on commit fd6950d

Please sign in to comment.