Skip to content

Commit b59acf2

Browse files
authored
Add dialog extension (#2663)
* Add lookup item control type * Use dialog extension instead of dialog item-control * Update comment * spotless * Revert lookup item control * Address review * Add dialog extension to the docs * Update extensions.md
1 parent 11ed6f0 commit b59acf2

File tree

5 files changed

+116
-45
lines changed

5 files changed

+116
-45
lines changed

catalog/src/main/assets/component_modal.json

+18-42
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22
"resourceType": "Questionnaire",
33
"item": [
44
{
5+
"extension": [
6+
{
7+
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
8+
"valueCodeableConcept": {
9+
"coding": [
10+
{
11+
"system": "http://hl7.org/fhir/questionnaire-item-control",
12+
"code": "check-box",
13+
"display": "Check Box"
14+
}
15+
],
16+
"text": "Check box"
17+
}
18+
},
19+
{
20+
"url": "https://github.com/google/android-fhir/StructureDefinition/dialog"
21+
}
22+
],
523
"linkId": "1.1",
624
"type": "choice",
725
"repeats": true,
@@ -44,48 +62,6 @@
4462
"code": "diarrhoea",
4563
"display": "Diarrhoea"
4664
}
47-
},
48-
{
49-
"valueCoding": {
50-
"code": "fever",
51-
"display": "Fever"
52-
}
53-
},
54-
{
55-
"valueCoding": {
56-
"code": "injury",
57-
"display": "Injury"
58-
}
59-
},
60-
{
61-
"valueCoding": {
62-
"code": "jaundice",
63-
"display": "Jaundice"
64-
}
65-
},
66-
{
67-
"valueCoding": {
68-
"code": "mental-health",
69-
"display": "Mental health"
70-
}
71-
},
72-
{
73-
"valueCoding": {
74-
"code": "nausea",
75-
"display": "Nausea"
76-
}
77-
},
78-
{
79-
"valueCoding": {
80-
"code": "pain",
81-
"display": "Pain"
82-
}
83-
},
84-
{
85-
"valueCoding": {
86-
"code": "bleeding",
87-
"display": "Bleeding"
88-
}
8965
}
9066
]
9167
}

datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapter.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.recyclerview.widget.RecyclerView
2525
import com.google.android.fhir.datacapture.contrib.views.PhoneNumberViewHolderFactory
2626
import com.google.android.fhir.datacapture.extensions.inflate
2727
import com.google.android.fhir.datacapture.extensions.itemControl
28+
import com.google.android.fhir.datacapture.extensions.shouldUseDialog
2829
import com.google.android.fhir.datacapture.views.NavigationViewHolder
2930
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
3031
import com.google.android.fhir.datacapture.views.factories.AttachmentViewHolderFactory
@@ -241,8 +242,11 @@ internal class QuestionnaireEditAdapter(
241242
): QuestionnaireViewHolderType {
242243
val questionnaireItem = questionnaireViewItem.questionnaireItem
243244

244-
// Use the view type that the client wants if they specified an itemControl
245-
return questionnaireItem.itemControl?.viewHolderType
245+
// Use the view type that the client wants if they specified an itemControl or dialog extension
246+
return when {
247+
questionnaireItem.shouldUseDialog -> QuestionnaireViewHolderType.DIALOG_SELECT
248+
else -> questionnaireItem.itemControl?.viewHolderType
249+
}
246250
// Otherwise, choose a sensible UI element automatically
247251
?: run {
248252
val numOptions = questionnaireViewItem.enabledAnswerOptions.size

datacapture/src/main/java/com/google/android/fhir/datacapture/extensions/MoreQuestionnaireItemComponents.kt

+12
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ internal const val EXTENSION_ITEM_CONTROL_URL_ANDROID_FHIR =
6161
internal const val EXTENSION_ITEM_CONTROL_SYSTEM_ANDROID_FHIR =
6262
"https://github.com/google/android-fhir/questionnaire-item-control"
6363

64+
internal const val EXTENSION_DIALOG_URL_ANDROID_FHIR =
65+
"https://github.com/google/android-fhir/StructureDefinition/dialog"
66+
6467
internal enum class StyleUrl(val url: String) {
6568
BASE("https://github.com/google/android-fhir/tree/master/datacapture/android-style"),
6669
PREFIX_TEXT_VIEW("prefix_text_view"),
@@ -237,6 +240,15 @@ val QuestionnaireItemComponent.itemControlCode: String?
237240
val QuestionnaireItemComponent.itemControl: ItemControlTypes?
238241
get() = ItemControlTypes.values().firstOrNull { it.extensionCode == itemControlCode }
239242

243+
private val QuestionnaireItemComponent.hasDialogExtension: Boolean
244+
get() = this.extension.any { it.url == EXTENSION_DIALOG_URL_ANDROID_FHIR }
245+
246+
val QuestionnaireItemComponent.shouldUseDialog: Boolean
247+
get() =
248+
this.hasDialogExtension &&
249+
(this.itemControl?.viewHolderType == QuestionnaireViewHolderType.CHECK_BOX_GROUP ||
250+
this.itemControl?.viewHolderType == QuestionnaireViewHolderType.RADIO_GROUP)
251+
240252
/**
241253
* The desired orientation for the list of choices.
242254
*

datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireEditAdapterTest.kt

+77
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.google.android.fhir.datacapture
1919
import android.os.Build
2020
import android.widget.FrameLayout
2121
import androidx.test.core.app.ApplicationProvider
22+
import com.google.android.fhir.datacapture.extensions.EXTENSION_DIALOG_URL_ANDROID_FHIR
2223
import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_CONTROL_SYSTEM
2324
import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_CONTROL_SYSTEM_ANDROID_FHIR
2425
import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_CONTROL_URL
@@ -496,6 +497,82 @@ class QuestionnaireEditAdapterTest {
496497
.isEqualTo(QuestionnaireViewHolderType.DROP_DOWN.value)
497498
}
498499

500+
@Test
501+
fun `getItemViewType() with radio button and dialog extension should return dialog select view holder type`() {
502+
val questionnaireEditAdapter = QuestionnaireEditAdapter()
503+
val questionnaireItem =
504+
Questionnaire.QuestionnaireItemComponent().setType(Questionnaire.QuestionnaireItemType.CHOICE)
505+
questionnaireItem.apply {
506+
addExtension(
507+
Extension()
508+
.setUrl(EXTENSION_ITEM_CONTROL_URL)
509+
.setValue(
510+
CodeableConcept()
511+
.addCoding(
512+
Coding()
513+
.setCode(ItemControlTypes.RADIO_BUTTON.extensionCode)
514+
.setDisplay("Radio Button")
515+
.setSystem(EXTENSION_ITEM_CONTROL_SYSTEM),
516+
),
517+
),
518+
)
519+
addExtension(Extension().setUrl(EXTENSION_DIALOG_URL_ANDROID_FHIR))
520+
}
521+
questionnaireEditAdapter.submitList(
522+
listOf(
523+
QuestionnaireAdapterItem.Question(
524+
QuestionnaireViewItem(
525+
questionnaireItem,
526+
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
527+
validationResult = NotValidated,
528+
answersChangedCallback = { _, _, _, _ -> },
529+
),
530+
),
531+
),
532+
)
533+
534+
assertThat(questionnaireEditAdapter.getItemViewType(0))
535+
.isEqualTo(QuestionnaireViewHolderType.DIALOG_SELECT.value)
536+
}
537+
538+
@Test
539+
fun `getItemViewType() with check box and dialog extension should return dialog select view holder type`() {
540+
val questionnaireEditAdapter = QuestionnaireEditAdapter()
541+
val questionnaireItem =
542+
Questionnaire.QuestionnaireItemComponent().setType(Questionnaire.QuestionnaireItemType.CHOICE)
543+
questionnaireItem.apply {
544+
addExtension(
545+
Extension()
546+
.setUrl(EXTENSION_ITEM_CONTROL_URL)
547+
.setValue(
548+
CodeableConcept()
549+
.addCoding(
550+
Coding()
551+
.setCode(ItemControlTypes.CHECK_BOX.extensionCode)
552+
.setDisplay("Check Box")
553+
.setSystem(EXTENSION_ITEM_CONTROL_SYSTEM),
554+
),
555+
),
556+
)
557+
addExtension(Extension().setUrl(EXTENSION_DIALOG_URL_ANDROID_FHIR))
558+
}
559+
questionnaireEditAdapter.submitList(
560+
listOf(
561+
QuestionnaireAdapterItem.Question(
562+
QuestionnaireViewItem(
563+
questionnaireItem,
564+
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
565+
validationResult = NotValidated,
566+
answersChangedCallback = { _, _, _, _ -> },
567+
),
568+
),
569+
),
570+
)
571+
572+
assertThat(questionnaireEditAdapter.getItemViewType(0))
573+
.isEqualTo(QuestionnaireViewHolderType.DIALOG_SELECT.value)
574+
}
575+
499576
// TODO: test errors thrown for unsupported types
500577

501578
@Test

docs/use/extensions.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22

33
This page lists [FHIR Extensions](http://hl7.org/fhir/extensibility.html) defined by the Android FHIR SDK.
44

5-
* UUID
5+
* Dialog extension (https://github.com/google/android-fhir/StructureDefinition/dialog)
6+
7+
This extension can only be used if the questionnaire item type is `choice` and has an item-control of type `check-box` or `radio-button`.

0 commit comments

Comments
 (0)