From 52e1261cc5605eace61a5627f038c57d3fa317c4 Mon Sep 17 00:00:00 2001 From: masclot Date: Tue, 17 Oct 2023 16:32:42 +0200 Subject: [PATCH 01/20] In FractionInteraction UI, leave submit button enabled when answer is empty. Show an error on submitting an empty answer. --- .../FractionInteractionViewModel.kt | 30 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index 22d42a74744..2360454d433 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -43,12 +43,17 @@ class FractionInteractionViewModel private constructor( override fun onPropertyChanged(sender: Observable, propertyId: Int) { errorOrAvailabilityCheckReceiver.onPendingAnswerErrorOrAvailabilityCheck( pendingAnswerError, - answerText.isNotEmpty() + true // Allow submit on empty answer ) } } errorMessage.addOnPropertyChangedCallback(callback) isAnswerAvailable.addOnPropertyChangedCallback(callback) + // Apply defaults: + errorOrAvailabilityCheckReceiver.onPendingAnswerErrorOrAvailabilityCheck( + null, + true + ) } override fun getPendingAnswer(): UserAnswer = UserAnswer.newBuilder().apply { @@ -64,23 +69,28 @@ class FractionInteractionViewModel private constructor( /** It checks the pending error for the current fraction input, and correspondingly updates the error string based on the specified error category. */ override fun checkPendingAnswerError(category: AnswerErrorCategory): String? { - if (answerText.isNotEmpty()) { - when (category) { - AnswerErrorCategory.REAL_TIME -> { + when (category) { + AnswerErrorCategory.REAL_TIME -> { + if (answerText.isNotEmpty()) { pendingAnswerError = FractionParsingUiError.createFromParsingError( fractionParser.getRealTimeAnswerError(answerText.toString()) ).getErrorMessageFromStringRes(resourceHandler) + } else { + pendingAnswerError = null } - AnswerErrorCategory.SUBMIT_TIME -> { - pendingAnswerError = - FractionParsingUiError.createFromParsingError( - fractionParser.getSubmitTimeError(answerText.toString()) - ).getErrorMessageFromStringRes(resourceHandler) + } + AnswerErrorCategory.SUBMIT_TIME -> { + pendingAnswerError = if (answerText.isNotEmpty()) { + FractionParsingUiError.createFromParsingError( + fractionParser.getSubmitTimeError(answerText.toString()) + ).getErrorMessageFromStringRes(resourceHandler) + } else { + resourceHandler.getStringInLocale(R.string.interaction_answer_empty_on_submit) } } - errorMessage.set(pendingAnswerError) } + errorMessage.set(pendingAnswerError) return pendingAnswerError } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79ec1534ff1..30e6545b825 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -606,4 +606,5 @@ Lock Icon Download Status html Content + "Enter an answer to continue" From c89659d60e872d0b73e36825f3e92c781907d397 Mon Sep 17 00:00:00 2001 From: masclot Date: Tue, 17 Oct 2023 17:03:51 +0200 Subject: [PATCH 02/20] Fix error message --- .../state/itemviewmodel/FractionInteractionViewModel.kt | 5 +---- app/src/main/res/values/strings.xml | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index 2360454d433..d2374833c24 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -81,13 +81,10 @@ class FractionInteractionViewModel private constructor( } } AnswerErrorCategory.SUBMIT_TIME -> { - pendingAnswerError = if (answerText.isNotEmpty()) { + pendingAnswerError = FractionParsingUiError.createFromParsingError( fractionParser.getSubmitTimeError(answerText.toString()) ).getErrorMessageFromStringRes(resourceHandler) - } else { - resourceHandler.getStringInLocale(R.string.interaction_answer_empty_on_submit) - } } } errorMessage.set(pendingAnswerError) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 30e6545b825..79ec1534ff1 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -606,5 +606,4 @@ Lock Icon Download Status html Content - "Enter an answer to continue" From 0ec1bc7b5e9f083f04981ff215960a1c086d5875 Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 15:51:09 +0100 Subject: [PATCH 03/20] Address PR comments --- .../itemviewmodel/FractionInteractionViewModel.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index d2374833c24..b88f5c8762b 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -71,13 +71,12 @@ class FractionInteractionViewModel private constructor( override fun checkPendingAnswerError(category: AnswerErrorCategory): String? { when (category) { AnswerErrorCategory.REAL_TIME -> { - if (answerText.isNotEmpty()) { - pendingAnswerError = - FractionParsingUiError.createFromParsingError( - fractionParser.getRealTimeAnswerError(answerText.toString()) - ).getErrorMessageFromStringRes(resourceHandler) + pendingAnswerError = if (answerText.isNotEmpty()) { + FractionParsingUiError.createFromParsingError( + fractionParser.getRealTimeAnswerError(answerText.toString()) + ).getErrorMessageFromStringRes(resourceHandler) } else { - pendingAnswerError = null + null } } AnswerErrorCategory.SUBMIT_TIME -> { From 44a88c78dd366100afab0dd0daa200c69bbec6d2 Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 15:51:39 +0100 Subject: [PATCH 04/20] Address PR comments --- .../itemviewmodel/FractionInteractionViewModel.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index b88f5c8762b..d2374833c24 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -71,12 +71,13 @@ class FractionInteractionViewModel private constructor( override fun checkPendingAnswerError(category: AnswerErrorCategory): String? { when (category) { AnswerErrorCategory.REAL_TIME -> { - pendingAnswerError = if (answerText.isNotEmpty()) { - FractionParsingUiError.createFromParsingError( - fractionParser.getRealTimeAnswerError(answerText.toString()) - ).getErrorMessageFromStringRes(resourceHandler) + if (answerText.isNotEmpty()) { + pendingAnswerError = + FractionParsingUiError.createFromParsingError( + fractionParser.getRealTimeAnswerError(answerText.toString()) + ).getErrorMessageFromStringRes(resourceHandler) } else { - null + pendingAnswerError = null } } AnswerErrorCategory.SUBMIT_TIME -> { From 21e1d91785f6778551416d21c6cf1a199feb135e Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 16:06:10 +0100 Subject: [PATCH 05/20] Address PR comments --- .../itemviewmodel/FractionInteractionViewModel.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index d2374833c24..b88f5c8762b 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -71,13 +71,12 @@ class FractionInteractionViewModel private constructor( override fun checkPendingAnswerError(category: AnswerErrorCategory): String? { when (category) { AnswerErrorCategory.REAL_TIME -> { - if (answerText.isNotEmpty()) { - pendingAnswerError = - FractionParsingUiError.createFromParsingError( - fractionParser.getRealTimeAnswerError(answerText.toString()) - ).getErrorMessageFromStringRes(resourceHandler) + pendingAnswerError = if (answerText.isNotEmpty()) { + FractionParsingUiError.createFromParsingError( + fractionParser.getRealTimeAnswerError(answerText.toString()) + ).getErrorMessageFromStringRes(resourceHandler) } else { - pendingAnswerError = null + null } } AnswerErrorCategory.SUBMIT_TIME -> { From d37362b614c8f2230ed07a81b3d8084bf0e117be Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 16:33:46 +0100 Subject: [PATCH 06/20] Add new error message when the text to be parsed for a fraction is empty. --- .../itemviewmodel/FractionInteractionViewModel.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt index b88f5c8762b..d2374833c24 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/FractionInteractionViewModel.kt @@ -71,12 +71,13 @@ class FractionInteractionViewModel private constructor( override fun checkPendingAnswerError(category: AnswerErrorCategory): String? { when (category) { AnswerErrorCategory.REAL_TIME -> { - pendingAnswerError = if (answerText.isNotEmpty()) { - FractionParsingUiError.createFromParsingError( - fractionParser.getRealTimeAnswerError(answerText.toString()) - ).getErrorMessageFromStringRes(resourceHandler) + if (answerText.isNotEmpty()) { + pendingAnswerError = + FractionParsingUiError.createFromParsingError( + fractionParser.getRealTimeAnswerError(answerText.toString()) + ).getErrorMessageFromStringRes(resourceHandler) } else { - null + pendingAnswerError = null } } AnswerErrorCategory.SUBMIT_TIME -> { From 984d9432b339655e2f95ee81937951afdd0b26d9 Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 16:33:47 +0100 Subject: [PATCH 07/20] Add new error message when the text to be parsed for a fraction is empty. --- .../oppia/android/app/parser/FractionParsingUiError.kt | 6 +++++- app/src/main/res/values/strings.xml | 1 + .../java/org/oppia/android/util/math/FractionParser.kt | 9 ++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/parser/FractionParsingUiError.kt b/app/src/main/java/org/oppia/android/app/parser/FractionParsingUiError.kt index 731d26e0590..81cd9e14035 100644 --- a/app/src/main/java/org/oppia/android/app/parser/FractionParsingUiError.kt +++ b/app/src/main/java/org/oppia/android/app/parser/FractionParsingUiError.kt @@ -20,7 +20,10 @@ enum class FractionParsingUiError(@StringRes private var error: Int?) { DIVISION_BY_ZERO(error = R.string.fraction_error_divide_by_zero), /** Corresponds to [FractionParsingError.NUMBER_TOO_LONG]. */ - NUMBER_TOO_LONG(error = R.string.fraction_error_larger_than_seven_digits); + NUMBER_TOO_LONG(error = R.string.fraction_error_larger_than_seven_digits), + + /** Corresponds to [FractionParsingError.EMPTY_INPUT]. */ + EMPTY_INPUT(error = R.string.fraction_error_empty_input); /** * Returns the string corresponding to this error's string resources, or null if there is none. @@ -39,6 +42,7 @@ enum class FractionParsingUiError(@StringRes private var error: Int?) { FractionParsingError.INVALID_FORMAT -> INVALID_FORMAT FractionParsingError.DIVISION_BY_ZERO -> DIVISION_BY_ZERO FractionParsingError.NUMBER_TOO_LONG -> NUMBER_TOO_LONG + FractionParsingError.EMPTY_INPUT -> EMPTY_INPUT } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79ec1534ff1..124f66c09f2 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -166,6 +166,7 @@ Please enter a valid fraction (e.g., 5/3 or 1 2/3) Please do not put 0 in the denominator None of the numbers in the fraction should have more than 7 digits. + Enter a fraction to continue Please begin your answer with a number (e.g.,”0” in 0.5). Please enter a valid number. The answer can contain at most 15 digits (0–9) or symbols (. or -). diff --git a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt index 7e2288cda95..177f6d1381e 100644 --- a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt +++ b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt @@ -1,5 +1,6 @@ package org.oppia.android.util.math +import android.text.TextUtils import org.oppia.android.app.model.Fraction import org.oppia.android.util.extensions.normalizeWhitespace @@ -24,6 +25,9 @@ class FractionParser { * detection should be done using [getRealTimeAnswerError], instead. */ fun getSubmitTimeError(text: String): FractionParsingError { + if (TextUtils.isEmpty(text)) { + return FractionParsingError.EMPTY_INPUT + } if (invalidCharsLengthRegex.find(text) != null) { return FractionParsingError.NUMBER_TOO_LONG } @@ -130,6 +134,9 @@ class FractionParser { * Indicates that at least one of the numbers present in the string is too long to be * precisely represented in a fraction. */ - NUMBER_TOO_LONG + NUMBER_TOO_LONG, + + /** The input text was empty. */ + EMPTY_INPUT } } From cb15252fa9b6f547bc4bc8f9bd3fbd4c85d73a02 Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 17:02:35 +0100 Subject: [PATCH 08/20] Fix tests for FactionParser. --- .../java/org/oppia/android/util/math/FractionParserTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt b/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt index 864a429f753..6079f7ec92c 100644 --- a/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt +++ b/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt @@ -85,9 +85,9 @@ class FractionParserTest { } @Test - fun testSubmitTimeError_emptyString_returnsInvalidFormat() { + fun testSubmitTimeError_emptyString_returnsEmptyInput() { val error = fractionParser.getSubmitTimeError("") - assertThat(error).isEqualTo(FractionParser.FractionParsingError.INVALID_FORMAT) + assertThat(error).isEqualTo(FractionParser.FractionParsingError.EMPTY_INPUT) } @Test From 8c2c1ddd51b0c937eae6893b2bf6077554f4d6cb Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 17:11:17 +0100 Subject: [PATCH 09/20] Fix kdoc format. --- .../src/main/java/org/oppia/android/util/math/FractionParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt index 177f6d1381e..66ba2b1d43f 100644 --- a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt +++ b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt @@ -136,7 +136,7 @@ class FractionParser { */ NUMBER_TOO_LONG, - /** The input text was empty. */ + /** The input text was empty. */ EMPTY_INPUT } } From f7d2ddab90ed6143c7a17e6aa050c7b55574c1cb Mon Sep 17 00:00:00 2001 From: masclot Date: Mon, 13 Nov 2023 17:30:04 +0100 Subject: [PATCH 10/20] Fix tests in FractionParsingUiErrorTest --- .../org/oppia/android/app/parser/FractionParsingUiErrorTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt index 6016d1d4894..c74fdc02238 100644 --- a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt @@ -165,7 +165,7 @@ class FractionParsingUiErrorTest { .toUiError() .getErrorMessageFromStringRes(activity.appLanguageResourceHandler) assertThat(errorMessage) - .isEqualTo("Please enter a valid fraction (e.g., 5/3 or 1 2/3)") + .isEqualTo("Enter a fraction to continue") } } From e8c43319d89fe9330e20112b1cbb1ac4f8fcd513 Mon Sep 17 00:00:00 2001 From: masclot Date: Wed, 15 Nov 2023 09:43:22 +0100 Subject: [PATCH 11/20] Update kdoc as per review. --- .../src/main/java/org/oppia/android/util/math/FractionParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt index 66ba2b1d43f..8354f8a695f 100644 --- a/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt +++ b/utility/src/main/java/org/oppia/android/util/math/FractionParser.kt @@ -136,7 +136,7 @@ class FractionParser { */ NUMBER_TOO_LONG, - /** The input text was empty. */ + /** Indicates that the input text was empty. */ EMPTY_INPUT } } From dbd8e4606b1ae1fc5440332fb36724c85defef4d Mon Sep 17 00:00:00 2001 From: masclot Date: Tue, 21 Nov 2023 22:19:09 +0100 Subject: [PATCH 12/20] Create a separate test activity and test for fraction input interaction --- app/src/main/AndroidManifest.xml | 1 + ...ractionInputInteractionViewTestActivity.kt | 122 ++++ .../InputInteractionViewTestActivity.kt | 13 +- ...y_fraction_input_interaction_view_test.xml | 75 +++ .../activity_input_interaction_view_test.xml | 41 -- ...ionInputInteractionViewTestActivityTest.kt | 615 ++++++++++++++++++ .../InputInteractionViewTestActivityTest.kt | 394 ----------- 7 files changed, 814 insertions(+), 447 deletions(-) create mode 100644 app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt create mode 100644 app/src/main/res/layout/activity_fraction_input_interaction_view_test.xml create mode 100644 app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c324a1a7119..76102786288 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -213,6 +213,7 @@ + diff --git a/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt new file mode 100644 index 00000000000..ac918d0a3e6 --- /dev/null +++ b/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt @@ -0,0 +1,122 @@ +package org.oppia.android.app.testing + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.databinding.DataBindingUtil +import org.oppia.android.R +import org.oppia.android.app.activity.ActivityComponentImpl +import org.oppia.android.app.activity.InjectableAutoLocalizedAppCompatActivity +import org.oppia.android.app.customview.interaction.FractionInputInteractionView +import org.oppia.android.app.customview.interaction.NumericInputInteractionView +import org.oppia.android.app.customview.interaction.TextInputInteractionView +import org.oppia.android.app.model.InputInteractionViewTestActivityParams +import org.oppia.android.app.model.InputInteractionViewTestActivityParams.MathInteractionType.ALGEBRAIC_EXPRESSION +import org.oppia.android.app.model.InputInteractionViewTestActivityParams.MathInteractionType.MATH_EQUATION +import org.oppia.android.app.model.InputInteractionViewTestActivityParams.MathInteractionType.MATH_INTERACTION_TYPE_UNSPECIFIED +import org.oppia.android.app.model.InputInteractionViewTestActivityParams.MathInteractionType.NUMERIC_EXPRESSION +import org.oppia.android.app.model.InputInteractionViewTestActivityParams.MathInteractionType.UNRECOGNIZED +import org.oppia.android.app.model.Interaction +import org.oppia.android.app.model.SchemaObject +import org.oppia.android.app.model.UserAnswer +import org.oppia.android.app.model.WrittenTranslationContext +import org.oppia.android.app.player.state.answerhandling.AnswerErrorCategory +import org.oppia.android.app.player.state.answerhandling.InteractionAnswerErrorOrAvailabilityCheckReceiver +import org.oppia.android.app.player.state.answerhandling.InteractionAnswerReceiver +import org.oppia.android.app.player.state.itemviewmodel.FractionInteractionViewModel +import org.oppia.android.app.player.state.itemviewmodel.MathExpressionInteractionsViewModel +import org.oppia.android.app.player.state.itemviewmodel.NumericInputViewModel +import org.oppia.android.app.player.state.itemviewmodel.RatioExpressionInputInteractionViewModel +import org.oppia.android.app.player.state.itemviewmodel.StateItemViewModel +import org.oppia.android.app.player.state.itemviewmodel.StateItemViewModel.InteractionItemFactory +import org.oppia.android.app.player.state.itemviewmodel.TextInputViewModel +import org.oppia.android.app.player.state.listener.StateKeyboardButtonListener +import org.oppia.android.databinding.ActivityInputInteractionViewTestBinding +import org.oppia.android.util.extensions.getProtoExtra +import org.oppia.android.util.extensions.putProtoExtra +import javax.inject.Inject +import org.oppia.android.app.player.state.itemviewmodel.MathExpressionInteractionsViewModel.FactoryImpl.FactoryFactoryImpl as MathExpViewModelFactoryFactoryImpl +import org.oppia.android.databinding.ActivityFractionInputInteractionViewTestBinding + +/** + * This is a dummy activity to test [FractionInputInteractionView]. + */ +class FractionInputInteractionViewTestActivity : + InjectableAutoLocalizedAppCompatActivity(), + StateKeyboardButtonListener, + InteractionAnswerErrorOrAvailabilityCheckReceiver, + InteractionAnswerReceiver { + private lateinit var binding: ActivityFractionInputInteractionViewTestBinding + + @Inject + lateinit var fractionInteractionViewModelFactory: FractionInteractionViewModel.FactoryImpl + + val fractionInteractionViewModel by lazy { + fractionInteractionViewModelFactory.create() + } + + lateinit var writtenTranslationContext: WrittenTranslationContext + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + (activityComponent as ActivityComponentImpl).inject(this) + binding = DataBindingUtil.setContentView( + this, R.layout.activity_fraction_input_interaction_view_test + ) + + val params = + intent.getProtoExtra( + TEST_ACTIVITY_PARAMS_ARGUMENT_KEY, + InputInteractionViewTestActivityParams.getDefaultInstance() + ) + writtenTranslationContext = params.writtenTranslationContext + binding.fractionInteractionViewModel = fractionInteractionViewModel + } + + fun getPendingAnswerErrorOnSubmitClick(v: View) { + fractionInteractionViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) + } + + override fun onPendingAnswerErrorOrAvailabilityCheck( + pendingAnswerError: String?, + inputAnswerAvailable: Boolean + ) { + } + + override fun onAnswerReadyForSubmission(answer: UserAnswer) { + } + + override fun onEditorAction(actionCode: Int) { + } + + private inline fun InteractionItemFactory.create( + interaction: Interaction = Interaction.getDefaultInstance() + ): T { + return create( + entityId = "fake_entity_id", + hasConversationView = false, + interaction = interaction, + interactionAnswerReceiver = this@FractionInputInteractionViewTestActivity, + answerErrorReceiver = this@FractionInputInteractionViewTestActivity, + hasPreviousButton = false, + isSplitView = false, + writtenTranslationContext, + timeToStartNoticeAnimationMs = null + ) as T + } + + companion object { + private const val TEST_ACTIVITY_PARAMS_ARGUMENT_KEY = + "FractionInputInteractionViewTestActivity.params" + + fun createIntent( + context: Context, + extras: InputInteractionViewTestActivityParams + ): Intent { + return Intent(context, FractionInputInteractionViewTestActivity::class.java).also { + it.putProtoExtra(TEST_ACTIVITY_PARAMS_ARGUMENT_KEY, extras) + } + } + } +} diff --git a/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt index 7190382efa0..ac786bb146a 100644 --- a/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt @@ -8,7 +8,6 @@ import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityComponentImpl import org.oppia.android.app.activity.InjectableAutoLocalizedAppCompatActivity -import org.oppia.android.app.customview.interaction.FractionInputInteractionView import org.oppia.android.app.customview.interaction.NumericInputInteractionView import org.oppia.android.app.customview.interaction.TextInputInteractionView import org.oppia.android.app.model.InputInteractionViewTestActivityParams @@ -24,7 +23,6 @@ import org.oppia.android.app.model.WrittenTranslationContext import org.oppia.android.app.player.state.answerhandling.AnswerErrorCategory import org.oppia.android.app.player.state.answerhandling.InteractionAnswerErrorOrAvailabilityCheckReceiver import org.oppia.android.app.player.state.answerhandling.InteractionAnswerReceiver -import org.oppia.android.app.player.state.itemviewmodel.FractionInteractionViewModel import org.oppia.android.app.player.state.itemviewmodel.MathExpressionInteractionsViewModel import org.oppia.android.app.player.state.itemviewmodel.NumericInputViewModel import org.oppia.android.app.player.state.itemviewmodel.RatioExpressionInputInteractionViewModel @@ -40,7 +38,7 @@ import org.oppia.android.app.player.state.itemviewmodel.MathExpressionInteractio /** * This is a dummy activity to test input interaction views. - * It contains [FractionInputInteractionView], [NumericInputInteractionView],and [TextInputInteractionView]. + * It contains [NumericInputInteractionView],and [TextInputInteractionView]. */ class InputInteractionViewTestActivity : InjectableAutoLocalizedAppCompatActivity(), @@ -55,9 +53,6 @@ class InputInteractionViewTestActivity : @Inject lateinit var textInputViewModelFactory: TextInputViewModel.FactoryImpl - @Inject - lateinit var fractionInteractionViewModelFactory: FractionInteractionViewModel.FactoryImpl - @Inject lateinit var ratioViewModelFactory: RatioExpressionInputInteractionViewModel.FactoryImpl @@ -68,10 +63,6 @@ class InputInteractionViewTestActivity : val textInputViewModel by lazy { textInputViewModelFactory.create() } - val fractionInteractionViewModel by lazy { - fractionInteractionViewModelFactory.create() - } - val ratioExpressionInputInteractionViewModel by lazy { ratioViewModelFactory.create( interaction = Interaction.newBuilder().putCustomizationArgs( @@ -127,13 +118,11 @@ class InputInteractionViewTestActivity : binding.numericInputViewModel = numericInputViewModel binding.textInputViewModel = textInputViewModel - binding.fractionInteractionViewModel = fractionInteractionViewModel binding.ratioInteractionInputViewModel = ratioExpressionInputInteractionViewModel binding.mathExpressionInteractionsViewModel = mathExpressionViewModel } fun getPendingAnswerErrorOnSubmitClick(v: View) { - fractionInteractionViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) numericInputViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) ratioExpressionInputInteractionViewModel .checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) diff --git a/app/src/main/res/layout/activity_fraction_input_interaction_view_test.xml b/app/src/main/res/layout/activity_fraction_input_interaction_view_test.xml new file mode 100644 index 00000000000..ddd18d752d9 --- /dev/null +++ b/app/src/main/res/layout/activity_fraction_input_interaction_view_test.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + +