|
|
|
@ -65,9 +65,6 @@ import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText
|
|
|
|
|
import org.mozilla.fenix.helpers.click
|
|
|
|
|
import org.mozilla.fenix.helpers.ext.waitNotNull
|
|
|
|
|
import org.mozilla.fenix.helpers.withBitmapDrawable
|
|
|
|
|
import org.mozilla.fenix.ui.util.STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER
|
|
|
|
|
import org.mozilla.fenix.ui.util.STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER
|
|
|
|
|
import org.mozilla.fenix.ui.util.STRING_ONBOARDING_TRACKING_PROTECTION_HEADER
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Implementation of Robot Pattern for the home screen menu.
|
|
|
|
@ -79,18 +76,93 @@ class HomeScreenRobot {
|
|
|
|
|
" service provider, it makes it easier to keep what you do online private from anyone" +
|
|
|
|
|
" else who uses this device."
|
|
|
|
|
|
|
|
|
|
fun verifyNavigationToolbar() = assertNavigationToolbar()
|
|
|
|
|
fun verifyNavigationToolbar() = assertAppItemsWithResourceId(navigationToolbar)
|
|
|
|
|
fun verifyFocusedNavigationToolbar() = assertFocusedNavigationToolbar()
|
|
|
|
|
fun verifyHomeScreen() = assertHomeScreen()
|
|
|
|
|
fun verifyHomePrivateBrowsingButton() = assertHomePrivateBrowsingButton()
|
|
|
|
|
fun verifyHomeMenuButton() = assertHomeMenuButton()
|
|
|
|
|
fun verifyHomeScreen() = assertAppItemsWithResourceId(homeScreen)
|
|
|
|
|
|
|
|
|
|
fun verifyHomeScreenAppBarItems() =
|
|
|
|
|
assertAppItemsWithResourceId(homeScreen, privateBrowsingButton, homepageWordmark)
|
|
|
|
|
|
|
|
|
|
fun verifyHomeScreenWelcomeItems() =
|
|
|
|
|
assertAppItemsContainingText(welcomeHeader, welcomeSubHeader)
|
|
|
|
|
|
|
|
|
|
fun verifyChooseYourThemeCard(
|
|
|
|
|
isDarkThemeChecked: Boolean,
|
|
|
|
|
isLightThemeChecked: Boolean,
|
|
|
|
|
isAutomaticThemeChecked: Boolean,
|
|
|
|
|
) {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_theme_picker_header))
|
|
|
|
|
assertAppItemsContainingText(
|
|
|
|
|
chooseThemeHeader,
|
|
|
|
|
chooseThemeText,
|
|
|
|
|
darkThemeDescription,
|
|
|
|
|
lightThemeDescription,
|
|
|
|
|
)
|
|
|
|
|
assertAppItemsStateWithResourceId(
|
|
|
|
|
darkThemeToggle(isDarkThemeChecked),
|
|
|
|
|
lightThemeToggle(isLightThemeChecked),
|
|
|
|
|
automaticThemeToggle(isAutomaticThemeChecked),
|
|
|
|
|
)
|
|
|
|
|
assertAppItemsWithResourceIdAndDescription(automaticThemeDescription)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyToolbarPlacementCard(isBottomChecked: Boolean, isTopChecked: Boolean) {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_toolbar_placement_header_1))
|
|
|
|
|
assertAppItemsContainingText(toolbarPlacementHeader, toolbarPlacementDescription)
|
|
|
|
|
assertAppItemsStateWithResourceId(
|
|
|
|
|
toolbarPlacementBottomRadioButton(isBottomChecked),
|
|
|
|
|
toolbarPlacementTopRadioButton(isTopChecked),
|
|
|
|
|
)
|
|
|
|
|
assertAppItemsWithResourceId(
|
|
|
|
|
toolbarPlacementBottomImage,
|
|
|
|
|
toolbarPlacementBottomTitle,
|
|
|
|
|
toolbarPlacementTopImage,
|
|
|
|
|
toolbarPlacementTopTitle,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifySignInToSyncCard() {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_account_sign_in_header))
|
|
|
|
|
assertAppItemsContainingText(startSyncHeader, startSyncDescription)
|
|
|
|
|
assertAppItemsWithResourceId(signInButton)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyPrivacyProtectionCard(isStandardChecked: Boolean, isStrictChecked: Boolean) {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_tracking_protection_header))
|
|
|
|
|
assertAppItemsContainingText(privacyProtectionHeader, privacyProtectionDescription)
|
|
|
|
|
assertAppItemsStateWithResourceId(
|
|
|
|
|
standardTrackingProtectionToggle(isStandardChecked),
|
|
|
|
|
strictTrackingProtectionToggle(isStrictChecked),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyPrivacyNoticeCard() {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_privacy_notice_header_1))
|
|
|
|
|
assertAppItemsContainingText(privacyNoticeHeader, privacyNoticeDescription)
|
|
|
|
|
assertAppItemsWithResourceId(privacyNoticeButton)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyStartBrowsingSection() {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_finish))
|
|
|
|
|
assertAppItemsWithResourceId(startBrowsingButton)
|
|
|
|
|
assertAppItemsContainingText(conclusionHeader)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyNavigationToolbarItems(numberOfOpenTabs: String) {
|
|
|
|
|
assertAppItemsWithResourceId(navigationToolbar, menuButton)
|
|
|
|
|
assertAppItemsWithResourceIdAndText(tabCounter(numberOfOpenTabs))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun verifyHomePrivateBrowsingButton() = assertAppItemsWithResourceId(privateBrowsingButton)
|
|
|
|
|
fun verifyHomeMenuButton() = assertAppItemsWithResourceId(menuButton)
|
|
|
|
|
fun verifyTabButton() = assertTabButton()
|
|
|
|
|
fun verifyCollectionsHeader() = assertCollectionsHeader()
|
|
|
|
|
fun verifyNoCollectionsText() = assertNoCollectionsText()
|
|
|
|
|
fun verifyHomeWordmark() = assertHomeWordmark()
|
|
|
|
|
fun verifyHomeWordmark() = assertAppItemsWithResourceId(homepageWordmark)
|
|
|
|
|
fun verifyHomeComponent() = assertHomeComponent()
|
|
|
|
|
fun verifyDefaultSearchEngine(searchEngine: String) = verifySearchEngineIcon(searchEngine)
|
|
|
|
|
fun verifyNoTabsOpened() = assertNoTabsOpened()
|
|
|
|
|
fun verifyTabCounter(numberOfOpenTabs: String) =
|
|
|
|
|
assertAppItemsWithResourceIdAndText(tabCounter(numberOfOpenTabs))
|
|
|
|
|
fun verifyKeyboardVisible() = assertKeyboardVisibility(isExpectedToBeVisible = true)
|
|
|
|
|
|
|
|
|
|
fun verifyWallpaperImageApplied(isEnabled: Boolean) {
|
|
|
|
@ -112,34 +184,13 @@ class HomeScreenRobot {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// First Run elements
|
|
|
|
|
fun verifyWelcomeHeader() = assertWelcomeHeader()
|
|
|
|
|
|
|
|
|
|
fun verifyStartSyncHeader() = assertStartSyncHeader()
|
|
|
|
|
fun verifyAccountsSignInButton() = assertAccountsSignInButton()
|
|
|
|
|
fun verifyChooseThemeHeader() = assertChooseThemeHeader()
|
|
|
|
|
fun verifyChooseThemeText() = assertChooseThemeText()
|
|
|
|
|
fun verifyLightThemeToggle() = assertLightThemeToggle()
|
|
|
|
|
fun verifyLightThemeDescription() = assertLightThemeDescription()
|
|
|
|
|
fun verifyDarkThemeToggle() = assertDarkThemeToggle()
|
|
|
|
|
fun verifyDarkThemeDescription() = assertDarkThemeDescription()
|
|
|
|
|
fun verifyAutomaticThemeToggle() = assertAutomaticThemeToggle()
|
|
|
|
|
fun verifyAutomaticThemeDescription() = assertAutomaticThemeDescription()
|
|
|
|
|
fun verifyAutomaticPrivacyHeader() = assertAutomaticPrivacyHeader()
|
|
|
|
|
fun verifyAutomaticPrivacyText() = assertAlwaysPrivacyText()
|
|
|
|
|
|
|
|
|
|
// Pick your toolbar placement
|
|
|
|
|
fun verifyTakePositionHeader() = assertTakePlacementHeader()
|
|
|
|
|
fun verifyTakePositionElements() {
|
|
|
|
|
assertTakePlacementBottomRadioButton()
|
|
|
|
|
assertTakePacementTopRadioButton()
|
|
|
|
|
fun verifyWelcomeHeader() = assertAppItemsContainingText(welcomeHeader)
|
|
|
|
|
fun verifyAccountsSignInButton() = assertAppItemsWithResourceId(signInButton)
|
|
|
|
|
fun verifyStartBrowsingButton() {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_finish))
|
|
|
|
|
assertAppItemsWithResourceId(startBrowsingButton)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Your privacy
|
|
|
|
|
fun verifyYourPrivacyHeader() = assertYourPrivacyHeader()
|
|
|
|
|
fun verifyYourPrivacyText() = assertYourPrivacyText()
|
|
|
|
|
fun verifyPrivacyNoticeButton() = assertPrivacyNoticeButton()
|
|
|
|
|
fun verifyStartBrowsingButton() = assertStartBrowsingButton()
|
|
|
|
|
|
|
|
|
|
// Upgrading users onboarding dialog
|
|
|
|
|
fun verifyUpgradingUserOnboardingFirstScreen(testRule: ComposeTestRule) {
|
|
|
|
|
testRule.also {
|
|
|
|
@ -458,8 +509,8 @@ class HomeScreenRobot {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun openSearch(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
|
|
|
|
|
navigationToolbar().waitForExists(waitingTime)
|
|
|
|
|
navigationToolbar().click()
|
|
|
|
|
navigationToolbar.waitForExists(waitingTime)
|
|
|
|
|
navigationToolbar.click()
|
|
|
|
|
|
|
|
|
|
SearchRobot().interact()
|
|
|
|
|
return SearchRobot.Transition()
|
|
|
|
@ -470,7 +521,7 @@ class HomeScreenRobot {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun clickStartBrowsingButton(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
|
|
|
|
|
startBrowsingButton().click()
|
|
|
|
|
startBrowsingButton.click()
|
|
|
|
|
|
|
|
|
|
SearchRobot().interact()
|
|
|
|
|
return SearchRobot.Transition()
|
|
|
|
@ -491,8 +542,7 @@ class HomeScreenRobot {
|
|
|
|
|
.waitForExists(
|
|
|
|
|
waitingTime,
|
|
|
|
|
)
|
|
|
|
|
privateBrowsingButton()
|
|
|
|
|
.perform(click())
|
|
|
|
|
privateBrowsingButton.click()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun triggerPrivateBrowsingShortcutPrompt(interact: AddToHomeScreenRobot.() -> Unit): AddToHomeScreenRobot.Transition {
|
|
|
|
@ -503,8 +553,7 @@ class HomeScreenRobot {
|
|
|
|
|
waitingTime,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
privateBrowsingButton()
|
|
|
|
|
.perform(click())
|
|
|
|
|
privateBrowsingButton.click()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddToHomeScreenRobot().interact()
|
|
|
|
@ -518,7 +567,7 @@ class HomeScreenRobot {
|
|
|
|
|
fun openNavigationToolbar(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition {
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar"))
|
|
|
|
|
.waitForExists(waitingTime)
|
|
|
|
|
navigationToolbar().click()
|
|
|
|
|
navigationToolbar.click()
|
|
|
|
|
|
|
|
|
|
NavigationToolbarRobot().interact()
|
|
|
|
|
return NavigationToolbarRobot.Transition()
|
|
|
|
@ -754,31 +803,10 @@ private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean) =
|
|
|
|
|
.contains("mInputShown=true"),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private fun navigationToolbar() = mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar"))
|
|
|
|
|
|
|
|
|
|
private fun assertNavigationToolbar() = assertTrue(navigationToolbar().waitForExists(waitingTime))
|
|
|
|
|
|
|
|
|
|
private fun assertFocusedNavigationToolbar() =
|
|
|
|
|
onView(allOf(withHint("Search or enter address")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
|
|
|
|
|
private fun assertHomeScreen() {
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId("$packageName:id/homeLayout")).waitForExists(waitingTime)
|
|
|
|
|
onView(ViewMatchers.withResourceName("homeLayout"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertHomeMenuButton() = onView(ViewMatchers.withResourceName("menuButton"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
|
|
|
|
|
private fun assertHomePrivateBrowsingButton() =
|
|
|
|
|
privateBrowsingButton()
|
|
|
|
|
.check(matches(isDisplayed()))
|
|
|
|
|
|
|
|
|
|
private val homepageWordmark = onView(ViewMatchers.withResourceName("wordmark"))
|
|
|
|
|
private fun assertHomeWordmark() =
|
|
|
|
|
homepageWordmark.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
|
|
|
|
|
private fun assertTabButton() =
|
|
|
|
|
onView(allOf(withId(R.id.tab_button), isDisplayed()))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
@ -801,8 +829,6 @@ private fun assertHomeComponent() =
|
|
|
|
|
onView(ViewMatchers.withResourceName("sessionControlRecyclerView"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
|
|
|
|
|
private fun assertNoTabsOpened() = onView(withId(R.id.counter_text)).check(matches(withText("0")))
|
|
|
|
|
|
|
|
|
|
private fun threeDotButton() = onView(allOf(withId(R.id.menuButton)))
|
|
|
|
|
|
|
|
|
|
private fun verifySearchEngineIcon(searchEngineIcon: Bitmap, searchEngineName: String) {
|
|
|
|
@ -819,138 +845,6 @@ private fun verifySearchEngineIcon(searchEngineName: String) {
|
|
|
|
|
verifySearchEngineIcon(defaultSearchEngine.icon, defaultSearchEngine.name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// First Run elements
|
|
|
|
|
private fun assertWelcomeHeader() =
|
|
|
|
|
assertTrue(
|
|
|
|
|
mDevice.findObject(
|
|
|
|
|
UiSelector().textContains(
|
|
|
|
|
getStringResource(R.string.onboarding_header_2),
|
|
|
|
|
),
|
|
|
|
|
).waitForExists(waitingTime),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private fun assertStartSyncHeader() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER)
|
|
|
|
|
onView(allOf(withText(R.string.onboarding_account_sign_in_header)))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
private fun assertAccountsSignInButton() {
|
|
|
|
|
scrollToElementByText(getStringResource(R.string.onboarding_firefox_account_sign_in))
|
|
|
|
|
onView(ViewMatchers.withResourceName("fxa_sign_in_button"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertChooseThemeHeader() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(withText("Choose your theme"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
private fun assertChooseThemeText() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(allOf(withText("Save some battery and your eyesight with dark mode.")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertLightThemeToggle() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(ViewMatchers.withResourceName("theme_light_radio_button"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertLightThemeDescription() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(allOf(withText("Light theme")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertDarkThemeToggle() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(ViewMatchers.withResourceName("theme_dark_radio_button"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertDarkThemeDescription() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(allOf(withText("Dark theme")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
private fun assertAutomaticThemeToggle() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(withId(R.id.theme_automatic_radio_button))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAutomaticThemeDescription() {
|
|
|
|
|
scrollToElementByText("Choose your theme")
|
|
|
|
|
onView(allOf(withText("Automatic")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAutomaticPrivacyHeader() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER)
|
|
|
|
|
onView(allOf(withText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER)))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAlwaysPrivacyText() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER)
|
|
|
|
|
onView(
|
|
|
|
|
allOf(
|
|
|
|
|
withText(
|
|
|
|
|
"Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites.",
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertYourPrivacyHeader() {
|
|
|
|
|
scrollToElementByText("You control your data")
|
|
|
|
|
onView(allOf(withText("You control your data")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertYourPrivacyText() {
|
|
|
|
|
scrollToElementByText("You control your data")
|
|
|
|
|
onView(
|
|
|
|
|
allOf(
|
|
|
|
|
withText(
|
|
|
|
|
"Firefox gives you control over what you share online and what you share with us.",
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertPrivacyNoticeButton() {
|
|
|
|
|
scrollToElementByText("You control your data")
|
|
|
|
|
onView(allOf(withText("Read our privacy notice")))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertStartBrowsingButton() {
|
|
|
|
|
assertTrue(startBrowsingButton().waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Pick your toolbar placement
|
|
|
|
|
private fun assertTakePlacementHeader() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER)
|
|
|
|
|
onView(allOf(withText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER)))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertTakePacementTopRadioButton() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER)
|
|
|
|
|
onView(ViewMatchers.withResourceName("toolbar_top_radio_button"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertTakePlacementBottomRadioButton() {
|
|
|
|
|
scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER)
|
|
|
|
|
onView(ViewMatchers.withResourceName("toolbar_bottom_radio_button"))
|
|
|
|
|
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertPrivateSessionMessage() =
|
|
|
|
|
assertTrue(
|
|
|
|
|
mDevice.findObject(
|
|
|
|
@ -1090,8 +984,6 @@ private fun assertPocketSectionIsDisplayed() = assertTrue(pocketSection().waitFo
|
|
|
|
|
|
|
|
|
|
private fun assertPocketSectionIsNotDisplayed() = assertFalse(pocketSection().waitForExists(waitingTime))
|
|
|
|
|
|
|
|
|
|
private fun privateBrowsingButton() = onView(withId(R.id.privateBrowsingButton))
|
|
|
|
|
|
|
|
|
|
private fun saveTabsToCollectionButton() = onView(withId(R.id.add_tabs_to_collections_button))
|
|
|
|
|
|
|
|
|
|
private fun tabsCounter() = onView(withId(R.id.tab_button))
|
|
|
|
@ -1108,15 +1000,6 @@ private fun recentBookmarksSection() =
|
|
|
|
|
private fun pocketSection() =
|
|
|
|
|
mDevice.findObject(UiSelector().textContains(getStringResource(R.string.pocket_stories_header_1)))
|
|
|
|
|
|
|
|
|
|
private fun startBrowsingButton(): UiObject {
|
|
|
|
|
val startBrowsingButton = mDevice.findObject(UiSelector().resourceId("$packageName:id/finish_button"))
|
|
|
|
|
homeScreenList()
|
|
|
|
|
.scrollIntoView(startBrowsingButton)
|
|
|
|
|
homeScreenList()
|
|
|
|
|
.ensureFullyVisible(startBrowsingButton)
|
|
|
|
|
return startBrowsingButton
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun sponsoredShortcut(sponsoredShortcutTitle: String) =
|
|
|
|
|
mDevice.findObject(
|
|
|
|
|
By
|
|
|
|
@ -1127,6 +1010,126 @@ private fun sponsoredShortcut(sponsoredShortcutTitle: String) =
|
|
|
|
|
private fun storyByTopicItem(composeTestRule: ComposeTestRule, position: Int) =
|
|
|
|
|
composeTestRule.onNodeWithTag("pocket.categories").onChildAt(position - 1)
|
|
|
|
|
|
|
|
|
|
private fun appItemWithResourceId(resourceId: String) =
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId(resourceId))
|
|
|
|
|
|
|
|
|
|
private fun appItemContainingText(itemText: String) =
|
|
|
|
|
mDevice.findObject(UiSelector().textContains(itemText))
|
|
|
|
|
|
|
|
|
|
private fun appItemStateWithResourceId(resourceId: String, state: Boolean) =
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId(resourceId).checked(state))
|
|
|
|
|
|
|
|
|
|
private fun appItemWithResourceIdAndDescription(resourceId: String, description: String) =
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId(resourceId).descriptionContains(description))
|
|
|
|
|
|
|
|
|
|
private fun appItemWithResourceIdAndText(resourceId: String, text: String) =
|
|
|
|
|
mDevice.findObject(UiSelector().resourceId(resourceId).text(text))
|
|
|
|
|
|
|
|
|
|
private fun assertAppItemsWithResourceId(vararg appItems: UiObject) {
|
|
|
|
|
for (appItem in appItems) {
|
|
|
|
|
assertTrue(appItem.waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAppItemsContainingText(vararg appItems: UiObject) {
|
|
|
|
|
for (appItem in appItems) {
|
|
|
|
|
assertTrue(appItem.waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAppItemsStateWithResourceId(vararg appItems: UiObject) {
|
|
|
|
|
for (appItem in appItems) {
|
|
|
|
|
assertTrue(appItem.waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAppItemsWithResourceIdAndDescription(vararg appItems: UiObject) {
|
|
|
|
|
for (appItem in appItems) {
|
|
|
|
|
assertTrue(appItem.waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun assertAppItemsWithResourceIdAndText(vararg appItems: UiObject) {
|
|
|
|
|
for (appItem in appItems) {
|
|
|
|
|
assertTrue(appItem.waitForExists(waitingTime))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val homeScreen =
|
|
|
|
|
appItemWithResourceId("$packageName:id/homeLayout")
|
|
|
|
|
private val privateBrowsingButton =
|
|
|
|
|
appItemWithResourceId("$packageName:id/privateBrowsingButton")
|
|
|
|
|
private val homepageWordmark =
|
|
|
|
|
appItemWithResourceId("$packageName:id/wordmark")
|
|
|
|
|
private val welcomeHeader = appItemContainingText(getStringResource(R.string.onboarding_header_2))
|
|
|
|
|
private val welcomeSubHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_message))
|
|
|
|
|
private val chooseThemeHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_theme_picker_header))
|
|
|
|
|
private val chooseThemeText =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_theme_picker_description_2))
|
|
|
|
|
private val darkThemeDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_theme_dark_title))
|
|
|
|
|
private val lightThemeDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_theme_light_title))
|
|
|
|
|
private val automaticThemeDescription =
|
|
|
|
|
appItemWithResourceIdAndDescription(
|
|
|
|
|
"$packageName:id/clickable_region_automatic",
|
|
|
|
|
"${getStringResource(R.string.onboarding_theme_automatic_title)} ${getStringResource(R.string.onboarding_theme_automatic_summary)}",
|
|
|
|
|
)
|
|
|
|
|
private fun darkThemeToggle(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/theme_dark_radio_button", isChecked)
|
|
|
|
|
private fun lightThemeToggle(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/theme_light_radio_button", isChecked)
|
|
|
|
|
private fun automaticThemeToggle(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/theme_automatic_radio_button", isChecked)
|
|
|
|
|
private val toolbarPlacementHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_toolbar_placement_header_1))
|
|
|
|
|
private val toolbarPlacementDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_toolbar_placement_description))
|
|
|
|
|
private fun toolbarPlacementBottomRadioButton(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/toolbar_bottom_radio_button", isChecked)
|
|
|
|
|
private fun toolbarPlacementTopRadioButton(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/toolbar_top_radio_button", isChecked)
|
|
|
|
|
private val toolbarPlacementBottomImage =
|
|
|
|
|
appItemWithResourceId("$packageName:id/toolbar_bottom_image")
|
|
|
|
|
private val toolbarPlacementBottomTitle =
|
|
|
|
|
appItemWithResourceId("$packageName:id/toolbar_bottom_title")
|
|
|
|
|
private val toolbarPlacementTopTitle =
|
|
|
|
|
appItemWithResourceId("$packageName:id/toolbar_top_title")
|
|
|
|
|
private val toolbarPlacementTopImage =
|
|
|
|
|
appItemWithResourceId("$packageName:id/toolbar_top_image")
|
|
|
|
|
private val startSyncHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_account_sign_in_header))
|
|
|
|
|
private val startSyncDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_manual_sign_in_description))
|
|
|
|
|
private val signInButton =
|
|
|
|
|
appItemWithResourceId("$packageName:id/fxa_sign_in_button")
|
|
|
|
|
private val privacyProtectionHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_tracking_protection_header))
|
|
|
|
|
private val privacyProtectionDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_tracking_protection_description))
|
|
|
|
|
private fun standardTrackingProtectionToggle(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/tracking_protection_standard_option", isChecked)
|
|
|
|
|
private fun strictTrackingProtectionToggle(isChecked: Boolean) =
|
|
|
|
|
appItemStateWithResourceId("$packageName:id/tracking_protection_strict_default", isChecked)
|
|
|
|
|
private val privacyNoticeHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_privacy_notice_header_1))
|
|
|
|
|
private val privacyNoticeDescription =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_privacy_notice_description))
|
|
|
|
|
private val privacyNoticeButton =
|
|
|
|
|
appItemWithResourceId("$packageName:id/read_button")
|
|
|
|
|
private val startBrowsingButton =
|
|
|
|
|
appItemWithResourceId("$packageName:id/finish_button")
|
|
|
|
|
private val conclusionHeader =
|
|
|
|
|
appItemContainingText(getStringResource(R.string.onboarding_conclusion_header))
|
|
|
|
|
private val navigationToolbar =
|
|
|
|
|
appItemWithResourceId("$packageName:id/toolbar")
|
|
|
|
|
private val menuButton =
|
|
|
|
|
appItemWithResourceId("$packageName:id/menuButton")
|
|
|
|
|
private fun tabCounter(numberOfOpenTabs: String) =
|
|
|
|
|
appItemWithResourceIdAndText("$packageName:id/counter_text", numberOfOpenTabs)
|
|
|
|
|
|
|
|
|
|
val deleteFromHistory =
|
|
|
|
|
onView(
|
|
|
|
|
allOf(
|
|
|
|
|