Skip to content

Commit

Permalink
SDC: Allow Typing to filter for Dropdown component (#1722)
Browse files Browse the repository at this point in the history
* Removed inputType=none to allow typing in questionnaire_item_drop_down_view.xml. Handled the inputs in QuestionnaireItemDropDownViewHolderFactory.kt

* Added tests to assert the number of items in the menu for different scenarios

Co-authored-by: Omar Ismail <[email protected]>
  • Loading branch information
nsabale7 and omarismail94 committed Dec 2, 2022
1 parent 8acbeb3 commit cb13ade
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import android.widget.FrameLayout
import android.widget.TextView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers.isPlatformPopup
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
Expand All @@ -32,6 +33,7 @@ import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.TestActivity
import com.google.android.fhir.datacapture.utilities.showDropDown
import com.google.android.fhir.datacapture.validation.NotValidated
import com.google.android.material.textfield.MaterialAutoCompleteTextView
import com.google.common.truth.Truth.assertThat
import org.hl7.fhir.r4.model.Coding
import org.hl7.fhir.r4.model.Questionnaire
Expand Down Expand Up @@ -119,6 +121,67 @@ class QuestionnaireItemDropDownViewHolderFactoryEspressoTest {
assertThat((answerHolder!!.single().value as StringType).valueAsString).isEqualTo("Coding 1")
}

@Test
fun shouldReturnNonFilteredDropDownMenuItems() {
val questionnaireItemViewItem =
QuestionnaireItemViewItem(
answerOptionsValueString("Coding 1", "Coding 2", "Coding 3", "Add", "Subtract"),
responseValueStringOptions(),
validationResult = NotValidated,
answersChangedCallback = { _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireItemViewItem) }

onView(withId(R.id.auto_complete)).perform(showDropDown())
assertThat(
viewHolder.itemView
.findViewById<MaterialAutoCompleteTextView>(R.id.auto_complete)
.adapter.count
)
.isEqualTo(6) // +1 cause of '-' menu item
}
@Test
fun shouldReturnFilteredDropDownMenuItems() {
val questionnaireItemViewItem =
QuestionnaireItemViewItem(
answerOptionsValueString("Coding 1", "Coding 2", "Coding 3", "Add", "Subtract"),
responseValueStringOptions(),
validationResult = NotValidated,
answersChangedCallback = { _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireItemViewItem) }

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(typeText("Coding"))
assertThat(
viewHolder.itemView
.findViewById<MaterialAutoCompleteTextView>(R.id.auto_complete)
.adapter.count
)
.isEqualTo(3)
}

@Test
fun shouldReturnFilteredWithNoResultsDropDownMenuItems() {
val questionnaireItemViewItem =
QuestionnaireItemViewItem(
answerOptionsValueString("Coding 1", "Coding 2", "Coding 3", "Add", "Subtract"),
responseValueStringOptions(),
validationResult = NotValidated,
answersChangedCallback = { _, _, _ -> },
)
runOnUI { viewHolder.bind(questionnaireItemViewItem) }

onView(withId(R.id.auto_complete)).perform(showDropDown())
onView(withId(R.id.auto_complete)).perform(typeText("Division"))
assertThat(
viewHolder.itemView
.findViewById<MaterialAutoCompleteTextView>(R.id.auto_complete)
.adapter.count
)
.isEqualTo(0)
}

/** Method to run code snippet on UI/main thread */
private fun runOnUI(action: () -> Unit) {
activityScenarioRule.scenario.onActivity { action() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ import android.content.Context
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.AutoCompleteTextView
import com.google.android.fhir.datacapture.R
import com.google.android.fhir.datacapture.displayString
import com.google.android.fhir.datacapture.localizedFlyoverSpanned
import com.google.android.fhir.datacapture.validation.Invalid
import com.google.android.fhir.datacapture.validation.NotValidated
import com.google.android.fhir.datacapture.validation.Valid
import com.google.android.fhir.datacapture.validation.ValidationResult
import com.google.android.material.textfield.MaterialAutoCompleteTextView
import com.google.android.material.textfield.TextInputLayout
import org.hl7.fhir.r4.model.QuestionnaireResponse

Expand All @@ -37,7 +37,7 @@ internal object QuestionnaireItemDropDownViewHolderFactory :
object : QuestionnaireItemViewHolderDelegate {
private lateinit var header: QuestionnaireItemHeaderView
private lateinit var textInputLayout: TextInputLayout
private lateinit var autoCompleteTextView: AutoCompleteTextView
private lateinit var autoCompleteTextView: MaterialAutoCompleteTextView
override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem
private lateinit var context: Context

Expand All @@ -57,18 +57,24 @@ internal object QuestionnaireItemDropDownViewHolderFactory :
answerOptionString.add(0, context.getString(R.string.hyphen))
val adapter =
ArrayAdapter(context, R.layout.questionnaire_item_drop_down_list, answerOptionString)
autoCompleteTextView.setText(
questionnaireItemViewItem.answers.singleOrNull()?.displayString(header.context) ?: ""
)
questionnaireItemViewItem.answers.singleOrNull()?.displayString(header.context)?.let {
autoCompleteTextView.setText(it)
autoCompleteTextView.setSelection(it.length)
}
autoCompleteTextView.setAdapter(adapter)
autoCompleteTextView.onItemClickListener =
AdapterView.OnItemClickListener { _, _, position, _ ->
if (position == 0) {
val selectedAnswer =
questionnaireItemViewItem.answerOption
.firstOrNull { it.displayString == autoCompleteTextView.adapter.getItem(position) }
?.value

if (selectedAnswer == null) {
questionnaireItemViewItem.clearAnswer()
} else {
questionnaireItemViewItem.setAnswer(
QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()
.setValue(questionnaireItemViewItem.answerOption[position - 1].value)
.setValue(selectedAnswer)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,11 @@
android:layout_height="wrap_content"
>

<AutoCompleteTextView
<com.google.android.material.textfield.MaterialAutoCompleteTextView
style="?attr/questionnaireDropDownSelectedTextStyle"
android:id="@+id/auto_complete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
/>

</com.google.android.material.textfield.TextInputLayout>
Expand Down

0 comments on commit cb13ade

Please sign in to comment.