From dd698edad80fa63551f73902301a55f627e15a5a Mon Sep 17 00:00:00 2001 From: salman Date: Fri, 5 Mar 2021 16:09:49 +0500 Subject: [PATCH 1/8] Slider Question Functionality Added --- ...SliderViewHolderFactoryInstrumentedTest.kt | 98 +++++++++++++++++++ .../MoreQuestionnaireItemExtensions.kt | 2 + .../datacapture/QuestionnaireItemAdapter.kt | 14 ++- .../QuestionnaireItemViewHolderType.kt | 3 +- ...uestionnaireItemSliderViewHolderFactory.kt | 47 +++++++++ .../res/layout/questionnaire_item_slider.xml | 21 ++++ deps.gradle | 2 +- 7 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt create mode 100644 datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt create mode 100644 datacapture/src/main/res/layout/questionnaire_item_slider.xml 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 new file mode 100644 index 0000000000..5d5d6a0b95 --- /dev/null +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactoryInstrumentedTest.kt @@ -0,0 +1,98 @@ +package com.google.android.fhir.datacapture.views + +import android.widget.FrameLayout +import android.widget.TextView +import androidx.appcompat.view.ContextThemeWrapper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.android.fhir.datacapture.R +import com.google.common.truth.Truth +import com.google.fhir.r4.core.Boolean +import com.google.fhir.r4.core.Integer +import com.google.fhir.r4.core.Questionnaire +import com.google.fhir.r4.core.QuestionnaireResponse +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { + private lateinit var context: ContextThemeWrapper + private lateinit var parent: FrameLayout + private lateinit var viewHolder: QuestionnaireItemViewHolder + + @Before + fun setUp() { + context = ContextThemeWrapper( + InstrumentationRegistry.getInstrumentation().targetContext, + R.style.Theme_MaterialComponents + ) + parent = FrameLayout(context) + viewHolder = QuestionnaireItemSliderViewHolderFactory.create(parent) + } + + @Test + fun shouldSetHeaderTextViewText() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.newBuilder().apply { + text = com.google.fhir.r4.core.String.newBuilder().setValue("Question?").build() + }.build(), + QuestionnaireResponse.Item.newBuilder() + ) {} + ) + + Truth.assertThat(viewHolder.itemView.findViewById(R.id.slider_header).text) + .isEqualTo("Question?") + } + + @Test + fun singleAnswerOrNull_noAnswer_shouldReturnNull() { + val questionnaireItemViewItem = QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder() + ) {} + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + } + + @Test + fun singleAnswerOrNull_singleAnswer_shouldReturnSingleAnswer() { + val questionnaireItemViewItem = QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(5).build()) + .build() + } + ) + } + ) {} + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull!!.value.integer.value).isEqualTo(5) + } + + @Test + fun singleAnswerOrNull_multipleAnswers_shouldReturnNull() { + val questionnaireItemViewItem = QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setBoolean(Boolean.newBuilder().setValue(true)) + .build() + } + ) + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setBoolean(Boolean.newBuilder().setValue(true)) + .build() + } + ) + } + ) {} + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + } +} \ No newline at end of file diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemExtensions.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemExtensions.kt index 2f4c07eec3..afd90b81ce 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemExtensions.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/MoreQuestionnaireItemExtensions.kt @@ -20,6 +20,7 @@ import com.google.fhir.r4.core.Questionnaire internal const val ITEM_CONTROL_DROP_DOWN = "drop-down" internal const val ITEM_CONTROL_RADIO_BUTTON = "radio-button" +internal const val ITEM_CONTROL_SLIDER = "slider" internal const val EXTENSION_ITEM_CONTROL_URL = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl" @@ -38,6 +39,7 @@ internal val Questionnaire.Item.itemControl: String? ) { ITEM_CONTROL_DROP_DOWN -> ITEM_CONTROL_DROP_DOWN ITEM_CONTROL_RADIO_BUTTON -> ITEM_CONTROL_RADIO_BUTTON + ITEM_CONTROL_SLIDER -> ITEM_CONTROL_SLIDER else -> null } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt index 14af77fc4c..82f9ee5301 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt @@ -31,6 +31,7 @@ import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextQuanti import com.google.android.fhir.datacapture.views.QuestionnaireItemEditTextSingleLineViewHolderFactory import com.google.android.fhir.datacapture.views.QuestionnaireItemGroupViewHolderFactory import com.google.android.fhir.datacapture.views.QuestionnaireItemRadioGroupViewHolderFactory +import com.google.android.fhir.datacapture.views.QuestionnaireItemSliderViewHolderFactory import com.google.android.fhir.datacapture.views.QuestionnaireItemViewHolder import com.google.android.fhir.datacapture.views.QuestionnaireItemViewItem import com.google.fhir.r4.core.Questionnaire @@ -66,6 +67,8 @@ internal class QuestionnaireItemAdapter : QuestionnaireItemDisplayViewHolderFactory QuestionnaireItemViewHolderType.QUANTITY -> QuestionnaireItemEditTextQuantityViewHolderFactory + QuestionnaireItemViewHolderType.SLIDER -> + QuestionnaireItemSliderViewHolderFactory } return viewHolderFactory.create(parent) } @@ -94,7 +97,7 @@ internal class QuestionnaireItemAdapter : QuestionnaireItemTypeCode.Value.TEXT -> QuestionnaireItemViewHolderType.EDIT_TEXT_MULTI_LINE QuestionnaireItemTypeCode.Value.INTEGER -> - QuestionnaireItemViewHolderType.EDIT_TEXT_INTEGER + getIntegerViewHolderType(questionnaireItem) QuestionnaireItemTypeCode.Value.DECIMAL -> QuestionnaireItemViewHolderType.EDIT_TEXT_DECIMAL QuestionnaireItemTypeCode.Value.CHOICE -> @@ -122,6 +125,15 @@ internal class QuestionnaireItemAdapter : } } + private fun getIntegerViewHolderType(questionnaireItem: Questionnaire.Item): + QuestionnaireItemViewHolderType { + if (questionnaireItem.itemControl == ITEM_CONTROL_SLIDER) { + return QuestionnaireItemViewHolderType.SLIDER + } + return QuestionnaireItemViewHolderType.EDIT_TEXT_INTEGER + } + + internal companion object { // Choice questions are rendered as radio group if number of options less than this constant const val MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DROP_DOWN = 4 diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderType.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderType.kt index 39e778c739..a3af6bcbfe 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderType.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderType.kt @@ -38,7 +38,8 @@ internal enum class QuestionnaireItemViewHolderType(val value: Int) { RADIO_GROUP(8), DROP_DOWN(9), DISPLAY(10), - QUANTITY(11); + QUANTITY(11), + SLIDER(12); companion object { private val VALUES = values() diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt new file mode 100644 index 0000000000..1b60b1d711 --- /dev/null +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -0,0 +1,47 @@ +package com.google.android.fhir.datacapture.views + +import android.view.View +import android.widget.TextView +import com.google.android.fhir.datacapture.R +import com.google.android.material.slider.Slider +import com.google.fhir.r4.core.Integer +import com.google.fhir.r4.core.QuestionnaireResponse + +internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemViewHolderFactory( + R.layout.questionnaire_item_slider +) { + override fun getQuestionnaireItemViewHolderDelegate(): QuestionnaireItemViewHolderDelegate = + object : QuestionnaireItemViewHolderDelegate { + private lateinit var sliderHeader: TextView + private lateinit var slider: Slider + private lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem + + override fun init(itemView: View) { + sliderHeader = itemView.findViewById(R.id.slider_header) + slider = itemView.findViewById(R.id.slider) + } + + override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { + this.questionnaireItemViewItem = questionnaireItemViewItem + val questionnaireItem = questionnaireItemViewItem.questionnaireItem + val answer = questionnaireItemViewItem.singleAnswerOrNull + sliderHeader.text = questionnaireItem.text.value + val sliderValue = answer?.value?.integer?.value?.toString() ?: "0.0" + slider.value = sliderValue.toFloat() + + slider.addOnChangeListener { _, newValue, _ -> + // Responds to when slider's value is changed + QuestionnaireResponse.Item.Answer.newBuilder() + .apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(newValue.toInt()).build()) + .build() + + questionnaireItemViewItem.singleAnswerOrNull = this + questionnaireItemViewItem.questionnaireResponseItemChangedCallback() + } + } + } + + } +} \ No newline at end of file diff --git a/datacapture/src/main/res/layout/questionnaire_item_slider.xml b/datacapture/src/main/res/layout/questionnaire_item_slider.xml new file mode 100644 index 0000000000..a90b309b0b --- /dev/null +++ b/datacapture/src/main/res/layout/questionnaire_item_slider.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/deps.gradle b/deps.gradle index 82075962ef..a11b73680b 100644 --- a/deps.gradle +++ b/deps.gradle @@ -31,7 +31,7 @@ versions.hapi_r4 = '5.3.0' versions.junit = '4.13' versions.kotlin = '1.4.30' versions.lifecycle = '2.2.0' -versions.material = '1.1.0' +versions.material = '1.3.0' versions.okhttp_logging_interceptor = '4.0.0' versions.recyclerview = '1.1.0' versions.retrofit = '2.7.2' From 35c7a442814ac8036a41607aabf8f07d780b5b99 Mon Sep 17 00:00:00 2001 From: salman Date: Fri, 5 Mar 2021 16:50:58 +0500 Subject: [PATCH 2/8] Spotless Apply Formatting Done --- ...SliderViewHolderFactoryInstrumentedTest.kt | 24 +++++++++++++++++-- .../datacapture/QuestionnaireItemAdapter.kt | 1 - ...uestionnaireItemSliderViewHolderFactory.kt | 23 ++++++++++++++---- 3 files changed, 41 insertions(+), 7 deletions(-) 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 5d5d6a0b95..a42796078f 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 @@ -1,3 +1,19 @@ +/* + * Copyright 2020 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 android.widget.FrameLayout @@ -52,6 +68,7 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { Questionnaire.Item.getDefaultInstance(), QuestionnaireResponse.Item.newBuilder() ) {} + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() } @@ -69,7 +86,9 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { ) } ) {} - Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull!!.value.integer.value).isEqualTo(5) + + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull!!.value.integer.value) + .isEqualTo(5) } @Test @@ -93,6 +112,7 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { ) } ) {} + Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() } -} \ No newline at end of file +} diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt index 82f9ee5301..50c3c93bed 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/QuestionnaireItemAdapter.kt @@ -133,7 +133,6 @@ internal class QuestionnaireItemAdapter : return QuestionnaireItemViewHolderType.EDIT_TEXT_INTEGER } - internal companion object { // Choice questions are rendered as radio group if number of options less than this constant const val MINIMUM_NUMBER_OF_ANSWER_OPTIONS_FOR_DROP_DOWN = 4 diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt index 1b60b1d711..6e9c4ddf58 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2020 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 android.view.View @@ -34,14 +50,13 @@ internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemView QuestionnaireResponse.Item.Answer.newBuilder() .apply { value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(newValue.toInt()).build()) - .build() + .setInteger(Integer.newBuilder().setValue(newValue.toInt()) + .build()).build() questionnaireItemViewItem.singleAnswerOrNull = this questionnaireItemViewItem.questionnaireResponseItemChangedCallback() } } } - } -} \ No newline at end of file +} From b1337771d047dcffc157c87a3a4b9839777d4065 Mon Sep 17 00:00:00 2001 From: salman Date: Fri, 5 Mar 2021 17:58:47 +0500 Subject: [PATCH 3/8] One Failing test case has been corrected --- .../fhir/datacapture/QuestionnaireItemViewHolderTypeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderTypeTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderTypeTest.kt index 32af598c48..202395d830 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderTypeTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/QuestionnaireItemViewHolderTypeTest.kt @@ -28,7 +28,7 @@ import org.robolectric.annotation.Config class QuestionnaireItemViewHolderTypeTest { @Test fun size_shouldReturnNumberOfQuestionnaireViewHolderTypes() { - assertThat(QuestionnaireItemViewHolderType.values().size).isEqualTo(12) + assertThat(QuestionnaireItemViewHolderType.values().size).isEqualTo(13) } @Test From c09055466296f5bc0e30201c3d1ef2c250da3c29 Mon Sep 17 00:00:00 2001 From: salman Date: Mon, 8 Mar 2021 17:30:58 +0500 Subject: [PATCH 4/8] Catered some comments --- ...SliderViewHolderFactoryInstrumentedTest.kt | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) 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 a42796078f..8d4af33035 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 @@ -22,8 +22,8 @@ import androidx.appcompat.view.ContextThemeWrapper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.google.android.fhir.datacapture.R -import com.google.common.truth.Truth -import com.google.fhir.r4.core.Boolean +import com.google.android.material.slider.Slider +import com.google.common.truth.Truth.assertThat import com.google.fhir.r4.core.Integer import com.google.fhir.r4.core.Questionnaire import com.google.fhir.r4.core.QuestionnaireResponse @@ -58,7 +58,7 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { ) {} ) - Truth.assertThat(viewHolder.itemView.findViewById(R.id.slider_header).text) + assertThat(viewHolder.itemView.findViewById(R.id.slider_header).text) .isEqualTo("Question?") } @@ -69,26 +69,27 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { QuestionnaireResponse.Item.newBuilder() ) {} - Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() } @Test fun singleAnswerOrNull_singleAnswer_shouldReturnSingleAnswer() { - val questionnaireItemViewItem = QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder().apply { - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(5).build()) - .build() - } - ) - } - ) {} + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + } + ) {} + ) - Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull!!.value.integer.value) - .isEqualTo(5) + assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(10) } @Test @@ -99,20 +100,20 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { addAnswer( QuestionnaireResponse.Item.Answer.newBuilder().apply { value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setBoolean(Boolean.newBuilder().setValue(true)) + .setInteger(Integer.newBuilder().setValue(10).build()) .build() } ) addAnswer( QuestionnaireResponse.Item.Answer.newBuilder().apply { value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setBoolean(Boolean.newBuilder().setValue(true)) + .setInteger(Integer.newBuilder().setValue(10).build()) .build() } ) } ) {} - Truth.assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() } } From b4f516abd6d88e399a3937d666b7a152b47ec6fc Mon Sep 17 00:00:00 2001 From: salman Date: Mon, 8 Mar 2021 17:37:08 +0500 Subject: [PATCH 5/8] Moved hardcoded values from xml to kotlin file --- .../views/QuestionnaireItemSliderViewHolderFactory.kt | 3 +++ .../src/main/res/layout/questionnaire_item_slider.xml | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt index 6e9c4ddf58..6818e54620 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -42,6 +42,9 @@ internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemView val questionnaireItem = questionnaireItemViewItem.questionnaireItem val answer = questionnaireItemViewItem.singleAnswerOrNull sliderHeader.text = questionnaireItem.text.value + slider.valueFrom = 0.0F + slider.valueTo = 100.0F + slider.stepSize = 10.0F val sliderValue = answer?.value?.integer?.value?.toString() ?: "0.0" slider.value = sliderValue.toFloat() diff --git a/datacapture/src/main/res/layout/questionnaire_item_slider.xml b/datacapture/src/main/res/layout/questionnaire_item_slider.xml index a90b309b0b..135b2b6690 100644 --- a/datacapture/src/main/res/layout/questionnaire_item_slider.xml +++ b/datacapture/src/main/res/layout/questionnaire_item_slider.xml @@ -14,8 +14,5 @@ + android:layout_height="wrap_content" /> \ No newline at end of file From 6b7de2d4f4bb2d7a088c75777eb2cf5e980acd1d Mon Sep 17 00:00:00 2001 From: salman Date: Tue, 9 Mar 2021 14:45:07 +0500 Subject: [PATCH 6/8] Comments Handled --- ...SliderViewHolderFactoryInstrumentedTest.kt | 47 ++++++++++++++++++- ...uestionnaireItemSliderViewHolderFactory.kt | 2 +- 2 files changed, 46 insertions(+), 3 deletions(-) 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 8d4af33035..a541c2ebd7 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 @@ -73,7 +73,7 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { } @Test - fun singleAnswerOrNull_singleAnswer_shouldReturnSingleAnswer() { + fun shouldSetSliderValue() { viewHolder.bind( QuestionnaireItemViewItem( Questionnaire.Item.getDefaultInstance(), @@ -93,7 +93,23 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { } @Test - fun singleAnswerOrNull_multipleAnswers_shouldReturnNull() { + fun shouldSetQuestionnaireResponseSliderAnswer() { + val questionnaireItemViewItem = QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder() + ) {} + + viewHolder.bind(questionnaireItemViewItem) + viewHolder.itemView.findViewById(R.id.slider) + .value = 10.0F + + val answer = questionnaireItemViewItem.questionnaireResponseItemBuilder.answerBuilderList + assertThat(answer.size).isEqualTo(1) + assertThat(answer[0].value.integer.value).isEqualTo(10) + } + + @Test + fun shouldSetAnswerToNull() { val questionnaireItemViewItem = QuestionnaireItemViewItem( Questionnaire.Item.getDefaultInstance(), QuestionnaireResponse.Item.newBuilder().apply { @@ -116,4 +132,31 @@ class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() } + + @Test + fun shouldSetSliderValueToDefault() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + } + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(0.0F) + } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt index 6818e54620..a6e36ff77d 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -57,8 +57,8 @@ internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemView .build()).build() questionnaireItemViewItem.singleAnswerOrNull = this - questionnaireItemViewItem.questionnaireResponseItemChangedCallback() } + questionnaireItemViewItem.questionnaireResponseItemChangedCallback() } } } From e720019dce78536c9b03b1a94a4912cff2cf7922 Mon Sep 17 00:00:00 2001 From: salman Date: Tue, 9 Mar 2021 15:57:28 +0500 Subject: [PATCH 7/8] All Changes Requested Done --- .../QuestionnaireItemSliderViewHolderFactory.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt index a6e36ff77d..2b209ee2d0 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -50,14 +50,13 @@ internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemView slider.addOnChangeListener { _, newValue, _ -> // Responds to when slider's value is changed - QuestionnaireResponse.Item.Answer.newBuilder() - .apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(newValue.toInt()) - .build()).build() - - questionnaireItemViewItem.singleAnswerOrNull = this - } + questionnaireItemViewItem.singleAnswerOrNull = + QuestionnaireResponse.Item.Answer.newBuilder() + .apply { + value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(newValue.toInt()) + .build()).build() + } questionnaireItemViewItem.questionnaireResponseItemChangedCallback() } } From 78fad2942285dbe8ba66d83a2c1775d97ac28004 Mon Sep 17 00:00:00 2001 From: salman Date: Thu, 11 Mar 2021 20:08:20 +0500 Subject: [PATCH 8/8] Resolved Conflicts and Updated the code with latest Coding Conventions --- ...SliderViewHolderFactoryInstrumentedTest.kt | 260 +++++++++--------- ...uestionnaireItemSliderViewHolderFactory.kt | 65 +++-- 2 files changed, 167 insertions(+), 158 deletions(-) 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 a541c2ebd7..5d15d32768 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 @@ -33,130 +33,140 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class QuestionnaireItemSliderViewHolderFactoryInstrumentedTest { - private lateinit var context: ContextThemeWrapper - private lateinit var parent: FrameLayout - private lateinit var viewHolder: QuestionnaireItemViewHolder - - @Before - fun setUp() { - context = ContextThemeWrapper( - InstrumentationRegistry.getInstrumentation().targetContext, - R.style.Theme_MaterialComponents - ) - parent = FrameLayout(context) - viewHolder = QuestionnaireItemSliderViewHolderFactory.create(parent) - } - - @Test - fun shouldSetHeaderTextViewText() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.Item.newBuilder().apply { - text = com.google.fhir.r4.core.String.newBuilder().setValue("Question?").build() - }.build(), - QuestionnaireResponse.Item.newBuilder() - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.slider_header).text) - .isEqualTo("Question?") - } - - @Test - fun singleAnswerOrNull_noAnswer_shouldReturnNull() { - val questionnaireItemViewItem = QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder() - ) {} - - assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() - } - - @Test - fun shouldSetSliderValue() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder().apply { - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(10).build()) - .build() - } - ) - } - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(10) - } - - @Test - fun shouldSetQuestionnaireResponseSliderAnswer() { - val questionnaireItemViewItem = QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder() - ) {} - - viewHolder.bind(questionnaireItemViewItem) - viewHolder.itemView.findViewById(R.id.slider) - .value = 10.0F - - val answer = questionnaireItemViewItem.questionnaireResponseItemBuilder.answerBuilderList - assertThat(answer.size).isEqualTo(1) - assertThat(answer[0].value.integer.value).isEqualTo(10) - } - - @Test - fun shouldSetAnswerToNull() { - val questionnaireItemViewItem = QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder().apply { - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(10).build()) - .build() - } - ) - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(10).build()) - .build() - } - ) + private lateinit var context: ContextThemeWrapper + private lateinit var parent: FrameLayout + private lateinit var viewHolder: QuestionnaireItemViewHolder + + @Before + fun setUp() { + context = + ContextThemeWrapper( + InstrumentationRegistry.getInstrumentation().targetContext, + R.style.Theme_MaterialComponents + ) + parent = FrameLayout(context) + viewHolder = QuestionnaireItemSliderViewHolderFactory.create(parent) + } + + @Test + fun shouldSetHeaderTextViewText() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.newBuilder() + .apply { + text = com.google.fhir.r4.core.String.newBuilder().setValue("Question?").build() + } + .build(), + QuestionnaireResponse.Item.newBuilder() + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.slider_header).text) + .isEqualTo("Question?") + } + + @Test + fun singleAnswerOrNull_noAnswer_shouldReturnNull() { + val questionnaireItemViewItem = + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder() + ) {} + + assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + } + + @Test + fun shouldSetSliderValue() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() } - ) {} - - assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() - } - - @Test - fun shouldSetSliderValueToDefault() { - viewHolder.bind( - QuestionnaireItemViewItem( - Questionnaire.Item.getDefaultInstance(), - QuestionnaireResponse.Item.newBuilder().apply { - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(10).build()) - .build() - } - ) - addAnswer( - QuestionnaireResponse.Item.Answer.newBuilder().apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(10).build()) - .build() - } - ) - } - ) {} - ) - - assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(0.0F) - } + ) + } + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(10) + } + + @Test + fun shouldSetQuestionnaireResponseSliderAnswer() { + val questionnaireItemViewItem = + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder() + ) {} + + viewHolder.bind(questionnaireItemViewItem) + viewHolder.itemView.findViewById(R.id.slider).value = 10.0F + + val answer = questionnaireItemViewItem.questionnaireResponseItemBuilder.answerBuilderList + assertThat(answer.size).isEqualTo(1) + assertThat(answer[0].value.integer.value).isEqualTo(10) + } + + @Test + fun shouldSetAnswerToNull() { + val questionnaireItemViewItem = + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + } + ) {} + + assertThat(questionnaireItemViewItem.singleAnswerOrNull).isNull() + } + + @Test + fun shouldSetSliderValueToDefault() { + viewHolder.bind( + QuestionnaireItemViewItem( + Questionnaire.Item.getDefaultInstance(), + QuestionnaireResponse.Item.newBuilder().apply { + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + addAnswer( + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(10).build()) + .build() + } + ) + } + ) {} + ) + + assertThat(viewHolder.itemView.findViewById(R.id.slider).value).isEqualTo(0.0F) + } } diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt index 2b209ee2d0..56184899bc 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/QuestionnaireItemSliderViewHolderFactory.kt @@ -23,42 +23,41 @@ import com.google.android.material.slider.Slider import com.google.fhir.r4.core.Integer import com.google.fhir.r4.core.QuestionnaireResponse -internal object QuestionnaireItemSliderViewHolderFactory : QuestionnaireItemViewHolderFactory( - R.layout.questionnaire_item_slider -) { - override fun getQuestionnaireItemViewHolderDelegate(): QuestionnaireItemViewHolderDelegate = - object : QuestionnaireItemViewHolderDelegate { - private lateinit var sliderHeader: TextView - private lateinit var slider: Slider - private lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem +internal object QuestionnaireItemSliderViewHolderFactory : + QuestionnaireItemViewHolderFactory(R.layout.questionnaire_item_slider) { + override fun getQuestionnaireItemViewHolderDelegate(): QuestionnaireItemViewHolderDelegate = + object : QuestionnaireItemViewHolderDelegate { + private lateinit var sliderHeader: TextView + private lateinit var slider: Slider + private lateinit var questionnaireItemViewItem: QuestionnaireItemViewItem - override fun init(itemView: View) { - sliderHeader = itemView.findViewById(R.id.slider_header) - slider = itemView.findViewById(R.id.slider) - } + override fun init(itemView: View) { + sliderHeader = itemView.findViewById(R.id.slider_header) + slider = itemView.findViewById(R.id.slider) + } - override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { - this.questionnaireItemViewItem = questionnaireItemViewItem - val questionnaireItem = questionnaireItemViewItem.questionnaireItem - val answer = questionnaireItemViewItem.singleAnswerOrNull - sliderHeader.text = questionnaireItem.text.value - slider.valueFrom = 0.0F - slider.valueTo = 100.0F - slider.stepSize = 10.0F - val sliderValue = answer?.value?.integer?.value?.toString() ?: "0.0" - slider.value = sliderValue.toFloat() + override fun bind(questionnaireItemViewItem: QuestionnaireItemViewItem) { + this.questionnaireItemViewItem = questionnaireItemViewItem + val questionnaireItem = questionnaireItemViewItem.questionnaireItem + val answer = questionnaireItemViewItem.singleAnswerOrNull + sliderHeader.text = questionnaireItem.text.value + slider.valueFrom = 0.0F + slider.valueTo = 100.0F + slider.stepSize = 10.0F + val sliderValue = answer?.value?.integer?.value?.toString() ?: "0.0" + slider.value = sliderValue.toFloat() - slider.addOnChangeListener { _, newValue, _ -> - // Responds to when slider's value is changed - questionnaireItemViewItem.singleAnswerOrNull = - QuestionnaireResponse.Item.Answer.newBuilder() - .apply { - value = QuestionnaireResponse.Item.Answer.ValueX.newBuilder() - .setInteger(Integer.newBuilder().setValue(newValue.toInt()) - .build()).build() - } - questionnaireItemViewItem.questionnaireResponseItemChangedCallback() - } + slider.addOnChangeListener { _, newValue, _ -> + // Responds to when slider's value is changed + questionnaireItemViewItem.singleAnswerOrNull = + QuestionnaireResponse.Item.Answer.newBuilder().apply { + value = + QuestionnaireResponse.Item.Answer.ValueX.newBuilder() + .setInteger(Integer.newBuilder().setValue(newValue.toInt()).build()) + .build() } + questionnaireItemViewItem.questionnaireResponseItemChangedCallback() } + } + } }