diff --git a/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt index a3e262baf63..57c999e2586 100644 --- a/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt @@ -15,6 +15,7 @@ import org.oppia.android.app.utility.lifecycle.LifecycleSafeTimerFactory import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.PinPasswordActivityBinding import org.oppia.android.domain.profile.ProfileManagementController +import org.oppia.android.util.accessibility.AccessibilityService import org.oppia.android.util.data.AsyncResult import org.oppia.android.util.data.DataProviders.Companion.toLiveData import javax.inject.Inject @@ -31,6 +32,7 @@ class PinPasswordActivityPresenter @Inject constructor( private val viewModelProvider: ViewModelProvider, private val resourceHandler: AppLanguageResourceHandler ) { + @Inject lateinit var accessibilityService: AccessibilityService private val pinViewModel by lazy { getPinPasswordViewModel() } @@ -69,7 +71,13 @@ class PinPasswordActivityPresenter @Inject constructor( ) } } - binding.pinPasswordInputPinEditText.requestFocus() + + // If the screen reader is off, the EditText will receive focus. + // If the screen reader is on, the EditText won't receive focus. + // This is needed because requesting focus on the EditText when the screen reader is on gives TalkBack priority over other views in the screen, ignoring view hierachy. + if (!accessibilityService.isScreenReaderEnabled()) + binding.pinPasswordInputPinEditText.requestFocus() + // [onTextChanged] is a extension function defined at [TextInputEditTextHelper] binding.pinPasswordInputPinEditText.onTextChanged { pin -> pin?.let { inputtedPin -> diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt index f1afe3b1393..16ce38b184e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt @@ -98,6 +98,7 @@ import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule import org.oppia.android.util.accessibility.AccessibilityTestModule +import org.oppia.android.util.accessibility.FakeAccessibilityService import org.oppia.android.util.caching.AssetModule import org.oppia.android.util.caching.testing.CachingTestModule import org.oppia.android.util.gcsresource.GcsResourceModule @@ -147,6 +148,9 @@ class PinPasswordActivityTest { @Inject lateinit var editTextInputAction: EditTextInputAction + @Inject + lateinit var fakeAccessibilityService: FakeAccessibilityService + private val adminPin = "12345" private val adminId = 0 private val userId = 1 @@ -181,7 +185,8 @@ class PinPasswordActivityTest { } @Test - fun testPinPassword_withAdmin_keyboardIsVisibleByDefault() { + fun testPinPassword_withAdmin_screenReaderOff_keyboardIsVisible() { + fakeAccessibilityService.setScreenReaderEnabled(false) ActivityScenario.launch( PinPasswordActivity.createPinPasswordActivityIntent( context = context, @@ -193,6 +198,20 @@ class PinPasswordActivityTest { } } + @Test + fun testPinPassword_withAdmin_screenReaderOn_keyboardIsNotVisible() { + fakeAccessibilityService.setScreenReaderEnabled(true) + ActivityScenario.launch( + PinPasswordActivity.createPinPasswordActivityIntent( + context = context, + adminPin = adminPin, + profileId = adminId + ) + ).use { + onView(withId(R.id.pin_password_input_pin_edit_text)).check(matches(not(hasFocus()))) + } + } + @Test fun testPinPassword_withAdmin_inputCorrectPin_opensHomeActivity() { ActivityScenario.launch(