From 0e29b3d2f759d13894cf360cfac8da7e4e7eaaaa Mon Sep 17 00:00:00 2001 From: "Md. Asaduzzaman" Date: Sun, 11 Feb 2024 12:50:35 +0600 Subject: [PATCH 1/5] Added Support for optionExclusive Extension in Popup --- .../views/OptionSelectDialogFragment.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt index 6a6cd229e5..4e2883e276 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt @@ -40,6 +40,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.extensions.itemAnswerOptionImage +import com.google.android.fhir.datacapture.extensions.optionExclusive import com.google.android.fhir.datacapture.views.factories.OptionSelectOption import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemDialogSelectViewModel import com.google.android.fhir.datacapture.views.factories.SelectedOptions @@ -263,6 +264,8 @@ private class OptionSelectAdapter(val multiSelectEnabled: Boolean) : * if "Other" was just deselected, or adding them if "Other" was just selected). */ private fun submitSelectedChange(position: Int, selected: Boolean) { + val selectedItem = currentList[position] + val newList: List = currentList .mapIndexed { index, row -> @@ -272,8 +275,16 @@ private class OptionSelectAdapter(val multiSelectEnabled: Boolean) : } else { // This is some other row if (multiSelectEnabled) { - // In multi-select mode, the other rows don't need to change - row + // In multi-select mode, + if (selected && ((selectedItem is OptionSelectRow.Option && selectedItem.option.item.optionExclusive) + || (row is OptionSelectRow.Option && row.option.item.optionExclusive))) { + // if the selected answer option has optionExclusive extension, then deselect other answer options. + // or if the selected answer option does not have optionExclusive extension, then deselect optionExclusive answer option. + row.withSelectedState(selected = false) ?: row + } else { + // the other rows don't need to change + row + } } else { // In single-select mode, we need to disable all of the other rows row.withSelectedState(selected = false) ?: row From 3ebc6370fa75ece0ca01e6daf7736165a1eefae8 Mon Sep 17 00:00:00 2001 From: "Md. Asaduzzaman" Date: Tue, 13 Feb 2024 12:17:44 +0600 Subject: [PATCH 2/5] Added Test Cases for optionExclusive Extension in Popup --- ...ultiSelectViewHolderFactoryEspressoTest.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt index 4c3b530c55..0090a73b53 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt @@ -35,6 +35,7 @@ import com.google.android.fhir.datacapture.R import com.google.android.fhir.datacapture.extensions.DisplayItemControlType import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_CONTROL_SYSTEM import com.google.android.fhir.datacapture.extensions.EXTENSION_ITEM_CONTROL_URL +import com.google.android.fhir.datacapture.extensions.EXTENSION_OPTION_EXCLUSIVE_URL import com.google.android.fhir.datacapture.extensions.ItemControlTypes import com.google.android.fhir.datacapture.test.TestActivity import com.google.android.fhir.datacapture.test.utilities.assertQuestionnaireResponseAtIndex @@ -52,6 +53,7 @@ import com.google.android.material.textfield.TextInputLayout import com.google.common.truth.StringSubject import com.google.common.truth.Truth.assertThat import org.hamcrest.Matchers.not +import org.hl7.fhir.r4.model.BooleanType import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Extension @@ -101,6 +103,62 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3", "Coding 5") } + @Test + fun multipleChoice_selectMultiple_selectExclusive_clickSave_shouldSaveOnlyExclusiveOption() { + var answerHolder: List? = null + val questionnaireViewItem = + QuestionnaireViewItem( + answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }), + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + clickOnTextInDialog("Coding 1") + clickOnText("Coding 3") + clickOnText("Coding 5") + clickOnText("Coding Exclusive") + clickOnText("Save") + + assertDisplayedText().isEqualTo("Coding Exclusive") + assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding Exclusive") + } + + @Test + fun multipleChoice_selectExclusive_selectMultiple_clickSave_shouldSaveWithoutExclusiveOption() { + var answerHolder: List? = null + val questionnaireViewItem = + QuestionnaireViewItem( + answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }), + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + clickOnTextInDialog("Coding Exclusive") + clickOnText("Coding 1") + clickOnText("Coding 3") + clickOnText("Coding 5") + clickOnText("Save") + + assertDisplayedText().isEqualTo("Coding 1, Coding 3, Coding 5") + assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3", "Coding 5") + } + @Test fun multipleChoice_SelectNothing_clickSave_shouldSaveNothing() { val questionnaireViewItem = From 4bda980d1c91dff096a9de78fec240be232d94f5 Mon Sep 17 00:00:00 2001 From: "Md. Asaduzzaman" Date: Wed, 14 Feb 2024 13:22:34 +0600 Subject: [PATCH 3/5] Added Other Test Cases for optionExclusive Extension in Popup --- ...ultiSelectViewHolderFactoryEspressoTest.kt | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt index 0090a73b53..93fd532d5e 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt @@ -159,6 +159,70 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3", "Coding 5") } + @Test + fun multipleChoice_multipleOptionExclusive_selectMultiple_selectExclusive1_selectExclusive2_clickSave_shouldSaveOnlyLastSelectedExclusiveOption() { + var answerHolder: List? = null + val questionnaireViewItem = + QuestionnaireViewItem( + answerOptions(true, "Coding 1", "Coding 2", "Coding 3") + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 1" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }) + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 2" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }), + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + clickOnTextInDialog("Coding 1") + clickOnText("Coding 3") + clickOnText("Coding Exclusive 1") + clickOnText("Coding Exclusive 2") + clickOnText("Save") + + assertDisplayedText().isEqualTo("Coding Exclusive 2") + assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding Exclusive 2") + } + + @Test + fun multipleChoice_multipleOptionExclusive_selectExclusive1_selectExclusive2_selectMultiple_clickSave_shouldSaveWithoutAnyExclusiveOption() { + var answerHolder: List? = null + val questionnaireViewItem = + QuestionnaireViewItem( + answerOptions(true, "Coding 1", "Coding 2", "Coding 3") + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 1" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }) + .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 2" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }), + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + clickOnTextInDialog("Coding Exclusive 1") + clickOnTextInDialog("Coding Exclusive 2") + clickOnText("Coding 1") + clickOnText("Coding 3") + clickOnText("Save") + + assertDisplayedText().isEqualTo("Coding 1, Coding 3") + assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3") + } + @Test fun multipleChoice_SelectNothing_clickSave_shouldSaveNothing() { val questionnaireViewItem = @@ -422,6 +486,85 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { onView(withId(R.id.add_another)).check(matches(isDisplayed())) } + @Test + @SdkSuppress(minSdkVersion = 33) + fun selectOther_selectExclusive_shouldHideAddAnotherAnswer() { + val questionnaireItem = + answerOptions( + true, + "Coding 1", + "Coding 2", + "Coding 3", + "Coding 4", + "Coding 5", + "Coding 6", + "Coding 7", + "Coding 8", + ).addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }) + + questionnaireItem.addExtension(openChoiceType) + val questionnaireViewItem = + QuestionnaireViewItem( + questionnaireItem, + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + onView(withId(R.id.recycler_view)) + .perform(RecyclerViewActions.scrollToPosition(9)) + clickOnTextInDialog("Other") + clickOnTextInDialog("Coding Exclusive") + onView(withId(R.id.add_another)).check(doesNotExist()) + } + + @Test + @SdkSuppress(minSdkVersion = 33) + fun selectOther_clickAddAnotherAnswer_selectExclusive_shouldHideAddAnotherAnswerWithEditText() { + val questionnaireItem = + answerOptions( + true, + "Coding 1", + "Coding 2", + "Coding 3", + "Coding 4", + "Coding 5", + "Coding 6", + "Coding 7", + "Coding 8", + ).addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }) + + questionnaireItem.addExtension(openChoiceType) + val questionnaireViewItem = + QuestionnaireViewItem( + questionnaireItem, + responseOptions(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + ) + + runOnUI { viewHolder.bind(questionnaireViewItem) } + + endIconClickInTextInputLayout(R.id.multi_select_summary_holder) + onView(withId(R.id.recycler_view)) + .perform(RecyclerViewActions.scrollToPosition(9)) + clickOnTextInDialog("Other") + onView(withId(R.id.add_another)).perform(delayMainThread()) + onView(withId(R.id.add_another)).perform(click()) + clickOnTextInDialog("Coding Exclusive") + onView(withId(R.id.add_another)).check(doesNotExist()) + onView(withId(R.id.edit_text)).check(doesNotExist()) + } + @Test fun shouldHideErrorTextviewInHeader() { val questionnaireItem = answerOptions(true, "Coding 1") From c0b86c8e69d8e52518d100c0b77b9c1a95c1ab67 Mon Sep 17 00:00:00 2001 From: "Md. Asaduzzaman" Date: Fri, 23 Feb 2024 04:31:23 +0600 Subject: [PATCH 4/5] Update Code Formatting to Fix Build Error --- ...ultiSelectViewHolderFactoryEspressoTest.kt | 120 ++++++++++-------- .../views/OptionSelectDialogFragment.kt | 16 ++- 2 files changed, 80 insertions(+), 56 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt index 93fd532d5e..50bff5782a 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,10 +109,12 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { val questionnaireViewItem = QuestionnaireViewItem( answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }), + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ), responseOptions(), validationResult = NotValidated, answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, @@ -137,10 +139,12 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { val questionnaireViewItem = QuestionnaireViewItem( answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }), + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ), responseOptions(), validationResult = NotValidated, answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, @@ -165,14 +169,18 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { val questionnaireViewItem = QuestionnaireViewItem( answerOptions(true, "Coding 1", "Coding 2", "Coding 3") - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive 1" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }) - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive 2" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }), + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 1" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ) + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 2" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ), responseOptions(), validationResult = NotValidated, answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, @@ -197,14 +205,18 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { val questionnaireViewItem = QuestionnaireViewItem( answerOptions(true, "Coding 1", "Coding 2", "Coding 3") - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive 1" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }) - .addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive 2" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }), + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 1" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ) + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive 2" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ), responseOptions(), validationResult = NotValidated, answersChangedCallback = { _, _, answers, _ -> answerHolder = answers }, @@ -491,19 +503,22 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { fun selectOther_selectExclusive_shouldHideAddAnotherAnswer() { val questionnaireItem = answerOptions( - true, - "Coding 1", - "Coding 2", - "Coding 3", - "Coding 4", - "Coding 5", - "Coding 6", - "Coding 7", - "Coding 8", - ).addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }) + true, + "Coding 1", + "Coding 2", + "Coding 3", + "Coding 4", + "Coding 5", + "Coding 6", + "Coding 7", + "Coding 8", + ) + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ) questionnaireItem.addExtension(openChoiceType) val questionnaireViewItem = @@ -529,19 +544,22 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { fun selectOther_clickAddAnotherAnswer_selectExclusive_shouldHideAddAnotherAnswerWithEditText() { val questionnaireItem = answerOptions( - true, - "Coding 1", - "Coding 2", - "Coding 3", - "Coding 4", - "Coding 5", - "Coding 6", - "Coding 7", - "Coding 8", - ).addAnswerOption(Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { - value = Coding().apply { display = "Coding Exclusive" } - extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) - }) + true, + "Coding 1", + "Coding 2", + "Coding 3", + "Coding 4", + "Coding 5", + "Coding 6", + "Coding 7", + "Coding 8", + ) + .addAnswerOption( + Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { + value = Coding().apply { display = "Coding Exclusive" } + extension = listOf(Extension(EXTENSION_OPTION_EXCLUSIVE_URL, BooleanType(true))) + }, + ) questionnaireItem.addExtension(openChoiceType) val questionnaireViewItem = diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt index 4e2883e276..15ad260a81 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/OptionSelectDialogFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Google LLC + * Copyright 2022-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -276,10 +276,16 @@ private class OptionSelectAdapter(val multiSelectEnabled: Boolean) : // This is some other row if (multiSelectEnabled) { // In multi-select mode, - if (selected && ((selectedItem is OptionSelectRow.Option && selectedItem.option.item.optionExclusive) - || (row is OptionSelectRow.Option && row.option.item.optionExclusive))) { - // if the selected answer option has optionExclusive extension, then deselect other answer options. - // or if the selected answer option does not have optionExclusive extension, then deselect optionExclusive answer option. + if ( + selected && + ((selectedItem is OptionSelectRow.Option && + selectedItem.option.item.optionExclusive) || + (row is OptionSelectRow.Option && row.option.item.optionExclusive)) + ) { + // if the selected answer option has optionExclusive extension, then deselect other + // answer options. + // or if the selected answer option does not have optionExclusive extension, then + // deselect optionExclusive answer option. row.withSelectedState(selected = false) ?: row } else { // the other rows don't need to change From 585923539f5dad5db6279f31663a36bdca2dfe07 Mon Sep 17 00:00:00 2001 From: "Md. Asaduzzaman" Date: Tue, 27 Feb 2024 13:08:48 +0600 Subject: [PATCH 5/5] Less Answer Option Items to Avoid Failure of Test Cases --- ...emDialogMultiSelectViewHolderFactoryEspressoTest.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt index 50bff5782a..911790cb01 100644 --- a/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt +++ b/datacapture/src/androidTest/java/com/google/android/fhir/datacapture/test/views/QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest.kt @@ -108,7 +108,7 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { var answerHolder: List? = null val questionnaireViewItem = QuestionnaireViewItem( - answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") + answerOptions(true, "Coding 1", "Coding 2", "Coding 3") .addAnswerOption( Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { value = Coding().apply { display = "Coding Exclusive" } @@ -125,7 +125,6 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { endIconClickInTextInputLayout(R.id.multi_select_summary_holder) clickOnTextInDialog("Coding 1") clickOnText("Coding 3") - clickOnText("Coding 5") clickOnText("Coding Exclusive") clickOnText("Save") @@ -138,7 +137,7 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { var answerHolder: List? = null val questionnaireViewItem = QuestionnaireViewItem( - answerOptions(true, "Coding 1", "Coding 2", "Coding 3", "Coding 4", "Coding 5") + answerOptions(true, "Coding 1", "Coding 2", "Coding 3") .addAnswerOption( Questionnaire.QuestionnaireItemAnswerOptionComponent().apply { value = Coding().apply { display = "Coding Exclusive" } @@ -156,11 +155,10 @@ class QuestionnaireItemDialogMultiSelectViewHolderFactoryEspressoTest { clickOnTextInDialog("Coding Exclusive") clickOnText("Coding 1") clickOnText("Coding 3") - clickOnText("Coding 5") clickOnText("Save") - assertDisplayedText().isEqualTo("Coding 1, Coding 3, Coding 5") - assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3", "Coding 5") + assertDisplayedText().isEqualTo("Coding 1, Coding 3") + assertQuestionnaireResponseAtIndex(answerHolder!!, "Coding 1", "Coding 3") } @Test