From ff5f9fe162fe3c80ea4256e849dfe6f23bb4c1dc Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Tue, 14 May 2024 19:17:02 +0530 Subject: [PATCH] Added the androidx.test.espresso:espresso-accessibility dependency to test the accessibility issues in our application. * This testing library only work with `ViewAction` like if we perform any click on any screen then it starts checking the accessibility issues, so we have modify our test cases according to this. * Suppress a few known accessibility issue e.g. on `LocalFileTransfer` screen we have a `skip` text which we are not using but it is giving the error for that. * Fixed the `TouchTargetIssue` in ZimHostFragment. * Added the `contentDescription` to search recyclerView. --- .../kiwixmobile/deeplinks/DeepLinksTest.kt | 5 ++++ .../kiwixmobile/download/DownloadRobot.kt | 2 +- .../kiwixmobile/download/DownloadTest.kt | 5 ++++ .../kiwixmobile/help/HelpFragmentTest.kt | 5 ++++ .../org/kiwix/kiwixmobile/help/HelpRobot.kt | 4 ++- .../initial/download/InitialDownloadRobot.kt | 4 +-- .../initial/download/InitialDownloadTest.kt | 5 ++++ .../kiwixmobile/intro/IntroFragmentTest.kt | 5 ++++ .../org/kiwix/kiwixmobile/intro/IntroRobot.kt | 10 ++++--- .../language/LanguageFragmentTest.kt | 5 ++++ .../kiwixmobile/language/LanguageRobot.kt | 3 +- .../LocalFileTransferRobot.kt | 3 +- .../LocalFileTransferTest.kt | 30 +++++++++++++++++++ .../kiwixmobile/search/SearchFragmentTest.kt | 18 +++++++++++ .../settings/KiwixSettingsFragmentTest.kt | 5 ++++ .../splash/KiwixSplashActivityTest.kt | 5 ++++ .../webserver/ZimHostFragmentTest.kt | 18 +++++++++++ .../kiwixmobile/webserver/ZimHostRobot.kt | 3 +- buildSrc/src/main/kotlin/Libs.kt | 9 +++++- .../src/main/kotlin/plugin/AppConfigurer.kt | 1 + .../src/main/res/layout/activity_zim_host.xml | 6 +++- core/src/main/res/layout/fragment_search.xml | 1 + core/src/main/res/values/strings.xml | 1 + 23 files changed, 140 insertions(+), 13 deletions(-) diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/deeplinks/DeepLinksTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/deeplinks/DeepLinksTest.kt index 95e2a77b4..eceb7495e 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/deeplinks/DeepLinksTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/deeplinks/DeepLinksTest.kt @@ -22,6 +22,7 @@ import android.content.Intent import android.net.Uri import androidx.core.content.FileProvider import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import org.junit.Before @@ -45,6 +46,10 @@ class DeepLinksTest : BaseActivityTest() { var retryRule = RetryRule() private lateinit var sharedPreferenceUtil: SharedPreferenceUtil + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before override fun waitForIdle() { UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).apply { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt index 243d18e1f..9e4284789 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt @@ -102,7 +102,7 @@ class DownloadRobot : BaseRobot() { } private fun stopDownload() { - clickOn(ViewId(R.id.stop)) + testFlakyView({ onView(withId(R.id.stop)).perform(click()) }) } fun pauseDownload() { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadTest.kt index a9b56ef76..d745f2410 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadTest.kt @@ -23,6 +23,7 @@ import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario import androidx.test.espresso.IdlingPolicies import androidx.test.espresso.IdlingRegistry +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry @@ -58,6 +59,10 @@ class DownloadTest : BaseActivityTest() { @JvmField var retryRule = RetryRule() + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before override fun waitForIdle() { UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).apply { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt index 3ef42ad4e..6d74501cd 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt @@ -21,6 +21,7 @@ import android.os.Build import androidx.lifecycle.Lifecycle import androidx.test.core.app.ActivityScenario import androidx.test.espresso.IdlingRegistry +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import leakcanary.LeakAssertions @@ -66,6 +67,10 @@ class HelpFragmentTest : BaseActivityTest() { @JvmField var retryRule = RetryRule() + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Test fun verifyHelpActivity() { setShowPlayStoreRestriction(false) diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt index 90bcf8bb9..37887c686 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt @@ -18,6 +18,7 @@ package org.kiwix.kiwixmobile.help import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.doesNotExist import androidx.test.espresso.matcher.ViewMatchers.withText import org.kiwix.kiwixmobile.BaseRobot @@ -27,6 +28,7 @@ import org.kiwix.kiwixmobile.Findable.ViewId import org.kiwix.kiwixmobile.core.R.id import org.kiwix.kiwixmobile.core.R.string import org.kiwix.kiwixmobile.core.main.KIWIX_APK_WEBSITE_URL +import org.kiwix.kiwixmobile.testutils.TestUtils.testFlakyView fun help(func: HelpRobot.() -> Unit) = HelpRobot().apply(func) @@ -37,7 +39,7 @@ class HelpRobot : BaseRobot() { } fun clickOnWhatDoesKiwixDo() { - clickOn(TextId(string.help_2)) + testFlakyView({ onView(withText(string.help_2)).perform(click()) }) } fun assertWhatDoesKiwixDoIsExpanded() { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadRobot.kt index ec2950a9f..3a250ef68 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadRobot.kt @@ -69,7 +69,7 @@ class InitialDownloadRobot : BaseRobot() { } fun downloadZimFile() { - clickOn(Text(zimFileTitle)) + testFlakyView({ onView(withText(zimFileTitle)).perform(click()) }) } fun assertStorageConfigureDialogDisplayed() { @@ -89,7 +89,7 @@ class InitialDownloadRobot : BaseRobot() { } fun stopDownload() { - clickOn(ViewId(R.id.stop)) + testFlakyView({ onView(withId(R.id.stop)).perform(click()) }) } fun assertDownloadStop() { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadTest.kt index 1d162cfef..96a6780fa 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/initial/download/InitialDownloadTest.kt @@ -22,6 +22,7 @@ import androidx.core.content.edit import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry @@ -51,6 +52,10 @@ class InitialDownloadTest : BaseActivityTest() { @JvmField var retryRule = RetryRule() + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before override fun waitForIdle() { UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).apply { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroFragmentTest.kt index 164bb6edf..c9ad29652 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroFragmentTest.kt @@ -21,6 +21,7 @@ import androidx.core.content.edit import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import leakcanary.LeakAssertions @@ -42,6 +43,10 @@ class IntroFragmentTest : BaseActivityTest() { @JvmField var retryRule = RetryRule() + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Test fun viewIsSwipeableAndNavigatesToMain() { activityScenario.onActivity { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroRobot.kt index ac5013182..f3aec2bf5 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/intro/IntroRobot.kt @@ -18,6 +18,9 @@ package org.kiwix.kiwixmobile.intro +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.matcher.ViewMatchers.withId import applyWithViewHierarchyPrinting import attempt import org.kiwix.kiwixmobile.BaseRobot @@ -26,15 +29,14 @@ import org.kiwix.kiwixmobile.Findable.ViewId import org.kiwix.kiwixmobile.R import org.kiwix.kiwixmobile.main.TopLevelDestinationRobot import org.kiwix.kiwixmobile.main.topLevel +import org.kiwix.kiwixmobile.testutils.TestUtils.testFlakyView fun intro(func: IntroRobot.() -> Unit) = IntroRobot().applyWithViewHierarchyPrinting(func) class IntroRobot : BaseRobot() { - private val getStarted = ViewId(R.id.get_started) - fun swipeLeft() { - isVisible(getStarted) + isVisible(ViewId(R.id.get_started)) isVisible(TextId(R.string.welcome_to_the_family)) isVisible(TextId(R.string.humankind_knowledge)) attempt(10) { @@ -44,7 +46,7 @@ class IntroRobot : BaseRobot() { } infix fun clickGetStarted(func: TopLevelDestinationRobot.() -> Unit): TopLevelDestinationRobot { - clickOn(getStarted) + testFlakyView({ onView(withId(R.id.get_started)).perform(click()) }) return topLevel(func) } } diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt index 64cd33391..4c380bb16 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt @@ -23,6 +23,7 @@ import androidx.core.content.edit import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry @@ -63,6 +64,10 @@ class LanguageFragmentTest { InstrumentationRegistry.getInstrumentation() } + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before fun setUp() { UiDevice.getInstance(instrumentation).apply { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt index 530f4c005..0a27f8d75 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt @@ -23,6 +23,7 @@ import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isChecked import androidx.test.espresso.matcher.ViewMatchers.isNotChecked +import androidx.test.espresso.matcher.ViewMatchers.withId import applyWithViewHierarchyPrinting import com.adevinta.android.barista.interaction.BaristaSleepInteractions import junit.framework.AssertionFailedError @@ -63,7 +64,7 @@ class LanguageRobot : BaseRobot() { } fun clickOnLanguageSearchIcon() { - clickOn(ViewId(R.id.menu_language_search)) + testFlakyView({ onView(withId(R.id.menu_language_search)).perform(click()) }) } fun searchLanguage(searchLanguage: String) { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferRobot.kt index 13b99771f..53b582fe2 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferRobot.kt @@ -20,6 +20,7 @@ package org.kiwix.kiwixmobile.localFileTransfer import android.util.Log import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.doesNotExist import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -85,7 +86,7 @@ class LocalFileTransferRobot : BaseRobot() { fun clickOnGotItButton() { pauseForBetterTestPerformance() - clickOn(TextId(R.string.got_it)) + testFlakyView({ onView(withText(R.string.got_it)).perform(click()) }) } fun assertDeviceNameMessageVisible() { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferTest.kt index 77794ead7..0a3855c26 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferTest.kt @@ -26,10 +26,18 @@ import androidx.core.content.edit import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks +import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule import androidx.test.uiautomator.UiDevice +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesCheck +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews +import com.google.android.apps.common.testing.accessibility.framework.checks.SpeakableTextPresentCheck +import com.google.android.apps.common.testing.accessibility.framework.checks.TouchTargetSizeCheck import leakcanary.LeakAssertions +import org.hamcrest.core.AllOf.allOf +import org.hamcrest.core.AnyOf.anyOf import org.junit.Before import org.junit.Rule import org.junit.Test @@ -71,6 +79,28 @@ class LocalFileTransferTest { InstrumentationRegistry.getInstrumentation() } + init { + AccessibilityChecks.enable().apply { + setRunChecksFromRootView(true) + setSuppressingResultMatcher( + anyOf( + allOf( + matchesCheck(SpeakableTextPresentCheck::class.java), + matchesViews(withId(R.id.tv_skip)) + ), + allOf( + matchesCheck(TouchTargetSizeCheck::class.java), + matchesViews(withId(R.id.tv_skip)) + ), + allOf( + matchesCheck(TouchTargetSizeCheck::class.java), + matchesViews(withId(R.id.text_view_device_name)) + ) + ) + ) + } + } + @Before fun setup() { context = instrumentation.targetContext.applicationContext diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt index 2fa2581b6..4cb1ecd61 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt @@ -23,13 +23,19 @@ import androidx.core.net.toUri import androidx.lifecycle.Lifecycle import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks +import androidx.test.espresso.matcher.ViewMatchers import androidx.test.internal.runner.junit4.statement.UiThreadStatement import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesCheck +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews +import com.google.android.apps.common.testing.accessibility.framework.checks.TouchTargetSizeCheck import leakcanary.LeakAssertions import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.ResponseBody +import org.hamcrest.Matchers.allOf import org.junit.Before import org.junit.Rule import org.junit.Test @@ -88,6 +94,18 @@ class SearchFragmentTest : BaseActivityTest() { } } + init { + AccessibilityChecks.enable().apply { + setRunChecksFromRootView(true) + setSuppressingResultMatcher( + allOf( + matchesCheck(TouchTargetSizeCheck::class.java), + matchesViews(ViewMatchers.withId(R.id.menu_searchintext)) + ) + ) + } + } + @Test fun searchFragmentSimple() { activityScenario.onActivity { diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/settings/KiwixSettingsFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/settings/KiwixSettingsFragmentTest.kt index 8a60dde35..d64ceb4b5 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/settings/KiwixSettingsFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/settings/KiwixSettingsFragmentTest.kt @@ -18,6 +18,7 @@ package org.kiwix.kiwixmobile.settings import android.Manifest +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.internal.runner.junit4.statement.UiThreadStatement import androidx.test.platform.app.InstrumentationRegistry @@ -57,6 +58,10 @@ class KiwixSettingsFragmentTest { var permissionRules: GrantPermissionRule = GrantPermissionRule.grant(*permissions) + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before fun setup() { // Go to IntroFragment diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/splash/KiwixSplashActivityTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/splash/KiwixSplashActivityTest.kt index 0d6c3607b..2f3bd05ad 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/splash/KiwixSplashActivityTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/splash/KiwixSplashActivityTest.kt @@ -22,6 +22,7 @@ import android.content.Context import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario import androidx.test.espresso.Espresso +import androidx.test.espresso.accessibility.AccessibilityChecks import androidx.test.espresso.assertion.ViewAssertions import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers @@ -67,6 +68,10 @@ class KiwixSplashActivityTest { GrantPermissionRule.grant(*permissions) private lateinit var context: Context + init { + AccessibilityChecks.enable().setRunChecksFromRootView(true) + } + @Before fun setUp() { Intents.init() diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostFragmentTest.kt index 1f6b0886b..f0f9a89cb 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostFragmentTest.kt @@ -23,10 +23,16 @@ import android.content.Context import android.os.Build import androidx.lifecycle.Lifecycle import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.accessibility.AccessibilityChecks +import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule import androidx.test.uiautomator.UiDevice +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesCheck +import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews +import com.google.android.apps.common.testing.accessibility.framework.checks.DuplicateClickableBoundsCheck import leakcanary.LeakAssertions +import org.hamcrest.Matchers.allOf import org.junit.Before import org.junit.Rule import org.junit.Test @@ -73,6 +79,18 @@ class ZimHostFragmentTest { GrantPermissionRule.grant(*permissions) private var context: Context? = null + init { + AccessibilityChecks.enable().apply { + setRunChecksFromRootView(true) + setSuppressingResultMatcher( + allOf( + matchesCheck(DuplicateClickableBoundsCheck::class.java), + matchesViews(withId(R.id.get_zim_nearby_device)) + ) + ) + } + } + @Before fun waitForIdle() { context = InstrumentationRegistry.getInstrumentation().targetContext diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt index 6b5ec649a..27dd2cdfd 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt @@ -23,6 +23,7 @@ import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.assertThat +import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import applyWithViewHierarchyPrinting import com.adevinta.android.barista.interaction.BaristaSleepInteractions @@ -153,7 +154,7 @@ class ZimHostRobot : BaseRobot() { } fun stopServer() { - clickOn(ViewId(R.id.startServerButton)) + testFlakyView({ onView(withId(R.id.startServerButton)).perform(click()) }) } fun assertServerStopped() { diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index c3959acb6..31e1fe147 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -50,6 +50,12 @@ object Libs { const val espresso_web: String = "androidx.test.espresso:espresso-web:" + Versions.androidx_test_espresso + /** + * https://developer.android.com/testing + */ + const val espresso_accessibility: String = "androidx.test.espresso:espresso-accessibility:" + + Versions.androidx_test_espresso + /** * https://github.com/square/retrofit */ @@ -343,5 +349,6 @@ object Libs { /** * https://github.com/deano2390/MaterialShowcaseView */ - const val material_show_case_view: String = "com.github.deano2390:MaterialShowcaseView:" + Versions.material_show_case_view + const val material_show_case_view: String = + "com.github.deano2390:MaterialShowcaseView:" + Versions.material_show_case_view } diff --git a/buildSrc/src/main/kotlin/plugin/AppConfigurer.kt b/buildSrc/src/main/kotlin/plugin/AppConfigurer.kt index c725e5cde..0fabc0d06 100644 --- a/buildSrc/src/main/kotlin/plugin/AppConfigurer.kt +++ b/buildSrc/src/main/kotlin/plugin/AppConfigurer.kt @@ -104,6 +104,7 @@ class AppConfigurer { androidTestImplementation(Libs.espresso_web) androidTestImplementation(Libs.espresso_intents) androidTestImplementation(Libs.espresso_contrib) + androidTestImplementation(Libs.espresso_accessibility) androidTestImplementation(Libs.annotation) androidTestImplementation(Libs.junit) androidTestImplementation(Libs.junit_jupiter) diff --git a/core/src/main/res/layout/activity_zim_host.xml b/core/src/main/res/layout/activity_zim_host.xml index eb6f94040..d79abfd7b 100644 --- a/core/src/main/res/layout/activity_zim_host.xml +++ b/core/src/main/res/layout/activity_zim_host.xml @@ -32,9 +32,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_marginTop="16dp" android:layout_marginEnd="50dp" android:autoLink="web" + android:gravity="center|start" + android:minHeight="@dimen/material_minimum_height_and_width" android:text="@string/server_textview_default_message" app:layout_constraintEnd_toStartOf="@id/shareServerUrlIcon" app:layout_constraintStart_toStartOf="parent" @@ -46,6 +47,9 @@ android:layout_height="wrap_content" android:layout_marginTop="3dp" android:layout_marginEnd="16dp" + android:scaleType="centerInside" + android:minHeight="@dimen/material_minimum_height_and_width" + android:minWidth="@dimen/material_minimum_height_and_width" android:contentDescription="@string/share_host_address" android:src="@drawable/ic_share_35dp" android:visibility="gone" diff --git a/core/src/main/res/layout/fragment_search.xml b/core/src/main/res/layout/fragment_search.xml index 7f9592511..f0d6b1fee 100644 --- a/core/src/main/res/layout/fragment_search.xml +++ b/core/src/main/res/layout/fragment_search.xml @@ -21,6 +21,7 @@ app:layout_constraintBottom_toTopOf="@+id/loadingMoreDataIndicator" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" + android:contentDescription="@string/searched_list" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="?actionBarSize" tools:listitem="@layout/list_item_search" /> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 76886254b..78dcd7b4a 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -18,6 +18,7 @@ An error occurred when trying to save the media! Saved media as %s to Downloads/org.kiwix…/ Search + Searched list Select a Content File (*.zim) Open link in new tab? Hotspot Service Channel