From cc83d5c4726881d00791392538b2a43aa6815c79 Mon Sep 17 00:00:00 2001 From: William Durand Date: Thu, 15 Feb 2024 10:49:00 +0100 Subject: [PATCH] Bug 1870339 - Make list of add-ons more accessible --- .../SettingsSubMenuAddonsManagerRobot.kt | 21 ++++++++++++---- .../fenix/addons/AddonsManagementFragment.kt | 24 +++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt index 95ea5f4c4..96d23ec27 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt @@ -36,6 +36,7 @@ import org.mozilla.fenix.helpers.Constants.RETRY_COUNT import org.mozilla.fenix.helpers.Constants.TAG import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectExists +import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong @@ -43,7 +44,6 @@ import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.restartApp -import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull @@ -120,7 +120,7 @@ class SettingsSubMenuAddonsManagerRobot { homeScreen { }.openThreeDotMenu { }.openAddonsManagerMenu { - scrollToElementByText(addonName) + scrollToAddon(addonName) clickInstallAddon(addonName) verifyAddonPermissionPrompt(addonName) acceptPermissionToInstallAddon() @@ -152,7 +152,7 @@ class SettingsSubMenuAddonsManagerRobot { } fun verifyAddonIsInstalled(addonName: String) { - scrollToElementByText(addonName) + scrollToAddon(addonName) Log.i(TAG, "verifyAddonIsInstalled: Trying to verify that the $addonName add-on was installed") onView( allOf( @@ -199,7 +199,7 @@ class SettingsSubMenuAddonsManagerRobot { Log.i(TAG, "verifyAddonsItems: Verified that all uBlock Origin items are completely displayed") } fun verifyAddonCanBeInstalled(addonName: String) { - scrollToElementByText(addonName) + scrollToAddon(addonName) mDevice.waitNotNull(Until.findObject(By.text(addonName)), waitingTime) Log.i(TAG, "verifyAddonCanBeInstalled: Trying to verify that the install $addonName button is visible") onView( @@ -250,7 +250,7 @@ class SettingsSubMenuAddonsManagerRobot { addonName: String, interact: SettingsSubMenuAddonsManagerAddonDetailedMenuRobot.() -> Unit, ): SettingsSubMenuAddonsManagerAddonDetailedMenuRobot.Transition { - scrollToElementByText(addonName) + scrollToAddon(addonName) Log.i(TAG, "openDetailedMenuForAddon: Trying to verify that the $addonName add-on is visible") addonItem(addonName).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) Log.i(TAG, "openDetailedMenuForAddon: Verified that the $addonName add-on is visible") @@ -297,6 +297,17 @@ fun addonsMenu(interact: SettingsSubMenuAddonsManagerRobot.() -> Unit): Settings return SettingsSubMenuAddonsManagerRobot.Transition() } +private fun scrollToAddon(addonName: String) { + Log.i(TAG, "scrollToAddon: Trying to scroll into view add-on: $addonName") + addonsList().scrollIntoView( + itemWithResIdContainingText( + resourceId = "$packageName:id/add_on_name", + text = addonName, + ), + ) + Log.i(TAG, "scrollToAddon: Scrolled into view add-on: $addonName") +} + private fun addonItem(addonName: String) = onView( allOf( diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index e7c739433..1103b008a 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -11,6 +11,7 @@ import android.os.Build import android.os.Bundle import android.view.View import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.VisibleForTesting import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -115,6 +116,29 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) binding?.addOnsEmptyMessage?.isVisible = false recyclerView?.adapter = adapter + recyclerView?.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) { + super.onInitializeAccessibilityNodeInfo(host, info) + + adapter?.let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + info.collectionInfo = AccessibilityNodeInfo.CollectionInfo( + it.itemCount, + 1, + false, + ) + } else { + @Suppress("DEPRECATION") + info.collectionInfo = AccessibilityNodeInfo.CollectionInfo.obtain( + it.itemCount, + 1, + false, + ) + } + } + } + } + if (shouldRefresh) { adapter?.updateAddons(addons) }