diff --git a/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt index f4b659e56f2..bfec66d0685 100644 --- a/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt @@ -30,10 +30,6 @@ class AdminPinActivityPresenter @Inject constructor( private val adminViewModel: AdminPinViewModel, private val resourceHandler: AppLanguageResourceHandler ) { - - private var inputtedPin = false - private var inputtedConfirmPin = false - private val args by lazy { activity.intent.getProtoExtra( ADMIN_PIN_ACTIVITY_PARAMS_KEY, @@ -65,13 +61,11 @@ class AdminPinActivityPresenter @Inject constructor( adminViewModel.savedPin.get() == it ) { adminViewModel.savedPin.set(it) - inputtedPin = pin.isNotEmpty() } else { adminViewModel.pinErrorMsg.set("") adminViewModel.savedPin.set(it) - inputtedPin = pin.isNotEmpty() - setValidPin() } + updateSubmitButtonState() } } @@ -82,13 +76,11 @@ class AdminPinActivityPresenter @Inject constructor( adminViewModel.savedConfirmPin.get() == it ) { adminViewModel.savedConfirmPin.set(it) - inputtedConfirmPin = confirmPin.isNotEmpty() } else { adminViewModel.confirmPinErrorMsg.set("") adminViewModel.savedConfirmPin.set(it) - inputtedConfirmPin = confirmPin.isNotEmpty() - setValidPin() } + updateSubmitButtonState() } } @@ -104,7 +96,7 @@ class AdminPinActivityPresenter @Inject constructor( ) failed = true } - if (inputPin != confirmPin) { + if (!failed && inputPin != confirmPin) { adminViewModel.confirmPinErrorMsg.set( resourceHandler.getStringInLocale( R.string.admin_pin_error_pin_confirm_wrong @@ -113,6 +105,7 @@ class AdminPinActivityPresenter @Inject constructor( failed = true } if (failed) { + updateSubmitButtonState() return@setOnClickListener } val profileId = @@ -165,9 +158,13 @@ class AdminPinActivityPresenter @Inject constructor( } false } + + updateSubmitButtonState() } - private fun setValidPin() { - adminViewModel.isButtonActive.set(inputtedPin && inputtedConfirmPin) + private fun updateSubmitButtonState() { + val hasPinError = !adminViewModel.pinErrorMsg.get().isNullOrEmpty() + val hasConfirmPinError = !adminViewModel.confirmPinErrorMsg.get().isNullOrEmpty() + adminViewModel.isButtonActive.set(!hasPinError && !hasConfirmPinError) } } diff --git a/app/src/main/java/org/oppia/android/app/profile/AdminPinViewModel.kt b/app/src/main/java/org/oppia/android/app/profile/AdminPinViewModel.kt index 974cbc98826..59133ba844d 100644 --- a/app/src/main/java/org/oppia/android/app/profile/AdminPinViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/profile/AdminPinViewModel.kt @@ -12,5 +12,5 @@ class AdminPinViewModel @Inject constructor() : ObservableViewModel() { val confirmPinErrorMsg = ObservableField("") val savedPin = ObservableField("") val savedConfirmPin = ObservableField("") - val isButtonActive = ObservableField(false) + val isButtonActive = ObservableField(true) } diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt index fa80cfe1f97..3e9ed786d07 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt @@ -325,7 +325,7 @@ class AdminPinActivityTest { } @Test - fun testAdminPinActivity_inputShortPin_clickIsDisabled() { + fun testAdminPinActivity_inputShortPin_clickIsEnabled() { launch( AdminPinActivity.createAdminPinActivityIntent( context = context, @@ -344,6 +344,28 @@ class AdminPinActivityTest { closeSoftKeyboard() ) onView(withId(R.id.submit_button)).perform(nestedScrollTo()) + onView(withId(R.id.submit_button)).check(matches(isClickable())) + } + } + + @Test + fun testAdminPinActivity_emptyPins_submit_showsPinLengthError() { + launch( + AdminPinActivity.createAdminPinActivityIntent( + context = context, + profileId = 0, + colorRgb = -10710042, + adminPinEnum = 0 + ) + ).use { + onView(withId(R.id.submit_button)).perform(nestedScrollTo(), click()) + onView(withId(R.id.admin_pin_input_pin)).check( + matches( + hasErrorText( + context.resources.getString(R.string.admin_pin_error_pin_length) + ) + ) + ) onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) } } @@ -379,6 +401,7 @@ class AdminPinActivityTest { ) onView(withId(R.id.admin_pin_input_confirm_pin)) .check(matches(hasNoErrorText())) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } } @@ -424,6 +447,7 @@ class AdminPinActivityTest { ) ) ) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) } } @@ -496,6 +520,7 @@ class AdminPinActivityTest { closeSoftKeyboard() ) onView(withId(R.id.submit_button)).perform(nestedScrollTo()).perform(click()) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) onView( allOf( withId(R.id.admin_pin_input_confirm_pin_edit_text), @@ -507,6 +532,7 @@ class AdminPinActivityTest { ) onView(withId(R.id.admin_pin_input_confirm_pin)) .check(matches(hasNoErrorText())) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } } @@ -717,7 +743,7 @@ class AdminPinActivityTest { } @Test - fun testAdminPinActivity_configChange_inputShortPin_submit_clickIsDisabled() { + fun testAdminPinActivity_configChange_inputShortPin_submit_clickIsEnabled() { launch( AdminPinActivity.createAdminPinActivityIntent( context = context, @@ -737,7 +763,7 @@ class AdminPinActivityTest { closeSoftKeyboard() ) onView(withId(R.id.submit_button)).perform(nestedScrollTo()) - onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } } @@ -773,6 +799,7 @@ class AdminPinActivityTest { ) onView(withId(R.id.admin_pin_input_confirm_pin)) .check(matches(hasNoErrorText())) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } } @@ -816,6 +843,7 @@ class AdminPinActivityTest { ) ) ) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) } } @@ -894,6 +922,7 @@ class AdminPinActivityTest { closeSoftKeyboard() ) onView(withId(R.id.submit_button)).perform(nestedScrollTo(), click()) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) onView( allOf( withId(R.id.admin_pin_input_confirm_pin_edit_text), @@ -906,6 +935,7 @@ class AdminPinActivityTest { ) onView(withId(R.id.admin_pin_input_confirm_pin)) .check(matches(hasNoErrorText())) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } } @@ -995,6 +1025,7 @@ class AdminPinActivityTest { ) ) ) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) } } @@ -1036,11 +1067,12 @@ class AdminPinActivityTest { ) ) ) + onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) } } @Test - fun testAdminPinActivity_inputShortPin_configChange_clickIsDisabled() { + fun testAdminPinActivity_inputShortPin_configChange_clickIsEnabled() { launch( AdminPinActivity.createAdminPinActivityIntent( context = context, @@ -1060,7 +1092,7 @@ class AdminPinActivityTest { ) onView(withId(R.id.submit_button)).perform(nestedScrollTo()) onView(isRoot()).perform(orientationLandscape()) - onView(withId(R.id.submit_button)).check(matches(not(isClickable()))) + onView(withId(R.id.submit_button)).check(matches(isClickable())) } }