From 5b8782477609bee1f36137447b2a246c8391343d Mon Sep 17 00:00:00 2001 From: Aditya Khajuria Date: Wed, 18 May 2022 14:28:43 +0530 Subject: [PATCH 1/5] Refactor Auto complete widget --- .../assets/auto_complete_questionnaire.json | 84 +++++++++ .../fhir/catalog/ComponentListViewModel.kt | 5 + catalog/src/main/res/values/strings.xml | 1 + ...nnaireItemAutoCompleteViewHolderFactory.kt | 166 ++++-------------- ...aire_item_edit_text_auto_complete_view.xml | 66 ++++--- datacapture/src/main/res/values/dimens.xml | 3 +- ...reItemAutoCompleteViewHolderFactoryTest.kt | 16 +- 7 files changed, 171 insertions(+), 170 deletions(-) create mode 100644 catalog/src/main/assets/auto_complete_questionnaire.json diff --git a/catalog/src/main/assets/auto_complete_questionnaire.json b/catalog/src/main/assets/auto_complete_questionnaire.json new file mode 100644 index 0000000000..8be48de3b9 --- /dev/null +++ b/catalog/src/main/assets/auto_complete_questionnaire.json @@ -0,0 +1,84 @@ +{ + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire|2.7" + ] + }, + "status": "draft", + "resourceType": "Questionnaire", + "item": [ + { + "type": "choice", + "code": [], + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/questionnaire-item-control", + "code": "autocomplete", + "display": "Auto-complete" + } + ], + "text": "Auto-complete" + } + } + ], + "required": true, + "repeats": true, + "linkId": "1", + "text": "Do you have any existing conditions", + "answerOption": [ + { + "valueCoding": { + "code": "asthma", + "display": "Asthma" + } + }, + { + "valueCoding": { + "code": "copd", + "display": "Chronic Lung Disease" + } + }, + { + "valueCoding": { + "code": "depression", + "display": "Depression" + } + }, + { + "valueCoding": { + "code": "t2dm", + "display": "Diabetes" + } + }, + { + "valueCoding": { + "code": "hypertension", + "display": "Hypertension" + } + }, + { + "valueCoding": { + "code": "hypertension", + "display": "High Blood Pressure" + } + }, + { + "valueCoding": { + "code": "hypercholesterolaemia", + "display": "High Cholesterol" + } + } + ], + "initial": { + "valueCoding": { + "code": "asthma", + "display": "Asthma" + } + } + } + ] +} diff --git a/catalog/src/main/java/com/google/android/fhir/catalog/ComponentListViewModel.kt b/catalog/src/main/java/com/google/android/fhir/catalog/ComponentListViewModel.kt index c5f89ac281..97f43500ab 100644 --- a/catalog/src/main/java/com/google/android/fhir/catalog/ComponentListViewModel.kt +++ b/catalog/src/main/java/com/google/android/fhir/catalog/ComponentListViewModel.kt @@ -77,5 +77,10 @@ class ComponentListViewModel(application: Application, private val state: SavedS ), SLIDER(R.drawable.ic_slider, R.string.component_name_slider, "slider_questionnaire.json"), IMAGE(R.drawable.ic_image, R.string.component_name_image, ""), + AUTO_COMPLETE( + R.drawable.ic_textfield, + R.string.component_name_auto_complete, + "auto_complete_questionnaire.json" + ), } } diff --git a/catalog/src/main/res/values/strings.xml b/catalog/src/main/res/values/strings.xml index 9f33de96d6..3331dcf1a4 100644 --- a/catalog/src/main/res/values/strings.xml +++ b/catalog/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ Slider Dropdown Image + Auto Complete Default Paginated Review diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt index 1b0bdba3b9..3833de0929 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt @@ -16,27 +16,19 @@ package com.google.android.fhir.datacapture.views -import android.content.Context -import android.text.Editable -import android.text.TextWatcher -import android.view.KeyEvent import android.view.View -import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager import android.widget.AdapterView import android.widget.ArrayAdapter -import androidx.appcompat.widget.AppCompatAutoCompleteTextView -import androidx.core.content.ContextCompat import androidx.core.view.children import androidx.core.view.get +import androidx.core.view.isEmpty import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.displayString import com.google.android.fhir.datacapture.validation.ValidationResult import com.google.android.fhir.datacapture.validation.getSingleStringValidationMessage -import com.google.android.flexbox.FlexboxLayout import com.google.android.material.chip.Chip -import com.google.android.material.shape.MaterialShapeDrawable -import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.chip.ChipGroup +import com.google.android.material.textfield.MaterialAutoCompleteTextView import com.google.android.material.textfield.TextInputLayout import org.hl7.fhir.r4.model.QuestionnaireResponse @@ -46,18 +38,9 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : override fun getQuestionnaireItemViewHolderDelegate() = object : QuestionnaireItemViewHolderDelegate { private lateinit var header: QuestionnaireItemHeaderView + private lateinit var autoCompleteTextView: MaterialAutoCompleteTextView + private lateinit var chipContainer: ChipGroup private lateinit var textInputLayout: TextInputLayout - private lateinit var autoCompleteTextView: AppCompatAutoCompleteTextView - - /** - * This view is a container that contains the selected answers as Chip(View) and the EditText - * that is used to enter the answer query. Current logic in this class expects the EditText to - * be always there in the FlexboxLayout as its last child. Any new answer Chip is added as a - * Child before the EditText - */ - private lateinit var chipContainer: FlexboxLayout - private lateinit var editText: TextInputEditText - private val canHaveMultipleAnswers get() = questionnaireItemViewItem.questionnaireItem.repeats override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem @@ -65,11 +48,8 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : override fun init(itemView: View) { header = itemView.findViewById(R.id.header) autoCompleteTextView = itemView.findViewById(R.id.autoCompleteTextView) - chipContainer = itemView.findViewById(R.id.flexboxLayout) + chipContainer = itemView.findViewById(R.id.chipContainer) textInputLayout = itemView.findViewById(R.id.text_input_layout) - editText = itemView.findViewById(R.id.text_input_edit_text) - - autoCompleteTextView.dropDownAnchor = textInputLayout.editText!!.id autoCompleteTextView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ -> val answer = @@ -84,51 +64,7 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : onAnswerSelected(answer) autoCompleteTextView.setText("") - editText.setText("") - } - - editText.setOnKeyListener { _, _, event -> - if (event != null && - event.action == KeyEvent.ACTION_DOWN && - event.keyCode == KeyEvent.KEYCODE_DEL - ) { - /** Check [chipContainer] on how children are laid out. */ - if (editText.length() == 0 && chipContainer.childCount > 1) { - val chip = chipContainer.getChildAt(chipContainer.childCount - 2) as Chip - chipContainer.removeView(chip) - onChipRemoved(chip) - } - } - false - } - - chipContainer.background = textInputLayout.editText!!.background - editText.onFocusChangeListener = - View.OnFocusChangeListener { view, hasFocus -> - updateContainerBorder(hasFocus) - if (!hasFocus) { - autoCompleteTextView.setText("") - editText.setText("") - (view.context.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as - InputMethodManager) - .hideSoftInputFromWindow(view.windowToken, 0) - } - } - - editText.addTextChangedListener( - object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} - - override fun afterTextChanged(s: Editable?) { - if (!autoCompleteTextView.isPopupShowing) { - autoCompleteTextView.showDropDown() - } - autoCompleteTextView.setText(s.toString(), true) - } } - ) } override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { @@ -137,18 +73,13 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : val answerOptionString = questionnaireItemViewItem.answerOption.map { it.displayString } val adapter = ArrayAdapter( - chipContainer.context, + header.context, R.layout.questionnaire_item_drop_down_list, answerOptionString ) autoCompleteTextView.setAdapter(adapter) - /** - * Remove chips as this FlexBox might contain chips from the last time bindView was called - * for this VH. Check [chipContainer] on how children are laid out. - */ - val textBox = chipContainer.getChildAt(chipContainer.childCount - 1) + // Remove chips if any from the last bindView call on this VH. chipContainer.removeAllViews() - chipContainer.addView(textBox) presetValuesIfAny() } @@ -159,8 +90,8 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : } override fun setReadOnly(isReadOnly: Boolean) { - for (i in 0 until chipContainer.flexItemCount) { - val view = chipContainer.getFlexItemAt(i) + for (i in 0 until chipContainer.childCount) { + val view = chipContainer.getChildAt(i) view.isEnabled = !isReadOnly if (view is Chip && isReadOnly) { view.setOnCloseIconClickListener(null) @@ -179,18 +110,9 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : answer: QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent ) { if (canHaveMultipleAnswers) { - val answerNotPresent = - questionnaireItemViewItem.questionnaireResponseItem.answer?.none { - it.value.equalsDeep(answer.value) - } - ?: false - if (answerNotPresent) { - addNewChipIfNotPresent(answer) - questionnaireItemViewItem.addAnswer(answer) - } + handleSelectionWhenQuestionCanHaveMultipleAnswers(answer) } else { - replaceChip(answer) - questionnaireItemViewItem.singleAnswerOrNull = answer + handleSelectionWhenQuestionCanHaveSingleAnswer(answer) } onAnswerChanged(autoCompleteTextView.context) } @@ -206,77 +128,67 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : if (chipIsAlreadyPresent(answer)) return false val chip = Chip(chipContainer.context, null, R.attr.chipStyleQuestionnaire) + chip.id = View.generateViewId() chip.text = answer.valueCoding.display chip.isCloseIconVisible = true chip.isClickable = true chip.isCheckable = false - chip.setTag(R.id.flexboxLayout, answer) - - chipContainer.addView(chip, chipContainer.childCount - 1) + chip.tag = answer chip.setOnCloseIconClickListener { chipContainer.removeView(chip) onChipRemoved(chip) } - (chip.layoutParams as ViewGroup.MarginLayoutParams).marginEnd = - chipContainer.context.resources.getDimension(R.dimen.auto_complete_item_gap).toInt() + chipContainer.addView(chip) return true } private fun chipIsAlreadyPresent( answer: QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent ): Boolean { - return chipContainer.children.any { view -> - (view is Chip) && - (view.getTag(R.id.flexboxLayout) as - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent) - .value.equalsDeep(answer.value) + return chipContainer.children.any { chip -> + (chip.tag as QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent).value + .equalsDeep(answer.value) } } - private fun replaceChip( + private fun handleSelectionWhenQuestionCanHaveSingleAnswer( answer: QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent ) { - if (chipContainer.childCount == 1) { + if (chipContainer.isEmpty()) { addNewChipIfNotPresent(answer) } else { (chipContainer[0] as Chip).apply { text = answer.valueCoding.display - setTag(R.id.flexboxLayout, answer) + tag = answer } } + questionnaireItemViewItem.singleAnswerOrNull = answer + } + + private fun handleSelectionWhenQuestionCanHaveMultipleAnswers( + answer: QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent + ) { + val answerNotPresent = + questionnaireItemViewItem.questionnaireResponseItem.answer?.none { + it.value.equalsDeep(answer.value) + } == true + + if (answerNotPresent) { + addNewChipIfNotPresent(answer) + questionnaireItemViewItem.addAnswer(answer) + } } private fun onChipRemoved(chip: Chip) { if (canHaveMultipleAnswers) { - val answer = - chip.getTag(R.id.flexboxLayout) as - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent - questionnaireItemViewItem.removeAnswer(answer) + (chip.tag as QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent).let { + questionnaireItemViewItem.removeAnswer(it) + } } else { questionnaireItemViewItem.singleAnswerOrNull = null } onAnswerChanged(autoCompleteTextView.context) } - - private fun updateContainerBorder(hasFocus: Boolean) { - (chipContainer.background as MaterialShapeDrawable).apply { - setStroke( - if (hasFocus) { - textInputLayout.boxStrokeWidthFocused.toFloat() - } else { - textInputLayout.boxStrokeWidth.toFloat() - }, - if (hasFocus) { - textInputLayout.boxStrokeColor - } else { - ContextCompat.getColor( - textInputLayout.context, - com.google.android.material.R.color.mtrl_textinput_default_box_stroke_color - ) - } - ) - } - } } } diff --git a/datacapture/src/main/res/layout/questionnaire_item_edit_text_auto_complete_view.xml b/datacapture/src/main/res/layout/questionnaire_item_edit_text_auto_complete_view.xml index 48b75c9b3f..63e0a97b0f 100644 --- a/datacapture/src/main/res/layout/questionnaire_item_edit_text_auto_complete_view.xml +++ b/datacapture/src/main/res/layout/questionnaire_item_edit_text_auto_complete_view.xml @@ -16,7 +16,6 @@ --> - - - + - - - - - + + + diff --git a/datacapture/src/main/res/values/dimens.xml b/datacapture/src/main/res/values/dimens.xml index db7e639162..d7e957f12b 100644 --- a/datacapture/src/main/res/values/dimens.xml +++ b/datacapture/src/main/res/values/dimens.xml @@ -22,7 +22,6 @@ 16dp 10dp 5dp - 1dp 8dp 64dp 12dp @@ -43,4 +42,6 @@ 8dp 4dp 14sp + 10dp + 50dp diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt index bc05398b98..1199fc2f5e 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt @@ -16,12 +16,12 @@ package com.google.android.fhir.datacapture.views -import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView import androidx.core.view.get import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.displayString +import com.google.android.material.chip.ChipGroup import com.google.android.material.textfield.TextInputLayout import com.google.common.truth.Truth.assertThat import org.hl7.fhir.r4.model.Coding @@ -78,8 +78,8 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { } ) - assertThat(viewHolder.itemView.findViewById(R.id.flexboxLayout).childCount) - .isEqualTo(2) + assertThat(viewHolder.itemView.findViewById(R.id.chipContainer).childCount) + .isEqualTo(1) } @Test @@ -119,8 +119,8 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { } ) - assertThat(viewHolder.itemView.findViewById(R.id.flexboxLayout).childCount) - .isEqualTo(3) + assertThat(viewHolder.itemView.findViewById(R.id.chipContainer).childCount) + .isEqualTo(2) } @Test @@ -153,8 +153,8 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { } ) - assertThat(viewHolder.itemView.findViewById(R.id.flexboxLayout).childCount) - .isEqualTo(2) + assertThat(viewHolder.itemView.findViewById(R.id.chipContainer).childCount) + .isEqualTo(1) } @Test @@ -218,7 +218,7 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { } ) - assertThat(viewHolder.itemView.findViewById(R.id.flexboxLayout)[0].isEnabled) + assertThat(viewHolder.itemView.findViewById(R.id.chipContainer)[0].isEnabled) .isFalse() } } From 118cbee6cc4ee1f3fde866989f45c7af8d23d5d1 Mon Sep 17 00:00:00 2001 From: Aditya Khajuria Date: Wed, 18 May 2022 15:05:50 +0530 Subject: [PATCH 2/5] Removed FlexBox layout gradle dependency --- buildSrc/src/main/kotlin/Dependencies.kt | 2 -- datacapture/build.gradle.kts | 1 - 2 files changed, 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index f06cae9418..aad5f596e1 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -132,7 +132,6 @@ object Dependencies { } const val androidJunitRunner = "androidx.test.runner.AndroidJUnitRunner" - const val flexBox = "com.google.android.flexbox:flexbox:${Versions.flexBox}" const val junit = "junit:junit:${Versions.junit}" const val mockitoKotlin = "org.mockito.kotlin:mockito-kotlin:${Versions.mockitoKotlin}" const val mockitoInline = "org.mockito:mockito-inline:${Versions.mockitoInline}" @@ -172,7 +171,6 @@ object Dependencies { const val androidFhirCommon = "0.1.0-alpha03" const val desugarJdkLibs = "1.1.5" const val fhirUcum = "1.0.3" - const val flexBox = "3.0.0" const val guava = "28.2-android" const val hapiFhir = "5.4.0" const val http = "4.9.1" diff --git a/datacapture/build.gradle.kts b/datacapture/build.gradle.kts index 0ecf77b2c0..45f519738c 100644 --- a/datacapture/build.gradle.kts +++ b/datacapture/build.gradle.kts @@ -98,7 +98,6 @@ dependencies { implementation(Dependencies.Kotlin.stdlib) implementation(Dependencies.Lifecycle.viewModelKtx) implementation(Dependencies.material) - implementation(Dependencies.flexBox) implementation(Dependencies.barcodeScanning) implementation(Dependencies.lifecycleExtensions) implementation(Dependencies.objectDetection) From c756e943ec49c1948dd0df1abc297a407187e47d Mon Sep 17 00:00:00 2001 From: Aditya Khajuria Date: Thu, 19 May 2022 16:31:21 +0530 Subject: [PATCH 3/5] Review change, show error message --- ...estionnaireItemAutoCompleteViewHolderFactory.kt | 14 +++++++++++--- ...onnaireItemAutoCompleteViewHolderFactoryTest.kt | 9 ++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt index 3833de0929..c34be411ca 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactory.kt @@ -19,6 +19,7 @@ package com.google.android.fhir.datacapture.views import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter +import android.widget.TextView import androidx.core.view.children import androidx.core.view.get import androidx.core.view.isEmpty @@ -44,12 +45,14 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : private val canHaveMultipleAnswers get() = questionnaireItemViewItem.questionnaireItem.repeats override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem + private lateinit var errorTextView: TextView override fun init(itemView: View) { header = itemView.findViewById(R.id.header) autoCompleteTextView = itemView.findViewById(R.id.autoCompleteTextView) chipContainer = itemView.findViewById(R.id.chipContainer) textInputLayout = itemView.findViewById(R.id.text_input_layout) + errorTextView = itemView.findViewById(R.id.error) autoCompleteTextView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ -> val answer = @@ -84,9 +87,14 @@ internal object QuestionnaireItemAutoCompleteViewHolderFactory : } override fun displayValidationResult(validationResult: ValidationResult) { - textInputLayout.error = - if (validationResult.getSingleStringValidationMessage() == "") null - else validationResult.getSingleStringValidationMessage() + // https://github.com/material-components/material-components-android/issues/1435 + // Because of the above issue, we use separate error textview. But we still use + // textInputLayout to show the error icon and the box color. + validationResult.getSingleStringValidationMessage().let { + errorTextView.text = it + errorTextView.visibility = if (it.isEmpty()) View.GONE else View.VISIBLE + textInputLayout.error = if (it.isEmpty()) null else " " // non empty text + } } override fun setReadOnly(isReadOnly: Boolean) { diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt index 1199fc2f5e..1013382dc6 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt @@ -16,6 +16,7 @@ package com.google.android.fhir.datacapture.views +import android.view.View import android.widget.FrameLayout import android.widget.TextView import androidx.core.view.get @@ -166,8 +167,12 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + assertThat(viewHolder.itemView.findViewById(R.id.error).visibility) + .isEqualTo(View.VISIBLE) + assertThat(viewHolder.itemView.findViewById(R.id.error).text) .isEqualTo("Missing answer for required field.") + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isNotNull() } @Test @@ -192,6 +197,8 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { ) {} ) + assertThat(viewHolder.itemView.findViewById(R.id.error).visibility) + .isEqualTo(View.GONE) assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) .isNull() } From e911dc290ebbb589f1118803f895bf14627bda6e Mon Sep 17 00:00:00 2001 From: Aditya Khajuria Date: Wed, 25 May 2022 17:23:38 +0530 Subject: [PATCH 4/5] Fixed failing test --- .../QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt index 41f83f397a..14fcc43ccd 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt @@ -170,8 +170,12 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + assertThat(viewHolder.itemView.findViewById(R.id.error).visibility) + .isEqualTo(View.VISIBLE) + assertThat(viewHolder.itemView.findViewById(R.id.error).text) .isEqualTo("Missing answer for required field.") + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isNotNull() } @Test @@ -276,4 +280,4 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { assertThat(viewHolder.itemView.findViewById(R.id.chipContainer)[0].isEnabled) .isFalse() } -} \ No newline at end of file +} From 3811cedd40f96e40b713c1749b4fc86dfff08966 Mon Sep 17 00:00:00 2001 From: Aditya Khajuria Date: Wed, 29 Jun 2022 14:18:31 +0530 Subject: [PATCH 5/5] Fixed failing tests --- .../views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt index 14fcc43ccd..96504b2785 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryTest.kt @@ -39,7 +39,7 @@ import org.robolectric.RuntimeEnvironment class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { private val parent = FrameLayout( - RuntimeEnvironment.getApplication().apply { setTheme(R.style.Theme_MaterialComponents) } + RuntimeEnvironment.getApplication().apply { setTheme(R.style.Theme_Material3_DayNight) } ) private val viewHolder = QuestionnaireItemAutoCompleteViewHolderFactory.create(parent)