From 3b7908297b4f8eb3a276458027719586218a5055 Mon Sep 17 00:00:00 2001 From: aurangzaib umer Date: Tue, 1 Feb 2022 14:55:58 +0500 Subject: [PATCH 01/34] [1001] removed validation from bind --- .../views/QuestionnaireItemEditTextViewHolderFactory.kt | 4 +++- .../datacapture/views/QuestionnaireItemViewHolderFactory.kt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index aab81863fa..cb6168767d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -70,7 +70,9 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( prefixTextView.visibility = View.GONE } questionTextView.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned - textInputEditText.setText(getText(questionnaireItemViewItem.singleAnswerOrNull)) + questionnaireItemViewItem.singleAnswerOrNull?.let { + textInputEditText.setText(getText(it)) + } textInputEditText.setOnFocusChangeListener { view, focused -> if (!focused) { (view.context.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index 09c5e05d41..608c1d6c14 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -62,7 +62,7 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) - delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) + //delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } From eeaa4850f2ef43b00b6b2f101e863db29508bd48 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 2 Feb 2022 12:57:33 +0500 Subject: [PATCH 02/34] issue [1001] removed validation from bind view of list --- .../fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index 608c1d6c14..b653829da9 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -62,7 +62,6 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) - //delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } From 1b27b5598e873ad7561d9c18a39367fad3b0a49e Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 2 Feb 2022 18:34:41 +0500 Subject: [PATCH 03/34] spotless ran --- .../views/QuestionnaireItemEditTextViewHolderFactory.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index cb6168767d..1a6f4de393 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -70,9 +70,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( prefixTextView.visibility = View.GONE } questionTextView.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned - questionnaireItemViewItem.singleAnswerOrNull?.let { - textInputEditText.setText(getText(it)) - } + questionnaireItemViewItem.singleAnswerOrNull?.let { textInputEditText.setText(getText(it)) } textInputEditText.setOnFocusChangeListener { view, focused -> if (!focused) { (view.context.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as From 978e20589af8455e0595d376f2fdc29d0ac051f1 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 8 Feb 2022 18:52:59 +0500 Subject: [PATCH 04/34] added new implementation and fixed test cases --- ...ReaderViewHolderFactoryInstrumentedTest.kt | 3 ++- .../datacapture/views/BaseInstrumentedTest.kt | 26 +++++++++++++++++++ ...mpleteViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...xGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...isplayViewHolderFactoryInstrumentedTest.kt | 2 +- ...opDownViewHolderFactoryInstrumentedTest.kt | 2 +- ...ecimalViewHolderFactoryInstrumentedTest.kt | 7 ++++- ...ntegerViewHolderFactoryInstrumentedTest.kt | 7 ++++- ...tiLineViewHolderFactoryInstrumentedTest.kt | 7 ++++- ...antityViewHolderFactoryInstrumentedTest.kt | 4 +-- ...leLineViewHolderFactoryInstrumentedTest.kt | 8 +++++- ...mGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...ultiSelectHolderFactoryInstrumentedTest.kt | 2 +- ...oGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...SliderViewHolderFactoryInstrumentedTest.kt | 2 +- .../fhir/datacapture/DataCaptureConfig.kt | 22 ++++++++++++++++ .../QuestionnaireItemViewHolderFactory.kt | 8 ++++++ 20 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt index ff01aec863..34b56a7b6d 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt @@ -24,6 +24,7 @@ import androidx.test.annotation.UiThreadTest import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.google.android.fhir.datacapture.R +import com.google.android.fhir.datacapture.views.BaseInstrumentedTest import com.google.android.fhir.datacapture.views.QuestionnaireItemViewHolder import com.google.android.fhir.datacapture.views.QuestionnaireItemViewItem import com.google.common.truth.Truth @@ -35,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest { +class QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt new file mode 100644 index 0000000000..2e0d173699 --- /dev/null +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.fhir.datacapture.views + +import com.google.android.fhir.datacapture.QuestionnaireConfig + +open class BaseInstrumentedTest { + + init { + QuestionnaireConfig.init(QuestionnaireConfig(true)) + } +} diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index 96e1fc763d..85cd00a722 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -38,7 +38,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { +class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 302891661c..8cc7ac7529 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { +class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index 033bf95edb..086440a94a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { +class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt index 0238cfa690..55f9fc343f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest { +class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index 101c735d7f..119c0c048a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { +class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt index de7f2ea0cd..7121500419 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt @@ -32,7 +32,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest { +class QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index f3cd105a09..8c3cb73ea3 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -38,7 +38,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { +class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt index c9ff325498..8c47441829 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest { +class QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder @@ -137,6 +137,11 @@ class QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = DecimalType() + } + ) ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt index 8771c3b22d..ce99c27cc3 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt @@ -35,7 +35,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest { +class QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder @@ -136,6 +136,11 @@ class QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = IntegerType() + } + ) ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt index 44424c4366..ca322402bd 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest { +class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder @@ -137,6 +137,11 @@ class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = StringType() + } + ) ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index b633ad5565..7ec363a665 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { +class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout @@ -149,7 +149,7 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { .text .toString() ) - .isEqualTo("") + .isEqualTo("5") } @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index c7bd80b2f2..74f86eaac5 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,8 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { +class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest : + BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder @@ -135,6 +136,11 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = StringType("") + } + ) ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index 11b93d3b50..49df7109aa 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { +class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt index 80c7ca464b..6dc4a85d0a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest { +class QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest : BaseInstrumentedTest() { @get:Rule val rule = activityScenarioRule() @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index b5403bb846..328e2fccb9 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { +class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt index ded8a3bd62..fef492530a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { +class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt index cb09a131bf..b0674b3f13 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt @@ -74,3 +74,25 @@ data class DataCaptureConfig( interface ExternalAnswerValueSetResolver { suspend fun resolve(uri: String): List } + +open class QuestionnaireConfig(var shouldLoadValidationOnStart: Boolean) { + + companion object { + private lateinit var config: QuestionnaireConfig + + fun init(questionnaireConfig: QuestionnaireConfig) { + if (!::config.isInitialized) { + config = questionnaireConfig + } + } + + fun getInstance(): QuestionnaireConfig { + if (!::config.isInitialized) { + init(DefaultQuestionnaireConfig()) + } + return config + } + } +} + +class DefaultQuestionnaireConfig : QuestionnaireConfig(false) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index b653829da9..66a6941089 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView +import com.google.android.fhir.datacapture.QuestionnaireConfig import com.google.android.fhir.datacapture.validation.QuestionnaireResponseItemValidator import com.google.android.fhir.datacapture.validation.ValidationResult @@ -62,6 +63,9 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) + if (delegate.shouldValidateOnStart()) { + delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) + } } } @@ -94,6 +98,10 @@ interface QuestionnaireItemViewHolderDelegate { /** Sets view read only if [isReadOnly] is true. */ fun setReadOnly(isReadOnly: Boolean) + fun shouldValidateOnStart(): Boolean { + return QuestionnaireConfig.getInstance().shouldLoadValidationOnStart + } + /** * Runs validation to display the correct message and calls the * questionnaireResponseChangedCallback From 38db22dcdda389ee759c0d287a41419ab1edd26e Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 15 Feb 2022 11:24:04 +0500 Subject: [PATCH 05/34] implementation changed --- .../datacapture/views/BaseInstrumentedTest.kt | 9 +------- .../fhir/datacapture/DataCaptureConfig.kt | 23 +++---------------- .../QuestionnaireItemViewHolderFactory.kt | 8 +++---- 3 files changed, 8 insertions(+), 32 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt index 2e0d173699..276ecfb30b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt @@ -16,11 +16,4 @@ package com.google.android.fhir.datacapture.views -import com.google.android.fhir.datacapture.QuestionnaireConfig - -open class BaseInstrumentedTest { - - init { - QuestionnaireConfig.init(QuestionnaireConfig(true)) - } -} +open class BaseInstrumentedTest diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt index b0674b3f13..7e35dbe4a8 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt @@ -44,7 +44,8 @@ data class DataCaptureConfig( * should try to include the smallest [NpmPackage] possible that contains only the resources * needed by [StructureMap]s used by the client app. */ - var npmPackage: NpmPackage? = null + var npmPackage: NpmPackage? = null, + var questionnaireConfig: QuestionnaireConfig = DefaultQuestionnaireConfig() ) { internal val simpleWorkerContext: SimpleWorkerContext by lazy { @@ -75,24 +76,6 @@ interface ExternalAnswerValueSetResolver { suspend fun resolve(uri: String): List } -open class QuestionnaireConfig(var shouldLoadValidationOnStart: Boolean) { - - companion object { - private lateinit var config: QuestionnaireConfig - - fun init(questionnaireConfig: QuestionnaireConfig) { - if (!::config.isInitialized) { - config = questionnaireConfig - } - } - - fun getInstance(): QuestionnaireConfig { - if (!::config.isInitialized) { - init(DefaultQuestionnaireConfig()) - } - return config - } - } -} +open class QuestionnaireConfig(var shouldLoadValidationOnStart: Boolean) class DefaultQuestionnaireConfig : QuestionnaireConfig(false) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index 66a6941089..d7458defb8 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -22,7 +22,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView -import com.google.android.fhir.datacapture.QuestionnaireConfig +import com.google.android.fhir.datacapture.DataCapture import com.google.android.fhir.datacapture.validation.QuestionnaireResponseItemValidator import com.google.android.fhir.datacapture.validation.ValidationResult @@ -63,7 +63,7 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) - if (delegate.shouldValidateOnStart()) { + if (delegate.shouldValidateOnStart(itemView.context)) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } @@ -98,8 +98,8 @@ interface QuestionnaireItemViewHolderDelegate { /** Sets view read only if [isReadOnly] is true. */ fun setReadOnly(isReadOnly: Boolean) - fun shouldValidateOnStart(): Boolean { - return QuestionnaireConfig.getInstance().shouldLoadValidationOnStart + fun shouldValidateOnStart(context: Context): Boolean { + return DataCapture.getConfiguration(context).questionnaireConfig.shouldLoadValidationOnStart } /** From 49f66bfdd4f5eaf86d24c8d44b0a42c0f9d3814f Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 21 Feb 2022 11:19:43 +0500 Subject: [PATCH 06/34] test case fixed --- .../fhir/datacapture/views/BaseInstrumentedTest.kt | 11 ++++++++++- ...itTextQuantityViewHolderFactoryInstrumentedTest.kt | 9 +++++++-- .../google/android/fhir/datacapture/DataCapture.kt | 5 ++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt index 276ecfb30b..1fcc46aa3d 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt @@ -16,4 +16,13 @@ package com.google.android.fhir.datacapture.views -open class BaseInstrumentedTest +import com.google.android.fhir.datacapture.DataCapture +import com.google.android.fhir.datacapture.DataCaptureConfig +import com.google.android.fhir.datacapture.QuestionnaireConfig + +open class BaseInstrumentedTest { + + init { + DataCapture.configuration = DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) + } +} diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 7ec363a665..0fc8e97084 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -139,7 +139,12 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest : BaseI QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = Quantity() + } + ) ) + {} ) assertThat( @@ -149,7 +154,7 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest : BaseI .text .toString() ) - .isEqualTo("5") + .isEqualTo("") } @Test diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt index c9bbfd778d..ba6a409f67 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt @@ -17,10 +17,13 @@ package com.google.android.fhir.datacapture import android.content.Context +import androidx.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting.PRIVATE /** Stores config and global state of the Structured Data Capture Library. */ internal object DataCapture { - private lateinit var configuration: DataCaptureConfig + @VisibleForTesting(otherwise = PRIVATE) + internal lateinit var configuration: DataCaptureConfig /** * If client has set a configuration by implementing [DataCaptureConfig.Provider], then it returns From 4952c7c15e0421474703aa3056c0b6abcb702674 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 21 Feb 2022 11:31:11 +0500 Subject: [PATCH 07/34] spotless checks fixed --- .../android/fhir/datacapture/views/BaseInstrumentedTest.kt | 6 +++--- ...ItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt | 4 ++-- .../java/com/google/android/fhir/datacapture/DataCapture.kt | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt index 1fcc46aa3d..484c381de6 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt @@ -22,7 +22,7 @@ import com.google.android.fhir.datacapture.QuestionnaireConfig open class BaseInstrumentedTest { - init { - DataCapture.configuration = DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) - } + init { + DataCapture.configuration = DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) + } } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 0fc8e97084..52d9b0251c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -143,8 +143,8 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest : BaseI QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { value = Quantity() } - ) ) - {} + ) + ) {} ) assertThat( diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt index ba6a409f67..68f6f39e4d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt @@ -22,8 +22,7 @@ import androidx.annotation.VisibleForTesting.PRIVATE /** Stores config and global state of the Structured Data Capture Library. */ internal object DataCapture { - @VisibleForTesting(otherwise = PRIVATE) - internal lateinit var configuration: DataCaptureConfig + @VisibleForTesting(otherwise = PRIVATE) internal lateinit var configuration: DataCaptureConfig /** * If client has set a configuration by implementing [DataCaptureConfig.Provider], then it returns From 505cc9da2f944ff29854add52ce35d51a344f50f Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 21 Feb 2022 21:28:31 +0500 Subject: [PATCH 08/34] test case fixed --- buildSrc/src/main/kotlin/Dependencies.kt | 2 ++ datacapture/build.gradle.kts | 2 +- ...aCaptureInstrumentationTestApplication.kt} | 16 +++++---- .../fhir/datacapture/DataCaptureTestRunner.kt | 36 +++++++++++++++++++ ...NumberViewHolderFactoryInstrumentedTest.kt | 5 +++ ...ReaderViewHolderFactoryInstrumentedTest.kt | 3 +- ...mpleteViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...xGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...PickerViewHolderFactoryInstrumentedTest.kt | 2 +- ...isplayViewHolderFactoryInstrumentedTest.kt | 2 +- ...opDownViewHolderFactoryInstrumentedTest.kt | 2 +- ...ecimalViewHolderFactoryInstrumentedTest.kt | 2 +- ...ntegerViewHolderFactoryInstrumentedTest.kt | 2 +- ...tiLineViewHolderFactoryInstrumentedTest.kt | 2 +- ...antityViewHolderFactoryInstrumentedTest.kt | 2 +- ...leLineViewHolderFactoryInstrumentedTest.kt | 3 +- ...mGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...ultiSelectHolderFactoryInstrumentedTest.kt | 2 +- ...oGroupViewHolderFactoryInstrumentedTest.kt | 2 +- ...SliderViewHolderFactoryInstrumentedTest.kt | 2 +- 22 files changed, 70 insertions(+), 27 deletions(-) rename datacapture/src/androidTest/java/com/google/android/fhir/datacapture/{views/BaseInstrumentedTest.kt => DataCaptureInstrumentationTestApplication.kt} (60%) create mode 100644 datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 95294f141f..eb748b5d6c 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -131,6 +131,8 @@ object Dependencies { } const val androidJunitRunner = "androidx.test.runner.AndroidJUnitRunner" + const val androidDataCaptureTestRunner = + "com.google.android.fhir.datacapture.DataCaptureTestRunner" 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}" diff --git a/datacapture/build.gradle.kts b/datacapture/build.gradle.kts index ed3420dd2b..637942c6bb 100644 --- a/datacapture/build.gradle.kts +++ b/datacapture/build.gradle.kts @@ -40,7 +40,7 @@ android { defaultConfig { minSdk = Sdk.minSdk targetSdk = Sdk.targetSdk - testInstrumentationRunner = Dependencies.androidJunitRunner + testInstrumentationRunner = Dependencies.androidDataCaptureTestRunner // Need to specify this to prevent junit runner from going deep into our dependencies testInstrumentationRunnerArguments["package"] = "com.google.android.fhir.datacapture" } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt similarity index 60% rename from datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt rename to datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt index 484c381de6..41552887f4 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/BaseInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt @@ -14,15 +14,17 @@ * limitations under the License. */ -package com.google.android.fhir.datacapture.views +package com.google.android.fhir.datacapture -import com.google.android.fhir.datacapture.DataCapture -import com.google.android.fhir.datacapture.DataCaptureConfig -import com.google.android.fhir.datacapture.QuestionnaireConfig +import android.app.Application -open class BaseInstrumentedTest { +class DataCaptureInstrumentationTestApplication : Application(), DataCaptureConfig.Provider { - init { - DataCapture.configuration = DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) + private val dataCaptureConfiguration by lazy { + DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) + } + + override fun getDataCaptureConfig(): DataCaptureConfig { + return dataCaptureConfiguration } } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt new file mode 100644 index 0000000000..74f2cf0a8b --- /dev/null +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.fhir.datacapture + +import android.app.Application +import android.content.Context +import androidx.test.runner.AndroidJUnitRunner + +class DataCaptureTestRunner : AndroidJUnitRunner() { + @Throws(Exception::class) + override fun newApplication( + cl: ClassLoader?, + className: String?, + context: Context? + ): Application { + return super.newApplication( + cl, + DataCaptureInstrumentationTestApplication::class.java.name, + context + ) + } +} diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt index d9e0b25c22..05b5e81981 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt @@ -147,6 +147,11 @@ class QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() + .addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = StringType() + } + ) ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt index eda9e8b87e..c0bc8d351c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/barcode/QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest.kt @@ -24,7 +24,6 @@ import androidx.test.annotation.UiThreadTest import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.google.android.fhir.datacapture.R -import com.google.android.fhir.datacapture.views.BaseInstrumentedTest import com.google.android.fhir.datacapture.views.QuestionnaireItemViewHolder import com.google.android.fhir.datacapture.views.QuestionnaireItemViewItem import com.google.common.truth.Truth.assertThat @@ -36,7 +35,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemBarCodeReaderViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index 85cd00a722..96e1fc763d 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -38,7 +38,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { private lateinit var context: ContextWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 8cc7ac7529..302891661c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index 086440a94a..033bf95edb 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt index c8edb8ee4b..eda47796f4 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest.kt @@ -35,7 +35,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemDatePickerViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index 119c0c048a..101c735d7f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt index 7121500419..de7f2ea0cd 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest.kt @@ -32,7 +32,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemDisplayViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index 8c3cb73ea3..f3cd105a09 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -38,7 +38,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt index 8c47441829..b432b77fd7 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemEditTextDecimalViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt index ce99c27cc3..890b630e2c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest.kt @@ -35,7 +35,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemEditTextIntegerViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt index ca322402bd..e4a642bfa6 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 52d9b0251c..f19f12cb0d 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -36,7 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index 74f86eaac5..24ec8f3cd7 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -36,8 +36,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest : - BaseInstrumentedTest() { +class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index 49df7109aa..11b93d3b50 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt index 6dc4a85d0a..80c7ca464b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemMultiSelectHolderFactoryInstrumentedTest { @get:Rule val rule = activityScenarioRule() @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index 328e2fccb9..b5403bb846 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { private val parent = FrameLayout( ContextThemeWrapper( diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt index fef492530a..ded8a3bd62 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt @@ -34,7 +34,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest : BaseInstrumentedTest() { +class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { private lateinit var context: ContextThemeWrapper private lateinit var parent: FrameLayout private lateinit var viewHolder: QuestionnaireItemViewHolder From 1d5a948e324fb01ff499652e29f77e0a580dc0eb Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 22 Feb 2022 14:14:35 +0500 Subject: [PATCH 09/34] test case fixed --- .../java/com/google/android/fhir/datacapture/DataCapture.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt index 68f6f39e4d..c9bbfd778d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCapture.kt @@ -17,12 +17,10 @@ package com.google.android.fhir.datacapture import android.content.Context -import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE /** Stores config and global state of the Structured Data Capture Library. */ internal object DataCapture { - @VisibleForTesting(otherwise = PRIVATE) internal lateinit var configuration: DataCaptureConfig + private lateinit var configuration: DataCaptureConfig /** * If client has set a configuration by implementing [DataCaptureConfig.Provider], then it returns From 91c020de4b9e4acfd99d065f307ebd4290f40ea8 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Fri, 25 Feb 2022 21:09:17 +0500 Subject: [PATCH 10/34] WIP validation --- ...stionnaireItemEditTextViewHolderFactory.kt | 19 +- .../QuestionnaireItemViewHolderFactory.kt | 2 +- .../new-patient-registration-paginated.json | 750 ++++++++++++++++++ 3 files changed, 765 insertions(+), 6 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 1a6f4de393..892065a564 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -32,6 +32,7 @@ import com.google.android.fhir.datacapture.validation.getSingleStringValidationM import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import org.hl7.fhir.r4.model.QuestionnaireResponse +import timber.log.Timber internal abstract class QuestionnaireItemEditTextViewHolderFactory : QuestionnaireItemViewHolderFactory(R.layout.questionnaire_item_edit_text_view) { @@ -56,10 +57,6 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( textInputEditText = itemView.findViewById(R.id.text_input_edit_text) textInputEditText.setRawInputType(rawInputType) textInputEditText.isSingleLine = isSingleLine - textInputEditText.doAfterTextChanged { editable: Editable? -> - questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) - onAnswerChanged(textInputEditText.context) - } } override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { @@ -69,8 +66,16 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } else { prefixTextView.visibility = View.GONE } + textInputEditText.doAfterTextChanged {} questionTextView.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned - questionnaireItemViewItem.singleAnswerOrNull?.let { textInputEditText.setText(getText(it)) } + val answer = questionnaireItemViewItem.singleAnswerOrNull + if (answer == null) { + textInputEditText.setText("") + } else { + textInputEditText.setText(getText(answer)) + onAnswerChanged(textInputEditText.context) + } + textInputEditText.setOnFocusChangeListener { view, focused -> if (!focused) { (view.context.applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as @@ -88,6 +93,10 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } view.focusSearch(FOCUS_DOWN)?.requestFocus(FOCUS_DOWN) ?: false } + textInputEditText.doAfterTextChanged { editable: Editable? -> + questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) + onAnswerChanged(textInputEditText.context) + } } override fun displayValidationResult(validationResult: ValidationResult) { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index d7458defb8..ef0ad59581 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -63,7 +63,7 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) - if (delegate.shouldValidateOnStart(itemView.context)) { + if (delegate.questionnaireItemViewItem.questionnaireResponseItem.hasAnswer()) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index bab5ce498e..ce0a3a20a9 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -115,6 +115,756 @@ } ] }, + { + "linkId": "PR-name2", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name3", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name4", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name5", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name6", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name7", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name8", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name9", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name10", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name11", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, { "extension": [ From a8ebdb9e07b1cdf85ce820cfd6f50ad5786cba41 Mon Sep 17 00:00:00 2001 From: Jing Tang Date: Fri, 25 Feb 2022 16:54:16 +0000 Subject: [PATCH 11/34] wip --- .../validation/RequiredConstraintValidator.kt | 10 ++++++++++ ...onnaireItemEditTextStringViewHolderDelegate.kt | 15 ++++++++------- .../QuestionnaireItemEditTextViewHolderFactory.kt | 11 +++++++---- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt index e7974af075..e35c22faf2 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt @@ -33,6 +33,16 @@ internal object RequiredConstraintValidator : ConstraintValidator { context.getString(R.string.required_constraint_validation_error_msg) ) } + if (questionnaireResponseItem.answer.size == 1) { + if (questionnaireResponseItem.answer[0].hasValueStringType() && + questionnaireResponseItem.answer[0].valueStringType.value.isNullOrEmpty() + ) { + return ConstraintValidator.ConstraintValidationResult( + false, + context.getString(R.string.required_constraint_validation_error_msg) + ) + } + } return ConstraintValidator.ConstraintValidationResult(true, null) } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt index 85c53289db..91ccd8a58c 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt @@ -35,13 +35,14 @@ internal class QuestionnaireItemEditTextStringViewHolderDelegate(isSingleLine: B override fun getValue( text: String ): QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent? { - return text.let { - if (it.isEmpty()) { - null - } else { - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().setValue(StringType(it)) - } - } + // return text.let { + // if (it.isNullOrEmpty()) { + // null + // } else { + return QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent() + .setValue(StringType(text)) + // } + // } } override fun getText( diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 892065a564..b941c9b3d4 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -18,6 +18,7 @@ package com.google.android.fhir.datacapture.views import android.content.Context import android.text.Editable +import android.text.TextWatcher import android.view.View import android.view.View.FOCUS_DOWN import android.view.inputmethod.EditorInfo @@ -49,14 +50,13 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( private lateinit var textInputLayout: TextInputLayout private lateinit var textInputEditText: TextInputEditText override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem + private var textWatch : TextWatcher? = null override fun init(itemView: View) { prefixTextView = itemView.findViewById(R.id.prefix_text_view) questionTextView = itemView.findViewById(R.id.question_text_view) textInputLayout = itemView.findViewById(R.id.text_input_layout) textInputEditText = itemView.findViewById(R.id.text_input_edit_text) - textInputEditText.setRawInputType(rawInputType) - textInputEditText.isSingleLine = isSingleLine } override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { @@ -66,11 +66,14 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } else { prefixTextView.visibility = View.GONE } - textInputEditText.doAfterTextChanged {} + textInputEditText.removeTextChangedListener(textWatch) + textInputEditText.setRawInputType(rawInputType) + textInputEditText.isSingleLine = isSingleLine questionTextView.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned val answer = questionnaireItemViewItem.singleAnswerOrNull if (answer == null) { textInputEditText.setText("") + displayValidationResult(ValidationResult(true, listOf())) } else { textInputEditText.setText(getText(answer)) onAnswerChanged(textInputEditText.context) @@ -93,7 +96,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } view.focusSearch(FOCUS_DOWN)?.requestFocus(FOCUS_DOWN) ?: false } - textInputEditText.doAfterTextChanged { editable: Editable? -> + textWatch = textInputEditText.doAfterTextChanged { editable: Editable? -> questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) onAnswerChanged(textInputEditText.context) } From dd742250629bc372f710518fd3cd4c5e8b954abc Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 2 Mar 2022 01:31:27 +0500 Subject: [PATCH 12/34] completed discussed changes on request validator --- .../datacapture/common/datatype/MoreTypes.kt | 16 + .../validation/RequiredConstraintValidator.kt | 5 +- ...ireItemEditTextStringViewHolderDelegate.kt | 6 - ...stionnaireItemEditTextViewHolderFactory.kt | 12 +- .../new-patient-registration-paginated.json | 750 ------------------ 5 files changed, 24 insertions(+), 765 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt index 52e028e7f7..eca43346e0 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt @@ -17,6 +17,7 @@ package com.google.android.fhir.datacapture.common.datatype import org.hl7.fhir.r4.model.PrimitiveType +import org.hl7.fhir.r4.model.QuestionnaireResponse import org.hl7.fhir.r4.model.Type /** @@ -28,3 +29,18 @@ fun Type.asStringValue(): String { if (!isPrimitive) return "" return (this as PrimitiveType<*>).asStringValue() } + +fun QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent.isNotValid(): Boolean = + when { + hasValueStringType() && valueStringType.value.isNullOrEmpty() -> true + hasValueBooleanType() && valueBooleanType.isEmpty -> true + hasValueDecimalType() && valueDecimalType.isEmpty -> true + hasValueDateType() && valueDateType.isEmpty -> true + hasValueDateTimeType() && valueDateTimeType.isEmpty -> true + hasValueQuantity() && valueQuantity.isEmpty -> true + hasValueCoding() && valueCoding.isEmpty -> true + hasValue() && value.isEmpty -> true + hasValueUriType() && valueUriType.isEmpty -> true + hasValueAttachment() && valueAttachment.isEmpty -> true + else -> false + } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt index e35c22faf2..9e4b0bba34 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt @@ -18,6 +18,7 @@ package com.google.android.fhir.datacapture.validation import android.content.Context import com.google.android.fhir.datacapture.R +import com.google.android.fhir.datacapture.common.datatype.isNotValid import org.hl7.fhir.r4.model.Questionnaire import org.hl7.fhir.r4.model.QuestionnaireResponse @@ -34,9 +35,7 @@ internal object RequiredConstraintValidator : ConstraintValidator { ) } if (questionnaireResponseItem.answer.size == 1) { - if (questionnaireResponseItem.answer[0].hasValueStringType() && - questionnaireResponseItem.answer[0].valueStringType.value.isNullOrEmpty() - ) { + if (questionnaireResponseItem.answer[0].isNotValid()) { return ConstraintValidator.ConstraintValidationResult( false, context.getString(R.string.required_constraint_validation_error_msg) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt index 91ccd8a58c..6fdd7bbc4d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextStringViewHolderDelegate.kt @@ -35,14 +35,8 @@ internal class QuestionnaireItemEditTextStringViewHolderDelegate(isSingleLine: B override fun getValue( text: String ): QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent? { - // return text.let { - // if (it.isNullOrEmpty()) { - // null - // } else { return QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent() .setValue(StringType(text)) - // } - // } } override fun getText( diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index b941c9b3d4..200d3e11b0 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -33,7 +33,6 @@ import com.google.android.fhir.datacapture.validation.getSingleStringValidationM import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import org.hl7.fhir.r4.model.QuestionnaireResponse -import timber.log.Timber internal abstract class QuestionnaireItemEditTextViewHolderFactory : QuestionnaireItemViewHolderFactory(R.layout.questionnaire_item_edit_text_view) { @@ -50,7 +49,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( private lateinit var textInputLayout: TextInputLayout private lateinit var textInputEditText: TextInputEditText override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem - private var textWatch : TextWatcher? = null + private var textWatch: TextWatcher? = null override fun init(itemView: View) { prefixTextView = itemView.findViewById(R.id.prefix_text_view) @@ -96,10 +95,11 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } view.focusSearch(FOCUS_DOWN)?.requestFocus(FOCUS_DOWN) ?: false } - textWatch = textInputEditText.doAfterTextChanged { editable: Editable? -> - questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) - onAnswerChanged(textInputEditText.context) - } + textWatch = + textInputEditText.doAfterTextChanged { editable: Editable? -> + questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) + onAnswerChanged(textInputEditText.context) + } } override fun displayValidationResult(validationResult: ValidationResult) { diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index ce0a3a20a9..bab5ce498e 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -115,756 +115,6 @@ } ] }, - { - "linkId": "PR-name2", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name3", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name4", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name5", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name6", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name7", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name8", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name9", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name10", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name11", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, { "extension": [ From b4bfd9d857451941bd3af459e9e9d71d03742d01 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 2 Mar 2022 21:02:50 +0500 Subject: [PATCH 13/34] test cases fixed --- ...DataCaptureInstrumentationTestApplication.kt | 4 +--- ...CompleteViewHolderFactoryInstrumentedTest.kt | 14 -------------- ...pePickerViewHolderFactoryInstrumentedTest.kt | 14 -------------- ...BoxGroupViewHolderFactoryInstrumentedTest.kt | 17 ----------------- ...mePickerViewHolderFactoryInstrumentedTest.kt | 16 ---------------- ...DropDownViewHolderFactoryInstrumentedTest.kt | 14 -------------- ...ultiLineViewHolderFactoryInstrumentedTest.kt | 1 - ...QuantityViewHolderFactoryInstrumentedTest.kt | 14 -------------- ...ngleLineViewHolderFactoryInstrumentedTest.kt | 1 - ...temGroupViewHolderFactoryInstrumentedTest.kt | 14 -------------- ...dioGroupViewHolderFactoryInstrumentedTest.kt | 14 -------------- .../fhir/datacapture/DataCaptureConfig.kt | 5 ----- .../datacapture/common/datatype/MoreTypes.kt | 16 ---------------- .../validation/RequiredConstraintValidator.kt | 3 +-- .../views/QuestionnaireItemViewHolderFactory.kt | 5 ----- 15 files changed, 2 insertions(+), 150 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt index 41552887f4..06dd2394a6 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt @@ -20,9 +20,7 @@ import android.app.Application class DataCaptureInstrumentationTestApplication : Application(), DataCaptureConfig.Provider { - private val dataCaptureConfiguration by lazy { - DataCaptureConfig(questionnaireConfig = QuestionnaireConfig(true)) - } + private val dataCaptureConfiguration by lazy { DataCaptureConfig() } override fun getDataCaptureConfig(): DataCaptureConfig { return dataCaptureConfiguration diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index 96e1fc763d..09ded44099 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -205,20 +205,6 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { .isEqualTo(2) } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 302891661c..9db639317f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -320,20 +320,6 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { .isFalse() } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index 308c862862..acca625522 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -299,23 +299,6 @@ class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { assertThat(answer).isEmpty() } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { - repeats = true - required = true - }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index 101c735d7f..c8c1bd0688 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -137,22 +137,6 @@ class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { .isEqualTo("01:30:00") } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.date_input_layout).error) - .isEqualTo("Missing answer for required field.") - assertThat(viewHolder.itemView.findViewById(R.id.time_input_layout).error) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index f3cd105a09..695ab238bc 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -233,20 +233,6 @@ class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { } } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt index e4a642bfa6..b527c757bd 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest.kt @@ -182,7 +182,6 @@ class QuestionnaireItemEditTextMultiLineViewHolderFactoryInstrumentedTest { ) {} viewHolder.bind(questionnaireItemViewItem) - viewHolder.itemView.findViewById(R.id.text_input_edit_text).setText("") assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index f19f12cb0d..4f5ce21732 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -203,20 +203,6 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index 24ec8f3cd7..468bef740f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -180,7 +180,6 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { ) {} viewHolder.bind(questionnaireItemViewItem) - viewHolder.itemView.findViewById(R.id.text_input_edit_text).setText("") assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index 11b93d3b50..379b91841c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -116,20 +116,6 @@ class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { .isEqualTo(View.GONE) } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.group_header).error) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index 45b0a28d80..1351fc6d7b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -338,20 +338,6 @@ class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { .isTrue() } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("Missing answer for required field.") - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt index e4ddfcadf9..140fb24731 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt @@ -46,7 +46,6 @@ data class DataCaptureConfig( * needed by [StructureMap]s used by the client app. */ var npmPackage: NpmPackage? = null, - var questionnaireConfig: QuestionnaireConfig = DefaultQuestionnaireConfig() ) { internal val simpleWorkerContext: SimpleWorkerContext by lazy { @@ -76,7 +75,3 @@ data class DataCaptureConfig( interface ExternalAnswerValueSetResolver { suspend fun resolve(uri: String): List } - -open class QuestionnaireConfig(var shouldLoadValidationOnStart: Boolean) - -class DefaultQuestionnaireConfig : QuestionnaireConfig(false) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt index eca43346e0..52e028e7f7 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/common/datatype/MoreTypes.kt @@ -17,7 +17,6 @@ package com.google.android.fhir.datacapture.common.datatype import org.hl7.fhir.r4.model.PrimitiveType -import org.hl7.fhir.r4.model.QuestionnaireResponse import org.hl7.fhir.r4.model.Type /** @@ -29,18 +28,3 @@ fun Type.asStringValue(): String { if (!isPrimitive) return "" return (this as PrimitiveType<*>).asStringValue() } - -fun QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent.isNotValid(): Boolean = - when { - hasValueStringType() && valueStringType.value.isNullOrEmpty() -> true - hasValueBooleanType() && valueBooleanType.isEmpty -> true - hasValueDecimalType() && valueDecimalType.isEmpty -> true - hasValueDateType() && valueDateType.isEmpty -> true - hasValueDateTimeType() && valueDateTimeType.isEmpty -> true - hasValueQuantity() && valueQuantity.isEmpty -> true - hasValueCoding() && valueCoding.isEmpty -> true - hasValue() && value.isEmpty -> true - hasValueUriType() && valueUriType.isEmpty -> true - hasValueAttachment() && valueAttachment.isEmpty -> true - else -> false - } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt index 9e4b0bba34..b66e8daedc 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt @@ -18,7 +18,6 @@ package com.google.android.fhir.datacapture.validation import android.content.Context import com.google.android.fhir.datacapture.R -import com.google.android.fhir.datacapture.common.datatype.isNotValid import org.hl7.fhir.r4.model.Questionnaire import org.hl7.fhir.r4.model.QuestionnaireResponse @@ -35,7 +34,7 @@ internal object RequiredConstraintValidator : ConstraintValidator { ) } if (questionnaireResponseItem.answer.size == 1) { - if (questionnaireResponseItem.answer[0].isNotValid()) { + if (!questionnaireResponseItem.answer[0].hasValue()) { return ConstraintValidator.ConstraintValidationResult( false, context.getString(R.string.required_constraint_validation_error_msg) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index ef0ad59581..dfbe4cdeae 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -22,7 +22,6 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView -import com.google.android.fhir.datacapture.DataCapture import com.google.android.fhir.datacapture.validation.QuestionnaireResponseItemValidator import com.google.android.fhir.datacapture.validation.ValidationResult @@ -98,10 +97,6 @@ interface QuestionnaireItemViewHolderDelegate { /** Sets view read only if [isReadOnly] is true. */ fun setReadOnly(isReadOnly: Boolean) - fun shouldValidateOnStart(context: Context): Boolean { - return DataCapture.getConfiguration(context).questionnaireConfig.shouldLoadValidationOnStart - } - /** * Runs validation to display the correct message and calls the * questionnaireResponseChangedCallback From 1c004fd95102f6e46b6ca80ddccbab3b2c38c7c6 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Thu, 3 Mar 2022 15:01:32 +0500 Subject: [PATCH 14/34] test cases WIP --- ...eTimePickerViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index c8c1bd0688..63c3be077c 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -137,6 +137,20 @@ class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { .isEqualTo("01:30:00") } + @Test + @UiThreadTest + fun displayValidationResult_error_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.date_input_layout).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { From 7bc27ce45408f850fecbb6ee9d46cf98df3b1ea1 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 7 Mar 2022 11:18:11 +0500 Subject: [PATCH 15/34] replaced test cases --- ...CompleteViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ ...pePickerViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ ...BoxGroupViewHolderFactoryInstrumentedTest.kt | 17 +++++++++++++++++ ...DropDownViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ ...QuantityViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ ...temGroupViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ ...dioGroupViewHolderFactoryInstrumentedTest.kt | 14 ++++++++++++++ 7 files changed, 101 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index 09ded44099..ddb4273a28 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -205,6 +205,20 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { .isEqualTo(2) } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 9db639317f..18c85a6aa8 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -320,6 +320,20 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { .isFalse() } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) + .isEqualTo("") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index acca625522..17b03c7246 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -299,6 +299,23 @@ class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { assertThat(answer).isEmpty() } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { + repeats = true + required = true + }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) + .isEqualTo("") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index 695ab238bc..b6f5a6a52f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -233,6 +233,20 @@ class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { } } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 4f5ce21732..af80becbb1 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -203,6 +203,20 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index 379b91841c..dcc31ce8ae 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -116,6 +116,20 @@ class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { .isEqualTo(View.GONE) } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.group_header).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index 1351fc6d7b..29c96cbafa 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -338,6 +338,20 @@ class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { .isTrue() } + @Test + @UiThreadTest + fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) + .isEqualTo("") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { From 63ea04a917733302e7eb34727d29f882ae601761 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 7 Mar 2022 11:21:06 +0500 Subject: [PATCH 16/34] fixed typo --- .../com/google/android/fhir/datacapture/DataCaptureConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt index 140fb24731..deaced9271 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/DataCaptureConfig.kt @@ -45,7 +45,7 @@ data class DataCaptureConfig( * should try to include the smallest [NpmPackage] possible that contains only the resources * needed by [StructureMap]s used by the client app. */ - var npmPackage: NpmPackage? = null, + var npmPackage: NpmPackage? = null ) { internal val simpleWorkerContext: SimpleWorkerContext by lazy { From 1af781b49a0868db3182a399b4ef2244c145a8fa Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 7 Mar 2022 14:44:54 +0500 Subject: [PATCH 17/34] spotless fixes --- ...reItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt | 3 +-- ...nnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt | 3 +-- .../QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt | 3 +-- ...tionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 18c85a6aa8..f07fb5d394 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -330,8 +330,7 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("") + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text).isEqualTo("") } @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index 17b03c7246..862af4b5b8 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -312,8 +312,7 @@ class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("") + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text).isEqualTo("") } @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index dcc31ce8ae..419092c00a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -126,8 +126,7 @@ class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.group_header).error) - .isEqualTo(null) + assertThat(viewHolder.itemView.findViewById(R.id.group_header).error).isEqualTo(null) } @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index 29c96cbafa..73d75b40e7 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -348,8 +348,7 @@ class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo("") + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text).isEqualTo("") } @Test From bfea5c17fe3333ddf9b39fdaba9bcb26aa4223e0 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 16 Mar 2022 14:04:48 +0500 Subject: [PATCH 18/34] resolving PR comments --- buildSrc/src/main/kotlin/Dependencies.kt | 2 -- datacapture/build.gradle.kts | 2 +- ...taCaptureInstrumentationTestApplication.kt | 28 --------------- .../fhir/datacapture/DataCaptureTestRunner.kt | 36 ------------------- ...stionnaireItemEditTextViewHolderFactory.kt | 5 +-- 5 files changed, 4 insertions(+), 69 deletions(-) delete mode 100644 datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt delete mode 100644 datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 67a231408c..75bab35416 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -131,8 +131,6 @@ object Dependencies { } const val androidJunitRunner = "androidx.test.runner.AndroidJUnitRunner" - const val androidDataCaptureTestRunner = - "com.google.android.fhir.datacapture.DataCaptureTestRunner" 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}" diff --git a/datacapture/build.gradle.kts b/datacapture/build.gradle.kts index 83bd28cc69..58281bdffe 100644 --- a/datacapture/build.gradle.kts +++ b/datacapture/build.gradle.kts @@ -40,7 +40,7 @@ android { defaultConfig { minSdk = Sdk.minSdk targetSdk = Sdk.targetSdk - testInstrumentationRunner = Dependencies.androidDataCaptureTestRunner + testInstrumentationRunner = Dependencies.androidJunitRunner // Need to specify this to prevent junit runner from going deep into our dependencies testInstrumentationRunnerArguments["package"] = "com.google.android.fhir.datacapture" } diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt deleted file mode 100644 index 06dd2394a6..0000000000 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureInstrumentationTestApplication.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.android.fhir.datacapture - -import android.app.Application - -class DataCaptureInstrumentationTestApplication : Application(), DataCaptureConfig.Provider { - - private val dataCaptureConfiguration by lazy { DataCaptureConfig() } - - override fun getDataCaptureConfig(): DataCaptureConfig { - return dataCaptureConfiguration - } -} diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt deleted file mode 100644 index 74f2cf0a8b..0000000000 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/DataCaptureTestRunner.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.android.fhir.datacapture - -import android.app.Application -import android.content.Context -import androidx.test.runner.AndroidJUnitRunner - -class DataCaptureTestRunner : AndroidJUnitRunner() { - @Throws(Exception::class) - override fun newApplication( - cl: ClassLoader?, - className: String?, - context: Context? - ): Application { - return super.newApplication( - cl, - DataCaptureInstrumentationTestApplication::class.java.name, - context - ) - } -} diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 200d3e11b0..34db90ee3d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -56,6 +56,8 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( questionTextView = itemView.findViewById(R.id.question_text_view) textInputLayout = itemView.findViewById(R.id.text_input_layout) textInputEditText = itemView.findViewById(R.id.text_input_edit_text) + textInputEditText.setRawInputType(rawInputType) + textInputEditText.isSingleLine = isSingleLine } override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { @@ -66,11 +68,10 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( prefixTextView.visibility = View.GONE } textInputEditText.removeTextChangedListener(textWatch) - textInputEditText.setRawInputType(rawInputType) - textInputEditText.isSingleLine = isSingleLine questionTextView.text = questionnaireItemViewItem.questionnaireItem.localizedTextSpanned val answer = questionnaireItemViewItem.singleAnswerOrNull if (answer == null) { + // Clear the text input and any error message if the question has not been answered. textInputEditText.setText("") displayValidationResult(ValidationResult(true, listOf())) } else { From c8ba3c1b35a579c6d0ab56477111af896be491fb Mon Sep 17 00:00:00 2001 From: aurangzaibumer <35099184+aurangzaibumer@users.noreply.github.com> Date: Tue, 29 Mar 2022 18:50:35 +0500 Subject: [PATCH 19/34] Update datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt Co-authored-by: Jing Tang --- .../datacapture/views/QuestionnaireItemViewHolderFactory.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index dfbe4cdeae..b88d45c0f0 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -62,6 +62,8 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) + // Only validate questionnaire items with answer(s). This is so that we do not show all the validation errors at once when the user opens a new questionnaire for the first time. Instead, the validation errors are shown when the user goes through each question. + // Notice the difference between a questionnnaire response item without answer, and a questionnaire with an answer without value. if (delegate.questionnaireItemViewItem.questionnaireResponseItem.hasAnswer()) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } From d94bbdbfaad84e8d1f84cb6fce70682452c084f6 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 30 Mar 2022 15:11:06 +0500 Subject: [PATCH 20/34] feedback incorporated --- ...PickerViewHolderFactoryInstrumentedTest.kt | 37 ++++++++++++++-- ...leLineViewHolderFactoryInstrumentedTest.kt | 44 +++++++++++++++++++ .../QuestionnaireItemViewHolderFactory.kt | 7 ++- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index f07fb5d394..d91f3c5358 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -322,15 +322,46 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { @Test @UiThreadTest - fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { + fun displayValidationResult_questionnaireResponseAnswerWithValue_shouldShowNoErrorMessage() { viewHolder.bind( QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, + Questionnaire.QuestionnaireItemComponent().apply { + required = true + addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { text = "Question?" } + ) + }, + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { + addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = BooleanType(false) + } + ) + } + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).error) + .isEqualTo(null) + } + + @Test + @UiThreadTest + fun displayValidationResult_noQuestionnaireResponseAnswer_shouldShowNoErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { + required = true + addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { text = "Question?" } + ) + }, QuestionnaireResponse.QuestionnaireResponseItemComponent() ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text).isEqualTo("") + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).error) + .isEqualTo(null) } @Test diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index 468bef740f..14727424ad 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -209,6 +209,50 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { .isNull() } + @Test + @UiThreadTest + fun displayValidationResult_questionnaireResponseAnswerWithNoValue_shouldShowErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { + required = true + addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = StringType("hello") + } + ) + }, + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { addAnswer() } + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo( + viewHolder.itemView.context.getString(R.string.required_constraint_validation_error_msg) + ) + } + + @Test + @UiThreadTest + fun displayValidationResult_noQuestionnaireResponseAnswer_shouldShowNoErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { + required = true + addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = StringType("hello") + } + ) + }, + QuestionnaireResponse.QuestionnaireResponseItemComponent() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo(null) + } + @Test @UiThreadTest fun displayValidationResult_error_shouldShowErrorMessage() { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index b88d45c0f0..c8ede78a5a 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -62,8 +62,11 @@ open class QuestionnaireItemViewHolder( delegate.questionnaireItemViewItem = questionnaireItemViewItem delegate.bind(questionnaireItemViewItem) delegate.setReadOnly(questionnaireItemViewItem.questionnaireItem.readOnly) - // Only validate questionnaire items with answer(s). This is so that we do not show all the validation errors at once when the user opens a new questionnaire for the first time. Instead, the validation errors are shown when the user goes through each question. - // Notice the difference between a questionnnaire response item without answer, and a questionnaire with an answer without value. + // Only validate questionnaire items with answer(s). This is so that we do not show all the + // validation errors at once when the user opens a new questionnaire for the first time. + // Instead, the validation errors are shown when the user goes through each question. + // Notice the difference between a questionnnaire response item without answer, and a + // questionnaire with an answer without value. if (delegate.questionnaireItemViewItem.questionnaireResponseItem.hasAnswer()) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } From cac02279c8d8dda2cfb5d3fa184c1a043b70c08c Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 5 Apr 2022 11:08:45 +0500 Subject: [PATCH 21/34] feedback incorporated for RequiredConstraintValidator --- .../validation/RequiredConstraintValidator.kt | 14 ++-- .../RequiredConstraintValidatorTest.kt | 64 +++++++++++++++++++ 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt index b66e8daedc..35219dcd81 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt @@ -33,14 +33,12 @@ internal object RequiredConstraintValidator : ConstraintValidator { context.getString(R.string.required_constraint_validation_error_msg) ) } - if (questionnaireResponseItem.answer.size == 1) { - if (!questionnaireResponseItem.answer[0].hasValue()) { - return ConstraintValidator.ConstraintValidationResult( - false, - context.getString(R.string.required_constraint_validation_error_msg) - ) - } + if (questionnaireResponseItem.answer.any { it.hasValue() }) { + return ConstraintValidator.ConstraintValidationResult(true, null) } - return ConstraintValidator.ConstraintValidationResult(true, null) + return ConstraintValidator.ConstraintValidationResult( + false, + context.getString(R.string.required_constraint_validation_error_msg) + ) } } diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt index 31e770f3a7..d5146280f3 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt @@ -66,4 +66,68 @@ class RequiredConstraintValidatorTest { assertThat(validationResult.isValid).isFalse() assertThat(validationResult.message).isEqualTo("Missing answer for required field.") } + + @Test + fun shouldReturnInvalidResultOnAnswerWithNoValue() { + val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } + val questionnaireResponseItem = + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { + addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) + } + + val validationResult = + RequiredConstraintValidator.validate( + questionnaireItem, + questionnaireResponseItem, + InstrumentationRegistry.getInstrumentation().context + ) + assertThat(validationResult.isValid).isFalse() + assertThat(validationResult.message).isEqualTo("Missing answer for required field.") + } + + @Test + fun shouldReturnValidResultOnMultipleAnswersWithValue() { + val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } + val questionnaireResponseItem = + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { + // one answer with a value + addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = IntegerType(9) + } + ) + // second answer with no value + addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) + } + + val validationResult = + RequiredConstraintValidator.validate( + questionnaireItem, + questionnaireResponseItem, + InstrumentationRegistry.getInstrumentation().context + ) + assertThat(validationResult.isValid).isTrue() + } + + @Test + fun shouldReturnValidResultOnMultipleAnswersWithNoValue() { + val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } + val questionnaireResponseItem = + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { + + // one answer with no value + addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) + // second answer with no value + addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) + } + + val validationResult = + RequiredConstraintValidator.validate( + questionnaireItem, + questionnaireResponseItem, + InstrumentationRegistry.getInstrumentation().context + ) + assertThat(validationResult.isValid).isFalse() + assertThat(validationResult.message).isEqualTo("Missing answer for required field.") + } } From f17f193d06d0a99a1ef63efdef8df341003b357d Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 5 Apr 2022 11:17:13 +0500 Subject: [PATCH 22/34] feedback incorporated for test cases name --- ...ItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index 14727424ad..bf491a341f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -211,7 +211,7 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { @Test @UiThreadTest - fun displayValidationResult_questionnaireResponseAnswerWithNoValue_shouldShowErrorMessage() { + fun displayValidationResult_answerWithNoValue_shouldShowErrorMessage() { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { @@ -234,7 +234,7 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { @Test @UiThreadTest - fun displayValidationResult_noQuestionnaireResponseAnswer_shouldShowNoErrorMessage() { + fun displayValidationResult_noAnswer_shouldShowNoErrorMessage() { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { From d440ada81a459696718018e1952ef2cc27eb5fb4 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 6 Apr 2022 06:30:50 +0500 Subject: [PATCH 23/34] feedback incorporated for RequiredConstraintValidator --- .../datacapture/validation/RequiredConstraintValidator.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt index 35219dcd81..900eb3c4fb 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidator.kt @@ -27,13 +27,7 @@ internal object RequiredConstraintValidator : ConstraintValidator { questionnaireResponseItem: QuestionnaireResponse.QuestionnaireResponseItemComponent, context: Context ): ConstraintValidator.ConstraintValidationResult { - if (questionnaireItem.required && questionnaireResponseItem.answer.isEmpty()) { - return ConstraintValidator.ConstraintValidationResult( - false, - context.getString(R.string.required_constraint_validation_error_msg) - ) - } - if (questionnaireResponseItem.answer.any { it.hasValue() }) { + if (!questionnaireItem.required || questionnaireResponseItem.answer.any { it.hasValue() }) { return ConstraintValidator.ConstraintValidationResult(true, null) } return ConstraintValidator.ConstraintValidationResult( From f3b29f9ff903b1c1f0b3100374c5f8164b84f22d Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 6 Apr 2022 15:25:14 +0500 Subject: [PATCH 24/34] added new test cases on QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest --- ...mpleteViewHolderFactoryInstrumentedTest.kt | 32 +++++++++ .../new-patient-registration-paginated.json | 68 +++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index ddb4273a28..433784e72d 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -21,6 +21,7 @@ import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView import androidx.appcompat.view.ContextThemeWrapper +import androidx.core.view.children import androidx.core.view.get import androidx.core.view.isVisible import androidx.test.annotation.UiThreadTest @@ -28,6 +29,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.displayString +import com.google.android.material.chip.Chip import com.google.android.material.textfield.TextInputLayout import com.google.common.truth.Truth.assertThat import org.hl7.fhir.r4.model.Coding @@ -219,6 +221,36 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { .isEqualTo(null) } + @Test + @UiThreadTest + fun displayValidationResult_showErrorWhenAnswersAreRemoved() { + val questionnaire = + Questionnaire.QuestionnaireItemComponent().apply { + required = true + addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "display" } + } + ) + } + val questionnaireResponseWithAnswer = + QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { + addAnswer( + QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { + value = Coding().apply { display = "display" } + } + ) + } + + viewHolder.bind(QuestionnaireItemViewItem(questionnaire, questionnaireResponseWithAnswer) {}) + + (viewHolder.itemView.findViewById(R.id.flexboxLayout).children.first() as Chip) + .performCloseIconClick() + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo("Missing answer for required field.") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index bab5ce498e..e3a9cedf64 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -383,6 +383,74 @@ } ] } + }, + { + "type": "choice", + "repeats": true, + "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, + "linkId": "4", + "text": "Do you have any existing conditions", + "prefix": "Q4:", + "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" + } + } + ] } ] } From 89ff01e24b2b63fc16cb601af27aa6cf8ec2f818 Mon Sep 17 00:00:00 2001 From: aurangzaibumer <35099184+aurangzaibumer@users.noreply.github.com> Date: Wed, 6 Apr 2022 21:23:38 +0500 Subject: [PATCH 25/34] Update datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt Co-authored-by: Jing Tang --- .../datacapture/validation/RequiredConstraintValidatorTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt index d5146280f3..9db767adcf 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt @@ -86,7 +86,7 @@ class RequiredConstraintValidatorTest { } @Test - fun shouldReturnValidResultOnMultipleAnswersWithValue() { + fun shouldReturnValidResult_anyAnswerHasValue() { val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } val questionnaireResponseItem = QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { From b9c1384d17027272efa59fb7ea1a0344c019e05a Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 6 Apr 2022 21:33:13 +0500 Subject: [PATCH 26/34] PR feedback incorporated related to test cases --- ...PickerViewHolderFactoryInstrumentedTest.kt | 25 ------------------- ...leLineViewHolderFactoryInstrumentedTest.kt | 23 ----------------- .../RequiredConstraintValidatorTest.kt | 20 +-------------- 3 files changed, 1 insertion(+), 67 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index d91f3c5358..8a6ceff8c2 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -320,31 +320,6 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { .isFalse() } - @Test - @UiThreadTest - fun displayValidationResult_questionnaireResponseAnswerWithValue_shouldShowNoErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { - required = true - addAnswerOption( - Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { text = "Question?" } - ) - }, - QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { - addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = BooleanType(false) - } - ) - } - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_noQuestionnaireResponseAnswer_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index bf491a341f..6341e1ed8b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -209,29 +209,6 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { .isNull() } - @Test - @UiThreadTest - fun displayValidationResult_answerWithNoValue_shouldShowErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { - required = true - addAnswerOption( - Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = StringType("hello") - } - ) - }, - QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { addAnswer() } - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo( - viewHolder.itemView.context.getString(R.string.required_constraint_validation_error_msg) - ) - } - @Test @UiThreadTest fun displayValidationResult_noAnswer_shouldShowNoErrorMessage() { diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt index 9db767adcf..1cb6f2cd22 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt @@ -67,24 +67,6 @@ class RequiredConstraintValidatorTest { assertThat(validationResult.message).isEqualTo("Missing answer for required field.") } - @Test - fun shouldReturnInvalidResultOnAnswerWithNoValue() { - val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } - val questionnaireResponseItem = - QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { - addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) - } - - val validationResult = - RequiredConstraintValidator.validate( - questionnaireItem, - questionnaireResponseItem, - InstrumentationRegistry.getInstrumentation().context - ) - assertThat(validationResult.isValid).isFalse() - assertThat(validationResult.message).isEqualTo("Missing answer for required field.") - } - @Test fun shouldReturnValidResult_anyAnswerHasValue() { val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } @@ -110,7 +92,7 @@ class RequiredConstraintValidatorTest { } @Test - fun shouldReturnValidResultOnMultipleAnswersWithNoValue() { + fun shouldReturnInvalidResult_noAnswerHasValue() { val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } val questionnaireResponseItem = QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { From 3bc8479206878e46d9f6b361eb0b5533da430f9f Mon Sep 17 00:00:00 2001 From: aurangzaibumer <35099184+aurangzaibumer@users.noreply.github.com> Date: Wed, 6 Apr 2022 21:34:20 +0500 Subject: [PATCH 27/34] Update datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt Co-authored-by: Jing Tang --- ...ireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 8a6ceff8c2..8d20671fa9 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -335,7 +335,7 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).error) + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) .isEqualTo(null) } From 08795789bce3a18aa5428052e5e07f8c61ac1731 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 6 Apr 2022 21:44:27 +0500 Subject: [PATCH 28/34] PR feedback incorporated related to test cases --- ...eItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 8d20671fa9..5d90dbfb9b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -335,8 +335,8 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { ) {} ) - assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text) - .isEqualTo(null) + assertThat(viewHolder.itemView.findViewById(R.id.error_text_view).text.isEmpty()) + .isTrue() } @Test From 2485a3454c57a58d8f2c63cf6367934830dd7d22 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Tue, 19 Apr 2022 16:39:08 +0500 Subject: [PATCH 29/34] restrict triggering validation when form opens --- ...stionnaireItemEditTextViewHolderFactory.kt | 8 + .../QuestionnaireItemViewHolderFactory.kt | 3 +- .../views/QuestionnaireItemViewItem.kt | 1 + .../new-patient-registration-paginated.json | 750 ++++++++++++++++++ 4 files changed, 761 insertions(+), 1 deletion(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 3b2fe1117e..7a3d9bdfc9 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -109,6 +109,14 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } } + override fun onAnswerChanged(context: Context) { + if (questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0 || + questionnaireItemViewItem.isDirty + ) { + super.onAnswerChanged(context) + } + } + override fun displayValidationResult(validationResult: ValidationResult) { textInputLayout.error = if (validationResult.getSingleStringValidationMessage() == "") null diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index c8ede78a5a..51cd833db4 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -67,7 +67,7 @@ open class QuestionnaireItemViewHolder( // Instead, the validation errors are shown when the user goes through each question. // Notice the difference between a questionnnaire response item without answer, and a // questionnaire with an answer without value. - if (delegate.questionnaireItemViewItem.questionnaireResponseItem.hasAnswer()) { + if (delegate.questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } @@ -108,6 +108,7 @@ interface QuestionnaireItemViewHolderDelegate { */ fun onAnswerChanged(context: Context) { questionnaireItemViewItem.questionnaireResponseItemChangedCallback() + questionnaireItemViewItem.isDirty = true displayValidationResult(getValidationResult(context)) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt index 96438cd03a..a8b28054c0 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt @@ -44,6 +44,7 @@ data class QuestionnaireItemViewItem( { emptyList() }, + var isDirty: Boolean = false, val questionnaireResponseItemChangedCallback: () -> Unit ) { /** diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index e3a9cedf64..e10d927cdc 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -115,6 +115,756 @@ } ] }, + { + "linkId": "PR-name2", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name3", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name4", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name5", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name6", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name7", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name8", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name9", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name10", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, + { + "linkId": "PR-name11", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.given", + "name": "patientName" + } + } + ], + "linkId": "PR-name-text", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "required": true, + "text": "First Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la kwanza" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression": { + "language": "text/fhirpath", + "expression": "Patient.name.family", + "name": "patientFamily" + } + } + ], + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", + "type": "string", + "required": true, + "text": "Family Name", + "_text": { + "extension": [ + { + "extension": [ + { + "url": "lang", + "valueCode": "sw" + }, + { + "url": "content", + "valueString": "Jina la ukoo" + } + ], + "url": "http://hl7.org/fhir/StructureDefinition/translation" + } + ] + } + } + ] + }, { "extension": [ From aff6cab243d4c53ba99ab27841184d31a89b6dd6 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Wed, 20 Apr 2022 15:10:19 +0500 Subject: [PATCH 30/34] implementation updated on ViewHolderFactory and fixed test cases --- ...mpleteViewHolderFactoryInstrumentedTest.kt | 14 ------------- ...PickerViewHolderFactoryInstrumentedTest.kt | 3 ++- ...xGroupViewHolderFactoryInstrumentedTest.kt | 3 ++- ...PickerViewHolderFactoryInstrumentedTest.kt | 14 ------------- ...opDownViewHolderFactoryInstrumentedTest.kt | 14 ------------- ...antityViewHolderFactoryInstrumentedTest.kt | 14 ------------- ...leLineViewHolderFactoryInstrumentedTest.kt | 21 ------------------- ...mGroupViewHolderFactoryInstrumentedTest.kt | 3 ++- ...oGroupViewHolderFactoryInstrumentedTest.kt | 3 ++- .../QuestionnaireItemViewHolderFactory.kt | 4 +++- 10 files changed, 11 insertions(+), 82 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index a401e31cec..af7da159ad 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -177,20 +177,6 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { .isEqualTo(2) } - @Test - @UiThreadTest - fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_showErrorWhenAnswersAreRemoved() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt index 293a3b0cec..31118b879a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest.kt @@ -298,7 +298,8 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryInstrumentedTest { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt index 648e4ee915..88ebc450ec 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest.kt @@ -354,7 +354,8 @@ class QuestionnaireItemCheckBoxGroupViewHolderFactoryInstrumentedTest { repeats = true required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index caf9c56250..7580592d85 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -109,20 +109,6 @@ class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { .isEqualTo("01:30:00") } - @Test - @UiThreadTest - fun displayValidationResult_error_shouldShowNoErrorMessageAtStart() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.date_input_layout).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index a8f3ec0906..be5195ec82 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -203,20 +203,6 @@ class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { } } - @Test - @UiThreadTest - fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 5385bf67ee..13503a7177 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -175,20 +175,6 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } - @Test - @UiThreadTest - fun displayValidationResult_noError_shouldShowNoErrorMessageAtStart() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt index 4dbb9d06b2..afe863d02f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest.kt @@ -181,27 +181,6 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryInstrumentedTest { .isNull() } - @Test - @UiThreadTest - fun displayValidationResult_noAnswer_shouldShowNoErrorMessage() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.QuestionnaireItemComponent().apply { - required = true - addAnswerOption( - Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = StringType("hello") - } - ) - }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) - .isEqualTo(null) - } - @Test @UiThreadTest fun displayValidationResult_error_shouldShowErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt index 17b56e8e74..5821ba7aba 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryInstrumentedTest.kt @@ -67,7 +67,8 @@ class QuestionnaireItemGroupViewHolderFactoryInstrumentedTest { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true ) {} ) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt index d1a5528bb0..a61c55ea4b 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest.kt @@ -316,7 +316,8 @@ class QuestionnaireItemRadioGroupViewHolderFactoryInstrumentedTest { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, - QuestionnaireResponse.QuestionnaireResponseItemComponent() + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true ) {} ) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index 51cd833db4..a25c09bf61 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -67,7 +67,9 @@ open class QuestionnaireItemViewHolder( // Instead, the validation errors are shown when the user goes through each question. // Notice the difference between a questionnnaire response item without answer, and a // questionnaire with an answer without value. - if (delegate.questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0) { + if (delegate.questionnaireItemViewItem.isDirty || + delegate.questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0 + ) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) } } From d2d4a6846d6ea99a8f3524f3463282fe4c3e455a Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Thu, 21 Apr 2022 11:57:07 +0500 Subject: [PATCH 31/34] some test cases added --- ...CompleteViewHolderFactoryInstrumentedTest.kt | 12 ++++++++++++ ...mePickerViewHolderFactoryInstrumentedTest.kt | 17 +++++++++++++++++ ...DropDownViewHolderFactoryInstrumentedTest.kt | 15 +++++++++++++++ ...QuantityViewHolderFactoryInstrumentedTest.kt | 15 +++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index af7da159ad..ecfad008f1 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -177,6 +177,18 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { .isEqualTo(2) } + @Test + @UiThreadTest + fun displayValidationResult_error_shouldShowErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true + ) {} + ) + } + @Test @UiThreadTest fun displayValidationResult_showErrorWhenAnswersAreRemoved() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt index 7580592d85..277d5057f4 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest.kt @@ -109,6 +109,23 @@ class QuestionnaireItemDateTimePickerViewHolderFactoryInstrumentedTest { .isEqualTo("01:30:00") } + @Test + @UiThreadTest + fun displayValidationResult_error_shouldShowErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.date_input_layout).error) + .isEqualTo("Missing answer for required field.") + assertThat(viewHolder.itemView.findViewById(R.id.time_input_layout).error) + .isEqualTo("Missing answer for required field.") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt index be5195ec82..cb0b77ca3f 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest.kt @@ -203,6 +203,21 @@ class QuestionnaireItemDropDownViewHolderFactoryInstrumentedTest { } } + @Test + @UiThreadTest + fun displayValidationResult_error_shouldShowErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo("Missing answer for required field.") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt index 13503a7177..50deec18e9 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest.kt @@ -175,6 +175,21 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryInstrumentedTest { assertThat(questionnaireItemViewItem.questionnaireResponseItem.answer.size).isEqualTo(0) } + @Test + @UiThreadTest + fun displayValidationResult_error_shouldShowErrorMessage() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.QuestionnaireItemComponent().apply { required = true }, + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + isDirty = true + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo("Missing answer for required field.") + } + @Test @UiThreadTest fun displayValidationResult_noError_shouldShowNoErrorMessage() { From 096b64e6dd702d0d790355ae6953f3d8f7bb8af8 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Fri, 22 Apr 2022 12:20:08 +0500 Subject: [PATCH 32/34] docs added for the newly changes --- ...mpleteViewHolderFactoryInstrumentedTest.kt | 3 + ...stionnaireItemEditTextViewHolderFactory.kt | 6 +- .../QuestionnaireItemViewHolderFactory.kt | 4 +- .../views/QuestionnaireItemViewItem.kt | 4 + .../new-patient-registration-paginated.json | 818 ------------------ 5 files changed, 13 insertions(+), 822 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt index ecfad008f1..3323f0fa42 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest.kt @@ -187,6 +187,9 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { isDirty = true ) {} ) + + assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).error) + .isEqualTo("Missing answer for required field.") } @Test diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 72e4a16bf8..3ecb2766ec 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -46,7 +46,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( private lateinit var textInputLayout: TextInputLayout private lateinit var textInputEditText: TextInputEditText override lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem - private var textWatch: TextWatcher? = null + private var textWatcher: TextWatcher? = null override fun init(itemView: View) { header = itemView.findViewById(R.id.header) @@ -59,7 +59,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { header.bind(questionnaireItemViewItem.questionnaireItem) textInputLayout.hint = questionnaireItemViewItem.questionnaireItem.localizedFlyoverSpanned - textInputEditText.removeTextChangedListener(textWatch) + textInputEditText.removeTextChangedListener(textWatcher) val answer = questionnaireItemViewItem.singleAnswerOrNull if (answer == null) { @@ -87,7 +87,7 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } view.focusSearch(FOCUS_DOWN)?.requestFocus(FOCUS_DOWN) ?: false } - textWatch = + textWatcher = textInputEditText.doAfterTextChanged { editable: Editable? -> questionnaireItemViewItem.singleAnswerOrNull = getValue(editable.toString()) onAnswerChanged(textInputEditText.context) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index a25c09bf61..9267d9d866 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -65,7 +65,7 @@ open class QuestionnaireItemViewHolder( // Only validate questionnaire items with answer(s). This is so that we do not show all the // validation errors at once when the user opens a new questionnaire for the first time. // Instead, the validation errors are shown when the user goes through each question. - // Notice the difference between a questionnnaire response item without answer, and a + // Notice the difference between a questionnaire response item without answer, and a // questionnaire with an answer without value. if (delegate.questionnaireItemViewItem.isDirty || delegate.questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0 @@ -110,6 +110,8 @@ interface QuestionnaireItemViewHolderDelegate { */ fun onAnswerChanged(context: Context) { questionnaireItemViewItem.questionnaireResponseItemChangedCallback() + // purpose of this field is to let the validation execute ( if the answer has been added, this + // tells that the User has made an interaction to that particular input field questionnaireItemViewItem.isDirty = true displayValidationResult(getValidationResult(context)) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt index a8b28054c0..d838169569 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt @@ -35,6 +35,10 @@ import org.hl7.fhir.r4.model.QuestionnaireResponse * @param questionnaireResponseItemChangedCallback function that should be called whenever the * `questionnaireResponseItemBuilder` is changed to inform the rest of the questionnaire to be * updated + * + * @param isDirty will be marked true once user interacts with the questionnaire (when + * onAnswerChanged triggers) doing this will let the validation be executed since User made an + * interaction with an input field */ data class QuestionnaireItemViewItem( val questionnaireItem: Questionnaire.QuestionnaireItemComponent, diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index e10d927cdc..bab5ce498e 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -115,756 +115,6 @@ } ] }, - { - "linkId": "PR-name2", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name3", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name4", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name5", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name6", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name7", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name8", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name9", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name10", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, - { - "linkId": "PR-name11", - "type": "group", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", - "item": [ - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.given", - "name": "patientName" - } - } - ], - "linkId": "PR-name-text", - "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", - "type": "string", - "required": true, - "text": "First Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la kwanza" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - }, - { - "extension": [ - { - "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", - "valueExpression": { - "language": "text/fhirpath", - "expression": "Patient.name.family", - "name": "patientFamily" - } - } - ], - "linkId": "PR-name-family", - "definition": "http://hl7.org/fhir/StructureDefinition/datatypes#HumanName.family", - "type": "string", - "required": true, - "text": "Family Name", - "_text": { - "extension": [ - { - "extension": [ - { - "url": "lang", - "valueCode": "sw" - }, - { - "url": "content", - "valueString": "Jina la ukoo" - } - ], - "url": "http://hl7.org/fhir/StructureDefinition/translation" - } - ] - } - } - ] - }, { "extension": [ @@ -1133,74 +383,6 @@ } ] } - }, - { - "type": "choice", - "repeats": true, - "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, - "linkId": "4", - "text": "Do you have any existing conditions", - "prefix": "Q4:", - "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" - } - } - ] } ] } From 46579e469aa175db7217012dcb9af3e9ef1fb7d8 Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 9 May 2022 17:58:50 +0500 Subject: [PATCH 33/34] PR feedback incorporated --- ...NumberViewHolderFactoryInstrumentedTest.kt | 5 -- ...stionnaireItemEditTextViewHolderFactory.kt | 8 --- .../QuestionnaireItemViewHolderFactory.kt | 4 +- .../views/QuestionnaireItemViewItem.kt | 8 +-- .../RequiredConstraintValidatorTest.kt | 25 ------- ...reItemAutoCompleteViewHolderFactoryTest.kt | 4 +- ...mBooleanTypePickerViewHolderFactoryTest.kt | 2 +- ...eItemCheckBoxGroupViewHolderFactoryTest.kt | 2 +- ...ItemDateTimePickerViewHolderFactoryTest.kt | 2 +- ...nnaireItemDropDownViewHolderFactoryTest.kt | 2 +- ...emEditTextQuantityViewHolderFactoryTest.kt | 2 +- ...tionnaireItemGroupViewHolderFactoryTest.kt | 2 +- ...aireItemRadioGroupViewHolderFactoryTest.kt | 2 +- .../new-patient-registration-paginated.json | 68 +++++++++++++++++++ 14 files changed, 82 insertions(+), 54 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt index 344382c0c9..1735a8d3b5 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/contrib/views/QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest.kt @@ -119,11 +119,6 @@ class QuestionnaireItemPhoneNumberViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = StringType() - } - ) ) {} ) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt index 3ecb2766ec..9ce4ebe4a8 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextViewHolderFactory.kt @@ -94,14 +94,6 @@ internal abstract class QuestionnaireItemEditTextViewHolderDelegate( } } - override fun onAnswerChanged(context: Context) { - if (questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0 || - questionnaireItemViewItem.isDirty - ) { - super.onAnswerChanged(context) - } - } - override fun displayValidationResult(validationResult: ValidationResult) { textInputLayout.error = if (validationResult.getSingleStringValidationMessage() == "") null diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt index 9267d9d866..cbd07559f2 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewHolderFactory.kt @@ -67,7 +67,7 @@ open class QuestionnaireItemViewHolder( // Instead, the validation errors are shown when the user goes through each question. // Notice the difference between a questionnaire response item without answer, and a // questionnaire with an answer without value. - if (delegate.questionnaireItemViewItem.isDirty || + if (delegate.questionnaireItemViewItem.modified || delegate.questionnaireItemViewItem.questionnaireResponseItem.answer.size > 0 ) { delegate.displayValidationResult(delegate.getValidationResult(itemView.context)) @@ -112,7 +112,7 @@ interface QuestionnaireItemViewHolderDelegate { questionnaireItemViewItem.questionnaireResponseItemChangedCallback() // purpose of this field is to let the validation execute ( if the answer has been added, this // tells that the User has made an interaction to that particular input field - questionnaireItemViewItem.isDirty = true + questionnaireItemViewItem.modified = true displayValidationResult(getValidationResult(context)) } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt index d838169569..56820115ff 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemViewItem.kt @@ -36,9 +36,9 @@ import org.hl7.fhir.r4.model.QuestionnaireResponse * `questionnaireResponseItemBuilder` is changed to inform the rest of the questionnaire to be * updated * - * @param isDirty will be marked true once user interacts with the questionnaire (when - * onAnswerChanged triggers) doing this will let the validation be executed since User made an - * interaction with an input field + * @param modified True once user has interacted with the questionnaire item (when `onAnswerChanged` + * triggers). Only modified fields will be validated. This is to avoid an influx of validation + * errors when the user first opens the questionnaire. */ data class QuestionnaireItemViewItem( val questionnaireItem: Questionnaire.QuestionnaireItemComponent, @@ -48,7 +48,7 @@ data class QuestionnaireItemViewItem( { emptyList() }, - var isDirty: Boolean = false, + var modified: Boolean = false, val questionnaireResponseItemChangedCallback: () -> Unit ) { /** diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt index 1cb6f2cd22..2f805f6bbe 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/validation/RequiredConstraintValidatorTest.kt @@ -67,36 +67,11 @@ class RequiredConstraintValidatorTest { assertThat(validationResult.message).isEqualTo("Missing answer for required field.") } - @Test - fun shouldReturnValidResult_anyAnswerHasValue() { - val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } - val questionnaireResponseItem = - QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { - // one answer with a value - addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = IntegerType(9) - } - ) - // second answer with no value - addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) - } - - val validationResult = - RequiredConstraintValidator.validate( - questionnaireItem, - questionnaireResponseItem, - InstrumentationRegistry.getInstrumentation().context - ) - assertThat(validationResult.isValid).isTrue() - } - @Test fun shouldReturnInvalidResult_noAnswerHasValue() { val questionnaireItem = Questionnaire.QuestionnaireItemComponent().apply { required = true } val questionnaireResponseItem = QuestionnaireResponse.QuestionnaireResponseItemComponent().apply { - // one answer with no value addAnswer(QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent()) // second answer with no value 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 39f49d92e4..65dedc9d05 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 @@ -19,7 +19,6 @@ package com.google.android.fhir.datacapture.views import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView -import androidx.appcompat.view.ContextThemeWrapper import androidx.core.view.children import androidx.core.view.get import com.google.android.fhir.datacapture.R @@ -166,7 +165,7 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) @@ -175,7 +174,6 @@ class QuestionnaireItemAutoCompleteViewHolderFactoryInstrumentedTest { } @Test - @UiThreadTest fun displayValidationResult_showErrorWhenAnswersAreRemoved() { val questionnaire = Questionnaire.QuestionnaireItemComponent().apply { diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryTest.kt index 456868a05f..8898b42d18 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemBooleanTypePickerViewHolderFactoryTest.kt @@ -281,7 +281,7 @@ class QuestionnaireItemBooleanTypePickerViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryTest.kt index 7874d028ca..c526e70745 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemCheckBoxGroupViewHolderFactoryTest.kt @@ -344,7 +344,7 @@ class QuestionnaireItemCheckBoxGroupViewHolderFactoryTest { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryTest.kt index 4720005dca..61e4a92539 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDateTimePickerViewHolderFactoryTest.kt @@ -108,7 +108,7 @@ class QuestionnaireItemDateTimePickerViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryTest.kt index 95f8cf8934..02c7502b5f 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemDropDownViewHolderFactoryTest.kt @@ -190,7 +190,7 @@ class QuestionnaireItemDropDownViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt index edbd1e04a4..be2b18ae25 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt @@ -162,7 +162,7 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryTest.kt index 06856548a4..d9d5ca4b1e 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemGroupViewHolderFactoryTest.kt @@ -56,7 +56,7 @@ class QuestionnaireItemGroupViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryTest.kt index 606096ffe3..d3d15aa22c 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemRadioGroupViewHolderFactoryTest.kt @@ -307,7 +307,7 @@ class QuestionnaireItemRadioGroupViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent().apply { required = true }, QuestionnaireResponse.QuestionnaireResponseItemComponent(), - isDirty = true + modified = true ) {} ) diff --git a/demo/src/main/assets/new-patient-registration-paginated.json b/demo/src/main/assets/new-patient-registration-paginated.json index bab5ce498e..e3a9cedf64 100644 --- a/demo/src/main/assets/new-patient-registration-paginated.json +++ b/demo/src/main/assets/new-patient-registration-paginated.json @@ -383,6 +383,74 @@ } ] } + }, + { + "type": "choice", + "repeats": true, + "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, + "linkId": "4", + "text": "Do you have any existing conditions", + "prefix": "Q4:", + "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" + } + } + ] } ] } From d7e1e61561c41c6ff46ad6485db2e92f1ddea2ec Mon Sep 17 00:00:00 2001 From: Aurangzaib Umer Date: Mon, 9 May 2022 18:28:57 +0500 Subject: [PATCH 34/34] test cases updated --- .../QuestionnaireItemEditTextDecimalViewHolderFactoryTest.kt | 5 ----- .../QuestionnaireItemEditTextIntegerViewHolderFactoryTest.kt | 5 ----- ...uestionnaireItemEditTextMultiLineViewHolderFactoryTest.kt | 5 ----- ...QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt | 5 ----- ...estionnaireItemEditTextSingleLineViewHolderFactoryTest.kt | 5 ----- 5 files changed, 25 deletions(-) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryTest.kt index 945ddf05e1..4024e0dae8 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextDecimalViewHolderFactoryTest.kt @@ -95,11 +95,6 @@ class QuestionnaireItemEditTextDecimalViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = DecimalType() - } - ) ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryTest.kt index 96408b6e7d..dcbd2874cd 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextIntegerViewHolderFactoryTest.kt @@ -94,11 +94,6 @@ class QuestionnaireItemEditTextIntegerViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = IntegerType() - } - ) ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryTest.kt index 4fbb932d0f..baa4182dc6 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextMultiLineViewHolderFactoryTest.kt @@ -95,11 +95,6 @@ class QuestionnaireItemEditTextMultiLineViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = StringType() - } - ) ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt index be2b18ae25..7c900e930b 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextQuantityViewHolderFactoryTest.kt @@ -95,11 +95,6 @@ class QuestionnaireItemEditTextQuantityViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = Quantity() - } - ) ) {} ) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryTest.kt index b7026a4166..7f71f51b41 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/QuestionnaireItemEditTextSingleLineViewHolderFactoryTest.kt @@ -93,11 +93,6 @@ class QuestionnaireItemEditTextSingleLineViewHolderFactoryTest { QuestionnaireItemViewItem( Questionnaire.QuestionnaireItemComponent(), QuestionnaireResponse.QuestionnaireResponseItemComponent() - .addAnswer( - QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { - value = StringType("") - } - ) ) {} )