Skip to content

Commit

Permalink
Refactor OptionSelectDialogFragment out of multi-select
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinmost committed Sep 28, 2021
1 parent 22dc506 commit 4063d8f
Show file tree
Hide file tree
Showing 16 changed files with 681 additions and 282 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest {
crossinline block: TestActivity.(QuestionnaireItemViewHolder) -> Unit
) {
rule.scenario.onActivity {
block(it, QuestionnaireItemMultiSelectViewHolderFactory.create(FrameLayout(it)))
block(it, QuestionnaireItemDialogSelectViewHolderFactory.create(FrameLayout(it)))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ internal enum class ItemControlTypes(
AUTO_COMPLETE("autocomplete", QuestionnaireItemViewHolderType.AUTO_COMPLETE),
CHECK_BOX("check-box", QuestionnaireItemViewHolderType.CHECK_BOX_GROUP),
DROP_DOWN("drop-down", QuestionnaireItemViewHolderType.DROP_DOWN),
MULTI_SELECT("multi-select", QuestionnaireItemViewHolderType.MULTI_SELECT),
OPEN_CHOICE("open-choice", QuestionnaireItemViewHolderType.DIALOG_SELECT),
RADIO_BUTTON("radio-button", QuestionnaireItemViewHolderType.RADIO_GROUP),
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.google.android.fhir.datacapture.views.QuestionnaireItemCheckBoxGroupV
import com.google.android.fhir.datacapture.views.QuestionnaireItemCheckBoxViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemDatePickerViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemDateTimePickerViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemDialogSelectViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemDisplayViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemDropDownViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextDecimalViewHolderFactory
Expand All @@ -32,7 +33,6 @@ import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextMultiL
import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextQuantityViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextSingleLineViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemGroupViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemMultiSelectViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemRadioGroupViewHolderFactory
import com.google.android.fhir.datacapture.views.QuestionnaireItemViewHolder
import com.google.android.fhir.datacapture.views.QuestionnaireItemViewItem
Expand Down Expand Up @@ -84,8 +84,8 @@ internal class QuestionnaireItemAdapter(
QuestionnaireItemCheckBoxGroupViewHolderFactory
QuestionnaireItemViewHolderType.AUTO_COMPLETE ->
QuestionnaireItemAutoCompleteViewHolderFactory
QuestionnaireItemViewHolderType.MULTI_SELECT ->
QuestionnaireItemMultiSelectViewHolderFactory
QuestionnaireItemViewHolderType.DIALOG_SELECT ->
QuestionnaireItemDialogSelectViewHolderFactory
}
return viewHolderFactory.create(parent)
}
Expand Down Expand Up @@ -125,7 +125,7 @@ internal class QuestionnaireItemAdapter(
QuestionnaireItemType.TEXT -> QuestionnaireItemViewHolderType.EDIT_TEXT_MULTI_LINE
QuestionnaireItemType.INTEGER -> QuestionnaireItemViewHolderType.EDIT_TEXT_INTEGER
QuestionnaireItemType.DECIMAL -> QuestionnaireItemViewHolderType.EDIT_TEXT_DECIMAL
QuestionnaireItemType.CHOICE -> getChoiceViewHolderType(questionnaireItem).viewHolderType
QuestionnaireItemType.CHOICE -> getChoiceViewHolderType(questionnaireItem)
QuestionnaireItemType.DISPLAY -> QuestionnaireItemViewHolderType.DISPLAY
QuestionnaireItemType.QUANTITY -> QuestionnaireItemViewHolderType.QUANTITY
else -> throw NotImplementedError("Question type $type not supported.")
Expand All @@ -134,17 +134,34 @@ internal class QuestionnaireItemAdapter(

private fun getChoiceViewHolderType(
questionnaireItem: Questionnaire.QuestionnaireItemComponent
): ItemControlTypes {
return questionnaireItem.itemControl
?: when {
questionnaireItem.repeats -> ItemControlTypes.CHECK_BOX
questionnaireItem.answerOption.size >= MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DROP_DOWN ->
ItemControlTypes.DROP_DOWN
else -> ItemControlTypes.RADIO_BUTTON
): QuestionnaireItemViewHolderType {
// Use the view type that the client wants if they specified an itemControl
return questionnaireItem.itemControl?.viewHolderType
// Otherwise, choose a sensible UI element automatically
?: run {
val numOptions = questionnaireItem.answerOption.size
when {
// Always use a dialog for questions with a large number of options
numOptions >= MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DIALOG ->
QuestionnaireItemViewHolderType.DIALOG_SELECT

// Use a check box group if repeated answers are permitted
questionnaireItem.repeats -> QuestionnaireItemViewHolderType.CHECK_BOX_GROUP

// Use a dropdown if there are a medium number of options
numOptions >= MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DROP_DOWN ->
QuestionnaireItemViewHolderType.DROP_DOWN

// Use a radio group only if there are a small number of options
else -> QuestionnaireItemViewHolderType.RADIO_GROUP
}
}
}

internal companion object {
// Choice questions are rendered as dialogs if they have at least this many options
const val MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DIALOG = 10

// Choice questions are rendered as radio group if number of options less than this constant
const val MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DROP_DOWN = 4
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ internal enum class QuestionnaireItemViewHolderType(val value: Int) {
QUANTITY(11),
CHECK_BOX_GROUP(12),
AUTO_COMPLETE(13),
MULTI_SELECT(14),
DIALOG_SELECT(14),
;

companion object {
Expand Down

This file was deleted.

Loading

0 comments on commit 4063d8f

Please sign in to comment.