From 3260a1ea7c4409fee1208cca290c567c9edf098b Mon Sep 17 00:00:00 2001 From: aditya-07 Date: Tue, 9 Jan 2024 14:50:30 +0530 Subject: [PATCH] Cleanup the text during the re-bind of the Decimal and Integer view holders. (#2403) * Set the draft value and clear the text when answer values are not there * Review comments: Refactored code and tests --- .../EditTextDecimalViewHolderFactory.kt | 15 +++---- .../EditTextIntegerViewHolderFactory.kt | 12 +++--- .../EditTextDecimalViewHolderFactoryTest.kt | 40 ++++++++++++++++++- .../EditTextIntegerViewHolderFactoryTest.kt | 40 ++++++++++++++++++- 4 files changed, 93 insertions(+), 14 deletions(-) diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactory.kt index 31a5058c53..a4fb8d2443 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactory.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. @@ -47,16 +47,17 @@ internal object EditTextDecimalViewHolderFactory : ) { val questionnaireItemViewItemDecimalAnswer = questionnaireViewItem.answers.singleOrNull()?.valueDecimalType?.value?.toString() - val draftAnswer = questionnaireViewItem.draftAnswer?.toString() - val decimalStringToDisplay = questionnaireItemViewItemDecimalAnswer ?: draftAnswer - - if ( - decimalStringToDisplay?.toDoubleOrNull() != + if (questionnaireItemViewItemDecimalAnswer.isNullOrEmpty() && draftAnswer.isNullOrEmpty()) { + textInputEditText.setText("") + } else if ( + questionnaireItemViewItemDecimalAnswer?.toDoubleOrNull() != textInputEditText.text.toString().toDoubleOrNull() ) { - textInputEditText.setText(decimalStringToDisplay) + textInputEditText.setText(questionnaireItemViewItemDecimalAnswer) + } else if (draftAnswer != null && draftAnswer != textInputEditText.text.toString()) { + textInputEditText.setText(draftAnswer) } // Update error message if draft answer present if (draftAnswer != null) { diff --git a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactory.kt b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactory.kt index bb87204486..b9da83ca2b 100644 --- a/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactory.kt +++ b/datacapture/src/main/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactory.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. @@ -64,14 +64,16 @@ internal object EditTextIntegerViewHolderFactory : questionnaireViewItem.answers.singleOrNull()?.valueIntegerType?.value?.toString() val draftAnswer = questionnaireViewItem.draftAnswer?.toString() - val text = answer ?: draftAnswer - // Update the text on the UI only if the value of the saved answer or draft answer // is different from what the user is typing. We compare the two fields as integers to // avoid shifting focus if the text values are different, but their integer representation // is the same (e.g. "001" compared to "1") - if ((text?.toIntOrNull() != textInputEditText.text.toString().toIntOrNull())) { - textInputEditText.setText(text) + if (answer.isNullOrEmpty() && draftAnswer.isNullOrEmpty()) { + textInputEditText.setText("") + } else if (answer?.toIntOrNull() != textInputEditText.text.toString().toIntOrNull()) { + textInputEditText.setText(answer) + } else if (draftAnswer != null && draftAnswer != textInputEditText.text.toString()) { + textInputEditText.setText(draftAnswer) } // Update error message if draft answer present diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactoryTest.kt index 8fcfa3f609..45aca98cc5 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextDecimalViewHolderFactoryTest.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. @@ -447,4 +447,42 @@ class EditTextDecimalViewHolderFactoryTest { assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).helperText) .isNull() } + + @Test + fun `bind again should remove previous text`() { + viewHolder.bind( + QuestionnaireViewItem( + Questionnaire.QuestionnaireItemComponent(), + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + draftAnswer = "1.1.1.1", + ), + ) + + assertThat( + viewHolder.itemView + .findViewById(R.id.text_input_edit_text) + .text + .toString(), + ) + .isEqualTo("1.1.1.1") + + viewHolder.bind( + QuestionnaireViewItem( + Questionnaire.QuestionnaireItemComponent(), + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + ), + ) + + assertThat( + viewHolder.itemView + .findViewById(R.id.text_input_edit_text) + .text + .toString(), + ) + .isEqualTo("") + } } diff --git a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactoryTest.kt b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactoryTest.kt index a0a8bb9d76..4f3eb3a056 100644 --- a/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactoryTest.kt +++ b/datacapture/src/test/java/com/google/android/fhir/datacapture/views/factories/EditTextIntegerViewHolderFactoryTest.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. @@ -369,4 +369,42 @@ class EditTextIntegerViewHolderFactoryTest { assertThat(viewHolder.itemView.findViewById(R.id.text_input_layout).helperText) .isNull() } + + @Test + fun `bind again should remove previous text`() { + viewHolder.bind( + QuestionnaireViewItem( + Questionnaire.QuestionnaireItemComponent(), + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + draftAnswer = "9999999999", + ), + ) + + assertThat( + viewHolder.itemView + .findViewById(R.id.text_input_edit_text) + .text + .toString(), + ) + .isEqualTo("9999999999") + + viewHolder.bind( + QuestionnaireViewItem( + Questionnaire.QuestionnaireItemComponent(), + QuestionnaireResponse.QuestionnaireResponseItemComponent(), + validationResult = NotValidated, + answersChangedCallback = { _, _, _, _ -> }, + ), + ) + + assertThat( + viewHolder.itemView + .findViewById(R.id.text_input_edit_text) + .text + .toString(), + ) + .isEqualTo("") + } }