Skip to content

Commit 21a0cf0

Browse files
committed
Incorporated review feedback
1 parent f2e1b95 commit 21a0cf0

6 files changed

Lines changed: 40 additions & 45 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ data class DataCaptureConfig(
5959

6060
/**
6161
* A [CustomCallback] may be set by the client to override the behaviour of an existing component
62-
* in the sdc. Currently only supports [CustomCallbackType.AUTO_COMPLETE].
62+
* in the sdc.
6363
*/
64-
var callbacks: Map<CustomCallbackType, CustomCallback>? = null,
64+
var callback: CustomCallback<*>? = null,
6565
) {
6666

6767
/**

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import com.google.android.fhir.datacapture.extensions.shouldUseDialog
2929
import com.google.android.fhir.datacapture.views.NavigationViewHolder
3030
import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
3131
import com.google.android.fhir.datacapture.views.factories.AttachmentViewHolderFactory
32-
import com.google.android.fhir.datacapture.views.factories.AutoCompleteViewAnswerOption
3332
import com.google.android.fhir.datacapture.views.factories.AutoCompleteViewHolderFactory
3433
import com.google.android.fhir.datacapture.views.factories.BooleanChoiceViewHolderFactory
3534
import com.google.android.fhir.datacapture.views.factories.CheckBoxGroupViewHolderFactory
@@ -393,11 +392,4 @@ internal object DiffCallbacks {
393392
}
394393
}
395394

396-
sealed class CustomCallback {
397-
data class AutoCompleteCallback(val callback: (String) -> List<AutoCompleteViewAnswerOption>) :
398-
CustomCallback()
399-
}
400-
401-
enum class CustomCallbackType {
402-
AUTO_COMPLETE,
403-
}
395+
typealias CustomCallback<T> = (String, String) -> List<T>

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat
9696
DataCapture.getConfiguration(application).valueSetResolverExternal
9797
}
9898

99-
private val callbacks: Map<CustomCallbackType, CustomCallback>? by lazy {
100-
DataCapture.getConfiguration(application).callbacks
99+
private val callback: CustomCallback<*>? by lazy {
100+
DataCapture.getConfiguration(application).callback
101101
}
102102

103103
/** The current questionnaire as questions are being answered. */
@@ -989,7 +989,7 @@ internal class QuestionnaireViewModel(application: Application, state: SavedStat
989989
),
990990
isHelpCardOpen = isHelpCard && isHelpCardOpen,
991991
helpCardStateChangedCallback = helpCardStateChangedCallback,
992-
callbacks = callbacks,
992+
callback = callback,
993993
),
994994
)
995995
add(question)

datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireViewItem.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import android.content.Context
2020
import android.text.Spanned
2121
import androidx.recyclerview.widget.RecyclerView
2222
import com.google.android.fhir.datacapture.CustomCallback
23-
import com.google.android.fhir.datacapture.CustomCallbackType
2423
import com.google.android.fhir.datacapture.R
2524
import com.google.android.fhir.datacapture.extensions.displayString
2625
import com.google.android.fhir.datacapture.extensions.isHelpCode
@@ -95,7 +94,7 @@ data class QuestionnaireViewItem(
9594
val helpCardStateChangedCallback: (Boolean, QuestionnaireResponseItemComponent) -> Unit =
9695
{ _, _ ->
9796
},
98-
val callbacks: Map<CustomCallbackType, CustomCallback>? = null,
97+
val callback: CustomCallback<*>? = null,
9998
) {
10099

101100
fun getQuestionnaireResponseItem(): QuestionnaireResponseItemComponent = questionnaireResponseItem

datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactory.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import androidx.core.view.get
3030
import androidx.core.view.isEmpty
3131
import androidx.lifecycle.lifecycleScope
3232
import com.google.android.fhir.datacapture.CustomCallback
33-
import com.google.android.fhir.datacapture.CustomCallbackType
3433
import com.google.android.fhir.datacapture.R
3534
import com.google.android.fhir.datacapture.extensions.displayString
3635
import com.google.android.fhir.datacapture.extensions.identifierString
@@ -64,11 +63,8 @@ internal object AutoCompleteViewHolderFactory :
6463
private val canHaveMultipleAnswers
6564
get() = questionnaireViewItem.questionnaireItem.repeats
6665

67-
private val callback: ((String) -> List<AutoCompleteViewAnswerOption>)?
68-
get() =
69-
(questionnaireViewItem.callbacks?.get(CustomCallbackType.AUTO_COMPLETE)
70-
as? CustomCallback.AutoCompleteCallback)
71-
?.callback
66+
private val callback: CustomCallback<*>?
67+
get() = questionnaireViewItem.callback
7268

7369
override lateinit var questionnaireViewItem: QuestionnaireViewItem
7470
private lateinit var errorTextView: TextView
@@ -102,6 +98,7 @@ internal object AutoCompleteViewHolderFactory :
10298
textViewResourceId = R.id.answer_option_textview,
10399
objects = answerOptionValues,
104100
callback = callback,
101+
answerValueSet = questionnaireViewItem.questionnaireItem.answerValueSet,
105102
)
106103
autoCompleteTextView.setAdapter(adapter)
107104
// Remove chips if any from the last bindView call on this VH.
@@ -286,7 +283,8 @@ internal class AutoCompleteArrayAdapter(
286283
val resource: Int,
287284
val textViewResourceId: Int,
288285
private val objects: List<AutoCompleteViewAnswerOption>,
289-
private val callback: ((String) -> List<AutoCompleteViewAnswerOption>)? = null,
286+
private val callback: CustomCallback<*>? = null,
287+
private val answerValueSet: String? = null,
290288
) : ArrayAdapter<AutoCompleteViewAnswerOption>(context, resource, textViewResourceId, objects) {
291289

292290
private var items = listOf<AutoCompleteViewAnswerOption>()
@@ -311,13 +309,18 @@ internal class AutoCompleteArrayAdapter(
311309

312310
override fun getItem(position: Int): AutoCompleteViewAnswerOption? = items.getOrNull(position)
313311

312+
@Suppress("UNCHECKED_CAST")
314313
override fun getFilter(): Filter {
315314
return object : Filter() {
316315
override fun performFiltering(constraint: CharSequence?): FilterResults {
317316
val query = (constraint?.toString() ?: "").trim()
318317
val filteredResults: List<AutoCompleteViewAnswerOption> =
319-
if (callback != null && objects.isEmpty()) {
320-
callback.invoke(query)
318+
if (callback != null && answerValueSet != null && objects.isEmpty()) {
319+
(callback as? CustomCallback<AutoCompleteViewAnswerOption>)?.invoke(
320+
query,
321+
answerValueSet,
322+
)
323+
?: emptyList()
321324
} else {
322325
objects.filter { it.answerDisplay.contains(query, ignoreCase = true) }
323326
}

datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/AutoCompleteViewHolderFactoryTest.kt

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import android.widget.FrameLayout
2222
import android.widget.TextView
2323
import androidx.appcompat.app.AppCompatActivity
2424
import androidx.core.view.get
25-
import com.google.android.fhir.datacapture.CustomCallback.AutoCompleteCallback
26-
import com.google.android.fhir.datacapture.CustomCallbackType
2725
import com.google.android.fhir.datacapture.R
2826
import com.google.android.fhir.datacapture.extensions.displayString
2927
import com.google.android.fhir.datacapture.extensions.identifierString
@@ -36,6 +34,7 @@ import com.google.android.material.chip.Chip
3634
import com.google.android.material.chip.ChipGroup
3735
import com.google.android.material.textfield.TextInputLayout
3836
import com.google.common.truth.Truth.assertThat
37+
import kotlin.test.assertEquals
3938
import kotlin.test.assertNotNull
4039
import org.hl7.fhir.r4.model.Coding
4140
import org.hl7.fhir.r4.model.Questionnaire
@@ -472,36 +471,38 @@ class AutoCompleteViewHolderFactoryTest {
472471

473472
@Test
474473
fun givenCustomCallback_thenDisplayCallbackResponse() {
474+
val testAnswerVS = "testAnswerValueSet"
475+
val testQuery = "t2"
476+
475477
viewHolder.bind(
476478
QuestionnaireViewItem(
477-
Questionnaire.QuestionnaireItemComponent().apply { text = "Question" },
479+
Questionnaire.QuestionnaireItemComponent().apply {
480+
text = "Question"
481+
answerValueSet = testAnswerVS
482+
},
478483
QuestionnaireResponse.QuestionnaireResponseItemComponent(),
479484
validationResult = NotValidated,
480485
answersChangedCallback = { _, _, _, _ -> },
481486
questionViewTextConfiguration = QuestionTextConfiguration(showOptionalText = false),
482-
callbacks =
483-
mapOf(
484-
Pair(
485-
CustomCallbackType.AUTO_COMPLETE,
486-
AutoCompleteCallback(
487-
callback = { _ ->
488-
run {
489-
listOf(
490-
AutoCompleteViewAnswerOption("a", "Answer A"),
491-
AutoCompleteViewAnswerOption("b", "Answer B"),
492-
)
493-
}
494-
},
495-
),
496-
),
497-
),
487+
callback = { query, uri ->
488+
assertNotNull(query)
489+
assertNotNull(uri)
490+
assertEquals(query, testQuery)
491+
assertEquals(uri, testAnswerVS)
492+
run {
493+
listOf(
494+
AutoCompleteViewAnswerOption("a", "Answer A"),
495+
AutoCompleteViewAnswerOption("b", "Answer B"),
496+
)
497+
}
498+
},
498499
),
499500
)
500501

501502
val autoCompleteTextView =
502503
viewHolder.itemView.findViewById<AutoCompleteTextView>(R.id.autoCompleteTextView)
503504

504-
autoCompleteTextView.setText("t2")
505+
autoCompleteTextView.setText(testQuery)
505506
val adapter = autoCompleteTextView.adapter
506507
assertNotNull(adapter)
507508
assertThat(adapter.count).isEqualTo(2)

0 commit comments

Comments
 (0)