From 7b5ee112b49d6f666d6c6a8c8637a8a994f5857e Mon Sep 17 00:00:00 2001 From: Pascal Chevrel Date: Mon, 19 Sep 2022 14:27:59 +0200 Subject: [PATCH 001/407] Update version.txt to 107.0b1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7358210f0..fdbbd449f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -106.0b1 +107.0b1 From de14a20fae0c2851315aae37773b5a6e3d8ab86e Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 16 Sep 2022 10:14:03 -0400 Subject: [PATCH 002/407] Update protobuf to latest release. --- app/build.gradle | 2 +- buildSrc/src/main/java/Dependencies.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8759ccd0f..00c679b9e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ import org.mozilla.fenix.gradle.tasks.ApkSizeTask plugins { id "com.jetbrains.python.envs" version "0.0.26" - id "com.google.protobuf" version "0.8.17" + id "com.google.protobuf" version "0.8.19" } apply plugin: 'com.android.application' diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 6055ee605..877cb291d 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -59,7 +59,7 @@ object Versions { const val google_play_store_version = "1.8.0" - const val protobuf = "3.11.4" // keep in sync with the version used in AS. + const val protobuf = "3.21.6" // keep in sync with the version used in AS. } @Suppress("unused") From 400a2a60d1cfa8e9c0fead7f7586927c0e025ea1 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 15 Sep 2022 17:04:44 +0300 Subject: [PATCH 003/407] For #26286 new homepage settings UI tests --- .../mozilla/fenix/ui/SettingsHomepageTest.kt | 68 ++++ .../fenix/ui/robots/HomeScreenRobot.kt | 32 +- .../ui/robots/SettingsSubMenuHomepageRobot.kt | 294 +++++++++++++++--- 3 files changed, 343 insertions(+), 51 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt index 0a72cd874..867435b31 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt @@ -55,6 +55,74 @@ class SettingsHomepageTest { featureSettingsHelper.resetAllFeatureFlags() } + @Test + fun verifyHomepageSettingsTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openHomepageSubMenu { + verifyHomePageView() + } + } + + @Test + fun verifyShortcutOptionTest() { + // en-US defaults + val defaultTopSites = arrayOf( + "Top Articles", + "Wikipedia", + "Google", + ) + + homeScreen { + defaultTopSites.forEach { item -> + verifyExistingTopSitesTabs(item) + } + }.openThreeDotMenu { + }.openCustomizeHome { + clickShortcutsButton() + }.goBack { + defaultTopSites.forEach { item -> + verifyNotExistingTopSitesList(item) + } + } + } + + @Test + fun verifyRecentlyVisitedOptionTest() { + featureSettingsHelper.setRecentTabsFeatureEnabled(false) + val genericURL = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + }.goToHomescreen { + verifyRecentlyVisitedSectionIsDisplayed() + }.openThreeDotMenu { + }.openCustomizeHome { + clickRecentlyVisited() + }.goBack { + verifyRecentlyVisitedSectionIsNotDisplayed() + } + } + + @Test + fun verifyPocketOptionTest() { + featureSettingsHelper.setRecentTabsFeatureEnabled(false) + featureSettingsHelper.setRecentlyVisitedFeatureEnabled(false) + val genericURL = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + }.goToHomescreen { + verifyPocketSectionIsDisplayed() + }.openThreeDotMenu { + }.openCustomizeHome { + clickPocketButton() + }.goBack { + verifyPocketSectionIsNotDisplayed() + } + } + @SmokeTest @Test fun jumpBackInOptionTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index 7ff2efeaf..ab40ce23a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -37,7 +37,6 @@ import mozilla.components.browser.state.state.searchEngines import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.containsString import org.hamcrest.CoreMatchers.instanceOf -import org.hamcrest.CoreMatchers.not import org.hamcrest.Matchers import org.junit.Assert import org.junit.Assert.assertFalse @@ -56,7 +55,6 @@ import org.mozilla.fenix.helpers.TestHelper.packageName 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.matchers.hasItem 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 @@ -145,8 +143,12 @@ class HomeScreenRobot { fun verifyJumpBackInSectionIsDisplayed() = assertJumpBackInSectionIsDisplayed() fun verifyJumpBackInSectionIsNotDisplayed() = assertJumpBackInSectionIsNotDisplayed() + fun verifyRecentlyVisitedSectionIsDisplayed() = assertRecentlyVisitedSectionIsDisplayed() + fun verifyRecentlyVisitedSectionIsNotDisplayed() = assertRecentlyVisitedSectionIsNotDisplayed() fun verifyRecentBookmarksSectionIsDisplayed() = assertRecentBookmarksSectionIsDisplayed() fun verifyRecentBookmarksSectionIsNotDisplayed() = assertRecentBookmarksSectionIsNotDisplayed() + fun verifyPocketSectionIsDisplayed() = assertPocketSectionIsDisplayed() + fun verifyPocketSectionIsNotDisplayed() = assertPocketSectionIsNotDisplayed() fun verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed: Boolean, searchTerm: String, groupSize: Int) { // checks if the search group exists in the Recently visited section @@ -820,11 +822,15 @@ private fun assertSponsoredShortcutTitle(sponsoredShortcutTitle: String, positio } private fun assertNotExistingTopSitesList(title: String) { - mDevice.findObject(UiSelector().text(title)) - .waitUntilGone(waitingTime) + mDevice.findObject(UiSelector().text(title)).waitUntilGone(waitingTime) - onView(allOf(withId(R.id.top_sites_list))) - .check(matches(not(hasItem(hasDescendant(withText(title)))))) + assertFalse( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/top_site_title") + .textContains(title), + ).waitForExists(waitingTime), + ) } private fun assertSponsoredTopSitesNotDisplayed() { @@ -852,12 +858,20 @@ private fun assertJumpBackInSectionIsDisplayed() = assertTrue(jumpBackInSection( private fun assertJumpBackInSectionIsNotDisplayed() = assertFalse(jumpBackInSection().waitForExists(waitingTimeShort)) +private fun assertRecentlyVisitedSectionIsDisplayed() = assertTrue(recentlyVisitedSection().waitForExists(waitingTime)) + +private fun assertRecentlyVisitedSectionIsNotDisplayed() = assertFalse(recentlyVisitedSection().waitForExists(waitingTime)) + private fun assertRecentBookmarksSectionIsDisplayed() = assertTrue(recentBookmarksSection().waitForExists(waitingTime)) private fun assertRecentBookmarksSectionIsNotDisplayed() = assertFalse(recentBookmarksSection().waitForExists(waitingTimeShort)) +private fun assertPocketSectionIsDisplayed() = assertTrue(pocketSection().waitForExists(waitingTime)) + +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)) @@ -867,9 +881,15 @@ private fun tabsCounter() = onView(withId(R.id.tab_button)) private fun jumpBackInSection() = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.recent_tabs_header))) +private fun recentlyVisitedSection() = + mDevice.findObject(UiSelector().textContains(getStringResource(R.string.history_metadata_header_2))) + private fun recentBookmarksSection() = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.recently_saved_title))) +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() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt index 18953d0e4..7bd5aa6e1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt @@ -6,22 +6,24 @@ package org.mozilla.fenix.ui.robots import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.hasSibling import androidx.test.espresso.matcher.ViewMatchers.isChecked import androidx.test.espresso.matcher.ViewMatchers.isNotChecked -import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withClassName import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.UiSelector +import org.hamcrest.CoreMatchers import org.hamcrest.CoreMatchers.allOf -import org.hamcrest.CoreMatchers.endsWith +import org.hamcrest.Matchers import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort +import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.click @@ -30,25 +32,46 @@ import org.mozilla.fenix.helpers.click */ class SettingsSubMenuHomepageRobot { - fun verifyHomePageView() { - assertMostVisitedTopSitesButton() + fun verifyHomePageView( + shortcutsSwitchEnabled: Boolean = true, + sponsoredShortcutsCheckBox: Boolean = true, + jumpBackInSwitchEnabled: Boolean = true, + recentBookmarksSwitchEnabled: Boolean = true, + recentlyVisitedSwitchEnabled: Boolean = true, + pocketSwitchEnabled: Boolean = true, + sponsoredStoriesCheckBox: Boolean = true, + ) { + assertShortcutsButton() + assertShortcutsSwitchState(shortcutsSwitchEnabled) + assertSponsoredShortcutsButton() + assertSponsoredShortcutsCheckBox(sponsoredShortcutsCheckBox) assertJumpBackInButton() + assertJumpBackInSwitchState(jumpBackInSwitchEnabled) assertRecentBookmarksButton() - assertRecentSearchesButton() + assertRecentBookmarksSwitchState(recentBookmarksSwitchEnabled) + assertRecentlyVisitedButton() + assertRecentlyVisitedSwitchState(recentlyVisitedSwitchEnabled) assertPocketButton() + assertPocketSwitchState(pocketSwitchEnabled) + assertSponsoredStoriesButton() + assertSponsoredStoriesCheckBox(sponsoredStoriesCheckBox) assertOpeningScreenHeading() assertHomepageButton() assertLastTabButton() assertHomepageAfterFourHoursButton() } - fun clickSponsoredShortcuts() = sponsoredShortcuts().click() + fun clickShortcutsButton() = shortcutsButton().click() + + fun clickSponsoredShortcuts() = sponsoredShortcutsButton().click() fun clickJumpBackInButton() = jumpBackInButton().click() + fun clickRecentlyVisited() = recentlyVisitedButton().click() + fun clickRecentBookmarksButton() = recentBookmarksButton().click() - fun clickRecentSearchesButton() = recentSearchesButton().click() + fun clickRecentSearchesButton() = recentlyVisitedButton().click() fun clickPocketButton() = pocketButton().click() @@ -69,37 +92,7 @@ class SettingsSubMenuHomepageRobot { ).waitForExists(waitingTimeShort), ) - fun verifySponsoredShortcutsCheckBox(checked: Boolean) { - if (checked) { - sponsoredShortcuts() - .check( - matches( - hasSibling( - withChild( - allOf( - withClassName(endsWith("CheckBox")), - isChecked(), - ), - ), - ), - ), - ) - } else { - sponsoredShortcuts() - .check( - matches( - hasSibling( - withChild( - allOf( - withClassName(endsWith("CheckBox")), - isNotChecked(), - ), - ), - ), - ), - ) - } - } + fun verifySponsoredShortcutsCheckBox(checked: Boolean) = assertSponsoredShortcutsCheckBox(checked) class Transition { @@ -121,10 +114,10 @@ class SettingsSubMenuHomepageRobot { } } -private fun mostVisitedTopSitesButton() = +private fun shortcutsButton() = onView(allOf(withText(R.string.top_sites_toggle_top_recent_sites_4))) -private fun sponsoredShortcuts() = +private fun sponsoredShortcutsButton() = onView(allOf(withText(R.string.customize_toggle_contile))) private fun jumpBackInButton() = @@ -133,12 +126,15 @@ private fun jumpBackInButton() = private fun recentBookmarksButton() = onView(allOf(withText(R.string.customize_toggle_recent_bookmarks))) -private fun recentSearchesButton() = +private fun recentlyVisitedButton() = onView(allOf(withText(R.string.customize_toggle_recently_visited))) private fun pocketButton() = onView(allOf(withText(R.string.customize_toggle_pocket))) +private fun sponsoredStoriesButton() = + onView(allOf(withText(R.string.customize_toggle_pocket_sponsored))) + private fun openingScreenHeading() = onView(withText(R.string.preferences_opening_screen)) private fun homepageButton() = @@ -170,16 +166,20 @@ private fun homepageAfterFourHoursButton() = private fun goBackButton() = onView(allOf(withContentDescription(R.string.action_bar_up_description))) -private fun assertMostVisitedTopSitesButton() = - mostVisitedTopSitesButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun assertShortcutsButton() = + shortcutsButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun assertSponsoredShortcutsButton() = + sponsoredShortcutsButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertJumpBackInButton() = jumpBackInButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertRecentBookmarksButton() = recentBookmarksButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -private fun assertRecentSearchesButton() = - recentSearchesButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun assertRecentlyVisitedButton() = + recentlyVisitedButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertPocketButton() = pocketButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun assertSponsoredStoriesButton() = + sponsoredStoriesButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertOpeningScreenHeading() = openingScreenHeading().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertHomepageButton() = @@ -189,4 +189,208 @@ private fun assertLastTabButton() = private fun assertHomepageAfterFourHoursButton() = homepageAfterFourHoursButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +fun assertShortcutsSwitchState(enabled: Boolean) { + if (enabled) { + shortcutsButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isChecked(), + ), + ), + ), + ) + } else { + shortcutsButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isNotChecked(), + ), + ), + ), + ) + } +} + +fun assertSponsoredShortcutsCheckBox(checked: Boolean) { + if (checked) { + sponsoredShortcutsButton() + .check( + matches( + hasSibling( + ViewMatchers.withChild( + allOf( + withClassName(CoreMatchers.endsWith("CheckBox")), + isChecked(), + ), + ), + ), + ), + ) + } else { + sponsoredShortcutsButton() + .check( + matches( + hasSibling( + ViewMatchers.withChild( + allOf( + withClassName(CoreMatchers.endsWith("CheckBox")), + isNotChecked(), + ), + ), + ), + ), + ) + } +} + +fun assertJumpBackInSwitchState(enabled: Boolean) { + if (enabled) { + jumpBackInButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isChecked(), + ), + ), + ), + ) + } else { + jumpBackInButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isNotChecked(), + ), + ), + ), + ) + } +} + +fun assertRecentBookmarksSwitchState(enabled: Boolean) { + if (enabled) { + recentBookmarksButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isChecked(), + ), + ), + ), + ) + } else { + recentBookmarksButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isNotChecked(), + ), + ), + ), + ) + } +} + +fun assertRecentlyVisitedSwitchState(enabled: Boolean) { + if (enabled) { + recentlyVisitedButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isChecked(), + ), + ), + ), + ) + } else { + recentlyVisitedButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isNotChecked(), + ), + ), + ), + ) + } +} + +fun assertPocketSwitchState(enabled: Boolean) { + if (enabled) { + pocketButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isChecked(), + ), + ), + ), + ) + } else { + pocketButton() + .check( + matches( + TestHelper.hasCousin( + Matchers.allOf( + withClassName(Matchers.endsWith("Switch")), + isNotChecked(), + ), + ), + ), + ) + } +} + +fun assertSponsoredStoriesCheckBox(checked: Boolean) { + if (checked) { + sponsoredStoriesButton() + .check( + matches( + hasSibling( + ViewMatchers.withChild( + allOf( + withClassName(CoreMatchers.endsWith("CheckBox")), + isChecked(), + ), + ), + ), + ), + ) + } else { + sponsoredStoriesButton() + .check( + matches( + hasSibling( + ViewMatchers.withChild( + allOf( + withClassName(CoreMatchers.endsWith("CheckBox")), + isNotChecked(), + ), + ), + ), + ), + ) + } +} + private val wallpapersMenuButton = onView(withText("Wallpapers")) From 9cf42cb7d91e49d693ad585fd95afb6efb621d91 Mon Sep 17 00:00:00 2001 From: Pg Date: Thu, 7 Apr 2022 17:57:51 +0200 Subject: [PATCH 004/407] For #11404 - Create open all function - Create element to be displayed - Update the interface and bind in the view holder Set the filter to limit this action to FOLDER. - Create core function Main logic is done on the controller (has it should be done). The whole process is done in one coroutine to be non-blocking as many (sub)folders & links can be present. If folder is empty, a toast is displayed. Else iterate on items. When item is: - a FOLDER -> restart process (without toast) on the folder - a ITEM -> open it - a SEPARATOR -> do nothing Once finished, show the tabs tray. Toast message is defined in fragment to have access to context. - Create androidTest for openAllInTabs - Create tests for handleBookmarkFolderOpening - Display 'open all' options only if folder has at least on child: A coroutine and suspended functions have to be used, since `getTree` is async. --- .../org/mozilla/fenix/ui/BookmarksTest.kt | 45 +++++++ .../mozilla/fenix/ui/robots/BookmarksRobot.kt | 11 +- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 12 +- .../ui/robots/ThreeDotMenuBookmarksRobot.kt | 9 ++ .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 8 ++ .../library/bookmarks/BookmarkController.kt | 32 +++++ .../library/bookmarks/BookmarkFragment.kt | 22 ++++ .../bookmarks/BookmarkFragmentInteractor.kt | 5 + .../library/bookmarks/BookmarkItemMenu.kt | 121 +++++++++++------- .../fenix/library/bookmarks/BookmarkView.kt | 7 + .../viewholders/BookmarkNodeViewHolder.kt | 9 +- app/src/main/res/values/strings.xml | 2 + .../bookmarks/BookmarkControllerTest.kt | 51 ++++++++ .../BookmarkFragmentInteractorTest.kt | 9 ++ .../library/bookmarks/BookmarkItemMenuTest.kt | 80 +++++++++++- 15 files changed, 370 insertions(+), 53 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index e0c6f9fa5..eb643054c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -264,6 +264,51 @@ class BookmarksTest { } } + @Test + fun openAllInTabsTest() { + val nbPages = 4 + val webPages = List(nbPages) { + TestAssetHelper.getGenericAsset(mockWebServer, it + 1) + } + + homeScreen { + }.openThreeDotMenu { + }.openBookmarks { + createFolder("root") + createFolder("sub", "root") + createFolder("empty", "root") + }.closeMenu { + } + + browserScreen { + createBookmark(webPages[0].url, "root") + createBookmark(webPages[1].url, "root") + createBookmark(webPages[2].url, "sub") + // out of folder and should not be opened + createBookmark(webPages[3].url) + }.openTabDrawer { + closeTab() + } + + browserScreen { + }.openThreeDotMenu { + }.openBookmarks { + }.openThreeDotMenu("root") { + }.clickOpenAllInTabs { + verifyTabTrayIsOpened() + verifyNormalModeSelected() + + verifyExistingOpenTabs("Test_Page_1") + verifyExistingOpenTabs("Test_Page_2") + verifyExistingOpenTabs("Test_Page_3") + closeTab() + closeTab() + closeTab() + // no more tabs should be presents and auto close tab tray + verifyTabTrayIsClosed() + } + } + @Test fun openBookmarkInPrivateTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 0b4a6d043..4b4f881fe 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -150,12 +150,21 @@ class BookmarksRobot { .click() } - fun createFolder(name: String) { + fun createFolder(name: String, parent: String? = null) { clickAddFolderButton() addNewFolderName(name) + if (!parent.isNullOrBlank()) { + setParentFolder(parent) + } saveNewFolder() } + fun setParentFolder(parentName: String) { + clickParentFolderSelector() + selectFolder(parentName) + navigateUp() + } + fun clickAddFolderButton() { mDevice.waitNotNull( Until.findObject(By.desc("Add folder")), diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 702640fb4..905aa9a5b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -334,13 +334,21 @@ class BrowserRobot { menuSaveImage.click() } - fun createBookmark(url: Uri) { + fun createBookmark(url: Uri, folder: String? = null) { navigationToolbar { }.enterURLAndEnterToBrowser(url) { // needs to wait for the right url to load before saving a bookmark verifyUrl(url.toString()) }.openThreeDotMenu { - }.bookmarkPage { } + }.bookmarkPage { + // continue only if a folder is defined + }.takeIf { !folder.isNullOrBlank() }?.let { + it.openThreeDotMenu { + }.editBookmarkPage { + setParentFolder(folder!!) + saveEditBookmark() + } + } } fun clickLinkMatchingText(expectedText: String) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt index 2c13ba626..25f6ec375 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt @@ -52,6 +52,13 @@ class ThreeDotMenuBookmarksRobot { return TabDrawerRobot.Transition() } + fun clickOpenAllInTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { + openAllInTabsButton().click() + + TabDrawerRobot().interact() + return TabDrawerRobot.Transition() + } + fun clickDelete(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { deleteButton().click() @@ -71,4 +78,6 @@ private fun openInNewTabButton() = onView(withText("Open in new tab")) private fun openInPrivateTabButton() = onView(withText("Open in private tab")) +private fun openAllInTabsButton() = onView(withText("Open All Bookmarks")) + private fun deleteButton() = onView(withText("Delete")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 865e17ada..12dc1d716 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -208,6 +208,14 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } + fun editBookmarkPage(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) + editBookmarkButton().click() + + BookmarksRobot().interact() + return BookmarksRobot.Transition() + } + fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) helpButton().click() diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index 4f96e26ac..69205b933 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -15,6 +15,7 @@ import mozilla.appservices.places.BookmarkRoot import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.storage.BookmarkNode +import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.service.fxa.sync.SyncReason import org.mozilla.fenix.BrowserDirection @@ -44,6 +45,7 @@ interface BookmarkController { fun handleCopyUrl(item: BookmarkNode) fun handleBookmarkSharing(item: BookmarkNode) fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) + fun handleBookmarkFolderOpening(folder: BookmarkNode) /** * Handle bookmark nodes deletion @@ -75,6 +77,7 @@ class DefaultBookmarkController( private val tabsUseCases: TabsUseCases?, private val loadBookmarkNode: suspend (String) -> BookmarkNode?, private val showSnackbar: (String) -> Unit, + private val onOpenAllInTabsEmpty: () -> Unit, private val deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit, private val deleteBookmarkFolder: (Set) -> Unit, private val showTabTray: () -> Unit, @@ -158,6 +161,35 @@ class DefaultBookmarkController( showTabTray() } + private suspend fun recursiveBookmarkFolderOpening(folder: BookmarkNode, firstLaunch: Boolean = false) { + val node = loadBookmarkNode.invoke(folder.guid) ?: return + if (!node.children.isNullOrEmpty()) { + if (firstLaunch) invokePendingDeletion.invoke() + + node.children!!.iterator().forEach { + when (it.type) { + BookmarkNodeType.FOLDER -> recursiveBookmarkFolderOpening(it, mode = mode) + BookmarkNodeType.ITEM -> { + it.url?.let { url -> tabsUseCases?.addTab?.invoke(url, private = (mode == BrowsingMode.Private)) } + } + BookmarkNodeType.SEPARATOR -> {} + } + }.also { + if (firstLaunch) { + activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private) + showTabTray() + } + } + } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() + } + + override fun handleBookmarkFolderOpening(folder: BookmarkNode) { + // potentially heavy function with a lot of bookmarks to open => use a coroutine + scope.launch { + recursiveBookmarkFolderOpening(folder, true) + } + } + override fun handleBookmarkDeletion(nodes: Set, removeType: BookmarkRemoveType) { deleteBookmarkNodes(nodes, removeType) } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 34e15347c..48a778f52 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -101,6 +101,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan tabsUseCases = activity?.components?.useCases?.tabsUseCases, loadBookmarkNode = ::loadBookmarkNode, showSnackbar = ::showSnackBarWithText, + onOpenAllInTabsEmpty = ::onOpenAllInTabsEmpty, deleteBookmarkNodes = ::deleteMulti, deleteBookmarkFolder = ::showRemoveFolderDialog, showTabTray = ::showTabTray, @@ -292,6 +293,27 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } + private fun alertHeavyOpen(n: Int, function: () -> (Unit)) { + AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.open_all_warning_title) + setMessage(String.format(context.getString(R.string.open_all_warning_message), n)) + setPositiveButton( + R.string.open_all_warning_confirm, + ) { dialog, _ -> + function() + dialog.dismiss() + } + setNegativeButton( + R.string.open_all_warning_cancel, + ) { dialog: DialogInterface, _ -> + dialog.dismiss() + } + setCancelable(false) + create() + show() + } + } + private fun deleteMulti( selected: Set, eventType: BookmarkRemoveType = BookmarkRemoveType.MULTIPLE, diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 9515764a1..c4b6c86c0 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -79,6 +79,11 @@ class BookmarkFragmentInteractor( } } + override fun onOpenAllInTabs(folder: BookmarkNode) { + require(folder.type == BookmarkNodeType.FOLDER) + bookmarksController.handleBookmarkFolderOpening(folder) + } + override fun onDelete(nodes: Set) { if (nodes.find { it.type == BookmarkNodeType.SEPARATOR } != null) { throw IllegalStateException("Cannot delete separators") diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index e437490ca..2d678f7ec 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -13,6 +13,7 @@ import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import org.mozilla.fenix.R +import org.mozilla.fenix.ext.bookmarkStorage class BookmarkItemMenu( private val context: Context, @@ -25,57 +26,87 @@ class BookmarkItemMenu( Share, OpenInNewTab, OpenInPrivateTab, + OpenAllInTabs, Delete, ; } val menuController: MenuController by lazy { BrowserMenuController() } + /** + * Check if the menu item has to be displayed or not for the type of bookmark. + * If wanted, return the item. + * Else, return null. + */ + private fun maybeCreateMenuItem( + itemType: BookmarkNodeType, + wantedType: BookmarkNodeType, + text: String, + action: Item, + ): TextMenuCandidate? { + return maybeCreateMenuItem(itemType, listOf(wantedType), text, action) + } + + private fun maybeCreateMenuItem( + itemType: BookmarkNodeType, + wantedTypes: List, + text: String, + action: Item, + ): TextMenuCandidate? { + return if (itemType in wantedTypes) { + TextMenuCandidate( + text = text, + ) { + onItemTapped.invoke(action) + } + } else { + null + } + } + @VisibleForTesting - internal fun menuItems(itemType: BookmarkNodeType): List { + internal suspend fun menuItems(itemType: BookmarkNodeType, itemId: String): List { + // if have at least one child + val hasAtLeastOneChild = !context.bookmarkStorage.getTree(itemId)?.children.isNullOrEmpty() + return listOfNotNull( - if (itemType != BookmarkNodeType.SEPARATOR) { - TextMenuCandidate( - text = context.getString(R.string.bookmark_menu_edit_button), - ) { - onItemTapped.invoke(Item.Edit) - } - } else { - null - }, - if (itemType == BookmarkNodeType.ITEM) { - TextMenuCandidate( - text = context.getString(R.string.bookmark_menu_copy_button), - ) { - onItemTapped.invoke(Item.Copy) - } - } else { - null - }, - if (itemType == BookmarkNodeType.ITEM) { - TextMenuCandidate( - text = context.getString(R.string.bookmark_menu_share_button), - ) { - onItemTapped.invoke(Item.Share) - } - } else { - null - }, - if (itemType == BookmarkNodeType.ITEM) { - TextMenuCandidate( - text = context.getString(R.string.bookmark_menu_open_in_new_tab_button), - ) { - onItemTapped.invoke(Item.OpenInNewTab) - } - } else { - null - }, - if (itemType == BookmarkNodeType.ITEM) { - TextMenuCandidate( - text = context.getString(R.string.bookmark_menu_open_in_private_tab_button), - ) { - onItemTapped.invoke(Item.OpenInPrivateTab) - } + maybeCreateMenuItem( + itemType, + listOf(BookmarkNodeType.ITEM, BookmarkNodeType.FOLDER), + context.getString(R.string.bookmark_menu_edit_button), + Item.Edit, + ), + maybeCreateMenuItem( + itemType, + BookmarkNodeType.ITEM, + context.getString(R.string.bookmark_menu_copy_button), + Item.Copy, + ), + maybeCreateMenuItem( + itemType, + BookmarkNodeType.ITEM, + context.getString(R.string.bookmark_menu_share_button), + Item.Share, + ), + maybeCreateMenuItem( + itemType, + BookmarkNodeType.ITEM, + context.getString(R.string.bookmark_menu_open_in_new_tab_button), + Item.OpenInNewTab, + ), + maybeCreateMenuItem( + itemType, + BookmarkNodeType.ITEM, + context.getString(R.string.bookmark_menu_open_in_private_tab_button), + Item.OpenInPrivateTab, + ), + if (hasAtLeastOneChild) { + maybeCreateMenuItem( + itemType, + BookmarkNodeType.FOLDER, + context.getString(R.string.bookmark_menu_open_all_in_tabs_button), + Item.OpenAllInTabs, + ) } else { null }, @@ -88,7 +119,7 @@ class BookmarkItemMenu( ) } - fun updateMenu(itemType: BookmarkNodeType) { - menuController.submitList(menuItems(itemType)) + suspend fun updateMenu(itemType: BookmarkNodeType, itemId: String) { + menuController.submitList(menuItems(itemType, itemId)) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index b6cbcf292..853a20009 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -79,6 +79,13 @@ interface BookmarkViewInteractor : SelectionInteractor { */ fun onOpenInPrivateTab(item: BookmarkNode) + /** + * Opens all bookmark items in new tabs. + * + * @param folder the bookmark folder containing all items to open in new tabs + */ + fun onOpenAllInTabs(folder: BookmarkNode) + /** * Deletes a set of bookmark nodes. * diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index dc1d8c8b9..8131c92b6 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -6,6 +6,9 @@ package org.mozilla.fenix.library.bookmarks.viewholders import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.mozilla.fenix.R @@ -42,6 +45,7 @@ class BookmarkNodeViewHolder( BookmarkItemMenu.Item.Share -> interactor.onSharePressed(item) BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item) BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item) + BookmarkItemMenu.Item.OpenAllInTabs -> interactor.onOpenAllInTabs(item) BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item)) } } @@ -58,7 +62,10 @@ class BookmarkNodeViewHolder( containerView.urlView.isVisible = item.type == BookmarkNodeType.ITEM containerView.setSelectionInteractor(item, mode, interactor) - menu.updateMenu(item.type) + + CoroutineScope(Dispatchers.Default).launch { + menu.updateMenu(item.type, item.guid) + } // Hide menu button if this item is a root folder or is selected if (item.type == BookmarkNodeType.FOLDER && item.inRoots()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d244adf61..a08666701 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -862,6 +862,8 @@ Open in new tab Open in private tab + + Open all in new tabs Delete diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 510389f5f..4a8a7c052 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -358,6 +358,55 @@ class BookmarkControllerTest { } } + @Test + fun `handleBookmarkFolderOpening should open all bookmarks in normal tabs`() { + var showTabTrayInvoked = false + createController( + showTabTray = { + showTabTrayInvoked = true + }, + loadBookmarkNode = { + fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { + if (item.guid == guid) { + return item + } else { + item.children?.iterator()?.forEach { + val res = recurseFind(it, guid) + if (res != null) { + return res + } + } + return null + } + } + recurseFind(tree, it) + }, + ).handleBookmarkFolderOpening(tree) + + assertTrue(showTabTrayInvoked) + verifyOrder { + addNewTabUseCase.invoke(item.url!!, private = false) + addNewTabUseCase.invoke(item.url!!, private = false) + addNewTabUseCase.invoke(childItem.url!!, private = false) + homeActivity.browsingModeManager.mode = BrowsingMode.Normal + } + } + + @Test + fun `handleBookmarkFolderOpening for an empty folder should show toast`() { + var onOpenAllInTabsEmptyInvoked = false + createController( + onOpenAllInTabsEmpty = { + onOpenAllInTabsEmptyInvoked = true + }, + loadBookmarkNode = { + subfolder + }, + ).handleBookmarkFolderOpening(subfolder) + + assertTrue(onOpenAllInTabsEmptyInvoked) + } + @Test fun `handleBookmarkDeletion for an item should properly call a passed in delegate`() { var deleteBookmarkNodesInvoked = false @@ -428,6 +477,7 @@ class BookmarkControllerTest { private fun createController( loadBookmarkNode: suspend (String) -> BookmarkNode? = { _ -> null }, showSnackbar: (String) -> Unit = { _ -> }, + onOpenAllInTabsEmpty: () -> Unit = { }, deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit = { _, _ -> }, deleteBookmarkFolder: (Set) -> Unit = { _ -> }, showTabTray: () -> Unit = { }, @@ -442,6 +492,7 @@ class BookmarkControllerTest { tabsUseCases = tabsUseCases, loadBookmarkNode = loadBookmarkNode, showSnackbar = showSnackbar, + onOpenAllInTabsEmpty = onOpenAllInTabsEmpty, deleteBookmarkNodes = deleteBookmarkNodes, deleteBookmarkFolder = deleteBookmarkFolder, showTabTray = showTabTray, diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index 58a4c0b69..8b670bf22 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -170,6 +170,15 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.openInPrivateTab.testGetValue()!!.single().extra) } + @Test + fun `open all bookmarks item in new tabs`() { + interactor.onOpenAllInTabs(tree) + + verify { + bookmarkController.handleBookmarkFolderOpening(tree) + } + } + @Test fun `delete a bookmark item`() { interactor.onDelete(setOf(item)) diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index f251132bf..82a1ec5b0 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -6,15 +6,23 @@ package org.mozilla.fenix.library.bookmarks import android.content.Context import androidx.appcompat.view.ContextThemeWrapper +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import kotlinx.coroutines.runBlocking +import mozilla.components.concept.menu.candidate.TextMenuCandidate import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R +import org.mozilla.fenix.ext.bookmarkStorage import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu.Item @@ -33,6 +41,64 @@ class BookmarkItemMenuTest { } } + @Test + fun `delete item has special styling`() = runBlocking { + var deleteItem: TextMenuCandidate? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR, "").last() + } + assertNotNull(deleteItem) + assertEquals("Delete", deleteItem!!.text) + assertEquals( + TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), + deleteItem!!.textStyle, + ) + + deleteItem!!.onClick() + + assertEquals(Item.Delete, lastItemTapped) + } + + @Test + fun `edit item appears for folders`() = runBlocking { + // empty folder + var emptyFolderItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + emptyFolderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") + } + assertNotNull(emptyFolderItems) + assertEquals(2, emptyFolderItems!!.size) + + // not empty + var folderItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + coEvery { any().bookmarkStorage.getTree("")?.children } returns listOf(mockk(relaxed = true)) + + folderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") + } + assertNotNull(folderItems) + assertEquals(3, folderItems!!.size) + + val (edit, openAll, delete) = folderItems!! + + assertEquals("Edit", edit.text) + assertEquals("Open All Bookmarks", openAll.text) + assertEquals("Delete", delete.text) + + edit.onClick() + assertEquals(Item.Edit, lastItemTapped) + + openAll.onClick() + assertEquals(Item.OpenAllInTabs, lastItemTapped) + + delete.onClick() + assertEquals(Item.Delete, lastItemTapped) + } + @Test fun `delete item has special styling`() { val deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR).last() @@ -61,10 +127,16 @@ class BookmarkItemMenuTest { } @Test - fun `all item appears for sites`() { - val siteItems = menu.menuItems(BookmarkNodeType.ITEM) - assertEquals(6, siteItems.size) - val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems + fun `all item appears for sites`() = runBlocking { + var siteItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + siteItems = menu.menuItems(BookmarkNodeType.ITEM, "") + } + assertNotNull(siteItems) + assertEquals(6, siteItems!!.size) + val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems!! assertEquals("Edit", edit.text) assertEquals("Copy", copy.text) From f1bd7e192de782ad39d3e93b0b63bbf63d441b3b Mon Sep 17 00:00:00 2001 From: Pg Date: Thu, 7 Apr 2022 18:16:34 +0200 Subject: [PATCH 005/407] For #11404 - Create the open_all_in_new_tabs metric in Glean Expiration date is set to the same of others bookmark metrics. --- app/metrics.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index 5a8f6d539..df6fd1ae2 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2456,6 +2456,23 @@ bookmarks_management: metadata: tags: - Bookmarks + open_all_in_new_tabs: + type: event + description: | + A user opened a folder of bookmarks at once in new tabs. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/974 + - https://github.com/mozilla-mobile/fenix/issues/11404 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/21212 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: never + metadata: + tags: + - Bookmarks open_in_private_tab: type: event description: | From fe16a81c1df204f42dc0389fdaffd1f8ada49b73 Mon Sep 17 00:00:00 2001 From: Pg Date: Thu, 7 Apr 2022 18:29:14 +0200 Subject: [PATCH 006/407] For #11404 - Add 'Open all in private tabs' option as requested. https://github.com/mozilla-mobile/fenix/pull/21212#discussion_r739172674 - Add option is tree dot menu - Edit folder opening to be aware of browsing mode - Add metrics - Add unit tests for 'Open all in private tabs' - Add Android tests for open all in private. --- app/metrics.yaml | 17 +++++++ .../org/mozilla/fenix/ui/BookmarksTest.kt | 49 ++++++++++++++++++- .../ui/robots/ThreeDotMenuBookmarksRobot.kt | 11 ++++- .../library/bookmarks/BookmarkController.kt | 6 +-- .../bookmarks/BookmarkFragmentInteractor.kt | 7 ++- .../library/bookmarks/BookmarkItemMenu.kt | 11 +++++ .../fenix/library/bookmarks/BookmarkView.kt | 7 +++ .../viewholders/BookmarkNodeViewHolder.kt | 1 + app/src/main/res/values/strings.xml | 2 + .../bookmarks/BookmarkControllerTest.kt | 38 +++++++++++++- .../BookmarkFragmentInteractorTest.kt | 11 ++++- .../library/bookmarks/BookmarkItemMenuTest.kt | 37 +++----------- 12 files changed, 157 insertions(+), 40 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index df6fd1ae2..9fd124855 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2517,6 +2517,23 @@ bookmarks_management: metadata: tags: - Bookmarks + open_all_in_private_tabs: + type: event + description: | + A user opened a folder of bookmarks at once in new private tabs. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/974 + - https://github.com/mozilla-mobile/fenix/issues/11404 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/21212 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: never + metadata: + tags: + - Bookmarks edited: type: event description: | diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index eb643054c..fa3e2a82c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -301,9 +301,54 @@ class BookmarksTest { verifyExistingOpenTabs("Test_Page_1") verifyExistingOpenTabs("Test_Page_2") verifyExistingOpenTabs("Test_Page_3") + swipeTabRight("Test_Page_1") + swipeTabRight("Test_Page_2") + swipeTabRight("Test_Page_3") + // no more tabs should be presents and auto close tab tray + verifyTabTrayIsClosed() + } + } + + @Test + fun openAllInPrivateTabsTest() { + val nbPages = 4 + val webPages = List(nbPages) { + TestAssetHelper.getGenericAsset(mockWebServer, it + 1) + } + + homeScreen { + }.openThreeDotMenu { + }.openBookmarks { + createFolder("root") + createFolder("sub", "root") + createFolder("empty", "root") + }.closeMenu { + } + + browserScreen { + createBookmark(webPages[0].url, "root") + createBookmark(webPages[1].url, "root") + createBookmark(webPages[2].url, "sub") + // out of folder and should not be opened + createBookmark(webPages[3].url) + }.openTabDrawer { closeTab() - closeTab() - closeTab() + } + + browserScreen { + }.openThreeDotMenu { + }.openBookmarks { + }.openThreeDotMenu("root") { + }.clickOpenAllInPrivateTabs { + verifyTabTrayIsOpened() + verifyPrivateModeSelected() + + verifyExistingOpenTabs("Test_Page_1") + verifyExistingOpenTabs("Test_Page_2") + verifyExistingOpenTabs("Test_Page_3") + swipeTabRight("Test_Page_1") + swipeTabRight("Test_Page_2") + swipeTabRight("Test_Page_3") // no more tabs should be presents and auto close tab tray verifyTabTrayIsClosed() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt index 25f6ec375..035aa87ff 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt @@ -59,6 +59,13 @@ class ThreeDotMenuBookmarksRobot { return TabDrawerRobot.Transition() } + fun clickOpenAllInPrivateTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { + openAllInPrivateTabsButton().click() + + TabDrawerRobot().interact() + return TabDrawerRobot.Transition() + } + fun clickDelete(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { deleteButton().click() @@ -78,6 +85,8 @@ private fun openInNewTabButton() = onView(withText("Open in new tab")) private fun openInPrivateTabButton() = onView(withText("Open in private tab")) -private fun openAllInTabsButton() = onView(withText("Open All Bookmarks")) +private fun openAllInTabsButton() = onView(withText("Open all in new tabs")) + +private fun openAllInPrivateTabsButton() = onView(withText("Open all in private tabs")) private fun deleteButton() = onView(withText("Delete")) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index 69205b933..b46307e15 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -45,7 +45,7 @@ interface BookmarkController { fun handleCopyUrl(item: BookmarkNode) fun handleBookmarkSharing(item: BookmarkNode) fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) - fun handleBookmarkFolderOpening(folder: BookmarkNode) + fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) /** * Handle bookmark nodes deletion @@ -183,10 +183,10 @@ class DefaultBookmarkController( } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() } - override fun handleBookmarkFolderOpening(folder: BookmarkNode) { + override fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) { // potentially heavy function with a lot of bookmarks to open => use a coroutine scope.launch { - recursiveBookmarkFolderOpening(folder, true) + recursiveBookmarkFolderOpening(folder, true, mode) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index c4b6c86c0..bdac4350a 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -81,7 +81,12 @@ class BookmarkFragmentInteractor( override fun onOpenAllInTabs(folder: BookmarkNode) { require(folder.type == BookmarkNodeType.FOLDER) - bookmarksController.handleBookmarkFolderOpening(folder) + bookmarksController.handleBookmarkFolderOpening(folder, BrowsingMode.Normal) + } + + override fun onOpenAllInPrivateTabs(folder: BookmarkNode) { + require(folder.type == BookmarkNodeType.FOLDER) + bookmarksController.handleBookmarkFolderOpening(folder, BrowsingMode.Private) } override fun onDelete(nodes: Set) { diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index 2d678f7ec..249535312 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -27,6 +27,7 @@ class BookmarkItemMenu( OpenInNewTab, OpenInPrivateTab, OpenAllInTabs, + OpenAllInPrivateTabs, Delete, ; } @@ -110,6 +111,16 @@ class BookmarkItemMenu( } else { null }, + if (hasAtLeastOneChild) { + maybeCreateMenuItem( + itemType, + BookmarkNodeType.FOLDER, + context.getString(R.string.bookmark_menu_open_all_in_privates_button), + Item.OpenAllInPrivateTabs, + ) + } else { + null + }, TextMenuCandidate( text = context.getString(R.string.bookmark_menu_delete_button), textStyle = TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index 853a20009..c609cfdd7 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -86,6 +86,13 @@ interface BookmarkViewInteractor : SelectionInteractor { */ fun onOpenAllInTabs(folder: BookmarkNode) + /** + * Opens all bookmark items in new private tabs. + * + * @param folder the bookmark folder containing all items to open in new private tabs + */ + fun onOpenAllInPrivateTabs(folder: BookmarkNode) + /** * Deletes a set of bookmark nodes. * diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index 8131c92b6..153238c39 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -46,6 +46,7 @@ class BookmarkNodeViewHolder( BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item) BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item) BookmarkItemMenu.Item.OpenAllInTabs -> interactor.onOpenAllInTabs(item) + BookmarkItemMenu.Item.OpenAllInPrivateTabs -> interactor.onOpenAllInPrivateTabs(item) BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item)) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a08666701..229221db9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -864,6 +864,8 @@ Open in private tab Open all in new tabs + + Open all in private tabs Delete diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 4a8a7c052..535365735 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -381,7 +381,7 @@ class BookmarkControllerTest { } recurseFind(tree, it) }, - ).handleBookmarkFolderOpening(tree) + ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) assertTrue(showTabTrayInvoked) verifyOrder { @@ -392,6 +392,40 @@ class BookmarkControllerTest { } } + @Test + fun `handleBookmarkFolderOpening should open all bookmarks in private tabs`() { + var showTabTrayInvoked = false + createController( + showTabTray = { + showTabTrayInvoked = true + }, + loadBookmarkNode = { + fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { + if (item.guid == guid) { + return item + } else { + item.children?.iterator()?.forEach { + val res = recurseFind(it, guid) + if (res != null) { + return res + } + } + return null + } + } + recurseFind(tree, it) + }, + ).handleBookmarkFolderOpening(tree, BrowsingMode.Private) + + assertTrue(showTabTrayInvoked) + verifyOrder { + addNewTabUseCase.invoke(item.url!!, private = true) + addNewTabUseCase.invoke(item.url!!, private = true) + addNewTabUseCase.invoke(childItem.url!!, private = true) + homeActivity.browsingModeManager.mode = BrowsingMode.Private + } + } + @Test fun `handleBookmarkFolderOpening for an empty folder should show toast`() { var onOpenAllInTabsEmptyInvoked = false @@ -402,7 +436,7 @@ class BookmarkControllerTest { loadBookmarkNode = { subfolder }, - ).handleBookmarkFolderOpening(subfolder) + ).handleBookmarkFolderOpening(subfolder, BrowsingMode.Normal) assertTrue(onOpenAllInTabsEmptyInvoked) } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index 8b670bf22..c5556975f 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -175,7 +175,16 @@ class BookmarkFragmentInteractorTest { interactor.onOpenAllInTabs(tree) verify { - bookmarkController.handleBookmarkFolderOpening(tree) + bookmarkController.handleBookmarkFolderOpening(tree, BrowsingMode.Normal) + } + } + + @Test + fun `open all bookmarks item in new private tabs`() { + interactor.onOpenAllInPrivateTabs(tree) + + verify { + bookmarkController.handleBookmarkFolderOpening(tree, BrowsingMode.Private) } } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index 82a1ec5b0..a35601898 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -81,12 +81,13 @@ class BookmarkItemMenuTest { folderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") } assertNotNull(folderItems) - assertEquals(3, folderItems!!.size) + assertEquals(4, folderItems!!.size) - val (edit, openAll, delete) = folderItems!! + val (edit, openAll, openAllPrivate, delete) = folderItems!! assertEquals("Edit", edit.text) - assertEquals("Open All Bookmarks", openAll.text) + assertEquals("Open all in new tabs", openAll.text) + assertEquals("Open all in private tabs", openAllPrivate.text) assertEquals("Delete", delete.text) edit.onClick() @@ -95,37 +96,13 @@ class BookmarkItemMenuTest { openAll.onClick() assertEquals(Item.OpenAllInTabs, lastItemTapped) - delete.onClick() - assertEquals(Item.Delete, lastItemTapped) - } - - @Test - fun `delete item has special styling`() { - val deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR).last() - assertEquals("Delete", deleteItem.text) - assertEquals( - TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), - deleteItem.textStyle, - ) - - deleteItem.onClick() + openAllPrivate.onClick() + assertEquals(Item.OpenAllInPrivateTabs, lastItemTapped) + delete.onClick() assertEquals(Item.Delete, lastItemTapped) } - @Test - fun `edit item appears for folders`() { - val folderItems = menu.menuItems(BookmarkNodeType.FOLDER) - assertEquals(2, folderItems.size) - val (edit, delete) = folderItems - - assertEquals("Edit", edit.text) - edit.onClick() - - assertEquals(Item.Edit, lastItemTapped) - assertEquals("Delete", delete.text) - } - @Test fun `all item appears for sites`() = runBlocking { var siteItems: List? = null From c75e331a30d7c651090e648a7c69221d699af5ad Mon Sep 17 00:00:00 2001 From: Pg Date: Thu, 7 Apr 2022 18:39:07 +0200 Subject: [PATCH 007/407] For #11404 - Create alert message when a lot of tabs are to be opened. Current threshold is 15. --- .../library/bookmarks/BookmarkController.kt | 69 +++++++++++++------ .../library/bookmarks/BookmarkFragment.kt | 6 +- app/src/main/res/values/strings.xml | 9 +++ .../bookmarks/BookmarkControllerTest.kt | 42 ++++++----- detekt-baseline.xml | 3 +- 5 files changed, 88 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index b46307e15..7226d03ad 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.library.bookmarks import android.content.ClipData import android.content.ClipboardManager import android.content.res.Resources +import androidx.annotation.VisibleForTesting import androidx.navigation.NavController import androidx.navigation.NavDirections import kotlinx.coroutines.CoroutineScope @@ -75,9 +76,9 @@ class DefaultBookmarkController( private val store: BookmarkFragmentStore, private val sharedViewModel: BookmarksSharedViewModel, private val tabsUseCases: TabsUseCases?, - private val loadBookmarkNode: suspend (String) -> BookmarkNode?, + private val loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode?, private val showSnackbar: (String) -> Unit, - private val onOpenAllInTabsEmpty: () -> Unit, + private val alertHeavyOpen: (Int, () -> Unit) -> Unit, private val deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit, private val deleteBookmarkFolder: (Set) -> Unit, private val showTabTray: () -> Unit, @@ -86,6 +87,10 @@ class DefaultBookmarkController( private val resources: Resources = activity.resources + @Suppress("MagicNumber") + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val maxOpenBeforeWarn = 15 + override fun handleBookmarkChanged(item: BookmarkNode) { sharedViewModel.selectedFolder = item store.dispatch(BookmarkFragmentAction.Change(item)) @@ -108,7 +113,7 @@ class DefaultBookmarkController( override fun handleBookmarkExpand(folder: BookmarkNode) { handleAllBookmarksDeselected() scope.launch { - val node = loadBookmarkNode.invoke(folder.guid) ?: return@launch + val node = loadBookmarkNode.invoke(folder.guid, false) ?: return@launch sharedViewModel.selectedFolder = node store.dispatch(BookmarkFragmentAction.Change(node)) } @@ -161,32 +166,56 @@ class DefaultBookmarkController( showTabTray() } - private suspend fun recursiveBookmarkFolderOpening(folder: BookmarkNode, firstLaunch: Boolean = false) { - val node = loadBookmarkNode.invoke(folder.guid) ?: return - if (!node.children.isNullOrEmpty()) { - if (firstLaunch) invokePendingDeletion.invoke() + private fun extractURLsFromTree(node: BookmarkNode): MutableList { + val urls = mutableListOf() - node.children!!.iterator().forEach { - when (it.type) { - BookmarkNodeType.FOLDER -> recursiveBookmarkFolderOpening(it, mode = mode) - BookmarkNodeType.ITEM -> { - it.url?.let { url -> tabsUseCases?.addTab?.invoke(url, private = (mode == BrowsingMode.Private)) } + when (node.type) { + BookmarkNodeType.FOLDER -> { + // if not leaf (empty) folder + if (!node.children.isNullOrEmpty()) { + node.children!!.iterator().forEach { + urls.addAll(extractURLsFromTree(it)) } - BookmarkNodeType.SEPARATOR -> {} - } - }.also { - if (firstLaunch) { - activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private) - showTabTray() } } - } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() + BookmarkNodeType.ITEM -> { + node.url?.let { urls.add(it) } + } + BookmarkNodeType.SEPARATOR -> {} + } + + return urls } override fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) { // potentially heavy function with a lot of bookmarks to open => use a coroutine scope.launch { - recursiveBookmarkFolderOpening(folder, true, mode) + // if more than maxOpenBeforeWarn (15) elements + val tree = loadBookmarkNode.invoke(folder.guid, true) ?: return@launch + val urls = extractURLsFromTree(tree) + + val openAll = { load: Boolean -> + for (url in urls) { + tabsUseCases?.addTab?.invoke( + url, + private = (mode == BrowsingMode.Private), + startLoading = load, + ) + } + activity.browsingModeManager.mode = + BrowsingMode.fromBoolean(mode == BrowsingMode.Private) + showTabTray() + } + + // warn user if more than maxOpenBeforeWarn (15) + if (urls.size >= maxOpenBeforeWarn) { + alertHeavyOpen(urls.size) { + // do not load bookmarks when more than maxOpenBeforeWarn (15) + openAll(false) + } + } else { + openAll(true) + } } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 48a778f52..83799dbcd 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -101,7 +101,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan tabsUseCases = activity?.components?.useCases?.tabsUseCases, loadBookmarkNode = ::loadBookmarkNode, showSnackbar = ::showSnackBarWithText, - onOpenAllInTabsEmpty = ::onOpenAllInTabsEmpty, + alertHeavyOpen = ::alertHeavyOpen, deleteBookmarkNodes = ::deleteMulti, deleteBookmarkFolder = ::showRemoveFolderDialog, showTabTray = ::showTabTray, @@ -272,11 +272,11 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan return bookmarkView.onBackPressed() } - private suspend fun loadBookmarkNode(guid: String): BookmarkNode? = withContext(IO) { + private suspend fun loadBookmarkNode(guid: String, recursive: Boolean = false): BookmarkNode? = withContext(IO) { // Only runs if the fragment is attached same as [runIfFragmentIsAttached] context?.let { requireContext().bookmarkStorage - .getTree(guid, false) + .getTree(guid, recursive) ?.let { desktopFolders.withOptionalDesktopFolders(it) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 229221db9..f9bdfdede 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -624,6 +624,15 @@ Close + + Confirm open + + You are about to open %d tabs. This might slow down Firefox. Are you sure you want to continue ? + + Open tabs + + Cancel + %d site diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 535365735..195c7ec04 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -17,9 +17,11 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk +import io.mockk.mockkConstructor import io.mockk.runs import io.mockk.slot import io.mockk.spyk +import io.mockk.unmockkConstructor import io.mockk.verify import io.mockk.verifyOrder import mozilla.appservices.places.BookmarkRoot @@ -193,7 +195,7 @@ class BookmarkControllerTest { fun `handleBookmarkExpand should refresh and change the active bookmark node`() = runTestOnMain { var loadBookmarkNodeInvoked = false createController( - loadBookmarkNode = { + loadBookmarkNode = { _: String, _: Boolean -> loadBookmarkNodeInvoked = true tree }, @@ -365,7 +367,7 @@ class BookmarkControllerTest { showTabTray = { showTabTrayInvoked = true }, - loadBookmarkNode = { + loadBookmarkNode = { guid: String, _: Boolean -> fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { if (item.guid == guid) { return item @@ -379,7 +381,7 @@ class BookmarkControllerTest { return null } } - recurseFind(tree, it) + recurseFind(tree, guid) }, ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) @@ -399,7 +401,7 @@ class BookmarkControllerTest { showTabTray = { showTabTrayInvoked = true }, - loadBookmarkNode = { + loadBookmarkNode = { guid: String, _: Boolean -> fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { if (item.guid == guid) { return item @@ -413,7 +415,7 @@ class BookmarkControllerTest { return null } } - recurseFind(tree, it) + recurseFind(tree, guid) }, ).handleBookmarkFolderOpening(tree, BrowsingMode.Private) @@ -427,18 +429,24 @@ class BookmarkControllerTest { } @Test - fun `handleBookmarkFolderOpening for an empty folder should show toast`() { - var onOpenAllInTabsEmptyInvoked = false + fun `handleBookmarkFolderOpening for more than maxOpenBeforeWarn items should show alert`() { + var alertHeavyOpenInvoked = false + + mockkConstructor(DefaultBookmarkController::class) + every { + anyConstructed() getProperty "maxOpenBeforeWarn" + } propertyType Int::class returns 1 + createController( - onOpenAllInTabsEmpty = { - onOpenAllInTabsEmptyInvoked = true - }, - loadBookmarkNode = { - subfolder + alertHeavyOpen = { _: Int, _: () -> Unit -> alertHeavyOpenInvoked = true }, + loadBookmarkNode = { _: String, _: Boolean -> + tree }, - ).handleBookmarkFolderOpening(subfolder, BrowsingMode.Normal) + ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) + + unmockkConstructor(DefaultBookmarkController::class) - assertTrue(onOpenAllInTabsEmptyInvoked) + assertTrue(alertHeavyOpenInvoked) } @Test @@ -509,9 +517,9 @@ class BookmarkControllerTest { @Suppress("LongParameterList") private fun createController( - loadBookmarkNode: suspend (String) -> BookmarkNode? = { _ -> null }, + loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode? = { _, _ -> null }, showSnackbar: (String) -> Unit = { _ -> }, - onOpenAllInTabsEmpty: () -> Unit = { }, + alertHeavyOpen: (Int, () -> Unit) -> Unit = { _: Int, _: () -> Unit -> }, deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit = { _, _ -> }, deleteBookmarkFolder: (Set) -> Unit = { _ -> }, showTabTray: () -> Unit = { }, @@ -526,7 +534,7 @@ class BookmarkControllerTest { tabsUseCases = tabsUseCases, loadBookmarkNode = loadBookmarkNode, showSnackbar = showSnackbar, - onOpenAllInTabsEmpty = onOpenAllInTabsEmpty, + alertHeavyOpen = alertHeavyOpen, deleteBookmarkNodes = deleteBookmarkNodes, deleteBookmarkFolder = deleteBookmarkFolder, showTabTray = showTabTray, diff --git a/detekt-baseline.xml b/detekt-baseline.xml index 7117a6d97..f3ba36a31 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -547,11 +547,12 @@ UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleBookmarkTapped(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleCopyUrl(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) + UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleRequestSync() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSearch() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSelectionModeSwitch() UndocumentedPublicFunction:BookmarkFragmentStore.kt$operator fun BookmarkNode.contains(item: BookmarkNode): Boolean - UndocumentedPublicFunction:BookmarkItemMenu.kt$BookmarkItemMenu$fun updateMenu(itemType: BookmarkNodeType) + UndocumentedPublicFunction:BookmarkItemMenu.kt$BookmarkItemMenu$suspend fun updateMenu(itemType: BookmarkNodeType, itemId: String) UndocumentedPublicFunction:BookmarkNodeViewHolder.kt$BookmarkNodeViewHolder$fun bind( item: BookmarkNode, mode: BookmarkFragmentState.Mode, payload: BookmarkPayload, ) UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleEditingCancelled() UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleTextChanged(text: String) From b11fd9131dbb2d2319c83311f8379f7d45cdad62 Mon Sep 17 00:00:00 2001 From: Pg Date: Sun, 10 Jul 2022 11:35:13 +0300 Subject: [PATCH 008/407] For #11404 - Update open all tabs warning message Specify Firefox will only slow down while pages are loading. --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9bdfdede..a924de0ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -627,7 +627,7 @@ Confirm open - You are about to open %d tabs. This might slow down Firefox. Are you sure you want to continue ? + You are about to open %d tabs. This might slow down Firefox while the pages are loading. Are you sure you want to continue? Open tabs From 0d439f91e3f89372426d19298c24ff250b8a90d3 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Mon, 19 Sep 2022 11:30:53 +0300 Subject: [PATCH 009/407] For #11404 - Disable new open bookmarks tests pending compose refactoring --- app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index fa3e2a82c..7ad0040d8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -265,6 +265,7 @@ class BookmarksTest { } @Test + @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openAllInTabsTest() { val nbPages = 4 val webPages = List(nbPages) { @@ -310,6 +311,7 @@ class BookmarksTest { } @Test + @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openAllInPrivateTabsTest() { val nbPages = 4 val webPages = List(nbPages) { From 8dd71a0523d2f6c6037e2513fba71c4be34bdb39 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 19 Sep 2022 16:20:54 +0300 Subject: [PATCH 010/407] For #24978 re-enable UI tests with frequent ANR --- app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt | 2 -- .../java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt | 2 -- .../java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt | 1 - 3 files changed, 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index 5fde9f0ab..9732517fb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -12,7 +12,6 @@ import androidx.test.runner.permission.PermissionRequester import androidx.test.uiautomator.UiDevice import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.rules.TestRule @@ -86,7 +85,6 @@ class DownloadTest { } } - @Ignore("Failing with frequent ANR: https://github.com/mozilla-mobile/fenix/issues/25926") @Test fun testDownloadPrompt() { downloadFile = "web_icon.png" diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt index 1b8c9950c..33bdc168a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -93,7 +92,6 @@ class NoNetworkAccessStartupTests { }.refreshPage { } } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun testSignInPageWithNoNetworkConnection() { setNetworkEnabled(false) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt index bc22684f8..3120e3880 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt @@ -389,7 +389,6 @@ class SettingsPrivacyTest { } } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun launchLinksInPrivateToggleOffStateDoesntChangeTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) From c6af07dc8cf3cb2dd9581aba6f1de7926b129502 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Thu, 15 Sep 2022 09:51:43 -0700 Subject: [PATCH 011/407] Closes #26997: convert v1 wallpapers into collection group --- .../fenix/settings/wallpaper/Extensions.kt | 18 +++++++++++------ .../settings/wallpaper/WallpaperSettings.kt | 2 +- .../wallpaper/WallpaperSettingsFragment.kt | 7 ++++++- .../org/mozilla/fenix/wallpapers/Wallpaper.kt | 17 ++++++++++++++++ .../settings/wallpaper/ExtensionsTest.kt | 20 ++++++++++++++++++- 5 files changed, 55 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/Extensions.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/Extensions.kt index 32cbbbb3e..b4a22e6a3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/Extensions.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/Extensions.kt @@ -10,7 +10,7 @@ import org.mozilla.fenix.onboarding.WallpaperOnboardingDialogFragment.Companion. import org.mozilla.fenix.wallpapers.Wallpaper /** - * The extension function to group wallpapers according to their name. + * The extension function to group wallpapers into the appropriate collections for display. **/ fun List.groupByDisplayableCollection(): Map> = groupBy { @@ -21,14 +21,20 @@ fun List.groupByDisplayableCollection(): Map wallpaper.thumbnailFileState == Wallpaper.ImageFileState.Downloaded } - if (it.key.name == "classic-firefox") { + if (it.key.name == Wallpaper.classicFirefoxCollectionName) { it.key to listOf(Wallpaper.Default) + wallpapers } else { it.key to wallpapers } - }.toMap().takeIf { - it.isNotEmpty() - } ?: mapOf(Wallpaper.DefaultCollection to listOf(Wallpaper.Default)) + }.toMap().let { result -> + // Ensure the default is shown in the classic firefox collection even if those wallpapers are + // missing + if (result.keys.any { it.name == Wallpaper.classicFirefoxCollectionName }) { + result + } else { + result.plus(Wallpaper.ClassicFirefoxCollection to listOf(Wallpaper.Default)) + } + } /** * Returns a list of wallpapers to display in the wallpaper onboarding. @@ -46,7 +52,7 @@ fun List.getWallpapersForOnboarding(): List { for (wallpaper in this) { if (wallpaper == Wallpaper.Default) continue - if (wallpaper.collection.name == "classic-firefox") { + if (wallpaper.collection.name == Wallpaper.classicFirefoxCollectionName) { classicWallpapers.add(wallpaper) } else { seasonalWallpapers.add(wallpaper) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt index 6a5894da4..a30a77964 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt @@ -117,7 +117,7 @@ private fun WallpaperGroupHeading( // and descriptions so they could be localized. // In the future, we may want to either use the dynamic wallpaper properties with localized fallbacks // or invest in a method of localizing the remote strings themselves. - if (collection.name == "classic-firefox") { + if (collection.name == Wallpaper.classicFirefoxCollectionName) { Text( text = stringResource(R.string.wallpaper_classic_title, stringResource(R.string.firefox)), color = FirefoxTheme.colors.textSecondary, diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt index b7fe4ecb4..5fc3b556e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt @@ -18,6 +18,7 @@ import kotlinx.coroutines.launch import mozilla.components.lib.state.ext.observeAsComposableState import mozilla.components.service.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Wallpapers import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -56,7 +57,11 @@ class WallpaperSettingsFragment : Fragment() { val coroutineScope = rememberCoroutineScope() WallpaperSettings( - wallpaperGroups = wallpapers.groupByDisplayableCollection(), + wallpaperGroups = if (FeatureFlags.wallpaperV2Enabled) { + wallpapers.groupByDisplayableCollection() + } else { + mapOf(Wallpaper.ClassicFirefoxCollection to wallpapers) + }, defaultWallpaper = Wallpaper.Default, selectedWallpaper = currentWallpaper, loadWallpaperResource = { diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt index 89207c4a6..4c12c9a38 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt @@ -54,6 +54,23 @@ data class Wallpaper( const val beachVibeName = "beach-vibe" const val firefoxCollectionName = "firefox" const val defaultName = "default" + + /* + Note: this collection could get out of sync with the version of it generated when fetching + remote metadata. It is included mostly for convenience, but use with utmost care until + we find a better way of handling the edge cases around this collection. It is generally + safer to do comparison directly with the collection name. + */ + const val classicFirefoxCollectionName = "classic-firefox" + val ClassicFirefoxCollection = Collection( + name = classicFirefoxCollectionName, + heading = null, + description = null, + learnMoreUrl = null, + availableLocales = null, + startDate = null, + endDate = null, + ) val DefaultCollection = Collection( name = defaultName, heading = null, diff --git a/app/src/test/java/org/mozilla/fenix/settings/wallpaper/ExtensionsTest.kt b/app/src/test/java/org/mozilla/fenix/settings/wallpaper/ExtensionsTest.kt index 58568aa34..3738e44fb 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/wallpaper/ExtensionsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/wallpaper/ExtensionsTest.kt @@ -31,7 +31,7 @@ class ExtensionsTest { val result = listOf(Wallpaper.Default).groupByDisplayableCollection() assertEquals(1, result.size) - assertEquals(listOf(Wallpaper.Default), result[Wallpaper.DefaultCollection]) + assertEquals(listOf(Wallpaper.Default), result[Wallpaper.ClassicFirefoxCollection]) } @Test @@ -55,6 +55,24 @@ class ExtensionsTest { assertEquals(downloadedSeasonalWallpapers, result[seasonalCollection]) } + @Test + fun `GIVEN that classic firefox thumbnails fail to download WHEN grouped by collection THEN default is still available`() { + val seasonalCollection = getSeasonalCollection("finally fall") + val downloadedSeasonalWallpapers = (0..5).map { + generateSeasonalWallpaperCollection( + "${seasonalCollection.name}$it", + seasonalCollection.name, + ) + } + val allWallpapers = listOf(Wallpaper.Default) + downloadedSeasonalWallpapers + + val result = allWallpapers.groupByDisplayableCollection() + + assertEquals(2, result.size) + assertEquals(listOf(Wallpaper.Default), result[classicCollection]) + assertEquals(downloadedSeasonalWallpapers, result[seasonalCollection]) + } + @Test fun `GIVEN two collections of appropriate size WHEN fetched for onboarding THEN result contains 3 seasonal and 2 classic`() { val seasonalCollection = getSeasonalCollection("finally fall") From c77ee6f37106f00465fd31c0e93a38f0a3274737 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Mon, 19 Sep 2022 10:19:21 -0700 Subject: [PATCH 012/407] For #27064 - Remove all unused strings marked moz:removedIn <= 104 --- app/src/main/res/values/strings.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a924de0ce..889862cc2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -375,8 +375,6 @@ Customize - Sync bookmarks, history, and more with your Firefox Account - Sign in to sync tabs, bookmarks, passwords, and more. Firefox Account @@ -563,8 +561,6 @@ Allows Mozilla to install and run studies - - Turn on Sync Sync and save your data @@ -784,8 +780,6 @@ Delete from history %1$s (Private Mode) - - Other tabs @@ -1184,8 +1178,6 @@ Quit - - This will delete all of your browsing data. Time range to delete From 997a4af839923f5a892d8d185d57cee132e6be5e Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Mon, 22 Aug 2022 11:22:16 -0400 Subject: [PATCH 013/407] For #26582 - Renew telemetry expiring in 107 --- app/metrics.yaml | 146 +++++++++--------- .../fenix/browser/BaseBrowserFragment.kt | 5 - .../fenix/downloads/DynamicDownloadDialog.kt | 5 - 3 files changed, 70 insertions(+), 86 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index 9fd124855..fc7037ed3 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -1867,11 +1867,12 @@ customize_home: - https://github.com/mozilla-mobile/fenix/issues/22145 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22333 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 preferences: studies_enabled: @@ -1885,11 +1886,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/22192 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22193 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 studies_preference_enabled: type: event description: > @@ -1898,11 +1900,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/22192 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22193 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_suggestions_enabled: type: boolean description: | @@ -2307,11 +2310,12 @@ preferences: - https://github.com/mozilla-mobile/fenix/issues/21903 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21908 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search.default_engine: code: @@ -3350,11 +3354,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/22172 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22173 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_term_group_tapped: type: event description: | @@ -3363,11 +3368,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/22299 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22300 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_term_group_open_tab: type: event description: | @@ -3376,11 +3382,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/22147 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22368#issuecomment-964223263 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_term_group_remove_tab: type: event description: | @@ -3389,11 +3396,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/22147 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22368#issuecomment-964223263 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_term_group_remove_all: type: event description: | @@ -3402,11 +3410,12 @@ history: - https://github.com/mozilla-mobile/fenix/issues/22147 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22368#issuecomment-964223263 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_icon_tapped: type: event description: | @@ -4016,11 +4025,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/21903 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21908 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 close_all_inactive_tabs: type: event description: | @@ -4029,11 +4039,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/21903 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21908 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 auto_close_seen: type: event description: | @@ -4042,11 +4053,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22170 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22171 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 auto_close_turn_on_clicked: type: event description: | @@ -4055,11 +4067,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22170 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22171 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 auto_close_dimissed: type: event description: | @@ -4068,11 +4081,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22170 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22171 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 close_inactive_tab: type: counter description: | @@ -4081,11 +4095,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/21903 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21908 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 open_inactive_tab: type: counter description: | @@ -4094,11 +4109,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/21903 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21908 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 inactive_tabs_cfr_settings: type: event description: | @@ -4107,11 +4123,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22298 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22301 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 inactive_tabs_cfr_dismissed: type: event description: | @@ -4120,11 +4137,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22298 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22301 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 inactive_tabs_cfr_visible: type: event description: | @@ -4133,11 +4151,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/22298 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22301 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 enter_multiselect_mode: type: event description: | @@ -4146,11 +4165,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/23399 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/23964#issuecomment-1051128057 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 metadata: tags: - Tabs @@ -4166,11 +4186,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/23399 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/23964#issuecomment-1051128057 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 metadata: tags: - Tabs @@ -4186,11 +4207,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/23399 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/23964#issuecomment-1051128057 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 metadata: tags: - Tabs @@ -4206,11 +4228,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/23399 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/23964#issuecomment-1051128057 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 metadata: tags: - Tabs @@ -4226,11 +4249,12 @@ tabs_tray: - https://github.com/mozilla-mobile/fenix/issues/23399 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/23964#issuecomment-1051128057 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 metadata: tags: - Tabs @@ -6429,12 +6453,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 bookmark_suggestions: send_in_pings: - metrics @@ -6448,12 +6473,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 search_engine_suggestions: send_in_pings: - metrics @@ -6467,12 +6493,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 session_suggestions: send_in_pings: - metrics @@ -6486,12 +6513,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 synced_tabs_suggestions: send_in_pings: - metrics @@ -6505,12 +6533,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 clipboard_suggestions: send_in_pings: - metrics @@ -6524,12 +6553,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 shortcuts_suggestions: send_in_pings: - metrics @@ -6543,12 +6573,13 @@ perf.awesomebar: - https://github.com/mozilla-mobile/fenix/pull/10276#pullrequestreview-411101979 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21315#issuecomment-920848442 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - technical - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 autoplay: visited_setting: @@ -7368,11 +7399,12 @@ home_screen: - https://github.com/mozilla-mobile/fenix/issues/22146 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22377 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 customize_home_clicked: type: event description: A user clicked on Customize home from the home screen menu. @@ -7381,7 +7413,6 @@ home_screen: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/21344 - https://github.com/mozilla-mobile/fenix/pull/21344#issuecomment-923198787 - - https://github.com/mozilla-mobile/fenix/pull/26123#issuecomment-1190794469 data_sensitivity: - interaction notification_emails: @@ -7485,11 +7516,12 @@ recent_tabs: - https://github.com/mozilla-mobile/fenix/issues/22107 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22166 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 jump_back_in_cfr_shown: type: event description: | @@ -7539,11 +7571,12 @@ recent_bookmarks: - https://github.com/mozilla-mobile/fenix/issues/22103 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22104 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 bookmark_clicked: type: counter lifetime: application @@ -7591,11 +7624,12 @@ recent_bookmarks: - https://github.com/mozilla-mobile/fenix/issues/22075 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22293 + - https://github.com/mozilla-mobile/fenix/pull/27068#issuecomment-1251509973 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 107 + expires: 120 unit: integer recent_searches: @@ -8260,46 +8294,6 @@ recently_visited_homepage: data_sensitivity: - interaction expires: 114 -downloads: - pdf_download_count: - type: counter - lifetime: application - description: | - A counter that indicates how many times a pdf has been downloaded. - send_in_pings: - - metrics - bugs: - - https://github.com/mozilla-mobile/fenix/issues/24075 - data_reviews: - - https://github.com/mozilla-mobile/fenix/pull/24061 - data_sensitivity: - - interaction - notification_emails: - - android-probes@mozilla.com - expires: 107 - metadata: - tags: - - Download - downloaded_pdf_open_count: - type: counter - lifetime: application - description: | - A counter that indicates how many times open button has been clicked - for a downloaded pdf. - send_in_pings: - - metrics - bugs: - - https://github.com/mozilla-mobile/fenix/issues/24075 - data_reviews: - - https://github.com/mozilla-mobile/fenix/pull/- - data_sensitivity: - - interaction - notification_emails: - - android-probes@mozilla.com - expires: 107 - metadata: - tags: - - Download recent_synced_tabs: recent_synced_tab_shown: diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 3c4a45c8d..afe8376d6 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -135,7 +135,6 @@ import mozilla.components.service.sync.autofill.DefaultCreditCardValidationDeleg import mozilla.components.support.base.feature.ActivityResultHandler import mozilla.components.support.ktx.android.view.enterToImmersiveMode import mozilla.components.support.ktx.kotlin.getOrigin -import org.mozilla.fenix.GleanMetrics.Downloads import org.mozilla.fenix.GleanMetrics.MediaState import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor import org.mozilla.fenix.components.toolbar.interactor.DefaultBrowserToolbarInteractor @@ -529,10 +528,6 @@ abstract class BaseBrowserFragment : dynamicDownloadDialog.show() browserToolbarView.expand() - - if (downloadState.contentType == "application/pdf") { - Downloads.pdfDownloadCount.add() - } } } diff --git a/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt b/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt index d0f0ed66c..84ff159dd 100644 --- a/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt +++ b/app/src/main/java/org/mozilla/fenix/downloads/DynamicDownloadDialog.kt @@ -12,7 +12,6 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.feature.downloads.AbstractFetchDownloadService import mozilla.components.feature.downloads.toMegabyteOrKilobyteString -import org.mozilla.fenix.GleanMetrics.Downloads import org.mozilla.fenix.R import org.mozilla.fenix.databinding.DownloadDialogLayoutBinding import org.mozilla.fenix.ext.settings @@ -99,10 +98,6 @@ class DynamicDownloadDialog( download = downloadState, ) - if (downloadState.contentType == "application/pdf") { - Downloads.downloadedPdfOpenCount.add() - } - if (!fileWasOpened) { onCannotOpenFile(downloadState) } From 7c1555e4e7cc30a7d956e431165e3ff43cae847a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 19 Sep 2022 19:21:20 +0000 Subject: [PATCH 014/407] Update to Android-Components 107.0.20220919190141. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index abd969668..e58d2cf87 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "106.0.20220918143158" + const val VERSION = "107.0.20220919190141" } From 6f24fadebba370aa852f99b9b07be5c705765ad2 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Tue, 13 Sep 2022 11:54:11 -0700 Subject: [PATCH 015/407] Closes #26966: enable wallpapers V2 --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index e40c8364d..c443d0107 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -117,5 +117,5 @@ object FeatureFlags { /** * Enables the wallpaper v2 enhancements. */ - val wallpaperV2Enabled = Config.channel.isDebug + const val wallpaperV2Enabled = true } From 8fa1924e83567bbdde707cc1daf002e9e762c970 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Tue, 20 Sep 2022 02:36:26 +0200 Subject: [PATCH 016/407] Import l10n. (#27069) --- app/src/main/res/values-be/strings.xml | 67 ++++++++++-- app/src/main/res/values-de/strings.xml | 71 +++++++++++-- app/src/main/res/values-dsb/strings.xml | 65 ++++++++++-- app/src/main/res/values-el/strings.xml | 28 +++-- app/src/main/res/values-hsb/strings.xml | 65 ++++++++++-- app/src/main/res/values-ia/strings.xml | 65 ++++++++++-- app/src/main/res/values-iw/strings.xml | 57 +++++++++-- app/src/main/res/values-ko/strings.xml | 71 +++++++++++-- app/src/main/res/values-lo/strings.xml | 75 +++++++++++++- app/src/main/res/values-pt-rBR/strings.xml | 71 +++++++++++-- app/src/main/res/values-sk/strings.xml | 71 +++++++++++-- app/src/main/res/values-szl/strings.xml | 113 +++++++-------------- app/src/main/res/values-uz/strings.xml | 7 ++ 13 files changed, 640 insertions(+), 186 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 784dfebed..911980de2 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -280,11 +280,15 @@ Сустракайце сваю персаналізаваную хатнюю старонку. Тут будуць паказаны апошнія карткі, закладкі і вынікі пошуку. - Сардэчна запрашаем у незалежны Інтэрнэт + Сардэчна запрашаем у незалежны Інтэрнэт + + Сардэчна запрашаем у больш асабісты Інтэрнэт Больш колераў. Лепшая прыватнасць. Тая ж адданасць людзям, а не прыбытку. - Пераходзьце з тэлефона на ноўтбук і назад + Пераходзьце з тэлефона на ноўтбук і назад + + Пераключаць экраны цяпер прасцей, чым калі-небудзь Працягвайце з таго месца, дзе спыніліся, з дапамогай картак з іншых прылад, якія зараз знаходзяцца на вашай хатняй старонцы. @@ -472,6 +476,14 @@ Прагляд + + Не ўдалося сцягнуць шпалеры + + Паспрабаваць зноў + + Не ўдалося змяніць шпалеры + + Падрабязней Змяняць шпалеры дотыкам да лагатыпа хатняй старонкі Firefox @@ -479,6 +491,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Лагатып Firefox — змяніць шпалеры, кнопка + + Класічны %s + + Абмежаванае выданне + + Новая калекцыя «Незалежныя галасы». %s + + Новая калекцыя «Незалежныя галасы». + + Паспрабуйце ўсплёск колеру + + Выберыце шпалеры, якія вам пасуюць. + + Прагледзець больш шпалер + Дадатак не падтрымліваецца @@ -1235,19 +1262,31 @@ - Вітаем у %s! + Вітаем у %s! + + Сардэчна запрашаем у лепшы Інтэрнэт + + Браўзер, створаны для людзей, а не для прыбытку. - Сінхранізуйце Firefox паміж прыладамі + Сінхранізуйце Firefox паміж прыладамі + + Працягвайце з таго месца, дзе спыніліся - Перанясіце закладкі, гісторыю і паролі ў %1$s на гэтай прыладзе. + Перанясіце закладкі, гісторыю і паролі ў %1$s на гэтай прыладзе. + + Сінхранізуйце карткі і паролі на ўсіх прыладах для лёгкага пераключэння экрана. - Зарэгістравацца + Зарэгістравацца + + Увайсці Сінхранізацыя ўключана - Прыватнасць заўжды ўключана + Прыватнасць заўжды ўключана + + Прадвызначаная ахова прыватнасці - %1$s аўтаматычна спыняе таемнае сачэнне кампаній за вамі ў Інтэрнэце. + %1$s аўтаматычна спыняе таемнае сачэнне кампаній за вамі ў Інтэрнэце. Стандартная (прадвызначана) @@ -1259,15 +1298,21 @@ Выберыце размяшчэнне панэлі інструментаў - Майце панэль інструментаў пад рукой. Пакіньце яе ўнізе або перамясціце ўверх. + Майце панэль інструментаў пад рукой. Пакіньце яе ўнізе або перамясціце ўверх. - Ваша прыватнасць + Ваша прыватнасць + + Вы распараджаецеся сваімі звесткамі - Мы распрацавалі %s, каб даць вам кантроль над тым, чым дзяліцца ў Інтэрнэце, і тым, чым вы падзеліцеся з намі. + Мы распрацавалі %s, каб даць вам кантроль над тым, чым дзяліцца ў Інтэрнэце, і тым, чым вы падзеліцеся з намі. + + Firefox дае вам кантроль над тым, чым вы дзеліцеся ў Інтэрнэце і чым вы дзеліцеся з намі. Паведамленне аб прыватнасці + + Гатовы адкрыць дзіўны Інтэрнэт? Пачаць агляданне diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 41d514790..3b00e5fd8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -288,11 +288,15 @@ Lernen Sie Ihre personalisierte Startseite kennen. Hier werden zuletzt verwendete Tabs, Lesezeichen und Suchergebnisse angezeigt. - Willkommen in einem unabhängigen Internet + Willkommen in einem unabhängigen Internet + + Willkommen in einem persönlicheren Internet Mehr Farben. Bessere Privatsphäre. Gleiches Engagement für Menschen über Gewinne. - Wechseln Sie vom Handy zum Laptop und zurück + Wechseln Sie vom Handy zum Laptop und zurück + + Das Wechseln zwischen Bildschirmen ist einfacher als je zuvor Machen Sie da weiter, wo Sie aufgehört haben – ab sofort finden Sie Tabs von anderen Geräten auf Ihrer Startseite. @@ -480,6 +484,14 @@ Hintergrundbild aktualisiert! Ansehen + + Hintergrundbild konnte nicht heruntergeladen werden + + Erneut versuchen + + Hintergrundbild konnte nicht geändert werden + + Weitere Informationen Hintergrundbild durch Tippen auf das Logo der Firefox-Startseite ändern @@ -487,6 +499,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-Logo – Hintergrundbild ändern, Schaltfläche + + %s klassisch + + Limitierte Auflage + + Die neue Sammlung „Unabhängige Stimmen“. %s + + Die neue Sammlung „Unabhängige Stimmen“. + + Wie wäre es mit einem Farbtupfer? + + Wählen Sie ein Hintergrundbild, das Sie anspricht. + + Entdecken Sie weitere Hintergrundbilder + Add-on wird nicht unterstützt @@ -1261,19 +1288,33 @@ - Willkommen bei %s! + Willkommen bei %s! + + Willkommen in einem besseren Internet + + Ein Browser für Menschen, nicht für Profit. - Synchronisieren Sie Firefox zwischen Geräten + Synchronisieren Sie Firefox zwischen Geräten + + Machen Sie da weiter, wo Sie aufgehört haben - Übertragen Sie Lesezeichen, Chronik und Passwörter zu %1$s auf diesem Gerät. + Übertragen Sie Lesezeichen, Chronik und Passwörter zu %1$s auf diesem Gerät. + + Synchronisieren Sie Tabs und Passwörter geräteübergreifend für einen nahtlosen Bildschirmwechsel. - Registrieren + Registrieren + + Anmelden Sync ist aktiviert - Privatsphäre ab Werk + Privatsphäre ab Werk + + Privatsphäre-Schutz als Standard - %1$s verhindert automatisch, dass Unternehmen heimlich Ihre Aktivitäten im Internet verfolgen. + %1$s verhindert automatisch, dass Unternehmen heimlich Ihre Aktivitäten im Internet verfolgen. + + Mit vollständigem Cookie-Schutz, um Tracker daran zu hindern, Cookies zu verwenden, um Sie über Websites hinweg zu verfolgen. Standard @@ -1285,15 +1326,23 @@ Wählen Sie die Position für Ihre Symbolleiste - Platzieren Sie die Symbolleiste in Reichweite. Behalten Sie sie unten oder verschieben Sie sie nach oben. + Platzieren Sie die Symbolleiste in Reichweite. Behalten Sie sie unten oder verschieben Sie sie nach oben. + + Unten lassen oder nach oben verschieben. - Ihre Privatsphäre + Ihre Privatsphäre + + Sie kontrollieren Ihre Daten - Wir haben %s so konzipiert, dass Sie die Kontrolle darüber haben, was Sie im Internet und was Sie mit uns teilen. + Wir haben %s so konzipiert, dass Sie die Kontrolle darüber haben, was Sie im Internet und was Sie mit uns teilen. + + Firefox gibt Ihnen die Kontrolle darüber, was Sie im Internet preisgeben und was Sie mit uns teilen. Lesen Sie unseren Datenschutzhinweis + + Bereit, ein erstaunliches Internet zu entdecken? Lossurfen diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 9a55601e8..018955e73 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -282,11 +282,15 @@ Póznajśo swój personalizěrowany bok. Nejnowše rejtariki, cytańske znamjenja a pytańske wuslědki se how zjawiju. - Witajśo k njewótwisnemu internetoju + Witajśo k njewótwisnemu internetoju + + Witajśo k wěcej wósobinskemu internetoju Wěcej barwow. Lěpša priwatnosć. Samska angažěrowanosć za luźi njeźiwajucy na wudobytki. - Skócćo wó telefona do laptopa a slědk + Skócćo wó telefona do laptopa a slědk + + Pśešaltowanje mjazy wobrazowkami jo lažke ako do togo Pókšacujśo, źož sćo pśestał – něnto z rejtarikami drugich rědow na swójom startowem boku. @@ -473,6 +477,14 @@ Pokazaś + + Slězynowy wobraz njedajo se ześěgnuś + + Hyšći raz wopytaś + + Slězynowy wobraz njedajo se změniś + + Dalšne informacije Pótusniśo logo startowego boka Firefox, aby slězynowy wobraz změnił @@ -480,6 +492,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - slězynowy wobraz změniś, tłocašk + + Klasiski %s + + Limitěrowana edicija + + Nowa zběrka „Njewótwisne głose“. %s + + Nowa zběrka „Njewótwisne głose“. + + Wopytajśo chrapku barwy + + Wubjeŕśo slězynowy wobraz, kótaryž se wam spódoba. + + Wuslěźćo dalšne slězynowe wobraze + Dodank se njepódpěra @@ -1222,20 +1249,30 @@ - Witajśo k %s! + Witajśo k %s! + + Witajśo k lěpšemu internetoju + + Wobglědowak za luźi, nic za wudobytk. - Firefox mjazy rědami synchronizěrowaś + Firefox mjazy rědami synchronizěrowaś + + Cyńśo tam dalej, źož sćo pśestał - Pśinjasćo cytańske znamjenja, historiju a gronidła k %1$s na toś tom rěźe. + Pśinjasćo cytańske znamjenja, historiju a gronidła k %1$s na toś tom rěźe. - Registrěrowaś + Registrěrowaś + + Pśizjawiś Synchronizacija jo zmóžnjona - Priwatnosć pśecej aktiwna + Priwatnosć pśecej aktiwna + + Šćit priwatnosći pó standarźe - %1$s awtomatiski pśedewześam zawoborujo, wam kšajźu pó webje slědowaś. + %1$s awtomatiski pśedewześam zawoborujo, wam kšajźu pó webje slědowaś. Standard @@ -1247,16 +1284,22 @@ Wubjeŕśo poziciju za swóju symbolowu rědku - Pozicioněrujśo symbolowu rědku w swójej bliskosći. Wobchowajśo ju dołojce abo pśesuńśo ju górjej. + Pozicioněrujśo symbolowu rědku w swójej bliskosći. Wobchowajśo ju dołojce abo pśesuńśo ju górjej. - Waša priwatnosć + Waša priwatnosć + + Kontrolěrujośo swóje daty - Smy %s wuwili, aby wam kontrolu wó tom dali, co online źěliśo a co z nami. + Smy %s wuwili, aby wam kontrolu wó tom dali, co online źěliśo a co z nami. + + Firefox wam kontrolu wó tom dajo, co online źěliśo a co z nami. Cytajśo našu powěźeńku priwatnosći + + Sćo gótowy późiwabny internet namakaś? Pśeglědowanje zachopiś diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index be2220941..8a4d1853f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -289,11 +289,15 @@ Γνωρίστε την εξατομικευμένη αρχική σας σελίδα. Οι πρόσφατες καρτέλες, οι σελιδοδείκτες και τα αποτελέσματα αναζήτησης θα εμφανίζονται εδώ. - Καλώς ορίσατε σε ένα ανεξάρτητο διαδίκτυο + Καλώς ορίσατε σε ένα ανεξάρτητο διαδίκτυο + + Καλώς ορίσατε σε ένα πιο προσωπικό διαδίκτυο Περισσότερα χρώματα. Ενισχυμένο απόρρητο. Η ίδια δέσμευση να βάζουμε τον άνθρωπο πάνω από το κέρδος. - Εναλλαγή από τηλέφωνο σε υπολογιστή και αντίστροφα + Εναλλαγή από τηλέφωνο σε υπολογιστή και αντίστροφα + + Η εναλλαγή οθονών είναι πιο εύκολη από ποτέ Συνεχίστε από εκεί που σταματήσατε, με καρτέλες από άλλες συσκευές στην αρχική σας σελίδα. @@ -1237,20 +1241,22 @@ - Καλώς ορίσατε στο %s! + Καλώς ορίσατε στο %s! - Συγχρονισμός Firefox μεταξύ συσκευών + Συγχρονισμός Firefox μεταξύ συσκευών - Φέρτε σελιδοδείκτες, ιστορικό και κωδικούς πρόσβασης στο %1$s σε αυτήν τη συσκευή. + Φέρτε σελιδοδείκτες, ιστορικό και κωδικούς πρόσβασης στο %1$s σε αυτήν τη συσκευή. - Εγγραφή + Εγγραφή + + Σύνδεση Το Sync είναι ενεργό - Μόνιμη προστασία απορρήτου + Μόνιμη προστασία απορρήτου - Το %1$s εμποδίζει την καταγραφή της διαδικτυακής δραστηριότητάς σας από εταιρείες. + Το %1$s εμποδίζει την καταγραφή της διαδικτυακής δραστηριότητάς σας από εταιρείες. Τυπική (προεπιλογή) @@ -1262,12 +1268,12 @@ Επιλογή τοποθεσίας γραμμής εργαλείων - Τοποθετήστε τη γραμμή εργαλείων σε κοντινή απόσταση. Κρατήστε την στο κάτω μέρος ή μετακινήστε την στο πάνω μέρος. + Τοποθετήστε τη γραμμή εργαλείων σε κοντινή απόσταση. Κρατήστε την στο κάτω μέρος ή μετακινήστε την στο πάνω μέρος. - Το απόρρητό σας + Το απόρρητό σας - Έχουμε σχεδιάσει το %s έτσι, ώστε να ελέγχετε τι κοινοποιείτε στο διαδίκτυο και σε εμάς. + Έχουμε σχεδιάσει το %s έτσι, ώστε να ελέγχετε τι κοινοποιείτε στο διαδίκτυο και σε εμάς. Διαβάστε τη σημείωση απορρήτου μας diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index 66a8924b2..877395be9 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -282,11 +282,15 @@ Zeznajće so ze swojej personalizowanej startowej stronu. Najnowše rajtarki, zapołožki a pytanske wuslědki so tu zjewja. - Witajće k njewotwisnemu internetej + Witajće k njewotwisnemu internetej + + Witajće k bóle wosobinskemu internetej Wjace barbow. Lěpša priwatnosć. Samsna angažěrowanosć za ludźi njedźiwajo na dobytki. - Skočće wot smóratka do laptopa a wróćo + Skočće wot smóratka do laptopa a wróćo + + Přešaltowanje mjez wobrazowkami je lóše hdy do toho Pokročujće, hdźež sće přestał – nětko z rajtarkami druhich gratow na swojej startowej stronje. @@ -473,6 +477,14 @@ Pokazać + + Pozadkowy wobraz njeda so sćahnyć + + Hišće raz spytać + + Pozadkowy wobraz njeda so změnić + + Dalše informacije Podótkńće so loga startoweje strony Firefox, zo byšće pozadkowy wobraz změnił @@ -480,6 +492,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - pozadkowy wobraz změnić, tłóčatko + + Klasiski %s + + Limitowana edicija + + Nowa zběrka „Njewotwisne hłosy“. %s + + Nowa zběrka „Njewotwisne hłosy“. + + Wupruwujće barbowy woplusk + + Wubjerće pozadkowy wobraz, kotryž so wam spodoba. + + Wuslědźće dalše pozadkowe wobrazy + Přidatk so njepodpěruje @@ -1229,20 +1256,30 @@ - Witajće k %s! + Witajće k %s! + + Witajće k lěpšemu internetej + + Wobhladowak za ludźi, nic za dobytk. - Firefox mjez gratami synchronizować + Firefox mjez gratami synchronizować + + Čińće tam dale, hdźež sće přestał - Přinjesće zapołožki, historiju a hesła k %1$s na tutym graće. + Přinjesće zapołožki, historiju a hesła k %1$s na tutym graće. - Registrować + Registrować + + Přizjewić Synchronizacija je zmóžnjena - Priwatnosć přeco aktiwna + Priwatnosć přeco aktiwna + + Škit priwatnosće po standardźe - %1$s awtomatisce zadźěwa tomu, zo předewzaća wam skradźu po webje slěduja. + %1$s awtomatisce zadźěwa tomu, zo předewzaća wam skradźu po webje slěduja. Standard @@ -1254,15 +1291,21 @@ Wubjerće poziciju za swoju symbolowu lajstu - Pozicioněrujće symbolowu lajstu, zo móžeće ju lochko dosahnyć. Wobchowajće ju deleka abo přesuńće ju horje. + Pozicioněrujće symbolowu lajstu, zo móžeće ju lochko dosahnyć. Wobchowajće ju deleka abo přesuńće ju horje. - Waša priwatnosć + Waša priwatnosć + + Kontrolujeće swoje daty - Sym %s wuwili, zo bychmy wam kontrolu wo tym dali, što online dźěliće a što z nami. + Sym %s wuwili, zo bychmy wam kontrolu wo tym dali, što online dźěliće a što z nami. + + Firefox wam kontrolu wo tym da, što online dźěliće a što z nami. Čitajće naš zdźělenku priwatnosće + + Sće hotowy wobdźiwajomny internet wotkryć? Přehladowanje započeć diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index b03e675e2..37cac051c 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -285,11 +285,15 @@ Incontra tu pagina principal personalisate. Le schedas recente, le marcapaginas e le resultatos del recerca apparera ci. - Benvenite in un internet independente + Benvenite in un internet independente + + Benvenite in un internet plus personal Plus de colores. Melior confidentialitate. Mesme dedication al personas super le profitos. - Passa ab le telephono al portabile e retro + Passa ab le telephono al portabile e retro + + Cambiar le paginas es plus facile que mais Reprende de ubi tu exiva con le schedas de altere apparatos ora sur tu pagina principal. @@ -479,6 +483,14 @@ Vider + + Impossibile discargar le fundo + + Retentar + + Impossibile cambiar fundo + + Pro saper plus Cambia le fundo toccante le logo de Firefox in le pagina initial @@ -486,6 +498,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox, button cambiar le fundo + + %s classic + + Edition limitate + + Le nove collection de voces independente. %s + + Le nove collection de voces independente. + + Prova un tocco de color + + Elige un fundo que te parla. + + Explora altere fundos + Le additivo non es supportate @@ -1264,19 +1291,29 @@ - Benvenite a %s! + Benvenite a %s! + + Benvenite a in un internet melior + + Un navigator pro le gente, non pro le profitos. - Synchronisar Firefox inter apparatos + Synchronisar Firefox inter apparatos + + Reprende de ubi tu lassava - Apporta marcapaginas, chronologia e contrasignos de %1$s sur iste dispositivo. + Apporta marcapaginas, chronologia e contrasignos de %1$s sur iste dispositivo. - Inscribe te + Inscribe te + + Aperir session Sync es activate - Confidentialitate sempre active + Confidentialitate sempre active + + Preconfigurate pro le vita private - %1$s automaticamente impedi le companias de sequer secretemente tu movimentos circum le Web. + %1$s automaticamente impedi le companias de sequer secretemente tu movimentos circum le Web. Standard (predefinite) @@ -1289,15 +1326,21 @@ Elige le ubication de tu barra del instrumentos - Pone le barra del instrumentos pro attinger lo facilemente. + Pone le barra del instrumentos pro attinger lo facilemente. - Tu confidentialitate + Tu confidentialitate + + Tu controla tu datos - Nos ha concipite %s pro dar te le controlo de lo que tu comparti in linea e lo que tu comparti con nos. + Nos ha concipite %s pro dar te le controlo de lo que tu comparti in linea e lo que tu comparti con nos. + + Firefox te da le controlo sur lo que tu comparti in linea e lo que tu comparti con nos. Lege nostre aviso de confidentialitate + + Preste a aperir un internet stupende? Comenciar a navigar diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 8e28fb087..1a702c9d8 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -282,9 +282,15 @@ הכירו את דף הבית המותאם אישית שלכם. לשוניות אחרונות, סימניות ותוצאות חיפוש יופיעו כאן. - ברוכים הבאים לאינטרנט עצמאי + ברוכים הבאים לאינטרנט עצמאי + + ברוכים הבאים לאינטרנט אישי יותר יותר צבעים. פרטיות טובה יותר. אותה המחויבות לאנשים על פני רווחים. + + לקפוץ מהטלפון למחשב הנייד ובחזרה + + מעבר בין מסכים קל מאי פעם אפשר להמשיך מאיפה שעצרת עם לשוניות ממכשירים אחרים בעמוד הבית שלך. @@ -474,6 +480,10 @@ הצגה + + לנסות שוב + + מידע נוסף החלפת הרקע על־ידי נגיעה בלוגו דף הבית של Firefox @@ -481,6 +491,11 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> הלוגו של Firefox - החלפת תמונת הרקע, כפתור + + ‏%s קלאסי + + מהדורה מוגבלת + התוספת אינה נתמכת @@ -1228,19 +1243,33 @@ - ברוכים הבאים אל %s! + ברוכים הבאים אל %s! + + ברוכים הבאים לאינטרנט טוב יותר + + דפדפן שנבנה לטובת בני אדם, לא למטרות רווח. - סנכרון Firefox בין מכשירים + סנכרון Firefox בין מכשירים + + להמשיך מאיפה שהפסקת - משיכת הסימניות, ההיסטוריה והססמאות ל־%1$s במכשיר הזה. + משיכת הסימניות, ההיסטוריה והססמאות ל־%1$s במכשיר הזה. + + סנכרון לשוניות וססמאות בין מכשירים למעבר חלק בין מסכים. - הרשמה + הרשמה + + כניסה הסנכרון פעיל - פרטיות תמיד מופעלת + פרטיות תמיד מופעלת + + הגנה על הפרטיות כברירת מחדל - ‏%1$s מונע באופן אוטומטי מחברות לעקוב אחריך בסתר ברחבי הרשת. + ‏%1$s מונע באופן אוטומטי מחברות לעקוב אחריך בסתר ברחבי הרשת. + + הגנת עוגיות מלאה מונעת מרכיבי מעקב להשתמש בעוגיות כדי לעקוב אחריך בין אתרים. רגיל (ברירת מחדל) @@ -1252,16 +1281,24 @@ בחירת מיקום סרגל הכלים שלך - לשים את סרגל הכלים בהישג יד. ניתן להשאיר אותו בתחתית, או להעביר אותו למעלה. + לשים את סרגל הכלים בהישג יד. ניתן להשאיר אותו בתחתית, או להעביר אותו למעלה. + + אפשר להשאיר אותו למטה, או להזיז אותו למעלה. - הפרטיות שלך + הפרטיות שלך + + הנתונים שלך בשליטתך - עיצבנו את %s כדי להעניק לך שליטה במה שמעניין אותך לשתף ברשת ומה שמעניין אותך לשתף איתנו. + עיצבנו את %s כדי להעניק לך שליטה במה שמעניין אותך לשתף ברשת ומה שמעניין אותך לשתף איתנו. + + ‏Firefox מעניק לך שליטה במה שמעניין אותך לשתף ברשת ומה שמעניין אותך לשתף איתנו. קריאת הצהרת הפרטיות שלנו + + מוכנים לגלות אינטרנט מדהים? התחלת גלישה diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 01cb19727..7403aac93 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -289,11 +289,15 @@ 개인화된 홈페이지를 만나보세요. 최근 탭, 북마크 및 검색 결과가 여기에 표시됩니다. - 독립 인터넷에 오신 것을 환영합니다 + 독립 인터넷에 오신 것을 환영합니다 + + 나만의 인터넷에 오신 것을 환영합니다 더 많은 색상. 더 나은 개인 정보 보호. 이익보다는 사람들에 대한 헌신. - 휴대전화에서 노트북으로 왔다가 다시 돌아가기 + 휴대전화에서 노트북으로 왔다가 다시 돌아가기 + + 더 쉬워진 화면 전환 이제 홈페이지에서 다른 기기의 탭을 가져와서 중단한 부분부터 다시 시작하세요. @@ -482,6 +486,14 @@ 보기 + + 배경 화면을 다운로드할 수 없습니다 + + 다시 시도 + + 배경 화면을 변경할 수 없습니다 + + 더 알아보기 Firefox 홈페이지 로고를 눌러 배경 화면 변경 @@ -489,6 +501,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox 로고 - 배경 화면 변경, 버튼 + + 클래식 %s + + 한정판 + + 새로운 독립적인 목소리 모음. %s + + 새로운 독립적인 목소리 모음. + + 다채로운 색상 체험 + + 나를 표현하는 배경 화면을 선택하세요. + + 더 많은 배경 화면 살펴보기 + 부가 기능이 지원되지 않음 @@ -1267,20 +1294,34 @@ - %s에 오신걸 환영합니다! + %s에 오신걸 환영합니다! + + 더 나은 인터넷에 오신 것을 환영합니다 + + 이익이 아닌 사람을 위해 만들어진 브라우저. - 기기 간에 Firefox 동기화 + 기기 간에 Firefox 동기화 + + 중단한 부분부터 다시 시작하세요 - 이 기기의 %1$s에 북마크, 기록 및 비밀번호를 가져오세요. + 이 기기의 %1$s에 북마크, 기록 및 비밀번호를 가져오세요. + + 원활한 화면 전환을 위해 여러 기기에서 탭과 비밀번호를 동기화합니다. - 가입하기 + 가입하기 + + 로그인 동기화 켜짐 - 상시 개인 정보 보호 + 상시 개인 정보 보호 + + 기본적으로 사생활을 보호합니다 - %1$s는 회사가 웹에서 사용자를 몰래 따라 다니는 것을 자동으로 중지합니다. + %1$s는 회사가 웹에서 사용자를 몰래 따라 다니는 것을 자동으로 중지합니다. + + 전체 쿠키 보호 기능을 통해 추적기가 쿠키를 사용하여 사이트에서 사용자를 스토킹하는 것을 방지합니다. 표준 (기본값) @@ -1292,15 +1333,23 @@ 도구 모음 위치 선택 - 도구 모음을 쉽게 접근할 수 있는 곳에 놓으세요. 하단에 두거나 상단으로 옮기세요. + 도구 모음을 쉽게 접근할 수 있는 곳에 놓으세요. 하단에 두거나 상단으로 옮기세요. + + 아래쪽에 두거나 위쪽으로 이동하세요. - 개인 정보 보호 + 개인 정보 보호 + + 사용자가 자신의 데이터를 제어 - 우리는 %s가 무엇을 온라인에서 공유하고 우리와 공유할지 사용자가 제어할 수 있게 만들었습니다. + 우리는 %s가 무엇을 온라인에서 공유하고 우리와 공유할지 사용자가 제어할 수 있게 만들었습니다. + + Firefox를 사용하면 무엇을 온라인에서 공유하고 우리와 공유할지 사용자가 제어할 수 있습니다. 개인정보처리방침 읽기 + + 놀라운 인터넷을 열 준비가 되셨습니까? 탐색 시작 diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 1aa0a0c66..7f4179092 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -466,6 +466,9 @@ ເບິ່ງ + + ປ່ຽນຮູບວໍເປເປີໂດຍການແຕະໃສ່ໂລໂກ້ຂອງໜ້າຫຼັກຂອງ Firefox + Add-on ນີ້ແມ່ນບໍ່ໄດ້ຮັບການຊັບພອດ @@ -683,6 +686,9 @@ ຍ້າຍແຖບເກົ່າໄປເປັນແຖບທີບໍ່ມີການເຄື່ອນໄຫວ + + ແຖບທີ່ທ່ານບໍ່ໄດ້ເບິ່ງເປັນເວລາສອງອາທິດຈະຖືກຍ້າຍໄປພາກສ່ວນທີ່ບໍ່ເຄື່ອນໄຫວ. + ລຶບ @@ -805,6 +811,8 @@ ຊິງຄ໌ຈາກອຸປະກອນອື່ນ ຈາກອຸປະກອນອື່ນ + + ເຂົ້າສູ່ລະບົບເພື່ອເບິ່ງປະຫວັດການຊິງຄ໌ຈາກອຸປະກອນອື່ນຂອງທ່ານ. ເຂົ້າສູ່ລະບົບ @@ -1227,12 +1235,16 @@ Sync ເປີດຢູ່ + + ຄວາມເປັນສ່ວນຕົວເປີດຕະຫຼອດ ມາດຕະຖານ (ຄ່າພື້ນຖານ) ເຂັ້ມງວດ + + ເລືອກການຈັດວາງແຖບເຄື່ອງມືຂອງທ່ານ ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ @@ -1245,6 +1257,8 @@ ເລືອກຊຸດປັບແຕ່ງຂອງທ່ານ + + ປະຫຍັດແບດເຕີລີ່ ແລະ ສາຍຕາຂອງທ່ານໂດຍເປີດນຳໃຊ້ໂຫມດມືດ. ອັດຕະໂນມັດ @@ -1343,6 +1357,8 @@ ຄຸກກີຂ້າມເວັບໄຊ + + ຕົວຂຸດຫລຽນດິຈິຕໍລ ລາຍນິ້ວມື @@ -1535,6 +1551,8 @@ ລຶບບັດ ລຶບບັດ + + ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການລຶບບັດເຄດິດນີ້? ລຶບ @@ -1599,12 +1617,19 @@ ລຶບທີ່ຢູ່ + + ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບທີ່ຢູ່ນີ້? ລຶບ ຍົກເລີກ + + ບັນທຶກທີ່ຢູ່ + + ລຶບທີ່ຢູ່ + ເພີ່ມເຄື່ອງມືການຄົ້ນຫາ @@ -1656,6 +1681,14 @@ %1$s ເປັນເປີດ]]> + + ການເຊື່ອມຕໍ່ແມ່ນປອດໄພ + + ການເຊື່ອມຕໍ່ບໍ່ປອດໄພ + + ລຶບລ້າງຄຸກກີ້ ແລະຂໍ້ມູນເວັບໄຊ + + ບໍ່ມີຂໍ້ຍົກເວັ້ນໃນເວັບໄຊທ໌ ເພີ່ມທາງລັດ ຍົກເລີກ + + ທາງເລືອກການເຂົ້າສູ່ລະບົບ + + ບັນທຶກການປ່ຽນແປງໃນການເຂົ້າສູ່ລະບົບ. ແກ້ໄຂ @@ -1714,16 +1751,36 @@ ໂອເຄ, ເຂົ້າໃຈແລ້ວ - + + ທາງລັດ + ຊື່ - + + ຊື່ທາງລັດ + ໂອເຄ ຍົກເລີກ + + ການຕັ້ງຄ່າ ໄດ້ຮັບການສະຫນັບສະຫນູນ + + + ແທັບທີບໍ່ໄດ້ໃຊ້ງານ + + ປິດແທັບທີບໍ່ໄດ້ໃຊ້ງານທັງໝົດ + + + ຂະຫຍາຍແຖບທີ່ບໍ່ເຄື່ອນໄຫວ + + ຫຍໍ້ແຖບທີ່ບໍ່ເຄື່ອນໄຫວ + + + ເປີດປິດອັດຕະໂນມັດ + ລົບ @@ -1733,4 +1790,16 @@ ປິດ - + + ຄົ້ນຫາເພີ່ມເຕີມ + + ຮຽນຮູ້ເພີ່ມເຕີມ + + ໄດ້ຮັບການສະຫນັບສະຫນູນ + + + ເປີດໃຊ້ງານການສົ່ງຂໍ້ມູນທາງໄກເພື່ອສົ່ງຂໍ້ມູນ. + + ໄປທີ່ການຕັ້ງຄ່າ + Firefox ແນະນໍາ + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e45f73b84..42ac6419a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -285,11 +285,15 @@ Conheça sua tela inicial personalizada. Abas recentes, favoritos e resultados de pesquisa aparecem aqui. - Boas-vindas a uma internet independente + Boas-vindas a uma internet independente + + Boas-vindas a uma internet mais pessoal Mais cores. Melhor privacidade. Mesmo compromisso com pessoas acima de lucros. - Alterne entre celular e notebook + Alterne entre celular e notebook + + Mudar de tela está mais fácil do que nunca Continue agora de onde parou, com abas de outros dispositivos na sua tela inicial. @@ -477,6 +481,14 @@ Ver + + Não foi possível baixar o fundo de tela + + Tentar novamente + + Não foi possível mudar o fundo de tela + + Saiba mais Mudar o fundo de tela tocando no logotipo do Firefox na tela inicial @@ -484,6 +496,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipo do Firefox - mudar fundo de tela, botão + + %s clássico + + Edição limitada + + A nova coleção de vozes independentes. %s + + A nova coleção de vozes independentes. + + Experimente um toque de cores + + Escolha um fundo de tela que combina com você. + + Mais fundos de tela + Extensão não suportada @@ -1229,19 +1256,33 @@ - Boas-vindas ao %s! + Boas-vindas ao %s! + + Boas-vindas a uma internet melhor + + Um navegador feito para as pessoas, não para o lucro. - Sincronize o Firefox entre dispositivos + Sincronize o Firefox entre dispositivos + + Continue de onde você parou - Traga favoritos, histórico e senhas para o %1$s neste dispositivo. + Traga favoritos, histórico e senhas para o %1$s neste dispositivo. + + Sincronize abas e senhas entre dispositivos para mudar facilmente de uma tela para outra. - Criar uma conta + Criar uma conta + + Entrar A sincronização está ativada - Privacidade sempre ativa + Privacidade sempre ativa + + Proteção de privacidade por padrão - O %1$s impede automaticamente que empresas sigam você secretamente pela web. + O %1$s impede automaticamente que empresas sigam você secretamente pela web. + + Apresentamos a proteção total contra cookies para impedir que rastreadores usem cookies para te perseguir de um site para outro. Normal (padrão) @@ -1253,15 +1294,23 @@ Escolha a posição da barra de ferramentas - Facilite o alcance à barra de ferramentas. Mantenha embaixo, ou mova para cima. + Facilite o alcance à barra de ferramentas. Mantenha embaixo, ou mova para cima. + + Mantenha na parte de baixo, ou mova para o alto. - Sua privacidade + Sua privacidade + + Você controla seus dados - Projetamos o %s para te dar controle sobre o que você compartilha online e o que você compartilha conosco. + Projetamos o %s para te dar controle sobre o que você compartilha online e o que você compartilha conosco. + + O Firefox te dá o controle sobre o que você compartilha online e o que compartilha conosco. Leia nosso aviso de privacidade + + Pronto para se abrir uma internet incrível? Iniciar navegação diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e42a704b1..34fd17059 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -285,12 +285,16 @@ Zoznámte sa so svojou prispôsobenou domovskou stránkou. Tu sa zobrazia nedávne karty, záložky a výsledky vyhľadávania. - Vitajte na nezávislom internete + Vitajte na nezávislom internete + + Vitajte na osobnejšom internete Viac farieb. Lepšie súkromie. Rovnaký záväzok voči ľuďom nadradený ziskom. - Preskočte z telefónu na laptop a späť + Preskočte z telefónu na laptop a späť + + Prepínanie obrazoviek je jednoduchšie ako kedykoľvek predtým Pokračujte tam, kde ste prestali, pomocou kariet z iných zariadení teraz na vašej domovskej stránke. @@ -481,6 +485,14 @@ Tapeta bola aktualizovaná! Zobraziť + + Tapetu sa nepodarilo stiahnuť + + Skúsiť znova + + Tapetu sa nepodarilo zmeniť + + Ďalšie informácie Tapetu domovskej stránky zmeniť ťuknutím na logo Firefoxu @@ -488,6 +500,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefoxu - zmena tapety, tlačidlo + + Klasický %s + + Limitovaná edícia + + Nová kolekcia Nezávislé hlasy. %s + + Nová kolekcia Nezávislé hlasy. + + Vyskúšajte nádych farieb + + Vyberte si tapetu, ktorá k vám hovorí. + + Preskúmajte ďalšie tapety + Doplnok nie je podporovaný @@ -1235,19 +1262,33 @@ - Víta vás %s! + Víta vás %s! + + Vitajte na lepšom internete + + Prehliadač vytvorený pre ľudí, nie pre zisky. - Synchronizácia Firefoxu medzi zariadeniami + Synchronizácia Firefoxu medzi zariadeniami + + Pokračujte tam, kde ste prestali - Preneste si svoje záložky, históriu a heslá do %1$su aj na toto zariadenie. + Preneste si svoje záložky, históriu a heslá do %1$su aj na toto zariadenie. + + Synchronizujte karty a heslá medzi zariadeniami pre bezproblémové prepínanie obrazovky. - Prihlásiť sa + Prihlásiť sa + + Prihlásiť sa Synchronizácia je zapnutá - Vždy zabezpečené súkromie + Vždy zabezpečené súkromie + + Ochrana súkromia v predvolenom nastavení - %1$s automaticky zabraňuje spoločnostiam tajne vás sledovať pri prehliadaní webu. + %1$s automaticky zabraňuje spoločnostiam tajne vás sledovať pri prehliadaní webu. + + Obsahuje úplnú ochranu súborov cookie, aby ste zabránili sledovačom používať súbory cookie, aby vás mohli sledovať na rôznych stránkach. Štandardná (predvolená) @@ -1259,15 +1300,23 @@ Vyberte umiestnenie panela s nástrojmi - Umiestnite panel s nástrojmi, aby ste naň ľahko dosiahli. Ponechajte ho na spodku alebo si ho presuňte hore. + Umiestnite panel s nástrojmi, aby ste naň ľahko dosiahli. Ponechajte ho na spodku alebo si ho presuňte hore. + + Ponechajte ho dolu alebo ho presuňte nahor. - Vaše súkromie + Vaše súkromie + + Svoje údaje máte pod kontrolou - %s vám dáva kontrolu nad tým, čo zdieľate na internete a čo zdieľate s nami. + %s vám dáva kontrolu nad tým, čo zdieľate na internete a čo zdieľate s nami. + + Firefox vám dáva kontrolu nad tým, čo zdieľate online a čo zdieľate s nami. Prečítajte si naše zásady ochrany súkromia + + Ste pripravení otvoriť úžasný internet? Začať prehliadať diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml index 42d6f8b58..dca1e7566 100644 --- a/app/src/main/res/values-szl/strings.xml +++ b/app/src/main/res/values-szl/strings.xml @@ -16,6 +16,8 @@ Szukej abo wkludź adresa + + Wkludź szukane słowa Sam sie pokożōm twoje ôtwarte karty. @@ -39,11 +41,9 @@ - Niydowne zokłodki - - Niydowno spamiyntane zokłodki - - Pokoż wszyske + Niydowne zokłodki + + Ôstatnio spamiyntane Pokoż wszyske zokłodki @@ -79,6 +79,9 @@ Ôdkoż + + Zawrzij + Trza dostympu do kamery. Idź doo sztalōnkōw Androidaa, tyknij "dozwolyństwa" i tyknij "zgoda". @@ -125,10 +128,10 @@ Pokoż knefel wszyskich niydownych kart - Twoje wyszukowanie „%1$s” + Twoje wyszukowanie „%1$s” - Strōny: %d + Strōny: %d Ôbocz wszyske synchrōnizowane karty @@ -238,8 +241,6 @@ Pokazować dorady szukanio we prywatnych ôknach? %s bydzie przekazowoł bazowyj wyszukowarce wszysko, co wkludzosz we posku z adresōm. - - Przewiydz sie wiyncyj Szukej na %s @@ -250,25 +251,25 @@ - Co je nowego w aplikacyji %1$s + Co je nowego w aplikacyji %1$s - Teroz je snadnij zacznōńć nazod tam, kaj sie skōńczyło. + Teroz je snadnij zacznōńć nazod tam, kaj sie skōńczyło. - Spersōnalizowano dōmowo strōna aplikacyje %1$s + Spersōnalizowano dōmowo strōna aplikacyje %1$s - Gibko dostōń do ôtwartych kart, zokłodek i historyje wyszukowanio. + Gibko dostōń do ôtwartych kart, zokłodek i historyje wyszukowanio. - Klarowne, zorganizowane karty + Klarowne, zorganizowane karty - Zrōb porzōndek skuli lepszego rozłożynio i autōmatycznego zawiyranio kart. + Zrōb porzōndek skuli lepszego rozłożynio i autōmatycznego zawiyranio kart. - Niydowne szukania + Niydowne szukania - Wrōć do niydownego szukanio z domowyj strōny i kart. + Wrōć do niydownego szukanio z domowyj strōny i kart. - Twoja spersōnalizowano dōmowo strōna Firefoksa pōmogo teroz snadnij wrōcić tam, kaj sie skōńczyło. Znojdź niydowne karty, zokłodki i wyniki szukanio. + Twoja spersōnalizowano dōmowo strōna Firefoksa pōmogo teroz snadnij wrōcić tam, kaj sie skōńczyło. Znojdź niydowne karty, zokłodki i wyniki szukanio. @@ -361,7 +362,7 @@ Przipasuj - Synchrōnizuj zokłodki, historyjo i inksze ze swojim kōntym Firefox + Synchrōnizuj zokłodki, historyjo i inksze ze swojim kōntym Firefox Kōnto Firefox @@ -448,10 +449,10 @@ Pokoż - Tyknij logo dōmowyj strōny Firefoxa, coby zmiynić tapeta + Tyknij logo dōmowyj strōny Firefoxa, coby zmiynić tapeta - Logo firefoxa - zmiyń tapeta, knefel + Logo firefoxa - zmiyń tapeta, knefel @@ -535,7 +536,7 @@ - Załōncz synchronizacyjo + Załōncz synchronizacyjo Wloguj sie, coby zaś sie połōnczyć @@ -625,9 +626,9 @@ Nec - Grupy szukanio + Grupy szukanio - Zbiyrej społym powiōnzane strōny + Zbiyrej społym powiōnzane strōny Zawrzij karty @@ -734,8 +735,6 @@ Myni ôtwartych kart Spamiyntej karty do kolekcyje - - Myni kart @@ -756,7 +755,7 @@ %1$s (prywatny tryb) - Inksze karty + Inksze karty @@ -786,9 +785,9 @@ Niy ma sam żodnyj historyje - Synchrōnizowane z inkszych maszin + Synchrōnizowane z inkszych maszin - Z inkszych maszin + Z inkszych maszin @@ -1075,8 +1074,6 @@ Karty sōm zawarte Zokłodki sōm spamiyntane! - - Przidane do topowych strōn! Przidane do skrōtōw! @@ -1155,7 +1152,8 @@ Skōńcz - Bez to skasujōm sie wszyske dane przeglōndanio. + Bez to skasujōm sie wszyske dane przeglōndanio. + %s skasuje ôbrane dane przeglōndanio. @@ -1168,9 +1166,6 @@ Kasowanie danych przeglōndanio… - - To skasuje wszyske elymynta. - Pociep @@ -1178,53 +1173,23 @@ Grupa skasowano - - - Firefox Preview to teroz Firefox Nightly - - - Firefox Nightly kożdo noc je aktualizowany i mo nowe, eksperymyntalne funkcyje. - Może ale być mynij stabilny. Pobier nasza przeglōndarka beta, coby używać stabilniyjszyj wersyje. - - - Pobier Firefoxa Beta na Androida - - - Firefox Nightly sie przekludziōł - - - Ta aplikacyjo niy bydzie już dostować bezpiecznych aktualizacyji. Przestōń jij używać i przełōncz sie na nowe Nightly. - \n\nCoby przeniyś swoje zokłodki, dane logowanio i historyjo do inkszyj aplikacyji, załōż kōnto Firefoxa. - - Przełōncz sie na nowe Nightly - - - Firefox Nightly sie przekludziōł - - Ta aplikacyjo niy bydzie już dostować bezpiecznych aktualizacyji. Pobier nowe Nightly i przestōń jij używać. - \n\nCoby przeniyś swoje zokłodki, dane logowanio i historyjo do inkszyj aplikacyji, załōż kōnto Firefoxa. - - Pobier nowe Nightly - - %s wito! + %s wito! - Synchrōnizuj Firefoxa miyndzy maszinami - - Synchrōnizuj aplikacyjo %1$s miyndzy maszinami + Synchrōnizuj Firefoxa miyndzy maszinami - Przekludź zokłodki, historyjo i hasła do aplikacyje %1$s na tyj maszinie. + Przekludź zokłodki, historyjo i hasła do aplikacyje %1$s na tyj maszinie. - Zaregistruj sie + Zaregistruj sie Synchrōnizacyjo je załōnczōno - Zawdy z prywatnościōm + Zawdy z prywatnościōm - %1$s autōmatycznie niy dowo fyrmōm śledzic cie po kryjōmu po necu. + %1$s autōmatycznie niy dowo fyrmōm śledzic cie po kryjōmu po necu. Standardowo (bazowe) @@ -1236,13 +1201,13 @@ Ôbier, kaj mo być posek z noczyniami - Dej posek z noczyniami na spodku abo na wiyrchu, coby snadnie do niego dostować. + Dej posek z noczyniami na spodku abo na wiyrchu, coby snadnie do niego dostować. - Twoja prywatność + Twoja prywatność - %s dowo ci kōntrola nad tym, co udostympniosz online i co udostympniosz nōm. + %s dowo ci kōntrola nad tym, co udostympniosz online i co udostympniosz nōm. Poczytej ô naszych prawidłach prywatności diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index dc2eb0d22..7985e4d0d 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -15,6 +15,8 @@ Qidiring yoki manzilni kiriting + + Qidiriladigan soʻzni kiriting Ochiq varaqlar shu yerda koʻrinadi. @@ -38,9 +40,14 @@ Oxirgi xatchoʻplar + + Yaqinda saqlangan Barcha saqlangan xatchoʻplarni koʻrsatish + + Olib tashlash + %1$s brauzerini Mozilla ishlab chiqqan. From bcc12b65cec3ea08d1ab6f569b5a7be75c9b805b Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 15 Sep 2022 17:39:30 +0300 Subject: [PATCH 017/407] For #27004: Make the top site frame layout focusable. This makes the layout visible to a11y screen readers. --- app/src/main/res/layout/top_site_item.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/top_site_item.xml b/app/src/main/res/layout/top_site_item.xml index 33cf36454..73ee15372 100644 --- a/app/src/main/res/layout/top_site_item.xml +++ b/app/src/main/res/layout/top_site_item.xml @@ -7,7 +7,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:focusable="true"> From 1d15fad8ca1f28b1cc1f94c069eab4a1ceed6535 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 20 Sep 2022 14:47:07 +0300 Subject: [PATCH 018/407] For #27005 fix flaky updateSavedLoginTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index f59674e43..f5c69199a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -64,20 +64,20 @@ class SmokeTest { private lateinit var browserStore: BrowserStore private val featureSettingsHelper = FeatureSettingsHelper() - @get:Rule + @get:Rule(order = 0) val activityTestRule = AndroidComposeTestRule( HomeActivityIntentTestRule(), { it.activity }, ) - @get: Rule + @get: Rule(order = 1) val intentReceiverActivityTestRule = ActivityTestRule( IntentReceiverActivity::class.java, true, false, ) - @Rule + @Rule(order = 2) @JvmField val retryTestRule = RetryTestRule(3) From 4f507faa9d04088c30d498283285f2766dc765e0 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 20 Sep 2022 15:02:43 +0000 Subject: [PATCH 019/407] Update to Android-Components 107.0.20220920143100. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index e58d2cf87..75573b658 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220919190141" + const val VERSION = "107.0.20220920143100" } From 892e9842d46de671705e012d86895aec1facb3ae Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 15 Sep 2022 10:18:40 -0700 Subject: [PATCH 020/407] For #26854 - Fix bug causing the Top Sites sponsored text to show scrollbars --- app/src/main/res/layout/top_site_item.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/top_site_item.xml b/app/src/main/res/layout/top_site_item.xml index 73ee15372..73b58699e 100644 --- a/app/src/main/res/layout/top_site_item.xml +++ b/app/src/main/res/layout/top_site_item.xml @@ -64,6 +64,7 @@ android:textColor="@color/fx_mobile_text_color_secondary" android:textSize="11sp" android:visibility="gone" + android:scrollbars="none" tools:ignore="RtlCompat,SmallSp" tools:visibility="visible"/> From 16f490ea1529168b54bd0740fa3df6a20dd7877d Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 20 Sep 2022 19:33:23 +0000 Subject: [PATCH 021/407] Update to Android-Components 107.0.20220920190143. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 75573b658..2294eaa32 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220920143100" + const val VERSION = "107.0.20220920190143" } From 414c569e8626ccacdcd3a374da8b70dbbd28f5ac Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Tue, 20 Sep 2022 11:39:07 -0700 Subject: [PATCH 022/407] For #27055: check whether applied wallpaper name is blank --- .../org/mozilla/fenix/home/HomeFragment.kt | 2 +- .../org/mozilla/fenix/wallpapers/Wallpaper.kt | 8 ++++++ .../mozilla/fenix/wallpapers/WallpaperTest.kt | 28 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index fecbe5ccc..3b1858e0a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -945,7 +945,7 @@ class HomeFragment : Fragment() { when { !shouldEnableWallpaper() || (wallpaperName == lastAppliedWallpaperName && !orientationChange) -> return - wallpaperName == Wallpaper.defaultName -> { + Wallpaper.nameIsDefault(wallpaperName) -> { binding.wallpaperImageView.isVisible = false lastAppliedWallpaperName = wallpaperName } diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt index 4c12c9a38..0b635d62b 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt @@ -129,6 +129,14 @@ data class Wallpaper( null } } + + /** + * Check if a wallpaper name matches the default. Considers empty strings to be default + * since that likely means a wallpaper has never been set. + * + * @param name The name to check. + */ + fun nameIsDefault(name: String): Boolean = name.isEmpty() || name == defaultName } /** diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt new file mode 100644 index 000000000..142474fd3 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt @@ -0,0 +1,28 @@ +package org.mozilla.fenix.wallpapers + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class WallpaperTest { + @Test + fun `GIVEN blank wallpaper name WHEN checking whether is default THEN is default`() { + val result = Wallpaper.nameIsDefault("") + + assertTrue(result) + } + + @Test + fun `GIVEN the default wallpaper is set to be shown WHEN checking whether the current wallpaper should be default THEN return true`() { + val result = Wallpaper.nameIsDefault("default") + + assertTrue(result) + } + + @Test + fun `GIVEN a custom wallpaper is set to be shown WHEN checking whether the current wallpaper should be default THEN return false`() { + val result = Wallpaper.nameIsDefault("wally world") + + assertFalse(result) + } +} From ace7b1e35c8b3b15495835a0ed812f6f4cfd94b0 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Tue, 20 Sep 2022 13:34:25 -0700 Subject: [PATCH 023/407] Closes #27081: enable wallpaper onboarding flag --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index c443d0107..b0bf25526 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -112,7 +112,7 @@ object FeatureFlags { /** * Enables the wallpaper onboarding. */ - val wallpaperOnboardingEnabled = Config.channel.isDebug + const val wallpaperOnboardingEnabled = true /** * Enables the wallpaper v2 enhancements. From 74cb0679e2c376dd7161939480ed6e9d2da5d3ba Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 21 Sep 2022 02:34:02 +0200 Subject: [PATCH 024/407] Import l10n. (#27083) --- app/src/main/res/values-cy/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-el/strings.xml | 34 ++++++++++ app/src/main/res/values-en-rGB/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-es-rAR/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-es-rMX/strings.xml | 45 +++++++++---- app/src/main/res/values-fi/strings.xml | 39 ++++++++---- app/src/main/res/values-fy-rNL/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-gn/strings.xml | 43 +++++++++---- app/src/main/res/values-hu/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-hy-rAM/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-ia/strings.xml | 6 ++ app/src/main/res/values-is/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-lo/strings.xml | 25 +++++--- app/src/main/res/values-nl/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-oc/strings.xml | 40 ++++++++---- app/src/main/res/values-si/strings.xml | 73 ++++++++++++++++++---- app/src/main/res/values-skr/strings.xml | 33 ++++++---- app/src/main/res/values-sl/strings.xml | 43 +++++++++---- app/src/main/res/values-sv-rSE/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-tg/strings.xml | 72 +++++++++++++++++---- app/src/main/res/values-uk/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-vi/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-zh-rCN/strings.xml | 71 +++++++++++++++++---- app/src/main/res/values-zh-rTW/strings.xml | 71 +++++++++++++++++---- 24 files changed, 1137 insertions(+), 239 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index fe3b857ba..eada27a7d 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -281,11 +281,15 @@ Dyma’ch gwefan cartref personol. Bydd tabiau diweddar, nodau tudalen, a chanlyniadau chwilio yn ymddangos yma. - Croeso i ryngrwyd annibynnol + Croeso i ryngrwyd annibynnol + + Croeso i rhyngrwyd mwy personol Rhagor o liwiau. Gwell preifatrwydd. Yr un ymrwymiad i bobl ac nid elw. - Ewch o’r ffôn i’r gliniadur ac yn ôl + Ewch o’r ffôn i’r gliniadur ac yn ôl + + Mae newid sgriniau yn haws nag erioed Ewch ymlaen o’r lle roeddech chi nawr gyda thabiau o ddyfeisiau eraill ar eich tudalen cartref. @@ -472,6 +476,14 @@ Papur wal wedi’i ddiweddaru! Golwg + + Methu llwytho papur wal i lawr + + Ceisiwch eto + + Methu newid papur wal + + Dysgu rhagor Newidiwch y papur wal trwy dapio logo tudalen hafan Firefox @@ -479,6 +491,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - newid y papur wal, pwyso’r botwm + + %s clasurol + + Fersiwn Cyfyngedig + + Casgliad newydd Lleisiau Annibynnol. %s + + Casgliad newydd Lleisiau Annibynnol. + + Ychwanegwch bach o liw + + Dewiswch bapur wal sy’n siarad â chi. + + Rhagor o bapurau wal + Nid yw’r ychwanegyn yn cael ei gefnogi @@ -1221,20 +1248,34 @@ - Croeso i %s! + Croeso i %s! + + Croeso i rhyngrwyd gwell + + Porwr a adeiladwyd ar gyfer pobl, nid elw. - Cydweddu Firefox rhwng dyfeisiau + Cydweddu Firefox rhwng dyfeisiau + + Parhau lle roeddech o’r blaen - Dewch â nodau tudalen, hanes, a chyfrineiriau i %1$s ar y ddyfais hon. + Dewch â nodau tudalen, hanes, a chyfrineiriau i %1$s ar y ddyfais hon. + + Cydweddu tabiau a chyfrineiriau ar draws dyfeisiau ar gyfer newid sgriniau di-dor. - Ymuno + Ymuno + + Mewngofnodi Mae Sync ymlaen - Preifatrwydd parhaus + Preifatrwydd parhaus + + Diogelu preifatrwydd drwy ragosodiad - Mae %1$s yn atal cwmnïau rhag eich dilyn yn gyfrinachol o amgylch y we, yn awtomatig. + Mae %1$s yn atal cwmnïau rhag eich dilyn yn gyfrinachol o amgylch y we, yn awtomatig. + + Yn cynnwys Diogelwch Cwcis Llwyr i atal tracwyr rhag defnyddio cwcis i’ch stelcian ar draws gwefannau. Safonol (rhagosodedig) @@ -1246,16 +1287,24 @@ Dewiswch leoliad eich bar offer - Rhowch y bar offer o fewn cyrraedd hawdd. Cadwch ef ar y gwaelod, neu ei symud i’r brig. + Rhowch y bar offer o fewn cyrraedd hawdd. Cadwch ef ar y gwaelod, neu ei symud i’r brig. + + Ei gadw ar y gwaelod, neu ei symud i’r brig. - Eich preifatrwydd + Eich preifatrwydd + + Chi sy’n rheoli eich data - Rydym wedi cynllunio %s i roi rheolaeth i chi dros yr hyn rydych chi’n ei rannu ar-lein a’r hyn rydych chi’n ei rannu gyda ni. + Rydym wedi cynllunio %s i roi rheolaeth i chi dros yr hyn rydych chi’n ei rannu ar-lein a’r hyn rydych chi’n ei rannu gyda ni.      + + Mae Firefox yn rhoi rheolaeth i chi dros yr hyn rydych chi’n ei rannu ar-lein a’r hyn rydych chi’n ei rannu gyda ni. Darllenwch ein hysbysiad preifatrwydd + + Yn barod i agor rhyngrwyd rhyfeddol? Cychwyn pori diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8a4d1853f..178d628dc 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -486,6 +486,14 @@ Προβολή + + Δεν ήταν δυνατή η λήψη ταπετσαρίας + + Δοκιμή ξανά + + Δεν ήταν δυνατή η αλλαγή ταπετσαρίας + + Μάθετε περισσότερα Αλλαγή ταπετσαρίας από το λογότυπο του Firefox στην αρχική σελίδα @@ -493,6 +501,22 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Λογότυπο Firefox - κουμπί αλλαγής ταπετσαρίας + + Κλασικό %s + + Περιορισμένη έκδοση + + + Η νέα συλλογή «Ανεξάρτητες φωνές». %s + + Η νέα συλλογή «Ανεξάρτητες φωνές». + + Δοκιμάστε μια πινελιά χρώματος + + Επιλέξτε μια ταπετσαρία ιδανική για εσάς. + + Εξερευνήστε περισσότερες ταπετσαρίες + Το πρόσθετο δεν υποστηρίζεται @@ -1242,8 +1266,12 @@ Καλώς ορίσατε στο %s! + + Καλώς ήρθατε σε ένα καλύτερο διαδίκτυο Συγχρονισμός Firefox μεταξύ συσκευών + + Συνεχίστε από εκεί που σταματήσατε Φέρτε σελιδοδείκτες, ιστορικό και κωδικούς πρόσβασης στο %1$s σε αυτήν τη συσκευή. @@ -1255,6 +1283,8 @@ Μόνιμη προστασία απορρήτου + + Προστασία απορρήτου από προεπιλογή Το %1$s εμποδίζει την καταγραφή της διαδικτυακής δραστηριότητάς σας από εταιρείες. @@ -1271,9 +1301,13 @@ Τοποθετήστε τη γραμμή εργαλείων σε κοντινή απόσταση. Κρατήστε την στο κάτω μέρος ή μετακινήστε την στο πάνω μέρος. Το απόρρητό σας + + Εσείς ελέγχετε τα δεδομένα σας Έχουμε σχεδιάσει το %s έτσι, ώστε να ελέγχετε τι κοινοποιείτε στο διαδίκτυο και σε εμάς. + + Το Firefox σάς επιτρέπει να ελέγχετε τι κοινοποιείτε στο διαδίκτυο και σε εμάς. Διαβάστε τη σημείωση απορρήτου μας diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 17ec4d552..97c06910a 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -280,11 +280,15 @@ Meet your personalised homepage. Recent tabs, bookmarks, and search results will appear here. - Welcome to an independent internet + Welcome to an independent internet + + Welcome to a more personal internet More colours. Better privacy. Same commitment to people over profits. - Hop from phone to laptop and back + Hop from phone to laptop and back + + Switching screens is easier than ever Pick up where you left off with tabs from other devices now on your homepage. @@ -471,6 +475,14 @@ Wallpaper updated! View + + Couldn’t download wallpaper + + Try again + + Couldn’t change wallpaper + + Learn more Change wallpaper by tapping Firefox homepage logo @@ -478,6 +490,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox logo - change the wallpaper, button + + Classic %s + + Limited Edition + + The new Independent Voices collection. %s + + The new Independent Voices collection. + + Try a splash of colour + + Choose a wallpaper that speaks to you. + + Explore more wallpapers + Add-on is not supported @@ -1218,19 +1245,33 @@ - Welcome to %s! + Welcome to %s! + + Welcome to a better internet + + A browser built for people, not profits. - Synchronise Firefox between devices + Synchronise Firefox between devices + + Pick up where you left off - Bring bookmarks, history, and passwords to %1$s on this device. + Bring bookmarks, history, and passwords to %1$s on this device. + + Synchronise tabs and passwords across devices for seamless screen-switching. - Sign up + Sign up + + Sign in Sync is on - Always-on privacy + Always-on privacy + + Privacy protection by default - %1$s automatically stops companies from secretly following you around the web. + %1$s automatically stops companies from secretly following you around the web. + + Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites. Standard (default) @@ -1242,15 +1283,23 @@ Pick your toolbar placement - Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. + Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. + + Keep it on the bottom, or move it to the top. - Your privacy + Your privacy + + You control your data - We’ve designed %s to give you control over what you share online and what you share with us. + We’ve designed %s to give you control over what you share online and what you share with us. + + Firefox gives you control over what you share online and what you share with us. Read our privacy notice + + Ready to open up an amazing internet? Start browsing diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 576b4b5d6..8e2bbbff6 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -287,12 +287,16 @@ Conocé tu página de inicio personalizada. Las pestañas recientes, los marcadores y los resultados de búsqueda aparecerán aquí. - Bienvenido a una Internet independiente + Bienvenido a una Internet independiente + + Bienvenido a una Internet más personal Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. - Cambiá de teléfono a computadora y viceversa + Cambiá de teléfono a computadora y viceversa + + Cambiar de pantallas es más fácil que nunca Continuá donde lo dejaste con las pestañas de otros dispositivos ahora en tu página de inicio. @@ -479,6 +483,14 @@ ¡Se actualizó el fondo de pantalla! Ver + + No se pudo descargar el fondo de pantalla + + Intentar nuevamente + + No se pudo cambiar el fondo de pantalla + + Conocer más Cambiar el fondo de pantalla tocando el logotipo de la página de inicio de Firefox @@ -486,6 +498,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipo de Firefox - cambiar el fondo de pantalla, botón + + %s clásico + + Edición limitada + + La nueva colección Voces Independientes. %s + + La nueva colección Voces Independientes. + + Probá un toque de color + + Elegí un fondo de pantalla que te represente. + + Explorar más fondos de pantalla + El complemento no es compatible @@ -1247,19 +1274,33 @@ - ¡Bienvenido a %s! + ¡Bienvenido a %s! + + Bienvenido a una Internet mejor + + Un navegador hecho para la gente, no por el dinero. - Sincronizar Firefox entre dispositivos + Sincronizar Firefox entre dispositivos + + Continuá desde donde dejaste - Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + + Sincronizá pestañas y contraseñas entre dispositivos para cambiar de pantalla sin problemas. - Registrate + Registrate + + Iniciar sesión La sincronización está activada - Privacidad siempre activada + Privacidad siempre activada + + Protección de privacidad de manera predetermina - %1$s impide automáticamente que las compañías te sigan en secreto por la web. + %1$s impide automáticamente que las compañías te sigan en secreto por la web. + + Incluye Total Cookie Protection para evitar que los rastreadores usen cookies para espiarte entre sitios. Estándar (predeterminado) @@ -1271,16 +1312,24 @@ Elegí la ubicación de la barra de herramientas - Poné la barra de herramientas a tu alcance. Mantenela abajo, o movela hacia arriba. + Poné la barra de herramientas a tu alcance. Mantenela abajo, o movela hacia arriba. + + Mantenela en la parte inferior o movela a la parte superior. - Tu privacidad + Tu privacidad + + Controlás tus datos - Diseñamos %s para que puedas controlar lo que compartís en línea y lo que compartís con nosotros. + Diseñamos %s para que puedas controlar lo que compartís en línea y lo que compartís con nosotros. + + Firefox te da el control sobre lo que compartís en línea y lo que compartís con nosotros. Leé nuestra política de privacidad + + ¿Listo para abrir una Internet increíble? Empezar a navegar diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index e97c69605..ffbece65e 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -282,11 +282,11 @@ Conoce tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. - Te damos la bienvenida a un internet independiente + Te damos la bienvenida a un internet independiente Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. - Cambia del teléfono a la computadora y viceversa + Cambia del teléfono a la computadora y viceversa Continuar donde lo dejaste con pestañas de otros dispositivos ahora en tu página de inicio. @@ -476,6 +476,14 @@ Ver + + No se pudo descargar el fondo de pantalla + + Reintentar + + No se pudo cambiar el fondo de pantalla + + Saber más Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox @@ -483,6 +491,11 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipo de Firefox - cambiar el fondo de pantalla, botón + + Edición limitada + + Explorar más fondos de pantalla + Complemento no compatible @@ -1224,19 +1237,25 @@ - ¡Te damos la bienvenida a %s! + ¡Te damos la bienvenida a %s! - Sincronizar Firefox entre dispositivos + Sincronizar Firefox entre dispositivos + + Continúa donde lo dejaste - Lleva marcadores, historial y contraseñas a %1$s en este dispositivo. + Lleva marcadores, historial y contraseñas a %1$s en este dispositivo. + + Sincroniza pestañas y contraseñas entre dispositivos para cambiar de pantalla sin problemas. - Registrarse + Registrarse + + Iniciar sesión Sync está activado - Privacidad siempre activada + Privacidad siempre activada - %1$s automáticamente detiene compañías que secretamente te siguen en la web. + %1$s automáticamente detiene compañías que secretamente te siguen en la web. Estándar (predeterminado) @@ -1249,13 +1268,17 @@ Escoge la posición de la barra de herramientas - Coloca la barra de herramientas al alcance de la mano. Mantenla en la parte inferior o muévela hacia arriba. + Coloca la barra de herramientas al alcance de la mano. Mantenla en la parte inferior o muévela hacia arriba. - Tu privacidad + Tu privacidad + + Tu controlas tus datos - Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + + Firefox te da control sobre lo que compartes en línea y lo que compartes con nosotros. Leer nuestro aviso de privacidad diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 7c6357643..8f91a5391 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -287,11 +287,11 @@ Tutustu henkilökohtaiseen kotisivuusi. Viimeisimmät välilehdet, kirjanmerkit ja hakutulokset näkyvät tässä. - Tervetuloa itsenäiseen internetiin + Tervetuloa itsenäiseen internetiin Lisää värejä. Parempi yksityisyys. Ihmisiin sitoutumisen priorisointi liikevoittojen edelle. - Hyppää puhelimelta kannettavalle tietokoneelle ja takaisin + Hyppää puhelimelta kannettavalle tietokoneelle ja takaisin Jatka siitä, mihin jäit muiden laitteidesi välilehdillä. @@ -481,6 +481,14 @@ Näytä + + Taustakuvan lataaminen epäonnistui + + Yritä uudelleen + + Taustakuvaa ei voitu vaihtaa + + Lue lisää Vaihda taustakuvaa napauttamalla Firefoxin etusivun logoa @@ -488,6 +496,9 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo - vaihda taustakuva, painike + + Tutustu muihin taustakuviin + Lisäosa ei ole tuettu @@ -1244,19 +1255,23 @@ - Tervetuloa %siin! + Tervetuloa %siin! - Synkronoi Firefox laitteidesi välillä + Synkronoi Firefox laitteidesi välillä - Tuo kirjanmerkit, historia ja salasanat %1$siin tässä laitteessa. + Tuo kirjanmerkit, historia ja salasanat %1$siin tässä laitteessa. - Rekisteröidy + Rekisteröidy + + Kirjaudu sisään Sync on käytössä - Yksityisyys aina päällä + Yksityisyys aina päällä + + Yksityisyyden suoja oletuksena - %1$s estää automaattisesti yrityksiä seuraamasta sinua salaa ympäri verkkoa. + %1$s estää automaattisesti yrityksiä seuraamasta sinua salaa ympäri verkkoa. Tavallinen (oletus) @@ -1268,12 +1283,14 @@ Valitse työkalupalkin sijoitus - Sijoita työkalupalkki helposti ulottuville. Pidä se alhaalla tai siirrä se ylös. + Sijoita työkalupalkki helposti ulottuville. Pidä se alhaalla tai siirrä se ylös. + + Pidä se alhaalla tai siirrä se ylös. - Yksityisyytesi + Yksityisyytesi - Olemme suunnitelleet %sin siten, että voit hallita mitä jaat verkossa ja mitä jaat kanssamme. + Olemme suunnitelleet %sin siten, että voit hallita mitä jaat verkossa ja mitä jaat kanssamme. Lue yksityisyyskäytäntömme diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 859c8450d..2f9286d0b 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -284,11 +284,15 @@ Kom yn de kunde mei jo personalisearre startside. Resinte ljepblêden, blêdwizers en sykresultaten wurde hjir werjûn. - Wolkom by in ûnôfhinklik ynternet + Wolkom by in ûnôfhinklik ynternet + + Wolkom by in mear persoanlike ynternet Mear kleuren. Bettere privacy. Deselde ynset foar minsken boppe winst. - Ljep fan telefoan nei laptop en tebek + Ljep fan telefoan nei laptop en tebek + + Fan skermen wikselje is makliker as ea Gean fan jo startside ôf fierder wêr’t jo stoppe binne mei ljepblêden fan oare apparaten. @@ -475,6 +479,14 @@ Eftergrûn bywurke! Werjaan + + Kin eftergrûn net downloade + + Opnij probearje + + Kin eftergrûn net wizigje + + Mear ynfo Wizigje jo eftergrûn troch op it Firefox-startsidelogo te tikken @@ -482,6 +494,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo – de eftergrûn, de knop wizigje + + Klassike %s + + Beheinde edysje + + De nije kolleksje Independent Voices. %s + + De nije kolleksje Independent Voices. + + Probearje in bytsje kleur + + Kies in eftergrûn dy’t jo oansprekt. + + Mear eftergrûnen ferkenne + Add-on wurdt net stipe @@ -1221,19 +1248,33 @@ - Wolkom by %s! + Wolkom by %s! + + Wolkom by in better ynternet + + In browser dy’t boud is foar minsken, net foar winst. - Syngronisearje Firefox tusken apparaten + Syngronisearje Firefox tusken apparaten + + Gean troch wêr’t jo bleaun wiene - Bring blêdwizers, skiednis en wachtwurden nei %1$s op dit apparaat. + Bring blêdwizers, skiednis en wachtwurden nei %1$s op dit apparaat. + + Syngronisearje ljepblêden en wachtwurden op ferskate apparaten foar maklik wikseljen tusken skermen. - Registrearje + Registrearje + + Oanmelde Syngronisaasje is ynskeakele - Privacy dy’t altyd oan stiet + Privacy dy’t altyd oan stiet + + Standert privacybeskerming - %1$s soarget der automatysk foar dat bedriuwen jo net stikem folgje op ynternet. + %1$s soarget der automatysk foar dat bedriuwen jo net stikem folgje op ynternet. + + Mei Totale cookiebeskerming om foar te kommen dat trackers cookies brûke om jo stikem op it ynternet te folgjen. Standert (standert) @@ -1245,17 +1286,25 @@ Kies jo arkbalkepleatsing - Pleats de arkbalke binnen hânberik. Hâld him ûnderoan of ferpleats him nei boppe. + Pleats de arkbalke binnen hânberik. Hâld him ûnderoan of ferpleats him nei boppe. + + Hâld him ûnderoan, of ferpleats him nei boppe. - Jo privacy + Jo privacy + + Jo beheare jo gegevens - Wy hawwe %s ûntwurpen om jo kontrôle te jaan oer wat jo online diele en wat jo mei ús diele. + Wy hawwe %s ûntwurpen om jo kontrôle te jaan oer wat jo online diele en wat jo mei ús diele. + + Firefox jout jo kontrôle oer wat jo online diele en wat jo mei ús diele. Lês ús privacyferklearring + + Klear om in geweldich ynternet te iepenjen? Begjinne mei sneupen diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index ab88f55a4..d865f1256 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -281,9 +281,9 @@ Nde kuatiarogue ñepyrũgua mboavapyre Firefox pegua nombohasyive eñepyrũjeývo eheja haguégui. Ejuhu ne rendayke, techaukaha ha ehekaramovéva. - Eg̃uahẽporãite ñanduti ijeheguívape + Eg̃uahẽporãite ñanduti ijeheguívape - Eva pumbyrýgui mohendahápe ha ambueháicha + Eva pumbyrýgui mohendahápe ha ambueháicha Eñepyrũ @@ -466,6 +466,12 @@ Hecha + + Eha’ãjey + + Noñemoambuekuaái mba’erechaha rugua + + Kuaave Emoambue mba’erechaha rugua opokóvo Firefox kuatiarogue ñepyrũ ra’ãnga’i @@ -473,6 +479,13 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox ra’ãnga’i - emoambue mba’erechaha rugua, votõ + + Jepokuaa %s + + Ñemoheñói sa’íva + + Eipurukuaa sa’y sa’imi + Pe moĩmbaha ndojokupytýi @@ -1236,19 +1249,25 @@ - ¡Eg̃uahẽporãite %s-pe! + ¡Eg̃uahẽporãite %s-pe! - Embojuehe Firefox mba’e’oka pa’ũme + Embojuehe Firefox mba’e’oka pa’ũme - Egueru techaukaha, tembiasakue ha ñe’ẽñemi %1$s-pe ko mba’e’okápe. + Egueru techaukaha, tembiasakue ha ñe’ẽñemi %1$s-pe ko mba’e’okápe. - Eñemboheraguapy + Eñemboheraguapy + + Eñepyrũ tembiapo Sync oñemyandýma - Tekoñemi hendymeme + Tekoñemi hendymeme + + Omo’ã ñemigua ijeheguiete - %1$s ojoko ijehegui umi atyguasúpe ani ohapykueho ñanduti rupive kañyhápe. + %1$s ojoko ijehegui umi atyguasúpe ani ohapykueho ñanduti rupive kañyhápe. + + Ñemo’ãmbaite kookie rovake omboyke tapykuehohápe oipurúvo kookie nde rapykueho hag̃ua ñandutípe. Ypyguaite (ijypygua) @@ -1260,13 +1279,15 @@ Eiporavo tembipuru renda oĩha - Emoĩ tembipuru renda nde ykére. Eguereko yvy gotyo, térã emongu’e yvate gotyo. + Emoĩ tembipuru renda nde ykére. Eguereko yvy gotyo, térã emongu’e yvate gotyo. - Ne ñemigua + Ne ñemigua + + Ehechameme ne mba’ekuaarã - Rojapo %s eñangareko hag̃ua emoherakuãva ñandutípe rehe ha emoherakuãva orendive avei. + Rojapo %s eñangareko hag̃ua emoherakuãva ñandutípe rehe ha emoherakuãva orendive avei. Emoñe’ẽ ore marandu’i ñemigua diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6e24dd75e..2a89dd1a6 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -285,11 +285,15 @@ Ismerje meg személyre szabott kezdőlapját. Itt jelennek meg a legutóbbi lapok, könyvjelzők és keresési találatok. - Üdvözöljük egy független interneten + Üdvözöljük egy független interneten + + Üdvözöljük egy személyesebb interneten Több szín. Jobb adatvédelem. Ugyanaz az elkötelezettség: az emberek a profit előtt. - Váltson át a telefonról a laptopra és vissza + Váltson át a telefonról a laptopra és vissza + + A képernyők közötti váltás egyszerűbb, mint valaha Folytassa onnan, ahol abbahagyta, és most már a kezdőlapján megjelennek a többi eszközről származó lapjai is. @@ -477,6 +481,14 @@ Nézet + + Nem sikerült letölteni a háttérképet + + Próbálja újra + + Nem sikerült megváltoztatni a háttérképet + + További tudnivalók A háttérkép módosításához koppintson a Firefox kezdőlap logójára @@ -484,6 +496,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox logó – háttérkép megváltoztatása, gomb + + Klasszikus %s + + Korlátozott kiadás + + Az új Független hangok gyűjtemény. %s + + Az új Független hangok gyűjtemény. + + Próbáljon ki egy kis színt + + Válasszon olyan háttérképet, amely Önhöz szól. + + Fedezzen fel további háttérképeket + A kiegészítő nem támogatott @@ -1235,19 +1262,33 @@ - Üdvözli a %s! + Üdvözli a %s! + + Üdvözöljük egy jobb interneten + + Egy böngésző az emberekért, nem a haszonért. - A Firefox szinkronizálása az eszközök közt + A Firefox szinkronizálása az eszközök közt + + Folytassa ott, ahol abbahagyta - Adjon hozzá könyvjelzőket, előzményeket és jelszavakat a %1$shoz ezen az eszközön. + Adjon hozzá könyvjelzőket, előzményeket és jelszavakat a %1$shoz ezen az eszközön. + + Szinkronizálja a lapokat és a jelszavakat az eszközök között a zökkenőmentes képernyőváltás érdekében. - Regisztráció + Regisztráció + + Bejelentkezés A Sync be van kapcsolva - Mindig bekapcsolt adatvédelem + Mindig bekapcsolt adatvédelem + + Adatvédelem alapértelmezetten - A %1$s automatikusan megakadályozza, hogy a cégek titokban kövessék Önt a weben. + A %1$s automatikusan megakadályozza, hogy a cégek titokban kövessék Önt a weben. + + Bemutatkozik a Teljes sütivédelem, amely megakadályozza, hogy a nyomkövetők arra használhassák a sütiket, hogy kövessék a webhelyek között. Normál (alapértelmezett) @@ -1259,16 +1300,24 @@ Válassza ki az eszköztár elhelyezését - Helyezze az eszköztárat könnyen elérhető helyre. Tartsa az alján, vagy mozgassa a tetejére. + Helyezze az eszköztárat könnyen elérhető helyre. Tartsa az alján, vagy mozgassa a tetejére. + + Tartsa továbbra is lent, vagy vigye a tetejére. - Adatvédelem + Adatvédelem + + Ön irányítja az adatait - Úgy terveztük a %s böngészőt, hogy irányítást adjunk afelett, hogy mit oszt meg online, és mit oszt meg velünk. + Úgy terveztük a %s böngészőt, hogy irányítást adjunk afelett, hogy mit oszt meg online, és mit oszt meg velünk. + + A Firefox irányítást ad afelett, hogy mit oszt meg online, és mit oszt meg velünk. Olvassa el az adatvédelmi nyilatkozatunkat + + Készen áll, hogy egy csodálatos internetet nyisson ki? Böngészés megkezdése diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index 36a229ee2..e615d81ae 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -281,11 +281,15 @@ Դիտեք ձեր անհատականացված գլխավոր էջը: Վերջին ներդիրները, էջանիշները և որոնման արդյունքները կհայտնվեն այստեղ: - Բարի գալուստ անկախ համացանց + Բարի գալուստ անկախ համացանց + + Բարի գալուստ ավելի անձնական համացանց Ավելի շատ գույներ: Ավելի լավ գաղտնիություն: Նույն հանձնառությունը մարդկանց նկատմամբ շահույթի նկատմամբ: - Անցեք հեռախոսից նոութբուք և հետ + Անցեք հեռախոսից նոութբուք և հետ + + Էկրանների փոխարկումն ավելի հեշտ է, քան երբևէ Շարունակեք այնտեղ, որտեղ դադարեցիք, այլ սարքերի ներդիրներով՝ այժմ ձեր գլխավոր էջում: @@ -471,6 +475,14 @@ Պաստառն արդիացվեց: Տեսք + + Չհաջողվեց ներբեռնել պաստառը + + Կրկին փորձեք + + Չհաջողվեց փոխել պաստառը + + Իմանալ ավելին Փոխեք պաստառը՝ կտտացնելով Firefox-ի գլխավոր էջի պատկերանշանին @@ -478,6 +490,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox լոգոն` փոխել պաստառը, կոճակը + + Դասական %s + + Սահմանափակ թողարկում + + Անկախ ձայների նոր հավաքածուն։ %s + + Անկախ ձայների նոր հավաքածու։ + + Փորձեք գույն շաղ տալ + + Ընտրեք պաստառ, որը խոսում է ձեզ հետ: + + Ուսումնասիրեք ավելի շատ պաստառներ + Հավելումը չի աջակցվում @@ -1222,20 +1249,34 @@ - Բարի գալուստ %s: + Բարի գալուստ %s: + + Բարի գալուստ ավելի լավ համացանց + + Զննարկիչ, որը ստեղծված է մարդկանց համար, ոչ առևտրային: - Համաժամեցնել Firefox-ը + Համաժամեցնել Firefox-ը + + Շարունակեք այնտեղից, որտեղ որ կանգնել էիք: - Այս սարքում բերեք էջանիշները, պատմությունը և գաղտնաբառերը %1$s-ում: + Այս սարքում բերեք էջանիշները, պատմությունը և գաղտնաբառերը %1$s-ում: + + Համաժամացրեք ներդիրներն ու գաղտնաբառերը սարքերի միջև՝ էկրանն անխափան փոխելու համար: - Գրանցվել + Գրանցվել + + Մուտք գործել Համաժամեցումը միացված է - Միշտ գաղտնիություն + Միշտ գաղտնիություն + + Գաղտնիության պաշտպանություն սկզբնադիր - %1$s-ը ինքնաշխատ կանգնեցնում է ընկերություններին՝ Ձեզ առցանց հետևելուց: + %1$s-ը ինքնաշխատ կանգնեցնում է ընկերություններին՝ Ձեզ առցանց հետևելուց: + + Հատկանշվում է Total Cookie Protection-ը, որը թույլ չի տալիս հետագծողներին օգտագործել թխուկներ՝ կայքերում ձեզ հետապնդելու համար: Ստանդարտ (սկզբնադիր) @@ -1247,16 +1288,24 @@ Ընտրեք գործիքագոտու տեղը - Գործիքագոտին դրեք հեշտ հասանելի տեղ: Պահեք այն ներքևում կամ տեղափոխեք վերև: + Գործիքագոտին դրեք հեշտ հասանելի տեղ: Պահեք այն ներքևում կամ տեղափոխեք վերև: + + Պահեք այն ներքևում կամ տեղափոխեք այն վերև: - Ձեր գաղտնիությունը + Ձեր գաղտնիությունը + + Դուք վերահսկում եք ձեր տվյալները - Մենք պատրաստել ենք %s-ը, որպեսզի դուք կառավարեք այն, ինչ համօգտագործում եք առցանց և թե ինչով եք կիսվում մեզ հետ: + Մենք պատրաստել ենք %s-ը, որպեսզի դուք կառավարեք այն, ինչ համօգտագործում եք առցանց և թե ինչով եք կիսվում մեզ հետ: + + Firefox-ը ձեզ հնարավորություն է տալիս վերահսկել, թե ինչ եք կիսվում առցանց և ինչ եք կիսում մեզ հետ: Կարդացեք մեր գաղտնիության ծանուցումը + + Պատրա՞ստ եք բացել զարմանահրաշ համացանցը: Սկսել դիտարկումը diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 37cac051c..dc6b6ede6 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -1302,6 +1302,8 @@ Reprende de ubi tu lassava Apporta marcapaginas, chronologia e contrasignos de %1$s sur iste dispositivo. + + Synchronisa schedas e contrasignos inter apparatos pro facilemente mutar schermo. Inscribe te @@ -1314,6 +1316,8 @@ Preconfigurate pro le vita private %1$s automaticamente impedi le companias de sequer secretemente tu movimentos circum le Web. + + Eligente le Protection total del cookies, tu stoppa le traciatores de usar le cookies pro sequer te furtivemente circum le web. Standard (predefinite) @@ -1327,6 +1331,8 @@ Elige le ubication de tu barra del instrumentos Pone le barra del instrumentos pro attinger lo facilemente. + + Mantene lo fundo pagina o move lo in alto. Tu confidentialitate diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index c6e3df371..ac3a23442 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -281,11 +281,15 @@ Kynntu þér persónulegu upphafssíðuna þína. Nýlegir flipar, bókamerki og leitarniðurstöður munu birtast hér. - Velkomin á sjálfstætt internet + Velkomin á sjálfstætt internet + + Velkomin á persónulegra internet Fleiri litir. Betri persónuvarnir. Sama skuldbindingin sem setur fólk fram yfir hagnað. - Hoppaðu úr síma yfir í fartölvu og svo aftur til baka + Hoppaðu úr síma yfir í fartölvu og svo aftur til baka + + Það er auðveldara en nokkru sinni að skipta á milli skjáa Haltu áfram þar sem þú hættir með flipum af öðrum tækjum, sem núna eru á upphafssíðunni þinni. @@ -471,6 +475,14 @@ Bakgrunnur uppfærður! Skoða + + Gat ekki sótt bakgrunnsmynd + + Reyna aftur + + Gat ekki skipt um bakgrunnsmynd + + Kanna nánar Skiptu um bakgrunn með því að smella á táknmynd Firefox-heimasíðunnar @@ -478,6 +490,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox merki - breyta bakgrunni, hnappur + + Klassískt %s + + Takmörkuð útgáfa + + Nýja Independent Voices safnið. %s + + Nýja Independent Voices safnið. + + Prófaðu skvettu af lit + + Veldu bakgrunnsmynd sem talar til þín. + + Skoða fleiri bakgrunnsmyndir + Viðbót er ekki studd @@ -1218,20 +1245,34 @@ - Velkomin í %s! + Velkomin í %s! + + Velkomin á betra internet + + Vafri hannaður fyrir fólk, ekki gróða. - Samstilla Firefox á milli tækja + Samstilla Firefox á milli tækja + + Halda áfram þar sem frá var horfið - Komdu með bókamerki, feril og lykilorð yfir í %1$s á þessu tæki. + Komdu með bókamerki, feril og lykilorð yfir í %1$s á þessu tæki. + + Samstilltu flipa og lykilorð á milli tækja til að skipta óaðfinnanlega um skjái. - Skráðu þig + Skráðu þig + + Skrá inn Kveikt er á samstillingu - Sívökul friðhelgi + Sívökul friðhelgi + + Sjálfgefin persónuvernd - %1$s kemur sjálfkrafa í veg fyrir að fyrirtæki fylgi þér í laumi um vefinn. + %1$s kemur sjálfkrafa í veg fyrir að fyrirtæki fylgi þér í laumi um vefinn. + + Er með allsherjar-vefkökuvörn sem kemur í veg fyrir að rekjarar geti notað vafrakökur til að rekja slóð þína á milli vefsvæða. Staðlað (sjálfgefið) @@ -1244,15 +1285,23 @@ Veldu staðsetningu verkfærastikunnar - Settu verkfærastikuna innan seilingar. Haltu henni neðst eða færðu hana efst. + Settu verkfærastikuna innan seilingar. Haltu henni neðst eða færðu hana efst. + + Haltu því neðst eða færðu það efst. - Persónuvernd þín + Persónuvernd þín + + Þú stjórnar gögnunum þínum - Við hönnuðum %s til að gefa þér stjórn yfir því hverju þú deilir á netinu og því sem þú deilir með okkur. + Við hönnuðum %s til að gefa þér stjórn yfir því hverju þú deilir á netinu og því sem þú deilir með okkur. + + Firefox gefur þér stjórn yfir því hverju þú deilir á netinu og því sem þú deilir með okkur. Lestu persónuverndartilkynningu okkar + + Til í að opna ótrúlega frábært internet? Fara að vafra diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 7f4179092..d5922efd6 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -273,12 +273,12 @@ ພົບກັບໜ້າຫຼັກທີ່ເປັນສ່ວນຕົວຂອງທ່ານ. ແຖບຫຼ້າສຸດ, ບຸກມາກ, ແລະຜົນການຊອກຫາຈະປາກົດຢູ່ບ່ອນນີ້. - ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີບໍ່ມີຂອບຈຳກັດ + ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີບໍ່ມີຂອບຈຳກັດ ສີເພີ່ມເຕີມ. ຄວາມເປັນສ່ວນຕົວທີ່ດີກວ່າ. ຄໍາຫມັ້ນສັນຍາດຽວກັນກັບປະຊາຊົນຫຼາຍກວ່າກໍາໄລ. - ເລື່ອນຈາກໂທລະສັບໄປຫາແລັບທັອບ ແລະຫຼັງ + ເລື່ອນຈາກໂທລະສັບໄປຫາແລັບທັອບ ແລະຫຼັງ ເລືອກເບິ່ງຕໍ່ຈາກທີທ່ານປະໄວ້ດ້ວຍແຖບຈາກອຸປະກອນອື່ນໆໃນຫນ້າທໍາອິດຂອງທ່ານ. @@ -466,9 +466,20 @@ ເບິ່ງ + + ບໍ່ສາມາດດາວໂຫຼດວໍເປເປີໄດ້ + + ລອງໃຫມ່ອີກຄັ້ງ + + ຮຽນຮູ້ເພີ່ມເຕີມ ປ່ຽນຮູບວໍເປເປີໂດຍການແຕະໃສ່ໂລໂກ້ຂອງໜ້າຫຼັກຂອງ Firefox + + ຄລາດສິກ %s + + ມີ​ຈໍາ​ນວນ​ຈໍາ​ກັດ + Add-on ນີ້ແມ່ນບໍ່ໄດ້ຮັບການຊັບພອດ @@ -1226,17 +1237,17 @@ - ຍິນດີຕ້ອນຮັບສູ່ %s! + ຍິນດີຕ້ອນຮັບສູ່ %s! - Sync Firefox ລະຫວ່າງອຸປະກອນ + Sync Firefox ລະຫວ່າງອຸປະກອນ - ລົງ​ທະ​ບຽນ + ລົງ​ທະ​ບຽນ Sync ເປີດຢູ່ - ຄວາມເປັນສ່ວນຕົວເປີດຕະຫຼອດ + ຄວາມເປັນສ່ວນຕົວເປີດຕະຫຼອດ ມາດຕະຖານ (ຄ່າພື້ນຖານ) @@ -1246,7 +1257,7 @@ ເລືອກການຈັດວາງແຖບເຄື່ອງມືຂອງທ່ານ - ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ + ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງພວກເຮົາ diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2ea62f5f9..7a3dd7101 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -290,11 +290,15 @@ Maak kennis met uw gepersonaliseerde startpagina. Recente tabbladen, bladwijzers en zoekresultaten worden hier weergegeven. - Welkom bij een onafhankelijk internet + Welkom bij een onafhankelijk internet + + Welkom bij een meer persoonlijk internet Meer kleuren. Betere privacy. Dezelfde toewijding aan mensen boven winst. - Spring van telefoon naar laptop en terug + Spring van telefoon naar laptop en terug + + Van scherm wisselen is eenvoudiger dan ooit Ga verder waar u was gebleven met tabbladen van andere apparaten nu op uw startpagina. @@ -482,6 +486,14 @@ Weergeven + + Kan achtergrond niet downloaden + + Opnieuw proberen + + Kan achtergrond niet wijzigen + + Meer info Uw achtergrond wijzigen door op het Firefox-startpaginalogo te tikken @@ -489,6 +501,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo – de achtergrond, de knop wijzigen + + Klassieke %s + + Limited Edition + + De nieuwe collectie Independent Voices. %s + + De nieuwe collectie Independent Voices. + + Probeer een vleugje kleur + + Kies een achtergrond die u aanspreekt. + + Meer achtergronden verkennen + Add-on wordt niet ondersteund @@ -1237,19 +1264,33 @@ - Welkom bij %s! + Welkom bij %s! + + Welkom bij een beter internet + + Een browser gebouwd voor mensen, niet voor winst. - Synchroniseer Firefox tussen apparaten + Synchroniseer Firefox tussen apparaten + + Ga verder waar u was gebleven - Breng bladwijzers, geschiedenis en wachtwoorden naar %1$s op dit apparaat. + Breng bladwijzers, geschiedenis en wachtwoorden naar %1$s op dit apparaat. + + Synchroniseer tabbladen en wachtwoorden op verschillende apparaten voor naadloos schakelen tussen schermen. - Registreren + Registreren + + Aanmelden Synchronisatie is ingeschakeld - Privacy die altijd aan staat + Privacy die altijd aan staat + + Standaard privacybescherming - %1$s zorgt er automatisch voor dat bedrijven u niet stiekem volgen op internet. + %1$s zorgt er automatisch voor dat bedrijven u niet stiekem volgen op internet. + + Met Totale cookiebescherming om te voorkomen dat trackers cookies gebruiken om u stiekem op het internet te volgen. Standaard (standaard) @@ -1261,15 +1302,23 @@ Kies uw werkbalkplaatsing - Plaats de werkbalk binnen handbereik. Houd hem onderaan of verplaats hem naar boven. + Plaats de werkbalk binnen handbereik. Houd hem onderaan of verplaats hem naar boven. + + Houd hem onderaan, of verplaats hem naar boven. - Uw privacy + Uw privacy + + U beheert uw gegevens - We hebben %s ontworpen om u controle te geven over wat u online deelt en wat u met ons deelt. + We hebben %s ontworpen om u controle te geven over wat u online deelt en wat u met ons deelt. + + Firefox geeft u controle over wat u online deelt en wat u met ons deelt. Lees onze privacyverklaring + + Klaar om een geweldig internet te openen? Beginnen met surfen diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 1000e412e..95714c038 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -283,11 +283,11 @@ Fasètz coneissença amb vòstra pagina d’acuèlh personalizada. Onglets recents, marcapaginas e resultats de recèrca apreissaràn aicí. - La benvenguda a Internet independent + La benvenguda a Internet independent Mai de colors. Melhora confidencialitat. Meteis engatjament per las personas abans lo profièch. - Basculatz del mobil a l’ordenador e invèrsament + Basculatz del mobil a l’ordenador e invèrsament Tornatz ont èretz amb los onglets d’autres aparelhs que figuran ara per la pagina d’acuèlh. @@ -477,6 +477,14 @@ Visualizar + + Telecargament impossible del papièr pintrat + + Tornar ensajar + + Cambiament impossible del papièr pintrat + + Ne saber mai Cambiar lo fons d’ecran en tocant lo logotipe de Firefox de la pagina iniciala @@ -484,6 +492,14 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipe Firefox - cambiar lo fons d’ecran, boton + + %s classic + + Edicion limitada + + + Ensajatz de colors novèlas + Lo modul complementari es pas pres en carga @@ -1242,19 +1258,21 @@ - La benvenguda a %s ! + La benvenguda a %s ! - Sincronizar Firefox entre vòstres aparelhs + Sincronizar Firefox entre vòstres aparelhs - Importatz vòstres marcapaginas, vòstre istoric e vòstres senhals dins %1$s sus aqueste aparelh. + Importatz vòstres marcapaginas, vòstre istoric e vòstres senhals dins %1$s sus aqueste aparelh. - Se connectar + Se connectar + + Connexion Sincro. activada - Confidencialitat totjorn renfortida + Confidencialitat totjorn renfortida - %1$s empacha automaticament las entrepresas de vos pistar secrètament pel web. + %1$s empacha automaticament las entrepresas de vos pistar secrètament pel web. Estandard (per defaut) @@ -1266,12 +1284,12 @@ Causissètz ont conhar la barra d’aisinas - Plaçatz la barra d’aisinas a portada de man. Daissatz-la enbàs o ennaut. + Plaçatz la barra d’aisinas a portada de man. Daissatz-la enbàs o ennaut. - Vòstra vida privada + Vòstra vida privada - Concebèrem %s per vos donar lo contraròtle de çò que partejatz en linha e çò que partejatz amb nosautres. + Concebèrem %s per vos donar lo contraròtle de çò que partejatz en linha e çò que partejatz amb nosautres. Legissètz nòstra politica de confidencialitat diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index c4ebcf3b9..4ef23f217 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -270,11 +270,15 @@ ඔබගේ පුද්ගලීකකරණය කළ මුල් පිටුව බලන්න. මෑත පටිති, පොත්යොමු හා සෙවුම් ප්‍රතිඵල මෙහි දිස් වනු ඇත. - ස්වාධීන අන්තර්ජාලයකට පිළිගනිමු + ස්වාධීන අන්තර්ජාලයකට පිළිගනිමු + + වඩාත් පෞද්ගලික අන්තර්ජාලයකට පිළිගනිමු බොහෝ වර්ණ. ඉහළ පෞද්ගලිකත්‍වය. එලෙසම ලාභයට වඩා මිනිසුන්ට කැපවීම. - දුරකථනයෙන් පරිගණකයට සහ ආපසු + දුරකථනයෙන් පරිගණකයට සහ ආපසු + + තිර අතර මාරු වීම වෙනදාට වඩා පහසුය දැන් මුල් පිටුවේ තිබෙන අන් උපාංගවල පටිති සමඟ ඔබ නතර කළ තැනින් අතට ගන්න. @@ -461,12 +465,35 @@ බලන්න + + බිතුපත බාගැනීමට නොහැකි විය + + යළි උත්සාහය + + බිතුපත වෙනස් කළ නොහැකි විය + + තව දැනගන්න ෆයර්ෆොක්ස් මුල්පිටුවේ ලාංඡනය එබීමෙන් බිතුපත වෙනස් කරන්න ෆයර්ෆොක්ස් ලාංඡනය - බිතුපත සංශෝධනය, බොත්තම + + පරණ %s + + සීමිතයි + + නව ස්වාධීන හඬ එකතුව. %s + + නව ස්වාධීන හඬ එකතුව. + + වර්ණ කැලතීමක් බලන්න + + ඔබට කතා කරන බිතුපතක් තෝරන්න. + + තවත් බිතුපත් ගවේශනය + එක්කහුව සහාය නොදක්වයි @@ -1207,19 +1234,33 @@ - %s වෙත පිළිගනිමු! + %s වෙත පිළිගනිමු! + + නව්‍ය අන්තර්ජාලයකට පිළිගනිමු + + ලාභයට නොව මිනිසුන්ට තැනූ අතිරික්සුවකි. - උපාංග අතර ෆයර්ෆොක්ස් සමමුහූර්තය + උපාංග අතර ෆයර්ෆොක්ස් සමමුහූර්තය + + ඔබ නතර කළ තැනින් අරඹන්න - මෙම උපාංගයේ %1$s වෙත පොත්යොමු, ඉතිහාසය සහ මුරපද ගෙනෙන්න. + මෙම උපාංගයේ %1$s වෙත පොත්යොමු, ඉතිහාසය සහ මුරපද ගෙනෙන්න. + + බාධාවකින් තොරව තිර අතර මාරු වීමට උපාංගවල පටිති හා මුරපද සමමුහූර්ත කරන්න. - ලියාපදිංචිය + ලියාපදිංචිය + + පිවිසෙන්න සමමුහූර්තය සක්‍රියයි - සැමවිට සක්‍රිය පෞද්ගලිකත්‍වය + සැමවිට සක්‍රිය පෞද්ගලිකත්‍වය + + පෙරනිමි පෞද්ගලිකත්‍ව රැකවරණය - %1$s මගින් අන්තර්ජාලය පුරා ඔබව රහසිගතව ලුහුබඳින සමාගම් ස්වයංක්‍රීයව නවත්වයි. + %1$s මගින් අන්තර්ජාලය පුරා ඔබව රහසිගතව ලුහුබඳින සමාගම් ස්වයංක්‍රීයව නවත්වයි. + + පූර්ණ දත්තකඩ රැකවරණය මගින් වියමන පුරා දත්තකඩ භාවිතයෙන් ඔබ පසුපස හඹා එන ලුහුබඳින්නන් නවත්වයි. සම්මත (පෙරනිමි) @@ -1232,16 +1273,24 @@ මෙවලම් තීරුව ස්ථානගත කරන්න - මෙවලම් තීරුව පහසුවෙන් ළඟා වීමට හැකි තැනක තබන්න. එය පතුලේ තබා ගන්න, හෝ ඉහළට ගෙන යන්න. + මෙවලම් තීරුව පහසුවෙන් ළඟා වීමට හැකි තැනක තබන්න. එය පතුලේ තබා ගන්න, හෝ ඉහළට ගෙන යන්න. + + එය පතුලේ තබා ගන්න, හෝ මුදුනට ගෙන යන්න. - ඔබ‍‍ගේ පෞද්ගලිකත්‍වය + ඔබ‍‍ගේ පෞද්ගලිකත්‍වය + + ඔබ ඔබගේ දත්ත පාලනය කරයි - ඔබ මාර්ගගතව බෙදා ගන්නා දෑ සහ ඔබ අප සමඟ බෙදා ගන්නා දෑ පහසුවෙන් පාලනය කිරීමට %s නිර්මාණය කර ඇත. + ඔබ මාර්ගගතව බෙදා ගන්නා දෑ සහ ඔබ අප සමඟ බෙදා ගන්නා දෑ පහසුවෙන් පාලනය කිරීමට %s නිර්මාණය කර ඇත. + + ඔබ මාර්ගගතව බෙදා ගන්නා දෑ සහ ඔබ අප සමඟ බෙදා ගන්නා දෑ පහසුවෙන් පාලනය කිරීමට ෆයර්ෆොක්ස් ඉඩ සලසයි. අපගේ රහස්‍යතා දැන්වීම කියවන්න + + විස්මජනක අන්තර්ජාලයක් දැකීමට සූදානම්ද? පිරික්සුම අරඹන්න @@ -1356,7 +1405,7 @@ බොහෝ අඩවි පුරාවට ඔබගේ පිරික්සුම් දත්ත සම්පාදනය කිරීමට දැන්වීම් ජාල සහ විශ්ලේෂණ සමාගම් භාවිතා කරන දත්තකඩ අවහිර කරයි. - පූර්ණ දත්තකඩ ආරක්‍ෂණය ඔබ සිටින අඩවියට දත්තකඩ හුදකලා කරයි, එබැවින් දැන්වීම් ජාල වැනි ලුහුබැඳීම් සඳහා සියළු අඩවි පුරා ඔබට හඹායාමට ඒවා භාවිතා කිරීමට නොහැකිය. + පූර්ණ දත්තකඩ රැකවරණය ඔබ සිටින අඩවියට දත්තකඩ හුදකලා කරයි, එබැවින් දැන්වීම් ජාල වැනි ලුහුබැඳීම් සඳහා සියළු අඩවි පුරා ඔබට හඹායාමට ඒවා භාවිතා කිරීමට නොහැකිය. අනිෂ්ට අත්පත් සංඛ්‍යාංක මුදල් කැණීම සඳහා ඔබගේ උපාංගයට ප්‍රවේශ වීම වළක්වයි. diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 41e519ba9..f6e80f612 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -278,11 +278,13 @@ آپݨے ذاتی تھئے مکھ پنّے نال ملو۔ حالیہ ٹیباں، نشانیاں تے ڳولݨ نتیجے اتھ ظاہر تھیسن۔ - آزاد انٹرنیٹ وچ ست بسم اللہ + آزاد انٹرنیٹ وچ ست بسم اللہ ٻئے رنگ۔ چنگی رازداری۔ نفعے کنوں ودھ لوکاں نال پریت پالݨ۔ - فون سیٹ کنوں لیپ ٹاپ تے ہاپ کرو تے ولدا واپس وی + فون سیٹ کنوں لیپ ٹاپ تے ہاپ کرو تے ولدا واپس وی + + سکریناں سوئچ کرݨ ہݨ پہلے کنوں ٻہوں سوکھا ہے آپݨے مکھ پنّے تے ٻئی ڈیوائساں دے ٹیباں نال اُتھاؤں شروع کرو جتھوں تساں چھوڑیا ہائی۔ @@ -472,12 +474,19 @@ نظارہ + + ولدا کوشش کرو + + ٻیا سِکھو فائرفوکس مکھ پنے لوگو تے انگل پھیرݨ نال وال پیپر وٹاؤ فائر فوکس لوگو ــ وال پیپر وٹاؤ، بٹݨ + + محدود ایڈیشن + ایڈ ــ آن سہارا تھیا کائنی @@ -1231,20 +1240,22 @@ - %s وچ ست بسم اللہ! + %s وچ ست بسم اللہ! - ڈیوائساں دے درمیان فائرفوکس ہم وقت کرو + ڈیوائساں دے درمیان فائرفوکس ہم وقت کرو - ایں ڈیوائس تے کتاب نشانیاں، تاریخ تے پاس ورڈ %1$s تے گھن آؤ۔ + ایں ڈیوائس تے کتاب نشانیاں، تاریخ تے پاس ورڈ %1$s تے گھن آؤ۔ - سائن اپ + سائن اپ + + سائن ان ہم وقت کرݨ چالو ہے - ہمیشہ رازداری تے + ہمیشہ رازداری تے - %1$s خودکار طور تے کمپنیاں کوں ویب تے تہاکوں خفیہ فالو کرݨ کنوں روکیندے۔ + %1$s خودکار طور تے کمپنیاں کوں ویب تے تہاکوں خفیہ فالو کرݨ کنوں روکیندے۔ معیاری (پہلے کنوں مقرر) @@ -1256,13 +1267,13 @@ آپݨے ٹول بار دی جاء چُݨو - ٹول بار کوں سوکھی پہنچ آلی جاء تے رکھو۔ ایں کوں تل وچ رکھو یا چوٹی تے گھن ون٘ڄو۔ + ٹول بار کوں سوکھی پہنچ آلی جاء تے رکھو۔ ایں کوں تل وچ رکھو یا چوٹی تے گھن ون٘ڄو۔ - تہاݙی رازداری + تہاݙی رازداری - تساں جہڑی شئے تساں ساکوں شیئر کرو یا آن لائن شیئر کریندے ہو اوں کوں تہاݙے ڳاٻو وچ ݙیوݨ سانگے اساں %s کوں بݨایا ہے۔ + تساں جہڑی شئے تساں ساکوں شیئر کرو یا آن لائن شیئر کریندے ہو اوں کوں تہاݙے ڳاٻو وچ ݙیوݨ سانگے اساں %s کوں بݨایا ہے۔ ساݙا رازداری نوٹس پڑھو diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e0b1138c1..ef9678b99 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -284,11 +284,13 @@ Spoznajte svojo prilagojeno domačo stran. Tukaj bodo prikazani nedavni zavihki, zaznamki in zadetki iskanja. - Dobrodošli v neodvisnem internetu + Dobrodošli v neodvisnem internetu Več barve. Večja zasebnost. Enaka zavezanost ljudem namesto dobičku. - Skočite s telefona na računalnik in nazaj + Skočite s telefona na računalnik in nazaj + + Preklapljanje med zasloni je preprostejše kot kdajkoli prej Nadaljujte tam, kjer ste končali - z zavihki iz drugih naprav, ki so zdaj na vaši domači strani. @@ -478,12 +480,23 @@ Prikaži + + Ozadja ni bilo mogoče prenesti + + Ozadja ni bilo mogoče spremeniti + + Več o tem Spremeni ozadje z dotikom logotipa na domači strani Firefoxa Logtip Firefoxa – spremeni ozadje, gumb + + Poskusite s kančkom barve + + Raziščite več ozadij + Dodatek ni podprt @@ -1239,19 +1252,25 @@ - Dobrodošli v %s! + Dobrodošli v %s! + + Brskalnik, razvit za ljudi, ne za dobiček. - Sinhronizirajte Firefox med napravami + Sinhronizirajte Firefox med napravami + + Nadaljujte, kjer ste končali - Prinesite zaznamke, zgodovino in gesla v %1$s na tej napravi. + Prinesite zaznamke, zgodovino in gesla v %1$s na tej napravi. - Prijava + Prijava Sync je vklopljen - Vedno vključena zasebnost + Vedno vključena zasebnost + + Privzeta zaščita zasebnosti - %1$s samodejno prepreči, da bi vas podjetja skrivaj spremljala po spletu. + %1$s samodejno prepreči, da bi vas podjetja skrivaj spremljala po spletu. Običajno (privzeto) @@ -1263,13 +1282,15 @@ Izberite postavitev orodne vrstice - Postavite si orodno vrstico na doseg roke. Naj bo na dnu ali pa jo premaknite na vrh. + Postavite si orodno vrstico na doseg roke. Naj bo na dnu ali pa jo premaknite na vrh. - Vaša zasebnost + Vaša zasebnost - %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite na spletu in kaj delite z nami. + %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite na spletu in kaj delite z nami. + + Firefox vam omogoča nadzor nad tem, kaj delite na spletu in kaj delite z nami. Preberite naše obvestilo o zasebnosti diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 2b11211ea..69b453b48 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -288,11 +288,15 @@ Möt din personliga startsida. Senaste flikar, bokmärken och sökresultat kommer att visas här. - Välkommen till ett oberoende internet + Välkommen till ett oberoende internet + + Välkommen till ett mer personligt internet Mer färger. Bättre integritet. Samma åtagande att sätta människor före vinster. - Byt från telefon till laptop och tillbaka + Byt från telefon till laptop och tillbaka + + Att växla mellan skärmar är enklare än någonsin Fortsätt där du slutade med flikar från andra enheter, nu på din startsida. @@ -481,6 +485,14 @@ Visa + + Det gick inte att ladda ner bakgrundsbild + + Försök igen + + Det gick inte att ändra bakgrundsbild + + Läs mer Ändra bakgrundsbild genom att trycka på Firefox startsidas logotyp @@ -488,6 +500,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox logotyp - knapp för att ändra bakgrundsbild + + Klassisk %s + + Begränsad utgåva + + Den nya Independent Voices-kollektionen. %s + + Den nya Independent Voices-kollektionen. + + Prova en skvätt färg + + Välj den perfekta bakgrundsbilden för dig. + + Utforska fler bakgrundsbilder + Tillägg stöds inte @@ -1239,20 +1266,34 @@ - Välkommen till %s! + Välkommen till %s! + + Välkommen till ett bättre internet + + En webbläsare byggd för människor, inte för vinster. - Synkronisera Firefox mellan enheter + Synkronisera Firefox mellan enheter + + Fortsätt där du slutade - Ta med bokmärken, historik och lösenord till %1$s på den här enheten. + Ta med bokmärken, historik och lösenord till %1$s på den här enheten. + + Synkronisera flikar och lösenord mellan enheter för smidig skärmväxling. - Registrera dig + Registrera dig + + Logga in Synkronisering är på - Alltid med integritet + Alltid med integritet + + Integritetsskydd som standard - %1$s hindrar automatiskt företag från att i hemlighet följa dig på nätet. + %1$s hindrar automatiskt företag från att i hemlighet följa dig på nätet. + + Totalt skydd mot kakor hindrar spårare från att använda kakor för att förfölja dig mellan webbplatser. Standard @@ -1264,16 +1305,24 @@ Välj plats för verktygsfältet - Placera verktygsfältet inom räckhåll. Ha den på botten eller flytta den till toppen. + Placera verktygsfältet inom räckhåll. Ha den på botten eller flytta den till toppen. + + Behåll den på botten eller flytta den till toppen. - Din integritet + Din integritet + + Du kontrollerar din data - Vi har utformat %s för att ge dig kontroll över vad du delar online och vad du delar med oss. + Vi har utformat %s för att ge dig kontroll över vad du delar online och vad du delar med oss. + + Firefox ger dig kontroll över vad du delar online och vad du delar med oss. Läs vår sekretesspolicy + + Är du redo att öppna upp ett fantastiskt internet? Börja surfa diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index d7b7b941c..cbae94f1a 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -285,11 +285,15 @@ Бо саҳифаи асосии шахсии худ шинос шавед. Варақаҳо, хатбаракҳо ва натиҷаҳои ҷустуҷӯи охирин дар ин ҷо пайдо мешаванд. - Хуш омадед ба Интернети мустақил + Хуш омадед ба Интернети мустақил + + Хуш омадед ба Интернети хусуситар Рангҳои бештар. Махфияти беҳтар. Худи ҳамон вазифадорӣ ба одамон, на ба даромадҳо. - Аз телефон ба ноутбук ба баръакс гузаред + Аз телефон ба ноутбук ба баръакс гузаред + + Табдилдиҳии экранҳо боз ҳам осонтар шудааст Ҳамаи он ҷойҳоеро, ки шумо дар варақаҳо аз дастгоҳҳои дигар дидаед, дар саҳифаи асосии худ ба даст оред. @@ -473,6 +477,14 @@ Тасвири замина навсозӣ карда шуд! Намоиш + + Тасвири замина боргирӣ карда нашуд + + Аз нав кӯшиш кардан + + Тасвири замина иваз карда нашуд + + Маълумоти бештар Тасвири заминаро бо зеркунии тамғаи саҳифаи асосии «Firefox» иваз намоед @@ -480,6 +492,22 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Тамғаи «Firefox» - иваз кардани тасвири замина, тугма + + Классикӣ - %s + + Нашри маҳдуд + + Маҷмуаи нави «Овозҳои мустақил». %s + + Маҷмуаи нави «Овозҳои мустақил». + + Чакраҳои рангро кӯшиш намоед + + + Тасвири заминаеро интихоб кунед, ки ба шумо ҳикоят мекунад. + + Тасвирҳои заминаи дигарро озмоед + Ҷузъи иловагӣ дастгирӣ намешавад @@ -1231,19 +1259,33 @@ - Хуш омадед ба «%s!» + Хуш омадед ба «%s!» + + Хуш омадед ба Интернети беҳтар + + Браузере, ки барои мардум, на барои даромад сохта шудааст. - Firefox-ро байни дастгоҳҳо ҳамоҳанг кунед + Firefox-ро байни дастгоҳҳо ҳамоҳанг кунед + + Ба он ҷое, ки шумо ба қарибӣ тамошо кардаед, баргардонед - Хатбаракҳо, таърих ва ниҳонвожаҳоро ба %1$s дар ин дастгоҳ интиқол диҳед. + Хатбаракҳо, таърих ва ниҳонвожаҳоро ба %1$s дар ин дастгоҳ интиқол диҳед. + + Барои гузариши бехалал байни экранҳои дастгоҳҳои худ, варақаҳо ва ниҳонвожаҳоро ҳамоҳанг созед. - Бақайдгирӣ + Бақайдгирӣ + + Ворид шудан Ҳамоҳангсозӣ фаъол аст - Махфияти доимӣ + Махфияти доимӣ + + Муҳофизати махфият ба таври пешфарз кор мекунад - %1$s маъракаҳоеро, ки шуморо дар атрофи Интернет пинҳонӣ пайгирӣ мекунанд, ба таври худкор қатъ мекунад. + %1$s маъракаҳоеро, ки шуморо дар атрофи Интернет пинҳонӣ пайгирӣ мекунанд, ба таври худкор қатъ мекунад. + + Хусусияти «Муҳофизати пурра аз кукиҳо» васоити пайгириро аз истифодаи кукиҳо қатъ мекунад, то ки онҳо шуморо дар шабака ба таври пинҳонӣ пайгирӣ накунанд. Стандартӣ (пешфарз) @@ -1255,15 +1297,23 @@ Ҷойгиркунии навори абзорҳои худро интихоб кунед - Навори абзорҳоро барои дастрасии осон дар наздикӣ ҷойгир намоед. Онро дар поён нигоҳ доред ё ба боло гузоред. + Навори абзорҳоро барои дастрасии осон дар наздикӣ ҷойгир намоед. Онро дар поён нигоҳ доред ё ба боло гузоред. + + Онро дар поён нигоҳ доред ё ба боло ҳаракат кунед. - Махфияти шумо + Махфияти шумо + + Шумо маълумоти худро идора мекунед - Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн ва бо мо мубодила мекунед, идора намоед. + Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн ва бо мо мубодила мекунед, идора намоед. + + Браузери «Firefox» имкон медиҳад, ки шумо тавонед он чизҳоеро, ки дар онлайн ва бо мо мубодила мекунед, мустақилона идора намоед. Огоҳиномаи махфияти моро хонед + + Шумо барои боз кардани Интернети ҳайратангез омода ҳастед? Оғоз кардани тамошокунӣ diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9a718d656..3b03db096 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -284,11 +284,15 @@ Зустрічайте свою персоналізовану домівку. Тут з’являтимуться останні вкладки, закладки та результати пошуку. - Вітаємо у незалежному інтернеті + Вітаємо у незалежному інтернеті + + Вітаємо у персоналізованому інтернеті Більше кольорів. Краща приватність. Та ж сама відданість людям, а не прибутку. - Перемикайтеся між телефоном і комп’ютером + Перемикайтеся між телефоном і комп’ютером + + Перемикати екрани стало простіше, ніж будь-коли Продовжуйте з того ж місця, де зупинилися, завдяки вкладкам з інших пристроїв, які відтепер доступні на вашій домашній сторінці. @@ -479,6 +483,14 @@ Переглянути + + Не вдалося завантажити шпалери + + Повторити спробу + + Не вдалося змінити шпалери + + Докладніше Змінювати шпалери торканням логотипу домівки Firefox @@ -486,6 +498,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Логотип Firefox - змінити шпалери, кнопка + + Класичні %s + + Обмежений випуск + + Нова колекція Незалежні Голоси. %s + + Нова колекція Незалежні Голоси. + + Спробуйте сплеск кольорів + + Оберіть свій тип шпалер. + + Перегляньте інші шпалери + Додаток не підтримується @@ -1232,21 +1259,35 @@ - Вітаємо в %s! + Вітаємо в %s! + + Ласкаво просимо до кращого інтернету + + Браузер, створений для людей, а не для прибутку. - Синхронізуйте Firefox між пристроями + Синхронізуйте Firefox між пристроями + + Продовжуйте звідти, де зупинилися - Перенесіть свої закладки, історію та паролі у %1$s на цьому пристрої. + Перенесіть свої закладки, історію та паролі у %1$s на цьому пристрої. + + Синхронізуйте вкладки та паролі на всіх пристроях для плавного перемикання між ними. - Зареєструватись + Зареєструватись + + Увійти Синхронізація увімкнена - Постійна приватність + Постійна приватність + + Типовий захист приватності - %1$s автоматично блокує таємне стеження компаній за вами в інтернеті. + %1$s автоматично блокує таємне стеження компаній за вами в інтернеті. + + Функція повний захист кук не дає змогу елементам стеження переслідувати вас на різних сайтах за допомогою кук. Стандартний (типово) @@ -1258,17 +1299,25 @@ Оберіть розташування панелі інструментів - Розташуйте панель для легкого доступу. Тримайте її внизу, або перемістіть вгору. + Розташуйте панель для легкого доступу. Тримайте її внизу, або перемістіть вгору. + + Залиште її внизу або перемістіть угору. - Ваша приватність + Ваша приватність + + Ви контролюєте свої дані - Ми створили %s, щоб надати вам контроль над тим, чим ви ділитесь в Інтернеті та з нами. + Ми створили %s, щоб надати вам контроль над тим, чим ви ділитесь в Інтернеті та з нами. + + Firefox надає вам контроль над тим, чим ви ділитесь в інтернеті та з нами. Повідомлення про приватність + + Готові відкрити дивовижний інтернет? Почати перегляд diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 0e0eb91aa..b60038145 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -281,11 +281,15 @@ Gặp gỡ trang chủ được cá nhân hóa của bạn. Các thẻ, dấu trang và kết quả tìm kiếm gần đây sẽ xuất hiện ở đây. - Chào mừng bạn đến với internet độc lập + Chào mừng bạn đến với internet độc lập + + Chào mừng bạn đến với một Internet cá nhân hơn Màu sắc mới. Riêng tư hơn. Cùng cam kết với mọi người vì lợi nhuận. - Chuyển từ điện thoại sang máy tính xách tay và ngược lại + Chuyển từ điện thoại sang máy tính xách tay và ngược lại + + Chuyển đổi màn hình dễ dàng hơn bao giờ hết Tiếp tục nơi bạn đã dừng lại với các thẻ từ các thiết bị khác ngay bây giờ trên trang chủ của bạn. @@ -471,6 +475,14 @@ Đã cập nhật hình nền! Hiển thị + + Không thể tải xuống hình nền + + Thử lại + + Không thể thay đổi hình nền + + Tìm hiểu thêm Thay đổi hình nền bằng cách nhấn vào biểu trưng trang chủ của Firefox @@ -478,6 +490,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - thay đổi hình nền, nút + + %s cổ điển + + Phiên bản giới hạn + + Bộ sưu tập Tiếng nói độc lập mới. %s + + Bộ sưu tập Tiếng nói độc lập mới. + + Thử một chút màu sắc + + Chọn một hình nền nói lên bạn. + + Khám phá các hình nền khác + Tiện ích mở rộng không được hỗ trợ @@ -1217,19 +1244,33 @@ - Chào mừng đến với %s! + Chào mừng đến với %s! + + Chào mừng bạn đến với một internet tốt hơn + + Một trình duyệt được xây dựng cho mọi người, không vì lợi nhuận. - Đồng bộ hóa Firefox giữa các thiết bị + Đồng bộ hóa Firefox giữa các thiết bị + + Tiếp tục trang mà bạn vừa rời khỏi - Mang dấu trang, lịch sử và mật khẩu vào %1$s trên thiết bị này. + Mang dấu trang, lịch sử và mật khẩu vào %1$s trên thiết bị này. + + Đồng bộ hóa các thẻ và mật khẩu trên các thiết bị để chuyển đổi màn hình liền mạch. - Đăng ký + Đăng ký + + Đăng nhập Đồng bộ hóa được bật - Luôn bảo vệ quyền riêng tư + Luôn bảo vệ quyền riêng tư + + Bảo vệ quyền riêng tư theo mặc định - %1$s tự động ngăn các công ty bí mật theo dõi bạn trên web. + %1$s tự động ngăn các công ty bí mật theo dõi bạn trên web. + + Trình chống cookie chung ngăn trình theo dõi sử dụng cookie để theo dõi bạn trên các trang web. Tiêu chuẩn (mặc định) @@ -1241,15 +1282,23 @@ Chọn vị trí thanh công cụ của bạn - Đặt thanh công cụ trong tầm với. Giữ nó ở dưới cùng hoặc di chuyển nó lên trên cùng. + Đặt thanh công cụ trong tầm với. Giữ nó ở dưới cùng hoặc di chuyển nó lên trên cùng. + + Giữ nó ở dưới cùng hoặc di chuyển nó lên trên cùng. - Quyền riêng tư của bạn + Quyền riêng tư của bạn + + Bạn kiểm soát dữ liệu của mình - Chúng tôi đã thiết kế %s để cung cấp cho bạn quyền kiểm soát những gì bạn chia sẻ trực tuyến và những gì bạn chia sẻ với chúng tôi. + Chúng tôi đã thiết kế %s để cung cấp cho bạn quyền kiểm soát những gì bạn chia sẻ trực tuyến và những gì bạn chia sẻ với chúng tôi. + + Firefox cho phép bạn kiểm soát những gì bạn chia sẻ trực tuyến và những gì bạn chia sẻ với chúng tôi. Đọc thông báo bảo mật của chúng tôi + + Sẵn sàng để mở ra một internet tuyệt vời? Bắt đầu duyệt web diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b4d80b027..a259ff7db 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -292,11 +292,15 @@ 认识您的个性化主页。这里将显示最近的标签页、书签和搜索结果。 - 欢迎开启不受巨头左右的互联网世界 + 欢迎开启不受巨头左右的互联网世界 + + 欢迎进入更个性化的互联网 更靓、更保护隐私,但始终不变的是以人为本的承诺。 - 全平台快速切换 + 全平台快速切换 + + 多屏切换更顺手 您现在从主页就可以继续浏览其他设备上的标签页。 @@ -486,6 +490,14 @@ 查看 + + 无法下载壁纸 + + 重试 + + 无法更换壁纸 + + 详细了解 点按 Firefox 主页徽标以更换壁纸 @@ -493,6 +505,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox 徽标 - 也是更换壁纸的按钮 + + %s 经典 + + 限定版 + + 全新“凡人之声”壁纸集。%s + + 全新“凡人之声”壁纸集。 + + 试用新色彩 + + 选择适合您的壁纸。 + + 探索更多壁纸 + 不支持的附加组件 @@ -1271,19 +1298,33 @@ - 欢迎使用 %s! + 欢迎使用 %s! + + 欢迎进入更美好的互联网 + + 生为民,不谋利的浏览器。 - 在设备之间同步 Firefox + 在设备之间同步 Firefox + + 从上次看到的地方继续 - 将 %1$s 的书签、历史记录和密码带到此设备。 + 将 %1$s 的书签、历史记录和密码带到此设备。 + + 跨设备同步标签页和密码,实现无缝浏览体验。 - 注册 + 注册 + + 登录 同步已开启 - 隐私与您同行 + 隐私与您同行 + + 默认启用隐私保护 - %1$s 会自动阻止大公司在网上偷偷跟踪您。 + %1$s 会自动阻止大公司在网上偷偷跟踪您。 + + “全方位 Cookie 保护”功能可阻止跟踪器借 Cookie 跨站跟踪您。 标准(默认) @@ -1295,15 +1336,23 @@ 选择您的工具栏位置 - 将工具栏放在顺手的位置。可以留在底部,或移到顶部。 + 将工具栏放在顺手的位置。可以留在底部,或移到顶部。 + + 将工具栏置于底部,或移至顶部。 - 您的隐私权 + 您的隐私权 + + 数据由自己掌控 - %s 的设计旨在让您可以控制要在网上披露哪些内容,以及告诉我们哪些信息。 + %s 的设计旨在让您可以控制要在网上披露哪些内容,以及告诉我们哪些信息。 + + Firefox 让您可以控制要在网上披露哪些内容,以及告诉我们哪些信息。 阅读我们的隐私声明 + + 准备好探索精彩互联网了吗? 开始上网 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9009b4506..01a5ace7c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -286,11 +286,15 @@ 了解您的個人化首頁。這裡將顯示最近開啟過的分頁、書籤、搜尋結果。 - 歡迎來到一個更加獨立的網路環境 + 歡迎來到一個更加獨立的網路環境 + + 歡迎使用更加個人化的網頁瀏覽器 更多色彩、更加保護您的隱私,依然承諾把人們看得比利益更重要。 - 在手機與筆電間快速切換 + 在手機與筆電間快速切換 + + 切換畫面變得更容易 現在起,直接從首頁就可以繼續瀏覽其他裝置上開啟的分頁。 @@ -480,6 +484,14 @@ 檢視 + + 無法下載背景圖 + + 重試 + + 無法變更背景圖 + + 了解更多 點擊 Firefox 首頁的圖示即可更改背景圖 @@ -487,6 +499,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox 圖示,點擊此圖示變更背景圖 + + 經典 %s + + 限量版 + + 全新的獨立之聲系列。%s + + 全新的獨立之聲系列。 + + 試用新色彩 + + 選擇有您的風格的背景圖。 + + 探索更多背景圖 + 不支援的附加元件 @@ -1260,20 +1287,34 @@ - 歡迎使用 %s! + 歡迎使用 %s! + + 歡迎來到更好的網路環境 + + 一套為人們,而不為利益打造的瀏覽器。 - 在不同裝置間同步 Firefox + 在不同裝置間同步 Firefox + + 從結束的地方繼續 - 將 %1$s 上的書籤、瀏覽紀錄、網站密碼帶到此裝置。 + 將 %1$s 上的書籤、瀏覽紀錄、網站密碼帶到此裝置。 + + 在不同裝置間同步分頁、密碼,讓您無縫切換裝置。 - 註冊 + 註冊 + + 登入 已開啟 Sync - 隨時都有隱私保護 + 隨時都有隱私保護 + + 預設開啟隱私保護 - %1$s 會自動封鎖讓大企業在網路上偷偷跟蹤您的程式。 + %1$s 會自動封鎖讓大企業在網路上偷偷跟蹤您的程式。 + + 「全方位 Cookie 保護」功能可防止追蹤器透過 Cookie 在網路上追蹤您。 標準(預設) @@ -1285,15 +1326,23 @@ 挑選工具列要放置的位置 - 可以將工具列放在畫面底端或頂端,容易操作的地方。 + 可以將工具列放在畫面底端或頂端,容易操作的地方。 + + 放在畫面底部或頂端都沒問題。 - 您的隱私權 + 您的隱私權 + + 自行控制自己的資料 - 我們將 %s 設計成讓您可以完整控制要在網路上分享哪些東西、以及與我們分享哪些東西。 + 我們將 %s 設計成讓您可以完整控制要在網路上分享哪些東西、以及與我們分享哪些東西。 + + Firefox 讓您可自行控制要在網路上分享哪些東西、以及與我們分享哪些東西。 閱讀我們的隱私權公告 + + 準備好探索驚人的網路世界了嗎? 開始上網 From 103a0cb250c5101b3847bda1fb1bf510e04e60cb Mon Sep 17 00:00:00 2001 From: Mugurell Date: Thu, 15 Sep 2022 14:57:28 +0300 Subject: [PATCH 025/407] For #26644 - Split the Fenix logo in two images This will allow us applying a certain tint just for the image containing a text to have a better contrast with wallpapers. --- .../beta/res/drawable/ic_wordmark_logo.png | Bin 0 -> 21990 bytes .../res/drawable/ic_wordmark_text_normal.png | Bin 0 -> 10762 bytes .../res/drawable/ic_wordmark_text_private.png | Bin 0 -> 10114 bytes .../main/res/drawable/ic_wordmark_logo.png | Bin 0 -> 19563 bytes .../res/drawable/ic_wordmark_text_normal.png | Bin 0 -> 19677 bytes .../res/drawable/ic_wordmark_text_private.png | Bin 0 -> 15494 bytes app/src/main/res/layout/fragment_home.xml | 28 ++++++++++++++---- app/src/main/res/values-night/styles.xml | 5 ++++ app/src/main/res/values/attrs.xml | 2 ++ app/src/main/res/values/dimens.xml | 2 ++ app/src/main/res/values/styles.xml | 3 ++ .../nightly/res/drawable/ic_wordmark_logo.png | Bin 0 -> 23059 bytes .../res/drawable/ic_wordmark_text_normal.png | Bin 0 -> 13574 bytes .../res/drawable/ic_wordmark_text_private.png | Bin 0 -> 12389 bytes app/src/nightly/res/values/dimens.xml | 9 ++++++ .../release/res/drawable/ic_wordmark_logo.png | Bin 0 -> 21990 bytes .../res/drawable/ic_wordmark_text_normal.png | Bin 0 -> 10762 bytes .../res/drawable/ic_wordmark_text_private.png | Bin 0 -> 10114 bytes 18 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 app/src/beta/res/drawable/ic_wordmark_logo.png create mode 100644 app/src/beta/res/drawable/ic_wordmark_text_normal.png create mode 100644 app/src/beta/res/drawable/ic_wordmark_text_private.png create mode 100644 app/src/main/res/drawable/ic_wordmark_logo.png create mode 100644 app/src/main/res/drawable/ic_wordmark_text_normal.png create mode 100644 app/src/main/res/drawable/ic_wordmark_text_private.png create mode 100644 app/src/nightly/res/drawable/ic_wordmark_logo.png create mode 100644 app/src/nightly/res/drawable/ic_wordmark_text_normal.png create mode 100644 app/src/nightly/res/drawable/ic_wordmark_text_private.png create mode 100644 app/src/nightly/res/values/dimens.xml create mode 100644 app/src/release/res/drawable/ic_wordmark_logo.png create mode 100644 app/src/release/res/drawable/ic_wordmark_text_normal.png create mode 100644 app/src/release/res/drawable/ic_wordmark_text_private.png diff --git a/app/src/beta/res/drawable/ic_wordmark_logo.png b/app/src/beta/res/drawable/ic_wordmark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9e92e078bb54c5a7ba98da7124e24ea23edec216 GIT binary patch literal 21990 zcmV(|K+(U6P)rz(5D1JlQv01Y$t68(#+UQXP!>y znbdO9r%lqCfZIt)rcG>;nIvr{;3REH16VSFgu8757#o9R@LiU5WJyQo^6&l4x_sZa zzP0{ek}r}ixmwbH_HFI8*X3RBcUfz%?QkZXGJzidF`!+#4v)M46WvpnxGQ%p;6)S~ zoCz;@Ald=izx`q~OFQudej8mk0M>8Ai!7W0+Y20sJewW<(zWP!U%~>-qb0z_fBy_G zvfywgydWX485Zsuc#z%b4{yN14%k~pL5Hi|mH%lMUL@fRv%LU;fp#$_x}69>8+tZd zpl~JqA_b5`k6u*lc81xW=Mcr_!s?Znpbz_lxrncYE`iOq2Bp~k_b&IUkKTqCK{x}p z=P?jn>p}Iz8_{n*><z$%RNyQc1#MS>3@G$9Wi$aL+4whj{p|*vX5oy^b^=4v(>`;t2ionvYUlKV z69a&&d&L9o;4mG_X~HuN`_VR6dHrnQV(-9s=JLf7Lbh!8C}>g zaoV^;&VcO%geX4SgWk;%W@#{pEXb_RChS%Kic0GgnN7KK`U3}^q3}=|_ zxrT?mQP8!cZjKP@;}AMSeUYtPB}(PjmBUu*a~s2UF}|AxwYSsmx6a`d4QIgiTthST zqLZ$Ppz8Qs7$K-xDB{JqIus;bX$*iy8FAFHo6p+^5M2x!e)v?iP|twvxrUY18w=M) zU@mf%Gq+OWtaa&JB}J<^BbF$oZEU%&V!gP3B?hOag?dJ3dk%qi&(C>1ZFd5UGa}BF zAaX)m!N(S+6}3jR3e`z)J4Nj5pyn&7W z-^;e)%7b_M#@T_UIsKOvSZ(JM(2(>r0bSU3qPvX&p)(>=0EICu7n;TbQg0v}#otzn z@C3f#gL}X47^lSB_0J2~=s#X^J=U-6MAOZsO7C#m2kNdL5ucqEn{uryfhVGIEa>Fe z8W0v-ly9&u5J|&6Jd4#?G`$a>3NDe84mSFu3*V3a@B_a5gQAz8#(}=_x@{gn+Z15J zaJ3jMtkkY5yBi}uF$z36IbwuV_W)x=tcuo)(Ja5*u4KBdV!m`gG7G85gQcTUV2ueDaK*8?Nv|~?a4VkSUN|4zNdX(( za?Tw3>wk|=FxKt?oFSZ#Yqly=Qi(Ko7%1K1%zMIWF~4Vkp~#UYAPijr3fTK(Iio~Jx(

M{yhU=drpVCL>!|FfRd*|qmh8w#6W*bX8mF5X)j*DInW?Ml!H$~>WKTKV#CpM z!3XziUVocM72?8#ySESM(YIZX6C6$m*yue$w0K7Ayy$F=9@ELT8}&O4o*CHamiYnw z-s|6w)&sf?&q3CW;<_xf2hT?cZ%h@AS{Tq(;EF#O{mmQ~;!-KDe3pX9Fr2jpT-|)* z?gvKnx1`QEui|`|9w{wU=XQi8Zx(z#&(gzh`&NDZxrFBoHk#i)z$+j52&kEpiKP*6 zwxTim zW1)Rb`REUI)wZx;sREQ?Oc9^fGA$DdVHT?^w~tt;18--oOx_%4k#xA79(?l&F}$8T zv%Tr=TRhOVX+;-|1_m0XSJ$lnscoND0qEbqJ`4#3pv`G|@kb0gq~8i1z{w6xvrUzF zWiTTat(dG`Bek`vgYj}N|DodmuYOYtmFTrBXpIjImgQpni!o7JsFB?!hYLRHhY;RV zMe`-kaM$2DhUWw}`n7Xz#D*i=mCXX6TC1b*HUiF-I*oJ3Wj6XZufGv1xYe`SAOlUF zwY~y(D6^0S6cPYh7()S-ZbPp=TH17j z*U#SnhFg5x9kEe{46fFugWPE0{L<3%Fy89(tPBJcLr_*P-5<2W7j!iOZQBS-#%&EcbFFJn{xD2@d#YlqT57=@ zcLqr6@-Pgz+E(`pKy6$a4-Pw0;OYm%oU4q3$^(**T8vccT4I?-cI&-C(+xnI@<8jlZK`<33!KJ~ z#()n-cUyN-!A3i`4TNb9Ke5^5kJ-su+J$(Pc*x}zwhBK1oMlD;%7U7KI!CUIceJ6b zqns`?WsZrq7y8@UKKc5;xriUE)TZ}gJj39gNo3mL9k=N1F4lhyqXgj>j(d)eU4n6s zpCH#lM#H&A;B?aoPh9=*Y5Tr z-doH4-Zt0aB7bVm{{~*B%n^fun0dnA>9Zcg+OzgzaNz@3yXlFzoqfr-F|qE5__R{6 z`!f0vw$qa+MiF!?ViFi{S(+#UZX0>*sDr~%E#3_D{oY!>%3Zu`Ph52R!3W>yPu{L+ za25FY|I;%Wg?MIQ`)3z=pn1JT03SdU_9v0#MfNoGWbmKVl{M zYrUJpZ--OdILxZ(?sD(_)Ro68O9a^xuJ6d*;6XD;?ZSZ4TCoi-Oy=@FEW35AZux&+ zXA9d-8Lrd)u507<&hKCP`oF@qANwfQZ{44t7s|Y5lG$#I_*6EFXdk_1kwtdLH1YAs zKs#6JEdF@E&-f*tVivH+J9m4%Z;hmrrcQ-7xpv?<;pu_xpU&Ot0d!3U1S`Ew1vmu} zDm@MvOme;FN`1~5T~GJz^d#A*biVasXK@-hxWVs7R#(^Cr-17eXyLf^qXz+eFP;A^uKc_I6&oVc z`3Fo+B#|o2WZf5IM+T7NI2C^wZPw%IYWk--hk&~XBzo{|4&90en^&Wd>x!SXA2e~? zr5}z9Hu_&Lz1BbRmI#u9*)Ym*`r<4Ss02j9T!q0<>0b&)Brr$)%<4BT0Z!+U2^jtU zQ!~KAOvv6F-T&~ZU3D4$_@9SnqV6ybmkrUyVy$6QfQqv@{SqUeIenYCub;@>~ z0xq3Ptk$w>6Trso*0t$4Y<=9z=0At4e&S=;5SVUiist~9#|RCM7dpC8owNFb`I+;DKg~gBfV6zR z@W~PT%gDsz{jNbVeMc*dd#)YO4%cT60_Q*G?Zrd$HtWHvyzP5;-|27tKn=98ZCv`+ zV#DW(<4CeD#|v8|5IT;R(($o8=;OJD&$}iA+VNd{%}%nE`|jKM8vN=1_78CH$Gz&a zvV!sNG@$$yFV_g8S(H%T=(P%1?zlipk(~Fv4bSzU>-{mTo(vekHuLn2zcG(vgkv%r z{V$hZ>o>QQmZue&fG&WdEXR7(hz=*`-BI*7W-}{RmF;o^mAV{fU)?29-`U~bzUL+n zwCjBuJ49qA&@?KM6f96`Gi2g&MRJ2sA&DqUnZRN|Ax1l~NLi0laVq=FXo1<Sl_$5mXs*TF7ap@iws5-QK_UErib@ zp{Xf9gq`k^j~|uYjt#bdeCci&V-<9H3(zM{J^*8y2 zFwSrg@hba19NvHap4)%xgLA``4a`mrGfpb9Fj*F+Tp1B?Wg|o@lvIG`eMeC*%gcH& z=xV@KMnWe#TmV-v8mMK^wGo5?aO=13!#jWVcd_9mhml3)(L}1bUYsvlvSKU)RNKJ{ zhq47-jJMOv_&32VvkSz6+3`KmI=b3j_VHa96M8sGpc^i`)+cane%?`VX?vQh3u7s_ zzK)#97=c+$^njuu7*F|DG?)sWoIW_X@RfJqk^6oKt1B}KPUqbVju|oRr#4DRjv_7W z$X1w>lHR6_sMfJVp6ZUW;US%oD(jW6b=|sX*yQj>T@%@IC`q!Hi0OYlKC!t|nR_oY4bg z{00Xf8Q_m@_;Gygzq}&rWMg$!Gm`{k;uW&40&Fc}!@HGDXU%VAx`_HdHHVRB9v*+x5x?*k}m8_V-lYZpJpU-TC3_SM+-v$G1 zQ@9Fn@z_^d?;Uu$VDn1g4GJ7smU1O~DZp&p3Sb4>2{SR!1V92ZIX5!d(xlazdyDDT z7JPZTc7q4pkN-TTJ;T8OEiqmCh5ZCX1{l&04etxU^d1-Eg5#$4a4LQa^+~`)BC<_m zg2ghLQSdbxcz^!OZ^eUOJa3e>Ea>Wq0L6kg7$r8#U~<3iBLmc?5hC>PBYuBR3A75h z4%gu6fQ@d5vm36_o4X1?(F!qOAfT9cX19v=aX>>gA<|V-hG1soBD0%_(VE?~qN{TO za5InK2Y>9nm<|lbU`xdkc5@0MC1+tf#~_T%NC|-EzT^*V6vzrO1rLm9HS8xAGK*mm zrRid$X{1I0{`42#iM{u2M)6|JxOW}wR-}+JplJ^UJ~Yoq5uX)6n(hAFT_w;Yo&s|~ z_q=r;#{--9^K8dBznK6JE;qXBW)+*k#8*~gK%qGb`$@&{7-(CA$s8Bpt@5c$Ja9v_ z351d1e)K(_;U4vFybKN%s|}Q~5*Wk8R8m%pVB9I+IFkhtrL(?#afotxSe2ur0Ipvjn5ZMsn5}P zfdQ|Hi(8ve!Pdun&&zlE63)jf4d+hefDA#!H2F#OImb^|-x(hl>x{9#P0v%FdSpi& z#8o0?SAQCe|BdgLSt9y;VI3}*j5c^MeEqZk5MTe?dsNR#dRMA=XOht2EGtr^2OF70 z+;C)^s~v+~#z@8A7Jjez$&cb?+jpfYNSw@}M+Xs5hrD61_r6Vd=!@s$@q5q4;{GPy zFRgXKtG|OE{k7jmVg1?{z*V2bn0+YV$3lQmfx$2xOg%J>0j0cqeJ?S1sQfl+;b+@%<+&SWCmo4Q=u?|C5RYKv9GimFyt6o`DETU`VqL=?Enu!(cedsk%>ysNQ#uS%G zWDjT~670S!R3VWfV7*SVCm0gH+sffJ_|B)l3x^&XVC$>CiQdF&&L8E9n>p_wE`7td zaK+p1!{*EPV(-11aNn*gaOvyr$GX`?jMbg$4C#J#-7;Z)9;kp1bH7W-Y3sPKaYF?h zxarsL|Fe-RG5+6w<<2-~NuM7Yz8WPMVJO2y_L{Jp-PZ9((nA)%!cwvwVLS&NsgPN~ zmLZklfUE`xD>4Hx+bteE5BGfjy?EfBw-=S-M5l4c>}PR zkpepdWbKx{c+0Q;-+tuaNo3$yDnY@1pZRy+i@jf+#oKp$1fT{-6_fS082&P3A|z2g zvVezGA;LYAe!IjoRA|io3EaDJ#gR*#+f}AU*Lo|o*X_?D)QC3~r@%2qqKMEMKqCO7 z-1s8=i#T09eLSZxdYbBQG^)#4@Y^Znn!afiGwvD~?hCj7QUsrl9B|g8vRvi2A`3w3 zRCgnNS-Aom&ub%|W)#G109=3VVf^4f{*QRc58N|GjMa<>Zz%YYks~XZ861EP>N;0} z4b^!$Mm|2;+_+j=R9V4VU%tg&1+eQyZ2sHQ;Z|uaXg&REk5pugA7d1jw!emps!|z~lQS z{K3%gcTEY@qMhP}2fQf#OxUs0!nbRLu6_vj(uNyPSV@+E684L;D!NS9QbCjc&nzL% z><`l$`vxf5%W}h|eDiUS0UbVbeb`s-0k7K}8kQi6>Bxjmajj$vP75!rNQNPuY1DAe zv&`J(f9!vMf<5>B2)^pA)C+s9|8XXOI0ywcK z!}mI$TuHx`HjCWwOgjTuX7x76`^8oOC))M5-xmtf~%rhHP>H4}|s?6Q@ zz5`$V{Chm;&dc6#*3psxAXvRk_v0cmNp}l6T*q_R0>FaHBmr(1&v)@$i*;M~;qCv& zhp^$C1G$9-T&l9z*7xU*1olVOnN8<*M&#+SkOS9oaj$sv$6>-ck$op7Uf$)J{x04mhr?a-Xd{zdO6>UcBt8-^Xfy3-&(v3RpKt zXPj`FER4R!`}v>fZsxrObq;q}Iyi~F-`I>Rewf!dl!hJwn#s2)MJo>FFp{Y^$hE3Y z#^VNy6NA3mb=Y!|HuuJYrDFZ0UbmUSNR6J}i1nW3$w z8q`O2Q0mllm&a$rJDq3wVWPP$KJ5#<#G1{w>ui!V#HB-5jj2ZUxw)cPqOa*VtHpu8 z@bFzP!QFrOTI8W6!q^!dhD9+QR0*4Zlw~az=P_lkhXZx(7TXRDM)b4BkdW=5+Lpdx z!zRA<#(lxfX`^_cvJ=3gaX0uwgGLkTh^j4T_<{rC+7#;jf zdBIl;FM0C6^}(W@8y`Y0K?bid(3W6|_Lqag-9x}%+83_q&oj-5}2(G?K z_RT|04@@9nr905-yu%7jx?~I(ajRSBSe!Z)sXXsf z2_b~#gKO}~54-_?>tFma%0MQ=oo$T7HbJLa=%biuC-qpUDki<{*SLZMT1 zG#cMdv$1a}#Wv~6{D^yGWbRi7oytTB@CTnf2Os_5zrynJ`ZOz~aV(jW=qyAjGup^B zCW!;7PG^R=a@*wUP4|5BFE7J`cV3Vg+2+-j(bmUgm&9qYyqHUVv08e78QJ|_ZKn6&rvI-rMOg^&P;^328@n3%PU*W0!=R{U( z1z^tQ_G>ceQk4;d$`!M$NQ!3kwS;L`_Hzg1m!SO+)rVeJmPtAj3?OWMhTq235;%6b zG0{hL6{rTqvaz+!XZ5 z4|#}TX4Uz=;l*jsTc?{>vxt@qsJJ7H)dj5hgvpzvA$bs;30zT94w&>i>u9za7t7n_ zZS1Yk-um$FZTQ&l{d24wS%>saPMUT^y!4e6D@!IxLntc6BN0nVL{wB?e%&Q+qyE<> zAU^1gh2^KFFtz?j&bP2TOoxHVPyoV|PvA%oBc1`NH>-YFF=|~v+CJPKy{@d^$aF@B z7Cl1MnQ%}0YR~n>=T?2(udGcXRWhfUNvxrbqiofc z3`iBjk=chy%kEo|EO9LhjQouFHfenMuYMGNe9O%^vb0{sWBU1O>oqJwk;P|Y_5n5Q ztyVIY#gL5xWxT+Mod7b8Hhk%iz6Uxw5)(5b)H1cTS~skgqV#Apqjg=q>Y8P{aNH0^ zCTu!Wz}iR<(6yNDuN>}go1AV9TTw=POC`F2Y^7!dU_>F;9>%%2Z#wm^OTGWC-(@C5 z%|gg&kATV*lC|(VfqSZSCOaa*c+UGBUvH|5;Nu1lefuhW?v9_q!w+1UszL}hK91il zjrK`kxU^71s|jhI&>Z$-+MWpI(Qxq`rq=>1}v{^@M6;cyz(EOb#UPvu6voO3*%@fO+I-Nf~ZRo z90Q(2=aVh7bkPS;p-CI4m>u%-g`G=^JR}$osyu|y6oF9<2(6d6S*U* zYr_CaJ7aZTH4O$*zcqj|?FL&Ihmp`>W4{@$y9nI@R`d)?l^rbmnA);BUCd0A^#B=_ zR$Y$)5ZLXjp5=D?doNi5&H4tKUd{2e0{Pwo+in!=1uG_2%9Td3Oy7R!HTcG!c|5-F za(ss;Nje5ZDq;RBs!BL$xa^KQUh)|5T@i#$9DZ_ASIlS;oGq1|jT?vfdS)yJlvFWU zy^XY}sYy~EzVnrfu=%BrVMH%AeKYTKr=R4B3$nPjGMcGZJ5H>ug%Wr{8|n=+PVBQs zW{vPUIc_}Ie9;H0Kx?f!bH{sKs z^^LZ{AJ0(yx#?jEqyp@`-b zxbFYU%W>6@d^UGX+q!i<$+-}Bt?$&{z({0ZKqhTz4F(|*DS(bKuYxm%(&>&-jf6&k zH{0*Jv>=|+r|3SAL`5{R+$egKgHDK)hgnrfmW)?$$P^^b=!$2$$9==?HO~y5`(RpM z;X${B(W-g@=L3Wh$FL839=Z~r{QS@2fk&=la5XAYoQQU5ASbH|frXaK#o?%;qJ--@ z$<_3^6fZDNx}g=|QM%{^ahgX$o}RC*VAza-7u_bL`kSCF-1_+LEy${ZfwN^KZ2)Az zO$I|@O$JIm;Xoa@R07f(>{CM&!-~#4zcUP2==7S2js4-U8R+YC&Hzb~i_GQX%PN?R z45D4BsK;MpTo2*6myR_*98oBLnG4a+jgcN@#H#9I34BXS>#*zd*Wt5Y`8%MvgcTvL zt|Yy+$$(~HMd8F1qb`kb*)ww!ST3+$6ZR=um||OK(%g5neobcwDpsSsuYH?4Zbunz zWPnIT+;lFyCI8f;8+rK3fJ#>-mx}MoMqjhSdbxDgCifiHKoVIr<*{TS7}Qji9~_ItYo}tCJA+mi;qh;6#mwdflP+(CZeiF*3rMM6 zhZwC#kw$h)t~{O@+TLRVWmk#>1ukqp=KAfh$>Ot-(SR-kB_7&dV1S{|a~Xuv8(`!) zp=1>@0G7;HCY6lGv=}%*W;B-E&v^!3>;gT!RGSZxxQr;N) zXt-AdhK#rmplULCh$Vx}TT>a_Aks#k_{>k@6QBQS^=2n`gi)-5 z))RHM4y7n1WRcpk&Xtx{5W^uT`DtA@)&STl4WhI$E!c<(3bsTk53SqDlj_JY;u5-# zlve>5u~|S=8R!{xPdzbPjvS0bBpH^I%l%<`Z$Ku$3b{A~wvc6BXM_ZF8&-U>Z3bxP zQ0NNcG;UC~HIK3gp8Cs2yoJ&&soI6x!KD?U$tx4DcezGHjePZ@yDnei3mI8mh12gJUcy2gh!@!# zYs?r7%1Fq}B-SYm8>)6p*=-_m!M({~~!PDnmSR$fnGx2nl z_>67VAiK}F&VkZ1;nizzAYfr-sToX8br}qWUX~L953^`*5aki3HKd?|blYoeW`)Iy z%p*Vluq!HAB7E>a+!TFU;X=wzsyr%U!St%eWF;{h868ts5aNc{Mfr%h<0fk~WtUmh zrD3V$_a+vfA?pb+4YQtO067tx%rxZ-%?Xt9UTFp$R}(pwjFcNufD6MM9aVK@P%4I2 zFTC&2gVoW7Z>9}1sE7e3QPZkV>GhWAU^ueW!{np^foOYO zm8df*31jK33vOmo%*v+ zz0)V%sc0ak?AUf;0M~U!L^Zi$cr7y0Ar;3ZVS|A)+3>Rjbd7UbTzPdbt2U%!HtO0b zX9;i-XbDVlkuAey0<>&EbQx$}e(6Psi5PM!%YB$R>j@MyX3Vu*;RHoeJanr4WJGCa$pbLfl&~K=c?FnOoFW?sQ20q>vo*@+ zB6AslH!LpWKs;Ai5TQYwwv^`SHm2~S`Wl0c*96I2Moe5{vSjRReaS<)<4aCrp(K_= zAyP%m#@AP^UzI`9pa{;7HZ(bd6X6Vg9i9xBuxlw2Fyd5O4hh+f480wo|dF#}x$ zUBjRfD;1p>1g(NhEYMVKseZ*skcJ5Pomz7w8wk!ewsan?Tv)F%t@gYa?PY*TALzI* z2J76jS%2%}24Kk2MhSs(@*zFz(A6|uAqpsnQNI&hA2_f`m|4$2>$scP2dG1jaxYTn zucTzAMF@o?OJN2i(5HTi8F88iY(`iAYUA%hnrv z#1hE3!*rs*h2*=$Woej~?;)q&nwTC}N9wSo&x+vdL^vl#>-e=kVsJJ5;f(;SsLSax ztjuNxd=9oQOi;`aww(VU^rciAsM^|_!?~3nGaI)_FV}x!T!;R-`#j)y4765{3ed3_ z4I>f~x8pXp5=|f9J_ZT@xn(6g6+#?;3QT*Bm3y7} z0n<}VTw%9Ez94%i_#FnqOE0_!d+#|rGg=p>U{l3#{OBOoSbr1md(w4Wu03{h5aqRN zodKM%njO|nandton*c^?2smc9G&0aJ%dx)ZeN9euG!dI3N(*?nJQvcGaqEQ-W6hdn zm^Yve8dyY1y;4Cfp4ldnfe=pjeXfTcs}d6k!-lmmDFS2XF6C~{KSW zvIp5LJnTj3rj>a7G7q-D{Oar28R=N8HVI4-$Ht8i{A;R!v$&x&*Wa-)bR-rk;=URN zaM|M%w(Np*+_)K3oK*&wW7kH$o&XiaEv5B7f^crwXaKL*hAu5OW8IBb<SKd!`-X5Cvk4j?H4f!RU)F-^2wu*^O`|>m+pd<=y(@Gkx@_Q=s+9Nx| z(^l_8FUVHD!e`@>xd$e#;u^;n z9Uz>0U^>0{?8B=syDK(Y`h;T3VB_yU*?qYlMU#9ls`YJ@;)PX$I@zbx&>>Ds`2%KM zm(R<;pqa(zKt6t!RvpskBQMh273W&DN=cs6%4Z-`+6h^PjRbgA|9;7(-%Q_El~?fe z#S~|@a?Rzh97eZ?SJC~w;nxMQg>5+Y|JKay@xyXD|FbNp#*Il{_c%Atz`*iM$ zbc?lY zmdt%5ZXn2XaVpqMkeA-TB3yLIH`C&XZEEZ|RHSb~jRRk!b=)3U7saRmF7Er^)I|@C z0UE18vfozi9gc&(#_dI&0jP}=$v)vLjv)Ah2Lj!-oe`zthOpKl>qCX(S18r^vQ)tk zv1pyUGS^+qahGX6-DA?0aNj!MrHA7>u7Be-AICipUWTNX@oh#GjP8w&hq}XlnB&HV zL0r+h*C1Qf`I`j9ouo7RnoI|8m|{92p85^;u{i}x)Z0Sbz+Ak|R%sTSP`xdQPwOtS z!&CBMwd7Yz`3bDHapp;XUk}Bw9~xvm4Jc^Qn1t=24L)67mxFz%Q|CT{{`3K}%!149 z1fZCVp+;ePHZAsx@oiG=OW2v!l8)|Hu=%jdH^%j$(jQ-##)j#oJRoi@&?aX*$!|`* z@Wti+Sc1vuZjzCrE-C=a^TNH$J|ExkfP2M3Tz~4#Q!Gn`l7`V#qE((@e=ffu8;{={v26l|&Y&>it*6ko7M4s_{;f_*BG zj2H+ORAazcTckD6ge5Jg+X{4#t?>-E!5a#T*#7b0zrvZ)0G!@BVzj zREfEmVS;sPk5}vK4Tc9cMnFt?Hd}Ym{o{#Z+y@|T@(b@v zigakeVFFA9+b|!)J1)y(6NlqF1zc3VQhEkBDhBO21yN$Mv>@}aU_@%OYa}h)EI>;& zu6|jRfl!{`_T8VuV8i~zVqqEjAvdTj4Ii!3##o<5g!+f9dZ2ZyeN3PCZLB?SPp;GA ztB5F7o(^T3TEK-qwm5~6@5XjjTCL|bavvE5TZ`MAI5T}iKXhOPqGT%ItgbayuDg*Q zkX$D{jCXCIx~KN02(JPXKeQ^Sh|4z2W;lmYJ&1 z(_r*7Dwr(ma1ECCZuUTX0MqAu+WnQ`ufs)*S>t-Cp{MmyyO$zu*PA{1mlsdN~hj_?w&kXtngR^rN#@O(00jjWjk2Y zT<_7=Fh4Tpk_Q_0O<~;?dokhtLtp+je`%OU;N$pb#TjWLBNEql{16@ma01pCy~}B_ zW$Da*+;(a1nd5yK>lA%39uJMa$YY*5FAdH}$~<`!WW7FVoa3#p{}Y^Z_QQtZn+gz8 zZ@uwSBfJpgZ&|bDk+NO1j*V5Tx4~pl#cDs3nLFeCx6O6`;a8+Y z{Q?iJxx){!%uB^QxX@x|s?mo#ekmpnt%$j6*J~4V*P7Adf0KdQga+uW0QJvN2B2Mg zO~+ju6W1R<=0_I(Y7^e}x?OnUsk8CXJKvbj>yS~S&nJ0Fx{;+4(oj_zN=bR+_o|Yk z!I8osioGru1s%`yi0T@^p|(vkDh_T2vRkzcR( z-T@N|uzCIF)~4Uw7<9GZtvYz5#s0+xgLUG-Bu0P359d}8$DW=0M94mx@M|54xosNB zY{d~AlkJoRvV+*6a2|ityF=Cu@$T3Ef7rA4g5>O#N{Nh;DlIK-Me#jQVkd5Xd)xZl zpbIlA%P2<8CsmD;5d#5-4&q7%sO)f3rS_am zDZ-e0WMAS*Pm9mv%Ddzs7Oy&lU;6O-@PG$h5d@e`Q*6ohWHVDC@sC+!jVM=sIMcCj zlbyJ6ftfaM<2f!)9NdrX$kWW@eXhEeU?=gy@mU^dKl7GS%{0axIE91B3o)H7WrQTT>C`Nbr<_y+; zau&bv!~Yj9+Vo&mAYmJ^Qis*At$sr`6#PA_>`oEOHExH=cxaQ$g^bH1WLR7p2?xY= zO2)lGYz&Z+5*gXK#yhQl;)ia(=pj}U$^S&<;_RI=0)iTbX<_q?~$igRr^4_;B&igLt5jvb>&QtHjzy}??--#ZmyfaVN3|3 z)Q{)QdvWUTYY_zMS!*Wn(#=zeB6B}2L~3zNB8td}R%GfHvFOZsnN%rCf;Jl8uX-?* zI)zT=>G)hU3LOtG znmAlNo7O&wcfa;SIB)Ps&J)kUD++H7gE$u4rpX0OXY^3yx=~fnmFMlgB(L|5iQDzD z`rtV^UeD#WXiU7MBkY{~pMU>qRAH3aLY217%`8Y`#RRds@5nL^EDf2#k|+%YkI)kz zm^Z&8!aHF-Bl7Iflk_0VaF&j{reeaTWV9HU*;5_CCjRF(;oZ$0c=uHw(HXdwM))-Z zsEb2>W{UR6kGdieAypVAOB#WQQBpz{Y>?hZIZOWh`7;mVAAav|;=FZ_GMfdq>Lun9 zHWPLehKs&5wsvKS`H^oPI27~Vtb*{>HEEW8?0qzSo?JYH_a zm~hmteD_)J+V4jJ2VD~;`>i6dT==Tacb~H!{l;b1Qf0a``@{@r_bE4%WkY9j;mkEL zJPL!u(35_(*=0tP^rU2yE%v^ok6*g~r@edRtg+>kx2MKm%vrWUnGvkiGjmx+b2a0U z%g0E^J^$P{oc}4j<VuoFsuR55Tj49Vr zN9XZtE>%{+qDmdZCDQWNIv#7MG1++L;hJ8PkA3f7=SO+ow*Cw8iznaiwqUiLI7SzH zdcl^vcF)RI_goc^!MJJaNnH2x-^KTz`&sk@Qd?&5&gi?;Gwj}j?XSh$HL~C|Ew4(V zMGmTcl%l$(;Xr!(Wnx@&^xo*&UH%MSM z`S-F-8@;vEK$r2P${iw%BW@Dbsp7-9cUZm8P6sITFni6`Cv~|e+50TBjY)Se&ESug zzYm{W{jTwa=FTeh>1KQ2n6DoI=Ybc7Kwi0ZfGMw-I-~q6fSeJpM7)+?23Hor;QMQlDj+l! zHST)RKF1QNIgjCd1YP&v;R`F5VX<9F@gdOPUjcKb8HmES+;8)#kP(2;EkI; z?E$xh(h;kL$c!aRdMQW@;2Hx8HMm?Q(wwOmBqPF^>p}>HVsCzYe)Zw4-twMe@-+3^ z=eCbUpa?vl+$~eT^t(TEtg1X}@a#6%YkIq*RVuvZ67bed_3(<#8!=u#1G0r09@3e5 zC7t$M01e2%6~Hn(7L{O`%jyhTnko$dBVKO4_weKdzR+EQzgT?*zP31ru{CoXpb6?RUbvgh~LHB0z`!Ckm={XKZuh6kYQm`IU312kPku~#;DL)9?~FeF4*KvI@7>?LiY zpfw?DAZ932IOdY&*|q&k!?66AFI zEe`klxCiIqp7sJfuzW7|EN{)M$H^Y65(C&a^%wA6YaYN$rXIr;)4M&JJ*JOWJ%{9> z4*EiguIl1);}@Xfhxgp5LS7pIJqsqP;t1F(AX=cxl5&bqV;a=~H=6O|L# zvYY0P(>R*WRZlE{q+jAy*D*95%mTn^u52*W^eOJGke)G-~~AvHu`1n1+>YS3ZA z{XNL~Wv($Gcc#H@N42_>Wf2i!4HOWWaR{YY1WIFpO2c48w<{U0U0jdVC(h>fG%VI@ z%(Ep=p|R-J>6?$uY9Sn#*+Li&S3b~hCa!Pd*I-g<64HCoKlqI&7x41UXJaaU#V-um zG|;(k$V8Gl4;P+&TltMXvGi?%u@AG)07SHNZ-BC= z9E%ebW7t5bTRT%amx`J7FZsAy@j1Xc2R_~GmG5l;cgo%~!nSRA`XI1+)O&#~;@)e^3$ZT{hk?Ty{;+%;Sg3yg;)7AYOY9Y#22TLY5lZJ^k-)xdcx$JS{OQfvESshT5G`jIy4^!Z7|@8g{tniG3b$n=rwE zBket@B8e9eEZrYqgTaVQ6@~JeE|9HOS!kG$2mHg8PEH}t8dDKsL6y@T`5K@EWdH*l z6=(H1!;D>Z-m;qB(`AcL=gLVwZF;Q}ldBGPn8p>AfhdDgTl*Uk%|gqpa~7(AdESU9bA9gx z-@5*He(PW38H8uVY#|K0decPd_FSprZ7c6OY&lr|(TkpE^kMY%*gvi{<#LKcibD5Rj{ z2$q55SmI0Xvg>hZrx3AQJ)5eBXa|cKQ3lFx5y}fB$EtK0_puI}%x=Q)1@ke3wfzXR z^ui1ol{M?#QcmJ_^8fcVZTE|KhQZ-kgufpA_J*tx!n`WaNUi^S+?e9db@ z-8*Og=(nDhQDDO}5~C7=IQ_ZlSIzoof8V&u5&^i{w%E74h}p?$-w9<2EiOoirJsd# z%vkAe`Prn?63XCC-yjQNr!3$!EkI^h*z^p7p|$F=XmKh6r8m1V;s<3~)@rmU7uK{h zSmb4F*yoH9$sJ5uO?F6I@p~-GQp>^h+o33D_;tex9C_FS&2JswLo7nGTGEtd^cH~+ zH_v?d-;d0~eLBJ6IfSpx{@pu$KDP<8b*^T)wC#JkzkGHJruzIvxQ?04S;hk_6O34@ zGSnp3Kf)Vvql1=9eL~=Up*5#9{@Z@k?df5HMsAGq`tNOPk!T4Jj?Kmbv7G( zk9em?`<*@?gQ8L>6)L`@>%x#%hp+8>409XL!t9#0$WCES$DuG7B?+#5h{EFdimZ|A zkXB8MuhDU%#xE#SzDK?nAgmYDm1VQkbme7FWAcnlN4mULA;yXCw?jtG0HtuHSXM)3 zE8RDRRm@uOI+XgNv(*7bN@w*q2ALZNJ|AUu0*jArjX+aU3_uI-5%e67bntSpvMg;A z>tg?~#hdUP!gFG_5boLZQ}fieJHz+at^TG=M{S|iox5(v{|4NVrRK;S1L8ZgzPE9# z(EyHHrYFybdA_NTk#m-vsN9-&RFz4N$87o>VKXRW zr8JS*&Y@tYz-Wt)pA(IOJcGk2Frz+gB&RZ369DD*8BC9YruYZYlM(+KiBK@7*ymqna1 zf)kxa7y?|u5dFk@fdL|;2O>W&-*29w_c@H{iz9lJVK|kjCXW5Vjh@qc8lI+P;&vu2 zVJ827cw~)dv~%OSy7G>Pb8LaecSle@pFawmxZmA0^YITpBR9vm;BbP%J!k#BTYb*2 z>7omwV!6O>jtZvh_jP>7$H%K&;Rnl z87v(*E7uQCq;zIRZ*tEy>_Q~5Lc>S=J~aEuU%w6~Ae=C;h4A&+pSlw~oYnCn$ZcG9 zR1648Ym_-%dmCF>tlH6mk(nN3+!-=8N%mtfB6Cb*J1YWR7M0Et5}BDOFllJI+{jkM zcCw$rnPt5JyuH5&qsKB%tepVB$S6lqb`JIIj%YwOSUNbs%HctNUN5nE>_j5Ed#tlc z8UomUb7wc%Ts^z%0}D6-;e>*1_u$&WO0T<k&NTP>XwyD_%+~D>54VKX~XSrdLV|ffH-6+ULK?i*{*$!aOSI^XZ8*5n;C#(A* zUnd-;Wh#If(u=#y`pIwJ$KfZoc;jp;f2dcj)mt)l^!o}dVFB466`7d{a%V4x zsm3u{=|XW;JivbH2bveB_bZSr8;)hVQhZ{BJy8NuA6M&wkrQDTq*;Dyo&OEe_eA6M zMwR}UUzrGr3@l=hIdy+{p!IN4fF`*=X(0lx!A{@cbCKP|EMR6M67Z$3)`bsb2m{7t z-~IW)ngF^1CYpW;D%1)+P*}9eE=L!C&WcFx@mWln`wQj1N)IJ)<27X~VLJi5%lFi* zTZE&qmxx|SxgA!QCp^eDde_Dz)U{(=CRsOQP|2tlvs%{UXt%Got7rF|9H40tPG$&z z^MfLZ;iB88%?!q$*(TBFMAY(i%XNY2ws`S6(UUjBX}nHXg9>)=KcB-`HbQo-7-o{x z-G~@Y>B@f2i!1UF<8@|et*9Y;PfmM8KSQYlcB>7J9GJl{EMaA)JUM5k8g=4F%)pB2 z_2dgUO>~dAo(Ed5J*hzBBAxsYtkl-Q>u|JZxw{ZVi z*L}cO!u9ccQU*XthpW!XwgHP}44UcnZ^HwHhm!`J7H1*n+OLS>6S2bW_Iulvz4c*L*> z|N6eNH?5t)+Q})u-zyo;vQZ64lw)Qc5x#w!tmGY8F=xOF2aa{*+_uciyt<+Y3re1y$R1_c;3Ml!u^Av z-R`xH_xs03!@+{CU^V&2j#xsPG8Ffl)L6s}7IdQNiAl_OgJP}U_M6^_j;4$g>)us> z$xd1k!CB{mVIwN_L6~P4-=4mjhzw?zk)O9#UE|&1Y9FhMp2-&TS5)#Cb7RQVRp4{g zHk~IspRL3GuGe0-b@5l9@#M$n8eR~vh2ZtLIYQ6tahOX0>I~qJfrYHQ3FF0m5)ll( zk{VF%4#3+mwH9moYrIjBp6M!mEDxHF0nNxLLkZT55kl!-1M)<4lnf`qvMHxATM_-fl%2jLr_H$F(@QVlb- zK?)87ILfmzMA`(R3xEs1Fnc(R&4yVhjShuba6mHQpUKT#m(K5J(O>|kb z;d9rN-(ZsI==q}?tcPh*JQYZ%E;Sl2e&2y7qdN0e6~*Y$ak-~!de@!1^w00W3mi@f zu!RuZBj_e}cxCze46u#?VnAn<`7Ah7?F!h)fI)#)cDriCifoxTm`I$eFzvG`01ePXmqbjo?zvwBqc zby=q(Zscfj8tV{X(Z%A<$r+Y@s-#CTmi3|-%eWyjJYCkkkeSPoGtc6Ev;ku3$&8W!jl%- zj&5FBzj*VhA~MH?QyOd%0_d8~?eL9rjlzpanN3h3=aqH@jH;t4jX~Z$u%}t&Gybp) zt0Xc-3<4-Xmsl++>yn|wR`IxCsNyaIR0A$^KKsaE;xMff7Q%a+r#i?aoEBh{prAwZ z4xe*f2{SQXh(Q&jiLxb#Vus6@s{&UC!FcrzIFx}zLYII`7;iW;MzrdygM3XyrQ`{y z^e^7pmuWhU7h*BUCOyb@obn)(a9V*)LI9n2RLnc--RK){F6m*N0T*Bg)w4y)3Al{O zG{DZ&rVA7rfVoi+W%hw#9uv=sNGB;9F)0}`x?A2K6`4tcZ~<61FAWdfd@)XaCac3~ z2{s$Pz2WD#dw=^iz74nM);EF5a~616Y#LQ9M&doi9-~v;7J#)d)3k19Q-HWRbX7+I zrx*fqTsvg#Gt&TZc*ZXOh?~wGo?6!BGYzLb*d#nMxM8ks+j+lx4bnTTk+M{0Q^L#W z%F~C`CP;y##Y;H>zQn?>x}u}L>ZJnA!0uoxQ-;!fP|UELALOIzWC=SkRty zwWMMy&{&AOUH-~#)a(Drxl23t;6)Z*bYQcAumgJr3xi(k0Y`4$3$WMwliM^xRF;YAI$Itcjs zLu~7{?$v%=>J46I`4J1Z&EhI*^5jMYr;T96CJL*P|FWMgX>*bF_IQ@tzf?XuYJ>G}E;5`%Gi{CszZTEniaQmB%?tY=B^qgwp{|9(ZFV6_p4H5tV002ov JPDHLkV1mFI_rL%E literal 0 HcmV?d00001 diff --git a/app/src/beta/res/drawable/ic_wordmark_text_normal.png b/app/src/beta/res/drawable/ic_wordmark_text_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..16ef53a53122540459db8f6dd7743177aa02af48 GIT binary patch literal 10762 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

=Acb%CJC1hx9RF+8Xu{% zvI-Fxh%nveMm!w*KU<6CXnyHlsb1OjS)A)c5{b@wy}5IEcwlvnc)XK<)O#*Zo}Zug zOwNS`Cxn~1F8?$dp8*8lZyStbDLQG)pAvLgL89@$&-?vb5q-2DcYe)g6ONB@i;g3Y zA-&AHTz#+e<#S;EpK1rkS7c=uRZ%PdZ2QOL=35drMBgt3-JyXnE`WiL@YCoLi- z0rh$z^e!%L)10t8%$nNGteF>V5p&9F@djb+|8$M-o6hphV{R}!*rp$CP0%RzSNn|d zm?=$yYg|(@$wq~)Pe*g(v3^) zdC1zg2Rmtu73@Xf@hAduSMfRQs=sS1Hs$y&i6^=ZJ-zqSk{{d%pPyvsG8p`SIgURT zA6)}J7q!cs^qluVHX+H9u!Lj#)bE6N5!PTo*c=RAcU0$haBu*_;j8_>{oDVtN%P5n zn|;j*&cYFI#Rx4;m|WD&#>ULX#c-Sq{Z6D!NI=+LL_l*^m|2z16Ei``a6G4sYqBJu zowO=ul#@za+-838Vr-K1C#w=<$f?96UeqR-YN3qdf*7W&-z}vi-Wf6YC3pQUb zlji}!GcWVTZuR&#YGt0ZW0WlP&L6cikEvIE4})t=>q@)`rn$l<;Y^2&Yp1b%R;bC% zj1+@*Vv~u+Z%cJdBxFC&DtzdlzyD|W>;LfY_UJqRTC;ij1cJ&}X=77Q!67rJc}~{n zU)yd1*?N0+K1twGM>0uYf%9PH-E$f%hK%P);*FR{EFlLfr4RRXmRlY#!;C*ax?Z=GU7JFT zLrZjSb+X^IAtSfC(v8j6jALtKUN4t97BCwxnAV++f!6Ad%Ghu0z8)R)Awzg9lM8%P zh8cmh=HE{uG?^%TtrdHKod1Jcd1#Yvx69e$FaFT`!{>epeiu8h(^?bOVIA#47R-)s zvTTyr{5-4m+*)v=w6Gy8oUm<~)_qe%WZXjl`vJnYIPIT44R$|O8YJGj8O2=L?|3a^ zW1{0a{9_XnHA6LS@W-{&n-X>#F}FCfRb)7P*?|N^Za#Z46~Xt^6Y%iZ|5+)n(+c?T z!^&*c)-H(b_M>Zfo1Rfit8HjW{cdJbPF?~D?jPnPUKT`K)eR_P*Dh5Uv7 zZ^Ag({6Z7*yk90sP;80Jb92JijzlM@MQ2!2NGBR(ymYz%B=N9ax$^ItSbZk0vr@i^A{=7DeRl`%nz&f1l`B_Fy;H)|%b>v@UI zDW^pz{ysK_7~sFs_w8hyxGU)S{Ctq1@yI0&uh5|O!%W1R>R1^2 z#Xl5euR4$rc1_Xu>(cJ(sf}3T36FHvUXiVwR@tAkgceQX9rLV!H?X$EV74GKd`$gP z^DcUJp%-T@sY$Hq?7}=8E_vLhJZEe{4hR8Od-WvoW>!eSaIgzGq3S^{S&${1MQ5YY zY>_&M6~9p_JH0_em90)=heb*ji+)t?WG>}N&^dyOqY571ixD8%Wz8$H)7d%+8ZN?7 z)mKFB`G{{ICwTpW6zJB7@cGQ&>&l|D*=)WDj^Q_SCBKR}>=XLFywS+6b+BbK2NPTj zXI_vn;oZA#Ku&|5RWVvgg2&TX|KQB`3%lA_wNk7uqSabbw3e4R!g!+_NksrJe4G@K zq%CFGXWH;{IF2bvJZ?~VB0FeYYTmKFKCVxCX2@7-8B>{~*bF~u7jhzuXH>XiX|WzG z&=St&!<5e*&95fy1KF*vO5{*kCQXsoE@r;x5=1;Fv$d5riLnL>oB1M+EZpfjN*k63FWrtWp@0Y5P9h~v+Oho%S&nJ#L87dEX{~bgHd8|j*@W)h zBE*cPIWe?mV)%#hPJ(rk%qu*an05QDv)VG4IK`k}=GdAVO5Rqd9pfo%m2@ zr_XecNrR82L^UzH$n5;2CoJ8E-t2eg;<>084m-Gg$7p&EgRDe}0j7 zClR8T*9Jkh=Tx+RdJDm6 zyp$z@@_+`soe0j+{pb6YU9jt=D_fvh91p|c%NXb;u6=p)zcJTk53Mr=f<4`7dr8Ch+P=YEE+>c&!kM-6s^dQI;(LE zZKm}k6Cy+@{&~wGk;aC<`J4Y7Zg>=2C|yV$)-jnJ<+34lS?W0uc)_=j5op!FTJ$n6 zK795Q1dh-!)0V7X*P&nt#OoG`!jPxMI4ond{?IOS-D`totv`BVY-{@+zP_6a@Lo7q|hMSdX=VXyVMjQt}cS8Se;iRfAUyc$}Fv=ug# zz10oh;|$T<-J17WTuhxT)l_TJHJ$H=kXT5S(X+>(W#Wy z=zP}pN%()QD>;`J9tPLr&ONU(PNr}%^+uyLqOsSFu|Q)09{)bobC%b2cY-qqY<7Pt zbT!Q0g%`1$t%^2kO_m9@d(kz)+fWwIwa10mbDK5=+m-SfiL1391bi>B z3*PZJS*@*_FVT*D#mD?S1BP6*bf;FODDToL0rEMkFVF?hML-Y08t%jEc^R%5m@)M{5BdUJYcTf-$mmc8C)L5OMv zcCze$p%7Q~p%bhT9ah^(BW4j7^;_MS9*IV!|{n=HeRto~2{Tg!Rg-Ud+tvXp`hiI8K- zd!Drjm36Tdulw{2(tU@8A+Ue;SHJumaCT6v;eqblr%+Iw;4CnRrB+xidU;_NB0zpS zCL79SziK1k7qvhJw1Y>}I;%-qn?`UvCr#KK-(zhhJs~U)weXT4tBx#AUc1s)FUZ*D zIJd#@Wo~iWX+hpN#aQXc)mI3MIEzKqCJ)iD-ED?$^-5{HrTCyO=wVOH+~?X0V`@8K zio%_qCI*)`SG8JmL^JS%#9i0IZ_%c&*Otf7Qvf9R2$j!yC&YhmNcI$9>uuoRRo?n99M9nwmfwEQX7Tvh5O4%bTXp=0U zUMI=Mj6`b{lZd<`k-{jEH`aoa#pZdIwQx9+QdEmES$=5OZ}Yv9hbhQ-&f0nxZL{@5 zMn`buHhww6U7~2g{33SIr^O_*wuLzmF4)WMm7$Al)cr>1RyVaQ%DSa7)=5(rcJy7k zao;8E{5IOvy-yzQ^s_|ou}#8rSGIM|N_d{Y7EnRnfc0Ja?_C?=>3Lpt*}aNI#+5~K zINl?;ZKbLxw}xt^{9)b&$=`c)Wn`kvV@DBC7lGd}Df6T1YGdQVR*f4juns2gp@{L$ zx}?=fTW8tsH@M9;eJ#txsbNbWicYTeY#mlO!Rc_EGadw1?(L*8N>LY+T}TD){HosE z0Y`2abi_$f=P_T%x*01NirP2(ECRu}tevI^e3Y=GBetu}$fin0*bOfJyXZ>hsVuEb zUKKk+;rW^q5pNBKuRakFY|79*DL`#o0M8++XWOV<(OOc2AaEX>9C1lQj`s#3{65+x z4J{_y53N2Y(S*pB7A~%wMJ>(%@E$Er`$aF&v&;m-`^LkVgp>l78#^H&!RgHpf}243 z6DSB=IwlLxsn)F?7LxD8{e7c$bsOT6lt^&d-eYdN7+3AU1KHoc8~3+m50wSa7d76Z za1s8IrNelvhYc^hHhqul2x22a(ovPH(H#=q->SkAj2+#Ia1h|04F#L z%ymVa0xIQ?Xc02ZzSR@8qpRL1r07`zJP&&6WurLd z#%3YG(~ld}q!q?Y}oJEzb9=4;s8~dE73an#bo%Etg9-`r- zP9E~&V=2$G;Cb|YyD%e`xqQ*Mgd0)kxSOT|G^}S^y%u*3)N2I7Fo&iP?-NeW6qt+P zk9-S@9J?UU3(mch$1LS>F-jsaM{sdefn)POkd~w?tvoGxk(PSnIvAb^y$8FN+ z$kq)m-BcXUIdZKnb3kW}FH*U&St`Eh`Q^Ck<;CbcrmJsk+bK?ytv+o>+kNK+RYo|s z)E(Lz3({-c>E~wMG-c|B zk22q%sw|$IKt;oFFK!%0R{FW(J8tvfFvBGc6&|YYbWM-VGHx@DD4w$gj)j8g7ud=oVxO_l!gjuRAYzlQ=y^|8XHu1|9$OV6Hd!cD zy-RiS5Vq$g4=LQ~NnHEq1#ft`Rp*1P27p}5!1iYBEyon8A&R(G4Poj{?C zwG6=9jC)PFMuffT-CUOtCpZgF(6u=_w8-Tn2rt*yNx~ zdqx(;!RTdAA%MxHy!Li{t%y7QEGXhza0`sD*r6T2Ifhy3_^V5QC5;J<`ugve(bMPz z=MoSI%ihTXHb@L+HmS>jT@vq#Sh8#d2>bk5%QW~CxYeUS^g3xpRZ_8Ox)>&n+vExd zhlj6r`M<+|+a)J4E}k-qHtsY?L{aBrvPH-*(TwBfB4UDi&;^s-(!N`*&37F@~1&}^#ncVF9PA>6~sCtm( zA?NEzi|kX8Fyq~HF-#PhM2V;_5rQD6y zuRcI9ww5iIn|qv`#7p@ceiZxxEPGJzHrs_>ES(5zOPJb>pnlJeGAmh~%3QdLthRI@>xZb7^4+q27a~GxI@L)gL zHFEKsw(#?Exv~BzHnuN<#@kYrs1ZWBXjeg0aOf7Fg+ zgnxp9;{@lDAg!E2B;SQg;fZ&6r^!Ny1<^c#6z)XvPMX?{Jb^DmHwNFY>}u+@nIm}O zW?>or2!Sog050#LoA?vg+oW?J`#rG>qvq0xo59f(_zt5-qkj6C}KVOI-m36az>FUm`RdXJB z+;@f(T$S~WEy~LotPxe(1b&srd2q}o&7s#OWB8qZ(Uw=1eK1-X8z>9XXKie zAqyq(RDG0rVwT)M_?~WzV00dT%IZ8g8~y+NpFiHAIrR71O_LBW$`kP$SOQ#Y%Oztx zzOYj%{c=;)y6YV2P5htiKyH;V)+ zvNYb3;!pRveBVXoIohkqU(?1KfnySuQr_pn;=E`IsO`^%P5C>DuL8poe6%SO}*&Lx8%uLE_?Yc(AKGEP1_6(LFrWzyB<3U9Z)ywmcMfz>4MSx6X-n zWF5;TCQI-_XeuyI)6<1M6dl=Py?S*MO2HHDycG%0O4)-(W4%Yd*B)KFZxMt3spGgC z6T)@6uq@y$#5-B*eca4zk&b$+cTHorvk-W???cb-V-L)pT@<1N86bt4yywC!+y`Ns zp1o}no_%hQO1HBsyvbbmw-lI_N(=n*P4d%5;!J2iLVC0k!1ami^>t1}GH{)f#}I+M z7waS1z;;C-=sd(XlL;p(9gU`IWGFEAPR`>W{>N`ODy0v%j6C&)gBFrLXP z{qlwFn2X{$_lw*er>LyLvo(bUi1ob1F^>ovQcH?65ny=c-$w5z`gvJ4PkjuzvC)IJ z$+1}pJmqJ|88S7NH{5)*7A9ntb^m{{FZ0yEW_ckSv*HbBc@MTvB+T zjr|KZ)V1yw09)e@50=uhc^0;Gmi*vGW{E^L(1aQYyloo)n!HbX@;E@lc&2%{c+MoO z(6cp##~uqlj`fBG!{U7rVw2HitG^|Ii#G|TwTJVtwzB99W93uKt1R9~XeP}yFbz@C z!JeMdB)E1iYeWPm2$9F**UK2s?F8o%!vbJ1JlK}~uNVCQ(B}yVHtF-N;|Gh(c?kJ% zAq;K|hc7!O$0zTT4xO}%8!sN@BC?OkboDun;qkDF&(;)v#tw(CZpm@9h zR{(YgM?1*;MUtGn;XduKZsbwMqX?V``3dH0?Tkdb%|e)>-X=|wKV_1{8bR;76P^n!V%>d2^Y_0wT#{J$IGo^I5uzRB_Q}JXu~6cN7Xq&%8mr{y zi-WCs;jTQ`6bV~l&SS=cbrv-c&pTP@EV7m}Ko{b_P-hYI`XbgU+l_ou`2GL--~Zd~ z6XBWVxtt!yzgdMfw`^H9=q0Wl{U?0Ke`vqN-qZaN4NI~>~ZS#Ler9!p@!gaLm zb`uWvF1c8`<3N19h=dQ$;wzWUueIkL_h11;BA|PPtc!jL+5+)Q6f#5BG@EcFQ1mc> z{WRCI0w1+Rf;y}yf)`m&ywkELqAaX4x-t0RIwUA2pBch?OxH29#0VQW(>e%n;(=$7_k2recg~rvMU8`tDryp_CYHnpt&96T{Ui7{1cDwwqKK*RBS}pkT z$D?T7#hb?CcM6YVLE{+m8^?_X8B<=ta}l@JqR8#~B`eb5SW379gDCq|(%t$3juvLQWSZ9{p_>PNZh@NUv~rX1C+#@_hlUaD|<(3GWL&Ty8r+H07*qo IM6N<$g7FamSpWb4 literal 0 HcmV?d00001 diff --git a/app/src/beta/res/drawable/ic_wordmark_text_private.png b/app/src/beta/res/drawable/ic_wordmark_text_private.png new file mode 100644 index 0000000000000000000000000000000000000000..21e67c44ad160fea5e6da884d3e994cfe8ead675 GIT binary patch literal 10114 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 S5jFMz0000 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

k@HhzYzO$_s-cwLpdpb_G&M4O(AiVl_ZsO=+- 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 IM6N<$g87=|djJ3c literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 3400cd555..a73fa091a 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -48,21 +48,39 @@ app:layout_collapseParallaxMultiplier=".167"/> - + app:layout_collapseParallaxMultiplier=".1"> + + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 43ec94faf..0baef7182 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -4,4 +4,9 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index e12337c95..ea5ada2b6 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -67,6 +67,8 @@ + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 99a8f3d2e..d0f0286df 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -78,6 +78,8 @@ 60dp 16dp 8dp + 18dp + 10dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 69555986a..94479402c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -119,6 +119,8 @@ @drawable/ic_logo_wordmark_normal + @drawable/ic_wordmark_text_normal + @drawable/ic_wordmark_logo @color/fx_mobile_layer_color_1 @drawable/home_bottom_bar_background @drawable/home_bottom_bar_background_top @@ -316,6 +318,7 @@ @drawable/ic_logo_wordmark_private + @drawable/ic_wordmark_text_private @drawable/private_home_background_gradient @drawable/private_home_bottom_bar_background_gradient @drawable/private_home_bottom_bar_background_gradient_top diff --git a/app/src/nightly/res/drawable/ic_wordmark_logo.png b/app/src/nightly/res/drawable/ic_wordmark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa7746690a3b2be2f2c7fecec3a57149fc30a06 GIT binary patch literal 23059 zcmV)2K+M01P)BB=pINtCRZAT1|)P}Y#L6x(ZCupDjnRUx!hTb0VXmQ<=@ zDVwq}^v0XSjw7;az43Z?MbfTad)Ki@Ti!&LYyz|`OMXP8Y*LhDi2x-^d;lZ{kD0kM z_nz+U?*Gw$pL>T-fFu|+aOb@Gyt=>s{#SP&0~gY(CVki+g27<;kxs|{lB=pK?=d&5 zz-uVga3Q_oX*q!GfdT9tZZw~)J9Y^S_A-$q0ve}o0%>ifJm!N_r zW72NZ81u968cPN)q*o*@dk+u5;lA5&2R-;(Y^aGU${82C23kyk-QYFFZWqAzGN%vw2jPKLxYmKY*L$-s0xYsx1RVcV zTG~JQgZ=OtNf*TE%a{%XMmv56Zm^a6lsC|i`(g#u9i%k=OKMwKOY28mRbTg7uuLy7 z+sl-qA@Ix)4w%~A>k`lqQr1R@vHXnSLVoi>rvp5+*N#T732}OX*LW?t^^%z6oD3#5vW-c_LvN^_}_SB zH7`OnEn}{K1Lt|V0Jd|OqSZNEIkvaz`g_w3l9-;BQG^=r6Tq0se9I*DdF9&uo1Z(c z0e3-+o}-l98!I6y(DV0(LSE$kBo-l}r_*t?50js89Z!D@5FVQ#PN&aLae9H-&Qbc( zTE}d5&8LEUW09R2o`4nsWL3#)6QM|SKrw;|QHD?M_jmWS4g_guqMs+JvOUrm|5BFz$un+<9r8UJ#>aIYoou>6K?bQdQ=YiOUTB&~fX@ z@{A(1DNiIc`YbZXmZ4T7F#pnGp%u0;k~mB`E| zHcP98N%r(M&q_K z2{X1(!b*Vg_GF;3nY7z*>t=m<)jxfhJ35 zk`Cv@v70%Km`eRP-T)GqCljNUOhoa)AKiHM_YS#WAiTsBS#9Ns2ljTrJz}-xDFy*s zq`0rD8kp*AV8M%(8j}{NKzlN@33-tonUSe{a_Fx2) zcUC~AjR98}4COv#y09Iu!+`N^w+Bcx!4%q?HWC#4yuWsS;9iv$>II$cC8Vp5+`rhd zog+y)L5Mb#7xBlMr z4Y$IpD7`YwcEq2Tf#i0od}mp^I$Ud=bv93W8|rUpdyctBWFL?}F5Y2+IHhDvwo?UY zbSy#M!@(a}KXedYMd@V)+u|K3`u2!FSo!7%oagE4BM%2%t-2|TPAk6*qV_h4QfI{d z;Wgk|+wG*CA%*CKwk?acuJPvJf3|+#P4Fs7FB{nUf3msn+wa(Rzjr>e!TCR}zz~)) zb7ftuaSSL6CF{j#Lijl=%+_`Q$Les9*^MpLoYdF^&>}TkxdJ()!w|3cpLqY7L;K)W zkX{zB&EDVKeCFcLAyb=0<6(kh^88DUscuFxa;4)YmR|esIA!;M*RaxW~z=9HlYF*e* z9)QH9xJ8tqphYR<$U|7}H68n@r4z555AK|Rt^WnTSZ(GjvEc7Kduy` zMhpe73<=2luAS<1UNIlsStpr20ceedL!kl3W$excj(%}F;j9Y!^_$E~zxNl`7dw@| zBfP~@Fuhhb-#)tl=Q!=T|HxveYmQ`p7{x#hc8WCOGb{aVy7T1x%qgfW4R)b(QzI;T z^dd^++5mD*ZF?4Mrwj)#+e*CRcEtIupPhftt?)9Zv&w9H4*6&R912Xfm{`nVnHd(L zF8ZdV9AA7obfRB>Vf|oj{E<+AOJs>X053zTtlb}VwZ>^Zid!%>2f{;PwRQ&5&?7Y@1FdVTi|6*XANu-Xq}pX#-bCV zj+VuzWuV3G_xHa@$L^uiOI5d*TqsIY4h8JK3@<}+ruv|SnS8cJo5D~iT^`<*z#9gz zX~TlWuPeY+8VYTz7sN_6qL*PB7pp1xf(hd(|KcrLI=_1SRHAugksPmBpec|0sQ+q<`Ip)Ll^#JT$R z@D9O(t?u1_=CfzT@OsH$d-9t3JHkcwF^Cvcn#Huv#>c7wJg*n1{$Twk>$(AGei6um zO9kw-k`k^v+&l^AI8{xxFO4CfkdqdH45Xxsxwd7=4qYpGH%7e@MBWrknRUM`vbD3f z?LLVq_kW}0VNAScKuVUqovK?{sFB^KD_98`?=sHr4S@a9PoDXMo8Tp;mjt%A{s({1 zO;`H`P{e8l;G!rcW5Jf7droGvzrT9WId^9$k-pdZnIp$A+5c(V^v-z*%tN&=i^|rh zsR>a7iGw;@=yDN|o5L=Y4q?+`uW=C?*BiB7Fri{I?QhH5`b~^5Aa+%<2Y&FxpB4r~ zZ$7HQ=B_l!O}KdD{T)B?5&`$3!M5-J-8>LLv&^hDk;RlX%D_{Mcg>a;zdHo%KXc}e z@S@A9R7g~6lZ$m72HbGioO7^+3cf}F;z|+Ocoi3AV7O8QqA$*h-lh!&S6H_bn6VJk zE&WaRqXQ@m2If2zwc0P&HW*AW7{0K??|P@X0Xm)fZ~*OLtV0uhCU?9Pk@}**w(oAg z=sWc%3SG=+t8>zR4Z_5Bu!R^6Kr_AWq3~h{j5md-j0~2QYZZV}`!w6x5`_EuZTCk6TDN;B6v4jO zU(2zW%j6IH0X8`&=PTZHM}hW3QI+RrZnAn z-HpziRo9JM?-`O!^!%uJ= zyF%R3gPYPtqT{FxG6O}=lKnS6{YBB=h8wl_jlVq~PuJe-EB`5Yf$0T>jNb7Ze$mx% zB!!>CnW3yO3}tZXdB0WL>Ugm)u2*pQ#I>RMFr)bZGHi?tL>a zYF3~9`|j@dD!3_7#(o_dYuiJ?yVCj5kxjMEMLS-W5TIXp#Us{${G#I@;DSR(hM*IrqJP( zPIu@Jcf8}qxbopMhswm)^j5-U7IMTr) zaCk}jl%?Zo8O5blx*VX~PDO1o&&a@`*_~7UByEBleMn{EV!IhQ4BUrh>{Ra@2>~no zFN#3r{51}qf7-wAj(!hjZ*t)G8#7w6vDKI=RE{Mu#bq*ga2;utDihZWA1M&?5(49L z*Vos=Zxyck^pmg_nD1Nf-v!67orjH!x-y_80%Bv>gSrZC>1s&eiUtJsU~}@Kd|gsU zs8vRATZ6|P*`e4Dd7YUK=zI-5BMn6x6|}bWzTz?5-Uc9+4ROXU;l!W=( z)=|g14xUGPUd*<1M-ZPK5}%XUN->;1?zhUX&Y5&Ar+SA7TgKAZ2yj{*fj!fJ8-`+I zrb{#c54aD^Ui)0{515T%uKC@CFVEOTcIsJ0Wx@)32nh}eqzrPX2i_K zEwMpM1fJ&?I?>pvE0_8!D{;zJ@7yEFaHEXE=-%J@y9@7IhUZAn3v4&s zfIy2;5|3Mfl8-elAQnL7eM-k`^fr)a8HRRzdIbJtlNd3S=8Aj&)?JMDF9wipt8Wf( z96(m}ZA7v`fJI(XpH1mQIO;VtW+ho@7xSqil9My@3p16Jij_%K( z>vo1P)fu4pG*AGn1YHR%;5p#5j%PuJ7nYL|mLj$2rZ1pV{N~)P_g?hwqj1l#-X@CQQW-{D%7{%kDgCIQim18gf+W8=dsmg955 zW>F;(zY`;H&ooeNxEn@4Hh;MN4*TDB$IXHLmQ4T|GFcRt$Y_Sarq)G_8m+IHZBj!n3631ltEb8H|Ep zg>4C}mLV|4ZY_ggE9UcCfSLD$%|?l%0_T<=^%4kT)t?^S>b`$^nV)_CTYq(*xAqQW zt9_Bl5MT;uv@Zh50)Z`wOA@Vq9CQdgAf3%9-3u$pktj`A17tJrv9g^888Ka){yTzi zeOC>S2EZNrfrSJ(D@Fvdc?(d4`@~+}w2rqdQf9u)ayY13Ft#<&I32ot=itVbO7taKmAEF<|?lU-btjfzPRvwLxRH2IsS$)4q?&mwv!vl_~~e z9>47Nc5eOgxBbe^p-nF*y)1#JCXuNC#^4iujX`HgKO>8jfM-c(%i@%QW~7olfll~W zK$RH{Xqnhf)`K1ze&7ATF8J0@?t!{LOnMxP%}JsZU;?vA&);#&7Xj%4@H{nEUjo4U zi2(5l&!ZdX>d}{j%JN8PP<_;wK}0Dr-Jt-s8)1uN;aO66zJnakWO1+Kn}q|n9cXux zkB^11RFEE&!3hk&x%-lbf^m}l=FIZ8KYseiaHe-#*y^L}f|<#R0bn5;0SQ=X zf2DwCg#}I0<4DA+eMuy@_E(1VKP9HEtm|u5bPp>ANj!GxXOF|afA&={--YDNZIlyN zdIM|6uCo&8*8zLy^SFqduXOwtx*I@AJyhq}Z(jdwP$^epk7#L6Anl62Oan_ldg9R1 zR(PtmI`Ct^><@&C9w^k4QdJQuSH@X!+?WY@bu#5@`?ywRm0N4<8oqVnaDJ-)#1C8v zyZ`(#=&g-}(W2rX84kfyCs0U5YtTRjhp-+nSTgfjgGL0t0 z4K!x0!!z&rk1O!Z)!U%y*LaLfKV(bYJ2wZ}LAYwX(qxY}ML8BMnOz#=6%h=Bfr0ya z(OCs%DOYlS27@}t>%ac5?z{^oq%D~(9Jr|+*ED6XjmhjbxjT{c)-C$Fxe4s$%WI^* zZ$7hKrSeqj8Ym#JvSWd-UOW$f_VXWr^{@m|@PTwMOCl0^F*8~Au^ADsnHl+bX;27Y z3$a`k3}z`G0PBfX>4IvR_!iIW9UH>cKle8wOm?zlESI~XH`L`wGh2?UQco1sIY9Tb z%YEz&=rIh6%{0&ur%)e+k-Ja2m<#)P*^cb?L&qkw+eEPK|AgNcDsf4RP2;uz7qo!q z$Hk^qfYai2Y?xo`+SP<()|K&9zAsQ8HwWC(0^ly1htK~{?@NHg_@5QfF^Iq@OH=f@ zO0k+|w5lZv8Kn6<$Ve{Q z-#D-1vO1<~C8{9EBA}U4w7z%E_WHEW`+#GsOprl71N|;t=t)GF)&#kPTk9W5p&#Q~X#c;L*-}&2n;IhAXD(G-dfRo)Iv|Z?JCb5wQ zU94P748_Jqw8}J40CKd!aD>55cyQju%BaaNWQ0}#V}Bv_|Kb@~xuy@B+dIHIoakqw zuL1Cw1P&M&D6gCKvX*h6{!VyIUE+&9a9<27SNm3l`0R6=dhAtW3;$27enPbd0 zHH7_I^a-;mearag(7D>o<|eRMD{tjsTn}uC?l#M@4!4!18sC~nA+23B3->O+1J-uW z2(t;xF+d8vjiLyqG$O#8%wi-0K|)*1Ml51YOCM9rXmLHUiPqhW4wczB1S&mGz3$+u zfBiM+JT-*&02)_xMS@avDn=_hUFu_r`Jm|Wt3jFpmk{3H0K3EnN!lySCf&k}v(-(@ zEmz7IPyLs_=nsW^Ej^b%OgmV8)jDQc&R8?3vr3@Qp2E-fINv^fYLE)kYk#xJ&R9`myi5C58wJ> zfYB^de4v7-g8ysP2g6_l(~k^c{=xOI9E6Zu>^nCSKitW;%)wWG=55gK?U8(G5;Z7i zDwkQzi){z^sUzj+4g0LxF6~w??^uU?JvS7Gu2&Xm-i8xvmAmrrLjJaWAx01U3%?i^ zw-pdoFvGZEjGOZ=(?5%ulv6&>Chq1@b`SQa=fIRuuK0Nh33$W+m zQ!usWTZ(&WA;yQaQ0~v-mGrK(Z4z4*qEz7R$<2Y!u<#Xt-GAy~I0JBc5zmQz-!>L3 zti7%Sr~g(Do_^mvJpT9kaQb_ZiKiYL#8D^EJ+=;`nHo-CwT)Q>Sd?-d7!PC2B#DCT zZEdeIboafBF=xeBVwOZtsCylmVv;CtHZ)<%^gr){A`d$B&hF1XyrWf^EtZM1Mxz zEx!H9Z~Wq&pV8+^I`H#BgxVlN4Lp0#4Fg;D&~Qq$xh=%tB(bQ)-=w9p&v9I>gA(N| zO8J?%*>k`=ij28q8}NO1KLKz0@+?WSAYx0f(p{pyKA+Isxc~ZAGuRQO>Jexr*9ew+D zc>FE1aOqdqVQL*OP(}+XiJzJ+eBon7pdQ?e<);2_k>!G}cFEz*AVMoxeO+BJ92geG zR$lDPHQQnRZSzo_b};PLS(a&{X{lRAv6P-hi+{PHmR4|Zx-7ascI zonhI5i@!BYpkqIq1mu}%^y`{Z5|u@vdc#tcVtuKuNRg3-9(I3zGl+K!XBNr5K|o^{ ziUwgb*8#r+b;V}W&@>BB=wz(ZOVxS(TvQ|)c!b2Z?w#L6HR7qzJRIMjnAqhS@~Q+KyE5Xg=w`6_;T^dg_?+0CMZ6DDkL-FldC>^g z`VE{8AoI0@qMtlK-j0ID3}szJ!bXT?u64nm4tmOZPr9S0(eRcYlh!>wtE0k6k4EB@ zx|D@y3|F<-tJYg1g&wc_wd?!gw;kT{CuiXA{LV?({tRBI-C0ss*cR=OD$G!2St?qO zt_On-ktT^$Y|(H1<^HcA(=uQ~;;v2@pGb~fA`DCC z`AnR6++wE0;?Z)p;^IpUEp}t#a(TfFGZo%@I{}V?7?%kgIEumYyBQ$yZBiLIgJl(!Vwdzaymo5L2J0DL0!t+w zcchn9Sjb5_c#sYe5`93TcyIi|bky7A4gS&3c>kRJ&Wth=s3+|tAKHlkvPa)A3@p|F z`g}mK7RH^@|Ps2AM;CL=YfezKR~H>nX&*2MLhiZ>+44F$eV&bHq8Js#W|V1^mTIv zJ_id0gqr#KB2;K!71*v5*sh)#ASZ5Sg?Z9rPg+`4kygJG7a$!yc6kT>`u$U|W3&c4 zz5&pRT^Fx8uDkI*5*v_pIP4zIXQ30gbEbjWBb)Hu8|DG1Ckwu`rT+hxuEzVr+jq(P zzX4fvsIrh}@V)!KEIw zp{31igx>(BBipX^V7M9>Z!iVJjcz)V#RWHz$bd1>&rHWu<J6Cg3_`i&0Vo&W+l8I?c9Q579n6$KV<3#N16kB5pJE&w?@64^ zrY*77-v8$~Jo&fhf-kO{{chYK)4fbq%J~@w6 zRsY9R@K^uz3ITSy3^5g#y)H&yhd(<)qdGPu>oJ#+BcsA|dB%HM92CvQLDVL#B?H1` zLn0PTDw`^4f;f=c8p*>A(y1~dmrnv)!ehAaJ{FN<9VOM0dvYY-x`(1y2dLf`JCBD- zd8Cq-r&DIBysZmbPl{6XESPkzsvJJXPFtx=&TG{9Qb}G|8uMp2gEg6X;{M(-3vc<^ zS*X?wijwroo@R8-Uq4nIPR4XP1cOmd>)gPcNC1_W-t6MP2=12$&!lFNTqe{bL^?kL z_EP3wDubC&{#~SP-w=5?EC}gT$^G2YaU&Dq;PkC%k?MV}pZdZ${Dh?= zcJ%^6ve01?==jD4c>WT_f%&nhab5YFPk=-csG@mlEU&sG@kcb}e{bn@Io7Owim9#pFcG`t6$Z&;KTk1nFvaDkg#`gw#r`4*X7 zNq5!2jQ45iy>@&h_!rNF@YHNg_d^lod|85^pDp^qWjSKaW9>v%|M2B2(&f zX`SD%W7U15e=cZo4xiksGO_%8=^S@W++NfjA~}k{15L&{Mgo-GzZKiHyKM&}4zBt0 zE?oXdT~q{?yHTRAWIq<4yj}WUq~3td{tQbqCYHGbvbCpSZb*;OEz(G1+3|Y@t~?lY zpEDRzZ%k$@>5u@5;YjDnBDTeHw7*D2MVDQAw1paj`B!}UNh%kcna!~3pyqTVQ5ua9 zyS+mq5~zbDzJL~$nb9EUmE&b+OX$S)O2#@Q5eoTZaLGB`V0mX;hwWjrV5`CAzIKmT z(aE$J_2Z(n*j9k7S|GgoueQKTtdZ{{HnuRj=Km3Kf=mK%e=1R#Uo3~2zQw@E|$7-RxG$XY_y>hPMx1Bua` zl09CroN6v<`;vQ~f(DFwe=9m1FVR}H(h}n66X;q261XfblWHOW!(Y=tp4iakWzxyw zv?_It*PzyxL@8Kt={V&*$4RY$>@l+#d;xCJcG1ViegBfbgE|horSn%;ZvJR)OoRy9V+*tVDKui9`GN`t7Vff?#WF{k0 zX&jefS~nCqK#-ycB_~uvZmjrXQ?*#X+`yX{Pjy+%;D!<{RaQmA^KK6jOL%?F1>}@m zw)w%?^>Pj}bt8Sy$V zZo;Lv*Oj+@nb;5H{Uj5P$Alt;!;Hnz1z|KYDEQ%6jMx?!r_Wfp`hnox@Alxtt_Dsn z3}J0shzD*90sAQyc}nQBNCjW`vsmnMtdIjFoo}9kxz9ZgbDw<*Z0aV20CUs>muD7= zy%+eO(t1*X;~XM9>^b_L9EG(U^RBo@*f5f4g2@I#n)C*o2>KM7(qPhT#+?qRA~g6I zuowT?aX9j0uP26wg4L35&>Qk9_+RUfiy-Wl{dMN5pcv+9Sn%a zN3YU=AOaleY(ln-HNsue^Q~W~gOKhU^-k#^v6>@raA7i7B$B{vM`e+oRfV^bp;vOS}9<}A|?VY`IekG8E}p=L!NkqIrla(+zLER zdgEOdrNFE}bOp*;l2jP7R3TqO!g*mif8->fzYPJy9)yGqN8onK)kDf-9e^^7gH#M; zcH@R>=v5s#wT)uE1UTwlGF!#DRD{v6x3UBNR5?BoHF}flCMgcqZm&b!s&9P;5{pa* z9Q$OL`NpOIkL`smKxsGJY!dj+Y(W36 zhhYBhMpz{vT@2oa374)yc?imCI5E(cWooJLH z$kH*|Uw7&Rh{_VE=*3X9<3+dw1cHk}iN)^Yx81s(>ETpE(_9qDTQ6Ive5vb^RQe~fi?s}BpKqVR7RGThD0tGxF=z{|sC@w2< z8Q_EAgnSMwH(WefMxHE6(ghMgNQPM9eVjUm@6SM~01Gxb7z|CYoLJ4Lo~(^?$_h28 z|M{!~f*2a)cOYF(w0Ll&z$1%!9R%}Ufzd;~I!fY&i*jOE+ zPD*+%&a8ynV3h3eAp26?%}tSLgK-_kn?h$}Zb*h70V=vwY8VV9Oa;U+jsvd5%Z|fh;~e3ITdhgBM2& zE3y{q6^3qV4L*1yN3M9GFLj@Dx(9zz$VX>;Wqq8?P4wfuh6+b`kG5 z1G*>6j#(J>CVK9c8sG?^vrn$&$#hykt2{r0p}9}8W!eeMKL~mokPeJJd3~v$#dlyA z7#S?}whsF1oXYDnDfkhy7?z>T>JFLc;=Sr-b0hckAZ9Zzqf`8Bv`=(7mvu7fEuuvt z5rwo2$Sju~o%Fy4XmaK(ZtG2(AA*XUyW!0K*8MPl=bx2glbM1BA$Wr~GQ1=)7?%wJ z3%dvzVmorIq_T+m8dg-5{B2Egk8m#*D3ODafExS zUPI!Nj1kt|oM&cpg?OEQ;!K?3B>>BlLmdlVfW{1`L@G@xL23*s@C|n3$NHdmqOk}W zB>|-UZrbNfCLw;$bnXaJL;+nuqWdVz8c|vM_4Sn)h!t)PNkVRji4W=;Njc0gSWFs~XNGWEwFLP@{u^Q6Uh{2G_fR-#?)At=b#vhynvMYtqk{Ex;-8VCzX0XUN4NOopSH&;n!7Wx#M*c~uYSF0dqG zKy*I#@UhNja}fi(KMLKAM5=)d!Z`N8FoUUiL73%aoxo<5*tFzvHUz$;&w-b1ATe4e zea8StZiEQv1^LT4KGhlO%e{pjifEI`Pe8@5*^oZ%O1B57h(z43Q;S+3Kpp#kOwh|n zr_TO1Ujjrr)iGdNz%h!^iU@_t*VpUJkkhM13<6ZF4b1)iLr^_=N*JfG^r*Tqu!Ysm zN;Qho2KBN8E}JSh%RD0n5+Fn&A3;_y1hja+hAWW8uNT2V5|k#BCSU-uQg*dueawKK z)Y(JkLv0*5wR9vZ5pb-pMZFM3CNWxasAYz;+&#$U_mpN#FTmtL_<&wuwKNJ$-WLRA zQgktm5O91&0Oj@|P$k_jT;%9zZEdkTH(%&s)F@MS$KV64lK_3#VVnu2j7c1e^A}1m z@(?<4`mz`eCv7{yJw@14?qT~~UjPuG@sf2ioAfkK{xH$-a&V4BDk&>~6{7=T+&!CL zk>jw*HBp(*tpAGt6?K^`CN=Oji4~nx znes@GObR%QQPoGAjdj!uAycFA`9UujwPM0A$^V1CN>7xaPSihj6z={ zAZ~xgrd}eW4!*(E1CK%V#HrkmO3Fa#XkNI83Wmg-3iJuPS>zZ{0F!{1*CN!C8zfd5 z#!Q*v92o}jnw4RIW%VNIWMUC2pgCeVwoW~-D-p`;yv^ZxvAmu| zYU)Hm+ahA5m6QOQUg!pC7x=PK-@fuB7QJf2@uefPRYvNCb^p|+$yw~JI~gLOMc)$4*HU#U@ujPWD zhwn{zATTfsuwu{Rw2T~(_fmj}A+^k6y1cPGy)Y9h@)VpWSBI6eXw7H64S*W1%aIC8 zm8GpuW;_pMm4X5sS*qS>py6`;vK`4lFeED3B4r<2m6o8^k=a~>tv(e)quV7lHj*Iq zw1wVW4@Kjc=*)mi@3cuk;EZJHf=EKtOpUWEbzq{S@%S(Rt~Wi81;*AWRlH_4LjXx* z2T5ECOPOpngUN0Yt*3G1K#NXcHU-3(Z}(%J0JbK%0EWA_iRjdc3&<0n;D8PX^2K9D zkvC9&CP`6Y$8*VIUg> zY%E|aC7{uEwo*~Ab5mV3#*)!xDCiD_B`P``Fd)Nn{IhfM^dcEtR^5)d2|=* z!k7S%cw<|18Ui${340!`;49Z+%Zto5+OrMnCr)L(fx*U#qR9-$AC*8B!DC)osk)ad zw^-EUz33ciw;^2%vO--zPeM3GEY!w(@w<5e7%pSxM!7#gz=lQ)vzupj(-x{nrrUVk z4iuvf8LXlZn$fJ(niLIEiyutZFwqG=bGn+S_dVx^G;zmnlj|NjH zg8^2yp#$8FNwO1Aoi&fv;dLH}tz&Rz1-32h0sZ~Z1Prngd5nP`H=5iS4HV-M46zb} zPJ}2))FkGUkY)tN7 zMfgI7BOj7ij!P23miQzA*JF6c5y${6iA|iH+k&bQ$QG$h086}!Y(jd5^}YZXgU%D^ zJhY62XdJw5A()9>5u?^;z*#mBlwn|$NcD{?V$)i?h>dW1dlzQ6O_NW}C{dUhP5@+R ze*{|tRNm?!aNQt_Hm0{y&vu7L2cuq)=S>i$tI(O6EdVDS1YJg{;cIB|2g+EW^Gr+s zV{qtj6^mhJKC9d+@ps9$YB;_dt;h9iu7KIkJ_JQ#hD(35!!{WM!f;T4DW7D-l4enE zz$W)0mTdhplZ z{YC+n)1sY!KKrE{iyiubd&$U>vB z1+19II=lF?ZO{n@B9^;BkT$q3+jNWvUziv2Q+Qt{lGh+7(O4eITN8 z{mh91EX6=&`sr!s+f&%4mEB0C$19{+g@7vGq3)FS2b*5@%Z%Nll%K)n1*{Al0wU#M@MQqE z0M0WR`P=~bm@66q8bQN1T!KEf2%fGts@wA9h~}!x5GtW{&rS!Aum~m zd9M^e02fG$+ z$l)rJYTk=D&XkrZ##pvuA_Da+3h1M-kvAzFu98#ch6`Q z^fY=H47tKn(UG1;<%HHe)hX$4c69_gXfNHA$eC-XEJK_9GAbSk1f#=z#+lU<^wQ*G z(xOd?!D6JmX1-QF&3;-uYcX7WHmLpc$Zl_ZsFNOR5cIYt_<*!El^9L48~DsxX*@BKW-HBJ%yRiS#%Y-Cykak&Z_O!j*`yyaqa*Q3%*CSE`z)#f^7lyNa`pS( z1ks{1BZJIO3|BLgjc}dWuA==>><%^?7!9cl6N$Nn9W&_{fmtyN`Ybw4qgjo_qGq_Y z5!E3wSr)g7;hgm$&U#pwZL`-Lo{p30MSoV%+q{pTP3#chC{{?83C~8z?g~%GJTnx4 zSglMj9D?HGtUz1Ea5^r^MuR@@>IZ8$desot=BMCvV7G0*{&}KLfWnjqrW7(30Ju5k z4t}g0gHmXP;o=565q zKU}jg2b@FMynr?gK14qOMqHX1gsI2|j-ODn4sK(wS4w0C!!<9_p5U zb|bn5u7hu}S7fM$nQS!9jv=3;e2EoZ{s~)(F3EaYW?x5Id|cnS?#-f;@h`Gi1Yf0e zxSEWEXcTB2?nD3v4?5mH--F!&ytyt6)rX-@nOVVS7GqWeG8!rpp^443&eq^IPa6={ zkACrny+=Vc(YSUWe}!cA%yH3MfOMHjMnGXiw3Piq6hg~rXkEu>aA^_i%I}Nr`A!9I z{_8q9cu)R=>*dk2aiF$++hE|Sd^E@ih&miZAOIyU6G+)eNSz;Z9)Jumkh~)ltzMm{ zL~}Mev}kTO1~wXk`0LNXaNk=3s0ctK{Mqy~NleQAC`Ji<@mLb0;kU9eOaR)kFa?(d z=XfgL#;9+9nQVzRYFmlT$`i0+{!^P-Y?48t#VCu_aL+Gih;eG%VWx-3ZtH{7q8u6l zoX?Clf!Q>OK!dS?ad%1!r0wnW5i}2lWg36i{Kw#UJZ<6B{B zPYJ377>7#~u9|s}wVW{9h`=){EL8k}2JfGs*Ezn%NLaJXM@;EUmW{w0U2`?q`E3a_ z30%TnQ0x;cHG*se1VRHR2SeBlvF|-WY+kl=o*H%r7kdXxqxPw#b*0{xm~CyO^fDZ` z0mN{u6NdHh&)z)-wn2AzkLWxht)4!Po@C+*k;<$KOkgmx72{1{F)<3X2=>pymIT1* zAWr}8?@mE?)53{=@*_!{vIvE?kzm+x@W7!U)RCCwGK(Zbz>&yvYM-!{%WUWJ4?Ezq zAAwo3QDAmsMu)I1l&%@a+u~mf`TO(W-un(EIx~CKqbyPdgiQt+v)y;r25`yFS=h5M zs}%nXGej4Ao(#utzNZ-eWv z_^G9E+G4DxsGU`4my+P3xG>-(Jd(lzQGygPWhS z@b&A0h1#p3_m@XN8w(OPG3^^*CT&abb7Oo{?Mw?V_XnS0jK%`3tH=OA{)u}-A_E?> z?@xD{%=0?KAU-r9_TUHus(31DL)uP65n zhw?l~j~1ENghZt!W2k;+Ed<~jFsi_dZ+P*#H4hx#|N4K$rCO`%h%bMiNgtcX!ajBS z7)GmJ+V_ zD(vMckVZ-+``j3)xkIG_S_JF&Ukmna--DidfKqRc7jii~#ho^d&wbjWWxqC4LBB>f zfJ|whTM*VAoAcc24A7`}bd&J>A2EO2Uj=Oz%^-j-2*UBuq(q6;C0_Nc7e#`G^wyM7*jiT^uCT`cIEZ> z?)-c6!!@kVd$|7}{vgzkJO$k^e@jSBC(W$LWI2hh4u>7-f(px3y)*HUp8~gbFeahvYtdac6aU9lyqBxlf=5G6(>vx!qON1GLh| z-uab7;RZ{rN7Qu$ZAI>%?HZ&G>w%r@XQstdft2Vn0yf8aKMKS2u=C4Q*L zsR*zVr9&lv&>69-!{D}ZeRRkgWtT?;-!t389l9KV2NfG7J&%nu zjx@NuU%Nc`yj137rADKmS{st5!HNZ&+#HQE3SvZ}alg}s))?3}>do5>7|62)89252 zH2RlB=YX-6i`%Lzbqhc`$Uf%k@a4ATX`pl{H|4c75HEeq!jF7zdjQ;jjezqlpm~il zkhpDX)V?8I4nYP4fV7_-z&?Yc@WBO_hVi8}nw`4kPuv^iW^n}|!~J?4*!H3S0=hdc zPQa=ORCygO&YA(>86W0AW`}gFiL*Zi9eW#EhE|nN%|MgiWRMvKSp(t%NiL6(%6sgL z@~s)MMw9glg=@qQH>%s)*cua~F@5~q4<8Bzu#{Rp^_P#mcz5q0zm_sPIr!@JHh~nB zxNM8YF_FsRREbsJI$vLp^RRf;qV3Y@?zP(%pN1quJXmkr4*ehgNvL=2ZYlhL;u4fZSrb&0DJ80X}ir+0M=54?Jvp+dE+4?e78Gohkw4p{9Rux9fGa5nX+sCnfEB;xMNN6Oa`QFGd`1k+a#f4$Ose&!i zyRZ1~r_tw@i@ixfXAjd;bNC#_Na0EAHX!|=^3!6qDAx{1dGNY{(r{A8$M)rNn3#`` zcY^M*XJrOn_vUw|3Oar2aWKQC1eJ#pghpOhz{nP31`mM+GHArI6bEj(&d1ojQO$3M zJs6Y_tWRUbGLy2;O#li&?hh(+I?f`Q-6pc_^Q1WJ zwB`L=p7pU)P;EBEbf_#C-3Tcs&H`oc`TD1SVazxHcot^6W$FHYZ`eH&GW2t31qvDx&1|ZC*S&A79REJHkw%aZgUdnxFdv&k^U;mp! z@Yr|m2Mwq~hofzJg}k8}3vE&3q8<+}9pCd#*md1f;mSyrO%)BA z&BBSJIvQ^1q%~X~`W@*8!f=z0s|U*Ybj!!}q$rp?7f52YZyiH-Mg)0ng~fpNwu-jH zi5u1M%Fq16OOC>Xv?bVL`q=dk-WCe-W)7=xU#p1V%Px8&R8_a2Ca;&k6)jFa1v&%J z0#w@wm?$DA0I@AP#|(&8<;36G`U*UB^bkDt_`~2f24zWT04f0K;|8{7+G0QC^JjKm z0`pf~4LjcYPN;&&w4#6IrS57K-!=N3M+CC;9zI`~8)hzNUjR*)Z%Wq7>t(?C767%_ zMV+sD>{xItHzY0*RB;;n2s$7DrsqrGGk4tcQ#=1#*djeU*xvE*qN)86@3RPC;7xU= z;nH1KW~Nd~s0LkTJ)VBl&@o)+7DT$|WWDWKz_jK5XF1N#xLOV1JI5Y|#~!;M&V2W1 z>+K0`TFffZx)tb1eN8xspxSZOwXiLKY;Mn9VK2>MIs_HZi=O}JMrbS);L*|nwkiYg zvJUD!b6C)i9b>?8JtTUd`mm>0p*ns_K$WaKTE}f-yDC|v!L+hh-gC>sQP?6qE7)TC z_+rcfhXgmyQ8#qHClLMlhM~wP*#H=>8~x2U~!s7%gz%;T{3%oETs>$OU(&1Ssp&Gun_&mv4OT!PCTmt@OQ|DY6^ z{A^AG1=>JT>ps6Dv>F)L?Di1Fzu0cG8Hiz!ff}}>_z*W%iPF0bIOEZSMH3 zk1lM5eNC=&%B{%OkTEC}V=f zY%Yk_IqKLXeQhjG3MFIZ7OPmXy$>ccp9Ud6YZPfsXqIuhd}qtpuhzZedIVF)n>4j) z1Xav3N=g`{{X%B#`>7hy+l3A$Wjg-uy1bZrHKXbCS>(dR_YOwP>9ycjTS*M2*~`>b z($~<{VL1*O@MiD)&5v(?R#uDYIhie{7{Usc>CNGZ`uIrL?+1H6IC%V-qj1@-H$W#E z4BSGbIUy~zzc&S*wKmk>_=_dUf|Z^Ya(eD&6mQ*tO!y2MjJ^buQw(QSf&12aA(HtV za*|TLrLYfd#V$pqBcOV!<3g<(lQb$qRM{{oZ3RG^_ZRQpeg0ND7}UN1PXNRbrz?x%SeSwqn)tL`n>4CB*|Ny9*T3Jy{@mT zmR6tN5_#?Gw)1SItI4%JsO~~gIC6^t;Q(bEnYKA>r40=>K%`@&zP{t}rXapFtDdd* zohO4Y62E9;rKbyyn@#;-4DU;h?FhTu|F3_xFww8pP6l2;`q=efxj(SZKGe_H_vV2I zY4qwIT(GNz4Mkn7HLUs?d%w4Rf@3u!&LWJ!`bCr*Jqc^Vbq z82^l)P)hzYo5f~D!xuZr$9Ck-`;iHi2pW68}QiiZv>Hg zRhr5j3!4R{7m>;QmO2hvT>{+cknzQ`hMI0#q7zhCvNjf84A|(h2p)2z%3LC5Tud3Y zts+(8|1E%I3VW&O9b5p^=TkJ0L9G`J(d4|MJKCH_-jgo?UOKIMMzlI^P6ePna~jYP;xqv)xw1G8&-86$0%CgaM#8xG?83dkX8zwND&eJ+x zFx`Y>1)V|3cntRTJA*#1o{7tXW1kb>cXJc!?>Qm3af?_uxr8}RwlN&Qx1at7T)u-vDs@IS#BJ1#7|+j5 z7DtH_Q>GKLv5}4%z7H3;my(t`@-3k0%4ji6++P8V83@o?>Pl3%9AiG-r|g@tV+Et= zV;X(Lu)Hofj4Na)Sp$=q8Zsc$y4BA~y*L!uAjG??CyoPtg9|%CqD#Y))M2JWv6=|M znWM&xo|jPo5oMq!@V&84($+OD=u(iJ>dOPC{XSj zThGi^R;C$am$v>=upgAH*A~5#*sfRtz*bBL&v#v257cqF9!x%_@5k3D?r)*c7fUq) z^%Ng~RzLBSj8yV%W)pqQXm*R;J%8fg{?fMRWfW}j=r1gxIJGxtpgG{V(Qqsgu6L?B zFx*wp4ZzElOB6vNtT96Xa(5*x9QByWU#CG=tn)RuX#HCPYQnxY82MV0mPHm9Z4%1t5KyMm$%>c ziTRJhi%2gTY%vwqX_7Av*iy~Y8(=@UD-z(ksdRKeS+i3H3kdD&3eoJxpadxQ$+@Ie zx7n^>H)sLIjEkc&ux+)3lA-(rfK37(14i;p0+Y|jWk0Ai>6zLMN54lBolhi2OID_} z!fY6ZvI>9(Ng?j5%_F~b+w2?QMWz?5vlVG%e!|pne|VFA-1MUP8#TnsrD+L{KK(Vg zWcw8`Keb&sb^(;zQRblKCT>`tONYx+$F9unn(!p1X+VyVo1mUUz!c^%DscS zCRCnjGaNrg>#=-(4E~N=dA_=j1sJzX)$0}eR32+eHs*5*#*QffEizhC3WK=xG`=z} z`9rlpOWQ$aOB1ttI58Y-z7JkPdP&R{Q_|mj(BHs|&kewXS7RWx9=CID4_q{NiK;w& z1YR$hKp*4%reFoo%q988*)9XYNQ}141S#JHHY-Ha^ILAA$Dd6QZLT5}7C>t>|TGn_12zrt{(Wfq(JK)4v8UA-!a<#S{Ry93JVQPqR$3 z?p6X%f9PwjyA5`4dtK1ydP?-PDqlaEX}LsnUfR}RkbTesDxasADt|zCYtggivIT%i zy4xf$!q{`YuzkE=zn1LqiruO_P6I-u+#Y+9+8;S-Yx;I-m31}|s}v6nz>CJ{t^fR2 zXK#gIzj9}&w3~2%1o_?wa9+(_;b^XlWH>Bb2~+jV7?At~7E8y8nPi(; zOTWdWb2Phwx&{M}v#?(e6xi%IWBEx;HHk?$Ka7KBYP zU{{_2{;Edm$pNJ?kOpbjmI20Ki$#3b^8Y#a5jYF!tbr}2kG(q>3 zat+H}L9AXJ#3~yD#!MEeS~OzBz~n+!#|w|X649dGwX9jb!DLZo#+3fHUezs%V_*xm)K8@viFzd|4{l#+@bjqvvei?7;{`}O#&xkYBd{vGPt@Uz$%9v{4f^=Z zjmvkM6*vp&r5OmVw9(nPVY->VKNQ3wPS6q(eGe21!C|XOVhe}*J-zxQtgJl^i#y&3 z-OiMRs<0;rpo0-FM6H%2FXo_-u)xQQR91!OR39nnc!Q7EeM6sD5b zj(?AMzxko%J7>=d(D?DrYD!(nJ0X7R{34hf&SKrI?ErSlkcfuE#q*bpiMwK(75uiL zAnbrO&tn^XQG1lJ#bAEoz4A)Qg8DpD#vx4@*?Xd=_`Ha)wC38@8i!DaZ2-6sFxd;e{<_D-Y+Jdb+E-$01nvqrT_=%%FSO5 z_Q3wRy6Pmc+MnJDh3Mo5HZ8@UYHmzyjp=h{LdBK)yt+Q!jGh?^3K|Dw&R;lSL5Xmf z46L!dTU@_T1&Vj4<4I!~!XU7jAFd~0Sr(bbQhzH8JZX;j)xgp~7Rw^^NT7hT4z$+m zoZXZFR|UXb|Uc^ZasF689fw5i`&Vl$dP z!jcidKm)_B4Q8_hwj-|N&k4}Bc%`$K1aKxWocGEqC6GB{JuPA>0?nVQ?oaPXOc&iG z2$)HtE5Ak?P??mr1|DpYugK#)l;Si$$C#)VkSaE6m9((0dYwt)a?(Dd^u5iERT!)u zgZP1B`PM448BoVZL!BfDY~Cs$#<8Et5DGx^=EmiF&JED`9nWbJk?NyJ_1Q{QLHxMR z9}N?o&g5wy;{NRcbi3zXS1_Hftck2;a-^Z`#HiVb87iMMc0Hmd(`H0(%es&Tf`EQz2jZmIM#7xc0-r=Nh0wUg=oNnC1BLGB7vup3%U zAhR;DAI+KvMz;RYxdxhgjh82V{Q9rl78W;SDdMMXgv}rWP%|2fR`kndV9rJHI&%@s zcIHLA6^gv*Y?*mV{mzUjxC?nIXsZzRZ5*wTkm0vt8P!2s5rmak;j3 z0tV|RL>~h-0(=&i3?@sKyRaOsqg9&pw&?Y^tLdzMborjWXU)CwZ0ThMTTB?*(!&Bh zv@KOWR`w=|N$YsHtb>e>OgGz|N4<{TYAZ3zz|i}~42Cvvi*v`XrNL6Bt(?XAgaW9P znXeVUoe<|WUR^yN+-0kUD6}+>oRxXx%5~FTCy^waP8 z%6{w2Cz9bX5p+tt(*8W(h$sEUx7g0ZOm_|zrgw$d>%15g{F>wJ$A{X$lRq$~`$0RZ zQR;yCUcLad9MwviV!}31H#X0}+WN`FWY_>@h9F_C%wB3HA(I>)0K#M?=;*u?p)5bL z{MpyN;LeXPHN7HWiz&NCV6hD_**1#t4`9rKRYn99 zc|3aAi~XR^ZHrBH%_1|4VK3m&hRI+f0Bmp));CV3Z%~MWpDv+Aqty(R!4!|%47%vb zNL_}2jUW?@P;-A!AAWNAGm~c-I@jqH0~;qTR=L%)gI5bI?UVDs6Relu)L*<~5XNP+ zV569gj2B1lPj_a?s+-JsW`g@evr}8-LQCX&`D=&qyQ6G zE>70G(QLrxa1eg0X)w@602;7(ftU8Nh*eC+AGpXmUd~$r6$<9d3<+sq z&U64_W$UE#MNr1kVU@)pi5=T5bTR&5ZR*YH@T0YH>};Ismk+-@*5-4iR}I)Wp)O|* zh4Na=x>`(ay$+OUoxps=VvMNr3o8JHhz7kayFvPvdo37Ie@h_sj146&n?7GN?WCk8&l`VVtO#ws$864Si z%;4j2l4k`H42{{;ASzrJbYCx$a#%ApHXU{oJhwCDD(9) zo26~5jRehLnJo!~kwaHPIPCTi$h-a3A~GkXS2fr;MbMcBmc!%TlytO6D1&)`cS3)ya8 z3%}c5#USH!UVx2L0^Jan12KFs6mlO)%L~&@)W4KrV3KuMf{$~H*Gq{?zFr%2So!Ug zqXh-SDbb3DL??zUuMAJ=)J_Q;8RiIf;x5OWmECsEl>^JH4o0MKNVB@sB zJG<2VN`U@%g6z zq`x`u_nqhCY~|X7JYl00005NYjG`59D=(9cX{-C?=QTy z;_GH+ADua8_Kp0aB>fSY2pI+j=A*2PgenXST-MuXH^ldEuUoks18;9gjxstfFfe$u z|DLe2sx)VBKf=1GN{ho(PLLeDeSx zWo5}*{lnW|BvsJh$>8qqP4nc!A{405%DorRdB&}-^$7+Z58>YAOm}!Qp8^|RDlzB(7QK85KbS> zY5Q(w(S^;|0mdweBKZjT$~zImTHi`%$Dg&OIDz4gxI<+<@RT?u$gkl-+G$3KuZsZ~ zJQ(|@N@ul;#-eYkz;LnBKO_s=qj*>TLsKkWpl~FBF>@q8R1^!MiFmHG2s}44wm+Eb z?d|0RL=}*zqG_O(IH%<;R<|?BkyT$HsdutPm4w^}6aYpjx6S}r@N1vnFZAYBmNQWQ z%Kw#Oxx*5IJ6Q`Aj(5a*(>=cg2~lVgBIoPqKDvB?f z&Nxz}I=Jc-W^_}y3%wNSPj6MADy1PL28B#ehPfFdv{=&RMi5mhk88O|zi;B65uksI0O^Vc2jn>hNUg9FeufYXgHxoOi< z|4@|_$9%xbgUr6ZiC0UmmO(p3nXvv{2-8VP80=$|A0Te3U(cQWZOL<%kOLtZeh&%jK%`vQm}# zye?eiSqX<-g$N0S5;U^+p?P&^CY%?xt&!Jir0(F^EJM#))W_NepoBHFo@aizzN{l= zo|oy-wlO)kXCk27XC+bM8ExO)A8{gZWJwk|>`?TcM~io=vrj4ab5Ds!Fl4`1(+PiH zdy{HvX|2Vh2iqn1oC*A>-21|ig>q@xxgFgBcK1jA+VDI--ca}q(bM*UVTgPjYia41 zC+pRiX-pWSNW!=D04)N0Nw^Jaw%^X~6wKG7&6%NucGYpmsvUY`?k6bOxp9QCySB)qfC&@EYJI z83ZaiD!%agDvqXIo;x;-0foFi=`5_09GScOh(wa7UbGbYPW%8I`(0d)Q;`T}hZDQF zSe`D8?DeVK#I3C>4;4w8v}~_#fmGf22XGG2_mKhE1wgNo!mhklTt#t)4+0q+)xDhd zJM@>)^L30y30Zx_&J#5#o8Y}(P76sKjGSg-!H%;VzG!pn^s!p>%~NxNQeY@kRxRS! zdl18E=g@OzNP*6!V@kcuWxRC_k|&QeJPv$YPuCS`+Cjx z`pC&-JRcT=IYAK3$^?-~{hnZQDnTbqfi!suBmAp>EWdvKg6j)+E)e7!40WpTuN;<` zoE5@1WUsJ6wG8}k)pDrUCS2L7#L)C1cW5D@S{r=#0xMe~GPZmjR=~H0T^6a`w9XiGr3Y92s1pA(H-nbnXN5Z?*c^@mRq4+H)6hcC_<0@28izh~TJD0zP@? zBc;&m@{x^c=Z_E^ZuJdjM3tAm3%i+mF@z1Z?HQDD0IOxfbqF`soTM zx^?v{gs7uu=Ih=`+r_bSqrFwa63GGu9B}>}AGu3i$FnCDUbxQS93;6yriCdB%EEl! zn^M_B5aBlJ#z85^dglt%l5}D7?NW}5J;MRwj|lZd)89~izs_l;N*V9+Vmo98cZN89h0dWb z16MRc>tM##$+Q-?KY#}$shIf4BKna}FbOC-t6g8Kbp(GTdrZuw;0!&32`cJu)#yCj z_spG?qlrg{ojXAkxtUHattJB(KLh}gG)(wu-&B>OnOzr(THs8R?46h;P+E%~w-{TL zsxK1U@<|w`|9*e9dVohR)bI7qcrKVLK`^PQt@XIJ&p-%oc{L?AAvs{O@tV-6)u!qb z>?igNTjwBw^BYFK(voCjg;(J*5?U_Z%lk4TD)O^e2PUDHlT}@LiQ3t&me@2g*pDD+ zr`>2fSOR<-S>A3Mzd)M$*wWF_LWU(k|9SYnaFC~A45CoSP?oYTCU3}z zt6}zdzxU{c@%rj?t<3%9!2O1@s>n0Nj$ox_OD#afX61x=bKq0epZTkc7IZH@Wls0C;r}I(Xcs7X! zB|sS>M89lKh!1M$cm_0ti>@37Li-_XYrxLlCVZFihxA)J;O278wh z;`UY>K@rth)tIIRvbCdnXW1pnTOS96NY)b17u>uHVNC%xGX|j9K$bt%vxzK@Lho{| zOnovT_f8U-@Qw$ywnZ5Ov9PM=JjTR@(D|pe`DldkHtm~prXws8qGSbI-VJY^%6%v z(wW(_^&ALllx(e6EEvbkQuYaDOBRYKH4_e$A2?-~z{@gTs8#2k&=Ri!3)CVFp8i@| zT#}{pHS*!~Sir{%Q@VNpC7MHFR<+iG>a4YcUGc9aifFphznGRgpE*4d>U1_&JVDnqExG%o2Ox2M{F3MAqYExzm-?VtG)Y`n?NG<%x{R)QlENLr zYJJR_ap&Wy;Jx{PbA_hOlhan5M#`RZ*D;EZiohtuLB~~p3My z+u9B`JIS;;^JJ!aO3Xb1qBoYx`!2~;+ehW)GMc-mjiq0a2Iq>{IL`2VaT`W;0Jp&b9 zm6J}xeSOY|SF5hiC4<6MUSF*kONKM>Y9;hxSw`KPiN833Xt%rMQbeu?>uAdIyPc%4e>Yk_s2J7EG_COvw z&zcO2ZsxIULs?S!+He3*^>iA-yf=_LA9?HRDT^INPZO4n#S7lL;O6N%$PaCB!kxE) z3tCM0NS9N0^)ORkV+&O6?4PtX!Y?SNjbEs6GuYzU!bBi1eJUMBQ^w4-6vsve``S)4 zPqXe{{uo}mK#PcG?MBhdmL`tpGC9xi_oxX*qBSVI5YKSTlWm*Dr^fDBzVUpTthx_{$LRC}=@RABF?WW708G{pCniIG_pQ+CwmwD4R{R zJ%6aP6#R;WFPh`=$}sQcVHMbYu@_yD)oT5=67CjsoO7k>Q(B$-Pxhixy~~mA^Nu(Z zzIiOk>;_@#e-;l;7Aj-PMt4?TVz;kNbxRE#g3IgaA}a8dQvm;fQ;QsNaXowldbou8 zSM-qrVAlho!U13jY$u*3yKOmgCT_8%c%Igc(d9-EasMu98+b$HG{{OogLZ%-{ik586&ID1JLam|6@ziR1`QZ%o8=SgS}TYGQ{TgF z9wpG$u4OM=HfG#*3P%CX1n^}G zIKA|3tJvZE>$&5-`NSn_a?lyd5N6Bh_o~#ZJk+%{{e}B|LjNFEd zWMbMV85kyXX6sC`m@P5`7B6%2OS}%HCA-K*7BV&++)G(i+7WLxC##*){L<`XGUMxxM#G{}w$I#p1U*(|jg_OMZs4+XEYZhvRY zl8pZ$`iYiSzg+QY6{`-3pL(Ru6wh@hFL5+ccD}_lO$a;=+lJh3%H|5@`vZ;`9d}Fk z^O}gOmHJv(p%G48{!y15Z>d9y*_<%SsATXac1KJ3FM^r~Y7gCS#sv8lCGke@9jk-= zG>-0bgz3f4wV5@{(B>0w{q250;>tnkAbQVj&9Y}g8@q?MZJ8qkEJqvdcDb&5og-w; zIbdghy0W`E-*ex_t|I5Z4ou>ofw|pB$%d-WeGd5)a(g|f?U@JZ)WYKJ`Rb|)j@*K!NA1_8{U@wRJD6wX0vCI1O(L_;(7bE$v=j-mj1mM&WluLl zY~B1O1|@Dj^#uN;o>a%%;RM)uIVz#FJ~0t4iDR6g_ZR+VCQu zm0fJ4$>h5(3_a^r2C}Di<{pN_CZNCivsum4yD_Qv%7Zz1 zg6UA6Y!8tpi%oPT;1tSn#L`sPzJ_bf>gA^ZyWth&+N(vdm#r?&Fa#Cz199&tCRhtf^Gr5^7;EtqnJg{bV;d0vuUB#gWp3=>EMZH`Wl4-40NXa z%R$(C4)uMJ`1t+|qDd*T z6AO_=h&9n&+DHGVA9r*;zSsnKO*3bU=llwt=q!0_kuo$zY9#akqD zV;0W|-LX|6Q(8qmOT(`XO}vwGOj>hS_Leq}Hk2biyfHYc1KGBnPq&eV+{^ybP(Xt}w3#-?yej9U)_$K0_?zB(@k(UDsrPrFbDv1+jB@sa#7oZX69zVDiaELo!A`Pb56Yev*Q;E#zy z0SU?eHpcKf z-dtt-5rRy@ZdS7$>6|P%RcBFli+l3yKcJr&dP5b4T+5v3``Xu;rdsx|zTyfJ5|kB5 zoNH@*eu&zVX*F2RB4#+wGZV+1unr#@ufR&F5)Wh^W2wX|3Q!CJ{Dee~V6HLIv`vw9 zeS)ju=4-xHWQd1L9yciPRKo4`!dlWxyYZgUZ>9B9`KzqY&;DI-HDf1Nu|;k~bFIuu zZ}RuKFga3~O--g0K(B6FNjdoMeZ8i4bv@##%yc3x2cR~VQRhpj%gFiX!Ad1WCP|$v zJct1pu0zYW=(XPEUATfvUD4PiF(fC zE^l?3XPdMRTvvLwAXF_-ARFE81ZK)K#}5?ox)kcGAooDyYYa-I*h>jN3YI#(;+ywF z8-c=7hMuuxGBrxpRMMPk=5moEB0Y>h*n#B)+2xFDz)Khx>~28k1NOM z%{by1a1-(nNVQ1@rAQJoBW#RwKbprZ$uty@batxpvxu7%p$Ht|K?Hh``E$^BwG|1+aD`dM*lte zGC0xg+B_ zQoiqkm&&=Z^K79BE^hHa+2}Y_p?HxnmKqk&d9(d%U7y zvu}E<2ez`4^7pvu?7$}1a11DT)Xg*27_VB>fAfneTt#G3%3wP&$C+5#OQ9ZgXx3cTG(pU8NKE|0vuyJq!ae2Xdk z+yn9rY0DfR!syEH&>5xztBl9}FR=$7Ra0b!iJFEJ@0TExaRd4Sw6`C*b6l985^v2D zO}LptOQ@MFp9*Lv*>Q=d#M7|A%RYyH=~`y-zX#!O%}vT4_-;|N$Rz=~RdgB`OkMc# zYrfSEp7hu!;!MhK;sytav58=ls)iKNG^Qo*@dq9ed>ughBQseP!kx}9D`%(3@yl@n zQMOkwg?tr)zP*DXpQ$LunbO?SuYrj%EH3c!sHEJoEP+$5AoqlEkvQ5=8@&~&og`U9 z^3>i`eJA>Yw!J!1Zk557ubHthK6cHclOB_~EwLUJGI1-j#lM>10qqDa(o0*Q_jQ;1 zTc}&VjZtj!8E-r?ntfDoUCv~zLm3Z&_SMoxnGCBXq(+Vqq%lxih_3fZI>fXBr?gy0 zFASNXtcymQAEhf6_Km|ZC2TW;mBZBjRX|S{?JW^VVQi4X@zJ{+o8X9PW6Ea�xND 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 literal 0 HcmV?d00001 diff --git a/app/src/nightly/res/drawable/ic_wordmark_text_private.png b/app/src/nightly/res/drawable/ic_wordmark_text_private.png new file mode 100644 index 0000000000000000000000000000000000000000..58afcc581f2af7e944a3bf9b88be15758437eb44 GIT binary patch literal 12389 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 Wo(~~Hul{*XfV{MdROKg=(EkH_S!K!q literal 0 HcmV?d00001 diff --git a/app/src/nightly/res/values/dimens.xml b/app/src/nightly/res/values/dimens.xml new file mode 100644 index 000000000..1e48aca48 --- /dev/null +++ b/app/src/nightly/res/values/dimens.xml @@ -0,0 +1,9 @@ + + + + + 28dp + 12dp + diff --git a/app/src/release/res/drawable/ic_wordmark_logo.png b/app/src/release/res/drawable/ic_wordmark_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9e92e078bb54c5a7ba98da7124e24ea23edec216 GIT binary patch literal 21990 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 JPDHLkV1mFI_rL%E literal 0 HcmV?d00001 diff --git a/app/src/release/res/drawable/ic_wordmark_text_normal.png b/app/src/release/res/drawable/ic_wordmark_text_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..16ef53a53122540459db8f6dd7743177aa02af48 GIT binary patch literal 10762 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

=Acb%CJC1hx9RF+8Xu{% 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 IM6N<$g7FamSpWb4 literal 0 HcmV?d00001 diff --git a/app/src/release/res/drawable/ic_wordmark_text_private.png b/app/src/release/res/drawable/ic_wordmark_text_private.png new file mode 100644 index 0000000000000000000000000000000000000000..21e67c44ad160fea5e6da884d3e994cfe8ead675 GIT binary patch literal 10114 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 Date: Thu, 15 Sep 2022 15:02:01 +0300 Subject: [PATCH 026/407] For #26644 - Apply the wallpaper provided text color to the Fenix logo And to the private mode switcher. --- .../org/mozilla/fenix/home/HomeFragment.kt | 23 ++++++- .../java/org/mozilla/fenix/utils/Settings.kt | 1 + .../fenix/wallpapers/WallpapersUseCases.kt | 4 +- .../wallpapers/WallpapersUseCasesTest.kt | 63 ++++++++++++++++--- 4 files changed, 80 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 3b1858e0a..f8e8ff240 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.home import android.annotation.SuppressLint +import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable @@ -128,7 +129,9 @@ class HomeFragment : Fragment() { @VisibleForTesting internal lateinit var bundleArgs: Bundle - private var _binding: FragmentHomeBinding? = null + @VisibleForTesting + @Suppress("VariableNaming") + internal var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! private val homeViewModel: HomeScreenViewModel by activityViewModels() @@ -968,11 +971,29 @@ class HomeFragment : Fragment() { text = resources.getString(R.string.wallpaper_select_error_snackbar_message), ) } + // If setting a wallpaper failed reset also the contrasting text color. + requireContext().settings().currentWallpaperTextColor = 0L lastAppliedWallpaperName = Wallpaper.defaultName } } } } + // Logo color should be updated in all cases. + applyWallpaperTextColor() + } + + /** + * Apply a color better contrasting with the current wallpaper to the Fenix logo and private mode switcher. + */ + @VisibleForTesting + internal fun applyWallpaperTextColor() { + val tintColor = when (val color = requireContext().settings().currentWallpaperTextColor.toInt()) { + 0 -> null // a null ColorStateList will clear the current tint + else -> ColorStateList.valueOf(color) + } + + binding.wordmarkText.imageTintList = tintColor + binding.privateBrowsingButton.imageTintList = tintColor } private fun observeWallpaperUpdates() { diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 190ef76ef..e5b266c50 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -193,6 +193,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { /** * A cache of the text color to use on text overlaying the current wallpaper. + * The value will be `0` if the color is unavailable. */ var currentWallpaperTextColor by longPreference( appContext.getPreferenceKey(R.string.pref_key_current_wallpaper_text_color), diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index f4fd50254..d9a5b1ace 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -483,8 +483,10 @@ class WallpapersUseCases( } } - private fun selectWallpaper(wallpaper: Wallpaper) { + @VisibleForTesting + internal fun selectWallpaper(wallpaper: Wallpaper) { settings.currentWallpaperName = wallpaper.name + settings.currentWallpaperTextColor = wallpaper.textColor ?: 0L store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt index e9ef700f3..b2d84c080 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt @@ -25,6 +25,7 @@ import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.utils.Settings import java.util.Calendar import java.util.Date +import kotlin.random.Random @RunWith(AndroidJUnit4::class) class WallpapersUseCasesTest { @@ -515,10 +516,7 @@ class WallpapersUseCasesTest { @Test fun `WHEN legacy selected wallpaper usecase invoked THEN storage updated and store receives dispatch`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") - val slot = slot() - coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null - every { mockSettings.currentWallpaperName } returns "" - every { mockSettings.currentWallpaperName = capture(slot) } just runs + every { mockSettings.currentWallpaperName = any() } just Runs val wallpaperFileState = WallpapersUseCases.LegacySelectWallpaperUseCase( mockSettings, @@ -526,7 +524,10 @@ class WallpapersUseCasesTest { ).invoke(selectedWallpaper) appStore.waitUntilIdle() - assertEquals(selectedWallpaper.name, slot.captured) + + verify { mockSettings.currentWallpaperName = selectedWallpaper.name } + verify { mockSettings.currentWallpaperTextColor = selectedWallpaper.textColor!! } + verify { mockSettings.currentWallpaperCardColor = selectedWallpaper.cardColor!! } assertEquals(selectedWallpaper, appStore.state.wallpaperState.currentWallpaper) assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Downloaded) } @@ -600,6 +601,50 @@ class WallpapersUseCasesTest { assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Error) } + @Test + fun `GIVEN a wallpaper with no text color WHEN it is is selected THEN persist the wallpaper name and missing text color and dispatch the update`() { + every { mockSettings.currentWallpaperName = any() } just Runs + val store = mockk(relaxed = true) + val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( + settings = mockSettings, + store = store, + fileManager = mockk(), + downloader = mockk(), + ) + val wallpaper: Wallpaper = mockk { + every { name } returns "Test" + every { textColor } returns null + } + + wallpaperFileState.selectWallpaper(wallpaper) + + verify { mockSettings.currentWallpaperName = "Test" } + verify { mockSettings.currentWallpaperTextColor = 0L } + verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } + } + + @Test + fun `GIVEN a wallpaper with available text color WHEN it is is selected THEN persist the wallpaper name and text color and dispatch the update`() { + every { mockSettings.currentWallpaperName = any() } just Runs + val store = mockk(relaxed = true) + val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( + settings = mockSettings, + store = store, + fileManager = mockk(), + downloader = mockk(), + ) + val wallpaper: Wallpaper = mockk { + every { name } returns "Test" + every { textColor } returns 321L + } + + wallpaperFileState.selectWallpaper(wallpaper) + + verify { mockSettings.currentWallpaperName = "Test" } + verify { mockSettings.currentWallpaperTextColor = 321L } + verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } + } + private enum class TimeRelation { BEFORE, NOW, @@ -633,8 +678,8 @@ class WallpapersUseCasesTest { endDate = relativeTime, learnMoreUrl = null, ), - textColor = null, - cardColor = null, + textColor = Random.nextLong(), + cardColor = Random.nextLong(), thumbnailFileState = Wallpaper.ImageFileState.Unavailable, assetsFileState = Wallpaper.ImageFileState.Unavailable, ) @@ -650,8 +695,8 @@ class WallpapersUseCasesTest { endDate = relativeTime, learnMoreUrl = null, ), - textColor = null, - cardColor = null, + textColor = Random.nextLong(), + cardColor = Random.nextLong(), thumbnailFileState = Wallpaper.ImageFileState.Unavailable, assetsFileState = Wallpaper.ImageFileState.Unavailable, ) From f04336217677190b40993e34abb5994dad491c11 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 21 Sep 2022 13:43:21 +0300 Subject: [PATCH 027/407] For #27008 fix flaky addAndRemoveMostViewedTopSiteTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt index 72f80bef9..6513840e5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt @@ -225,7 +225,6 @@ class TopSitesTest { navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { waitForPageToLoad() - verifyPageContent(defaultWebPage.content) } } From 6937faefba2e96a90f7fb5afd89998a33b7897a9 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 21 Sep 2022 15:02:15 +0000 Subject: [PATCH 028/407] Update to Android-Components 107.0.20220921143112. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2294eaa32..5d712466a 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220920190143" + const val VERSION = "107.0.20220921143112" } From 8f67b30117effe4570fa14970935d1239a5f3c91 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 2 Aug 2022 12:19:16 +0300 Subject: [PATCH 029/407] For #26023: Update Gradle, Gradle plugin and kotlin-dsl plugin. --- buildSrc/build.gradle | 2 +- buildSrc/src/main/java/Dependencies.kt | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 572c00645..fca9a5272 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ plugins { - id "org.gradle.kotlin.kotlin-dsl" version "2.1.7" + id "org.gradle.kotlin.kotlin-dsl" version "2.4.1" } repositories { diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 877cb291d..aee95aea6 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // If you ever need to force a toolchain rebuild (taskcluster) then edit the following comment. -// FORCE REBUILD 2022-08-18 +// FORCE REBUILD 2022-09-16 object Versions { const val kotlin = "1.6.10" @@ -11,8 +11,8 @@ object Versions { // These versions are linked: lint should be X+23.Y.Z of gradle_plugin version, according to: // https://github.com/alexjlockwood/android-lint-checks-demo/blob/0245fc027463137b1b4afb97c5295d60dce998b6/dependencies.gradle#L3 - const val android_gradle_plugin = "7.0.0" - const val android_lint_api = "30.0.0" + const val android_gradle_plugin = "7.3.0" + const val android_lint_api = "30.2.2" const val sentry = "5.7.3" const val leakcanary = "2.8.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e0..ae04661ee 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 4196308ac619cd7b167b24faa50fb2810f4ba3cc Mon Sep 17 00:00:00 2001 From: mcarare Date: Fri, 16 Sep 2022 16:56:39 +0300 Subject: [PATCH 030/407] For #26023: Sync android lint version to gradle plugin version. --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index aee95aea6..5ac14a4a3 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -12,7 +12,7 @@ object Versions { // These versions are linked: lint should be X+23.Y.Z of gradle_plugin version, according to: // https://github.com/alexjlockwood/android-lint-checks-demo/blob/0245fc027463137b1b4afb97c5295d60dce998b6/dependencies.gradle#L3 const val android_gradle_plugin = "7.3.0" - const val android_lint_api = "30.2.2" + const val android_lint_api = "30.3.0" const val sentry = "5.7.3" const val leakcanary = "2.8.1" From e5cc8f7592aed7e434c760d9670269b23eea7560 Mon Sep 17 00:00:00 2001 From: mcarare Date: Wed, 24 Aug 2022 23:14:04 +0300 Subject: [PATCH 031/407] For #26023: Suppress NewApi warning for autofillConfiguration. --- app/src/main/java/org/mozilla/fenix/components/Components.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 8eb528cdf..24386ab67 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.components +import android.annotation.SuppressLint import android.app.Application import android.content.Context import android.content.Intent @@ -179,6 +180,7 @@ class Components(private val context: Context) { ) } + @delegate:SuppressLint("NewApi") val autofillConfiguration by lazyMonitored { AutofillConfiguration( storage = core.passwordsStorage, From a914e72b68536b08818ca655ba2c37edf1537b07 Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 25 Aug 2022 11:27:19 +0300 Subject: [PATCH 032/407] For #26023: Replace VisibleForTesting with @get:VisibleForTesting. --- .../fenix/share/viewholders/AccountDeviceViewHolder.kt | 2 +- .../java/org/mozilla/fenix/tabstray/MenuIntegration.kt | 10 +++++----- .../mozilla/fenix/tabstray/TabSheetBehaviorManager.kt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt index 3746dd744..bd4a343c5 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AccountDeviceViewHolder.kt @@ -18,7 +18,7 @@ import org.mozilla.fenix.utils.Do class AccountDeviceViewHolder( itemView: View, - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + @get:VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) val interactor: ShareToAccountDevicesInteractor, ) : RecyclerView.ViewHolder(itemView) { diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/MenuIntegration.kt b/app/src/main/java/org/mozilla/fenix/tabstray/MenuIntegration.kt index fec55684b..c3272a053 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/MenuIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/MenuIntegration.kt @@ -15,11 +15,11 @@ import org.mozilla.fenix.utils.Do * A wrapper class that building the tabs tray menu that handles item clicks. */ class MenuIntegration( - @VisibleForTesting internal val context: Context, - @VisibleForTesting internal val browserStore: BrowserStore, - @VisibleForTesting internal val tabsTrayStore: TabsTrayStore, - @VisibleForTesting internal val tabLayout: TabLayout, - @VisibleForTesting internal val navigationInteractor: NavigationInteractor, + @get:VisibleForTesting internal val context: Context, + @get:VisibleForTesting internal val browserStore: BrowserStore, + @get:VisibleForTesting internal val tabsTrayStore: TabsTrayStore, + @get:VisibleForTesting internal val tabLayout: TabLayout, + @get:VisibleForTesting internal val navigationInteractor: NavigationInteractor, ) { private val tabsTrayItemMenu by lazy { TabsTrayMenu( diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabSheetBehaviorManager.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabSheetBehaviorManager.kt index df4cf5a69..bb76ec72b 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabSheetBehaviorManager.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabSheetBehaviorManager.kt @@ -85,8 +85,8 @@ internal class TabSheetBehaviorManager( @VisibleForTesting internal class TraySheetBehaviorCallback( - @VisibleForTesting internal val behavior: BottomSheetBehavior, - @VisibleForTesting internal val trayInteractor: NavigationInteractor, + @get:VisibleForTesting internal val behavior: BottomSheetBehavior, + @get:VisibleForTesting internal val trayInteractor: NavigationInteractor, ) : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { From 258acf5fd909606a0040a03a182d9e546550c04d Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 25 Aug 2022 11:39:20 +0300 Subject: [PATCH 033/407] For #26023: Remove inaccurate VisibleForTesting annotations. --- .../browser/OpenInAppOnboardingObserver.kt | 1 - .../browser/infobanner/DynamicInfoBanner.kt | 2 -- .../fenix/browser/infobanner/InfoBanner.kt | 4 +--- .../fenix/components/PermissionStorage.kt | 5 ++--- .../quicksettings/QuickSettingsController.kt | 2 -- .../fenix/settings/studies/StudiesAdapter.kt | 3 +-- .../fenix/share/viewholders/AppViewHolder.kt | 2 +- .../fenix/tabstray/TabsTrayController.kt | 1 - .../fenix/tabstray/TrayPagerAdapter.kt | 19 +++++++++---------- 9 files changed, 14 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt index bfb4c6b5c..81f7570c8 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt @@ -38,7 +38,6 @@ class OpenInAppOnboardingObserver( private val settings: Settings, private val appLinksUseCases: AppLinksUseCases, private val container: ViewGroup, - @VisibleForTesting internal val shouldScrollWithTopToolbar: Boolean = false, ) : LifecycleAwareFeature { private var scope: CoroutineScope? = null diff --git a/app/src/main/java/org/mozilla/fenix/browser/infobanner/DynamicInfoBanner.kt b/app/src/main/java/org/mozilla/fenix/browser/infobanner/DynamicInfoBanner.kt index 72e296fc6..2a9621e26 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/infobanner/DynamicInfoBanner.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/infobanner/DynamicInfoBanner.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.browser.infobanner import android.content.Context import android.view.ViewGroup -import androidx.annotation.VisibleForTesting import androidx.coordinatorlayout.widget.CoordinatorLayout /** @@ -19,7 +18,6 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout class DynamicInfoBanner( private val context: Context, container: ViewGroup, - @VisibleForTesting internal val shouldScrollWithTopToolbar: Boolean = false, message: String, dismissText: String, diff --git a/app/src/main/java/org/mozilla/fenix/browser/infobanner/InfoBanner.kt b/app/src/main/java/org/mozilla/fenix/browser/infobanner/InfoBanner.kt index 6e8061ad6..b8df9f957 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/infobanner/InfoBanner.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/infobanner/InfoBanner.kt @@ -32,10 +32,8 @@ open class InfoBanner( private val dismissText: String, private val actionText: String? = null, private val dismissByHiding: Boolean = false, - @VisibleForTesting internal val dismissAction: (() -> Unit)? = null, - @VisibleForTesting - internal val actionToPerform: (() -> Unit)? = null, + private val actionToPerform: (() -> Unit)? = null, ) { @SuppressLint("InflateParams") @VisibleForTesting diff --git a/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt index e986f4e69..5a5efcaf4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/PermissionStorage.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.components import android.content.Context -import androidx.annotation.VisibleForTesting import androidx.paging.DataSource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -16,8 +15,8 @@ import kotlin.coroutines.CoroutineContext class PermissionStorage( private val context: Context, - @VisibleForTesting internal val dispatcher: CoroutineContext = Dispatchers.IO, - @VisibleForTesting internal val permissionsStorage: SitePermissionsStorage = + private val dispatcher: CoroutineContext = Dispatchers.IO, + internal val permissionsStorage: SitePermissionsStorage = context.components.core.geckoSitePermissionsStorage, ) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt index 60de1b34e..c5e695d20 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt @@ -105,9 +105,7 @@ class DefaultQuickSettingsController( private val browserStore: BrowserStore, private val ioScope: CoroutineScope, private val navController: NavController, - @VisibleForTesting internal val sessionId: String, - @VisibleForTesting internal var sitePermissions: SitePermissions?, private val settings: Settings, private val permissionStorage: PermissionStorage, diff --git a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt index 1fdd0c2f5..f2e10fbed 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/studies/StudiesAdapter.kt @@ -43,8 +43,7 @@ private const val VIEW_HOLDER_TYPE_STUDY = 1 class StudiesAdapter( private val studiesDelegate: StudiesAdapterDelegate, studies: List, - @VisibleForTesting - internal val shouldSubmitOnInit: Boolean = true, + private val shouldSubmitOnInit: Boolean = true, ) : ListAdapter(DifferCallback) { /** * Represents all the studies that will be distributed in multiple headers like diff --git a/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt b/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt index 3490019ad..0471b1acf 100644 --- a/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/share/viewholders/AppViewHolder.kt @@ -14,7 +14,7 @@ import org.mozilla.fenix.share.listadapters.AppShareOption class AppViewHolder( itemView: View, - @VisibleForTesting val interactor: ShareToAppsInteractor, + @get:VisibleForTesting val interactor: ShareToAppsInteractor, ) : RecyclerView.ViewHolder(itemView) { private var application: AppShareOption? = null diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt index e10464ec3..fa41ae6b0 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -120,7 +120,6 @@ class DefaultTabsTrayController( private val selectTabPosition: (Int, Boolean) -> Unit, private val dismissTray: () -> Unit, private val showUndoSnackbarForTab: (Boolean) -> Unit, - @VisibleForTesting internal val showCancelledDownloadWarning: (downloadCount: Int, tabId: String?, source: String?) -> Unit, ) : TabsTrayController { diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt index a9628364e..f61f05d6a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TrayPagerAdapter.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.tabstray import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.VisibleForTesting import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.ConcatAdapter @@ -25,15 +24,15 @@ import org.mozilla.fenix.tabstray.viewholders.SyncedTabsPageViewHolder @Suppress("LongParameterList") class TrayPagerAdapter( - @VisibleForTesting internal val context: Context, - @VisibleForTesting internal val lifecycleOwner: LifecycleOwner, - @VisibleForTesting internal val tabsTrayStore: TabsTrayStore, - @VisibleForTesting internal val browserInteractor: BrowserTrayInteractor, - @VisibleForTesting internal val navInteractor: NavigationInteractor, - @VisibleForTesting internal val tabsTrayInteractor: TabsTrayInteractor, - @VisibleForTesting internal val browserStore: BrowserStore, - @VisibleForTesting internal val appStore: AppStore, - @VisibleForTesting internal val inactiveTabsInteractor: InactiveTabsInteractor, + internal val context: Context, + internal val lifecycleOwner: LifecycleOwner, + internal val tabsTrayStore: TabsTrayStore, + internal val browserInteractor: BrowserTrayInteractor, + internal val navInteractor: NavigationInteractor, + internal val tabsTrayInteractor: TabsTrayInteractor, + internal val browserStore: BrowserStore, + internal val appStore: AppStore, + internal val inactiveTabsInteractor: InactiveTabsInteractor, ) : RecyclerView.Adapter() { /** From 7efc9fcb7a62f5b94ae726d20cae81ff6eb49474 Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 25 Aug 2022 14:57:48 +0300 Subject: [PATCH 034/407] For #26023: Supress LongParameterList warnings. --- .../fenix/settings/quicksettings/QuickSettingsController.kt | 2 +- .../main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt index c5e695d20..ffb244419 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt @@ -98,7 +98,7 @@ interface QuickSettingsController { * specific Android runtime permissions. * @param displayPermissions callback for when [WebsitePermissionsView] needs to be displayed. */ -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LongParameterList") class DefaultQuickSettingsController( private val context: Context, private val quickSettingsStore: QuickSettingsFragmentStore, diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt index fa41ae6b0..56a61f095 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -107,7 +107,7 @@ interface TabsTrayController { fun handleMediaClicked(tab: SessionState) } -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LongParameterList") class DefaultTabsTrayController( private val trayStore: TabsTrayStore, private val browserStore: BrowserStore, From 017d45e80df996422a0af0b3cb7d9211824e1d03 Mon Sep 17 00:00:00 2001 From: mcarare Date: Thu, 25 Aug 2022 18:28:50 +0300 Subject: [PATCH 035/407] For #26023: Run lint test only once. Avoids running with added extra whitespaces. --- .../java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt index b8daad6e6..207445092 100644 --- a/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt +++ b/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/LicenseDetectorTest.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.lintrules import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.TestFiles +import com.android.tools.lint.checks.infrastructure.TestMode import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Issue import org.junit.Test @@ -84,6 +85,7 @@ class LicenseDetectorTest : LintDetectorTest() { lint() .files(TestFiles.kt(code)) .allowMissingSdk(true) + .testModes(TestMode.UI_INJECTION_HOST) .run() .expect(expectedReport) .expectFixDiffs(expectedFixOutput) @@ -106,6 +108,7 @@ class LicenseDetectorTest : LintDetectorTest() { lint() .files(TestFiles.kt(code)) .allowMissingSdk(true) + .testModes(TestMode.UI_INJECTION_HOST) .run() .expectClean() } @@ -143,6 +146,7 @@ class LicenseDetectorTest : LintDetectorTest() { lint() .files(TestFiles.kt(code)) .allowMissingSdk(true) + .testModes(TestMode.UI_INJECTION_HOST) .run() .expect(expectedReport) .expectFixDiffs(expectedFixOutput) From 4a5abdb84998c7dbd2b4fe0aab556d4a599ab696 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 21 Sep 2022 20:02:33 +0000 Subject: [PATCH 036/407] Update to Android-Components 107.0.20220921190147. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5d712466a..2f8af9c2d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220921143112" + const val VERSION = "107.0.20220921190147" } From 79ba4b80398f7904984630eede47f417e78fa545 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 037/407] Revert "For #11404 - Disable new open bookmarks tests pending compose refactoring" This reverts commit 0d439f91e3f89372426d19298c24ff250b8a90d3. --- app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 7ad0040d8..fa3e2a82c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -265,7 +265,6 @@ class BookmarksTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openAllInTabsTest() { val nbPages = 4 val webPages = List(nbPages) { @@ -311,7 +310,6 @@ class BookmarksTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openAllInPrivateTabsTest() { val nbPages = 4 val webPages = List(nbPages) { From 7fc213ce0c7e828f77fbfc94f9930a4ccdb22fdb Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 038/407] Revert "For #11404 - Update open all tabs warning message" This reverts commit b11fd9131dbb2d2319c83311f8379f7d45cdad62. --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 889862cc2..c6ebd10ef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -623,7 +623,7 @@ Confirm open - You are about to open %d tabs. This might slow down Firefox while the pages are loading. Are you sure you want to continue? + You are about to open %d tabs. This might slow down Firefox. Are you sure you want to continue ? Open tabs From cfa376e5d2328595cbdd52b263c3b29d9af6367d Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 039/407] Revert "For #11404 - Create alert message when a lot of tabs are to be opened." This reverts commit c75e331a30d7c651090e648a7c69221d699af5ad. --- .../library/bookmarks/BookmarkController.kt | 69 ++++++------------- .../library/bookmarks/BookmarkFragment.kt | 6 +- app/src/main/res/values/strings.xml | 9 --- .../bookmarks/BookmarkControllerTest.kt | 42 +++++------ detekt-baseline.xml | 3 +- 5 files changed, 41 insertions(+), 88 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index 7226d03ad..b46307e15 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.library.bookmarks import android.content.ClipData import android.content.ClipboardManager import android.content.res.Resources -import androidx.annotation.VisibleForTesting import androidx.navigation.NavController import androidx.navigation.NavDirections import kotlinx.coroutines.CoroutineScope @@ -76,9 +75,9 @@ class DefaultBookmarkController( private val store: BookmarkFragmentStore, private val sharedViewModel: BookmarksSharedViewModel, private val tabsUseCases: TabsUseCases?, - private val loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode?, + private val loadBookmarkNode: suspend (String) -> BookmarkNode?, private val showSnackbar: (String) -> Unit, - private val alertHeavyOpen: (Int, () -> Unit) -> Unit, + private val onOpenAllInTabsEmpty: () -> Unit, private val deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit, private val deleteBookmarkFolder: (Set) -> Unit, private val showTabTray: () -> Unit, @@ -87,10 +86,6 @@ class DefaultBookmarkController( private val resources: Resources = activity.resources - @Suppress("MagicNumber") - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - internal val maxOpenBeforeWarn = 15 - override fun handleBookmarkChanged(item: BookmarkNode) { sharedViewModel.selectedFolder = item store.dispatch(BookmarkFragmentAction.Change(item)) @@ -113,7 +108,7 @@ class DefaultBookmarkController( override fun handleBookmarkExpand(folder: BookmarkNode) { handleAllBookmarksDeselected() scope.launch { - val node = loadBookmarkNode.invoke(folder.guid, false) ?: return@launch + val node = loadBookmarkNode.invoke(folder.guid) ?: return@launch sharedViewModel.selectedFolder = node store.dispatch(BookmarkFragmentAction.Change(node)) } @@ -166,56 +161,32 @@ class DefaultBookmarkController( showTabTray() } - private fun extractURLsFromTree(node: BookmarkNode): MutableList { - val urls = mutableListOf() + private suspend fun recursiveBookmarkFolderOpening(folder: BookmarkNode, firstLaunch: Boolean = false) { + val node = loadBookmarkNode.invoke(folder.guid) ?: return + if (!node.children.isNullOrEmpty()) { + if (firstLaunch) invokePendingDeletion.invoke() - when (node.type) { - BookmarkNodeType.FOLDER -> { - // if not leaf (empty) folder - if (!node.children.isNullOrEmpty()) { - node.children!!.iterator().forEach { - urls.addAll(extractURLsFromTree(it)) + node.children!!.iterator().forEach { + when (it.type) { + BookmarkNodeType.FOLDER -> recursiveBookmarkFolderOpening(it, mode = mode) + BookmarkNodeType.ITEM -> { + it.url?.let { url -> tabsUseCases?.addTab?.invoke(url, private = (mode == BrowsingMode.Private)) } } + BookmarkNodeType.SEPARATOR -> {} + } + }.also { + if (firstLaunch) { + activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private) + showTabTray() } } - BookmarkNodeType.ITEM -> { - node.url?.let { urls.add(it) } - } - BookmarkNodeType.SEPARATOR -> {} - } - - return urls + } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() } override fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) { // potentially heavy function with a lot of bookmarks to open => use a coroutine scope.launch { - // if more than maxOpenBeforeWarn (15) elements - val tree = loadBookmarkNode.invoke(folder.guid, true) ?: return@launch - val urls = extractURLsFromTree(tree) - - val openAll = { load: Boolean -> - for (url in urls) { - tabsUseCases?.addTab?.invoke( - url, - private = (mode == BrowsingMode.Private), - startLoading = load, - ) - } - activity.browsingModeManager.mode = - BrowsingMode.fromBoolean(mode == BrowsingMode.Private) - showTabTray() - } - - // warn user if more than maxOpenBeforeWarn (15) - if (urls.size >= maxOpenBeforeWarn) { - alertHeavyOpen(urls.size) { - // do not load bookmarks when more than maxOpenBeforeWarn (15) - openAll(false) - } - } else { - openAll(true) - } + recursiveBookmarkFolderOpening(folder, true, mode) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 83799dbcd..48a778f52 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -101,7 +101,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan tabsUseCases = activity?.components?.useCases?.tabsUseCases, loadBookmarkNode = ::loadBookmarkNode, showSnackbar = ::showSnackBarWithText, - alertHeavyOpen = ::alertHeavyOpen, + onOpenAllInTabsEmpty = ::onOpenAllInTabsEmpty, deleteBookmarkNodes = ::deleteMulti, deleteBookmarkFolder = ::showRemoveFolderDialog, showTabTray = ::showTabTray, @@ -272,11 +272,11 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan return bookmarkView.onBackPressed() } - private suspend fun loadBookmarkNode(guid: String, recursive: Boolean = false): BookmarkNode? = withContext(IO) { + private suspend fun loadBookmarkNode(guid: String): BookmarkNode? = withContext(IO) { // Only runs if the fragment is attached same as [runIfFragmentIsAttached] context?.let { requireContext().bookmarkStorage - .getTree(guid, recursive) + .getTree(guid, false) ?.let { desktopFolders.withOptionalDesktopFolders(it) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6ebd10ef..506489061 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -620,15 +620,6 @@ Close - - Confirm open - - You are about to open %d tabs. This might slow down Firefox. Are you sure you want to continue ? - - Open tabs - - Cancel - %d site diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 195c7ec04..535365735 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -17,11 +17,9 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk -import io.mockk.mockkConstructor import io.mockk.runs import io.mockk.slot import io.mockk.spyk -import io.mockk.unmockkConstructor import io.mockk.verify import io.mockk.verifyOrder import mozilla.appservices.places.BookmarkRoot @@ -195,7 +193,7 @@ class BookmarkControllerTest { fun `handleBookmarkExpand should refresh and change the active bookmark node`() = runTestOnMain { var loadBookmarkNodeInvoked = false createController( - loadBookmarkNode = { _: String, _: Boolean -> + loadBookmarkNode = { loadBookmarkNodeInvoked = true tree }, @@ -367,7 +365,7 @@ class BookmarkControllerTest { showTabTray = { showTabTrayInvoked = true }, - loadBookmarkNode = { guid: String, _: Boolean -> + loadBookmarkNode = { fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { if (item.guid == guid) { return item @@ -381,7 +379,7 @@ class BookmarkControllerTest { return null } } - recurseFind(tree, guid) + recurseFind(tree, it) }, ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) @@ -401,7 +399,7 @@ class BookmarkControllerTest { showTabTray = { showTabTrayInvoked = true }, - loadBookmarkNode = { guid: String, _: Boolean -> + loadBookmarkNode = { fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { if (item.guid == guid) { return item @@ -415,7 +413,7 @@ class BookmarkControllerTest { return null } } - recurseFind(tree, guid) + recurseFind(tree, it) }, ).handleBookmarkFolderOpening(tree, BrowsingMode.Private) @@ -429,24 +427,18 @@ class BookmarkControllerTest { } @Test - fun `handleBookmarkFolderOpening for more than maxOpenBeforeWarn items should show alert`() { - var alertHeavyOpenInvoked = false - - mockkConstructor(DefaultBookmarkController::class) - every { - anyConstructed() getProperty "maxOpenBeforeWarn" - } propertyType Int::class returns 1 - + fun `handleBookmarkFolderOpening for an empty folder should show toast`() { + var onOpenAllInTabsEmptyInvoked = false createController( - alertHeavyOpen = { _: Int, _: () -> Unit -> alertHeavyOpenInvoked = true }, - loadBookmarkNode = { _: String, _: Boolean -> - tree + onOpenAllInTabsEmpty = { + onOpenAllInTabsEmptyInvoked = true }, - ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) - - unmockkConstructor(DefaultBookmarkController::class) + loadBookmarkNode = { + subfolder + }, + ).handleBookmarkFolderOpening(subfolder, BrowsingMode.Normal) - assertTrue(alertHeavyOpenInvoked) + assertTrue(onOpenAllInTabsEmptyInvoked) } @Test @@ -517,9 +509,9 @@ class BookmarkControllerTest { @Suppress("LongParameterList") private fun createController( - loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode? = { _, _ -> null }, + loadBookmarkNode: suspend (String) -> BookmarkNode? = { _ -> null }, showSnackbar: (String) -> Unit = { _ -> }, - alertHeavyOpen: (Int, () -> Unit) -> Unit = { _: Int, _: () -> Unit -> }, + onOpenAllInTabsEmpty: () -> Unit = { }, deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit = { _, _ -> }, deleteBookmarkFolder: (Set) -> Unit = { _ -> }, showTabTray: () -> Unit = { }, @@ -534,7 +526,7 @@ class BookmarkControllerTest { tabsUseCases = tabsUseCases, loadBookmarkNode = loadBookmarkNode, showSnackbar = showSnackbar, - alertHeavyOpen = alertHeavyOpen, + onOpenAllInTabsEmpty = onOpenAllInTabsEmpty, deleteBookmarkNodes = deleteBookmarkNodes, deleteBookmarkFolder = deleteBookmarkFolder, showTabTray = showTabTray, diff --git a/detekt-baseline.xml b/detekt-baseline.xml index f3ba36a31..7117a6d97 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -547,12 +547,11 @@ UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleBookmarkTapped(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleCopyUrl(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) - UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleRequestSync() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSearch() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSelectionModeSwitch() UndocumentedPublicFunction:BookmarkFragmentStore.kt$operator fun BookmarkNode.contains(item: BookmarkNode): Boolean - UndocumentedPublicFunction:BookmarkItemMenu.kt$BookmarkItemMenu$suspend fun updateMenu(itemType: BookmarkNodeType, itemId: String) + UndocumentedPublicFunction:BookmarkItemMenu.kt$BookmarkItemMenu$fun updateMenu(itemType: BookmarkNodeType) UndocumentedPublicFunction:BookmarkNodeViewHolder.kt$BookmarkNodeViewHolder$fun bind( item: BookmarkNode, mode: BookmarkFragmentState.Mode, payload: BookmarkPayload, ) UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleEditingCancelled() UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleTextChanged(text: String) From dff4c31606b141a4a4cccfe59f4d03a0e9bded3d Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 040/407] Revert "For #11404 - Add 'Open all in private tabs' option as requested." This reverts commit fe16a81c1df204f42dc0389fdaffd1f8ada49b73. --- app/metrics.yaml | 17 ------- .../org/mozilla/fenix/ui/BookmarksTest.kt | 49 +------------------ .../ui/robots/ThreeDotMenuBookmarksRobot.kt | 11 +---- .../library/bookmarks/BookmarkController.kt | 6 +-- .../bookmarks/BookmarkFragmentInteractor.kt | 7 +-- .../library/bookmarks/BookmarkItemMenu.kt | 11 ----- .../fenix/library/bookmarks/BookmarkView.kt | 7 --- .../viewholders/BookmarkNodeViewHolder.kt | 1 - app/src/main/res/values/strings.xml | 2 - .../bookmarks/BookmarkControllerTest.kt | 38 +------------- .../BookmarkFragmentInteractorTest.kt | 11 +---- .../library/bookmarks/BookmarkItemMenuTest.kt | 37 +++++++++++--- 12 files changed, 40 insertions(+), 157 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index fc7037ed3..a87fae156 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2521,23 +2521,6 @@ bookmarks_management: metadata: tags: - Bookmarks - open_all_in_private_tabs: - type: event - description: | - A user opened a folder of bookmarks at once in new private tabs. - bugs: - - https://github.com/mozilla-mobile/fenix/issues/974 - - https://github.com/mozilla-mobile/fenix/issues/11404 - data_reviews: - - https://github.com/mozilla-mobile/fenix/pull/21212 - data_sensitivity: - - interaction - notification_emails: - - android-probes@mozilla.com - expires: never - metadata: - tags: - - Bookmarks edited: type: event description: | diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index fa3e2a82c..eb643054c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -301,54 +301,9 @@ class BookmarksTest { verifyExistingOpenTabs("Test_Page_1") verifyExistingOpenTabs("Test_Page_2") verifyExistingOpenTabs("Test_Page_3") - swipeTabRight("Test_Page_1") - swipeTabRight("Test_Page_2") - swipeTabRight("Test_Page_3") - // no more tabs should be presents and auto close tab tray - verifyTabTrayIsClosed() - } - } - - @Test - fun openAllInPrivateTabsTest() { - val nbPages = 4 - val webPages = List(nbPages) { - TestAssetHelper.getGenericAsset(mockWebServer, it + 1) - } - - homeScreen { - }.openThreeDotMenu { - }.openBookmarks { - createFolder("root") - createFolder("sub", "root") - createFolder("empty", "root") - }.closeMenu { - } - - browserScreen { - createBookmark(webPages[0].url, "root") - createBookmark(webPages[1].url, "root") - createBookmark(webPages[2].url, "sub") - // out of folder and should not be opened - createBookmark(webPages[3].url) - }.openTabDrawer { closeTab() - } - - browserScreen { - }.openThreeDotMenu { - }.openBookmarks { - }.openThreeDotMenu("root") { - }.clickOpenAllInPrivateTabs { - verifyTabTrayIsOpened() - verifyPrivateModeSelected() - - verifyExistingOpenTabs("Test_Page_1") - verifyExistingOpenTabs("Test_Page_2") - verifyExistingOpenTabs("Test_Page_3") - swipeTabRight("Test_Page_1") - swipeTabRight("Test_Page_2") - swipeTabRight("Test_Page_3") + closeTab() + closeTab() // no more tabs should be presents and auto close tab tray verifyTabTrayIsClosed() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt index 035aa87ff..25f6ec375 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt @@ -59,13 +59,6 @@ class ThreeDotMenuBookmarksRobot { return TabDrawerRobot.Transition() } - fun clickOpenAllInPrivateTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { - openAllInPrivateTabsButton().click() - - TabDrawerRobot().interact() - return TabDrawerRobot.Transition() - } - fun clickDelete(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { deleteButton().click() @@ -85,8 +78,6 @@ private fun openInNewTabButton() = onView(withText("Open in new tab")) private fun openInPrivateTabButton() = onView(withText("Open in private tab")) -private fun openAllInTabsButton() = onView(withText("Open all in new tabs")) - -private fun openAllInPrivateTabsButton() = onView(withText("Open all in private tabs")) +private fun openAllInTabsButton() = onView(withText("Open All Bookmarks")) private fun deleteButton() = onView(withText("Delete")) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index b46307e15..69205b933 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -45,7 +45,7 @@ interface BookmarkController { fun handleCopyUrl(item: BookmarkNode) fun handleBookmarkSharing(item: BookmarkNode) fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) - fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) + fun handleBookmarkFolderOpening(folder: BookmarkNode) /** * Handle bookmark nodes deletion @@ -183,10 +183,10 @@ class DefaultBookmarkController( } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() } - override fun handleBookmarkFolderOpening(folder: BookmarkNode, mode: BrowsingMode) { + override fun handleBookmarkFolderOpening(folder: BookmarkNode) { // potentially heavy function with a lot of bookmarks to open => use a coroutine scope.launch { - recursiveBookmarkFolderOpening(folder, true, mode) + recursiveBookmarkFolderOpening(folder, true) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index bdac4350a..c4b6c86c0 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -81,12 +81,7 @@ class BookmarkFragmentInteractor( override fun onOpenAllInTabs(folder: BookmarkNode) { require(folder.type == BookmarkNodeType.FOLDER) - bookmarksController.handleBookmarkFolderOpening(folder, BrowsingMode.Normal) - } - - override fun onOpenAllInPrivateTabs(folder: BookmarkNode) { - require(folder.type == BookmarkNodeType.FOLDER) - bookmarksController.handleBookmarkFolderOpening(folder, BrowsingMode.Private) + bookmarksController.handleBookmarkFolderOpening(folder) } override fun onDelete(nodes: Set) { diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index 249535312..2d678f7ec 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -27,7 +27,6 @@ class BookmarkItemMenu( OpenInNewTab, OpenInPrivateTab, OpenAllInTabs, - OpenAllInPrivateTabs, Delete, ; } @@ -111,16 +110,6 @@ class BookmarkItemMenu( } else { null }, - if (hasAtLeastOneChild) { - maybeCreateMenuItem( - itemType, - BookmarkNodeType.FOLDER, - context.getString(R.string.bookmark_menu_open_all_in_privates_button), - Item.OpenAllInPrivateTabs, - ) - } else { - null - }, TextMenuCandidate( text = context.getString(R.string.bookmark_menu_delete_button), textStyle = TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index c609cfdd7..853a20009 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -86,13 +86,6 @@ interface BookmarkViewInteractor : SelectionInteractor { */ fun onOpenAllInTabs(folder: BookmarkNode) - /** - * Opens all bookmark items in new private tabs. - * - * @param folder the bookmark folder containing all items to open in new private tabs - */ - fun onOpenAllInPrivateTabs(folder: BookmarkNode) - /** * Deletes a set of bookmark nodes. * diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index 153238c39..8131c92b6 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -46,7 +46,6 @@ class BookmarkNodeViewHolder( BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item) BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item) BookmarkItemMenu.Item.OpenAllInTabs -> interactor.onOpenAllInTabs(item) - BookmarkItemMenu.Item.OpenAllInPrivateTabs -> interactor.onOpenAllInPrivateTabs(item) BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item)) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 506489061..b5c9cabf4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -858,8 +858,6 @@ Open in private tab Open all in new tabs - - Open all in private tabs Delete diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 535365735..4a8a7c052 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -381,7 +381,7 @@ class BookmarkControllerTest { } recurseFind(tree, it) }, - ).handleBookmarkFolderOpening(tree, BrowsingMode.Normal) + ).handleBookmarkFolderOpening(tree) assertTrue(showTabTrayInvoked) verifyOrder { @@ -392,40 +392,6 @@ class BookmarkControllerTest { } } - @Test - fun `handleBookmarkFolderOpening should open all bookmarks in private tabs`() { - var showTabTrayInvoked = false - createController( - showTabTray = { - showTabTrayInvoked = true - }, - loadBookmarkNode = { - fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { - if (item.guid == guid) { - return item - } else { - item.children?.iterator()?.forEach { - val res = recurseFind(it, guid) - if (res != null) { - return res - } - } - return null - } - } - recurseFind(tree, it) - }, - ).handleBookmarkFolderOpening(tree, BrowsingMode.Private) - - assertTrue(showTabTrayInvoked) - verifyOrder { - addNewTabUseCase.invoke(item.url!!, private = true) - addNewTabUseCase.invoke(item.url!!, private = true) - addNewTabUseCase.invoke(childItem.url!!, private = true) - homeActivity.browsingModeManager.mode = BrowsingMode.Private - } - } - @Test fun `handleBookmarkFolderOpening for an empty folder should show toast`() { var onOpenAllInTabsEmptyInvoked = false @@ -436,7 +402,7 @@ class BookmarkControllerTest { loadBookmarkNode = { subfolder }, - ).handleBookmarkFolderOpening(subfolder, BrowsingMode.Normal) + ).handleBookmarkFolderOpening(subfolder) assertTrue(onOpenAllInTabsEmptyInvoked) } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index c5556975f..8b670bf22 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -175,16 +175,7 @@ class BookmarkFragmentInteractorTest { interactor.onOpenAllInTabs(tree) verify { - bookmarkController.handleBookmarkFolderOpening(tree, BrowsingMode.Normal) - } - } - - @Test - fun `open all bookmarks item in new private tabs`() { - interactor.onOpenAllInPrivateTabs(tree) - - verify { - bookmarkController.handleBookmarkFolderOpening(tree, BrowsingMode.Private) + bookmarkController.handleBookmarkFolderOpening(tree) } } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index a35601898..82a1ec5b0 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -81,13 +81,12 @@ class BookmarkItemMenuTest { folderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") } assertNotNull(folderItems) - assertEquals(4, folderItems!!.size) + assertEquals(3, folderItems!!.size) - val (edit, openAll, openAllPrivate, delete) = folderItems!! + val (edit, openAll, delete) = folderItems!! assertEquals("Edit", edit.text) - assertEquals("Open all in new tabs", openAll.text) - assertEquals("Open all in private tabs", openAllPrivate.text) + assertEquals("Open All Bookmarks", openAll.text) assertEquals("Delete", delete.text) edit.onClick() @@ -96,13 +95,37 @@ class BookmarkItemMenuTest { openAll.onClick() assertEquals(Item.OpenAllInTabs, lastItemTapped) - openAllPrivate.onClick() - assertEquals(Item.OpenAllInPrivateTabs, lastItemTapped) - delete.onClick() assertEquals(Item.Delete, lastItemTapped) } + @Test + fun `delete item has special styling`() { + val deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR).last() + assertEquals("Delete", deleteItem.text) + assertEquals( + TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), + deleteItem.textStyle, + ) + + deleteItem.onClick() + + assertEquals(Item.Delete, lastItemTapped) + } + + @Test + fun `edit item appears for folders`() { + val folderItems = menu.menuItems(BookmarkNodeType.FOLDER) + assertEquals(2, folderItems.size) + val (edit, delete) = folderItems + + assertEquals("Edit", edit.text) + edit.onClick() + + assertEquals(Item.Edit, lastItemTapped) + assertEquals("Delete", delete.text) + } + @Test fun `all item appears for sites`() = runBlocking { var siteItems: List? = null From 366423e85cbeefc7c7decf98046e1caea803300e Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 041/407] Revert "For #11404 - Create the open_all_in_new_tabs metric in Glean" This reverts commit f1bd7e192de782ad39d3e93b0b63bbf63d441b3b. --- app/metrics.yaml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index a87fae156..2ff109a3f 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2460,23 +2460,6 @@ bookmarks_management: metadata: tags: - Bookmarks - open_all_in_new_tabs: - type: event - description: | - A user opened a folder of bookmarks at once in new tabs. - bugs: - - https://github.com/mozilla-mobile/fenix/issues/974 - - https://github.com/mozilla-mobile/fenix/issues/11404 - data_reviews: - - https://github.com/mozilla-mobile/fenix/pull/21212 - data_sensitivity: - - interaction - notification_emails: - - android-probes@mozilla.com - expires: never - metadata: - tags: - - Bookmarks open_in_private_tab: type: event description: | From bc1cfb88e822d169dfa8af58a98cd5b0e54352f9 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 21 Sep 2022 18:07:51 -0400 Subject: [PATCH 042/407] Revert "For #11404 - Create open all function" This reverts commit 9cf42cb7d91e49d693ad585fd95afb6efb621d91. --- .../org/mozilla/fenix/ui/BookmarksTest.kt | 45 ------- .../mozilla/fenix/ui/robots/BookmarksRobot.kt | 11 +- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 12 +- .../ui/robots/ThreeDotMenuBookmarksRobot.kt | 9 -- .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 8 -- .../library/bookmarks/BookmarkController.kt | 32 ----- .../library/bookmarks/BookmarkFragment.kt | 22 ---- .../bookmarks/BookmarkFragmentInteractor.kt | 5 - .../library/bookmarks/BookmarkItemMenu.kt | 121 +++++++----------- .../fenix/library/bookmarks/BookmarkView.kt | 7 - .../viewholders/BookmarkNodeViewHolder.kt | 9 +- app/src/main/res/values/strings.xml | 2 - .../bookmarks/BookmarkControllerTest.kt | 51 -------- .../BookmarkFragmentInteractorTest.kt | 9 -- .../library/bookmarks/BookmarkItemMenuTest.kt | 80 +----------- 15 files changed, 53 insertions(+), 370 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index eb643054c..e0c6f9fa5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -264,51 +264,6 @@ class BookmarksTest { } } - @Test - fun openAllInTabsTest() { - val nbPages = 4 - val webPages = List(nbPages) { - TestAssetHelper.getGenericAsset(mockWebServer, it + 1) - } - - homeScreen { - }.openThreeDotMenu { - }.openBookmarks { - createFolder("root") - createFolder("sub", "root") - createFolder("empty", "root") - }.closeMenu { - } - - browserScreen { - createBookmark(webPages[0].url, "root") - createBookmark(webPages[1].url, "root") - createBookmark(webPages[2].url, "sub") - // out of folder and should not be opened - createBookmark(webPages[3].url) - }.openTabDrawer { - closeTab() - } - - browserScreen { - }.openThreeDotMenu { - }.openBookmarks { - }.openThreeDotMenu("root") { - }.clickOpenAllInTabs { - verifyTabTrayIsOpened() - verifyNormalModeSelected() - - verifyExistingOpenTabs("Test_Page_1") - verifyExistingOpenTabs("Test_Page_2") - verifyExistingOpenTabs("Test_Page_3") - closeTab() - closeTab() - closeTab() - // no more tabs should be presents and auto close tab tray - verifyTabTrayIsClosed() - } - } - @Test fun openBookmarkInPrivateTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 4b4f881fe..0b4a6d043 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -150,21 +150,12 @@ class BookmarksRobot { .click() } - fun createFolder(name: String, parent: String? = null) { + fun createFolder(name: String) { clickAddFolderButton() addNewFolderName(name) - if (!parent.isNullOrBlank()) { - setParentFolder(parent) - } saveNewFolder() } - fun setParentFolder(parentName: String) { - clickParentFolderSelector() - selectFolder(parentName) - navigateUp() - } - fun clickAddFolderButton() { mDevice.waitNotNull( Until.findObject(By.desc("Add folder")), diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 905aa9a5b..702640fb4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -334,21 +334,13 @@ class BrowserRobot { menuSaveImage.click() } - fun createBookmark(url: Uri, folder: String? = null) { + fun createBookmark(url: Uri) { navigationToolbar { }.enterURLAndEnterToBrowser(url) { // needs to wait for the right url to load before saving a bookmark verifyUrl(url.toString()) }.openThreeDotMenu { - }.bookmarkPage { - // continue only if a folder is defined - }.takeIf { !folder.isNullOrBlank() }?.let { - it.openThreeDotMenu { - }.editBookmarkPage { - setParentFolder(folder!!) - saveEditBookmark() - } - } + }.bookmarkPage { } } fun clickLinkMatchingText(expectedText: String) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt index 25f6ec375..2c13ba626 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt @@ -52,13 +52,6 @@ class ThreeDotMenuBookmarksRobot { return TabDrawerRobot.Transition() } - fun clickOpenAllInTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { - openAllInTabsButton().click() - - TabDrawerRobot().interact() - return TabDrawerRobot.Transition() - } - fun clickDelete(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { deleteButton().click() @@ -78,6 +71,4 @@ private fun openInNewTabButton() = onView(withText("Open in new tab")) private fun openInPrivateTabButton() = onView(withText("Open in private tab")) -private fun openAllInTabsButton() = onView(withText("Open All Bookmarks")) - private fun deleteButton() = onView(withText("Delete")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 12dc1d716..865e17ada 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -208,14 +208,6 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } - fun editBookmarkPage(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { - mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) - editBookmarkButton().click() - - BookmarksRobot().interact() - return BookmarksRobot.Transition() - } - fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) helpButton().click() diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index 69205b933..4f96e26ac 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -15,7 +15,6 @@ import mozilla.appservices.places.BookmarkRoot import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.storage.BookmarkNode -import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.service.fxa.sync.SyncReason import org.mozilla.fenix.BrowserDirection @@ -45,7 +44,6 @@ interface BookmarkController { fun handleCopyUrl(item: BookmarkNode) fun handleBookmarkSharing(item: BookmarkNode) fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) - fun handleBookmarkFolderOpening(folder: BookmarkNode) /** * Handle bookmark nodes deletion @@ -77,7 +75,6 @@ class DefaultBookmarkController( private val tabsUseCases: TabsUseCases?, private val loadBookmarkNode: suspend (String) -> BookmarkNode?, private val showSnackbar: (String) -> Unit, - private val onOpenAllInTabsEmpty: () -> Unit, private val deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit, private val deleteBookmarkFolder: (Set) -> Unit, private val showTabTray: () -> Unit, @@ -161,35 +158,6 @@ class DefaultBookmarkController( showTabTray() } - private suspend fun recursiveBookmarkFolderOpening(folder: BookmarkNode, firstLaunch: Boolean = false) { - val node = loadBookmarkNode.invoke(folder.guid) ?: return - if (!node.children.isNullOrEmpty()) { - if (firstLaunch) invokePendingDeletion.invoke() - - node.children!!.iterator().forEach { - when (it.type) { - BookmarkNodeType.FOLDER -> recursiveBookmarkFolderOpening(it, mode = mode) - BookmarkNodeType.ITEM -> { - it.url?.let { url -> tabsUseCases?.addTab?.invoke(url, private = (mode == BrowsingMode.Private)) } - } - BookmarkNodeType.SEPARATOR -> {} - } - }.also { - if (firstLaunch) { - activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private) - showTabTray() - } - } - } else if (firstLaunch) onOpenAllInTabsEmpty.invoke() - } - - override fun handleBookmarkFolderOpening(folder: BookmarkNode) { - // potentially heavy function with a lot of bookmarks to open => use a coroutine - scope.launch { - recursiveBookmarkFolderOpening(folder, true) - } - } - override fun handleBookmarkDeletion(nodes: Set, removeType: BookmarkRemoveType) { deleteBookmarkNodes(nodes, removeType) } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 48a778f52..34e15347c 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -101,7 +101,6 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan tabsUseCases = activity?.components?.useCases?.tabsUseCases, loadBookmarkNode = ::loadBookmarkNode, showSnackbar = ::showSnackBarWithText, - onOpenAllInTabsEmpty = ::onOpenAllInTabsEmpty, deleteBookmarkNodes = ::deleteMulti, deleteBookmarkFolder = ::showRemoveFolderDialog, showTabTray = ::showTabTray, @@ -293,27 +292,6 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } - private fun alertHeavyOpen(n: Int, function: () -> (Unit)) { - AlertDialog.Builder(requireContext()).apply { - setTitle(R.string.open_all_warning_title) - setMessage(String.format(context.getString(R.string.open_all_warning_message), n)) - setPositiveButton( - R.string.open_all_warning_confirm, - ) { dialog, _ -> - function() - dialog.dismiss() - } - setNegativeButton( - R.string.open_all_warning_cancel, - ) { dialog: DialogInterface, _ -> - dialog.dismiss() - } - setCancelable(false) - create() - show() - } - } - private fun deleteMulti( selected: Set, eventType: BookmarkRemoveType = BookmarkRemoveType.MULTIPLE, diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index c4b6c86c0..9515764a1 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -79,11 +79,6 @@ class BookmarkFragmentInteractor( } } - override fun onOpenAllInTabs(folder: BookmarkNode) { - require(folder.type == BookmarkNodeType.FOLDER) - bookmarksController.handleBookmarkFolderOpening(folder) - } - override fun onDelete(nodes: Set) { if (nodes.find { it.type == BookmarkNodeType.SEPARATOR } != null) { throw IllegalStateException("Cannot delete separators") diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index 2d678f7ec..e437490ca 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -13,7 +13,6 @@ import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import org.mozilla.fenix.R -import org.mozilla.fenix.ext.bookmarkStorage class BookmarkItemMenu( private val context: Context, @@ -26,87 +25,57 @@ class BookmarkItemMenu( Share, OpenInNewTab, OpenInPrivateTab, - OpenAllInTabs, Delete, ; } val menuController: MenuController by lazy { BrowserMenuController() } - /** - * Check if the menu item has to be displayed or not for the type of bookmark. - * If wanted, return the item. - * Else, return null. - */ - private fun maybeCreateMenuItem( - itemType: BookmarkNodeType, - wantedType: BookmarkNodeType, - text: String, - action: Item, - ): TextMenuCandidate? { - return maybeCreateMenuItem(itemType, listOf(wantedType), text, action) - } - - private fun maybeCreateMenuItem( - itemType: BookmarkNodeType, - wantedTypes: List, - text: String, - action: Item, - ): TextMenuCandidate? { - return if (itemType in wantedTypes) { - TextMenuCandidate( - text = text, - ) { - onItemTapped.invoke(action) - } - } else { - null - } - } - @VisibleForTesting - internal suspend fun menuItems(itemType: BookmarkNodeType, itemId: String): List { - // if have at least one child - val hasAtLeastOneChild = !context.bookmarkStorage.getTree(itemId)?.children.isNullOrEmpty() - + internal fun menuItems(itemType: BookmarkNodeType): List { return listOfNotNull( - maybeCreateMenuItem( - itemType, - listOf(BookmarkNodeType.ITEM, BookmarkNodeType.FOLDER), - context.getString(R.string.bookmark_menu_edit_button), - Item.Edit, - ), - maybeCreateMenuItem( - itemType, - BookmarkNodeType.ITEM, - context.getString(R.string.bookmark_menu_copy_button), - Item.Copy, - ), - maybeCreateMenuItem( - itemType, - BookmarkNodeType.ITEM, - context.getString(R.string.bookmark_menu_share_button), - Item.Share, - ), - maybeCreateMenuItem( - itemType, - BookmarkNodeType.ITEM, - context.getString(R.string.bookmark_menu_open_in_new_tab_button), - Item.OpenInNewTab, - ), - maybeCreateMenuItem( - itemType, - BookmarkNodeType.ITEM, - context.getString(R.string.bookmark_menu_open_in_private_tab_button), - Item.OpenInPrivateTab, - ), - if (hasAtLeastOneChild) { - maybeCreateMenuItem( - itemType, - BookmarkNodeType.FOLDER, - context.getString(R.string.bookmark_menu_open_all_in_tabs_button), - Item.OpenAllInTabs, - ) + if (itemType != BookmarkNodeType.SEPARATOR) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_edit_button), + ) { + onItemTapped.invoke(Item.Edit) + } + } else { + null + }, + if (itemType == BookmarkNodeType.ITEM) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_copy_button), + ) { + onItemTapped.invoke(Item.Copy) + } + } else { + null + }, + if (itemType == BookmarkNodeType.ITEM) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_share_button), + ) { + onItemTapped.invoke(Item.Share) + } + } else { + null + }, + if (itemType == BookmarkNodeType.ITEM) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_open_in_new_tab_button), + ) { + onItemTapped.invoke(Item.OpenInNewTab) + } + } else { + null + }, + if (itemType == BookmarkNodeType.ITEM) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_open_in_private_tab_button), + ) { + onItemTapped.invoke(Item.OpenInPrivateTab) + } } else { null }, @@ -119,7 +88,7 @@ class BookmarkItemMenu( ) } - suspend fun updateMenu(itemType: BookmarkNodeType, itemId: String) { - menuController.submitList(menuItems(itemType, itemId)) + fun updateMenu(itemType: BookmarkNodeType) { + menuController.submitList(menuItems(itemType)) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index 853a20009..b6cbcf292 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -79,13 +79,6 @@ interface BookmarkViewInteractor : SelectionInteractor { */ fun onOpenInPrivateTab(item: BookmarkNode) - /** - * Opens all bookmark items in new tabs. - * - * @param folder the bookmark folder containing all items to open in new tabs - */ - fun onOpenAllInTabs(folder: BookmarkNode) - /** * Deletes a set of bookmark nodes. * diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index 8131c92b6..dc1d8c8b9 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -6,9 +6,6 @@ package org.mozilla.fenix.library.bookmarks.viewholders import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.mozilla.fenix.R @@ -45,7 +42,6 @@ class BookmarkNodeViewHolder( BookmarkItemMenu.Item.Share -> interactor.onSharePressed(item) BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item) BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item) - BookmarkItemMenu.Item.OpenAllInTabs -> interactor.onOpenAllInTabs(item) BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item)) } } @@ -62,10 +58,7 @@ class BookmarkNodeViewHolder( containerView.urlView.isVisible = item.type == BookmarkNodeType.ITEM containerView.setSelectionInteractor(item, mode, interactor) - - CoroutineScope(Dispatchers.Default).launch { - menu.updateMenu(item.type, item.guid) - } + menu.updateMenu(item.type) // Hide menu button if this item is a root folder or is selected if (item.type == BookmarkNodeType.FOLDER && item.inRoots()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b5c9cabf4..dfe29c987 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -856,8 +856,6 @@ Open in new tab Open in private tab - - Open all in new tabs Delete diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 4a8a7c052..510389f5f 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -358,55 +358,6 @@ class BookmarkControllerTest { } } - @Test - fun `handleBookmarkFolderOpening should open all bookmarks in normal tabs`() { - var showTabTrayInvoked = false - createController( - showTabTray = { - showTabTrayInvoked = true - }, - loadBookmarkNode = { - fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { - if (item.guid == guid) { - return item - } else { - item.children?.iterator()?.forEach { - val res = recurseFind(it, guid) - if (res != null) { - return res - } - } - return null - } - } - recurseFind(tree, it) - }, - ).handleBookmarkFolderOpening(tree) - - assertTrue(showTabTrayInvoked) - verifyOrder { - addNewTabUseCase.invoke(item.url!!, private = false) - addNewTabUseCase.invoke(item.url!!, private = false) - addNewTabUseCase.invoke(childItem.url!!, private = false) - homeActivity.browsingModeManager.mode = BrowsingMode.Normal - } - } - - @Test - fun `handleBookmarkFolderOpening for an empty folder should show toast`() { - var onOpenAllInTabsEmptyInvoked = false - createController( - onOpenAllInTabsEmpty = { - onOpenAllInTabsEmptyInvoked = true - }, - loadBookmarkNode = { - subfolder - }, - ).handleBookmarkFolderOpening(subfolder) - - assertTrue(onOpenAllInTabsEmptyInvoked) - } - @Test fun `handleBookmarkDeletion for an item should properly call a passed in delegate`() { var deleteBookmarkNodesInvoked = false @@ -477,7 +428,6 @@ class BookmarkControllerTest { private fun createController( loadBookmarkNode: suspend (String) -> BookmarkNode? = { _ -> null }, showSnackbar: (String) -> Unit = { _ -> }, - onOpenAllInTabsEmpty: () -> Unit = { }, deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit = { _, _ -> }, deleteBookmarkFolder: (Set) -> Unit = { _ -> }, showTabTray: () -> Unit = { }, @@ -492,7 +442,6 @@ class BookmarkControllerTest { tabsUseCases = tabsUseCases, loadBookmarkNode = loadBookmarkNode, showSnackbar = showSnackbar, - onOpenAllInTabsEmpty = onOpenAllInTabsEmpty, deleteBookmarkNodes = deleteBookmarkNodes, deleteBookmarkFolder = deleteBookmarkFolder, showTabTray = showTabTray, diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index 8b670bf22..58a4c0b69 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -170,15 +170,6 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.openInPrivateTab.testGetValue()!!.single().extra) } - @Test - fun `open all bookmarks item in new tabs`() { - interactor.onOpenAllInTabs(tree) - - verify { - bookmarkController.handleBookmarkFolderOpening(tree) - } - } - @Test fun `delete a bookmark item`() { interactor.onDelete(setOf(item)) diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index 82a1ec5b0..f251132bf 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -6,23 +6,15 @@ package org.mozilla.fenix.library.bookmarks import android.content.Context import androidx.appcompat.view.ContextThemeWrapper -import io.mockk.coEvery -import io.mockk.every -import io.mockk.mockk -import io.mockk.mockkStatic -import kotlinx.coroutines.runBlocking -import mozilla.components.concept.menu.candidate.TextMenuCandidate import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R -import org.mozilla.fenix.ext.bookmarkStorage import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu.Item @@ -41,64 +33,6 @@ class BookmarkItemMenuTest { } } - @Test - fun `delete item has special styling`() = runBlocking { - var deleteItem: TextMenuCandidate? = null - mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { - every { any().bookmarkStorage } returns mockk(relaxed = true) - - deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR, "").last() - } - assertNotNull(deleteItem) - assertEquals("Delete", deleteItem!!.text) - assertEquals( - TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), - deleteItem!!.textStyle, - ) - - deleteItem!!.onClick() - - assertEquals(Item.Delete, lastItemTapped) - } - - @Test - fun `edit item appears for folders`() = runBlocking { - // empty folder - var emptyFolderItems: List? = null - mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { - every { any().bookmarkStorage } returns mockk(relaxed = true) - - emptyFolderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") - } - assertNotNull(emptyFolderItems) - assertEquals(2, emptyFolderItems!!.size) - - // not empty - var folderItems: List? = null - mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { - coEvery { any().bookmarkStorage.getTree("")?.children } returns listOf(mockk(relaxed = true)) - - folderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") - } - assertNotNull(folderItems) - assertEquals(3, folderItems!!.size) - - val (edit, openAll, delete) = folderItems!! - - assertEquals("Edit", edit.text) - assertEquals("Open All Bookmarks", openAll.text) - assertEquals("Delete", delete.text) - - edit.onClick() - assertEquals(Item.Edit, lastItemTapped) - - openAll.onClick() - assertEquals(Item.OpenAllInTabs, lastItemTapped) - - delete.onClick() - assertEquals(Item.Delete, lastItemTapped) - } - @Test fun `delete item has special styling`() { val deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR).last() @@ -127,16 +61,10 @@ class BookmarkItemMenuTest { } @Test - fun `all item appears for sites`() = runBlocking { - var siteItems: List? = null - mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { - every { any().bookmarkStorage } returns mockk(relaxed = true) - - siteItems = menu.menuItems(BookmarkNodeType.ITEM, "") - } - assertNotNull(siteItems) - assertEquals(6, siteItems!!.size) - val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems!! + fun `all item appears for sites`() { + val siteItems = menu.menuItems(BookmarkNodeType.ITEM) + assertEquals(6, siteItems.size) + val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems assertEquals("Edit", edit.text) assertEquals("Copy", copy.text) From 89998334f396ee8916c8ad7e5431efe8f9187b91 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 22 Sep 2022 02:30:22 +0200 Subject: [PATCH 043/407] Import l10n. (#27098) --- app/src/main/res/values-el/strings.xml | 10 ++ app/src/main/res/values-fi/strings.xml | 28 ++++++ app/src/main/res/values-fr/strings.xml | 59 +++++++++--- app/src/main/res/values-it/strings.xml | 71 +++++++++++--- app/src/main/res/values-lo/strings.xml | 39 ++++++++ app/src/main/res/values-si/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 12 +++ app/src/main/res/values-te/strings.xml | 124 ++++++++++--------------- app/src/main/res/values-tr/strings.xml | 67 ++++++++++--- 9 files changed, 302 insertions(+), 110 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 178d628dc..6a613c0f0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1268,12 +1268,16 @@ Καλώς ορίσατε στο %s! Καλώς ήρθατε σε ένα καλύτερο διαδίκτυο + + Ένα πρόγραμμα περιήγησης που δημιουργήθηκε για τους ανθρώπους, όχι το κέρδος. Συγχρονισμός Firefox μεταξύ συσκευών Συνεχίστε από εκεί που σταματήσατε Φέρτε σελιδοδείκτες, ιστορικό και κωδικούς πρόσβασης στο %1$s σε αυτήν τη συσκευή. + + Συγχρονίστε καρτέλες και κωδικούς πρόσβασης με τις συσκευές σας για απρόσκοπτη εναλλαγή οθονών. Εγγραφή @@ -1287,6 +1291,8 @@ Προστασία απορρήτου από προεπιλογή Το %1$s εμποδίζει την καταγραφή της διαδικτυακής δραστηριότητάς σας από εταιρείες. + + Η Ολική προστασία cookie εμποδίζει τη χρήση των cookies από ιχνηλάτες που σας καταγράφουν μεταξύ ιστοτόπων. Τυπική (προεπιλογή) @@ -1299,6 +1305,8 @@ Επιλογή τοποθεσίας γραμμής εργαλείων Τοποθετήστε τη γραμμή εργαλείων σε κοντινή απόσταση. Κρατήστε την στο κάτω μέρος ή μετακινήστε την στο πάνω μέρος. + + Διατηρήστε τη στο κάτω μέρος ή μετακινήστε τη στο πάνω μέρος. Το απόρρητό σας @@ -1311,6 +1319,8 @@ Διαβάστε τη σημείωση απορρήτου μας + + Θέλετε να ανοίξετε ένα καταπληκτικό διαδίκτυο; Έναρξη περιήγησης diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 8f91a5391..08935233b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -288,10 +288,14 @@ Tutustu henkilökohtaiseen kotisivuusi. Viimeisimmät välilehdet, kirjanmerkit ja hakutulokset näkyvät tässä. Tervetuloa itsenäiseen internetiin + + Tervetuloa entistä henkilökohtaisempaan internetiin Lisää värejä. Parempi yksityisyys. Ihmisiin sitoutumisen priorisointi liikevoittojen edelle. Hyppää puhelimelta kannettavalle tietokoneelle ja takaisin + + Näyttöjen vaihtaminen on helpompaa kuin koskaan Jatka siitä, mihin jäit muiden laitteidesi välilehdillä. @@ -496,6 +500,14 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo - vaihda taustakuva, painike + + Klassinen %s + + Rajoitettu erä + + Lisää ripaus väriä + + Valitse taustakuva, joka puhuttelee sinua. Tutustu muihin taustakuviin @@ -1256,10 +1268,18 @@ Tervetuloa %siin! + + Tervetuloa parempaan internetiin + + Selain, joka on tehty ihmisiä, ei tuottoa, varten. Synkronoi Firefox laitteidesi välillä + + Jatka siitä mihin jäit Tuo kirjanmerkit, historia ja salasanat %1$siin tässä laitteessa. + + Synkronoi välilehdet ja salasanat eri laitteiden välillä, jotta laitteen vaihtaminen on saumatonta. Rekisteröidy @@ -1272,6 +1292,8 @@ Yksityisyyden suoja oletuksena %1$s estää automaattisesti yrityksiä seuraamasta sinua salaa ympäri verkkoa. + + Totaalinen evästesuoja estää seuraimia käyttämästä evästeitä vaanimiseen sivustojen välillä. Tavallinen (oletus) @@ -1288,12 +1310,18 @@ Pidä se alhaalla tai siirrä se ylös. Yksityisyytesi + + Sinä hallitset tietojasi Olemme suunnitelleet %sin siten, että voit hallita mitä jaat verkossa ja mitä jaat kanssamme. + + Firefoxin avulla voit hallita, mitä jaat verkossa ja mitä jaat kanssamme. Lue yksityisyyskäytäntömme + + Oletko valmis avaamaan hämmästyttävän internetin? Aloita selaaminen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0eefa85e1..dd3f020f9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -286,11 +286,15 @@ Découvrez votre page d’accueil personnalisée. Onglets récents, marque-pages et résultats de recherche y apparaissent. - Bienvenue sur un Internet indépendant + Bienvenue sur un Internet indépendant + + Bienvenue sur un Internet plus personnel Plus de couleurs. Une confidentialité améliorée. Mais toujours le même engagement pour les gens plutôt que pour les profits. - Passez du téléphone à l’ordinateur portable et vice-versa + Passez du téléphone à l’ordinateur portable et vice-versa + + Passer d’un écran à l’autre est plus facile que jamais Reprenez là où vous en étiez avec des onglets d’autres appareils qui figurent désormais sur votre page d’accueil. @@ -478,6 +482,14 @@ Fond d’écran mis à jour ! Afficher + + Impossible de télécharger le fond d’écran + + Réessayer + + Impossible de changer le fond d’écran + + En savoir plus Changez le fond d’écran en appuyant sur le logo Firefox de la page d’accueil @@ -485,6 +497,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - changer le fond d’écran, bouton + + %s classique + + Édition limitée + + La nouvelle collection Voix indépendantes. %s + + La nouvelle collection Voix indépendantes. + + Essayez une touche de couleur + + Choisissez un fond d’écran qui vous parle. + + Explorez plus de fonds d’écran + Ce module complémentaire n’est pas pris en charge @@ -1257,21 +1284,29 @@ - Bienvenue dans %s ! + Bienvenue dans %s ! + + Bienvenue dans un meilleur Internet - Synchronisez Firefox entre vos appareils + Synchronisez Firefox entre vos appareils + + Reprenez là où vous en étiez - Importez vos marque-pages, votre historique et vos mots de passe dans %1$s sur cet appareil. + Importez vos marque-pages, votre historique et vos mots de passe dans %1$s sur cet appareil. - Se connecter + Se connecter + + Connexion Synchronisation activée - Confidentialité toujours assurée + Confidentialité toujours assurée + + Protection de la vie privée par défaut - %1$s empêche automatiquement les entreprises de vous suivre secrètement sur le Web. + %1$s empêche automatiquement les entreprises de vous suivre secrètement sur le Web. Standard (par défaut) @@ -1283,12 +1318,14 @@ Choisissez l’emplacement de votre barre d’outils - Placez la barre d’outils à portée de main. Laissez-la en bas ou déplacez-la en haut. + Placez la barre d’outils à portée de main. Laissez-la en bas ou déplacez-la en haut. - Votre vie privée + Votre vie privée - Nous avons conçu %s pour vous donner le contrôle de ce que vous partagez en ligne et de ce que vous partagez avec nous. + Nous avons conçu %s pour vous donner le contrôle de ce que vous partagez en ligne et de ce que vous partagez avec nous. + + Firefox vous donne le contrôle de ce que vous partagez en ligne et de ce que vous partagez avec nous. Consulter notre politique de confidentialité diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a253c01a9..50b975a50 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -287,11 +287,15 @@ Scopri la tua pagina iniziale personalizzata. Le schede recenti, i segnalibri e i risultati di ricerca verranno visualizzati qui. - Benvenuti nell’Internet indipendente + Benvenuti nell’Internet indipendente + + Benvenuto in un Internet più personale Più colori. Ancora più protezione per la privacy. Stesso impegno nell’anteporre le persone ai profitti. - Passa dal computer al telefono, e viceversa + Passa dal computer al telefono, e viceversa + + Passare da uno schermo all’altro è più facile che mai Riprendi da dove avevi interrotto con le schede di altri dispositivi, ora disponibili direttamente dalla pagina iniziale. @@ -483,6 +487,14 @@ Visualizza + + Impossibile scaricare lo sfondo + + Riprova + + Impossibile cambiare lo sfondo + + Ulteriori informazioni Cambia lo sfondo toccando il logo di Firefox nella pagina iniziale @@ -490,6 +502,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo di Firefox. Pulsante per cambiare lo sfondo + + %s classico + + Edizione limitata + + La nuova raccolta Voci indipendenti. %s + + La nuova raccolta Voci indipendenti. + + Prova un tocco di colore + + Scegli lo sfondo perfetto per te. + + Scopri altri sfondi + Il componente aggiuntivo non è supportato @@ -1264,20 +1291,34 @@ - Benvenuto in %s. + Benvenuto in %s. + + Benvenuti in un Internet migliore + + Un browser realizzato per le persone, non per il profitto. - Sincronizza Firefox tra vari dispositivi + Sincronizza Firefox tra vari dispositivi + + Riprendi da dove ti eri interrotto - Porta segnalibri, cronologia e password di %1$s su questo dispositivo. + Porta segnalibri, cronologia e password di %1$s su questo dispositivo. + + Sincronizza le schede e le password tra i tuoi dispositivi per passare da uno schermo all’altro senza interruzioni. - Registrati + Registrati + + Accedi La sincronizzazione è attiva - Privacy sempre attiva + Privacy sempre attiva + + Progettato per la protezione della privacy - %1$s blocca automaticamente le società che, di nascosto, cercano di seguire le tue attività sul Web. + %1$s blocca automaticamente le società che, di nascosto, cercano di seguire le tue attività sul Web. + + Ora con Protezione totale per i cookie, che impedisce l’utilizzo dei cookie per seguire le tue attività online attraverso diversi siti. Normale (predefinita) @@ -1289,15 +1330,23 @@ Scegli la posizione della barra degli strumenti - Metti la barra degli strumenti a portata di mano. Tienila in basso o spostala in alto. + Metti la barra degli strumenti a portata di mano. Tienila in basso o spostala in alto. + + Tienila in basso o spostala in alto. - La tua privacy + La tua privacy + + I tuoi dati, la tua scelta - %s è progettato per darti il pieno controllo sulle informazioni che condividi online e con noi. + %s è progettato per darti il pieno controllo sulle informazioni che condividi online e con noi. + + Firefox ti garantisce il pieno controllo sulle informazioni che condividi online e con noi. Leggi la nostra informativa sulla privacy + + Sei pronto a scoprire le meraviglie di Internet? Inizia a navigare diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index d5922efd6..1e3b97285 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -279,6 +279,8 @@ ສີເພີ່ມເຕີມ. ຄວາມເປັນສ່ວນຕົວທີ່ດີກວ່າ. ຄໍາຫມັ້ນສັນຍາດຽວກັນກັບປະຊາຊົນຫຼາຍກວ່າກໍາໄລ. ເລື່ອນຈາກໂທລະສັບໄປຫາແລັບທັອບ ແລະຫຼັງ + + ການສະຫຼັບໜ້າຈໍແມ່ນງ່າຍກວ່າທີ່ເຄີຍ ເລືອກເບິ່ງຕໍ່ຈາກທີທ່ານປະໄວ້ດ້ວຍແຖບຈາກອຸປະກອນອື່ນໆໃນຫນ້າທໍາອິດຂອງທ່ານ. @@ -470,16 +472,28 @@ ບໍ່ສາມາດດາວໂຫຼດວໍເປເປີໄດ້ ລອງໃຫມ່ອີກຄັ້ງ + + ບໍ່ສາມາດປ່ຽນຮູບພື້ນຫຼັງໄດ້ ຮຽນຮູ້ເພີ່ມເຕີມ ປ່ຽນຮູບວໍເປເປີໂດຍການແຕະໃສ່ໂລໂກ້ຂອງໜ້າຫຼັກຂອງ Firefox + + ໂລໂກ້ Firefox - ປ່ຽນຮູບວໍເປເປີ, ປຸ່ມ ຄລາດສິກ %s ມີ​ຈໍາ​ນວນ​ຈໍາ​ກັດ + + ລອງເລືອກສີສັນທີທ່ານມັກ + + ເລືອກຮູບວໍເປເປີທີ່ບົ່ງບອກຄວາມເປັນໂຕຕົນຂອງທ່ານ. + + ສຳຫຼວດຮູບພື້ນຫຼັງເພີ່ມເຕີມ + Add-on ນີ້ແມ່ນບໍ່ໄດ້ຮັບການຊັບພອດ @@ -1239,10 +1253,16 @@ The first parameter is the name of the app (e.g. Firefox Preview) --> ຍິນດີຕ້ອນຮັບສູ່ %s! + + ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີ່ດີກວ່າ Sync Firefox ລະຫວ່າງອຸປະກອນ + + ຮັບເອົາຈາກບ່ອນທີ່ທ່ານໄດ້ປະເອົາໄວ້. ລົງ​ທະ​ບຽນ + + ເຂົ້າສູ່ລະບົບ Sync ເປີດຢູ່ @@ -1258,6 +1278,8 @@ ເລືອກການຈັດວາງແຖບເຄື່ອງມືຂອງທ່ານ ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ + + ທ່ານຄວບຄຸມຂໍ້ມູນຂອງທ່ານ ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງພວກເຮົາ @@ -1489,6 +1511,8 @@ ກັອບປີ້ຊື່ຜູ້ໃຊ້ ລົບລ້າງຊື່ຜູ້ໃຊ້ + + ລຶບຊື່ໂຮດ ເປີດເວັບໄຊທໃນບຣາວເຊີ @@ -1775,6 +1799,8 @@ ການຕັ້ງຄ່າ + + ຜູ້ສະຫນັບສະຫນູນຂອງພວກເຮົາ & ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ ໄດ້ຮັບການສະຫນັບສະຫນູນ @@ -1789,20 +1815,33 @@ ຫຍໍ້ແຖບທີ່ບໍ່ເຄື່ອນໄຫວ + + + ປິດອັດຕະໂນມັດຫຼັງຈາກຫນຶ່ງເດືອນບໍ? ເປີດປິດອັດຕະໂນມັດ + + ປິດອັດຕະໂນມັດເປີດ + ລົບ ຄຣິກສຳລັບລາຍລະອຽດເພີ່ມເຕີມ + + ນຳທາງຂຶ້ນໄປທາງເທືງ + ປິດ + + ເລື່ອງຕາມຫົວຂໍ້ ຄົ້ນຫາເພີ່ມເຕີມ + + ຂັບເຄື່ອນໂດຍ Pocket. ຮຽນຮູ້ເພີ່ມເຕີມ diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 4ef23f217..4eb658767 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1323,7 +1323,7 @@ පරිලෝකනයට සූදානම් - කැමරාව සමඟ පිවිසෙන්න + රූගතය සමඟ පිවිසෙන්න වි-තැපෑල යොදාගන්න diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index ef9678b99..1f4d20479 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -285,6 +285,8 @@ Spoznajte svojo prilagojeno domačo stran. Tukaj bodo prikazani nedavni zavihki, zaznamki in zadetki iskanja. Dobrodošli v neodvisnem internetu + + Dobrodošli v bolj osebnem internetu Več barve. Večja zasebnost. Enaka zavezanost ljudem namesto dobičku. @@ -482,6 +484,8 @@ Ozadja ni bilo mogoče prenesti + + Poskusi znova Ozadja ni bilo mogoče spremeniti @@ -492,8 +496,16 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logtip Firefoxa – spremeni ozadje, gumb + + Omejena izdaja + + Nova kolekcija Neodvisni glasovi. %s + + Nova kolekcija Neodvisni glasovi. Poskusite s kančkom barve + + Izberite ozadje, ki vas nagovarja. Raziščite več ozadij diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index b15c00d02..7a3eeed26 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -38,12 +38,10 @@ - ఇటీవలి ఇష్టాంశాలు - - ఇటీవల భద్రపరచిన ఇష్టాంశాలు - - అన్నీ చూపించు + ఇటీవలి ఇష్టాంశాలు + + ఇటీవల భద్రపరచినవి తీసివేయి @@ -96,10 +94,10 @@ అన్నీ చూపించు - \"%1$s\" కోసం మీ వెతుకులాటలు + \"%1$s\" కోసం మీ వెతుకులాటలు - %d సైట్లు + %d సైట్లు తీసివేయి @@ -197,8 +195,6 @@ అంతరంగిక సెషన్లలో వెతుకుడు సలహాలను అనుమతించాలా? చిరునామా పట్టీలో మీరు వ్రాసిన ప్రతిదాన్ని %s మీ అప్రమేయ శోధన యంత్రంతో పంచుకుంటుంది. - - ఇంకా తెలుసుకోండి %s‌లో వెతకండి @@ -208,11 +204,14 @@ - %1$sలో కొత్తవి ఏమిటి + %1$sలో కొత్తవి ఏమిటి - ఇంతకుముందు మీరు ఆపిన చోటనుండి మొదలుపెట్టడం ఇప్పుడు తేలిక. + ఇంతకుముందు మీరు ఆపిన చోటనుండి మొదలుపెట్టడం ఇప్పుడు తేలిక. - ఇటీవలి వెతుకులాటలు + ఇటీవలి వెతుకులాటలు + + + దాటవేయి @@ -292,7 +291,7 @@ అభిమతీకరణ - మీ Firefox ఖాతాతో ఇష్టాంశాలను, సంకేతపదాలను, ఇంకా మరెన్నిటినో సింక్ చేసుకోండి + మీ Firefox ఖాతాతో ఇష్టాంశాలను, సంకేతపదాలను, ఇంకా మరెన్నిటినో సింక్ చేసుకోండి Firefox ఖాతా @@ -356,6 +355,11 @@ చూడండి + + మళ్ళీ ప్రయత్నించు + + ఇంకా తెలుసుకోండి + పొడగింతకు తోడ్పాటు లేదు @@ -436,7 +440,7 @@ - సింక్‌ను చేతనించు + సింక్‌ను చేతనించు మళ్ళీ అనుసంధానించడానికి ప్రవేశించండి @@ -603,8 +607,6 @@ తెరిచివున్న ట్యాబుల మెనూ ట్యాబులను సేకరణకు భద్రపరచు - - ట్యాబు మెనూ సేకరణను తొలగించు @@ -625,7 +627,7 @@ %1$s (అంతరంగిక రీతి) - ఇతర ట్యాబులు + ఇతర ట్యాబులు చరిత్రను తొలగించు @@ -930,8 +932,6 @@ ట్యాబులు మూసివేయబడ్డాయి ఇష్టాంశాలు భద్రమయ్యాయి! - - మేటి సైట్లకు చేర్చబడింది! అంతరంగిక ట్యాబు మూసివేయబడింది @@ -1013,7 +1013,12 @@ నిష్క్రమించు - ఇది మీ విహరణ డేటా అంతటినీ తొలగించివేస్తుంది. + ఇది మీ విహరణ డేటా అంతటినీ తొలగించివేస్తుంది. + + ఈరోజు, నిన్న + + అన్నీ + ఎంచుకున్న డేటాను %s తొలగిస్తుంది. @@ -1028,44 +1033,19 @@ విహరణ డేటా తొలగింపబడుతూంది… - - ఇది అంశాలన్నిటినీ తొలగిస్తుంది. రద్దుచేయి తొలగించు - - - Firefox Preview ఇప్పుడు Firefox Nightly అయింది - - Firefox నైట్లీ ప్రతి రాత్రీ కొత్త ప్రయోగాత్మక సౌలభ్యాలతో తాజాకరించబడుతుంది. - అయితే, ఇదంత స్థిరంగా ఉండకపోవచ్చు. మరి కొతం సుస్థిరమైన అనుభవం కోసం మా బీటా విహారిణిని దించుకోండి. - - ఆండ్రాయిడ్ కోసం Firefox బీటాను పొందండి - - - Firefox నైట్లీ తరలించబడింది - - ఈ అనువర్తనానికి ఇకపై భద్రతా తాజాకరణలు రావు. ఈ అనువర్తనాన్ని వాడటం మానివేసి, కొత్త నైట్లీకి మారండి. - \n\nమీ ఇష్టాంశాలను, ప్రవేశాలను, చరిత్రను మరో అనువర్తనానికి బదిలీ చేయడానికి, ఒక Firefox ఖాతాను సృష్టించుకోండి. - - కొత్త నైట్లీకి మారండి - - - Firefox నైట్లీ తరలించబడింది - - ఈ అనువర్తనానికి ఇకపై భద్రతా తాజాకరణలు రావు. కొత్త నైట్లీని తెచ్చుకొని, ఈ అనువర్తనాన్ని వాడటం మానివేయండి. - \n\nమీ ఇష్టాంశాలను, ప్రవేశాలను, చరిత్రను మరో అనువర్తనానికి బదిలీ చేయడానికి, ఒక Firefox ఖాతాను సృష్టించుకోండి. - - కొత్త నైట్లీని పొందండి - - %sకి స్వాగతం! + %sకి స్వాగతం! + + మెరుగైన అంతర్జాలానికి స్వాగతం - నమోదవ్వండి + నమోదవ్వండి సింక్ చేతనంగా ఉంది @@ -1075,7 +1055,7 @@ పనిముట్లపట్టీ ఎక్కడ ఉండాలో ఎంచుకోండి - మీ అంతరంగికత + మీ అంతరంగికత మా గోప్యతా నోటీసును చదవండి @@ -1363,6 +1343,7 @@ భద్రపరచిన కార్డుల నిర్వహణ చిరునామాను చేర్చు + కార్డును చేర్చు @@ -1403,16 +1384,22 @@ చిరునామాను చేర్చు - - పూర్తి పేరు + + మొదటి పేరు + + మధ్య పేరు + + ఇంటి పేరు వీధి చిరునామా నగరం - + రాష్ట్రం జిప్ + + దేశం లేదా ప్రాంతం ఫోను @@ -1424,6 +1411,13 @@ చిరునామాను తొలగించు + + ఈ చిరునామాను నిజంగానే తొలగించాలనుకుంటున్నారా? + + తొలగించు + + రద్దుచేయి + శోధన యంత్రం చేర్పు @@ -1464,19 +1458,6 @@ %s తొలగించబడింది - - పూర్తి సరికొత్త %s‌కి స్వాగతం - - మెరుగైన పనితీరుతో, ఆన్‌లైనులో మరింత చేయడానికి మీకు తోడ్పడే సౌలభ్యాలతో పూర్తిగా మళ్ళీ రూపకల్పన చేయబడ్డ విహారిణి సిద్ధంగా ఉంది.\n\nమేము %s‌ని దీనితో తాజాకరించేవరకూ వేచివుండండి: మీ - - %s తాజాకరించబడుతోండి… - - %sను మొదలుపెట్టు - - తరలింపు పూర్తయింది - - సంకేతపదాలు - దీనిని అనుమతించడానికి: @@ -1504,10 +1485,6 @@ సైటు మినహాయింపులేమీ లేవు ఈ ఇష్టాంశాన్ని మీరు నిజంగానే తొలగించాలనుకుంటున్నారా? - - మేటి సైట్లకు చేర్చు - - మేటి సైట్ల నుండి తీసివేయి తనిఖీ చేసినవారు: %1$s @@ -1566,16 +1543,11 @@ తెరిచివున్న ట్యాబులు లేవు - - - మేటి సైట్ల పరిమితి చేరుకున్నారు సరే, అర్థమయ్యింది పేరు - - మేటి సైటు పేరు సరే @@ -1611,4 +1583,4 @@ అమరికలకు వెళ్ళు - + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 03e245643..600d93629 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -284,11 +284,15 @@ Size özel giriş sayfanızla tanışın. Son sekmeleriniz, yer imleriniz ve arama sonuçlarınız burada görünecek. - Bağımsız bir internete hoş geldiniz + Bağımsız bir internete hoş geldiniz + + Daha kişisel bir internete hoş geldiniz Daha renkli. Daha gizli. Para için değil, insanlık için. - Telefondan bilgisayara, bilgisayardan telefona geçin + Telefondan bilgisayara, bilgisayardan telefona geçin + + Cihazdan cihaza geçmek artık daha kolay Diğer cihazlardaki sekmeleriniz artık giriş sayfanızda. @@ -475,6 +479,14 @@ Duvar kâğıdı güncellendi. Göster + + Duvar kâğıdı indirilemedi + + Tekrar dene + + Duvar kâğıdı değiştirilemedi + + Daha fazla bilgi alın Giriş sayfasındaki Firefox logosuna dokunarak duvar kâğıdını değiştirin @@ -482,6 +494,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox logosu - duvar kağıdını değiştir, düğme + + Klasik %s + + Limited Edition + + Yeni Bağımsız Sesler koleksiyonu. %s + + Yeni Bağımsız Sesler koleksiyonu. + + Farklı renkleri deneyin + + Size hitap eden bir duvar kâğıdı seçin. + + Daha fazla duvar kâğıdı keşfedin + Eklenti desteklenmiyor @@ -1228,19 +1255,29 @@ - %s’a hoş geldiniz! + %s’a hoş geldiniz! + + Daha iyi bir internete hoş geldiniz + + Para için değil, insanlık için geliştirilen bir tarayıcı. - Firefox’u cihazlar arasında eşitleyin + Firefox’u cihazlar arasında eşitleyin + + Kaldığınız yerden devam edin - Yer imlerinizi, geçmişinizi ve parolalarınız bu cihazdaki %1$s tarayıcınıza taşıyın. + Yer imlerinizi, geçmişinizi ve parolalarınız bu cihazdaki %1$s tarayıcınıza taşıyın. - Kaydol + Kaydol + + Giriş yap Sync açık - Sürekli gizlilik + Sürekli gizlilik + + Gizlilik koruması hep açık - %1$s şirketlerin sizi web’de gizlice takip etmesini otomatik olarak engeller. + %1$s şirketlerin sizi web’de gizlice takip etmesini otomatik olarak engeller. Standart (varsayılan) @@ -1252,15 +1289,23 @@ Araç çubuğu konumunu seçin - Araç çubuğunu kolayca erişilebileceğiniz bir yere koyun. Altta tutabilir veya en üste taşıyabilirsiniz. + Araç çubuğunu kolayca erişilebileceğiniz bir yere koyun. Altta tutabilir veya en üste taşıyabilirsiniz. + + Altta tutun veya en üste taşıyın. - Gizliliğiniz + Gizliliğiniz + + Verilerinizin kontrolü sizde - %s, internette başkalarıyla ve bizimle neleri paylaşacağınızın kontrolünü size verir. + %s, internette başkalarıyla ve bizimle neleri paylaşacağınızın kontrolünü size verir. + + Firefox, internette başkalarıyla ve bizimle neleri paylaşacağınızın kontrolünü size verir. Gizlilik bildirimimizi okuyun + + Harika bir internete yelken açmaya hazır mısınız? Gezinmeye başla From 6e99d6310b0894e557731077a52cb4d11082b146 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 22 Sep 2022 15:02:15 +0000 Subject: [PATCH 044/407] Update to Android-Components 107.0.20220922143126. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2f8af9c2d..249103e79 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220921190147" + const val VERSION = "107.0.20220922143126" } From 911f3506420a2accbd7114e16783a0fd93edc0c2 Mon Sep 17 00:00:00 2001 From: Jonathan Almeida Date: Thu, 22 Sep 2022 07:37:35 -0400 Subject: [PATCH 045/407] Closes #27077: Load first run experiments synchronously. Co-authored-by: Arturo Mejia Co-authored-by: Charlie Humphreys Co-authored-by: jhugman --- .../perf/StartupExcessiveResourceUseTest.kt | 2 +- .../org/mozilla/fenix/FenixApplication.kt | 1 - .../mozilla/fenix/experiments/NimbusSetup.kt | 52 +++++++++++-------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt index de3c2e12d..bab02da39 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt @@ -46,7 +46,7 @@ private const val EXPECTED_SUPPRESSION_COUNT = 17 * generally be replaced with a slow operation on a background thread launching onto the main thread * when completed. However, in a very small number of cases, blocking may be impossible to avoid. */ -private val EXPECTED_RUNBLOCKING_RANGE = 0..1 // CI has +1 counts compared to local runs: increment these together +private val EXPECTED_RUNBLOCKING_RANGE = 0..2 // CI has +1 counts compared to local runs: increment these together /** * The number of `ConstraintLayout`s we inflate that are children of a `RecyclerView` during this diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 7f164eb26..9a3f158f1 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -429,7 +429,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { // experiment on features close to startup. // But we need viaduct (the RustHttp client) to be ready before we do. components.analytics.experiments.apply { - initialize() setupNimbusObserver(this) } } diff --git a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt index d3d7915b8..72b9cac81 100644 --- a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt +++ b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt @@ -7,8 +7,8 @@ package org.mozilla.fenix.experiments import android.content.Context import android.net.Uri import android.os.StrictMode -import mozilla.components.service.nimbus.NimbusApi import mozilla.components.service.nimbus.Nimbus +import mozilla.components.service.nimbus.NimbusApi import mozilla.components.service.nimbus.NimbusAppInfo import mozilla.components.service.nimbus.NimbusDisabled import mozilla.components.service.nimbus.NimbusServerSettings @@ -16,11 +16,13 @@ import mozilla.components.support.base.log.logger.Logger import org.mozilla.experiments.nimbus.NimbusInterface import org.mozilla.experiments.nimbus.internal.EnrolledExperiment import org.mozilla.experiments.nimbus.internal.NimbusException +import org.mozilla.experiments.nimbus.joinOrTimeout import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.nimbus.FxNimbus +import org.mozilla.fenix.perf.runBlockingIncrement /** * Fenix specific observer of Nimbus events. @@ -34,6 +36,14 @@ private val observer = object : NimbusInterface.Observer { } } +/** + * The maximum amount of time the app launch will be blocked to load experiments from disk. + * + * ⚠️ This value was decided from analyzing the Focus metrics (nimbus_initial_fetch) for the ideal + * timeout. We should NOT change this value without collecting more metrics first. + */ +private const val TIME_OUT_LOADING_EXPERIMENT_FROM_DISK_MS = 200L + @Suppress("TooGenericExceptionCaught") fun createNimbus(context: Context, url: String?): NimbusApi { val errorReporter: ((String, Throwable) -> Unit) = reporter@{ message, e -> @@ -88,32 +98,32 @@ fun createNimbus(context: Context, url: String?): NimbusApi { // generated code. register(observer) - // This performs the minimal amount of work required to load branch and enrolment data - // into memory. If `getExperimentBranch` is called from another thread between here - // and the next nimbus disk write (setting `globalUserParticipation` or - // `applyPendingExperiments()`) then this has you covered. - // This call does its work on the db thread. - initialize() + val isFirstNimbusRun = context.settings().isFirstNimbusRun + + // We always want `Nimbus.initialize` to happen ASAP and before any features (engine/UI) + // have been initialized. For that reason, we use runBlocking here to avoid + // inconsistency in the experiments. + // We can safely do this because Nimbus does most of it's work on background threads, + // except for loading the initial experiments from disk. For this reason, we have a + // `joinOrTimeout` to limit the blocking until TIME_OUT_LOADING_EXPERIMENT_FROM_DISK_MS. + runBlockingIncrement { + val job = initialize( + isFirstNimbusRun || url.isNullOrBlank(), + R.raw.initial_experiments, + ) + // We only read from disk when loading first-run experiments. This is the only time + // that we should join and block. Otherwise, we don't want to wait. + if (isFirstNimbusRun) { + context.settings().isFirstNimbusRun = false + job.joinOrTimeout(TIME_OUT_LOADING_EXPERIMENT_FROM_DISK_MS) + } + } if (!enabled) { // This opts out of nimbus experiments. It involves writing to disk, so does its // work on the db thread. globalUserParticipation = enabled } - - if (context.settings().isFirstNimbusRun || url.isNullOrBlank()) { - setExperimentsLocally(R.raw.initial_experiments) - context.settings().isFirstNimbusRun = false - } - - // We may have downloaded experiments on a previous run, so let's start using them - // now. We didn't do this earlier, so as to make getExperimentBranch and friends returns - // the same thing throughout the session. This call does its work on the db thread. - applyPendingExperiments() - - // Now fetch the experiments from the server. These will be available for feature - // configuration on the next run of the app. This call launches on the fetch thread. - fetchExperiments() } } catch (e: Throwable) { // Something went wrong. We'd like not to, but stability of the app is more important than From fba46517ff1fe26e654dc7c9cd1dd542e9533bdc Mon Sep 17 00:00:00 2001 From: jeddai Date: Thu, 22 Sep 2022 16:30:33 +0000 Subject: [PATCH 046/407] update initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 109 +----------------- 1 file changed, 1 insertion(+), 108 deletions(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index d46501a67..268c73f0e 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -1,110 +1,3 @@ { - "data": [ - { - "schemaVersion": "1.9.0", - "slug": "fenix-first-run-validation-aa-2-weeks", - "id": "fenix-first-run-validation-aa-2-weeks", - "arguments": {}, - "application": "org.mozilla.firefox_beta", - "appName": "fenix", - "appId": "org.mozilla.firefox_beta", - "channel": "beta", - "userFacingName": "Fenix First Run Validation A/A 2 weeks", - "userFacingDescription": "This is an internal test of new functionality.", - "isEnrollmentPaused": true, - "isRollout": false, - "bucketConfig": { - "randomizationUnit": "nimbus_id", - "namespace": "fenix-no-feature-fenix-beta-1", - "start": 5000, - "count": 5000, - "total": 10000 - }, - "featureIds": [ - "no-feature-fenix" - ], - "probeSets": [], - "outcomes": [], - "branches": [ - { - "slug": "control-1", - "ratio": 1, - "feature": { - "featureId": "no-feature-fenix", - "enabled": true, - "value": {} - } - }, - { - "slug": "control-2", - "ratio": 1, - "feature": { - "featureId": "no-feature-fenix", - "enabled": true, - "value": {} - } - } - ], - "targeting": "((is_already_enrolled) || ((days_since_install < 7) && (app_version|versionCompare('105.!') >= 0)))", - "startDate": "2022-08-17", - "enrollmentEndDate": "2022-08-31", - "endDate": "2022-09-07", - "proposedDuration": 14, - "proposedEnrollment": 7, - "referenceBranch": "control-1" - }, - { - "schemaVersion": "1.9.0", - "slug": "fenix-first-run-validation-aa-4-weeks", - "id": "fenix-first-run-validation-aa-4-weeks", - "arguments": {}, - "application": "org.mozilla.firefox_beta", - "appName": "fenix", - "appId": "org.mozilla.firefox_beta", - "channel": "beta", - "userFacingName": "Fenix First Run Validation A/A 4 weeks", - "userFacingDescription": "This is an internal test of new functionality.", - "isEnrollmentPaused": true, - "isRollout": false, - "bucketConfig": { - "randomizationUnit": "nimbus_id", - "namespace": "fenix-no-feature-fenix-beta-1", - "start": 0, - "count": 5000, - "total": 10000 - }, - "featureIds": [ - "no-feature-fenix" - ], - "probeSets": [], - "outcomes": [], - "branches": [ - { - "slug": "control-1", - "ratio": 1, - "feature": { - "featureId": "no-feature-fenix", - "enabled": true, - "value": {} - } - }, - { - "slug": "control-2", - "ratio": 1, - "feature": { - "featureId": "no-feature-fenix", - "enabled": true, - "value": {} - } - } - ], - "targeting": "((is_already_enrolled) || ((days_since_install < 7) && (app_version|versionCompare('105.!') >= 0)))", - "startDate": "2022-08-17", - "enrollmentEndDate": "2022-08-31", - "endDate": null, - "proposedDuration": 28, - "proposedEnrollment": 7, - "referenceBranch": "control-1" - } - ] + "data": [] } From 444f663143cae435766a4604f221136043457a23 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Thu, 15 Sep 2022 17:10:50 -0400 Subject: [PATCH 047/407] For #27026 - Use the wallpaper adapted text color for the Collections placeholder --- .../sessioncontrol/SessionControlAdapter.kt | 1 + .../NoCollectionsMessageViewHolder.kt | 35 ++++++++++++++++--- .../NoCollectionsMessageViewHolderTest.kt | 19 +++++++--- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index 00cd652b6..dd14e3a59 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -317,6 +317,7 @@ class SessionControlAdapter( view, viewLifecycleOwner, components.core.store, + components.appStore, interactor, ) OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt index 834a0443d..907aaa8f0 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt @@ -5,26 +5,28 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.view.View +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.core.view.isVisible import androidx.lifecycle.LifecycleOwner -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.map import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.store.BrowserStore import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.NoCollectionsMessageBinding import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor import org.mozilla.fenix.utils.view.ViewHolder -@OptIn(ExperimentalCoroutinesApi::class) -open class NoCollectionsMessageViewHolder( +class NoCollectionsMessageViewHolder( view: View, viewLifecycleOwner: LifecycleOwner, store: BrowserStore, + appStore: AppStore, interactor: CollectionInteractor, ) : ViewHolder(view) { @@ -32,7 +34,6 @@ open class NoCollectionsMessageViewHolder( val binding = NoCollectionsMessageBinding.bind(view) binding.addTabsToCollectionsButton.apply { - setOnClickListener { interactor.onAddTabsToCollectionTapped() } @@ -55,6 +56,30 @@ open class NoCollectionsMessageViewHolder( binding.addTabsToCollectionsButton.isVisible = tabs > 0 } } + + appStore.flowScoped(viewLifecycleOwner) { flow -> + flow.map { state -> state.wallpaperState.currentWallpaper.textColor } + .ifChanged() + .collect { textColor -> + if (textColor == null) { + val context = view.context + binding.noCollectionsHeader.setTextColor( + context.getColorFromAttr(R.attr.textPrimary), + ) + binding.noCollectionsDescription.setTextColor( + context.getColorFromAttr(R.attr.textSecondary), + ) + binding.removeCollectionPlaceholder.setColorFilter( + context.getColorFromAttr(R.attr.textPrimary), + ) + } else { + val color = Color(textColor).toArgb() + binding.noCollectionsHeader.setTextColor(color) + binding.noCollectionsDescription.setTextColor(color) + binding.removeCollectionPlaceholder.setColorFilter(color) + } + } + } } companion object { diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt index 08dc33e13..dea4f6059 100644 --- a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt @@ -18,6 +18,7 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.NoCollectionsMessageBinding import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor @@ -35,10 +36,14 @@ class NoCollectionsMessageViewHolderTest { ) private lateinit var lifecycleOwner: LifecycleOwner private lateinit var interactor: CollectionInteractor + private lateinit var appStore: AppStore @Before fun setup() { binding = NoCollectionsMessageBinding.inflate(LayoutInflater.from(testContext)) + + appStore = AppStore() + lifecycleOwner = mockk(relaxed = true) interactor = mockk(relaxed = true) } @@ -46,21 +51,27 @@ class NoCollectionsMessageViewHolderTest { @Test fun `hide add to collection button when there are no tabs open`() { val noTabsStore = BrowserStore() - NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, noTabsStore, interactor) + NoCollectionsMessageViewHolder( + binding.root, + lifecycleOwner, + noTabsStore, + appStore, + interactor, + ) assertFalse(binding.addTabsToCollectionsButton.isVisible) } @Test fun `show add to collection button when there are tabs`() { - NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, interactor) + NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, appStore, interactor) assertTrue(binding.addTabsToCollectionsButton.isVisible) } @Test fun `call interactor on click`() { - NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, interactor) + NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, appStore, interactor) binding.addTabsToCollectionsButton.performClick() verify { interactor.onAddTabsToCollectionTapped() } @@ -68,7 +79,7 @@ class NoCollectionsMessageViewHolderTest { @Test fun `hide view and change setting on remove placeholder click`() { - NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, interactor) + NoCollectionsMessageViewHolder(binding.root, lifecycleOwner, store, appStore, interactor) binding.removeCollectionPlaceholder.performClick() verify { From 5811b0667974021fe9671bae967865d4cd9b01b0 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Thu, 22 Sep 2022 12:59:18 -0700 Subject: [PATCH 048/407] For #27055: handle legacy wallpaper naming case --- .../main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt | 7 +++++-- .../java/org/mozilla/fenix/wallpapers/WallpaperTest.kt | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt index 0b635d62b..d53c1478f 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt @@ -132,11 +132,14 @@ data class Wallpaper( /** * Check if a wallpaper name matches the default. Considers empty strings to be default - * since that likely means a wallpaper has never been set. + * since that likely means a wallpaper has never been set. The "none" case here is to deal + * with a legacy case where the default wallpaper used to be Wallpaper.NONE. See + * commit 7a44412, Wallpaper.NONE and Settings.currentWallpaper (legacy name) for context. * * @param name The name to check. */ - fun nameIsDefault(name: String): Boolean = name.isEmpty() || name == defaultName + fun nameIsDefault(name: String): Boolean = + name.isEmpty() || name == defaultName || name.lowercase() == "none" } /** diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt index 142474fd3..2dc046487 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperTest.kt @@ -25,4 +25,11 @@ class WallpaperTest { assertFalse(result) } + + @Test + fun `GIVEN the legacy wallpaper default name none WHEN checking whether the current wallpaper should be default THEN return true`() { + val result = Wallpaper.nameIsDefault("NONE") + + assertTrue(result) + } } From 4c3db083994e51db85d2d13fbbfd5cdbbdbab340 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 23 Sep 2022 02:39:08 +0200 Subject: [PATCH 049/407] Import l10n. (#27116) --- app/src/main/res/values-es-rMX/strings.xml | 26 ++++++++ app/src/main/res/values-fi/strings.xml | 4 ++ app/src/main/res/values-gn/strings.xml | 9 +++ app/src/main/res/values-lo/strings.xml | 10 +++ app/src/main/res/values-nb-rNO/strings.xml | 71 ++++++++++++++++++---- app/src/main/res/values-su/strings.xml | 20 +++--- app/src/main/res/values-tr/strings.xml | 4 ++ 7 files changed, 124 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index ffbece65e..76354b0c7 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -283,10 +283,14 @@ Conoce tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. Te damos la bienvenida a un internet independiente + + Te damos la bienvenida a un internet más personal Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. Cambia del teléfono a la computadora y viceversa + + Cambiar de pantalla es más fácil que nunca Continuar donde lo dejaste con pestañas de otros dispositivos ahora en tu página de inicio. @@ -491,8 +495,18 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipo de Firefox - cambiar el fondo de pantalla, botón + + Clásico %s Edición limitada + + La nueva colección Voces Independientes. %s + + La nueva colección Voces Independientes. + + Prueba un toque de color + + Elige un fondo de pantalla que te represente. Explorar más fondos de pantalla @@ -1238,6 +1252,10 @@ ¡Te damos la bienvenida a %s! + + Te damos la bienvenida a un mejor internet + + Un navegador creado para las personas, no para las ganancias. Sincronizar Firefox entre dispositivos @@ -1254,8 +1272,12 @@ Sync está activado Privacidad siempre activada + + Protección a tu privacidad de forma predeterminada %1$s automáticamente detiene compañías que secretamente te siguen en la web. + + Cuenta con protección total de cookies para evitar que los rastreadores las usen para espiarte cuando navegues. Estándar (predeterminado) @@ -1270,6 +1292,8 @@ Coloca la barra de herramientas al alcance de la mano. Mantenla en la parte inferior o muévela hacia arriba. + + Manténlo en la parte inferior o muévelo a la parte superior. Tu privacidad @@ -1282,6 +1306,8 @@ Leer nuestro aviso de privacidad + + ¿Ya te preparaste para un internet increíble? Comenzar a navegar diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 08935233b..a9dec0061 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -504,6 +504,10 @@ Klassinen %s Rajoitettu erä + + Uusi Itsenäiset äänet -kokoelma. %s + + Uusi Itsenäiset äänet -kokoelma. Lisää ripaus väriä diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index d865f1256..2e93c4254 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -282,8 +282,12 @@ Eg̃uahẽporãite ñanduti ijeheguívape + + Eg̃uahẽporãite ñanduti mba’eguáva Eva pumbyrýgui mohendahápe ha ambueháicha + + Mba’erechaha ñemoambue ndahasyiete Eñepyrũ @@ -466,6 +470,8 @@ Hecha + + Noñemboguejykuaái mba’erechaha rugua Eha’ãjey @@ -486,6 +492,9 @@ Eipurukuaa sa’y sa’imi + + Eiporavo mba’erechaha rugua nde ehecharamóva. + Pe moĩmbaha ndojokupytýi diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 1e3b97285..e4364183c 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -275,6 +275,8 @@ ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີບໍ່ມີຂອບຈຳກັດ + + ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີມີຄວາມເປັນສ່ວນຕົວສູງ ສີເພີ່ມເຕີມ. ຄວາມເປັນສ່ວນຕົວທີ່ດີກວ່າ. ຄໍາຫມັ້ນສັນຍາດຽວກັນກັບປະຊາຊົນຫຼາຍກວ່າກໍາໄລ. @@ -487,6 +489,8 @@ ມີ​ຈໍາ​ນວນ​ຈໍາ​ກັດ + + ຄໍເລັກຊັນສຽງເອກະລາດໃໝ່. ລອງເລືອກສີສັນທີທ່ານມັກ @@ -1268,6 +1272,8 @@ ຄວາມເປັນສ່ວນຕົວເປີດຕະຫຼອດ + + ການປົກປ້ອງຄວາມເປັນສ່ວນຕົວຖືກກຳນົດເປັນຄ່າເລີ່ມຕົ້ນ ມາດຕະຖານ (ຄ່າພື້ນຖານ) @@ -1283,6 +1289,8 @@ ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງພວກເຮົາ + + ພ້ອມເປີດອິນເຕີເນັດທີ່ໜ້າອັດສະຈັນແລ້ວບໍ? ເລີ່ມການທ່ອງເວັບ @@ -1726,6 +1734,8 @@ ບໍ່ມີຂໍ້ຍົກເວັ້ນໃນເວັບໄຊທ໌ ເພີ່ມທາງລັດ + + ລຶບອອກຈາກທາງລັດ ໄດ້ຮັບການຢັ້ງຢືນໂດຍ: %1$s diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index afa6536e8..d26d1f6e9 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -286,11 +286,15 @@ Møt din personlige hjemmeside. Nylige faner, bokmerker og søkeresultater vises her. - Velkommen til et uavhengig internett + Velkommen til et uavhengig internett + + Velkommen til et mer personlig internett Flere farger. Bedre personvern. Samme forpliktelse til mennesker over fortjeneste. - Bytt fra telefon til bærbar PC og tilbake + Bytt fra telefon til bærbar PC og tilbake + + Det er enklere enn noen gang å bytte skjerm Fortsett der du slapp med faner fra andre enheter nå på startsiden din. @@ -476,6 +480,14 @@ Bakgrunnsbilde oppdatert! Vis + + Kunne ikke laste ned bakgrunnsbildet + + Prøv igjen + + Kunne ikke endre bakgrunnsbildet + + Les mer Endre bakgrunnsbilde ved å trykke på Firefox-logoen på startsiden @@ -483,6 +495,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo - endre bakgrunn, knapp + + Klassisk %s + + Begrenset utgave + + Den nye kolleksjonen uavhengige stemmer. %s + + Den nye kolleksjonen uavhengige stemmer. + + Prøv en fargeklatt + + Velg det perfekte bakgrunnsbildet for deg. + + Utforsk flere bakgrunnsbilder + Tillegget støttes ikke @@ -1231,21 +1258,35 @@ - Velkommen til %s! + Velkommen til %s! + + Velkommen til et bedre internett + + En nettleser bygget for mennesker, ikke profitt. - Synkroniser Firefox mellom enheter + Synkroniser Firefox mellom enheter + + Fortsett der du sluttet - Ta med bokmerker, historikk og passord til %1$s på denne enheten. + Ta med bokmerker, historikk og passord til %1$s på denne enheten. + + Synkroniser faner og passord på tvers av enheter for sømløs bytte av skjerm. - Registrer deg + Registrer deg + + Logg inn Synkroniseringen er på - Alltid med personvern + Alltid med personvern + + Personvernsbeskyttelse som standard - %1$s stopper selskaper automatisk fra å spore aktivitetene dine på nettet i det skjulte. + %1$s stopper selskaper automatisk fra å spore aktivitetene dine på nettet i det skjulte. + + Total beskyttelse mot infokapsler stopper sporere fra å bruke infokapsler for å forfølge deg på tvers av nettsteder. Standard (standard) @@ -1259,17 +1300,25 @@ Velg plassering for verktøylinjen - Plassere verktøylinjen innenfor rekkevidde. Ha den på bunn eller flytt den til toppen. + Plassere verktøylinjen innenfor rekkevidde. Ha den på bunn eller flytt den til toppen. + + Behold den på bunnen, eller flytt den til toppen. - Ditt personvern + Ditt personvern + + Du kontrollerer dine data - Vi har utviklet %s for å gi deg kontroll over det du deler på nettet og hva du deler med oss. + Vi har utviklet %s for å gi deg kontroll over det du deler på nettet og hva du deler med oss. + + Firefox gir deg kontroll over hva du deler på nettet og hva du deler med oss. Les personvernmerknaden vår + + Klar til å oppdage et fantastisk internett? Start nettlesingen diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 061494d14..16092a60c 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -455,6 +455,8 @@ Témbong + + Leuwih teleb Ganti latar ku cara noél logo tepas Firefox - Wilujeng sumping di %s! + Wilujeng sumping di %s! - Singkronkeun Firefox sakur parabot + Singkronkeun Firefox sakur parabot - Bawa markah, jujutan, jeung kecap sandi ka %1$s di ieu parabot. + Bawa markah, jujutan, jeung kecap sandi ka %1$s di ieu parabot. - Daptar + Daptar Singkronna hurung - Pripasi salawasna + Pripasi salawasna - %1$s otomatis megat maskapé rerencepan nunutur anjeun ngalanglang raramat. + %1$s otomatis megat maskapé rerencepan nunutur anjeun ngalanglang raramat. Baku (bawaan) @@ -1240,12 +1242,12 @@ Pilih perenah tulbar anjeun - Perenahkeun tulbar sangkan babari kahontal. Teundeun di handap, atawa pindahkeun ka punclut. + Perenahkeun tulbar sangkan babari kahontal. Teundeun di handap, atawa pindahkeun ka punclut. - Salindungan anjeun + Salindungan anjeun - Kami geus ngarancang %s sangkan anjeun bisa ngatur naon anu dibagikeun onlén jeung naon anu dibagikeun ka kami. + Kami geus ngarancang %s sangkan anjeun bisa ngatur naon anu dibagikeun onlén jeung naon anu dibagikeun ka kami. Maca wawaran salindungan kami diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 600d93629..fc7b84b58 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1266,6 +1266,8 @@ Kaldığınız yerden devam edin Yer imlerinizi, geçmişinizi ve parolalarınız bu cihazdaki %1$s tarayıcınıza taşıyın. + + Cihazlarınız arasında sorunsuz geçiş için sekmelerinizi ve parolalarınızı senkronize edin. Kaydol @@ -1278,6 +1280,8 @@ Gizlilik koruması hep açık %1$s şirketlerin sizi web’de gizlice takip etmesini otomatik olarak engeller. + + Komple çerez koruması, takip kodlarının sizi web’de takip etmek için çerezleri kullanmasını engeller. Standart (varsayılan) From 4d5f2f8ab41e4aea6327b7e533eefcb2e688c6f0 Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Tue, 20 Sep 2022 10:57:06 +0200 Subject: [PATCH 050/407] Bug 1789398 - ensure task["metadata"]["owner"] is not empty on github-push decision tasks Treeherder requires this in its ingestion pipeline, so if the pusher doesn't have an email then use their name instead. --- .taskcluster.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.taskcluster.yml b/.taskcluster.yml index 2a62f95e1..e803a2845 100644 --- a/.taskcluster.yml +++ b/.taskcluster.yml @@ -14,7 +14,10 @@ tasks: then: '${tasks_for}@noreply.mozilla.org' else: $if: 'tasks_for == "github-push"' - then: '${event.pusher.email}' + then: + $if: 'event.pusher.email' + then: '${event.pusher.email}' + else: '${event.pusher.name}@users.noreply.github.com' else: $if: 'tasks_for == "github-pull-request"' then: '${event.pull_request.user.login}@users.noreply.github.com' From f9d7483bdde2c77ef0bccf66ac1e4dac8f77d756 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 22 Sep 2022 14:02:45 +0300 Subject: [PATCH 051/407] For #25345 re-enable customTrackingProtectionSettingsTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index f5c69199a..f12a2a08f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -403,7 +403,6 @@ class SmokeTest { } } - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/25345") @Test fun customTrackingProtectionSettingsTest() { val genericWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) From a2011e201f729bcaf9cbb34b6a0e61e9386b6f4f Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 22 Sep 2022 15:44:25 +0300 Subject: [PATCH 052/407] For #26936 and #26818 fix saveLoginFromPromptTest and neverSaveLoginFromPromptTest UI tests --- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 702640fb4..3068a399a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -475,11 +475,28 @@ class BrowserRobot { } fun verifySaveLoginPromptIsShown() { - mDevice.findObject(UiSelector().text("test@example.com")).waitForExists(waitingTime) - val submitButton = mDevice.findObject(By.res("submit")) - submitButton.clickAndWait(Until.newWindow(), waitingTime) - // Click save to save the login - mDevice.waitNotNull(Until.findObjects(text("Save"))) + for (i in 1..RETRY_COUNT) { + try { + mDevice.findObject( + UiSelector() + .text("submit") + .resourceId("submit") + .className("android.widget.Button"), + ) + .also { it.waitForExists(waitingTime) } + .also { it.clickAndWaitForNewWindow(waitingTime) } + + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { } + } + } + } } fun verifyUpdateLoginPromptIsShown() { From bc5bc7f56491fdc4755dd8d39b57c6aba919eb67 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 23 Sep 2022 15:03:29 +0000 Subject: [PATCH 053/407] Update to Android-Components 107.0.20220923143109. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 249103e79..53c218b87 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220922143126" + const val VERSION = "107.0.20220923143109" } From 0164544e416726dd99fb21a35e7b8e317862f545 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 24 Sep 2022 02:31:32 +0200 Subject: [PATCH 054/407] Import l10n. (#27150) --- app/src/main/res/values-es-rCL/strings.xml | 80 ++++++++++++++++------ app/src/main/res/values-fr/strings.xml | 12 +--- app/src/main/res/values-iw/strings.xml | 13 +--- app/src/main/res/values-lo/strings.xml | 14 ++-- app/src/main/res/values-skr/strings.xml | 10 +-- app/src/main/res/values-uz/strings.xml | 16 +++-- app/src/main/res/values-zh-rCN/strings.xml | 14 +--- 7 files changed, 84 insertions(+), 75 deletions(-) diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 09f5d9df0..60dceea24 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -281,11 +281,15 @@ Conoce tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. - Te damos la bienvenida a un internet independiente + Te damos la bienvenida a un internet independiente + + Te damos la bienvenida a un internet más personal Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. - Salta del teléfono al computador y viceversa + Salta del teléfono al computador y viceversa + + Cambiar de pantalla es más fácil que nunca Continua donde lo dejaste con pestañas de otros dispositivos ahora en tu página de inicio. @@ -387,8 +391,6 @@ Personalizar - Sincroniza marcadores, contraseñas y más con tu cuenta de Firefox - Conéctate para sincronizar pestañas, marcadores, contraseñas y más. Cuenta de Firefox @@ -473,6 +475,14 @@ Ver + + No se pudo descargar el fondo de pantalla + + Volver a intentarlo + + No se pudo cambiar el fondo de pantalla + + Aprender más Cambia el fondo de pantalla tocando el logo de Firefox en la página de inicio @@ -480,6 +490,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logotipo de Firefox - cambiar el fondo de pantalla, botón + + %s clásico + + Edición limitada + + La nueva colección Voces Independientes. %s + + La nueva colección Voces Independientes. + + Prueba un toque de color + + Elige un fondo de pantalla que te represente. + + Explorar más fondos de pantalla + Complemento no compatible @@ -561,8 +586,6 @@ Permite a Mozilla instalar y realizar estudios - - Activar la sincronización Sincronizar y guarda tus datos @@ -779,9 +802,6 @@ %1$s (modo privado) - - Otras pestañas - Ingresa los términos de búsqueda @@ -1185,8 +1205,6 @@ Salir - - Esto eliminará todos tus datos de navegación. Rango de tiempo para eliminar @@ -1221,20 +1239,34 @@ - ¡Te damos la bienvenida a %s! + ¡Te damos la bienvenida a %s! + + Te damos la bienvenida a un mejor internet + + Un navegador desarrollado para las personas, no para lucrar. - Sincroniza Firefox entre dispositivos + Sincroniza Firefox entre dispositivos + + Continúa donde quedaste - Trae marcadores, historial y contraseñas a %1$s en este dispositivo. + Trae marcadores, historial y contraseñas a %1$s en este dispositivo. + + Sincroniza pestañas y contraseñas entre dispositivos para cambiar de pantalla de forma fluida. - Registrarse + Registrarse + + Conectarse Sincronización activada - Privacidad siempre activa + Privacidad siempre activa + + Protección de privacidad por defecto - %1$s automáticamente detiene a las compañías que te siguen en secreto por la web. + %1$s automáticamente detiene a las compañías que te siguen en secreto por la web. + + Incluye la protección total contra cookies para evitar que los rastreadores usen cookies para seguirte entre sitios. Estándar (por defecto) @@ -1246,16 +1278,24 @@ Elige la ubicación de la barra de herramientas - Coloca la barra de herramientas al alcance de la mano. Mantenla en la parte inferior o muévela hacia arriba. + Coloca la barra de herramientas al alcance de la mano. Mantenla en la parte inferior o muévela hacia arriba. + + Mantenla en la parte inferior o muévela a la parte superior. - Tu privacidad + Tu privacidad + + Tu controlas tus datos - Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + + Firefox te da control sobre lo que compartes en línea y lo que compartes con nosotros. Lee nuestro aviso de privacidad + + ¿Todo listo para abrir un internet increíble? Empezar a navegar diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dd3f020f9..5c9d430d6 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -396,8 +396,6 @@ Personnaliser - Synchronisez les marque-pages, l’historique et davantage avec votre compte Firefox - Connectez-vous pour synchroniser onglets, marque-pages, mots de passe et bien plus. Compte Firefox @@ -596,9 +594,6 @@ Autoriser Mozilla à installer et exécuter des études - - Activer Sync - Synchroniser et enregistrer vos données @@ -817,9 +812,6 @@ %1$s (navigation privée) - - Autres onglets - Termes à rechercher @@ -1247,8 +1239,6 @@ Quitter - - Cela supprimera toutes vos données de navigation. Intervalle à supprimer @@ -1288,6 +1278,8 @@ Bienvenue dans un meilleur Internet + + Un navigateur conçu pour les gens, pas pour l’argent. Synchronisez Firefox entre vos appareils diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 1a702c9d8..cdb3cf4c0 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -391,8 +391,6 @@ התאמה אישית - סנכרון סימניות, היסטוריה ועוד עם חשבון ה־Firefox שלך - יש להתחבר כדי לסנכרן את הלשוניות, הסימניות הססמאות ועוד. חשבון Firefox @@ -577,8 +575,6 @@ מאפשר ל־Mozilla להתקין ולהריץ מחקרים - - הפעלת Sync סנכרון ושמירת הנתונים שלך @@ -795,9 +791,6 @@ ‏%1$s (מצב פרטי) - - לשוניות אחרות - נא להקליד מונחים לחיפוש @@ -1027,9 +1020,9 @@ הוספת אוסף חדש - בחירת הכל + בחירת הכול - ביטול בחירת הכל + ביטול בחירה מהכול בחירת לשוניות לשמירה יציאה - - פעולה זו תמחק את כל נתוני הגלישה שלך. טווח זמן למחיקה diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index e4364183c..52726189e 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -381,8 +381,6 @@ ການປັບແຕ່ງ - Sync ບຸກມາກ, ປະຫວັດ, ແລະ ອື່ນໆດ້ວຍບັນຊີ Firefox ຂອງທ່ານ - Sync ແທັບ, ບຸກມາກ, ລະຫັດຜ່ານ ແລະ ອື່ນໆຂອງທ່ານ. ບັນຊີ Firefox @@ -581,8 +579,6 @@ ອະນຸຍາດໃຫ້ Mozilla ຕິດຕັ້ງ ແລະ ເປີດໃຊ້ການສຶກສາ - - ເປີດ Sync ຊິງຄ໌ແລະບັນທຶກຂໍ້ມູນ @@ -803,9 +799,6 @@ %1$s (ໂຫມດສ່ວນຕົວ) - - ແທັບອື່ນໆ - ປ້ອນຄຳທີ່ຕ້ອງການຄົ້ນຫາ @@ -1216,9 +1209,6 @@ ອອກ - - ສິ່ງນີ້ຈະລຶບຂໍ້ມູນການທ່ອງເວັບທັງໝົດຂອງທ່ານ. - ຊ່ວງເວລາທີ່ຈະລຶບ @@ -1259,6 +1249,8 @@ ຍິນດີຕ້ອນຮັບສູ່ອິນເຕີເນັດທີ່ດີກວ່າ + + ອິນເຕີເນັດສຳລັບທຸກຄົນ, ບໍ່ແມ່ນເພືອຫວັງຜົນກຳໄລ Sync Firefox ລະຫວ່າງອຸປະກອນ @@ -1852,6 +1844,8 @@ ຄົ້ນຫາເພີ່ມເຕີມ ຂັບເຄື່ອນໂດຍ Pocket. + + ສ່ວນຫນຶ່ງຂອງຄອບຄົວ Firefox. %s ຮຽນຮູ້ເພີ່ມເຕີມ diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index f6e80f612..054370f0d 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -385,8 +385,6 @@ تخصیص کرو - آپݨے فائرفوکس کھاتے نال کتاب نشانیاں، تاریخ تے ٻیا ٻہوں کجھ ہم وقت کرو - ٹیباں، نشانیاں، پاس ورڈ تے ٻیا ٻہوں کجھ ہم وقت کرݨ کیتے سائن ان تھیوو۔ فائرفوکس کھاتہ @@ -484,6 +482,8 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> فائر فوکس لوگو ــ وال پیپر وٹاؤ، بٹݨ + + کلاسیکل %s محدود ایڈیشن @@ -569,8 +569,6 @@ موزلّا کوں پڑھائی انسٹال کرݨ تے چلاوݨ دی اجازت ݙیندے - - ہم وقت کرݨ چالو کرو آپݨا ڈیٹا ہم وقت کرو تے محفوظ کرو @@ -791,8 +789,6 @@ تاریخ وچوں مٹاؤ %1$s (نجی موڈ) - - ٻئے ٹیباں @@ -1201,8 +1197,6 @@ نکل ون٘ڄو - - ایہ تہاݙا سارا براؤزنگ ڈیٹا مٹا ݙیسی۔ مٹاوݨ کیتے وقت دی حد diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 7985e4d0d..cf44098e7 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -65,11 +65,23 @@ Kerak emas + + + %1$sni ilovalarda avtomatik ravishda ochadigan qilib sozlashingiz mumkin. Sozlamalarni ochish Rad etish + + Rad qilish + + + + Bizning eng kuchli maxfiylik funksiyamiz saytlararo kuzatuvchilarni izolyatsiya qiladi. + + Umumiy Cookie himoyasi haqida batafsil + Kameradan foydalanish zarur. Android sozlamalariga oʻting, ruxsatnomalarga kiring va ruxsat berish tugmasini bosing. @@ -342,8 +354,6 @@ Moslash - Xatchoʻplar va tarix kabilarni Firefox hisobingiz bilan sinxronlang - Varaq va xatchoʻplarni sinxronlash uchun hisobingizga kiring. Firefox hisobi @@ -518,8 +528,6 @@ Mozillaga tadqiqotlarni oʻrnatish va ishga tushirish imkonini beradi - - Sinxronizatsiyani yoqish Maʼlumotlaringizni sinxronlang va saqlang diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a259ff7db..9e5147942 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -402,8 +402,6 @@ 定制 - 使用您的 Firefox 账户同步书签、历史记录等数据 - 登录后即可同步标签页、书签、密码等数据。 Firefox 账户 @@ -486,7 +484,7 @@ 壁纸:%1$s - 已更换壁纸! + 壁纸已更换! 查看 @@ -516,7 +514,7 @@ 试用新色彩 - 选择适合您的壁纸。 + 选择合您心意的壁纸。 探索更多壁纸 @@ -604,9 +602,6 @@ 允许 Mozilla 安装和运行研究 - - 开启同步 - 同步并保存您的数据 @@ -828,9 +823,6 @@ %1$s(隐私模式) - - 其他标签页 - 输入搜索词 @@ -1261,8 +1253,6 @@ 退出 - - 这将删除所有浏览数据。 要删除的时间范围 From e6680a4faab45fa9d0979e3d268bb7848a86e11b Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 24 Sep 2022 15:21:38 +0000 Subject: [PATCH 055/407] Update to Android-Components 107.0.20220924143230. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 53c218b87..13bb57d8f 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220923143109" + const val VERSION = "107.0.20220924143230" } From d2953901652622f3d70cfa32b6b9d61164b3367b Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 24 Sep 2022 19:20:55 +0000 Subject: [PATCH 056/407] Update to Android-Components 107.0.20220924190144. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 13bb57d8f..700ef72ad 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220924143230" + const val VERSION = "107.0.20220924190144" } From 4834f789e73de4034ce5b30e8b099f36657f5603 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sun, 25 Sep 2022 02:35:07 +0200 Subject: [PATCH 057/407] Import l10n. (#27157) --- app/src/main/res/values-kk/strings.xml | 89 ++++++++++++++---- app/src/main/res/values-kmr/strings.xml | 114 ++++++++++++++++-------- app/src/main/res/values-lo/strings.xml | 12 +++ app/src/main/res/values-skr/strings.xml | 11 +++ app/src/main/res/values-sl/strings.xml | 18 ++-- app/src/main/res/values-th/strings.xml | 44 ++++----- 6 files changed, 202 insertions(+), 86 deletions(-) diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 8e4246a3a..284b85820 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -77,6 +77,9 @@ Елемеу + + Cookie файлдарынан Толық қорғаныс туралы білу + Камера рұқсаты керек. Android баптауларына өтіп, Рұқсаттарды ашып, "Рұқсат ету" таңдаңыз. @@ -270,6 +273,16 @@ Сіздің жекелендірілген Firefox үй беті енді тоқтаған жерден жалғастыруды жеңілдетеді. Соңғы беттерді, бетбелгілерді және іздеу нәтижелерін табыңыз. + + Тәуелсіз интернетке қош келдіңіз + + Жекелігі көбірек интернетке қош келдіңіз + + Қосымша түстер. Жақсырақ жекелік. Табыстан гөрі адамдарға бірдей міндеттеме. + + Телефоннан ноутбукке және кері өтіңіз + + Экрандарды ауыстыру бұрынғыдан оңайырақ Бастау @@ -365,8 +378,6 @@ Баптау - Firefox тіркелгісімен бетбелгілер, шолу тарихы және т.б. синхрондау - Беттер, бетбелгілер, парольдерді синхрондау және т.б. үшін кіріңіз. Firefox тіркелгісі @@ -449,6 +460,14 @@ Түсқағаз жаңартылды! Қарап шығу + + Тұсқағазды жүктеп алу мүмкін болмады + + Қайтадан көру + + Тұсқағазды өзгерту мүмкін болмады + + Көбірек білу Firefox басты бетінің логотипін түрту арқылы тұсқағазды өзгертіңіз @@ -456,6 +475,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox логотипі - тұсқағазды, батырманы өзгерту + + Классикалық %s + + Шектеулі таралым + + Жаңа "Тәуелсіз дауыстар" топтамасы. %s + + Жаңа "Тәуелсіз дауыстар" топтамасы. + + Түстер шашырауын қолданып көріңіз + + Өз талғамыңызға сай тұсқағазды таңдаңыз. + + Қосымша тұсқағаздарды шолу + Қосымшаға қолдау жоқ @@ -535,8 +569,6 @@ Mozilla-ға зерттеулерді орнатуға және жүргізуге рұқсат ету - - Синхрондауды іске қосу Деректерді синхрондау және сақтау @@ -752,9 +784,6 @@ %1$s (жекелік режимі) - - Басқа беттер - Іздеу жолын енгізіңіз @@ -1159,8 +1188,6 @@ Шығу - - Бұл сіздің барлық шолу деректеріңізді өшіреді. Жойылатын деректер мерзімі @@ -1195,20 +1222,32 @@ - %s өніміне қош келдіңіз! + %s өніміне қош келдіңіз! + + Жақсырақ интернетке қош келдіңіз + + Табыс үшін емес, адамдар үшін жасалған браузер. - Firefox-ты құрылғылар арасында синхрондау + Firefox-ты құрылғылар арасында синхрондау + + Жұмысты қалдырған жерінен жалғастырыңыз - Осы құрылғыдағы %1$s ішіне бетбелгілер, шолу тарихын және парольдерді әкелу. + Осы құрылғыдағы %1$s ішіне бетбелгілер, шолу тарихын және парольдерді әкелу. - Тіркелу + Тіркелу + + Кіру Синхрондау іске қосулы - Үздіксіз құпиялылық + Үздіксіз құпиялылық + + Үнсіз келісім бойынша жекелікті қорғау - %1$s компанияларды интернетте сізді жасырын түрде бақылауын автоматты түрде тоқтатады. + %1$s компанияларды интернетте сізді жасырын түрде бақылауын автоматты түрде тоқтатады. + + Трекерлерге cookie файлдарын пайдаланып, сізді сайттар арасында бақылауға жол бермеу үшін Толық қорғанысты ұсынады. Стандартты (бастапқы) @@ -1220,15 +1259,23 @@ Құралдар панелінің орналасуын таңдау - Құралдар панелін қолжетімді жерге орнату. Оны төменгі жағында ұстаңыз немесе оны жоғарыға қарай жылжытыңыз. + Құралдар панелін қолжетімді жерге орнату. Оны төменгі жағында ұстаңыз немесе оны жоғарыға қарай жылжытыңыз. + + Оны төменгі жағында ұстаңыз немесе жоғарғы жағына жылжытыңыз. - Сіздің жекелігіңіз + Сіздің жекелігіңіз + + Өз деректеріңізді өзіңіз басқарасыз - Біз %s өнімін сіз желіде және бізбен немен бөлісетіңізді басқаруды өз қолыңызға беретіндей етіп жасадық. + Біз %s өнімін сіз желіде және бізбен немен бөлісетіңізді басқаруды өз қолыңызға беретіндей етіп жасадық. + + Firefox сіз желіде және бізбен немен бөлісетіңізді басқаруды өз қолыңызға береді. Біздің жекелік ескертуімізді оқыңыз + + Ғажайып интернетті ашуға дайынсыз ба? Шолуды бастау @@ -1319,6 +1366,8 @@ Барлық үшінші жақты cookies файлдары (веб-сайттар жұмысы бұзылуы мүмкін) Барлық cookies файлдары (веб-сайттар жұмысы бұзылады) + + Сайтаралық cookie файлдарын оқшаулау Бақылайтын құрама @@ -1342,8 +1391,12 @@ Әлеуметтік желілердің сіздің интернеттегі шолу әрекеттеріңізді бақылау мүмкіндігін шектейді. Сайтаралық бақылайтын cookie файлдары + + Сайтаралық cookie файлдары Көптеген сайттарда сіздің шолу деректерін жинақтау үшін жарнамалық желілер мен аналитикалық компаниялар пайдаланатын cookie файлдарын бұғаттайды. + + Cookie файлдарынан толық қорғау сіз шолып отырған сайттың cookie файлдарын оқшаулайды, сондықтан жарнамалық желілер сияқты трекерлер оларды сайттар арасында сізді бақылап отыру үшін пайдалана алмайды. Криптомайнерлер diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 5d5b62d21..cf81b9d18 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -39,8 +39,10 @@ - Bijareyên dawiyê + Bijareyên dawiyê + + Tomarbûnên dawî Hemû hilpekînên tomarkirî nîşan bide @@ -78,6 +80,9 @@ Bigire + + Li ser parastina xurekan a giştî agahî bistîne + Gihîna li kamerayê hewce ye. Here sazkariyên Androidê ji beşa destûran, destûrê bide. @@ -136,6 +141,8 @@ Hemû hilpekînên senkronîzekirî bibîne Alava senkronîzekirî + + Rake Rake @@ -252,25 +259,36 @@ - Tiştên nû yên %1$s`ê + Tiştên nû yên %1$s`ê - Niha hêsantir e ku vegerî ciyê lê mayî. + Niha hêsantir e ku vegerî ciyê lê mayî. - Serûpela %1$s `ê ya şexsîkirî + Serûpela %1$s `ê ya şexsîkirî - Here hilpekînên xwe yên vekirî, bijareyan û mêjûya lêgerînê. + Here hilpekînên xwe yên vekirî, bijareyan û mêjûya lêgerînê. - Hilpekînên serhevedayî + Hilpekînên serhevedayî - Bi pergala nû ya hilpekînan û hilpekînên xweber tên girtin tevliheviyê ji holê rakin. + Bi pergala nû ya hilpekînan û hilpekînên xweber tên girtin tevliheviyê ji holê rakin. - Lêgerînên dawiyê + Lêgerînên dawiyê - Vegere lêgerînên xwe yên dawiyê yên ji serûpel û hilpekînan. + Vegere lêgerînên xwe yên dawiyê yên ji serûpel û hilpekînan. - Serûpela te ya Firefoxê ya şexsîkirî niha hêsantir dike ku tu li ciyê lê mayî dewam bikî. Hilpekîn, bijare û encamên dawiyê yên lêgerînên xwe bibîne. + Serûpela te ya Firefoxê ya şexsîkirî niha hêsantir dike ku tu li ciyê lê mayî dewam bikî. Hilpekîn, bijare û encamên dawiyê yên lêgerînên xwe bibîne. + + + Tu bi xêr hatiyî înterneteke serbixwe + + Tu bi xêr hatiyî înterneteke kesanetir + + Dest pê bike + + Têkeve + + Derbas bike @@ -361,8 +379,6 @@ Taybet bike - Bi hesabê xwe yê Firefoxê favorî, raborî û zêdetirî wan senkronîze bike - Ji bo senkronîzekirina hilpekînan, bijareyan, şîfreyan û tiştên din têkevê. Hesabê Firefoxê @@ -445,11 +461,33 @@ Wêneyê dîwêr hat venûkirin! Nîşan bide + + Wêneyê dîwêr nehat daxistin + + Dîsa biceribîne + + Wêneyê dîwêr nehat guhertin + + Zêdetir bizane - Ji bo guhertina wêneyê dîwêr pêlî logoya Firefoxê ya serûpelê bike + Ji bo guhertina wêneyê dîwêr pêlî logoya Firefoxê ya serûpelê bike - Logoya Firefoxê - wêneyê dîwêr biguherîne, bişkok + Logoya Firefoxê - wêneyê dîwêr biguherîne, bişkok + + + Klasîk %s + + + Koleksiyana dengên serbixwe ya nû. %s + + Koleksiyana dengên serbixwe ya nû. + + Rengên cuda biceribîne + + Wêneyekî dîwêr ê ku bi te xweş e, hilbijêre. + + Zêdetir wêneyên dîwêr bibîne @@ -535,8 +573,6 @@ Destûrê bide Mozillayê ku lêkolînan saz bike û bimeşîne - - Sync’ê veke Senkronîze bike û daneyên xwe qeyd bike @@ -736,8 +772,6 @@ Menûya hilpekînên vekirî, veke Hilpekînan li koleksiyonê tomar bike - - Menûya hilpekînan Koleksiyonê jê bibe @@ -755,9 +789,6 @@ %1$s (Moda Veşartî) - - Hilpekînên din - Peyva lêgerînê binivîse @@ -788,16 +819,16 @@ Raborî tune - Ji alavên din hatiye senkronîzekirin + Ji alavên din hatiye senkronîzekirin - Ji alavên din + Ji alavên din - Têkevê da ku tu raboriya senkronîzekirî ya ji cîhazên xwe yên din bibînî. + Têkevê da ku tu raboriya senkronîzekirî ya ji cîhazên xwe yên din bibînî. - Têkeve + Têkeve - Yan jî hesabekî Firefoxê biafirîne ku dest bi senkronîzekirinê bikî]]> + Yan jî hesabekî Firefoxê biafirîne ku dest bi senkronîzekirinê bikî]]> @@ -1164,9 +1195,6 @@ Derkeve - - Ev ê hemû daneyên te yên gerînê jê bibe - Dema dê jê bê birin @@ -1202,19 +1230,25 @@ - Tu bi xêr hatî %s’ê! + Tu bi xêr hatî %s’ê! + + Tu bi xêr hatiyî înterneta baştir - Firefoxê di navbera amûran de senkronîze bike + Firefoxê di navbera amûran de senkronîze bike - Bijareyan, raboriyê û şîfreyan bîne nav %1$s`ê. + Bijareyan, raboriyê û şîfreyan bîne nav %1$s`ê. - Xwe tomar bike + Xwe tomar bike + + Têkeve Sync vekirî ye - Her car -nepen + Her car -nepen + + Parastina nihêniyê temî vekirî ye - %1$s bi awayekî xweber asteng dike ku şirket we li ser webê bi dizî bişopînin. + %1$s bi awayekî xweber asteng dike ku şirket we li ser webê bi dizî bişopînin. Standard (jixweber) @@ -1226,12 +1260,16 @@ Ciyê darikê amûran hilbijêre - Darikê amûran dayne ciyekê bi hêsanî bigihîjiyê. Dikarî wê li xwarê bihêlî yan jî bibî jorê. + Darikê amûran dayne ciyekê bi hêsanî bigihîjiyê. Dikarî wê li xwarê bihêlî yan jî bibî jorê. + + Li jêrê bihêle an jî bikişîne jorî. - Nihêniya te + Nihêniya te + + Kontrola daneyên te di destê te de ye - Me %s ji bo hindê çêkiriye ku derbarê tiştên tu li ser înternetê û tiştên bi me re parve dikî de kontrol di destê te de be. + Me %s ji bo hindê çêkiriye ku derbarê tiştên tu li ser înternetê û tiştên bi me re parve dikî de kontrol di destê te de be. Agahdariya me ya nihêniyê bixwîne diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 52726189e..0bd303b7b 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1397,6 +1397,10 @@ ຕົວຕິດຕາມເນື້ອຫາ + + ການປົກປ້ອງແມ່ນເປີດຢູ່ສຳລັບເວັບໄຊນີ້ + + ການປົກປ້ອງຖືກປິດໄວ້ສຳລັບເວັບໄຊນີ້ ເວັບໄຊທ ເມນູດີບັກ: ຄຣິກດ້ານຊ້າຍ %1$d ເພື່ອເປີດໃຊ້ງານ + ເປີດໃຊ້ເມນູດີບັກແລ້ວ + ສຳເນົາ @@ -1786,6 +1792,9 @@ ບໍ່ມີແທັບທີ່ເປີດຢູ່ + + + ຮອດຂີດຈຳກັດທາງລັດແລ້ວ ໂອເຄ, ເຂົ້າໃຈແລ້ວ @@ -1838,6 +1847,9 @@ ປິດ + + + ເລື່ອງທີ່ກະຕຸ້ນຄວາມຄິດ ເລື່ອງຕາມຫົວຂໍ້ diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 054370f0d..feeb291cf 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -279,6 +279,8 @@ آپݨے ذاتی تھئے مکھ پنّے نال ملو۔ حالیہ ٹیباں، نشانیاں تے ڳولݨ نتیجے اتھ ظاہر تھیسن۔ آزاد انٹرنیٹ وچ ست بسم اللہ + + ٻئے ذاتی انٹرنیٹ وچ ست بسم اللہ ٻئے رنگ۔ چنگی رازداری۔ نفعے کنوں ودھ لوکاں نال پریت پالݨ۔ @@ -472,8 +474,12 @@ نظارہ + + وال پیپر ڈاؤن لوڈ کائنی سڳا ولدا کوشش کرو + + وال پیپر کائنی وٹا سڳا ٻیا سِکھو @@ -487,6 +493,11 @@ محدود ایڈیشن + + آزاد آوازاں دا نواں مجموعہ۔ %s + + آزاد آوازاں دا نواں مجموعہ۔ + ایڈ ــ آن سہارا تھیا کائنی diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 1f4d20479..2ef43e9bd 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -394,8 +394,6 @@ Prilagodi - Sinhronizirajte zaznamke, gesla in ostalo s Firefox Računom - Prijavite se in sinhronizirajte zavihke, zaznamke, gesla in še kaj. Firefox Račun @@ -496,6 +494,8 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logtip Firefoxa – spremeni ozadje, gumb + + Klasični %s Omejena izdaja @@ -591,9 +591,6 @@ Dovoli Mozilli namestitev in izvajanje raziskav - - Vklopi Sync - Sinhronizirajte in shranite podatke @@ -815,9 +812,6 @@ %1$s (zasebni način) - - Ostali zavihki - Vnesite iskalni niz @@ -1227,8 +1221,6 @@ Izhod - - S tem boste izbrisali vse podatke brskanja. Časovni obseg brisanja @@ -1265,6 +1257,8 @@ Dobrodošli v %s! + + Dobrodošli v boljšem internetu Brskalnik, razvit za ljudi, ne za dobiček. @@ -1275,6 +1269,8 @@ Prinesite zaznamke, zgodovino in gesla v %1$s na tej napravi. Prijava + + Prijava Sync je vklopljen @@ -1295,6 +1291,8 @@ Izberite postavitev orodne vrstice Postavite si orodno vrstico na doseg roke. Naj bo na dnu ali pa jo premaknite na vrh. + + Naj bo na dnu ali pa jo premaknite na vrh. Vaša zasebnost diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 2e186a50c..5e77936d1 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -282,11 +282,11 @@ พบกับโฮมเพจส่วนบุคคลของคุณ แท็บล่าสุด ที่คั่นหน้า และผลการค้นหาจะปรากฏที่นี่ - ยินดีต้อนรับสู่อินเทอร์เน็ตที่เป็นอิสระ + ยินดีต้อนรับสู่อินเทอร์เน็ตที่เป็นอิสระ สีสันที่มากขึ้น ความเป็นส่วนตัวที่ดีขึ้น ให้ความมุ่งมั่นกับผู้คนมากกว่าผลกำไร - สับเปลี่ยนไปมาระหว่างโทรศัพท์กับแล็ปท็อป + สับเปลี่ยนไปมาระหว่างโทรศัพท์กับแล็ปท็อป เรียกดูต่อจากที่คุณค้างไว้ด้วยแท็บจากอุปกรณ์อื่นๆ บนหน้าแรกของคุณได้แล้วตอนนี้ @@ -388,8 +388,6 @@ ปรับแต่ง - ซิงค์ที่คั่นหน้า, ประวัติ, และอื่น ๆ ด้วยบัญชี Firefox ของคุณ - ลงชื่อเข้าเพื่อซิงค์แท็บ ที่คั่นหน้า รหัสผ่าน และอื่น ๆ ของคุณ บัญชี Firefox @@ -475,12 +473,19 @@ ดู + + ลองอีกครั้ง + + เรียนรู้เพิ่มเติม เปลี่ยนวอลเปเปอร์โดยแตะโลโก้หน้าแรกของ Firefox โลโก้ Firefox - เปลี่ยนวอลเปเปอร์, ปุ่ม + + เวลาจำกัด + ไม่รองรับส่วนเสริม @@ -561,8 +566,6 @@ อนุญาตให้ Mozilla ติดตั้งและเรียกใช้การศึกษา - - เปิด Sync ซิงค์และบันทึกข้อมูลของคุณ @@ -780,9 +783,6 @@ %1$s (โหมดส่วนตัว) - - แท็บอื่น ๆ - ป้อนคำค้นหา @@ -1186,8 +1186,6 @@ ออก - - การดำเนินการนี้จะเป็นการลบข้อมูลการเรียกดูทั้งหมดของคุณ ช่วงเวลาที่จะลบ @@ -1224,19 +1222,23 @@ - ยินดีต้อนรับสู่ %s! + ยินดีต้อนรับสู่ %s! - ซิงค์ Firefox ระหว่างอุปกรณ์ + ซิงค์ Firefox ระหว่างอุปกรณ์ - นำที่คั่นหน้า ประวัติ และรหัสผ่านไปยัง %1$s บนอุปกรณ์นี้ + นำที่คั่นหน้า ประวัติ และรหัสผ่านไปยัง %1$s บนอุปกรณ์นี้ - ลงทะเบียน + ลงทะเบียน + + เข้าสู่ระบบ Sync เปิดอยู่ - ความเป็นส่วนตัวตลอดเวลา + ความเป็นส่วนตัวตลอดเวลา + + การปกป้องความเป็นส่วนตัวตามค่าเริ่มต้น - %1$s จะหยุดบริษัทต่าง ๆ ไม่ให้ติดตามคุณอย่างลับ ๆ ขณะที่คุณท่องเว็บโดยอัตโนมัติ + %1$s จะหยุดบริษัทต่าง ๆ ไม่ให้ติดตามคุณอย่างลับ ๆ ขณะที่คุณท่องเว็บโดยอัตโนมัติ มาตรฐาน (ค่าเริ่มต้น) @@ -1248,12 +1250,14 @@ เลือกตำแหน่งแถบเครื่องมือของคุณ - วางแถบเครื่องมือไว้ใกล้ ๆ เก็บไว้ที่ด้านล่างหรือย้ายไปด้านบน + วางแถบเครื่องมือไว้ใกล้ ๆ เก็บไว้ที่ด้านล่างหรือย้ายไปด้านบน - ความเป็นส่วนตัวของคุณ + ความเป็นส่วนตัวของคุณ + + คุณควบคุมข้อมูลของคุณ - เราได้ออกแบบ %s เพื่อให้คุณสามารถควบคุมสิ่งที่คุณต้องการแบ่งปันออนไลน์และสิ่งที่คุณต้องการแบ่งปันกับเราได้ + เราได้ออกแบบ %s เพื่อให้คุณสามารถควบคุมสิ่งที่คุณต้องการแบ่งปันออนไลน์และสิ่งที่คุณต้องการแบ่งปันกับเราได้ อ่านประกาศความเป็นส่วนตัวของเรา From 96fc8e19d85d3a0b98b3625171228b563da1f018 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 25 Sep 2022 14:47:25 +0000 Subject: [PATCH 058/407] Update to Android-Components 107.0.20220925143143. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 700ef72ad..acf7b80bd 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220924190144" + const val VERSION = "107.0.20220925143143" } From 00f28939a1625681ef78d5f54891e05be32eab8b Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 26 Sep 2022 02:34:04 +0200 Subject: [PATCH 059/407] Import l10n. (#27165) --- app/src/main/res/values-kk/strings.xml | 12 ++++ app/src/main/res/values-lo/strings.xml | 11 ++++ app/src/main/res/values-ru/strings.xml | 81 +++++++++++++++++++------- app/src/main/res/values-sk/strings.xml | 11 +--- 4 files changed, 84 insertions(+), 31 deletions(-) diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 284b85820..744402d83 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -77,6 +77,9 @@ Елемеу + + + Біздің ең қуатты жекелік мүмкіндігіміз сайтаралық трекерлерді оқшаулайды. Cookie файлдарынан Толық қорғаныс туралы білу @@ -273,6 +276,8 @@ Сіздің жекелендірілген Firefox үй беті енді тоқтаған жерден жалғастыруды жеңілдетеді. Соңғы беттерді, бетбелгілерді және іздеу нәтижелерін табыңыз. + + Жекелендірілген басты бетпен танысыңыз. Мұнда соңғы беттер, бетбелгілер және іздеу нәтижелері көрсетілетін болады. Тәуелсіз интернетке қош келдіңіз @@ -283,6 +288,8 @@ Телефоннан ноутбукке және кері өтіңіз Экрандарды ауыстыру бұрынғыдан оңайырақ + + Енді басты бетте орналасқан басқа құрылғылардың беттері арқылы тоқтаған жерден жалғастырыңыз. Бастау @@ -290,6 +297,9 @@ Аттап кету + + Сіздің беттеріңіз синхрондалуда! Осында басқа құрылғыда тоқтаған жерден жалғастырыңыз. + Жаңа %1$s бетін ашу @@ -1233,6 +1243,8 @@ Жұмысты қалдырған жерінен жалғастырыңыз Осы құрылғыдағы %1$s ішіне бетбелгілер, шолу тарихын және парольдерді әкелу. + + Экранды оңай ауыстыру үшін беттер мен парольдерді құрылғылар арасында синхрондаңыз. Тіркелу diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 0bd303b7b..9b12e9797 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -487,6 +487,8 @@ ມີ​ຈໍາ​ນວນ​ຈໍາ​ກັດ + + ຄໍເລັກຊັນສຽງເອກະລາດໃໝ່. %s ຄໍເລັກຊັນສຽງເອກະລາດໃໝ່. @@ -1351,6 +1353,8 @@ ເລືອກຕົວຕິດຕາມ ແລະ ສະຄິບທີ່ຈະບັອກ. + + ສິ່ງທີ່ຖືກບລັອກໂດຍການປົກປ້ອງການຕິດຕາມແບບກຳນົດເອງ ຄຸກກີ້ @@ -1359,6 +1363,8 @@ ຄຸກກີ້ຈາກເວັບໄຊທທີ່ບໍ່ເຄີຍເຂົ້າໄປ + + ຄຸກກີ້ນອກທັງໝົດ(ອາດເຮັດໃຫ້ເວັບໄຊມີບັນຫາ) ຄຸກກີ້ທັງຫມົດ (ຈະສົ່ງຜົນໃຫ້ເວັບໄຊທບໍ່ສົມບູນ) @@ -1574,6 +1580,9 @@ ບັນທຶກ ແລະຕື່ມທີ່ຢູ່ອັດຕະໂນມັດ + + ລວມເອົາຂໍ້ມູນເຊັ່ນ: ຕົວເລກ, ອີເມວ ແລະທີ່ຢູ່ຈັດສົ່ງ + ເພີ່ມບັດ @@ -1829,6 +1838,8 @@ ປິດອັດຕະໂນມັດຫຼັງຈາກຫນຶ່ງເດືອນບໍ? + + Firefox ສາມາດປິດແຖບທີ່ທ່ານບໍ່ໄດ້ເບິ່ງໃນເດືອນທີ່ຜ່ານມາ. ເປີດປິດອັດຕະໂນມັດ diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 06c5be476..b96bad7ac 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -292,11 +292,15 @@ Познакомьтесь с настраиваемой домашней страницей. Здесь будут отображаться последние вкладки, закладки и результаты поиска. - Добро пожаловать в независимый интернет + Добро пожаловать в независимый интернет + + Добро пожаловать в более личный Интернет Больше красок. Лучшая приватность. Обязательство перед людьми, а не погоня за прибылью. - Переходите с телефона на ноутбук и обратно + Переходите с телефона на ноутбук и обратно + + Переключение экранов стало проще, чем когда-либо Продолжайте с того места, где вы остановились, с вкладками с других устройств, которые теперь находятся на вашей домашней странице. @@ -398,8 +402,6 @@ Персонализация - Синхронизируйте закладки, историю и многое другое с вашим Аккаунтом Firefox - Входить для синхронизации вкладок, закладок, паролей и многого другого. Аккаунт Firefox @@ -484,12 +486,35 @@ Обои обновлены! Просмотр + + Не удалось загрузить обои + + Попробовать снова + + Не удалось сменить обои + + Подробнее Меняйте обои, коснувшись логотипа домашней страницы Firefox Логотип Firefox - сменить обои, кнопка + + Классический %s + + Ограниченный выпуск + + Новая подборка «Независимые голоса». %s + + Новая подборка «Независимые голоса». + + Попробуйте всплеск цвета + + Выберите обои по своему вкусу. + + Просмотреть больше обоев + Дополнение не поддерживается @@ -572,9 +597,6 @@ Разрешить Mozilla устанавливать и запускать исследования - - Включить синхронизацию - Синхронизация и сохранение данных @@ -791,9 +813,6 @@ %1$s (Приватный просмотр) - - Другие вкладки - Введите поисковые запросы @@ -1220,8 +1239,6 @@ Выйти - - Это действие удалит все данные вашего веб-сёрфинга. Диапазон времени для удаления @@ -1257,19 +1274,33 @@ - Добро пожаловать в %s! + Добро пожаловать в %s! + + Добро пожаловать в лучший Интернет + + Браузер, созданный для людей, а не для прибыли. - Синхронизация Firefox между устройствами + Синхронизация Firefox между устройствами + + Начните с того места, на котором остановились - Перенесите закладки, историю и пароли в %1$s на этом устройстве. + Перенесите закладки, историю и пароли в %1$s на этом устройстве. + + Синхронизируйте вкладки и пароли между устройствами для бесшовного перехода между экранами. - Зарегистрироваться + Зарегистрироваться + + Войти Началась синхронизация - Постоянная приватность + Постоянная приватность + + Защита приватности по умолчанию - %1$s автоматически блокирует тайную слежку компаний за вами в Интернете. + %1$s автоматически блокирует тайную слежку компаний за вами в Интернете. + + Представляем полную защиту от кук, не позволяющую трекерам использовать куки для отслеживания вас на разных сайтах. Стандартная (по умолчанию) @@ -1281,16 +1312,24 @@ Выберите размещение панели инструментов - Обеспечьте удобный доступ к панели инструментов. Оставьте её внизу или переместите вверх. + Обеспечьте удобный доступ к панели инструментов. Оставьте её внизу или переместите вверх. + + Оставьте её внизу или переместите наверх. - Ваша приватность + Ваша приватность + + Вы контролируете свои данные - Мы создали %s, чтобы предоставить вам контроль над тем, чем вы делитесь — как в Интернете, так и с нами. + Мы создали %s, чтобы предоставить вам контроль над тем, чем вы делитесь — как в Интернете, так и с нами. + + Firefox даёт вам контроль над тем, чем вы делитесь — как в Интернете, так и с нами. Уведомление о конфиденциальности + + Готовы открыть для себя удивительный Интернет? Начать веб-сёрфинг diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 34fd17059..796ed45e5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -397,8 +397,6 @@ Prispôsobenie - S účtom Firefox môžete synchronizovať záložky, históriu prehliadania a omnoho viac - Prihláste sa a synchronizujte karty, záložky, heslá a ďalšie položky. Účet Firefox @@ -597,8 +595,6 @@ Umožní Mozille inštalovať a spúšťať štúdie - - Zapnúť synchronizáciu Synchronizácia a ukladanie údajov @@ -708,7 +704,7 @@ - Otváracia obrazovka + Úvodná obrazovka Domovská stránka @@ -815,9 +811,6 @@ %1$s (súkromné prehliadanie) - - Ostatné karty - Zadajte hľadaný výraz @@ -1225,8 +1218,6 @@ Ukončiť - - Vaše údaje o prehliadaní budú odstránené. Obdobie, za ktoré vymazať údaje From 5c9a7135122040c38148bd79651a453e93d9efa8 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Fri, 23 Sep 2022 15:45:46 -0700 Subject: [PATCH 060/407] For #27111: disable TCP in beta and release --- app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index e5b266c50..fa44b72b5 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -596,14 +596,14 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) val enabledTotalCookieProtection: Boolean - get() = mr2022Sections[Mr2022Section.TCP_FEATURE] == true + get() = mr2022Sections[Mr2022Section.TCP_FEATURE] == true && Config.channel.isNightlyOrDebug /** * Indicates if the total cookie protection CRF should be shown. */ var shouldShowTotalCookieProtectionCFR by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_should_show_total_cookie_protection_popup), - default = mr2022Sections[Mr2022Section.TCP_CFR] == true, + default = mr2022Sections[Mr2022Section.TCP_CFR] == true && Config.channel.isNightlyOrDebug, ) val blockCookiesSelectionInCustomTrackingProtection by stringPreference( From 7e796d1cdce740fa4248e9b75d79612455e5f607 Mon Sep 17 00:00:00 2001 From: sv-ohorvath <--global> Date: Mon, 26 Sep 2022 17:48:29 +0300 Subject: [PATCH 061/407] Issue #26711: re-enabled verifyPageMainMenuItemsTest --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index f12a2a08f..559a09bb4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -188,13 +188,13 @@ class SmokeTest { } // Verifies the list of items in a tab's 3 dot menu - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/26711") @Test fun verifyPageMainMenuItemsTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { + waitForPageToLoad() }.openThreeDotMenu { verifyPageThreeDotMainMenuItems() } From 1005412862ab4443a80e29f7ae8ac42acb17d748 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 26 Sep 2022 14:52:29 +0000 Subject: [PATCH 062/407] Update to Android-Components 107.0.20220926143208. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index acf7b80bd..ffadfd270 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220925143143" + const val VERSION = "107.0.20220926143208" } From d6883bc1f3f02de2489d50aec2d42d7b15915a6c Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Tue, 27 Sep 2022 02:37:50 +0200 Subject: [PATCH 063/407] Import l10n. (#27186) --- app/src/main/res/values-lo/strings.xml | 17 +++++ app/src/main/res/values-pa-rIN/strings.xml | 81 ++++++++++++++++------ app/src/main/res/values-zh-rTW/strings.xml | 12 +--- 3 files changed, 78 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 9b12e9797..96f9ec529 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -270,6 +270,8 @@ ເຂົ້າໄປເບິງຄືນຈາກການຄົ້ນຫາຫຼ້າສຸດໄດ້ໃນຫນ້າທຳອິດຂອງທ່ານ. + + ໜ້າຫຼັກ Firefox ທີ່ປັບແຕ່ງເປັນແບບສ່ວນຕົວຂອງທ່ານຕອນນີ້ເຮັດໃຫ້ມັນງ່າຍຂຶ້ນໃນການເລືອກບ່ອນທີ່ທ່ານປະໄວ້. ຊອກຫາແຖບ, ບຸກມາກ ແລະຜົນການຄົ້ນຫາຫຼ້າສຸດຂອງທ່ານ. ພົບກັບໜ້າຫຼັກທີ່ເປັນສ່ວນຕົວຂອງທ່ານ. ແຖບຫຼ້າສຸດ, ບຸກມາກ, ແລະຜົນການຊອກຫາຈະປາກົດຢູ່ບ່ອນນີ້. @@ -1268,9 +1270,13 @@ ຄວາມເປັນສ່ວນຕົວເປີດຕະຫຼອດ ການປົກປ້ອງຄວາມເປັນສ່ວນຕົວຖືກກຳນົດເປັນຄ່າເລີ່ມຕົ້ນ + + %1$s ຈະຢຸດບໍລິສັດບໍ່ໃຫ້ຕິດຕາມທ່ານຢ່າງລັບໆໃນທົ່ວເວັບ. ມາດຕະຖານ (ຄ່າພື້ນຖານ) + + ດຸ່ນດ່ຽງສໍາລັບຄວາມເປັນສ່ວນຕົວແລະການປະຕິບັດ. ໜ້າເວັບໂຫຼດຕາມປົກກະຕິ. ເຂັ້ມງວດ @@ -1398,6 +1404,8 @@ ຄຸກກີຂ້າມເວັບໄຊ ຕົວຂຸດຫລຽນດິຈິຕໍລ + + ປ້ອງກັນບໍ່ໃຫ້ສະຄຣິບທີ່ເປັນອັນຕະລາຍເຂົ້າເຖິງອຸປະກອນຂອງທ່ານເພື່ອຂຸດຄົ້ນສະກຸນເງິນດິຈິຕອນ. ລາຍນິ້ວມື @@ -1422,6 +1430,8 @@ ປ່ຽນເສັ້ນທາງຕິດຕາມ + + ລຶບ cookies ທີ່ຕັ້ງໄວ້ໂດຍການປ່ຽນເສັ້ນທາງໄປຫາເວັບໄຊທ໌ຕິດຕາມທີ່ຮູ້ຈັກ. ຮຽນຮູ້ເພີ່ມເຕີມ @@ -1759,6 +1769,8 @@ ຍົກເລີກ ທາງເລືອກການເຂົ້າສູ່ລະບົບ + + ຊ່ອງຂໍ້ຄວາມທີ່ສາມາດແກ້ໄຂໄດ້ສໍາລັບລະຫັດຜ່ານຂອງການເຂົ້າສູ່ລະບົບ. ບັນທຶກການປ່ຽນແປງໃນການເຂົ້າສູ່ລະບົບ. @@ -1801,6 +1813,11 @@ ບໍ່ມີແທັບທີ່ເປີດຢູ່ + + ຂະຫຍາຍກຸ່ມແຖບທີ່ຊິ້ງແລ້ວ + + ຫຍໍ້ກຸ່ມແຖບທີ່ຊິ້ງແລ້ວ + ຮອດຂີດຈຳກັດທາງລັດແລ້ວ diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 354fbbbb8..a1348ca48 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -289,11 +289,15 @@ ਤੁਹਾਡੇ ਆਪਣੇ ਬਣਾਏ ਮੁੱਖ-ਸਫ਼ੇ ਨੂੰ ਸਮਝੋ। ਸੱਜਰੀਆਂ ਟੈਬਾਂ, ਬੁੱਕਮਾਰਕ ਅਤੇ ਖੋਜ ਨਤੀਜੇ ਇੱਥੇ ਦਿਖਾਈ ਦੇਣਗੇ। - ਆਜ਼ਾਦ ਇੰਟਰਨੈੱਟ ਲਈ ਜੀ ਆਇਆਂ ਨੂੰ + ਆਜ਼ਾਦ ਇੰਟਰਨੈੱਟ ਲਈ ਜੀ ਆਇਆਂ ਨੂੰ + + ਵੱਧ ਨਿੱਜੀ ਇੰਟਰਨੈੱਟ ਲਈ ਜੀ ਆਇਆਂ ਨੂੰ ਵੱਧ ਰੰਗ। ਵੱਧ ਪਰਦੇਦਾਰੀ। ਫਾਇਦੇ ਨਾਲੋਂ ਲੋਕਾਂ ਨੂੰ ਪਹਿਲ ਦੇਣ ਦਾ ਉਹੀ ਵਾਅਦਾ। - ਫ਼ੋਨ ਤੋਂ ਲੈਪਟਾਪ ਉੱਤੇ ਜਾਓ ਤੇ ਵਾਪਸ ਆਓ + ਫ਼ੋਨ ਤੋਂ ਲੈਪਟਾਪ ਉੱਤੇ ਜਾਓ ਤੇ ਵਾਪਸ ਆਓ + + ਸਕਰੀਨਾਂ ਵਿਚਾਲੇ ਬਦਲਣਾ ਪਹਿਲਾਂ ਤੋਂ ਵੱਧ ਸੌਖਾਲਾ ਹੋਇਆ ਹੋਰ ਡਿਵਾਈਸਾਂ ਤੋਂ ਜਿੱਥੇ ਤੁਸੀਂ ਟੈਬਾਂ ਨੂੰ ਛੱਡਿਆ ਹੈ, ਉਥੋਂ ਹੀ ਹੁਣ ਆਪਣੀ ਮੁੱਖ ਸਕਰੀਨ ਤੋਂ ਲਵੋ। @@ -394,8 +398,6 @@ ਪਸੰਦੀਦਾ - ਆਪਣੇ ਫਾਇਰਫਾਕਸ ਖਾਤੇ ਨਾਲ ਬੁੱਕਮਾਰਕ, ਅਤੀਤ ਅਤੇ ਹੋਰ ਨੂੰ ਸਿੰਕ ਕਰੋ - ਟੈਬਾਂ, ਬੁੱਕਮਾਰਕਾਂ, ਪਾਸਵਰਡਾ ਤੇ ਹੋਰਾਂ ਨੂੰ ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ। ਫਾਇਰਫਾਕਸ ਖਾਤਾ @@ -482,6 +484,14 @@ ਵਾਲਪੇਪਰ ਅੱਪਡੇਟ ਕੀਤਾ! ਵੇਖੋ + + ਵਾਲਪੇਪਰ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ + + ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ + + ਵਾਲਪੇਪਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ + + ਹੋਰ ਜਾਣੋ Firefox ਮੁੱਖ-ਸਫ਼ੇ ਲੋਗੋ ਨੂੰ ਛੂਹ ਕੇ ਵਾਲਪੇਪਰ ਬਦਲੋ @@ -489,6 +499,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox ਲੋਗੋ - ਵਾਲਪੇਪਰ ,ਬਟਨ ਬਦਲੋ + + ਕਲਾਸਿਕ %s + + ਲਿਮਟਡ ਐਡੀਸ਼ਨ + + ਨਵਾਂ ਆਜ਼ਾਦ ਆਵਾਜਾਂ ਦਾ ਭੰਡਾਰ। %s + + ਨਵਾਂ ਆਜ਼ਾਦ ਆਵਾਜ਼ਾਂ ਦਾ ਭੰਡਾਰ ਹੈ। + + ਰੰਗ ਪਾ ਕੇ ਵੇਖੋ + + ਵਾਲਪੇਪਰ ਚੁਣੋ, ਜੋ ਤੁਹਾਡੇ ਰੰਗ ਵਿੱਚ ਢਲੇ ਹੋਣ। + + ਹੋਰ ਵਾਲਪੇਪਰ ਵੇਖੋ + ਐਡ-ਆਨ ਸਹਾਇਕ ਨਹੀਂ ਹੈ @@ -572,9 +597,6 @@ Mozilla ਨੂੰ ਅਧਿਐਨ ਇੰਸਟਾਲ ਕਰਨ ਤੇ ਚਲਾਉਣ ਦੇ ਇਜਾਜ਼ਤ ਦਿਓ - - ਸਿੰਕ ਚਾਲੂ ਹੈ - ਆਪਣਾ ਡਾਟਾ ਸਿੰਕ ਕਰੋ ਤੇ ਸੰਭਾਲੋ @@ -794,9 +816,6 @@ %1$s (ਪ੍ਰਾਈਵੇਟ ਮੋਡ) - - ਹੋਰ ਟੈਬਾਂ - ਖੋਜ ਸ਼ਬਦ ਦਿਓ @@ -1207,8 +1226,6 @@ ਬਾਹਰ - - ਇਹ ਤੁਹਾਡੇ ਬਰਾਊਜ਼ ਕਰਨ ਦੇ ਸਾਰੇ ਡਾਟੇ ਨੂੰ ਹਟਾਏਗਾ। ਹਟਾਉਣ ਲਈ ਸਮਾਂ ਹੱਦ @@ -1244,20 +1261,34 @@ - %s ਵਲੋਂ ਜੀ ਆਇਆਂ ਨੂੰ! + %s ਵਲੋਂ ਜੀ ਆਇਆਂ ਨੂੰ! + + ਬੇਹਤਰ ਇੰਟਰਨੈੱਟ ਲਈ ਜੀ ਆਇਆਂ ਨੂੰ + + ਲੋਕਾਂ ਲਈ, ਨਾ ਕਿ ਫਾਇਦੇ ਲਈ ਬਣਾਇਆ ਬਰਾਊਜ਼ਰ। - ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ Firefox ਸਿੰਕ ਕਰੋ + ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ Firefox ਸਿੰਕ ਕਰੋ + + ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ, ਉੱਥੋਂ ਸ਼ੁਰੂ ਕਰੋ - ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ %1$s ਵਿੱਚ ਬੁੱਕਮਾਰਕ, ਅਤੀਤ ਅਤੇ ਪਾਸਵਰਡ ਲਿਆਓ। + ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ %1$s ਵਿੱਚ ਬੁੱਕਮਾਰਕ, ਅਤੀਤ ਅਤੇ ਪਾਸਵਰਡ ਲਿਆਓ। + + ਸਹਿਜ ਨਾਲ ਸਕਰੀਨਾਂ ਬਦਲਣ ਵਾਸਤੇ ਵੱਖ-ਵੱਖ ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਟੈਬਾਂ ਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ। - ਸਾਈਨ ਅੱਪ ਕਰੋ + ਸਾਈਨ ਅੱਪ ਕਰੋ + + ਸਾਇਨ ਇਨ ਸਿੰਕ ਚਾਲੂ ਹੈ - ਪਰਦੇਦਾਰੀ ਹਮੇਸ਼ਾਂ ਚਾਲੂ + ਪਰਦੇਦਾਰੀ ਹਮੇਸ਼ਾਂ ਚਾਲੂ + + ਮੂਲ ਰੂਪ ਵਿੱਚ ਪਰਦੇਦਾਰੀ ਸੁਰੱਖਿਆ - ਤੁਹਾਡੇ ਵਲੋਂ ਵੈਬ ਵਰਤਣ ਦੇ ਦੌਰਾਨ ਕੰਪਨੀਆਂ ਨੂੰ ਚੋਰੀ-ਛੁਪੇ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਨ ਤੋਂ %1$s ਆਪਣੇ-ਆਪ ਰੋਕਦਾ ਹੈ। + ਤੁਹਾਡੇ ਵਲੋਂ ਵੈਬ ਵਰਤਣ ਦੇ ਦੌਰਾਨ ਕੰਪਨੀਆਂ ਨੂੰ ਚੋਰੀ-ਛੁਪੇ ਤੁਹਾਡਾ ਪਿੱਛਾ ਕਰਨ ਤੋਂ %1$s ਆਪਣੇ-ਆਪ ਰੋਕਦਾ ਹੈ। + + ਪੇਸ਼ ਕੀਤੀ ਪੂਰੀ ਕੂਕੀਜ਼ ਸੁਰੱਖਿਆ ਨਾਲ ਤੁਹਾਡੇ ਵਲੋਂ ਖੋਲ੍ਹੀਆਂ ਸਾਈਟਾਂ ਵਿਚਾਲੇ ਟਰੈਕਰਾਂ ਨੂੰ ਕੂਕੀਜ਼ ਵਰਤਣ ਤੋਂ ਰੋਕੋ। ਸਟੈਂਡਰਡ (ਮੂਲ) @@ -1269,16 +1300,24 @@ ਆਪਣੇ ਟੂਲਬਾਰ ਦੀ ਥਾਂ ਚੁਣੋ - ਸੌਖੀ ਪਹੁੰਚ ਲਈ ਟੂਲਬਾਰ ਨੂੰ ਰੱਖੋ। ਹੇਠਾਂ ਰੱਖੋ ਜਾਂ ਇਸ ਨੂੰ ਉੱਤੇ ਰੱਖੋ। + ਸੌਖੀ ਪਹੁੰਚ ਲਈ ਟੂਲਬਾਰ ਨੂੰ ਰੱਖੋ। ਹੇਠਾਂ ਰੱਖੋ ਜਾਂ ਇਸ ਨੂੰ ਉੱਤੇ ਰੱਖੋ। + + ਇਸ ਨੂੰ ਹੇਠਾਂ ਰੱਕੋ ਜਾਂ ਉੱਤੇ ਲੈ ਜਾਓ। - ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ + ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ + + ਆਪਣੇ ਡਾਟਾ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ - ਅਸੀਂ %s ਨੂੰ ਇੰਝ ਬਣਾਇਆ ਹੈ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਪੂਰਾ ਕੰਟਰੋਲ ਹੋਵੇ ਕਿ ਤੁਸੀਂ + ਅਸੀਂ %s ਨੂੰ ਇੰਝ ਬਣਾਇਆ ਹੈ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਪੂਰਾ ਕੰਟਰੋਲ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਆਨਲਾਈਨ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ ਅਤੇ ਸਾਡੇ ਨਾਲ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ। + + Firefox ਤੁਹਾਡੇ ਹੱਥ ਕੰਟਰੋਲ ਦਿੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਆਨਲਾਈਨ ਕੀ ਸਾਂਝਾ ਕਰਨਾ ਹੈ ਅਤੇ ਕੀ ਸਾਡੇ ਨਾਲ ਸਾਂਝਾ ਕਰਨਾ ਹੈ। ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਨੂੰ ਪੜ੍ਹੋ + + ਸ਼ਾਨਾਦਰ ਇੰਟਰਨੈੱਟ ਵਰਤਣ ਲਈ ਤਿਆਰ ਹੋ? ਬਰਾਊਜ਼ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੋ diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 01a5ace7c..dafae6f59 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -396,8 +396,6 @@ 自訂 - 使用您的 Firefox 帳號同步書籤、瀏覽紀錄等資料 - 登入後即可同步分頁、書籤、密碼與其他資料。 Firefox 帳號 @@ -502,7 +500,7 @@ 經典 %s - 限量版 + 期間限定 全新的獨立之聲系列。%s @@ -597,9 +595,6 @@ 允許 Mozilla 安裝執行使用者研究 - - 開啟 Sync - 同步並儲存您的資料 @@ -818,9 +813,6 @@ %1$s(隱私瀏覽模式) - - 其他分頁 - 輸入搜尋詞彙 @@ -1250,8 +1242,6 @@ 離開 - - 將刪除您的所有瀏覽資料。 要清除的時間範圍 From c7c5682104264ad1396fd0dc2852c0b9f9224b82 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Thu, 22 Sep 2022 17:11:28 +0300 Subject: [PATCH 064/407] For #26644 - Apply the new theme earlier to the private browsing button This will help avoid a race between the two layers of the svg, with previously only changing the color for just one. By applying the new theme to the button when needing to apply the textColor from wallpaper it will automatically use the right --- .../org/mozilla/fenix/home/HomeFragment.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f8e8ff240..7bdf82337 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -39,6 +39,7 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView.SmoothScroller +import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import com.google.android.material.appbar.AppBarLayout import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar @@ -993,7 +994,22 @@ class HomeFragment : Fragment() { } binding.wordmarkText.imageTintList = tintColor - binding.privateBrowsingButton.imageTintList = tintColor + + // Need to preemptively apply the new theme to the private browsing button drawable + // See https://github.com/mozilla-mobile/fenix/issues/26644#issuecomment-1254961616 + (activity as? HomeActivity)?.themeManager?.let { themeManager -> + with(binding.privateBrowsingButton) { + val drawable = VectorDrawableCompat.create( + resources, + R.drawable.private_browsing_button, + resources.newTheme().apply { + applyStyle(themeManager.currentThemeResource, true) + }, + ) + setImageDrawable(drawable) + imageTintList = tintColor + } + } } private fun observeWallpaperUpdates() { From 1a21d493902a36ad806d0b96b8cfb780c63d754c Mon Sep 17 00:00:00 2001 From: mcarare Date: Fri, 23 Sep 2022 17:19:30 +0300 Subject: [PATCH 065/407] For #27133: Specify type when retrieving resValues. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 00c679b9e..7ae95168e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -235,7 +235,7 @@ android.applicationVariants.all { variant -> // Generate version codes for builds // ------------------------------------------------------------------------------------------------- - def isDebug = variant.buildType.resValues['IS_DEBUG']?.value ?: false + def isDebug = variant.buildType.resValues['bool/IS_DEBUG']?.value ?: false def useReleaseVersioning = variant.buildType.buildConfigFields['USE_RELEASE_VERSIONING']?.value ?: false println("----------------------------------------------") From 66f16eeb69f7b7108f658c18a2b2112e69250ed1 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 20 Sep 2022 18:01:33 +0300 Subject: [PATCH 066/407] For #24978 re-enable verifyAboutFirefoxPreview UI test --- .../androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt index 11e141c99..796da1955 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt @@ -10,7 +10,6 @@ import androidx.test.uiautomator.UiSelector import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher @@ -85,10 +84,10 @@ class SettingsAboutTest { } } - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/25355") @Test fun verifyAboutFirefoxPreview() { featureSettingsHelper.setJumpBackCFREnabled(false) + featureSettingsHelper.setTCPCFREnabled(false) homeScreen { }.openThreeDotMenu { }.openSettings { From 6c2609ad58a1891f9b86fcde76f5158ff62d3538 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Tue, 27 Sep 2022 12:57:14 +0300 Subject: [PATCH 067/407] For #27111 - Allow TCP in all releases. Control it from Nimbus. After this change the TCP feature (and CFR) are enabled by default. Rollout can be controlled through Nimbus. --- app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index fa44b72b5..e5b266c50 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -596,14 +596,14 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) val enabledTotalCookieProtection: Boolean - get() = mr2022Sections[Mr2022Section.TCP_FEATURE] == true && Config.channel.isNightlyOrDebug + get() = mr2022Sections[Mr2022Section.TCP_FEATURE] == true /** * Indicates if the total cookie protection CRF should be shown. */ var shouldShowTotalCookieProtectionCFR by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_should_show_total_cookie_protection_popup), - default = mr2022Sections[Mr2022Section.TCP_CFR] == true && Config.channel.isNightlyOrDebug, + default = mr2022Sections[Mr2022Section.TCP_CFR] == true, ) val blockCookiesSelectionInCustomTrackingProtection by stringPreference( From c3a3cae99b75cb42fd05742038875e208a7d6802 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Tue, 27 Sep 2022 10:07:25 +0300 Subject: [PATCH 068/407] For #27172 - Enable the sync onboarding cfr in all releases --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index b0bf25526..c0ba705f7 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -26,7 +26,7 @@ object FeatureFlags { /** * Enables the onboarding sync CFR on the home screen. */ - val showSynCFR = Config.channel.isNightlyOrDebug + const val showSynCFR = true /** * Enables the onboarding jump back in CFR on the home screen. diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index e5b266c50..9980410c9 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1255,7 +1255,6 @@ class Settings(private val appContext: Context) : PreferencesHolder { /** * Indicates if sync onboarding CFR should be shown. - * Returns true if the [FeatureFlags.showSynCFR] and [R.string.pref_key_should_show_sync_cfr] are true. */ var showSyncCFR by lazyFeatureFlagPreference( appContext.getPreferenceKey(R.string.pref_key_should_show_sync_cfr), From 460008c7594deed6cca931d070d5e3cec9565dda Mon Sep 17 00:00:00 2001 From: Mugurell Date: Tue, 27 Sep 2022 10:08:13 +0300 Subject: [PATCH 069/407] For #27172 - Enable the home onboarding dialog in all releases --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index c0ba705f7..5f5f1b4f3 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -82,7 +82,7 @@ object FeatureFlags { /** * Enables showing the homescreen onboarding card. */ - val showHomeOnboarding = Config.channel.isNightlyOrDebug + const val showHomeOnboarding = true /** * Enables history improvement features. From 46c2a714f61477caa4b116f9baa80f020bb09dfa Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:42:55 +0300 Subject: [PATCH 070/407] For #24978 re-enable testStrictVisitDisableExceptionToggle UI test --- .../fenix/ui/StrictEnhancedTrackingProtectionTest.kt | 1 - .../java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt index 902f5d5ce..ea7a51e66 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt @@ -127,7 +127,6 @@ class StrictEnhancedTrackingProtectionTest { } } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun testStrictVisitDisableExceptionToggle() { val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index 57528dae2..4c0a4442b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -39,11 +39,11 @@ import org.hamcrest.CoreMatchers.anyOf import org.hamcrest.CoreMatchers.containsString import org.hamcrest.Matcher import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort -import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.clickAtLocationInView @@ -451,7 +451,7 @@ private fun tabMediaControlButton() = mDevice.findObject(UiSelector().resourceId("$packageName:id/play_pause_button")) private fun closeTabButton() = - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_tabstray_close")) + mDevice.findObject(UiSelector().descriptionContains("Close tab")) private fun assertCloseTabsButton(title: String) = assertTrue( From 67bd387e0d7924da3169ef629df142b8806c3dc8 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:44:14 +0300 Subject: [PATCH 071/407] For #24978 re-enable audioPlaybackSystemNotificationTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 559a09bb4..1c4ee29af 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -36,8 +36,8 @@ import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent import org.mozilla.fenix.helpers.TestHelper.generateRandomString -import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources +import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.customTabScreen @@ -815,7 +815,6 @@ class SmokeTest { } } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun audioPlaybackSystemNotificationTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) From 81fd5f2644c30348f68a88cc03c1ec0689a8df13 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:45:30 +0300 Subject: [PATCH 072/407] For #24978 re-enable homeThreeDotMenuItemsTest UI test --- .../java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt index b1a37eacb..01aaf0d93 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt @@ -7,11 +7,10 @@ package org.mozilla.fenix.ui import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test -import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.ui.robots.homeScreen @@ -24,13 +23,15 @@ class ThreeDotMenuMainTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. private lateinit var mockWebServer: MockWebServer + val featureSettingsHelper = FeatureSettingsHelper() @get:Rule val activityTestRule = HomeActivityTestRule() @Before fun setUp() { - activityTestRule.activity.applicationContext.settings().shouldShowJumpBackInCFR = false + featureSettingsHelper.setJumpBackCFREnabled(false) + featureSettingsHelper.setTCPCFREnabled(false) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() start() @@ -43,7 +44,6 @@ class ThreeDotMenuMainTest { } // Verifies the list of items in the homescreen's 3 dot main menu - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun homeThreeDotMenuItemsTest() { homeScreen { @@ -52,7 +52,8 @@ class ThreeDotMenuMainTest { verifyHistoryButton() verifyDownloadsButton() verifyAddOnsButton() - verifySyncSignInButton() + // Disabled step due to https://github.com/mozilla-mobile/fenix/issues/26788 + // verifySyncSignInButton() verifyDesktopSite() verifyWhatsNewButton() verifyHelpButton() From 397ffd555cda3bc3882290ef9d2c8d71ef149798 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:46:16 +0300 Subject: [PATCH 073/407] For #24978 re-enable verifyContextMixedVariations UI test --- .../androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index 96c357382..8a7bbeb41 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -215,7 +215,6 @@ class ContextMenusTest { } } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun verifyContextMixedVariations() { val pageLinks = From af36e279333a820f07ee6d66efc5eb01cf076c3b Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:46:55 +0300 Subject: [PATCH 074/407] For #24978 re-enable mainMenuOpenInAppTest UI test --- .../androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 1c4ee29af..999031ed9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -25,7 +25,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.Constants +import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource @@ -345,17 +345,16 @@ class SmokeTest { // Device or AVD requires a Google Services Android OS installation with Play Store installed // Verifies the Open in app button when an app is installed - @Ignore("Failing with frequent ANR: https://github.com/mozilla-mobile/fenix/issues/25926") @Test fun mainMenuOpenInAppTest() { - val playStoreUrl = "play.google.com/store/apps/details?id=org.mozilla.fenix" + val youtubeURL = "https://m.youtube.com/user/mozilla?cbrd=1" navigationToolbar { - }.enterURLAndEnterToBrowser(playStoreUrl.toUri()) { + }.enterURLAndEnterToBrowser(youtubeURL.toUri()) { verifyNotificationDotOnMainMenu() }.openThreeDotMenu { }.clickOpenInApp { - assertNativeAppOpens(Constants.PackageName.GOOGLE_PLAY_SERVICES, playStoreUrl) + assertNativeAppOpens(YOUTUBE_APP, youtubeURL) } } From 8a652fc06fcb092bb98fd17c3b7c46c8a48119e5 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 27 Sep 2022 16:51:29 +0300 Subject: [PATCH 075/407] For #24978 re-enable media notification UI tests --- .../mozilla/fenix/ui/MediaNotificationTest.kt | 6 +++--- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt index 2380e770c..abc644f0a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt @@ -11,11 +11,11 @@ import mozilla.components.concept.engine.mediasession.MediaSession import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper @@ -35,6 +35,7 @@ class MediaNotificationTest { private lateinit var mockWebServer: MockWebServer private lateinit var mDevice: UiDevice + val featureSettingsHelper = FeatureSettingsHelper() @get:Rule val activityTestRule = HomeActivityTestRule() @@ -55,6 +56,7 @@ class MediaNotificationTest { dispatcher = AndroidAssetDispatcher() start() } + featureSettingsHelper.setTCPCFREnabled(false) } @After @@ -62,7 +64,6 @@ class MediaNotificationTest { mockWebServer.shutdown() } - @Ignore("Failing with ANR: https://github.com/mozilla-mobile/fenix/issues/15754") @Test fun videoPlaybackSystemNotificationTest() { val videoTestPage = TestAssetHelper.getVideoPageAsset(mockWebServer) @@ -96,7 +97,6 @@ class MediaNotificationTest { mDevice.pressBack() } - @Ignore("Failing with frequent ANR: https://bugzilla.mozilla.org/show_bug.cgi?id=1764605") @Test fun mediaSystemNotificationInPrivateModeTest() { val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 3068a399a..bab7ef9ac 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -556,8 +556,22 @@ class BrowserRobot { } fun clickMediaPlayerPlayButton() { - mediaPlayerPlayButton().waitForExists(waitingTime) - mediaPlayerPlayButton().click() + for (i in 1..RETRY_COUNT) { + try { + mediaPlayerPlayButton().waitForExists(waitingTime) + mediaPlayerPlayButton().click() + + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { } + } + } + } } /** From 83c49cc050a5fdb7ebe67cf41c9f9303c9f88b00 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 27 Sep 2022 14:53:15 +0000 Subject: [PATCH 076/407] Update to Android-Components 107.0.20220927143145. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ffadfd270..393a3306b 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220926143208" + const val VERSION = "107.0.20220927143145" } From 6ebecfcaa776a7b021732c020b17110238ab2158 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 28 Sep 2022 02:34:50 +0200 Subject: [PATCH 077/407] Import l10n. (#27199) --- app/src/main/res/values-ast/strings.xml | 23 +++---- app/src/main/res/values-kab/strings.xml | 72 ++++++++++++++++------ app/src/main/res/values-lo/strings.xml | 6 ++ app/src/main/res/values-oc/strings.xml | 40 +++++++++--- app/src/main/res/values-pt-rPT/strings.xml | 47 ++++++++------ 5 files changed, 127 insertions(+), 61 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 62f3364dc..36d7c8d90 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -288,8 +288,6 @@ Personalización - Sincroniza los marcadores, l\'historial y muncho más cola to cuenta de Firefox - Anicia la sesión pa sincronizar les llingüetes, los marcadores, les contraseñes y muncho más. Cuenta de Firefox @@ -438,9 +436,6 @@ Permite a Mozilla qu\'instale o execute estudios - - Activación de Sync - Sincronización y guardáu de datos @@ -1019,9 +1014,6 @@ Colar - - Esto va desaniciar tolos datos de restolar. - %s va desaniciar los datos de restolar seleicionaos. @@ -1038,12 +1030,12 @@ - ¡Afáyate en %s! + ¡Afáyate en %s! La sincronización ta activada - Privacidá permanente + Privacidá permanente Estándar (por defeutu) @@ -1055,11 +1047,11 @@ Sitiu de la barra de ferramientes - La to privacidá + La to privacidá - Diseñemos %s pa date\'l control tocante a los que compartes + Diseñemos %s pa date\'l control tocante a los que compartes en llinia y con nós. Lleer el nuesu avisu de privacidá @@ -1499,7 +1491,9 @@ en llinia y con nós. Val, entendílo - + + Atayos + Nome Aceutar @@ -1510,6 +1504,9 @@ en llinia y con nós. Llingüetes inactives + + Firefox pue zarrar les llingüetes que nun visitesti demientres el mes pasáu. + Quitar diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 56a1805ec..b8316de02 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -286,11 +286,15 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Snirem asebtar-ik·im agejdan yettwasagnen. Accaren imaynuten, ticraḍ n yisebtar d yigmaḍ n unadi ad d-banen deg-s. - Ansuf ɣer internet ilelli + Ansuf ɣer internet ilelli + + Ansuf ɣer internet udmawan ugar Ugar n yiniten. Tudert tabaḍnit igerrzen ugar. Tuṭṭfa deg tbaḍnit n yimdanen mačči d anadi ɣef tedrimt. - Ɛeddi seg tiliɣri ɣer uselkim, neɣ seg uselkim ɣer tiliɣri + Ɛeddi seg tiliɣri ɣer uselkim, neɣ seg uselkim ɣer tiliɣri + + Abeddel seg ugdil ɣer wayeḍ fessus ugar ɣef wayen iɛeddan Kemmel seg wanda i tḥebseḍ s useqdec n waccaren ɣef yibenkan-nniḍen ara d-ibanen akka tura ɣef usebter-ik·im agejdan. @@ -392,8 +396,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Sagen - Mtawi ticraḍ n yisebtar, azray, awalen uffiren, akked waṭas-nniḍen s umiḍan n Firefox - Qqen ɣer waccaren yemtawan, ticraḍ n yisebtar, awalen uffiren d wugar n wayen-nniḍen. Amiḍan Firefox @@ -481,6 +483,14 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Wali + + Tegguma ad d-trader tugna n ugilal + + Ɛreḍ tikkelt-nniḍen + + Tegguma ad tbeddel tugna n ugilal + + Issin ugar Beddel tugna n ugilal s tira n ulugu n usebter agejdan n Firefox @@ -488,6 +498,21 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Alogo Firefox - beddel agilal, taqeffalt + + Aklasik %s + + Taẓrigt s talast + + Tafrant tamaynut n tuɣac tilelliyin. %s + + Tafrant tamaynut n tuɣac tilelliyin. + + Ɛreḍ aṛuccu n yini + + Fren tugna n ugilal ara yemmeslayen yid-k•m. + + Smiren ugar n tugniwin n ugilal + Azegrir ur yettusefrak ara @@ -570,8 +595,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Sireg Mozilla ad tesbedded sakin ad tseddu studies - - Rmed Synch Mtawi sakin sekles isefka-inek @@ -792,9 +815,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara %1$s (askar uslig) - - Accaren wiyaḍ - Sekcem awalen n unadi @@ -1204,8 +1224,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ffeɣ - - Aya ad yekkes meṛṛa isefka-ik n tunigin. Azilal ara tekkseḍ @@ -1240,19 +1258,27 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara - Ansuf ɣer %s! + Ansuf ɣer %s! + + Ansuf ɣer internet ifazen - Mtawi Firefox gar yibenkan + Mtawi Firefox gar yibenkan + + Kemmel seg wanida i tḥebseḍ - Awi-d ticraḍ n yisebtar, amazray, d wawalen uffiren ɣer %1$s deg yibenk-a. + Awi-d ticraḍ n yisebtar, amazray, d wawalen uffiren ɣer %1$s deg yibenk-a. - Jerred + Jerred + + Kcem Amtawi yermed - Tabaḍnit tezga tettwaḍmen + Tabaḍnit tezga tettwaḍmen + + Ammesten n tudert tabaḍnit s wudem amezwer - %1$s yessewḥal s wudem awurman tikebbaniyin ara ak-iḍefren deg web. + %1$s yessewḥal s wudem awurman tikebbaniyin ara ak-iḍefren deg web. Alugan (amezwer) @@ -1264,16 +1290,22 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Fren adig n ufeggag-ik·im n yifecka - Eǧǧ afeggag n yifecka ɣef wafus. Eǧǧ-it ddaw neɣ err-it d asawen. + Eǧǧ afeggag n yifecka ɣef wafus. Eǧǧ-it ddaw neɣ err-it d asawen. + + Eǧǧ-it ukessar neɣ err-it d asawen - Tabaḍnit inek/m + Tabaḍnit inek/m + + Ad tiliḍ d aɛessas ɣef yisefka-k - Nfeṣṣel %si w akken ad nerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid aked wayen tbeṭṭuḍ yid-neɣ. + Nfeṣṣel %si w akken ad nerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid aked wayen tbeṭṭuḍ yid-neɣ. Ɣer tasertit-nneɣ n tbaḍnit + + Twejdeḍ ad teldiḍ internet issedhacen? Bdu tunigin diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 96f9ec529..d44b9fd3e 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1282,6 +1282,10 @@ ເລືອກການຈັດວາງແຖບເຄື່ອງມືຂອງທ່ານ + + ວາງແຖບເຄື່ອງມືໃຫ້ເຂົ້າເຖິງໄດ້ງ່າຍ. ຮັກສາມັນຢູ່ລຸ່ມ, ຫຼືຍ້າຍມັນໄປເທິງ. + + ຮັກສາມັນຢູ່ລຸ່ມ, ຫຼືຍ້າຍມັນໄປເທິງ. ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ @@ -1769,6 +1773,8 @@ ຍົກເລີກ ທາງເລືອກການເຂົ້າສູ່ລະບົບ + + ຊ່ອງຂໍ້ຄວາມທີ່ສາມາດແກ້ໄຂໄດ້ສໍາລັບຊື່ຜູ້ໃຊ້ຂອງການເຂົ້າສູ່ລະບົບ. ຊ່ອງຂໍ້ຄວາມທີ່ສາມາດແກ້ໄຂໄດ້ສໍາລັບລະຫັດຜ່ານຂອງການເຂົ້າສູ່ລະບົບ. diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 95714c038..122985ba8 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -284,10 +284,14 @@ Fasètz coneissença amb vòstra pagina d’acuèlh personalizada. Onglets recents, marcapaginas e resultats de recèrca apreissaràn aicí. La benvenguda a Internet independent + + Benvengut dins un Internet mai personal Mai de colors. Melhora confidencialitat. Meteis engatjament per las personas abans lo profièch. Basculatz del mobil a l’ordenador e invèrsament + + Bascular d’ecran es mai facil que jamai Tornatz ont èretz amb los onglets d’autres aparelhs que figuran ara per la pagina d’acuèlh. @@ -389,8 +393,6 @@ Personalizacion - Sincronizatz los marcapaginas, l’istoric e encara mai amb vòstre compte Firefox. - Connectatz-vos per sincronizar onglets, marcapaginas, senhals e plan mai encara. Compte Firefox @@ -497,9 +499,18 @@ Edicion limitada + + La colleccion novèla de Voses independentas. %s + + La colleccion novèla de Voses independentas. Ensajatz de colors novèlas + + Causissètz un fons que vos representa. + + Exploratz mai de fonzes d’ecran + Lo modul complementari es pas pres en carga @@ -582,8 +593,6 @@ Permet a Mozilla d’installar e lançar estudis - - Activar la sincronizacion Sincronizar e enregistrar vòstras donadas @@ -804,9 +813,6 @@ %1$s (mòde privat) - - Autres dubèrts - Picatz de tèrmes de recèrca @@ -1220,8 +1226,6 @@ Sortir - - Aquò suprimirà totas las donadas de navegacion. Periòde de suprimir @@ -1259,8 +1263,14 @@ La benvenguda a %s ! + + Benvengut dins un Internet melhor + + Un navegador concebut per las gents, pas per far de profièches. Sincronizar Firefox entre vòstres aparelhs + + Tornatz ont èretz Importatz vòstres marcapaginas, vòstre istoric e vòstres senhals dins %1$s sus aqueste aparelh. @@ -1271,8 +1281,12 @@ Sincro. activada Confidencialitat totjorn renfortida + + Proteccion de la vida privada per defaut %1$s empacha automaticament las entrepresas de vos pistar secrètament pel web. + + Embarcant una proteccion totala contra los cookies per empachar los traçadors d’utilizar de cookies per vos pistar de site en site. Estandard (per defaut) @@ -1285,14 +1299,22 @@ Causissètz ont conhar la barra d’aisinas Plaçatz la barra d’aisinas a portada de man. Daissatz-la enbàs o ennaut. + + Gardatz-la enbàs o desplaçatz-la ennaut. Vòstra vida privada + + Contrarotlatz vòstras donadas Concebèrem %s per vos donar lo contraròtle de çò que partejatz en linha e çò que partejatz amb nosautres. + + Firefox vos dòna lo contraròtle de çò que partejatz en linha e çò que partejatz amb nosautres. Legissètz nòstra politica de confidencialitat + + A punt per descobrir un Internet de pas creire ? Començar de navegar diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 80e3cd34f..8e14d7607 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -80,6 +80,12 @@ Dispensar + + + A nossa funcionalidade de privacidade mais poderosa isola rastreadores inter-sites. + + Saber mais sobre a Proteção Total de Cookies + É necessário acesso à câmara. Aceda às definições do Android, toque em permissões e toque em permitir. @@ -274,6 +280,8 @@ A sua página inicial personalizada do Firefox faz com que agora seja mais simples continuar de onde parou. Encontre os seus separadores, marcadores e resultados de pesquisa recentes. + + Bem-vindo a uma internet mais pessoal Começar @@ -369,8 +377,6 @@ Personalizar - Sincronize marcadores, histórico e muito mais com a sua conta do Firefox - Inicie sessão para sincronizar os separadores, marcadores, palavras-passe e mais. Conta Firefox @@ -454,6 +460,10 @@ Fundo atualizado! Ver + + Tentar novamente + + Saber mais Altere o fundo ao tocar no logótipo da página principal do Firefox @@ -461,6 +471,9 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logótipo do Firefox - altere o fundo, botão + + Edição limitada + O extra não é suportado @@ -542,9 +555,6 @@ Permitir que a Mozilla instale e faça estudos - - Ligar Sync - Sincronizar e guardar os seus dados @@ -761,9 +771,6 @@ %1$s (modo privado) - - Outros separadores - Introduza os termos de pesquisa @@ -1169,8 +1176,6 @@ Sair - - Isto irá eliminar todos os seus dados de navegação. Intervalo de tempo a eliminar @@ -1205,21 +1210,25 @@ - Bem-vindo ao %s! + Bem-vindo ao %s! + + Bem-vindo a uma internet melhor - Sincronizar o Firefox entre dispositivos + Sincronizar o Firefox entre dispositivos - Traga os marcadores, histórico e palavras-passe para o %1$s neste dispositivo. + Traga os marcadores, histórico e palavras-passe para o %1$s neste dispositivo. - Registar + Registar + + Iniciar sessão A sincronização está ativada - Privacidade sempre ativa + Privacidade sempre ativa - O %1$s impede automaticamente que as empresas o sigam secretamente pela Internet. + O %1$s impede automaticamente que as empresas o sigam secretamente pela Internet. Padrão (predefinição) @@ -1231,12 +1240,12 @@ Escolha o posicionamento da barra de ferramentas - Facilite o acesso à barra de ferramentas. Mantenha a mesma na parte inferior ou mova-a para cima. + Facilite o acesso à barra de ferramentas. Mantenha a mesma na parte inferior ou mova-a para cima. - A sua privacidade + A sua privacidade - Nós desenhámos o %s para lhe dar mais controlo sobre o que partilha online e o que partilha connosco. + Nós desenhámos o %s para lhe dar mais controlo sobre o que partilha online e o que partilha connosco. Leia a nossa política de privacidade From 094c2f028f8d973e6be480570f004077af1eafb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Delphine=20Leb=C3=A9del?= Date: Thu, 22 Sep 2022 15:59:42 -0700 Subject: [PATCH 078/407] Added missing locales Also updated top section. This is for #26964 --- l10n-release.toml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/l10n-release.toml b/l10n-release.toml index 409f5ff29..80128ac0a 100644 --- a/l10n-release.toml +++ b/l10n-release.toml @@ -1,11 +1,13 @@ # Locales that should be present in release builds -# Locales that are at 70% or higher completion on https://pontoon.mozilla.org/projects/android-l10n/ +# Locales that are at 1% or higher completion on https://pontoon.mozilla.org/projects/firefox-for-android/ # should be in this list locales = [ "an", + "ann", "ar", "ast", "az", + "ban", "be", "bg", "bn", @@ -13,6 +15,7 @@ locales = [ "bs", "ca", "cak", + "ceb", "ckb", "co", "cs", @@ -43,6 +46,7 @@ locales = [ "gu-IN", "he", "hi-IN", + "hil", "hr", "hsb", "hu", @@ -61,13 +65,16 @@ locales = [ "lij", "lo", "lt", + "mix", "ml", "mr", "my", "nb-NO", + "ne-NP", "nl", "nn-NO", "oc", + "or", "pa-IN", "pl", "pt-BR", @@ -76,24 +83,32 @@ locales = [ "ro", "ru", "sat", + "si", "sk", + "skr", "sl", "sq", "sr", "su", "sv-SE", + "szl", "ta", "te", "tg", "th", "tl", + "tok", "tr", "trs", "tt", + "tzm", + "ug", "uk", "ur", + "uz", "vec", "vi", + "yo", "zh-CN", "zh-TW", ] From f0c4660851747d8bfd358358f3ac23217b2dd7de Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 28 Sep 2022 02:55:30 +0000 Subject: [PATCH 079/407] Update to Android-Components 107.0.20220928020045. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 393a3306b..bbeb041f0 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220927143145" + const val VERSION = "107.0.20220928020045" } From 19685170de8b4dff33b0728c2e706efe76b7dd34 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Fri, 23 Sep 2022 17:21:40 +0300 Subject: [PATCH 080/407] For #26424 - Handle special legacy wallpaper cases --- .../wallpapers/LegacyWallpaperMigration.kt | 35 +++++++++++- .../fenix/wallpapers/WallpapersUseCases.kt | 11 +++- .../LegacyWallpaperMigrationTest.kt | 55 +++++++++++++++++++ .../wallpapers/WallpapersUseCasesTest.kt | 4 +- 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt index a94352f44..3358b27a1 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt @@ -8,6 +8,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.utils.Settings +import org.mozilla.fenix.wallpapers.Wallpaper.Companion.amethystName +import org.mozilla.fenix.wallpapers.Wallpaper.Companion.beachVibeName +import org.mozilla.fenix.wallpapers.Wallpaper.Companion.ceruleanName +import org.mozilla.fenix.wallpapers.Wallpaper.Companion.sunriseName import java.io.File import java.io.IOException @@ -16,10 +20,12 @@ import java.io.IOException * * @property storageRootDirectory The top level app-local storage directory. * @property settings Used to update the color of the text shown above wallpapers. + * @property downloadWallpaper Function used to download assets for legacy drawable wallpapers. */ class LegacyWallpaperMigration( private val storageRootDirectory: File, private val settings: Settings, + private val downloadWallpaper: suspend (Wallpaper) -> Wallpaper.ImageFileState, ) { /** * Migrate the legacy wallpaper to the new path and delete the remaining legacy files. @@ -28,7 +34,22 @@ class LegacyWallpaperMigration( */ suspend fun migrateLegacyWallpaper( wallpaperName: String, - ) = withContext(Dispatchers.IO) { + ): String = withContext(Dispatchers.IO) { + // For the legacy wallpapers previously stored as drawables, + // attempt to download them at startup. + when (wallpaperName) { + ceruleanName, sunriseName, amethystName -> { + downloadWallpaper( + Wallpaper.Default.copy( + name = wallpaperName, + collection = Wallpaper.ClassicFirefoxCollection, + thumbnailFileState = Wallpaper.ImageFileState.Unavailable, + assetsFileState = Wallpaper.ImageFileState.Unavailable, + ), + ) + return@withContext wallpaperName + } + } val legacyPortraitFile = File(storageRootDirectory, "wallpapers/portrait/light/$wallpaperName.png") val legacyLandscapeFile = @@ -36,10 +57,16 @@ class LegacyWallpaperMigration( // If any of portrait or landscape files of the wallpaper are missing, then we shouldn't // migrate it if (!legacyLandscapeFile.exists() || !legacyPortraitFile.exists()) { - return@withContext + return@withContext wallpaperName + } + // The V2 name for the "beach-vibe" wallpaper is "beach-vibes". + val migratedWallpaperName = if (wallpaperName == beachVibeName) { + "beach-vibes" + } else { + wallpaperName } // Directory where the legacy wallpaper files should be migrated - val targetDirectory = "wallpapers/${wallpaperName.lowercase()}" + val targetDirectory = "wallpapers/" + migratedWallpaperName.lowercase() try { // Use the portrait file as thumbnail @@ -75,6 +102,8 @@ class LegacyWallpaperMigration( // Delete the remaining legacy files File(storageRootDirectory, "wallpapers/portrait").deleteRecursively() File(storageRootDirectory, "wallpapers/landscape").deleteRecursively() + + return@withContext migratedWallpaperName } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index d9a5b1ace..d5c104c7a 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -50,6 +50,7 @@ class WallpapersUseCases( val migrationHelper = LegacyWallpaperMigration( storageRootDirectory = storageRootDirectory, settings = context.settings(), + selectWallpaper::invoke, ) DefaultInitializeWallpaperUseCase( store = store, @@ -242,10 +243,14 @@ class WallpapersUseCases( Wallpaper.getCurrentWallpaperFromSettings(settings)?.let { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) } - val currentWallpaperName = withContext(Dispatchers.IO) { settings.currentWallpaperName } - if (settings.shouldMigrateLegacyWallpaper) { - migrationHelper.migrateLegacyWallpaper(currentWallpaperName) + val currentWallpaperName = if (settings.shouldMigrateLegacyWallpaper) { + val migratedWallpaperName = + migrationHelper.migrateLegacyWallpaper(settings.currentWallpaperName) + settings.currentWallpaperName = migratedWallpaperName settings.shouldMigrateLegacyWallpaper = false + migratedWallpaperName + } else { + settings.currentWallpaperName } val possibleWallpapers = metadataFetcher.downloadWallpaperList().filter { !it.isExpired() && it.isAvailableInLocale() diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigrationTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigrationTest.kt index 009adad60..b18eec88b 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigrationTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigrationTest.kt @@ -3,6 +3,7 @@ package org.mozilla.fenix.wallpapers import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before @@ -21,6 +22,7 @@ class LegacyWallpaperMigrationTest { val tempFolder = TemporaryFolder() private lateinit var settings: Settings private lateinit var wallpapersFolder: File + private lateinit var downloadWallpaper: (Wallpaper) -> Wallpaper.ImageFileState private lateinit var migrationHelper: LegacyWallpaperMigration private lateinit var portraitLightFolder: File private lateinit var portraitDarkFolder: File @@ -31,9 +33,11 @@ class LegacyWallpaperMigrationTest { fun setup() { wallpapersFolder = File(tempFolder.root, "wallpapers") settings = mockk(relaxed = true) + downloadWallpaper = mockk(relaxed = true) migrationHelper = LegacyWallpaperMigration( storageRootDirectory = tempFolder.root, settings = settings, + downloadWallpaper, ) } @@ -146,6 +150,57 @@ class LegacyWallpaperMigrationTest { } } + @Test + fun `WHEN the beach-vibe legacy wallpaper is migrated THEN the legacy wallpapers destination is beach-vibes`() = runTest { + val wallpaperName = Wallpaper.beachVibeName + + createAllLegacyFiles(wallpaperName) + + val migratedWallpaperName = migrationHelper.migrateLegacyWallpaper(wallpaperName) + + assertEquals("beach-vibes", migratedWallpaperName) + assertTrue(getAllFiles("beach-vibes").all { it.exists() }) + } + + @Test + fun `WHEN a drawable legacy wallpaper is migrated THEN the respective V2 wallpaper is downloaded`() = runTest { + var migratedWallpaperName = migrationHelper.migrateLegacyWallpaper(Wallpaper.ceruleanName) + + assertEquals(Wallpaper.ceruleanName, migratedWallpaperName) + verify { + downloadWallpaper( + withArg { + assertEquals(Wallpaper.ceruleanName, it.name) + assertEquals(Wallpaper.ClassicFirefoxCollection, it.collection) + }, + ) + } + + migratedWallpaperName = migrationHelper.migrateLegacyWallpaper(Wallpaper.sunriseName) + + assertEquals(Wallpaper.sunriseName, migratedWallpaperName) + verify { + downloadWallpaper( + withArg { + assertEquals(Wallpaper.sunriseName, it.name) + assertEquals(Wallpaper.ClassicFirefoxCollection, it.collection) + }, + ) + } + + migratedWallpaperName = migrationHelper.migrateLegacyWallpaper(Wallpaper.amethystName) + + assertEquals(Wallpaper.amethystName, migratedWallpaperName) + verify { + downloadWallpaper( + withArg { + assertEquals(Wallpaper.amethystName, it.name) + assertEquals(Wallpaper.ClassicFirefoxCollection, it.collection) + }, + ) + } + } + private fun createAllLegacyFiles(name: String) { if (!this::portraitLightFolder.isInitialized || !portraitLightFolder.exists()) { portraitLightFolder = tempFolder.newFolder("wallpapers", "portrait", "light") diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt index b2d84c080..b5bea55e4 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt @@ -50,9 +50,7 @@ class WallpapersUseCasesTest { private val mockLegacyFileManager = mockk { every { clean(any(), any()) } just runs } - private val mockMigrationHelper = mockk { - coEvery { migrateLegacyWallpaper(any()) } just runs - } + private val mockMigrationHelper = mockk(relaxed = true) private val mockMetadataFetcher = mockk() private val mockDownloader = mockk { From 7abfb5728c766ea18fed22024bd348dbd6842378 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 28 Sep 2022 15:22:23 +0000 Subject: [PATCH 081/407] Update to Android-Components 107.0.20220928143130. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index bbeb041f0..eb0090814 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220928020045" + const val VERSION = "107.0.20220928143130" } From d30ca3d57a3dadc95f0d83d52dbed105798925d5 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 29 Sep 2022 02:35:02 +0200 Subject: [PATCH 082/407] Import l10n. (#27211) --- app/src/main/res/values-be/strings.xml | 14 ++----- app/src/main/res/values-br/strings.xml | 49 +++++++++++-------------- app/src/main/res/values-lo/strings.xml | 18 +++++++++ app/src/main/res/values-skr/strings.xml | 29 ++++++++++++++- 4 files changed, 71 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 911980de2..b3e645a30 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -388,8 +388,6 @@ Уладкаванне - - Сінхранізуйце закладкі, гісторыю і шмат іншага з уліковым запісам Firefox Увайсці, каб сінхранізаваць карткі, закладкі, паролі і іншае. @@ -586,9 +584,6 @@ Дазволіць Mozilla ўсталёўваць і запускаць даследаванні - - Уключыць сінхранізацыю - Сінхранізацыя і захаванне вашых дадзеных @@ -807,9 +802,6 @@ %1$s (Прыватны рэжым) - - Іншыя карткі - Увядзіце пошукавыя запыты @@ -1224,8 +1216,6 @@ Выйсці - - Гэта выдаліць усе дадзеныя вашага аглядання. Дыяпазон часу для выдалення @@ -1287,6 +1277,8 @@ Прадвызначаная ахова прыватнасці %1$s аўтаматычна спыняе таемнае сачэнне кампаній за вамі ў Інтэрнэце. + + Поўная ахова кукаў перашкаджае трэкерам выкарыстоўваць файлы кукі для сачэння за вамі на розных сайтах. Стандартная (прадвызначана) @@ -1299,6 +1291,8 @@ Выберыце размяшчэнне панэлі інструментаў Майце панэль інструментаў пад рукой. Пакіньце яе ўнізе або перамясціце ўверх. + + Пакіньце яе ўнізе або перамясціце наверх. Ваша прыватнасць diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 2ba019c66..e124f178d 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -38,7 +38,7 @@ - Sinedoù nevez + Sinedoù nevez Diskouez an holl sinedoù enrollet @@ -244,25 +244,25 @@ - Petra zo nevez e %1$s + Petra zo nevez e %1$s - Aesoc’h eo adstagañ lec’h m’ho peus paouezet. + Aesoc’h eo adstagañ lec’h m’ho peus paouezet. - Pajenn degemer %1$s personelaet + Pajenn degemer %1$s personelaet - Mont d’hoc’h ivinelloù digor, sinedoù ha roll istor merdeiñ. + Mont d’hoc’h ivinelloù digor, sinedoù ha roll istor merdeiñ. - Ivinelloù naet ha renket mat + Ivinelloù naet ha renket mat - Tennañ an ivinelloù diezhomm gant an aozadur gwellaet hag an ivinelloù a serr o-unan. + Tennañ an ivinelloù diezhomm gant an aozadur gwellaet hag an ivinelloù a serr o-unan. - Klaskoù nevesañ + Klaskoù nevesañ - Adweladennit ho klaskoù nevesañ diwar ho pajenn degemer hag ivinelloù. + Adweladennit ho klaskoù nevesañ diwar ho pajenn degemer hag ivinelloù. - Gant ho pajenn Firefox personelaet eo aesoc’h da adstagañ lec’h m’ho peus paouezet. Klaskit e-touez hoc’h ivinelloù nevez, sinedoù ha disoc’hoù enklask. + Gant ho pajenn Firefox personelaet eo aesoc’h da adstagañ lec’h m’ho peus paouezet. Klaskit e-touez hoc’h ivinelloù nevez, sinedoù ha disoc’hoù enklask. @@ -351,8 +351,6 @@ Personelaat - Goubredit sinedoù, ar roll istor, ha muiocʼh cʼhoazh gant ho kont Firefox - Kennaskit evit goubredañ an ivinelloù, sinedoù, gerioù-tremen ha muioc’h c’hoazh. Kont Firefox @@ -525,8 +523,6 @@ Aotren Mozilla da staliañ ha da luskañ studioù - - Gweredekaat Sync Goubredañ hag enrollañ ho roadennoù @@ -741,9 +737,6 @@ %1$s (Mod prevez) - - Ivinelloù all - Enankit gerioù da glask @@ -1146,8 +1139,6 @@ Kuitaat - - Dilemel a raio ho holl roadennoù merdeiñ. Hiziv ha dec’h @@ -1176,19 +1167,19 @@ - Donemat war %s! + Donemat war %s! - Goubredañ Firefox etre an trevnadoù + Goubredañ Firefox etre an trevnadoù - Degasit sinedoù, ur roll-istor ha gerioù-tremen evit %1$s war an trevnad-mañ. + Degasit sinedoù, ur roll-istor ha gerioù-tremen evit %1$s war an trevnad-mañ. - En em rollañ + En em rollañ Enaouet eo Sync - Prevezded gweredekaet bepred + Prevezded gweredekaet bepred - %1$s a harz en un doare emgefreek ouzh an embregerezhioù d’ho heuliañ dre guzh war ar web. + %1$s a harz en un doare emgefreek ouzh an embregerezhioù d’ho heuliañ dre guzh war ar web. Skoueriek (dre ziouer) @@ -1200,12 +1191,12 @@ Dibabit e pelec’h lakaat ho parrenn ostilhoù - Lakait ar varrenn ostilhoù en ul lec’h aes da dizhout. Dalc’hit hi en traoñ pe diblasit anezhi e-krec’h. + Lakait ar varrenn ostilhoù en ul lec’h aes da dizhout. Dalc’hit hi en traoñ pe diblasit anezhi e-krec’h. - Ho puhez prevez + Ho puhez prevez - Savet hon eus %s evit ma c’hallfec’h reoliñ ar pezh a rannit enlinenn hag ar pezh a rannit ganeomp. + Savet hon eus %s evit ma c’hallfec’h reoliñ ar pezh a rannit enlinenn hag ar pezh a rannit ganeomp. Lennit hon evezhiadenn a-get buhez prevez @@ -1247,6 +1238,8 @@ Ober gant ur chomlec’h postel kentoc’h Krouit unan evit goubredañ Firefox etre an trevnadoù.]]> + + %s a baouezo da c’houbredañ gant ho kont, met ne vo ket dilamet ho roadennoù merdeiñ war an trevnad-mañ. Digennaskañ diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index d44b9fd3e..9166914f7 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -362,6 +362,8 @@ ເວັບໄຊທທີ່ປອດໄພຍັງບໍ່ພ້ອມໃຫ້ໃຊ້ງານ ອາກເປັນໄປໄດ້, ເວັບໄຊທ໌ບໍ່ສະຫນັບສະຫນູນ HTTPS. + + ຢ່າງໃດກໍ່ຕາມ, ມັນກໍ່ເປັນໄປໄດ້ວ່າຜູ້ໂຈມຕີມີສ່ວນຮ່ວມ. ຖ້າທ່ານສືບຕໍ່ໄປຫາເວັບໄຊທ໌, ທ່ານບໍ່ຄວນໃສ່ຂໍ້ມູນລະອຽດອ່ອນໃດໆ. ຖ້າທ່ານສືບຕໍ່, ໂໝດ HTTPS-Only ຈະຖືກປິດໄວ້ຊົ່ວຄາວສໍາລັບເວັບໄຊທ໌. ສິ່ງອຳນວຍຄວາມສະດວກ @@ -1021,6 +1023,8 @@ ການສະສົມ ເມນູການສະສົມ + + ເກັບກຳສິ່ງທີ່ສຳຄັນກັບທ່ານ.\nຈັດກຸ່ມການຄົ້ນຫາທີ່ຄ້າຍຄືກັນ, ເວັບໄຊ ແລະແຖບຕ່າງໆເພື່ອເຂົ້າເຖິງໄດ້ໄວໃນພາຍຫຼັງ. ເລືອກແທັບ @@ -1259,6 +1263,10 @@ Sync Firefox ລະຫວ່າງອຸປະກອນ ຮັບເອົາຈາກບ່ອນທີ່ທ່ານໄດ້ປະເອົາໄວ້. + + ເອົາບຸກມາກ, ປະຫວັດ, ແລະລະຫັດຜ່ານໄປຫາ %1$s ໃນອຸປະກອນນີ້. + + ຊິ້ງແຖບ ແລະລະຫັດຜ່ານໃນທົ່ວອຸປະກອນສຳລັບການສະຫຼັບໜ້າຈໍແບບບໍ່ມີຮອຍຕໍ່. ລົງ​ທະ​ບຽນ @@ -1272,6 +1280,8 @@ ການປົກປ້ອງຄວາມເປັນສ່ວນຕົວຖືກກຳນົດເປັນຄ່າເລີ່ມຕົ້ນ %1$s ຈະຢຸດບໍລິສັດບໍ່ໃຫ້ຕິດຕາມທ່ານຢ່າງລັບໆໃນທົ່ວເວັບ. + + ມີການປົກປ້ອງຄຸກກີທັງໝົດເພື່ອຢຸດຜູ້ຕິດຕາມຈາກການໃຊ້ຄຸກກີເພື່ອຕິດຕາມທ່ານໃນທົ່ວເວັບໄຊ. ມາດຕະຖານ (ຄ່າພື້ນຖານ) @@ -1290,6 +1300,8 @@ ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ ທ່ານຄວບຄຸມຂໍ້ມູນຂອງທ່ານ + + Firefox ໃຫ້ທ່ານຄວບຄຸມສິ່ງທີ່ທ່ານແບ່ງປັນອອນໄລນ໌ ແລະສິ່ງທີ່ທ່ານແບ່ງປັນກັບພວກເຮົາ. ອ່ານນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງພວກເຮົາ @@ -1751,8 +1763,14 @@ ການເຊື່ອມຕໍ່ບໍ່ປອດໄພ ລຶບລ້າງຄຸກກີ້ ແລະຂໍ້ມູນເວັບໄຊ + + ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບລ້າງການອະນຸຍາດທັງໝົດສຳລັບເວັບໄຊນີ້? + + ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບລ້າງການອະນຸຍາດສໍາລັບເວັບໄຊທ໌ນີ້? ບໍ່ມີຂໍ້ຍົກເວັ້ນໃນເວັບໄຊທ໌ + + ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບບຸກມາກນີ້ອອກ? ເພີ່ມທາງລັດ diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index feeb291cf..e0fd0f3c6 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -498,6 +498,13 @@ آزاد آوازاں دا نواں مجموعہ۔ + + رنگ دا تُرکا ازماؤ + + ہک وال پیپر چُݨو جہڑا تہاݙے نال الاوے۔ + + ٻئے وال پیپر پھلورو + ایڈ ــ آن سہارا تھیا کائنی @@ -1246,10 +1253,18 @@ %s وچ ست بسم اللہ! + + بہترین انٹرنیٹ وچ ست بسم اللہ + + لوکاں کیتے بݨا ہویا براؤزر، نہ کہ منافع کیتے۔ ڈیوائساں دے درمیان فائرفوکس ہم وقت کرو + + جتھوں تساں چھوڑیا ہائی، اُتھوں شروع کرو ایں ڈیوائس تے کتاب نشانیاں، تاریخ تے پاس ورڈ %1$s تے گھن آؤ۔ + + ہموار سکرین سوئچنگ کیتے سارے ڈیوائساں تے ٹیباں تے پاس ورڈاں کوں ہم وقت کرو۔ سائن اپ @@ -1259,8 +1274,12 @@ ہم وقت کرݨ چالو ہے ہمیشہ رازداری تے + + ڈیفالٹ نال رازدای حفاظت %1$s خودکار طور تے کمپنیاں کوں ویب تے تہاکوں خفیہ فالو کرݨ کنوں روکیندے۔ + + ٹریکراں کوں تہاکوں ساریاں سائٹاں وچ پیچھا کرݨ آلیاں کوکیاں ورتݨ کنوں روکݨ کیتے مکمل کوکی حفاظت دی خصوصیت معیاری (پہلے کنوں مقرر) @@ -1273,15 +1292,23 @@ آپݨے ٹول بار دی جاء چُݨو ٹول بار کوں سوکھی پہنچ آلی جاء تے رکھو۔ ایں کوں تل وچ رکھو یا چوٹی تے گھن ون٘ڄو۔ + + ایں کوں تل وچ رکھو، یا اُتے گھن ون٘ڄو۔ تہاݙی رازداری + + تساں آپݨے ڈیٹا کوں کنٹرول کریندے ہو - تساں جہڑی شئے تساں ساکوں شیئر کرو یا آن لائن شیئر کریندے ہو اوں کوں تہاݙے ڳاٻو وچ ݙیوݨ سانگے اساں %s کوں بݨایا ہے۔ + تساں جہڑی شئے تساں ساکوں شیئر کرو یا آن لائن شیئر کریندے ہو اوں کوں تہاݙے قاٻو وچ ݙیوݨ سانگے اساں %s کوں بݨایا ہے۔ + + تساں جہڑی شئے تساں ساکوں شیئر کرو یا آن لائن شیئر کریندے ہو فائرفوکس اوں کوں تہاݙے قاٻو وچ ݙیندی ہے۔ ساݙا رازداری نوٹس پڑھو + + بھلا تساں ہک حیران کن انٹرنیٹ کھولݨ کیتے تیار ہو؟ براؤزنگ شروع کرو From 189b22fb69922d7e52dc89bb82c791e795c2fef5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 29 Sep 2022 15:02:44 +0000 Subject: [PATCH 083/407] Update to Android-Components 107.0.20220929143100. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index eb0090814..2331c1abc 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220928143130" + const val VERSION = "107.0.20220929143100" } From 521f1485e6adbd46a1acc764b5003054851b80bf Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Tue, 27 Sep 2022 13:28:57 -0700 Subject: [PATCH 084/407] For #27127: do not display wallpaper onboarding in private browsing mode --- .../SessionControlController.kt | 26 ++++++++++-------- .../DefaultSessionControlControllerTest.kt | 27 +++++++++++++++---- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 5850cfc4c..6ff7d30fe 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -510,17 +510,21 @@ class DefaultSessionControlController( } override fun handleShowWallpapersOnboardingDialog(state: WallpaperState): Boolean { - return state.availableWallpapers.filter { wallpaper -> - wallpaper.thumbnailFileState == Wallpaper.ImageFileState.Downloaded - }.size.let { downloadedCount -> - // We only display the dialog if enough thumbnails have been downloaded for it. - downloadedCount >= THUMBNAILS_SELECTION_COUNT - }.also { showOnboarding -> - if (showOnboarding) { - navController.nav( - R.id.homeFragment, - HomeFragmentDirections.actionGlobalWallpaperOnboardingDialog(), - ) + return if (activity.browsingModeManager.mode.isPrivate) { + false + } else { + state.availableWallpapers.filter { wallpaper -> + wallpaper.thumbnailFileState == Wallpaper.ImageFileState.Downloaded + }.size.let { downloadedCount -> + // We only display the dialog if enough thumbnails have been downloaded for it. + downloadedCount >= THUMBNAILS_SELECTION_COUNT + }.also { showOnboarding -> + if (showOnboarding) { + navController.nav( + R.id.homeFragment, + HomeFragmentDirections.actionGlobalWallpaperOnboardingDialog(), + ) + } } } } diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 676d17897..5255535bf 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -889,7 +889,7 @@ class DefaultSessionControlControllerTest { false, ), ) - assert(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + assertTrue(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) } @Test @@ -900,7 +900,7 @@ class DefaultSessionControlControllerTest { false, ), ) - assert(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + assertTrue(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) } @Test @@ -911,7 +911,7 @@ class DefaultSessionControlControllerTest { true, ), ) - assert(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + assertTrue(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) } @Test @@ -922,7 +922,7 @@ class DefaultSessionControlControllerTest { false, ), ) - assert(!createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + assertFalse(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) } @Test @@ -933,7 +933,24 @@ class DefaultSessionControlControllerTest { true, ), ) - assert(!createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + assertFalse(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) + } + + @Test + fun `GIVEN app is in private browsing mode WHEN handling wallpaper dialog THEN the dialog is not shown`() { + every { activity.browsingModeManager } returns mockk { + every { mode } returns mockk { + every { isPrivate } returns true + } + } + val wallpaperState = WallpaperState.default.copy( + availableWallpapers = makeFakeRemoteWallpapers( + THUMBNAILS_SELECTION_COUNT, + true, + ), + ) + + assertFalse(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) } @Test From f58442d3c5f84ab53bc2d2dfeead17f32bc42dae Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 28 Sep 2022 14:44:28 +0300 Subject: [PATCH 085/407] For #26087 re-enable UI tests affected by tabs tray migration to compose --- .../java/org/mozilla/fenix/ui/BookmarksTest.kt | 3 --- .../java/org/mozilla/fenix/ui/ContextMenusTest.kt | 3 --- .../androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt | 6 +----- .../java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt | 2 -- .../androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 9 +++------ .../fenix/ui/StrictEnhancedTrackingProtectionTest.kt | 3 --- .../java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt | 4 ---- .../java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt | 5 ++--- 8 files changed, 6 insertions(+), 29 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index e0c6f9fa5..730e2019e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -13,7 +13,6 @@ import mozilla.appservices.places.BookmarkRoot import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -354,7 +353,6 @@ class BookmarksTest { @SmokeTest @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openSelectionInNewTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -384,7 +382,6 @@ class BookmarksTest { @SmokeTest @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openSelectionInPrivateTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index 8a7bbeb41..8209dae7b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -9,7 +9,6 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -70,7 +69,6 @@ class ContextMenusTest { @SmokeTest @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun verifyContextOpenLinkNewTab() { val pageLinks = TestAssetHelper.getGenericAsset(mockWebServer, 4) @@ -95,7 +93,6 @@ class ContextMenusTest { @SmokeTest @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun verifyContextOpenLinkPrivateTab() { val pageLinks = TestAssetHelper.getGenericAsset(mockWebServer, 4) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt index 6243b5cec..3ae5256ef 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt @@ -13,7 +13,6 @@ import mozilla.components.browser.storage.sync.PlacesHistoryStorage import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -221,7 +220,6 @@ class HistoryTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openHistoryInNewTabTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -251,7 +249,6 @@ class HistoryTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openHistoryInPrivateTabTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -336,9 +333,8 @@ class HistoryTest { } } - @Test // This test verifies the Recently Closed Tabs List and items - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") + @Test fun verifyRecentlyClosedTabsListTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt index 3120e3880..e5f8244e3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt @@ -13,7 +13,6 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -358,7 +357,6 @@ class SettingsPrivacyTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun launchPageShortcutInPrivateModeTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 999031ed9..44936d13f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -159,7 +159,6 @@ class SmokeTest { } } - @Test /* Verifies the nav bar: - opening a web page - the existence of nav bar items @@ -167,7 +166,7 @@ class SmokeTest { - the tab drawer button - opening a new search and dismissing the nav bar */ - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") + @Test fun verifyBasicNavigationToolbarFunctionality() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -502,9 +501,8 @@ class SmokeTest { } } - @Test // Verifies that a recently closed item is properly opened - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") + @Test fun openRecentlyClosedItemTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -527,9 +525,8 @@ class SmokeTest { } } - @Test // Verifies that tapping the "x" button removes a recently closed item from the list - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") + @Test fun deleteRecentlyClosedTabsItemTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt index ea7a51e66..b0a84afe1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.ui import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -106,7 +105,6 @@ class StrictEnhancedTrackingProtectionTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun testStrictVisitProtectionSheet() { val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val trackingProtectionTest = @@ -162,7 +160,6 @@ class StrictEnhancedTrackingProtectionTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun testStrictVisitSheetDetails() { val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val trackingProtectionTest = diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt index 4748d3b80..96d552972 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt @@ -72,7 +72,6 @@ class TabbedBrowsingTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openNewTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -97,7 +96,6 @@ class TabbedBrowsingTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun openNewPrivateTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -118,7 +116,6 @@ class TabbedBrowsingTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun closeAllTabsTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -183,7 +180,6 @@ class TabbedBrowsingTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun verifyUndoSnackBarTest() { // disabling these features because they interfere with the snackbar visibility featureSettingsHelper.setPocketEnabled(false) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index 4c0a4442b..6f55f6bb6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -497,7 +497,7 @@ private fun assertExistingTabList() { assertTrue( mDevice.findObject( - UiSelector().resourceId("$packageName:id/tab_item"), + UiSelector().resourceId("$packageName:id/tray_list_item"), ).waitForExists(waitingTime), ) } @@ -623,8 +623,7 @@ private fun tab(title: String) = private fun tabItem(title: String) = mDevice.findObject( UiSelector() - .resourceId("$packageName:id/tab_item") - .childSelector(UiSelector().text(title)), + .textContains(title), ) private fun tabsCounter() = onView(withId(R.id.tab_button)) From 3fdbbe9ef55e76bf29a8355d30b42b49ae2adf41 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 30 Sep 2022 02:30:29 +0200 Subject: [PATCH 086/407] Import l10n. (#27225) --- app/src/main/res/values-lo/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 9166914f7..6359011c0 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1887,6 +1887,9 @@ ປິດອັດຕະໂນມັດເປີດ + + ຕັ້ງລິ້ງຈາກເວັບໄຊທ໌, ອີເມວ ແລະຂໍ້ຄວາມໃຫ້ເປີດໂດຍອັດຕະໂນມັດໃນ Firefox. + ລົບ From f8682dab94e7fb2f611e1541b3735a7f1d026f02 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 29 Sep 2022 19:35:16 +0000 Subject: [PATCH 087/407] Update to Android-Components 107.0.20220929190135. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2331c1abc..89c8a491e 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220929143100" + const val VERSION = "107.0.20220929190135" } From acf9756a762670c36e8cf5408c91048d08bc31f0 Mon Sep 17 00:00:00 2001 From: sv-ohorvath Date: Wed, 28 Sep 2022 12:54:40 +0300 Subject: [PATCH 088/407] No issue: remove sdk suppression tests tags for API28 and unschedule cron job --- .cron.yml | 2 +- .../java/org/mozilla/fenix/ui/DownloadTest.kt | 3 --- .../java/org/mozilla/fenix/ui/SearchTest.kt | 4 ---- .../org/mozilla/fenix/ui/SitePermissionsTest.kt | 11 ----------- .../androidTest/flank-arm-legacy-api-tests.yml | 13 ------------- 5 files changed, 1 insertion(+), 32 deletions(-) diff --git a/.cron.yml b/.cron.yml index 28a2c70bf..df4d6f8a5 100644 --- a/.cron.yml +++ b/.cron.yml @@ -36,4 +36,4 @@ jobs: type: decision-task treeherder-symbol: legacy-api-ui target-tasks-method: legacy_api_ui_tests - when: [{hour: 10, minute: 30}] + when: [] # temporarily unscheduled diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index 9732517fb..537bc0c89 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -4,9 +4,7 @@ package org.mozilla.fenix.ui -import android.os.Build import androidx.core.net.toUri -import androidx.test.filters.SdkSuppress import androidx.test.platform.app.InstrumentationRegistry import androidx.test.runner.permission.PermissionRequester import androidx.test.uiautomator.UiDevice @@ -137,7 +135,6 @@ class DownloadTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun pauseResumeCancelDownloadTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 94928d8a5..e66fb0264 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -6,11 +6,9 @@ package org.mozilla.fenix.ui import android.content.Context import android.hardware.camera2.CameraManager -import android.os.Build import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.core.net.toUri import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu -import androidx.test.filters.SdkSuppress import mozilla.components.browser.icons.IconRequest import mozilla.components.browser.icons.generator.DefaultIconGenerator import mozilla.components.feature.search.ext.createSearchEngine @@ -84,7 +82,6 @@ class SearchTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun scanButtonDenyPermissionTest() { @@ -106,7 +103,6 @@ class SearchTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun scanButtonAllowPermissionTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt index 29f8f5e3f..a314d860d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt @@ -8,9 +8,7 @@ import android.Manifest import android.content.Context import android.hardware.camera2.CameraManager import android.media.AudioManager -import android.os.Build import androidx.core.net.toUri -import androidx.test.filters.SdkSuppress import androidx.test.rule.GrantPermissionRule import org.junit.Assume.assumeTrue import org.junit.Before @@ -61,7 +59,6 @@ class SitePermissionsTest { featureSettingsHelper.disablePwaCFR(true) } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun audioVideoPermissionChoiceOnEachRequestTest() { @@ -80,7 +77,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun rememberBlockAudioVideoPermissionChoiceTest() { @@ -104,7 +100,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun rememberAllowAudioVideoPermissionChoiceTest() { @@ -128,7 +123,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun microphonePermissionChoiceOnEachRequestTest() { assumeTrue(micManager.microphones.isNotEmpty()) @@ -146,7 +140,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun rememberBlockMicrophonePermissionChoiceTest() { assumeTrue(micManager.microphones.isNotEmpty()) @@ -168,7 +161,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun rememberAllowMicrophonePermissionChoiceTest() { assumeTrue(micManager.microphones.isNotEmpty()) @@ -190,7 +182,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun cameraPermissionChoiceOnEachRequestTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) @@ -208,7 +199,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun rememberBlockCameraPermissionChoiceTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) @@ -230,7 +220,6 @@ class SitePermissionsTest { } } - @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @Test fun rememberAllowCameraPermissionChoiceTest() { assumeTrue(cameraManager.cameraIdList.isNotEmpty()) diff --git a/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml b/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml index 5f533bdbe..7f7fb0342 100644 --- a/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml +++ b/automation/taskcluster/androidTest/flank-arm-legacy-api-tests.yml @@ -20,19 +20,6 @@ gcloud: performance-metrics: true test-targets: - - class org.mozilla.fenix.ui.DownloadTest#pauseResumeCancelDownloadTest - - class org.mozilla.fenix.ui.SearchTest#scanButtonAllowPermissionTest - - class org.mozilla.fenix.ui.SearchTest#scanButtonDenyPermissionTest - - class org.mozilla.fenix.ui.SitePermissionsTest#audioVideoPermissionChoiceOnEachRequestTest - - class org.mozilla.fenix.ui.SitePermissionsTest#cameraPermissionChoiceOnEachRequestTest - - class org.mozilla.fenix.ui.SitePermissionsTest#microphonePermissionChoiceOnEachRequestTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberAllowAudioVideoPermissionChoiceTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberAllowCameraPermissionChoiceTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberAllowMicrophonePermissionChoiceTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberBlockAudioVideoPermissionChoiceTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberBlockCameraPermissionChoiceTest - - class org.mozilla.fenix.ui.SitePermissionsTest#rememberBlockMicrophonePermissionChoiceTest - - class org.mozilla.fenix.ui.SmokeTest#redirectToAppPermissionsSystemSettingsTest device: - model: Pixel2.arm From 595d931dc04a01277cb83538437e61a57fd55efe Mon Sep 17 00:00:00 2001 From: mike a Date: Thu, 29 Sep 2022 21:56:13 -0700 Subject: [PATCH 089/407] Closes #27209: fix WallpapersSettings crash --- .../settings/wallpaper/WallpaperSettingsFragment.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt index 5fc3b556e..f0a44ee8f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettingsFragment.kt @@ -11,6 +11,7 @@ import android.view.ViewGroup import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -43,7 +44,7 @@ class WallpaperSettingsFragment : Fragment() { savedInstanceState: Bundle?, ): View { Wallpapers.wallpaperSettingsOpened.record(NoExtras()) - return ComposeView(requireContext()).apply { + val wallpaperSettings = ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { FirefoxTheme { @@ -70,7 +71,7 @@ class WallpaperSettingsFragment : Fragment() { onSelectWallpaper = { coroutineScope.launch { val result = wallpaperUseCases.selectWallpaper(it) - onWallpaperSelected(it, result, this@apply) + onWallpaperSelected(it, result, requireView()) } }, onLearnMoreClick = { url, collectionName -> @@ -90,6 +91,12 @@ class WallpaperSettingsFragment : Fragment() { } } } + + // Using CoordinatorLayout as a parent view for the fragment gives the benefit of hiding + // snackbars automatically when the fragment is closed. + return CoordinatorLayout(requireContext()).apply { + addView(wallpaperSettings) + } } private fun onWallpaperSelected( From 41c0d822bd8e2653d1d439bc09062206e940d5e7 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 30 Sep 2022 20:31:12 +0000 Subject: [PATCH 090/407] Update to Android-Components 107.0.20220930190122. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 89c8a491e..3768e627e 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220929190135" + const val VERSION = "107.0.20220930190122" } From d70f8dec4fb250d8e31e4295dc436d81152beb11 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 1 Oct 2022 02:39:22 +0200 Subject: [PATCH 091/407] Import l10n. (#27235) --- app/src/main/res/values-lo/strings.xml | 4 ++++ app/src/main/res/values-pt-rBR/strings.xml | 11 +---------- app/src/main/res/values-su/strings.xml | 23 ++++++++++++---------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 6359011c0..00fab19ef 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1344,6 +1344,8 @@ ໃຊ້ອີເມວແທນ + + ສ້າງອັນໜຶ່ງ ເພື່ອຊິງຄ໌ Firefox ລະຫວ່າງອຸປະກອນ.]]> %s ຈະຢຸດການ Sync ກັບບັນຊີຂອງທ່ານ ແຕວ່າຈະບໍ່ລຶບຂໍ້ມູນປະຫວັດການຄົ້ນຫາຂອງທ່ານໃນອຸປະກອນນີ້. @@ -1763,6 +1765,8 @@ ການເຊື່ອມຕໍ່ບໍ່ປອດໄພ ລຶບລ້າງຄຸກກີ້ ແລະຂໍ້ມູນເວັບໄຊ + + ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບລ້າງການອະນຸຍາດທັງໝົດຢູ່ໃນທຸກເວັບໄຊ? ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບລ້າງການອະນຸຍາດທັງໝົດສຳລັບເວັບໄຊນີ້? diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 42ac6419a..7aaca4538 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -56,7 +56,7 @@ The first parameter is the name of the app defined in app_name (for example: Fenix) --> O %1$s limpa o histórico de pesquisa e navegação de abas privativas quando você as fecha ou sai do aplicativo. Apesar disso não tornar você anônimo em sites ou no seu provedor de internet, facilita manter o que você faz online privativo de qualquer outra pessoa que use este dispositivo. - Mitos comuns sobre navegação privativa + Lendas comuns sobre navegação privativa @@ -394,8 +394,6 @@ Personalizar - Sincronize favoritos, histórico e muito mais com sua Conta Firefox - Entre para sincronizar abas, favoritos, senhas e muito mais. Conta Firefox @@ -591,8 +589,6 @@ Permitir que a Mozilla instale e execute estudos - - Ativar a sincronização Sincronize e salve seus dados @@ -810,9 +806,6 @@ %1$s (modo privativo) - - Outras abas - Digite termos de pesquisa @@ -1220,8 +1213,6 @@ Sair - - Isso excluirá todos os seus dados de navegação. Intervalo de tempo a excluir diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 16092a60c..9d574d366 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -273,6 +273,12 @@ Tepas Firefox pribadi kiwari mantuan anjeun nyokot ti anu ditinggalkeun. Néangan tab anu can lila, markah, jeung hasil nyungsi. + + Wilujeng sumping di internét mandiri + + Wilujeng sumping di internét anu leuwih pribadi + + Leuwih warnaan. Pripasi leuwih hadé. Komitmen anu sarua pikeun jalma batan bati. Mitembeyan @@ -367,8 +373,6 @@ Réngkak Sesuaikeun - - Singkronkeun markah, jujutan, jeung nu lianna maké Firefox Account anjeun Akun Firefox @@ -455,6 +459,8 @@ Témbong + + Pecakan deui Leuwih teleb @@ -463,6 +469,9 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logo Firefox - ganti latar, tombol + + %s klasik + Emboh teu didukung @@ -546,9 +555,6 @@ Ngidinan Mozilla masang jeung ngajalankeun studi - - Hurungkeun Sync - Singkronkeun tur simpen data anjeun @@ -764,9 +770,6 @@ %1$s (Mode Nyamuni) - - Tab lianna - Asupkeun istilah pamaluruhan @@ -1177,8 +1180,6 @@ Kaluar - - Ieu peta bakal mupus sadaya data nyungsi anjeun. Rentang waktu pikeun mupus @@ -1224,6 +1225,8 @@ Bawa markah, jujutan, jeung kecap sandi ka %1$s di ieu parabot. Daptar + + Asup Singkronna hurung From ffecc11a980f8b449553655fb3779cc761f39bdf Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 1 Oct 2022 14:48:59 +0000 Subject: [PATCH 092/407] Update to Android-Components 107.0.20221001143328. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 3768e627e..6cabc1f65 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20220930190122" + const val VERSION = "107.0.20221001143328" } From ee970d4fc8cde82604db690df8636eaa136c5a78 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sun, 2 Oct 2022 02:35:02 +0200 Subject: [PATCH 093/407] Import l10n. (#27242) --- app/src/main/res/values-lo/strings.xml | 5 +++++ app/src/main/res/values-su/strings.xml | 4 ++++ app/src/main/res/values-th/strings.xml | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 00fab19ef..a95096215 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1300,6 +1300,9 @@ ຄວາມເປັນສ່ວນຕົວຂອງທ່ານ ທ່ານຄວບຄຸມຂໍ້ມູນຂອງທ່ານ + + ພວກເຮົາໄດ້ອອກແບບ %s ເພື່ອໃຫ້ທ່ານຄວບຄຸມສິ່ງທີ່ທ່ານແບ່ງປັນອອນລາຍ ແລະສິ່ງທີ່ທ່ານແບ່ງປັນກັບພວກເຮົາ. Firefox ໃຫ້ທ່ານຄວບຄຸມສິ່ງທີ່ທ່ານແບ່ງປັນອອນໄລນ໌ ແລະສິ່ງທີ່ທ່ານແບ່ງປັນກັບພວກເຮົາ. @@ -1507,6 +1510,8 @@ ຕື່ມຂໍ້ມູນອັດຕະໂນມັດໃນ %1$s + + ຕື່ມຂໍ້ມູນໃສ່ ແລະບັນທຶກຊື່ຜູ້ໃຊ້ ແລະລະຫັດຜ່ານຢູ່ໃນເວັບໄຊທ໌ໃນຂະນະທີ່ໃຊ້ %1$s. ຕື່ມຂໍ້ມູນອັດຕະໂນມັດໃນແອັບຯອື່ນ diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 9d574d366..5e0b27a59 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -279,6 +279,10 @@ Wilujeng sumping di internét anu leuwih pribadi Leuwih warnaan. Pripasi leuwih hadé. Komitmen anu sarua pikeun jalma batan bati. + + Luncat tina telepon ka laptop jeung sabalikna + + Ngagilirkeun layar leuwih babari ti nu atos-atos Mitembeyan diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 5e77936d1..1a9accdf5 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -283,10 +283,14 @@ พบกับโฮมเพจส่วนบุคคลของคุณ แท็บล่าสุด ที่คั่นหน้า และผลการค้นหาจะปรากฏที่นี่ ยินดีต้อนรับสู่อินเทอร์เน็ตที่เป็นอิสระ + + ยินดีต้อนรับสู่อินเทอร์เน็ตที่เป็นส่วนตัวมากขึ้น สีสันที่มากขึ้น ความเป็นส่วนตัวที่ดีขึ้น ให้ความมุ่งมั่นกับผู้คนมากกว่าผลกำไร สับเปลี่ยนไปมาระหว่างโทรศัพท์กับแล็ปท็อป + + สลับหน้าจอง่ายกว่าที่เคย เรียกดูต่อจากที่คุณค้างไว้ด้วยแท็บจากอุปกรณ์อื่นๆ บนหน้าแรกของคุณได้แล้วตอนนี้ @@ -473,8 +477,12 @@ ดู + + ไม่สามารถดาวน์โหลดรูปพื้นหลัง ลองอีกครั้ง + + ไม่สามารถเปลี่ยนรูปพื้นหลัง เรียนรู้เพิ่มเติม @@ -483,9 +491,18 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> โลโก้ Firefox - เปลี่ยนวอลเปเปอร์, ปุ่ม + + คลาสสิค %s เวลาจำกัด + + ลองเลือกสีสันที่คุณชอบ + + เลือกวอลล์เปเปอร์ที่บ่งบอกความเป็นคุณ + + สำรวจวอลล์เปเปอร์เพิ่มเติม + ไม่รองรับส่วนเสริม @@ -1223,8 +1240,14 @@ ยินดีต้อนรับสู่ %s! + + ยินดีต้อนรับสู่อินเทอร์เน็ตที่ดีกว่า + + เบราว์เซอร์ที่สร้างขึ้นสำหรับผู้คนเท่านั้น ไม่ใช่ผลกำไร ซิงค์ Firefox ระหว่างอุปกรณ์ + + หยิบจากที่ที่คุณทำค้างไว้ นำที่คั่นหน้า ประวัติ และรหัสผ่านไปยัง %1$s บนอุปกรณ์นี้ @@ -1261,6 +1284,8 @@ อ่านประกาศความเป็นส่วนตัวของเรา + + พร้อมที่จะเปิดอินเทอร์เน็ตที่น่าทึ่งแล้วหรือยัง? เริ่มการเรียกดู From 853ee1aa9212b316cf09f6af9151160cc48fbbd7 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 2 Oct 2022 19:21:00 +0000 Subject: [PATCH 094/407] Update to Android-Components 107.0.20221002190240. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 6cabc1f65..f90af9e93 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221001143328" + const val VERSION = "107.0.20221002190240" } From 0c5b1a910b7aa9bb8c1812947988e0b9ea20b9fa Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 3 Oct 2022 03:01:28 +0200 Subject: [PATCH 095/407] Import l10n. (#27248) --- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-eo/strings.xml | 50 +++++++------ app/src/main/res/values-es-rES/strings.xml | 82 ++++++++++++++++------ app/src/main/res/values-eu/strings.xml | 80 +++++++++++++++------ app/src/main/res/values-lo/strings.xml | 10 +++ app/src/main/res/values-oc/strings.xml | 2 + app/src/main/res/values-pt-rPT/strings.xml | 5 ++ app/src/main/res/values-su/strings.xml | 17 +++++ 8 files changed, 185 insertions(+), 63 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index b3e645a30..f720b5455 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -60,7 +60,7 @@ - Дадайце цэтлік, каб адкрываць прыватныя карткі з галоўнага экрана. + Дадайце цэтлік, каб адкрываць прыватныя карткі з хатняга экрана. Дадаць цэтлік diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index af1187350..baae02f28 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -279,11 +279,15 @@ Malkovru vian personecigitan ekan paĝon. Ĵusaj langetoj, legosignoj, kaj serĉaj rezultoj aperos ĉi tie. - Bonvenon al sendependa interreto + Bonvenon al sendependa interreto + + Bonvenon al pli persona interreto Pli da koloroj. Pli bona privateco. Sama dediĉo al personoj pli ol al profitoj. - Iru tien kaj reen inter la telefono kaj la komputilo + Iru tien kaj reen inter la telefono kaj la komputilo + + Iri de unu ekrano al la alia estas pli facile ol iam ajn antaŭe Daŭrigu el la loko kie vi haltis kun la langetoj de viaj aliaj aparatoj, kiuj nun aperas en via eka paĝo. @@ -384,8 +388,6 @@ Personecigi - Spegulu legosignojn, historion kaj aliajn aferojn per via konto de Firefox - Komencu seancon por speguli langetojn, legosignojn, pasvortojn kaj pli. Konto de Firefox @@ -469,12 +471,27 @@ Vidi + + Ne eblis elŝuti ekranfonon + + Klopodi denove + + Ne eblis ŝanĝi ekranfonon + + Pli da informo Ŝanĝi ekranfonon per tuŝeto de la emblemo de Firefox en la eka paĝo Emblemo de Firefox – ŝanĝi ekranfonon, butono + + Klasika %s + + Limigita eldono + + La nova kolekto "Sendependaj voĉoj". %s + Nesubtenata aldonaĵo @@ -556,8 +573,6 @@ Permesi al Mozilla instali kaj fari studojn - - Ŝalti Speguladon Speguli kaj konservi viajn datumojn @@ -777,9 +792,6 @@ %1$s (Privata reĝimo) - - Aliaj langetoj - Tajpu serĉan tekston @@ -1191,8 +1203,6 @@ Fini - - Ĉiujn viajn retumajn datumojn estos forigitaj. Forigota tempa amplekso @@ -1228,19 +1238,19 @@ - Bonvenon al %s! + Bonvenon al %s! - Speguli Firefox inter aparatoj + Speguli Firefox inter aparatoj - Porti legosignojn, historion kaj pasvortojn al %1$s en tiu ĉi aparato. + Porti legosignojn, historion kaj pasvortojn al %1$s en tiu ĉi aparato. - Registriĝi + Registriĝi Spegulado estas ŝaltita - Privateco ĉiam aktiva + Privateco ĉiam aktiva - %1$s aŭtomate evitas ke entreprenoj sekrete sekvu vin tra la teksaĵo. + %1$s aŭtomate evitas ke entreprenoj sekrete sekvu vin tra la teksaĵo. Norma @@ -1252,13 +1262,13 @@ Elektu lokon por la ilaro - Metu la ilaron ĉemanen. Lasu ĝin malsupre aŭ movu ĝin supren. + Metu la ilaron ĉemanen. Lasu ĝin malsupre aŭ movu ĝin supren. - Via privateco + Via privateco - Ni kreis %s por doni al vi la eblon plene regi kion vi dividas en la reto kaj kion vi dividas kun ni. + Ni kreis %s por doni al vi la eblon plene regi kion vi dividas en la reto kaj kion vi dividas kun ni. Legu nian rimarkon pri privateco diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 01780a991..c5c1b44c6 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -288,12 +288,16 @@ Descubre tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. - Te damos la bienvenida a un internet independiente + Te damos la bienvenida a un internet independiente + + Te damos la bienvenida a un Internet más personal Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. - Salta del teléfono al ordenador y viceversa + Salta del teléfono al ordenador y viceversa + + Cambiar de pantalla es más fácil que nunca Continúa donde lo dejaste con pestañas de otros dispositivos ahora en tu página de inicio. @@ -395,8 +399,6 @@ Personalizar - Sincroniza marcadores, historial y más con tu cuenta Firefox - Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. Cuenta Firefox @@ -481,12 +483,35 @@ ¡Fondo de pantalla actualizado! Ver + + No se ha podido descargar el fondo de pantalla + + Reintentar + + No se ha podido cambiar el fondo de pantalla + + Saber más Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox Logotipo de Firefox - cambiar el fondo de pantalla, botón + + %s clásico + + Edición limitada + + La nueva colección Voces Independientes. %s + + La nueva colección Voces Independientes. + + Prueba un toque de color + + Elige un fondo de pantalla que te represente. + + Explorar más fondos de pantalla + El complemento no es compatible @@ -571,9 +596,6 @@ Permite a Mozilla instalar y ejecutar estudios - - Activar Sync - Sincronizar y guardar tus datos @@ -790,9 +812,6 @@ %1$s (modo privado) - - Otras pestañas - Introducir términos de búsqueda @@ -1220,9 +1239,6 @@ Salir - - Se eliminarán todos tus datos de navegación. - Intervalo de tiempo a eliminar @@ -1258,20 +1274,34 @@ - ¡Te damos la bienvenida a %s! + ¡Te damos la bienvenida a %s! + + Te damos la bienvenida a un mejor Internet + + Un navegador creado para las personas, no para el lucro. - Sincronizar Firefox entre dispositivos + Sincronizar Firefox entre dispositivos + + Continúa donde lo dejaste. - Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + + Sincroniza pestañas y contraseñas entre dispositivos para cambiar de pantalla sin interrupciones. - Registrarse + Registrarse + + Iniciar sesión Sync está activado - Privacidad siempre activada + Privacidad siempre activada + + Protección de privacidad de manera predeterminada - %1$s bloquea automáticamente a las compañías que te siguen en secreto por la web. + %1$s bloquea automáticamente a las compañías que te siguen en secreto por la web. + + Incluye Total Cookie Protection para evitar que los rastreadores usen cookies para espiarte entre sitios. Estándar (predeterminado) @@ -1283,15 +1313,23 @@ Escoge la posición de la barra de herramientas - Pon la barra de herramientas a tu alcance. Mantenla abajo, o muévela hacia arriba. + Pon la barra de herramientas a tu alcance. Mantenla abajo, o muévela hacia arriba. + + Mantenlo en la parte inferior o muévelo a la parte superior. - Tu privacidad + Tu privacidad + + Tú controlas tus datos - Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + + Firefox te da control sobre lo que compartes en línea y lo que compartes con nosotros. Lee nuestro aviso de privacidad + + ¿Listo para abrir un Internet increíble? Comienza a navegar diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 53576a4ca..6f256d446 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -285,11 +285,15 @@ Ezagut ezazu zure hasiera-orri pertsonalizatua. Azken fitxak, laster-markak eta bilaketa-emaitzak hemen agertuko dira. - Ongi etorri Internet independente batera + Ongi etorri Internet independente batera + + Ongi etorri Internet pertsonalago batera Kolore gehiago. Pribatutasun hobea. Irabazi-asmoen gainetik, jendearekiko betidaniko konpromisoa. - Egin salto telefonotik ordenagailu eramangarrira eta atzera + Egin salto telefonotik ordenagailu eramangarrira eta atzera + + Pantailak aldatzea inoiz baino errazagoa da Berrekin utzitako lekutik zure hasierako orriko beste gailuetako fitxekin. @@ -390,8 +394,6 @@ Pertsonalizatu - Sinkronizatu laster-markak, historia eta gehiago zure Firefox kontua erabiliz - Hasi saioa fitxak, laster-markak, pasahitzak eta gehiago sinkronizatzeko. Firefox kontua @@ -476,12 +478,35 @@ Horma-papera eguneratuta! Ikusi + + Ezin da horma-papera deskargatu + + Saiatu berriro + + Ezin da horma-papera aldatu + + Argibide gehiago Aldatu horma-papera Firefoxen hasiera-orriko logoa sakatuz Firefox logoa - aldatu horma-papera, botoia + + %s klasikoa + + Edizio mugatua + + Ahots Independenteen bilduma berria. %s + + Ahots Independenteen bilduma berria. + + Probatu kolore ukitu bat + + Aukeratu zuri egokitzen zaizun horma-papera. + + Arakatu horma-paper gehiago + Gehigarria ez da onartzen @@ -566,8 +591,6 @@ Mozillari esperimentuak instalatu eta exekutatzea baimentzen du - - Gaitu sinkronizazioa Sinkronizatu eta gorde datuak @@ -785,9 +808,6 @@ %1$s (modu pribatua) - - Beste fitxak - Idatzi bilaketa-terminoak @@ -1195,8 +1215,6 @@ Irten - - Zure nabigatze-datu guztiak ezabatuko ditu honek. Ezabatu beharreko denbora-tartea @@ -1232,20 +1250,34 @@ - Ongi etorri %s(e)ra! + Ongi etorri %s(e)ra! + + Ongi etorri Internet hobeago batera + + Herriarentzat egindako nabigatzailea, ez irabazi-asmoentzat. - Sinkronizatu Firefox gailuen artean + Sinkronizatu Firefox gailuen artean + + Jarraitu utzi zenuen tokitik - Ekarri laster-markak, historia eta pasahitzak gailu honetako %1$s(e)ra. + Ekarri laster-markak, historia eta pasahitzak gailu honetako %1$s(e)ra. + + Sinkronizatu gailuen artean fitxak eta pasahitzak, pantailen artean di-da aldatzeko. - Eman izena + Eman izena + + Hasi saioa Sinkronizazioa aktibo dago - Pribatutasuna beti aktibo + Pribatutasuna beti aktibo + + Pribatutasunaren babesa lehenespenez - %1$s(e)k automatikoki eragozten du konpainiek sekretuki zu webean zehar jarraitzea. + %1$s(e)k automatikoki eragozten du konpainiek sekretuki zu webean zehar jarraitzea. + + Cookien erabateko babesarekin, jarraipen-elementuei guneen artean zelatatzen zaituzten cookieak erabiltzea galarazten zaie. Oinarrizkoa (lehenetsia) @@ -1257,15 +1289,23 @@ Hautatu tresna-barraren kokapena - Izan tresna-barra esku-eskura. Manten ezazu behean edo eraman ezazu gora. + Izan tresna-barra esku-eskura. Manten ezazu behean edo eraman ezazu gora. + + Manten ezazu behean edo eramazu gora. - Zure pribatutasuna + Zure pribatutasuna + + Zuk kontrolatzen dituzu zure datuak - Online partekatzen duzunaren eta gurekin partekatzen duzunaren inguruko kontrola emateko diseinatu dugu %s. + Online partekatzen duzunaren eta gurekin partekatzen duzunaren inguruko kontrola emateko diseinatu dugu %s. + + Online partekatzen duzunaren eta gurekin partekatzen duzunaren inguruko kontrola ematen dizu Firefoxek. Irakurri gure pribatutasun-oharra + + Internet txundigarri bat aurkitzeko prest? Hasi nabigatzen diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index a95096215..05a9f9936 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1369,6 +1369,8 @@ ຮຽນຮູ້ເພີ່ມເຕີມ ມາດຕະຖານ (ຄ່າພື້ນຖານ) + + ຄວາມເປັນສ່ວນຕົວ ແລະ ປະສິດທິພາບແບບສົມດຸ່ນ. ໜ້າເວັບຈະໂຫຼດເປັນປົກະຕິ. ສິ່ງທີ່ຈະຖືກບັອກໂດຍການປ້ອງກັນການຕິດຕາມແບບມາດຕະຖານ @@ -1514,6 +1516,8 @@ ຕື່ມຂໍ້ມູນໃສ່ ແລະບັນທຶກຊື່ຜູ້ໃຊ້ ແລະລະຫັດຜ່ານຢູ່ໃນເວັບໄຊທ໌ໃນຂະນະທີ່ໃຊ້ %1$s. ຕື່ມຂໍ້ມູນອັດຕະໂນມັດໃນແອັບຯອື່ນ + + ຕື່ມຂໍ້ມູນຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານໃນແອັບຯອື່ນໃນອຸປະກອນຂອງທ່ານ. ເພີ່ມການເຂົ້າສູ່ລະບົບ @@ -1579,6 +1583,8 @@ ປົດລັອກອຸປະກອນຂອງທ່ານ ຊູມໃນທຸກເວັບໄຊທ + + ເປີດໃຊ້ການອະນຸຍາດໃຫ້ຢິບ ແລະຊູມ, ເຖິງແມ່ນວ່າຢູ່ໃນເວັບໄຊທ໌ທີ່ປ້ອງກັນທ່າທາງນີ້. ຊື່ (A-Z) @@ -1770,6 +1776,8 @@ ການເຊື່ອມຕໍ່ບໍ່ປອດໄພ ລຶບລ້າງຄຸກກີ້ ແລະຂໍ້ມູນເວັບໄຊ + + %s?]]> ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບລ້າງການອະນຸຍາດທັງໝົດຢູ່ໃນທຸກເວັບໄຊ? @@ -1800,6 +1808,8 @@ ຍົກເລີກ ທາງເລືອກການເຂົ້າສູ່ລະບົບ + + ຊ່ອງຂໍ້ຄວາມທີ່ສາມາດແກ້ໄຂໄດ້ສໍາລັບທີ່ຢູ່ເວັບຂອງການເຂົ້າສູ່ລະບົບ. ຊ່ອງຂໍ້ຄວາມທີ່ສາມາດແກ້ໄຂໄດ້ສໍາລັບຊື່ຜູ້ໃຊ້ຂອງການເຂົ້າສູ່ລະບົບ. diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 122985ba8..d09d866a2 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -1273,6 +1273,8 @@ Tornatz ont èretz Importatz vòstres marcapaginas, vòstre istoric e vòstres senhals dins %1$s sus aqueste aparelh. + + Sincronizacion d’onglets e de senhals demest aparelhs per passar d’un ecran a l’autre sens relambi. Se connectar diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 8e14d7607..d2761e16b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -289,6 +289,9 @@ Saltar + + Os seus separadores estão a sincronizar! Retorne de onde parou no seu outro dispositivo. + Abrir um novo separador do %1$s @@ -471,6 +474,8 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Logótipo do Firefox - altere o fundo, botão + + Clássico %s Edição limitada diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 5e0b27a59..dc28a514e 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -463,8 +463,12 @@ Témbong + + Teu bisa ngundeur latar Pecakan deui + + Teu bisa ngarobah latar Leuwih teleb @@ -476,6 +480,17 @@ %s klasik + + Édisi Diwates + + Kumpulan Independent Voices anyar. %s + + Kumpulan Independent Voices anyar. + + Pilih latar anu nyarita ka anjeun. + + Langlang latar lianna + Emboh teu didukung @@ -1250,6 +1265,8 @@ Pilih perenah tulbar anjeun Perenahkeun tulbar sangkan babari kahontal. Teundeun di handap, atawa pindahkeun ka punclut. + + Angger di handap, atawa pindahkeun ka luhur. Salindungan anjeun Go to settings Firefox Suggest + + + + collapse + + expand From 04426959725bd007ce6ceb91c41c1861c7d363dd Mon Sep 17 00:00:00 2001 From: Mugurell Date: Sat, 24 Sep 2022 18:13:55 +0300 Subject: [PATCH 097/407] For #26884 - Merge FeatureSettingsHelper with activity rules --- .../fenix/helpers/FeatureSettingsHelper.kt | 116 ++++++------ .../helpers/FeatureSettingsHelperDelegate.kt | 159 ++++++++++++++++ .../fenix/helpers/HomeActivityTestRule.kt | 176 ++++++++++++++++-- .../org/mozilla/fenix/helpers/TestHelper.kt | 1 + .../perf/StartupExcessiveResourceUseTest.kt | 2 +- 5 files changed, 386 insertions(+), 68 deletions(-) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt index 5cb27ea94..d9a56df8a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelper.kt @@ -4,72 +4,84 @@ package org.mozilla.fenix.helpers -import android.content.Context import androidx.test.platform.app.InstrumentationRegistry import org.mozilla.fenix.ext.settings -class FeatureSettingsHelper { - private val context: Context = InstrumentationRegistry.getInstrumentation().targetContext - private val settings = context.settings() - - // saving default values of feature flags - private var isPocketEnabled: Boolean = settings.showPocketRecommendationsFeature - private var isJumpBackInCFREnabled: Boolean = settings.shouldShowJumpBackInCFR - private var isRecentTabsFeatureEnabled: Boolean = settings.showRecentTabsFeature - private var isRecentlyVisitedFeatureEnabled: Boolean = settings.historyMetadataUIFeature - private var isUserKnowsAboutPwasTrue: Boolean = settings.userKnowsAboutPwas - private var isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR - private var isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding - - fun setPocketEnabled(enabled: Boolean) { - settings.showPocketRecommendationsFeature = enabled - } +/** + * Helper for querying the status and modifying various features and settings in the application. + */ +interface FeatureSettingsHelper { + /** + * Whether the onboarding for existing users should be shown or not. + * It should appear only once on the first visit to homescreen. + */ + var isHomeOnboardingDialogEnabled: Boolean - fun setJumpBackCFREnabled(enabled: Boolean) { - settings.shouldShowJumpBackInCFR = enabled - } + /** + * Whether the Pocket stories feature is enabled or not. + */ + var isPocketEnabled: Boolean - fun setShowWallpaperOnboarding(enabled: Boolean) { - settings.showWallpaperOnboarding = enabled - } + /** + * Whether the "Jump back in" CFR should be shown or not. + * It should appear on the first visit to homescreen given that there is a tab opened. + */ + var isJumpBackInCFREnabled: Boolean - fun setRecentTabsFeatureEnabled(enabled: Boolean) { - settings.showRecentTabsFeature = enabled - } + /** + * Whether the onboarding dialog for choosing wallpapers should be shown or not. + */ + var isWallpaperOnboardingEnabled: Boolean - fun setRecentlyVisitedFeatureEnabled(enabled: Boolean) { - settings.historyMetadataUIFeature = enabled - } + /** + * Whether the "Jump back in" homescreen section is enabled or not. + * It shows the last visited tab on this device and on other synced devices. + */ + var isRecentTabsFeatureEnabled: Boolean - fun setStrictETPEnabled() { - settings.setStrictETP() - } + /** + * Whether the "Recently visited" homescreen section is enabled or not. + * It can show up to 9 history highlights and history groups. + */ + var isRecentlyVisitedFeatureEnabled: Boolean - fun disablePwaCFR(disable: Boolean) { - settings.userKnowsAboutPwas = disable - } + /** + * Whether the onboarding dialog for PWAs should be shown or not. + * It can show the first time a website that can be installed as a PWA is accessed. + */ + var isPWAsPromptEnabled: Boolean - fun deleteSitePermissions(delete: Boolean) { - settings.deleteSitePermissions = delete - } + /** + * Whether the "Site permissions" option is checked in the "Delete browsing data" screen or not. + */ + var isDeleteSitePermissionsEnabled: Boolean /** * Enable or disable showing the TCP CFR when accessing a webpage for the first time. */ - fun setTCPCFREnabled(shouldShowCFR: Boolean) { - settings.shouldShowTotalCookieProtectionCFR = shouldShowCFR - } + var isTCPCFREnabled: Boolean + + /** + * The current "Enhanced Tracking Protection" policy. + * @see ETPPolicy + */ + var etpPolicy: ETPPolicy - // Important: - // Use this after each test if you have modified these feature settings - // to make sure the app goes back to the default state - fun resetAllFeatureFlags() { - settings.showPocketRecommendationsFeature = isPocketEnabled - settings.shouldShowJumpBackInCFR = isJumpBackInCFREnabled - settings.showRecentTabsFeature = isRecentTabsFeatureEnabled - settings.historyMetadataUIFeature = isRecentlyVisitedFeatureEnabled - settings.userKnowsAboutPwas = isUserKnowsAboutPwasTrue - settings.shouldShowTotalCookieProtectionCFR = isTCPCFREnabled - settings.showWallpaperOnboarding = isWallpaperOnboardingEnabled + fun applyFlagUpdates() + + fun resetAllFeatureFlags() + + companion object { + val settings = InstrumentationRegistry.getInstrumentation().targetContext.settings() } } + +/** + * All "Enhanced Tracking Protection" modes. + */ +enum class ETPPolicy { + STANDARD, + STRICT, + CUSTOM, + ; +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt new file mode 100644 index 000000000..a7869382d --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/FeatureSettingsHelperDelegate.kt @@ -0,0 +1,159 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.helpers + +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.getPreferenceKey +import org.mozilla.fenix.helpers.ETPPolicy.CUSTOM +import org.mozilla.fenix.helpers.ETPPolicy.STANDARD +import org.mozilla.fenix.helpers.ETPPolicy.STRICT +import org.mozilla.fenix.helpers.FeatureSettingsHelper.Companion.settings +import org.mozilla.fenix.helpers.TestHelper.appContext +import org.mozilla.fenix.onboarding.FenixOnboarding +import org.mozilla.fenix.utils.Settings + +/** + * Helper for querying the status and modifying various features and settings in the application. + */ +class FeatureSettingsHelperDelegate : FeatureSettingsHelper { + /** + * The current feature flags used inside the app before the tests start. + * These will be restored when the tests end. + */ + private val initialFeatureFlags = FeatureFlags( + isHomeOnboardingDialogEnabled = settings.showHomeOnboardingDialog, + homeOnboardingDialogVersion = getHomeOnboardingVersion(), + isPocketEnabled = settings.showPocketRecommendationsFeature, + isJumpBackInCFREnabled = settings.shouldShowJumpBackInCFR, + isRecentTabsFeatureEnabled = settings.showRecentTabsFeature, + isRecentlyVisitedFeatureEnabled = settings.historyMetadataUIFeature, + isPWAsPromptEnabled = !settings.userKnowsAboutPwas, + isTCPCFREnabled = settings.shouldShowTotalCookieProtectionCFR, + isWallpaperOnboardingEnabled = settings.showWallpaperOnboarding, + isDeleteSitePermissionsEnabled = settings.deleteSitePermissions, + etpPolicy = getETPPolicy(settings), + ) + + /** + * The current feature flags updated in tests. + */ + private var updatedFeatureFlags = initialFeatureFlags.copy() + + override var isHomeOnboardingDialogEnabled: Boolean + get() = updatedFeatureFlags.isHomeOnboardingDialogEnabled && + FenixOnboarding(appContext).userHasBeenOnboarded() + set(value) { + updatedFeatureFlags.isHomeOnboardingDialogEnabled = value + updatedFeatureFlags.homeOnboardingDialogVersion = when (value) { + true -> FenixOnboarding.CURRENT_ONBOARDING_VERSION + false -> 0 + } + } + override var isPocketEnabled: Boolean by updatedFeatureFlags::isPocketEnabled + override var isJumpBackInCFREnabled: Boolean by updatedFeatureFlags::isJumpBackInCFREnabled + override var isWallpaperOnboardingEnabled: Boolean by updatedFeatureFlags::isWallpaperOnboardingEnabled + override var isRecentTabsFeatureEnabled: Boolean by updatedFeatureFlags::isRecentTabsFeatureEnabled + override var isRecentlyVisitedFeatureEnabled: Boolean by updatedFeatureFlags::isRecentlyVisitedFeatureEnabled + override var isPWAsPromptEnabled: Boolean by updatedFeatureFlags::isPWAsPromptEnabled + override var isTCPCFREnabled: Boolean by updatedFeatureFlags::isTCPCFREnabled + override var etpPolicy: ETPPolicy by updatedFeatureFlags::etpPolicy + + override fun applyFlagUpdates() { + applyFeatureFlags(updatedFeatureFlags) + } + + override fun resetAllFeatureFlags() { + applyFeatureFlags(initialFeatureFlags) + } + override var isDeleteSitePermissionsEnabled: Boolean by updatedFeatureFlags::isDeleteSitePermissionsEnabled + + private fun applyFeatureFlags(featureFlags: FeatureFlags) { + settings.showHomeOnboardingDialog = featureFlags.isHomeOnboardingDialogEnabled + setHomeOnboardingVersion(featureFlags.homeOnboardingDialogVersion) + settings.showPocketRecommendationsFeature = featureFlags.isPocketEnabled + settings.shouldShowJumpBackInCFR = featureFlags.isJumpBackInCFREnabled + settings.showRecentTabsFeature = featureFlags.isRecentTabsFeatureEnabled + settings.historyMetadataUIFeature = featureFlags.isRecentlyVisitedFeatureEnabled + settings.userKnowsAboutPwas = !featureFlags.isPWAsPromptEnabled + settings.shouldShowTotalCookieProtectionCFR = featureFlags.isTCPCFREnabled + settings.showWallpaperOnboarding = featureFlags.isWallpaperOnboardingEnabled + settings.deleteSitePermissions = featureFlags.isDeleteSitePermissionsEnabled + setETPPolicy(featureFlags.etpPolicy) + } +} + +private data class FeatureFlags( + var isHomeOnboardingDialogEnabled: Boolean, + var homeOnboardingDialogVersion: Int, + var isPocketEnabled: Boolean, + var isJumpBackInCFREnabled: Boolean, + var isRecentTabsFeatureEnabled: Boolean, + var isRecentlyVisitedFeatureEnabled: Boolean, + var isPWAsPromptEnabled: Boolean, + var isTCPCFREnabled: Boolean, + var isWallpaperOnboardingEnabled: Boolean, + var isDeleteSitePermissionsEnabled: Boolean, + var etpPolicy: ETPPolicy, +) + +internal fun getETPPolicy(settings: Settings): ETPPolicy { + return when { + settings.useStrictTrackingProtection -> STRICT + settings.useCustomTrackingProtection -> CUSTOM + else -> STANDARD + } +} + +private fun setETPPolicy(policy: ETPPolicy) { + when (policy) { + STRICT -> settings.setStrictETP() + // The following two cases update ETP in the same way "setStrictETP" does. + STANDARD -> { + settings.preferences.edit() + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_strict_default), + false, + ) + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_custom_option), + false, + ) + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_standard_option), + true, + ) + .commit() + } + CUSTOM -> { + settings.preferences.edit() + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_strict_default), + false, + ) + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_standard_option), + true, + ) + .putBoolean( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_custom_option), + true, + ) + .commit() + } + } +} + +private fun getHomeOnboardingVersion(): Int { + return FenixOnboarding(appContext) + .preferences + .getInt(FenixOnboarding.LAST_VERSION_ONBOARDING_KEY, 0) +} + +private fun setHomeOnboardingVersion(version: Int) { + FenixOnboarding(appContext) + .preferences.edit() + .putInt(FenixOnboarding.LAST_VERSION_ONBOARDING_KEY, version) + .commit() +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt index 368443b10..efda02186 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/HomeActivityTestRule.kt @@ -6,12 +6,12 @@ package org.mozilla.fenix.helpers -import android.app.Activity import android.view.ViewConfiguration.getLongPressTimeout import androidx.test.espresso.intent.rule.IntentsTestRule import androidx.test.rule.ActivityTestRule import androidx.test.uiautomator.UiSelector import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.helpers.FeatureSettingsHelper.Companion.settings import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.onboarding.FenixOnboarding @@ -27,34 +27,91 @@ class HomeActivityTestRule( initialTouchMode: Boolean = false, launchActivity: Boolean = true, private val skipOnboarding: Boolean = false, -) : - ActivityTestRule(HomeActivity::class.java, initialTouchMode, launchActivity) { +) : ActivityTestRule(HomeActivity::class.java, initialTouchMode, launchActivity), + FeatureSettingsHelper by FeatureSettingsHelperDelegate() { + + // Using a secondary constructor allows us to easily delegate the settings to FeatureSettingsHelperDelegate. + // Otherwise if wanting to use the same names we would have to override these settings in the primary + // constructor and in that elide the FeatureSettingsHelperDelegate. + constructor( + initialTouchMode: Boolean = false, + launchActivity: Boolean = true, + skipOnboarding: Boolean = false, + isHomeOnboardingDialogEnabled: Boolean = settings.showHomeOnboardingDialog && + FenixOnboarding(appContext).userHasBeenOnboarded(), + isPocketEnabled: Boolean = settings.showPocketRecommendationsFeature, + isJumpBackInCFREnabled: Boolean = settings.shouldShowJumpBackInCFR, + isRecentTabsFeatureEnabled: Boolean = settings.showRecentTabsFeature, + isRecentlyVisitedFeatureEnabled: Boolean = settings.historyMetadataUIFeature, + isPWAsPromptEnabled: Boolean = !settings.userKnowsAboutPwas, + isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR, + isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding, + isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions, + etpPolicy: ETPPolicy = getETPPolicy(settings), + ) : this(initialTouchMode, launchActivity, skipOnboarding) { + this.isHomeOnboardingDialogEnabled = isHomeOnboardingDialogEnabled + this.isPocketEnabled = isPocketEnabled + this.isJumpBackInCFREnabled = isJumpBackInCFREnabled + this.isRecentTabsFeatureEnabled = isRecentTabsFeatureEnabled + this.isRecentlyVisitedFeatureEnabled = isRecentlyVisitedFeatureEnabled + this.isPWAsPromptEnabled = isPWAsPromptEnabled + this.isTCPCFREnabled = isTCPCFREnabled + this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled + this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled + this.etpPolicy = etpPolicy + } /** - * Helper for updating various app settings that could interfere with the tests. - * Tests that use [HomeActivityTestRule] are expected to rely on this [FeatureSettingsHelper] - * instead of instantiating their own. - * - * The main benefit this brings is better ordering of operations with the settings cleanup - * automatically happening just before the [Activity] under test finishes which may as opposed to - * cleanup happening earlier and modifying the app behavior. + * Update settings after the activity was created. */ - val featureSettingsHelper = FeatureSettingsHelper() + fun applySettingsExceptions(settings: (FeatureSettingsHelper) -> Unit) { + FeatureSettingsHelperDelegate().also { + settings(it) + applyFlagUpdates() + } + } private val longTapUserPreference = getLongPressTimeout() override fun beforeActivityLaunched() { super.beforeActivityLaunched() setLongTapTimeout(3000) + applyFlagUpdates() if (skipOnboarding) { skipOnboardingBeforeLaunch() } } override fun afterActivityFinished() { super.afterActivityFinished() setLongTapTimeout(longTapUserPreference) - featureSettingsHelper.resetAllFeatureFlags() + resetAllFeatureFlags() closeNotificationShade() } + + companion object { + /** + * Create a new instance of [HomeActivityTestRule] which by default will disable specific + * app features that would otherwise negatively impact most tests. + * + * The disabled features are: + * - the Jump back in CFR, + * - the Total Cookie Protection CFR, + * - the PWA prompt dialog, + * - the wallpaper onboarding. + */ + fun withDefaultSettingsOverrides( + initialTouchMode: Boolean = false, + launchActivity: Boolean = true, + skipOnboarding: Boolean = false, + ) = HomeActivityTestRule( + initialTouchMode = initialTouchMode, + launchActivity = launchActivity, + skipOnboarding = skipOnboarding, + isJumpBackInCFREnabled = false, + isPWAsPromptEnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + ) + } } /** @@ -65,17 +122,59 @@ class HomeActivityTestRule( * @param launchActivity See [IntentsTestRule] */ -class HomeActivityIntentTestRule( +class HomeActivityIntentTestRule internal constructor( initialTouchMode: Boolean = false, launchActivity: Boolean = true, private val skipOnboarding: Boolean = false, -) : - IntentsTestRule(HomeActivity::class.java, initialTouchMode, launchActivity) { +) : IntentsTestRule(HomeActivity::class.java, initialTouchMode, launchActivity), + FeatureSettingsHelper by FeatureSettingsHelperDelegate() { + // Using a secondary constructor allows us to easily delegate the settings to FeatureSettingsHelperDelegate. + // Otherwise if wanting to use the same names we would have to override these settings in the primary + // constructor and in that elide the FeatureSettingsHelperDelegate. + constructor( + initialTouchMode: Boolean = false, + launchActivity: Boolean = true, + skipOnboarding: Boolean = false, + isHomeOnboardingDialogEnabled: Boolean = settings.showHomeOnboardingDialog && + FenixOnboarding(appContext).userHasBeenOnboarded(), + isPocketEnabled: Boolean = settings.showPocketRecommendationsFeature, + isJumpBackInCFREnabled: Boolean = settings.shouldShowJumpBackInCFR, + isRecentTabsFeatureEnabled: Boolean = settings.showRecentTabsFeature, + isRecentlyVisitedFeatureEnabled: Boolean = settings.historyMetadataUIFeature, + isPWAsPromptEnabled: Boolean = !settings.userKnowsAboutPwas, + isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR, + isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding, + isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions, + etpPolicy: ETPPolicy = getETPPolicy(settings), + ) : this(initialTouchMode, launchActivity, skipOnboarding) { + this.isHomeOnboardingDialogEnabled = isHomeOnboardingDialogEnabled + this.isPocketEnabled = isPocketEnabled + this.isJumpBackInCFREnabled = isJumpBackInCFREnabled + this.isRecentTabsFeatureEnabled = isRecentTabsFeatureEnabled + this.isRecentlyVisitedFeatureEnabled = isRecentlyVisitedFeatureEnabled + this.isPWAsPromptEnabled = isPWAsPromptEnabled + this.isTCPCFREnabled = isTCPCFREnabled + this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled + this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled + this.etpPolicy = etpPolicy + } + private val longTapUserPreference = getLongPressTimeout() + /** + * Update settings after the activity was created. + */ + fun applySettingsExceptions(settings: (FeatureSettingsHelper) -> Unit) { + FeatureSettingsHelperDelegate().apply { + settings(this) + applyFlagUpdates() + } + } + override fun beforeActivityLaunched() { super.beforeActivityLaunched() setLongTapTimeout(3000) + applyFlagUpdates() if (skipOnboarding) { skipOnboardingBeforeLaunch() } } @@ -83,6 +182,53 @@ class HomeActivityIntentTestRule( super.afterActivityFinished() setLongTapTimeout(longTapUserPreference) closeNotificationShade() + resetAllFeatureFlags() + } + + /** + * Update the settings values from when this rule was first instantiated to account for any changes + * done while running the tests. + * Useful in the scenario about the activity being restarted which would otherwise set the initial + * settings and override any changes made in the meantime. + */ + fun updateCachedSettings() { + isHomeOnboardingDialogEnabled = + settings.showHomeOnboardingDialog && FenixOnboarding(appContext).userHasBeenOnboarded() + isPocketEnabled = settings.showPocketRecommendationsFeature + isJumpBackInCFREnabled = settings.shouldShowJumpBackInCFR + isRecentTabsFeatureEnabled = settings.showRecentTabsFeature + isRecentlyVisitedFeatureEnabled = settings.historyMetadataUIFeature + isPWAsPromptEnabled = !settings.userKnowsAboutPwas + isTCPCFREnabled = settings.shouldShowTotalCookieProtectionCFR + isWallpaperOnboardingEnabled = settings.showWallpaperOnboarding + isDeleteSitePermissionsEnabled = settings.deleteSitePermissions + etpPolicy = getETPPolicy(settings) + } + + companion object { + /** + * Create a new instance of [HomeActivityIntentTestRule] which by default will disable specific + * app features that would otherwise negatively impact most tests. + * + * The disabled features are: + * - the Jump back in CFR, + * - the Total Cookie Protection CFR, + * - the PWA prompt dialog, + * - the wallpaper onboarding. + */ + fun withDefaultSettingsOverrides( + initialTouchMode: Boolean = false, + launchActivity: Boolean = true, + skipOnboarding: Boolean = false, + ) = HomeActivityIntentTestRule( + initialTouchMode = initialTouchMode, + launchActivity = launchActivity, + skipOnboarding = skipOnboarding, + isJumpBackInCFREnabled = false, + isPWAsPromptEnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + ) } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index bd5f764af..0fa6823c1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -95,6 +95,7 @@ object TestHelper { fun restartApp(activity: HomeActivityIntentTestRule) { with(activity) { + updateCachedSettings() finishActivity() mDevice.waitForIdle() launchActivity(null) diff --git a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt index bab02da39..e2aae7321 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt @@ -33,7 +33,7 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule * * Say no to main thread IO! 🙅 */ -private const val EXPECTED_SUPPRESSION_COUNT = 17 +private const val EXPECTED_SUPPRESSION_COUNT = 19 /** * The number of times we call the `runBlocking` coroutine method on the main thread during this From d391d1bf95bc40582f478de494ab53835f94dda0 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Thu, 29 Sep 2022 16:18:54 +0300 Subject: [PATCH 098/407] For #26884 - Update tests to modify settings through the activity rules --- .../fenix/screenshots/MenuScreenShotTest.kt | 5 +--- .../org/mozilla/fenix/ui/BookmarksTest.kt | 5 +--- .../fenix/ui/BrowsingErrorPagesTest.kt | 11 +-------- .../org/mozilla/fenix/ui/CollectionTest.kt | 24 +++++++------------ .../org/mozilla/fenix/ui/ContextMenusTest.kt | 8 +------ .../mozilla/fenix/ui/CrashReportingTest.kt | 16 +++++-------- .../org/mozilla/fenix/ui/CustomTabsTest.kt | 8 ++++--- .../mozilla/fenix/ui/DownloadFileTypesTest.kt | 21 +--------------- .../java/org/mozilla/fenix/ui/DownloadTest.kt | 11 +-------- .../java/org/mozilla/fenix/ui/HistoryTest.kt | 5 +--- .../org/mozilla/fenix/ui/HomeScreenTest.kt | 19 +++++++-------- .../mozilla/fenix/ui/MediaNotificationTest.kt | 5 +--- .../mozilla/fenix/ui/NavigationToolbarTest.kt | 6 +---- .../fenix/ui/NoNetworkAccessStartupTests.kt | 11 +-------- .../java/org/mozilla/fenix/ui/PwaTest.kt | 18 +------------- .../org/mozilla/fenix/ui/ReaderViewTest.kt | 2 +- .../java/org/mozilla/fenix/ui/SearchTest.kt | 15 ++++++------ .../org/mozilla/fenix/ui/SettingsAboutTest.kt | 13 +++++----- .../mozilla/fenix/ui/SettingsAddonsTest.kt | 8 +------ .../mozilla/fenix/ui/SettingsAdvancedTest.kt | 11 ++++----- .../mozilla/fenix/ui/SettingsBasicsTest.kt | 13 ++-------- .../mozilla/fenix/ui/SettingsHomepageTest.kt | 20 +++++++--------- .../mozilla/fenix/ui/SettingsPrivacyTest.kt | 10 +------- .../mozilla/fenix/ui/SettingsSearchTest.kt | 10 +------- .../mozilla/fenix/ui/SitePermissionsTest.kt | 21 +++++++--------- .../java/org/mozilla/fenix/ui/SmokeTest.kt | 13 +++++----- .../StrictEnhancedTrackingProtectionTest.kt | 13 +++++----- .../mozilla/fenix/ui/TabbedBrowsingTest.kt | 14 ++++------- .../mozilla/fenix/ui/ThreeDotMenuMainTest.kt | 6 +---- .../java/org/mozilla/fenix/ui/TopSitesTest.kt | 9 +------ 30 files changed, 102 insertions(+), 249 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/screenshots/MenuScreenShotTest.kt b/app/src/androidTest/java/org/mozilla/fenix/screenshots/MenuScreenShotTest.kt index 658280433..e73dfd640 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/screenshots/MenuScreenShotTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/screenshots/MenuScreenShotTest.kt @@ -43,8 +43,7 @@ class MenuScreenShotTest : ScreenshotTest() { val localeTestRule = LocaleTestRule() @get:Rule - var mActivityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = mActivityTestRule.featureSettingsHelper + var mActivityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Before fun setUp() { @@ -53,8 +52,6 @@ class MenuScreenShotTest : ScreenshotTest() { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setTCPCFREnabled(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 730e2019e..c1c4a4252 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -47,8 +47,7 @@ class BookmarksTest { } @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Rule @JvmField @@ -61,8 +60,6 @@ class BookmarksTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BrowsingErrorPagesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BrowsingErrorPagesTest.kt index c1728fbf7..2dde0c8f8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BrowsingErrorPagesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BrowsingErrorPagesTest.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri -import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -26,20 +25,12 @@ class BrowsingErrorPagesTest { private val harmfulSiteWarning = getStringResource(R.string.mozac_browser_errorpages_safe_harmful_uri_title) @get: Rule - val mActivityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = mActivityTestRule.featureSettingsHelper + val mActivityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Rule @JvmField val retryTestRule = RetryTestRule(3) - @Before - fun setUp() { - // disabling the jump-back-in pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - } - @SmokeTest @Test fun blockMalwarePageTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt index d2fc9d0c5..4499583a3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CollectionTest.kt @@ -15,7 +15,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.ui.robots.browserScreen @@ -35,23 +34,21 @@ class CollectionTest { private val firstCollectionName = "testcollection_1" private val secondCollectionName = "testcollection_2" private val collectionName = "First Collection" - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule val composeTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule(), - { it.activity }, - ) - - @Before - fun setUp() { // disabling these features to have better visibility of Collections, // and to avoid multiple matches on tab items - featureSettingsHelper.setRecentTabsFeatureEnabled(false) - featureSettingsHelper.setPocketEnabled(false) - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setRecentlyVisitedFeatureEnabled(false) + HomeActivityIntentTestRule( + isPocketEnabled = false, + isJumpBackInCFREnabled = false, + isRecentTabsFeatureEnabled = false, + isRecentlyVisitedFeatureEnabled = false, + ), + ) { it.activity } + @Before + fun setUp() { mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() @@ -62,9 +59,6 @@ class CollectionTest { @After fun tearDown() { mockWebServer.shutdown() - - // resetting modified features enabled setting to default - featureSettingsHelper.resetAllFeatureFlags() } @SmokeTest diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index 8209dae7b..43600d148 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -14,7 +14,6 @@ import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper @@ -41,14 +40,12 @@ class ContextMenusTest { private lateinit var mockWebServer: MockWebServer @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule() + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @Rule @JvmField val retryTestRule = RetryTestRule(3) - private val featureSettingsHelper = FeatureSettingsHelper() - @Before fun setUp() { activityIntentTestRule.activity.applicationContext.settings().shouldShowJumpBackInCFR = false @@ -57,14 +54,11 @@ class ContextMenusTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setTCPCFREnabled(false) } @After fun tearDown() { mockWebServer.shutdown() - featureSettingsHelper.resetAllFeatureFlags() } @SmokeTest diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt index b81f57169..60c7a6f19 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt @@ -12,7 +12,6 @@ import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.getStringResource @@ -22,21 +21,19 @@ import org.mozilla.fenix.ui.robots.navigationToolbar class CrashReportingTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() private val tabCrashMessage = getStringResource(R.string.tab_crash_title_2) @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule(), - { it.activity }, - ) + HomeActivityIntentTestRule( + isPocketEnabled = false, + isJumpBackInCFREnabled = false, + isWallpaperOnboardingEnabled = false, + ), + ) { it.activity } @Before fun setUp() { - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setPocketEnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) - mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() @@ -47,7 +44,6 @@ class CrashReportingTest { @After fun tearDown() { mockWebServer.shutdown() - featureSettingsHelper.resetAllFeatureFlags() } @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt index dbc52ad25..a35433b19 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt @@ -14,7 +14,7 @@ import org.junit.Test import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper +import org.mozilla.fenix.helpers.FeatureSettingsHelperDelegate import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent @@ -47,7 +47,7 @@ class CustomTabsTest { false, ) - private val featureSettingsHelper = FeatureSettingsHelper() + private val featureSettingsHelper = FeatureSettingsHelperDelegate() @Before fun setUp() { @@ -57,7 +57,9 @@ class CustomTabsTest { start() } - featureSettingsHelper.setTCPCFREnabled(false) + featureSettingsHelper.apply { + isTCPCFREnabled = false + }.applyFlagUpdates() } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadFileTypesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadFileTypesTest.kt index d5c4f9388..6545f4adc 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadFileTypesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadFileTypesTest.kt @@ -5,14 +5,11 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri -import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized import org.mozilla.fenix.customannotations.SmokeTest -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.ui.robots.navigationToolbar @@ -27,10 +24,9 @@ class DownloadFileTypesTest(fileName: String) { /* Remote test page managed by Mozilla Mobile QA team at https://github.com/mozilla-mobile/testapp */ private val downloadTestPage = "https://storage.googleapis.com/mobile_test_assets/test_app/downloads.html" private var downloadFile: String = fileName - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityTestRule = HomeActivityIntentTestRule() + val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() companion object { // Creating test data. The test will take each file name as a parameter and run it individually. @@ -48,21 +44,6 @@ class DownloadFileTypesTest(fileName: String) { ) } - @Before - fun setUp() { - // disabling the jump-back-in pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - // disable the TCP CFR that appears when loading webpages and interferes with the tests. - featureSettingsHelper.setTCPCFREnabled(false) - // disabling the PWA CFR on 3rd visit - featureSettingsHelper.disablePwaCFR(true) - } - - @After - fun tearDown() { - featureSettingsHelper.resetAllFeatureFlags() - } - @SmokeTest @Test fun downloadMultipleFileTypesTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index 537bc0c89..ddf3f218c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -16,7 +16,6 @@ import org.junit.rules.TestRule import org.junit.rules.TestWatcher import org.junit.runner.Description import org.mozilla.fenix.customannotations.SmokeTest -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestHelper.deleteDownloadFromStorage import org.mozilla.fenix.ui.robots.browserScreen @@ -34,14 +33,13 @@ import org.mozilla.fenix.ui.robots.notificationShade **/ class DownloadTest { private lateinit var mDevice: UiDevice - private val featureSettingsHelper = FeatureSettingsHelper() /* Remote test page managed by Mozilla Mobile QA team at https://github.com/mozilla-mobile/testapp */ private val downloadTestPage = "https://storage.googleapis.com/mobile_test_assets/test_app/downloads.html" private var downloadFile: String = "" @get:Rule - val activityTestRule = HomeActivityIntentTestRule() + val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() // Making sure to grant storage access for this test running on API 28 @get: Rule @@ -62,12 +60,6 @@ class DownloadTest { @Before fun setUp() { mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - // disabling the jump-back-in pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - // disable the TCP CFR that appears when loading webpages and interferes with the tests. - featureSettingsHelper.setTCPCFREnabled(false) - // disabling the PWA CFR on 3rd visit - featureSettingsHelper.disablePwaCFR(true) // clear all existing notifications notificationShade { mDevice.openNotification() @@ -77,7 +69,6 @@ class DownloadTest { @After fun tearDown() { - featureSettingsHelper.resetAllFeatureFlags() notificationShade { cancelAllShownNotifications() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt index 3ae5256ef..742e68a71 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HistoryTest.kt @@ -39,8 +39,7 @@ class HistoryTest { private lateinit var mDevice: UiDevice @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Before fun setUp() { @@ -52,8 +51,6 @@ class HistoryTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setTCPCFREnabled(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt index 0d0416f03..024398ac5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt @@ -36,8 +36,7 @@ class HomeScreenTest { private lateinit var mockWebServer: MockWebServer @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Rule @JvmField @@ -51,8 +50,6 @@ class HomeScreenTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setTCPCFREnabled(false) } @After @@ -147,8 +144,10 @@ class HomeScreenTest { @Test fun dismissOnboardingUsingHelpTest() { - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) + activityTestRule.applySettingsExceptions { + it.isJumpBackInCFREnabled = false + it.isWallpaperOnboardingEnabled = false + } homeScreen { verifyWelcomeHeader() @@ -175,8 +174,10 @@ class HomeScreenTest { @Test fun verifyPocketHomepageStoriesTest() { - featureSettingsHelper.setRecentTabsFeatureEnabled(false) - featureSettingsHelper.setRecentlyVisitedFeatureEnabled(false) + activityTestRule.applySettingsExceptions { + it.isRecentTabsFeatureEnabled = false + it.isRecentlyVisitedFeatureEnabled = false + } homeScreen { }.dismissOnboarding() @@ -196,8 +197,6 @@ class HomeScreenTest { @Test fun verifyCustomizeHomepageTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt index abc644f0a..e9d4c754e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/MediaNotificationTest.kt @@ -15,7 +15,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper @@ -35,10 +34,9 @@ class MediaNotificationTest { private lateinit var mockWebServer: MockWebServer private lateinit var mDevice: UiDevice - val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityTestRule = HomeActivityTestRule() + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() private lateinit var browserStore: BrowserStore @Rule @@ -56,7 +54,6 @@ class MediaNotificationTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setTCPCFREnabled(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt index e6e870621..d0629660a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt @@ -34,8 +34,7 @@ class NavigationToolbarTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Before fun setUp() { @@ -44,9 +43,6 @@ class NavigationToolbarTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.disablePwaCFR(true) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt index 33bdc168a..6f422c9ca 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/NoNetworkAccessStartupTests.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -26,14 +25,7 @@ import org.mozilla.fenix.ui.robots.navigationToolbar class NoNetworkAccessStartupTests { @get:Rule - val activityTestRule = HomeActivityTestRule(launchActivity = false) - private val featureSettingsHelper = activityTestRule.featureSettingsHelper - - @Before - fun setUp() { - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) - } + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides(launchActivity = false) @After fun tearDown() { @@ -60,7 +52,6 @@ class NoNetworkAccessStartupTests { // Based on STR from https://github.com/mozilla-mobile/fenix/issues/16886 @Test fun networkInterruptedFromBrowserToHomeTest() { - featureSettingsHelper.setJumpBackCFREnabled(false) val url = "example.com" activityTestRule.launchActivity(null) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/PwaTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/PwaTest.kt index 54d661769..4cf9c8584 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/PwaTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/PwaTest.kt @@ -1,14 +1,11 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri -import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.Constants.PackageName.GMAIL_APP import org.mozilla.fenix.helpers.Constants.PackageName.PHONE_APP -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens import org.mozilla.fenix.ui.robots.customTabScreen @@ -16,8 +13,6 @@ import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.pwaScreen class PwaTest { - private val featureSettingsHelper = FeatureSettingsHelper() - /* Updated externalLinks.html to v2.0, changed the hypertext reference to mozilla-mobile.github.io/testapp/downloads for "External link" */ @@ -27,18 +22,7 @@ class PwaTest { private val shortcutTitle = "TEST_APP" @get:Rule - val activityTestRule = HomeActivityIntentTestRule() - - @Before - fun setUp() { - featureSettingsHelper.disablePwaCFR(true) - featureSettingsHelper.setTCPCFREnabled(false) - } - - @After - fun tearDown() { - featureSettingsHelper.resetAllFeatureFlags() - } + val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @SmokeTest @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt index 34a6a9c07..9a8a2b103 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt @@ -37,7 +37,7 @@ class ReaderViewTest { private val estimatedReadingTime = "1 - 2 minutes" @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule() + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @Rule @JvmField diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index e66fb0264..e5dbcbafe 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -49,10 +49,13 @@ class SearchTest { @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityTestRule(), - { it.activity }, - ) - private val featureSettingsHelper = activityTestRule.activityRule.featureSettingsHelper + HomeActivityTestRule( + isPocketEnabled = false, + isJumpBackInCFREnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + ), + ) { it.activity } @Before fun setUp() { @@ -60,10 +63,6 @@ class SearchTest { dispatcher = SearchDispatcher() start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setPocketEnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt index 796da1955..417d54bd3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt @@ -13,7 +13,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestHelper.mDevice @@ -30,7 +29,6 @@ class SettingsAboutTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule val activityIntentTestRule = HomeActivityIntentTestRule() @@ -51,7 +49,6 @@ class SettingsAboutTest { @After fun tearDown() { mockWebServer.shutdown() - featureSettingsHelper.resetAllFeatureFlags() } // Walks through settings menu and sub-menus to ensure all items are present @@ -71,7 +68,9 @@ class SettingsAboutTest { // ABOUT @Test fun verifyRateOnGooglePlayRedirect() { - featureSettingsHelper.setTCPCFREnabled(false) + activityIntentTestRule.applySettingsExceptions { + it.isTCPCFREnabled = false + } homeScreen { }.openThreeDotMenu { @@ -86,8 +85,10 @@ class SettingsAboutTest { @Test fun verifyAboutFirefoxPreview() { - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) + activityIntentTestRule.applySettingsExceptions { + it.isJumpBackInCFREnabled = false + it.isTCPCFREnabled = false + } homeScreen { }.openThreeDotMenu { }.openSettings { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt index c621a15c6..eac48d3b3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt @@ -14,7 +14,6 @@ import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.getEnhancedTrackingProtectionAsset @@ -31,10 +30,9 @@ import org.mozilla.fenix.ui.robots.navigationToolbar */ class SettingsAddonsTest { private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityTestRule = HomeActivityIntentTestRule() + val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @Before fun setUp() { @@ -42,15 +40,11 @@ class SettingsAddonsTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setTCPCFREnabled(false) } @After fun tearDown() { mockWebServer.shutdown() - - featureSettingsHelper.resetAllFeatureFlags() } // Walks through settings add-ons menu to ensure all items are present diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt index 5cbefd2ef..65c3dbea7 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt @@ -13,7 +13,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper @@ -30,10 +29,12 @@ class SettingsAdvancedTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule() + val activityIntentTestRule = HomeActivityIntentTestRule( + isPocketEnabled = false, + isTCPCFREnabled = false, + ) @Before fun setUp() { @@ -42,15 +43,11 @@ class SettingsAdvancedTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setPocketEnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) } @After fun tearDown() { mockWebServer.shutdown() - - featureSettingsHelper.resetAllFeatureFlags() } // Walks through settings menu and sub-menus to ensure all items are present diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt index 813dda636..24a6fc292 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt @@ -15,7 +15,6 @@ import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper @@ -23,8 +22,8 @@ import org.mozilla.fenix.helpers.TestAssetHelper.getLoremIpsumAsset import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice -import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources +import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged import org.mozilla.fenix.ui.SettingsBasicsTest.CreditCard.MOCK_CREDIT_CARD_NUMBER import org.mozilla.fenix.ui.SettingsBasicsTest.CreditCard.MOCK_EXPIRATION_MONTH import org.mozilla.fenix.ui.SettingsBasicsTest.CreditCard.MOCK_EXPIRATION_YEAR @@ -47,7 +46,6 @@ import java.util.Locale class SettingsBasicsTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() object CreditCard { const val MOCK_CREDIT_CARD_NUMBER = "5555555555554444" @@ -58,7 +56,7 @@ class SettingsBasicsTest { } @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule() + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @Before fun setUp() { @@ -66,18 +64,11 @@ class SettingsBasicsTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) } @After fun tearDown() { mockWebServer.shutdown() - - // resetting modified features enabled setting to default - featureSettingsHelper.resetAllFeatureFlags() } private fun getUiTheme(): Boolean { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt index 867435b31..42ee74c5f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt @@ -12,7 +12,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset @@ -27,10 +26,9 @@ import org.mozilla.fenix.ui.robots.navigationToolbar */ class SettingsHomepageTest { private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule(skipOnboarding = true) + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) @Rule @JvmField @@ -42,17 +40,11 @@ class SettingsHomepageTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) } @After fun tearDown() { mockWebServer.shutdown() - - // resetting modified features enabled setting to default - featureSettingsHelper.resetAllFeatureFlags() } @Test @@ -90,7 +82,9 @@ class SettingsHomepageTest { @Test fun verifyRecentlyVisitedOptionTest() { - featureSettingsHelper.setRecentTabsFeatureEnabled(false) + activityIntentTestRule.applySettingsExceptions { + it.isRecentTabsFeatureEnabled = false + } val genericURL = getGenericAsset(mockWebServer, 1) navigationToolbar { @@ -107,8 +101,10 @@ class SettingsHomepageTest { @Test fun verifyPocketOptionTest() { - featureSettingsHelper.setRecentTabsFeatureEnabled(false) - featureSettingsHelper.setRecentlyVisitedFeatureEnabled(false) + activityIntentTestRule.applySettingsExceptions { + it.isRecentTabsFeatureEnabled = false + it.isRecentlyVisitedFeatureEnabled = false + } val genericURL = getGenericAsset(mockWebServer, 1) navigationToolbar { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt index e5f8244e3..2e82e68ee 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt @@ -18,7 +18,6 @@ import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset @@ -47,10 +46,9 @@ class SettingsPrivacyTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer private val pageShortcutName = generateRandomString(5) - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityTestRule = HomeActivityIntentTestRule(skipOnboarding = true) + val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) @Before fun setUp() { @@ -60,11 +58,6 @@ class SettingsPrivacyTest { start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) - featureSettingsHelper.disablePwaCFR(true) - if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) { val autofillManager: AutofillManager = appContext.getSystemService(AutofillManager::class.java) @@ -75,7 +68,6 @@ class SettingsPrivacyTest { @After fun tearDown() { mockWebServer.shutdown() - featureSettingsHelper.resetAllFeatureFlags() } // Walks through settings privacy menu and sub-menus to ensure all items are present diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index bfc1b71ed..79218bc33 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -9,7 +9,6 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset @@ -20,11 +19,10 @@ import org.mozilla.fenix.ui.robots.navigationToolbar class SettingsSearchTest { private lateinit var mockWebServer: MockWebServer private lateinit var searchMockServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule val activityTestRule = AndroidComposeTestRule( - HomeActivityIntentTestRule(), + HomeActivityIntentTestRule.withDefaultSettingsOverrides(), ) { it.activity } @Before @@ -33,17 +31,11 @@ class SettingsSearchTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) - featureSettingsHelper.setTCPCFREnabled(false) } @After fun tearDown() { mockWebServer.shutdown() - - // resetting modified features enabled setting to default - featureSettingsHelper.resetAllFeatureFlags() } @Test diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt index a314d860d..03af517c3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt @@ -8,10 +8,11 @@ import android.Manifest import android.content.Context import android.hardware.camera2.CameraManager import android.media.AudioManager +import android.os.Build import androidx.core.net.toUri +import androidx.test.filters.SdkSuppress import androidx.test.rule.GrantPermissionRule import org.junit.Assume.assumeTrue -import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -34,8 +35,12 @@ class SitePermissionsTest { private val micManager = appContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule( + isJumpBackInCFREnabled = false, + isPWAsPromptEnabled = false, + isTCPCFREnabled = false, + isDeleteSitePermissionsEnabled = true, + ) @get:Rule val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant( @@ -50,15 +55,7 @@ class SitePermissionsTest { @get: Rule val retryTestRule = RetryTestRule(3) - @Before - fun setUp() { - // disabling the new homepage pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.deleteSitePermissions(true) - featureSettingsHelper.disablePwaCFR(true) - } - + @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P, codeName = "P") @SmokeTest @Test fun audioVideoPermissionChoiceOnEachRequestTest() { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 44936d13f..0bacc89b5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -26,7 +26,7 @@ import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP -import org.mozilla.fenix.helpers.FeatureSettingsHelper +import org.mozilla.fenix.helpers.FeatureSettingsHelperDelegate import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.RetryTestRule @@ -62,7 +62,7 @@ class SmokeTest { private lateinit var mockWebServer: MockWebServer private val customMenuItem = "TestMenuItem" private lateinit var browserStore: BrowserStore - private val featureSettingsHelper = FeatureSettingsHelper() + private val featureSettingsHelper = FeatureSettingsHelperDelegate() @get:Rule(order = 0) val activityTestRule = AndroidComposeTestRule( @@ -88,9 +88,11 @@ class SmokeTest { browserStore = activityTestRule.activity.components.core.store // disabling the new homepage pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) + featureSettingsHelper.apply { + isJumpBackInCFREnabled = false + isTCPCFREnabled = false + isWallpaperOnboardingEnabled = false + }.applyFlagUpdates() mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mockWebServer = MockWebServer().apply { @@ -673,7 +675,6 @@ class SmokeTest { // caution when making changes to it, so they don't block the builds @Test fun noHistoryInPrivateBrowsingTest() { - FeatureSettingsHelper().setTCPCFREnabled(false) val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) homeScreen { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt index b0a84afe1..5182c61d3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt @@ -11,6 +11,7 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.ETPPolicy import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.ui.robots.enhancedTrackingProtection @@ -35,8 +36,12 @@ class StrictEnhancedTrackingProtectionTest { private lateinit var mockWebServer: MockWebServer @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule( + isJumpBackInCFREnabled = false, + isTCPCFREnabled = false, + isWallpaperOnboardingEnabled = false, + etpPolicy = ETPPolicy.STRICT, + ) @Before fun setUp() { @@ -44,10 +49,6 @@ class StrictEnhancedTrackingProtectionTest { dispatcher = AndroidAssetDispatcher() start() } - featureSettingsHelper.setStrictETPEnabled() - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) } @After diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt index 96d552972..1be555141 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt @@ -45,8 +45,7 @@ class TabbedBrowsingTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. @get:Rule - val activityTestRule = HomeActivityTestRule() - private val featureSettingsHelper = activityTestRule.featureSettingsHelper + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Rule @JvmField @@ -54,11 +53,6 @@ class TabbedBrowsingTest { @Before fun setUp() { - // disabling the new homepage pop-up that interferes with the tests. - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) - mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() @@ -182,8 +176,10 @@ class TabbedBrowsingTest { @Test fun verifyUndoSnackBarTest() { // disabling these features because they interfere with the snackbar visibility - featureSettingsHelper.setPocketEnabled(false) - featureSettingsHelper.setRecentTabsFeatureEnabled(false) + activityTestRule.applySettingsExceptions { + it.isPocketEnabled = false + it.isRecentTabsFeatureEnabled = false + } val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt index 01aaf0d93..a27ddc7b6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ThreeDotMenuMainTest.kt @@ -10,7 +10,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.ui.robots.homeScreen @@ -23,15 +22,12 @@ class ThreeDotMenuMainTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. private lateinit var mockWebServer: MockWebServer - val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityTestRule = HomeActivityTestRule() + val activityTestRule = HomeActivityTestRule.withDefaultSettingsOverrides() @Before fun setUp() { - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() start() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt index 6513840e5..e0c94db21 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt @@ -14,7 +14,6 @@ import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset @@ -36,10 +35,9 @@ import org.mozilla.fenix.ui.robots.navigationToolbar class TopSitesTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer - private val featureSettingsHelper = FeatureSettingsHelper() @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule(skipOnboarding = true) + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) @get:Rule val retryTestRule = RetryTestRule(3) @@ -51,16 +49,11 @@ class TopSitesTest { dispatcher = AndroidAssetDispatcher() start() } - - featureSettingsHelper.setJumpBackCFREnabled(false) - featureSettingsHelper.setTCPCFREnabled(false) - featureSettingsHelper.setShowWallpaperOnboarding(false) } @After fun tearDown() { mockWebServer.shutdown() - featureSettingsHelper.resetAllFeatureFlags() } @SmokeTest From db79ad5cb0abb16c8f19cb77896ad4bfd60496d1 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Fri, 30 Sep 2022 10:38:00 +0300 Subject: [PATCH 099/407] For #26884 - Re-enable selectAllAndCopyTextTest and copyTextTest With the other changes from this patch they should now pass. --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 0bacc89b5..48d59a41c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -879,7 +879,6 @@ class SmokeTest { mDevice.pressBack() } - @Ignore("Failing: https://github.com/mozilla-mobile/fenix/issues/26884") @Test fun copyTextTest() { val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -899,7 +898,6 @@ class SmokeTest { } } - @Ignore("Failing: https://github.com/mozilla-mobile/fenix/issues/26884") @Test fun selectAllAndCopyTextTest() { val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1) From 390201b9bc319d8c24c377d94471d73791dc7790 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 3 Oct 2022 14:55:55 +0000 Subject: [PATCH 100/407] Update to Android-Components 107.0.20221003143033. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f90af9e93..0a46ce15e 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221002190240" + const val VERSION = "107.0.20221003143033" } From 69849cafa4a827224a1cfc14d6a3b2b27f5c2696 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Tue, 4 Oct 2022 02:34:11 +0200 Subject: [PATCH 101/407] Import l10n. (#27260) --- app/src/main/res/values-en-rCA/strings.xml | 102 +++++++++++++-------- app/src/main/res/values-es/strings.xml | 82 ++++++++++++----- app/src/main/res/values-hsb/strings.xml | 11 +-- app/src/main/res/values-ja/strings.xml | 36 +++----- app/src/main/res/values-lo/strings.xml | 4 + app/src/main/res/values-nn-rNO/strings.xml | 53 ++++++----- app/src/main/res/values-su/strings.xml | 12 +++ 7 files changed, 188 insertions(+), 112 deletions(-) diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index ba219020e..577d648bc 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -40,7 +40,9 @@ - Recent bookmarks + Recent bookmarks + + Recently saved Show all saved bookmarks @@ -77,6 +79,12 @@ Dismiss + + + Our most powerful privacy feature yet isolates cross-site trackers. + + Learn about Total Cookie Protection + Camera access needed. Go to Android settings, tap permissions, and tap allow. @@ -135,6 +143,8 @@ See all synced tabs Synced device + + Remove Remove @@ -250,24 +260,47 @@ - What’s new in %1$s + What’s new in %1$s - It’s now easier to pick back up where you left off. + It’s now easier to pick back up where you left off. - Personalized %1$s homepage + Personalized %1$s homepage - Jump to your open tabs, bookmarks and browsing history. + Jump to your open tabs, bookmarks and browsing history. - Clean, organized tabs + Clean, organized tabs - Clear away tab clutter with improved layout and auto-closing tabs. + Clear away tab clutter with improved layout and auto-closing tabs. - Recent searches + Recent searches - Revisit your latest searches from your homepage and tabs. + Revisit your latest searches from your homepage and tabs. - Your personalized Firefox homepage now makes it easier to pick up where you left off. Find your recent tabs, bookmarks and search results. + Your personalized Firefox homepage now makes it easier to pick up where you left off. Find your recent tabs, bookmarks and search results. + + + Meet your personalized homepage. Recent tabs, bookmarks, and search results will appear here. + + Welcome to an independent internet + + Welcome to a more personal internet + + More colours. Better privacy. Same commitment to people over profits. + + Hop from phone to laptop and back + + Switching screens is easier than ever + + Pick up where you left off with tabs from other devices now on your homepage. + + Get started + + Sign in + + Skip + + Your tabs are syncing! Pick up where you left off on your other device. @@ -357,8 +390,6 @@ Customize - Sync bookmarks, history, and more with your Firefox Account - Sign in to sync tabs, bookmarks, passwords, and more. Firefox Account @@ -443,10 +474,10 @@ View - Change wallpaper by tapping Firefox homepage logo + Change wallpaper by tapping Firefox homepage logo - Firefox logo - change the wallpaper, button + Firefox logo - change the wallpaper, button @@ -528,8 +559,6 @@ Allows Mozilla to install and run studies - - Turn on Sync Sync and save your data @@ -726,8 +755,6 @@ Open tabs menu Save tabs to collection - - Tab menu Delete collection @@ -747,9 +774,6 @@ %1$s (Private Mode) - - Other tabs - Enter search terms @@ -778,16 +802,16 @@ No history here - Synced from other devices + Synced from other devices - From other devices + From other devices - Sign in to see history synced from your other devices. + Sign in to see history synced from your other devices. - Sign in + Sign in - Or create a Firefox account to start syncing]]> + Or create a Firefox account to start syncing]]> @@ -1151,8 +1175,6 @@ Quit - - This will delete all of your browsing data. Time range to delete @@ -1187,19 +1209,19 @@ - Welcome to %s! + Welcome to %s! - Sync Firefox between devices + Sync Firefox between devices - Bring bookmarks, history, and passwords to %1$s on this device. + Bring bookmarks, history, and passwords to %1$s on this device. - Sign up + Sign up Sync is on - Always-on privacy + Always-on privacy - %1$s automatically stops companies from secretly following you around the web. + %1$s automatically stops companies from secretly following you around the web. Standard (default) @@ -1211,12 +1233,12 @@ Pick your toolbar placement - Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. + Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. - Your privacy + Your privacy - We’ve designed %s to give you control over what you share online and what you share with us. + We’ve designed %s to give you control over what you share online and what you share with us. Read our privacy notice @@ -1306,6 +1328,8 @@ All third-party cookies (may cause websites to break) All cookies (will cause websites to break) + + Isolate cross-site cookies Tracking content @@ -1328,8 +1352,12 @@ Limits the ability of social networks to track your browsing activity around the web. Cross-Site Tracking Cookies + + Cross-Site Cookies Blocks cookies that ad networks and analytics companies use to compile your browsing data across many sites. + + Total Cookie Protection isolates cookies to the site you’re on so trackers like ad networks can’t use them to follow you across sites. Cryptominers diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 01780a991..c5c1b44c6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -288,12 +288,16 @@ Descubre tu página de inicio personalizada. Las pestañas recientes, marcadores y resultados de búsqueda aparecerán aquí. - Te damos la bienvenida a un internet independiente + Te damos la bienvenida a un internet independiente + + Te damos la bienvenida a un Internet más personal Más colores. Mejor privacidad. Mismo compromiso con las personas por encima de los beneficios. - Salta del teléfono al ordenador y viceversa + Salta del teléfono al ordenador y viceversa + + Cambiar de pantalla es más fácil que nunca Continúa donde lo dejaste con pestañas de otros dispositivos ahora en tu página de inicio. @@ -395,8 +399,6 @@ Personalizar - Sincroniza marcadores, historial y más con tu cuenta Firefox - Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. Cuenta Firefox @@ -481,12 +483,35 @@ ¡Fondo de pantalla actualizado! Ver + + No se ha podido descargar el fondo de pantalla + + Reintentar + + No se ha podido cambiar el fondo de pantalla + + Saber más Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox Logotipo de Firefox - cambiar el fondo de pantalla, botón + + %s clásico + + Edición limitada + + La nueva colección Voces Independientes. %s + + La nueva colección Voces Independientes. + + Prueba un toque de color + + Elige un fondo de pantalla que te represente. + + Explorar más fondos de pantalla + El complemento no es compatible @@ -571,9 +596,6 @@ Permite a Mozilla instalar y ejecutar estudios - - Activar Sync - Sincronizar y guardar tus datos @@ -790,9 +812,6 @@ %1$s (modo privado) - - Otras pestañas - Introducir términos de búsqueda @@ -1220,9 +1239,6 @@ Salir - - Se eliminarán todos tus datos de navegación. - Intervalo de tiempo a eliminar @@ -1258,20 +1274,34 @@ - ¡Te damos la bienvenida a %s! + ¡Te damos la bienvenida a %s! + + Te damos la bienvenida a un mejor Internet + + Un navegador creado para las personas, no para el lucro. - Sincronizar Firefox entre dispositivos + Sincronizar Firefox entre dispositivos + + Continúa donde lo dejaste. - Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + Traer marcadores, historial y contraseñas a %1$s en este dispositivo. + + Sincroniza pestañas y contraseñas entre dispositivos para cambiar de pantalla sin interrupciones. - Registrarse + Registrarse + + Iniciar sesión Sync está activado - Privacidad siempre activada + Privacidad siempre activada + + Protección de privacidad de manera predeterminada - %1$s bloquea automáticamente a las compañías que te siguen en secreto por la web. + %1$s bloquea automáticamente a las compañías que te siguen en secreto por la web. + + Incluye Total Cookie Protection para evitar que los rastreadores usen cookies para espiarte entre sitios. Estándar (predeterminado) @@ -1283,15 +1313,23 @@ Escoge la posición de la barra de herramientas - Pon la barra de herramientas a tu alcance. Mantenla abajo, o muévela hacia arriba. + Pon la barra de herramientas a tu alcance. Mantenla abajo, o muévela hacia arriba. + + Mantenlo en la parte inferior o muévelo a la parte superior. - Tu privacidad + Tu privacidad + + Tú controlas tus datos - Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros. + + Firefox te da control sobre lo que compartes en línea y lo que compartes con nosotros. Lee nuestro aviso de privacidad + + ¿Listo para abrir un Internet increíble? Comienza a navegar diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index 877395be9..872de2ee1 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -391,8 +391,6 @@ Přiměrić - Synchronizujće zapołožki, historiju a wjace ze swojim kontom Firefox - Zregistrujće so, zo byšće rajtarki, zapołožki, hesła a dalše synchronizował. Konto Firefox @@ -589,8 +587,6 @@ Mozilla dowolić, studije instalować a přewjesć - - Synchronizaciju zmóžnić Synchronizować a waše daty składować @@ -812,9 +808,6 @@ %1$s (priwatny modus) - - Druhe rajtarki - Pytanske wurazy zapodać @@ -1220,8 +1213,6 @@ Skónčić - - To wšě waše přehladowanske daty zhaša. Časowy wotrězk za zhašenje @@ -1292,6 +1283,8 @@ Wubjerće poziciju za swoju symbolowu lajstu Pozicioněrujće symbolowu lajstu, zo móžeće ju lochko dosahnyć. Wobchowajće ju deleka abo přesuńće ju horje. + + Deleka wostajić abo horje přesunyć. Waša priwatnosć diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 7dac9330c..073e1d397 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -290,15 +290,15 @@ パーソナライズされたホームページをご覧ください。最近使ったタブ、ブックマーク、検索結果がここに表示されます。 - 支配を受けない自由なインターネットへようこそ + 支配を受けない自由なインターネットへようこそ - 多種多彩、プライバシー保護、利益を超えて人々への平等なコミットメント。 + 多様なカラー、より優れたプライバシー保護、利益を超えて人々への平等なコミットメント。 - スマートフォンとラップトップの間を行ったり来たり + スマートフォンとラップトップの間を行ったり来たり ホームページ上で、他の端末のタブの中断したところから再開できます。 - はじめに + はじめる ログイン @@ -395,8 +395,6 @@ カスタマイズ - ブックマーク、履歴などを Firefox アカウントと同期します - ログインしてタブやブックマーク、パスワードなどを同期しましょう。 Firefox アカウント @@ -571,9 +569,6 @@ 調査機能のインストールと実行を Mozilla に許可する - - Sync を有効化 - 同期してデータを保存 @@ -791,9 +786,6 @@ %1$s (プライベートモード) - - 他のタブ - 検索語を入力 @@ -1208,8 +1200,6 @@ 終了 - - この操作はすべての閲覧データを削除します。 削除する期間 @@ -1245,19 +1235,19 @@ - %s へようこそ! + %s へようこそ! - 端末間で Firefox を同期 + 端末間で Firefox を同期 - この端末の %1$s とブックマーク、履歴、パスワードを同期します。 + この端末の %1$s とブックマーク、履歴、パスワードを同期します。 - アカウント登録 + アカウント登録 Sync が有効です - プライバシー重視 + プライバシー重視 - %1$s はウェブ上であなたを密かに追跡する組織を自動的に遮断します。 + %1$s はウェブ上であなたを密かに追跡する組織を自動的に遮断します。 標準 (既定) @@ -1269,12 +1259,12 @@ ツールバーの配置を選べます - ツールバーを簡単に手の届く位置に置きましょう。画面下または上に移動できます。 + ツールバーを簡単に手の届く位置に置きましょう。画面下または上に移動できます。 - あなたのプライバシー + あなたのプライバシー - %s は、あなたがオンラインで共有するものと、私たちと共有するものをコントロールできるように設計されています。 + %s は、あなたがオンラインで共有するものと、私たちと共有するものをコントロールできるように設計されています。 個人情報保護方針を読む diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 05a9f9936..a2552e259 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1290,6 +1290,8 @@ ເຂັ້ມງວດ + + ປິດກັ້ນຕົວຕິດຕາມຫຼາຍຂຶ້ນເພື່ອໃຫ້ຫນ້າໂຫລດໄວຂຶ້ນ, ແຕ່ບາງຫນ້າທີ່ຢູ່ໃນຫນ້າອາດຈະພັງ. ເລືອກການຈັດວາງແຖບເຄື່ອງມືຂອງທ່ານ @@ -1864,6 +1866,8 @@ ຮອດຂີດຈຳກັດທາງລັດແລ້ວ + + ເພື່ອເພີ່ມທາງລັດໃໝ່, ເອົາອັນໃດອັນໜຶ່ງອອກ. ແຕະໃສ່ເວັບໄຊທ໌ຄ້າງໄວ້ ແລະເລືອກເອົາອອກ. ໂອເຄ, ເຂົ້າໃຈແລ້ວ diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index fe43ca106..4201cbf6c 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -278,9 +278,9 @@ Den personlege Firefox-startsida di gjer det no lettare å fortsetje der du slutta. Finn dei siste fanene, bokmerka og søkjeresultata. - Velkomen til eit uavhengig internett + Velkomen til eit uavhengig internett - Byt frå telefonen til datamaskina og tilbake + Byt frå telefonen til datamaskina og tilbake Kom i gang @@ -379,8 +379,6 @@ Tilpass - Synkroniser bokmerke, historikk og meir med Firefox-kontoen din - Logg inn for å synkronisere faner, bokmerke, passord med meir. Firefox-konto @@ -465,6 +463,10 @@ Vis + + Prøv igjen + + Les meir Endre bakgrunnsbilde ved å trykkje på Firefox-logoen på startsida @@ -472,6 +474,17 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo - knapp for å endre bakgrunnsbilde + + Klassisk %s + + Avgrensa utgåve + + Prøv ein fargeklatt + + Vel det perfekte bakgrunnsbildet for deg. + + Utforsk fleire bakgrunnsbilde + Tillegget er ikkje støtta @@ -553,9 +566,6 @@ Tillèt Mozilla å installere og køyre undersøkingar - - Slå på Sync - Synkroniser og lagre dataa dine @@ -777,9 +787,6 @@ %1$s (privatmodus) - - Andre faner - Skriv inn søkjetekst @@ -1188,8 +1195,6 @@ Avslutt - - Dette vil slette alle nettleserdataa dine. Tidsrom for sletting @@ -1224,22 +1229,28 @@ - Velkomen til %s! + Velkomen til %s! - Synkroniser Firefox mellom einingar + Synkroniser Firefox mellom einingar + + Hald fram der du slutta - Ta med bokmerke, historikk og passord til %1$s på denne eininga. + Ta med bokmerke, historikk og passord til %1$s på denne eininga. - Registrer deg + Registrer deg + + Logg inn Synkronisering er på - Alltid med personvern + Alltid med personvern + + Personvernsikring som standard - %1$s stoppar selskap automatisk frå å spore aktivitetane dine på nettet i det skjulte. + %1$s stoppar selskap automatisk frå å spore aktivitetane dine på nettet i det skjulte. Standard (standard) @@ -1251,12 +1262,12 @@ Vel plassering for verktøylinja - Plassere verktøylinja innanfor rekkjevidde. Ha henne i botn eller topp. + Plassere verktøylinja innanfor rekkjevidde. Ha henne i botn eller topp. - Ditt personvern + Ditt personvern - Vi har utvikla %s for å gi deg kontroll over det du deler på nettet og kva du deler med oss. + Vi har utvikla %s for å gi deg kontroll over det du deler på nettet og kva du deler med oss. Les personvernmerknaden vår diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index dc28a514e..8e9609cdb 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -77,6 +77,12 @@ Tutup + + + Pitur pripasi pangwedelna anu sakaligus meungpeuk palacak meuntas-loka. + + Leuwih teleb ngeunaan Total Cookie Protection + Butuh aksés kaméra. Buka setélan Android, toél idin, laju toél idinan. @@ -1238,6 +1244,10 @@ Wilujeng sumping di %s! + + Wilujeng sumping di internét anu leuwih hadé + + Panyungsi anu diwangun pikeun jalma, lain bati. Singkronkeun Firefox sakur parabot @@ -1269,6 +1279,8 @@ Angger di handap, atawa pindahkeun ka luhur. Salindungan anjeun + + Anjeun ngadalikeun data anjeun Kami geus ngarancang %s sangkan anjeun bisa ngatur naon anu dibagikeun onlén jeung naon anu dibagikeun ka kami. From 31e9f69aae8d2830a8e649cf050bdb482d0b9d12 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Thu, 29 Sep 2022 14:46:20 +0300 Subject: [PATCH 102/407] For #27129 - Fix accessibility for default wallpaper thumbnail --- .../settings/wallpaper/WallpaperSettings.kt | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt index a30a77964..3d9f8438b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt @@ -40,6 +40,8 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -257,6 +259,21 @@ private fun WallpaperThumbnailItem( // Completely avoid drawing the item if a bitmap cannot be loaded and is required if (bitmap == null && wallpaper != defaultWallpaper) return + val description = stringResource( + R.string.wallpapers_item_name_content_description, + wallpaper.name, + ) + + // For the default wallpaper to be accessible, we should set the content description for + // the Surface instead of the thumbnail image + val contentDescriptionModifier = if (bitmap == null) { + Modifier.semantics { + contentDescription = description + } + } else { + Modifier + } + Surface( elevation = 4.dp, shape = thumbnailShape, @@ -265,16 +282,14 @@ private fun WallpaperThumbnailItem( .fillMaxWidth() .aspectRatio(aspectRatio) .then(border) - .clickable { onSelect(wallpaper) }, + .clickable { onSelect(wallpaper) } + .then(contentDescriptionModifier), ) { bitmap?.let { Image( bitmap = it.asImageBitmap(), contentScale = ContentScale.FillBounds, - contentDescription = stringResource( - R.string.wallpapers_item_name_content_description, - wallpaper.name, - ), + contentDescription = description, modifier = Modifier.fillMaxSize(), alpha = if (isLoading) loadingOpacity else 1.0f, ) From 8cf20cc6c6247a6c887e8add628ba47493e43427 Mon Sep 17 00:00:00 2001 From: sv-ohorvath Date: Fri, 30 Sep 2022 16:40:43 +0300 Subject: [PATCH 103/407] No issue: adds new onboarding smoke tests --- .../fenix/ui/OnboardingFeaturesTest.kt | 50 +++++++++++++++++++ .../fenix/ui/robots/HomeScreenRobot.kt | 49 ++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt new file mode 100644 index 000000000..877d3f95e --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt @@ -0,0 +1,50 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.ui.robots.homeScreen + +/** + * Tests for verifying the new onboarding features. + * Note: This involves setting the feature flags on for the onboarding dialog and + * other CFRs which are disabled elsewhere. + * + */ +class OnboardingFeaturesTest { + + @get:Rule + val activityTestRule = AndroidComposeTestRule( + HomeActivityTestRule(isHomeOnboardingDialogEnabled = true), + ) { it.activity } + + @SmokeTest + @Test + fun upgradingUsersOnboardingScreensTest() { + homeScreen { + verifyUpgradingUserOnboardingFirstScreen(activityTestRule) + clickGetStartedButton(activityTestRule) + verifyUpgradingUserOnboardingSecondScreen(activityTestRule) + clickSkipButton(activityTestRule) + verifyHomeScreen() + } + } + + @SmokeTest + @Test + fun upgradingUsersOnboardingSignInButtonTest() { + homeScreen { + verifyUpgradingUserOnboardingFirstScreen(activityTestRule) + clickGetStartedButton(activityTestRule) + verifyUpgradingUserOnboardingSecondScreen(activityTestRule) + }.clickUpgradingUserOnboardingSignInButton(activityTestRule) { + verifyTurnOnSyncMenu() + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index ab40ce23a..23c4d5814 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -11,6 +11,7 @@ import android.widget.EditText import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView @@ -132,6 +133,44 @@ class HomeScreenRobot { fun verifyPrivacyNoticeButton() = assertPrivacyNoticeButton() fun verifyStartBrowsingButton() = assertStartBrowsingButton() + // Upgrading users onboarding dialog + fun verifyUpgradingUserOnboardingFirstScreen(testRule: ComposeTestRule) { + testRule.also { + it.onNodeWithText(getStringResource(R.string.onboarding_home_welcome_title_2)) + .assertIsDisplayed() + + it.onNodeWithText(getStringResource(R.string.onboarding_home_welcome_description)) + .assertIsDisplayed() + + it.onNodeWithText(getStringResource(R.string.onboarding_home_get_started_button)) + .assertIsDisplayed() + } + } + + fun clickGetStartedButton(testRule: ComposeTestRule) = + testRule.onNodeWithText(getStringResource(R.string.onboarding_home_get_started_button)).performClick() + + fun verifyUpgradingUserOnboardingSecondScreen(testRule: ComposeTestRule) { + testRule.also { + it.onNodeWithText(getStringResource(R.string.onboarding_home_sync_title_3)) + .assertIsDisplayed() + + it.onNodeWithText(getStringResource(R.string.onboarding_home_sync_description)) + .assertIsDisplayed() + + it.onNodeWithText(getStringResource(R.string.onboarding_home_sign_in_button)) + .assertIsDisplayed() + + it.onNodeWithText(getStringResource(R.string.onboarding_home_skip_button)) + .assertIsDisplayed() + } + } + + fun clickSkipButton(testRule: ComposeTestRule) = + testRule + .onNodeWithText(getStringResource(R.string.onboarding_home_skip_button)) + .performClick() + fun verifyPrivateSessionMessage() = assertPrivateSessionMessage() fun verifyExistingTopSitesList() = assertExistingTopSitesList() @@ -354,6 +393,16 @@ class HomeScreenRobot { return SearchRobot.Transition() } + fun clickUpgradingUserOnboardingSignInButton( + testRule: ComposeTestRule, + interact: SyncSignInRobot.() -> Unit, + ): SyncSignInRobot.Transition { + testRule.onNodeWithText("Sign in").performClick() + + SyncSignInRobot().interact() + return SyncSignInRobot.Transition() + } + fun togglePrivateBrowsingMode() { mDevice.findObject(UiSelector().resourceId("$packageName:id/privateBrowsingButton")) .waitForExists( From ec85814ce36ec8a33a4210693635ad7bfac944f6 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 4 Oct 2022 15:22:31 +0000 Subject: [PATCH 104/407] Update to Android-Components 107.0.20221004145201. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0a46ce15e..ba0f852b3 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221003143033" + const val VERSION = "107.0.20221004145201" } From 49791c377464e685468df47ed3f56b1dd5291de8 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 5 Oct 2022 02:37:58 +0200 Subject: [PATCH 105/407] Import l10n. (#27271) --- app/src/main/res/values-dsb/strings.xml | 11 +--- app/src/main/res/values-in/strings.xml | 81 ++++++++++++++++++------- 2 files changed, 62 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 018955e73..92c6eb99c 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -391,8 +391,6 @@ Pśiměriś - Synchronizěrujśo cytańske znamjenja, historiju a wěcej ze swójim kontom Firefox - Zregistrěrujśo se, aby rejtariki, cytańske znamjenja, gronidła a dalšne synchronizěrował. Konto Firefox @@ -587,8 +585,6 @@ Mozilla dowóliś, studije instalěrowaś a pśewjasć - - Synchronizaciju zmóžniś Synchronizěrowaś a waše daty składowaś @@ -807,9 +803,6 @@ %1$s (priwatny modus) - - Druge rejtariki - Pytańske wuraze zapódaś @@ -1213,8 +1206,6 @@ Skóńcyś - - To wšykne waše pśeglědowańske daty wulašujo. Casowy wótrězk za lašowanje @@ -1286,6 +1277,8 @@ Pozicioněrujśo symbolowu rědku w swójej bliskosći. Wobchowajśo ju dołojce abo pśesuńśo ju górjej. + + Dołojce wóstajiś abo górjej pśesunuś. Waša priwatnosć diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 80863d4c7..8c2d2ce9c 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -287,11 +287,15 @@ Temui beranda pribadi Anda. Tab, markah, dan hasil pencarian terkini akan muncul di sini. - Selamat datang di internet yang independen + Selamat datang di internet yang independen + + Selamat datang di Internet yang lebih pribadi Lebih banyak warna. Privasi yang lebih baik. Komitmen yang sama pada masyarakat di atas laba. - Lompat dari ponsel ke laptop dan sebaliknya + Lompat dari ponsel ke laptop dan sebaliknya + + Beralih layar lebih mudah dari sebelumnya Lanjutkan dari bagian terakhir yang Anda tinggalkan dengan tab dari perangkat lain sekarang di beranda Anda. @@ -394,8 +398,6 @@ Ubahsuai - Sinkronkan markah, riwayat, dan lainnya dengan Akun Firefox Anda - Masuk untuk menyinkronkan tab, markah, sandi, dan yang lainnya. Firefox Account @@ -480,12 +482,35 @@ Wallpaper diperbarui! Tampilkan + + Tidak dapat mengunduh wallpaper + + Coba lagi + + Tidak dapat mengubah wallpaper + + Pelajari lebih lanjut Ubah wallpaper dengan mengetuk logo beranda Firefox Logo Firefox - ubah wallpaper, tombol + + %s Klasik + + Edisi Terbatas + + Koleksi Suara Independen baru. %s + + Koleksi Suara Independen baru. + + Coba berbagai ragam warna + + Pilih wallpaper yang cocok untuk Anda. + + Telusuri lebih banyak wallpaper + Pengaya tidak didukung @@ -568,9 +593,6 @@ Izinkan Mozilla untuk memasang dan menjalankan kajian - - Aktifkan Sinkronisasi - Sinkronkan dan simpan data Anda @@ -787,9 +809,6 @@ %1$s (Mode Privat) - - Tab lainnya - Masukkan istilah pencarian @@ -1200,8 +1219,6 @@ Keluar - - Ini akan menghapus semua data penjelajahan Anda. Rentang waktu untuk menghapus @@ -1237,20 +1254,34 @@ - Selamat datang di %s! + Selamat datang di %s! + + Selamat datang di Internet yang lebih baik + + Peramban yang dibuat untuk masyarakat, bukan profit. - Sinkronkan Firefox antar perangkat + Sinkronkan Firefox antar perangkat + + Mulai dari situasi saat Anda pergi - Bawa markah, riwayat, dan kata sandi ke %1$s di perangkat ini. + Bawa markah, riwayat, dan kata sandi ke %1$s di perangkat ini. + + Sinkronkan tab dan kata sandi di berbagai perangkat untuk peralihan layar yang mulus. - Daftar + Daftar + + Masuk Sinkronisasi aktif - Privasi selalu aktif + Privasi selalu aktif + + Perlindungan privasi secara bawaan - %1$s secara otomatis menghentikan perusahaan yang mengikuti Anda di web secara rahasia. + %1$s secara otomatis menghentikan perusahaan yang mengikuti Anda di web secara rahasia. + + Menghadirkan Perlindungan Kuki Total untuk mencegah pelacak gunakan kuki untuk menguntit Anda di web. Standar (baku) @@ -1262,15 +1293,23 @@ Pilih penempatan bilah alat Anda - Letakkan bilah alat agar mudah dijangkau. Tetap di bawah, atau pindahkan ke atas. + Letakkan bilah alat agar mudah dijangkau. Tetap di bawah, atau pindahkan ke atas. + + Simpan di bawah, atau pindahkan ke atas. - Privasi Anda + Privasi Anda + + Anda mengendalikan data Anda - Kami merancang %s agar Anda dapat mengendalikan apa saja yang Anda bagikan secara daring dan apa yang Anda bagikan kepada kami. + Kami merancang %s agar Anda dapat mengendalikan apa saja yang Anda bagikan secara daring dan apa yang Anda bagikan kepada kami. + + Firefox memberi Anda kendali atas apa saja yang Anda bagikan secara daring dan apa yang Anda bagikan kepada kami. Pelajari pemberitahuan privasi kami + + Siap membuka Internet yang luar biasa? Mulai menjelajah From 5d33d387a10c159c6f3bbfdcb079c88e21be3035 Mon Sep 17 00:00:00 2001 From: mcarare Date: Wed, 5 Oct 2022 13:12:27 +0300 Subject: [PATCH 106/407] For #27253: Add content description to close button. --- .../main/java/org/mozilla/fenix/onboarding/view/Onboarding.kt | 2 +- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/view/Onboarding.kt b/app/src/main/java/org/mozilla/fenix/onboarding/view/Onboarding.kt index 100005804..61dd88e84 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/view/Onboarding.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/view/Onboarding.kt @@ -96,7 +96,7 @@ fun Onboarding( ) { Icon( painter = painterResource(id = R.drawable.mozac_ic_close), - contentDescription = null, + contentDescription = stringResource(R.string.onboarding_home_content_description_close_button), tint = FirefoxTheme.colors.iconPrimary, ) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47af11c7b..fffe785ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -287,6 +287,8 @@ Skip Your tabs are syncing! Pick up where you left off on your other device. + + Close From 5391b4cbc35dc403ff6b581b5e03536ba9b7a87b Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 5 Oct 2022 14:53:25 +0000 Subject: [PATCH 107/407] Update to Android-Components 107.0.20221005143122. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ba0f852b3..06e276beb 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221004145201" + const val VERSION = "107.0.20221005143122" } From 5cce4b5f15ffcbfa70079318f284c67de6d8bb6b Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Mon, 3 Oct 2022 15:46:53 -0400 Subject: [PATCH 108/407] For #3709: Add save to PDF UI. --- app/metrics.yaml | 16 ++ .../java/org/mozilla/fenix/FeatureFlags.kt | 5 + .../toolbar/BrowserToolbarMenuController.kt | 1 + .../SessionControlController.kt | 1 + .../fenix/share/SaveToPDFInteractor.kt | 16 ++ .../org/mozilla/fenix/share/SaveToPDFItem.kt | 70 +++++++ .../mozilla/fenix/share/ShareController.kt | 16 +- .../org/mozilla/fenix/share/ShareFragment.kt | 19 ++ .../mozilla/fenix/share/ShareInteractor.kt | 6 +- app/src/main/res/layout/fragment_share.xml | 25 ++- app/src/main/res/navigation/nav_graph.xml | 2 +- app/src/main/res/values/strings.xml | 2 + ...DefaultBrowserToolbarMenuControllerTest.kt | 2 + .../fenix/share/ShareControllerTest.kt | 171 +++++++++++++++--- .../fenix/share/ShareInteractorTest.kt | 7 + 15 files changed, 322 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/share/SaveToPDFInteractor.kt create mode 100644 app/src/main/java/org/mozilla/fenix/share/SaveToPDFItem.kt diff --git a/app/metrics.yaml b/app/metrics.yaml index 2ff109a3f..bc00d8713 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -449,6 +449,22 @@ events: notification_emails: - android-probes@mozilla.com expires: 113 + save_to_pdf_tapped: + type: event + description: | + A user tapped the save to pdf option in the share sheet. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/3709 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27257 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 122 + metadata: + tags: + - Sharing onboarding: syn_cfr_shown: diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 5f5f1b4f3..d98b03cf5 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -118,4 +118,9 @@ object FeatureFlags { * Enables the wallpaper v2 enhancements. */ const val wallpaperV2Enabled = true + + /** + * Enables the save to PDF feature. + */ + val saveToPDF = Config.channel.isNightlyOrDebug } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index 6fdb31fd7..ff31317c1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -211,6 +211,7 @@ class DefaultBrowserToolbarMenuController( } is ToolbarMenu.Item.Share -> { val directions = NavGraphDirections.actionGlobalShareFragment( + sessionId = currentSession?.id, data = arrayOf( ShareData( url = getProperUrl(currentSession), diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 6ff7d30fe..1b768d44d 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -583,6 +583,7 @@ class DefaultSessionControlController( private fun showShareFragment(shareSubject: String, data: List) { val directions = HomeFragmentDirections.actionGlobalShareFragment( + sessionId = store.state.selectedTabId, shareSubject = shareSubject, data = data.toTypedArray(), ) diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFInteractor.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFInteractor.kt new file mode 100644 index 000000000..5bfcb7516 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFInteractor.kt @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.share + +/** + * Callbacks for possible user interactions on the [SaveToPDFItem] + */ +interface SaveToPDFInteractor { + /** + * Generates a PDF from the given [tabId]. + * @param tabId The ID of the tab to save as PDF. + */ + fun onSaveToPDF(tabId: String?) +} diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFItem.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFItem.kt new file mode 100644 index 000000000..728a4d627 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFItem.kt @@ -0,0 +1,70 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.share + +import android.content.res.Configuration +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A save to PDF item. + * + * @param onClick event handler when the save to PDF item is clicked. + */ +@Composable +fun SaveToPDFItem( + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .height(56.dp) + .fillMaxWidth() + .clickable(onClick = onClick), + verticalAlignment = Alignment.CenterVertically, + ) { + Spacer(Modifier.width(16.dp)) + + Icon( + painter = painterResource(R.drawable.ic_download), + contentDescription = stringResource( + R.string.content_description_close_button, + ), + tint = FirefoxTheme.colors.iconPrimary, + ) + + Spacer(Modifier.width(32.dp)) + + Text( + color = FirefoxTheme.colors.textPrimary, + text = stringResource(R.string.share_save_to_pdf), + style = FirefoxTheme.typography.subtitle1, + ) + } +} + +@Composable +@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun SaveToPDFItemPreview() { + FirefoxTheme { + SaveToPDFItem {} + } +} diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt index 054e5d0bc..72cd1ff08 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt @@ -29,9 +29,11 @@ import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.sync.Device import mozilla.components.concept.sync.TabData import mozilla.components.feature.accounts.push.SendTabUseCases +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.share.RecentAppsStorage import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.ktx.kotlin.isExtensionUrl +import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.SyncAccount import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar @@ -47,6 +49,11 @@ interface ShareController { fun handleReauth() fun handleShareClosed() fun handleShareToApp(app: AppShareOption) + + /** + * Handles when a save to PDF action was requested. + */ + fun handleSaveToPDF(tabId: String?) fun handleAddNewDevice() fun handleShareToDevice(device: Device) fun handleShareToAllDevices(devices: List) @@ -68,12 +75,13 @@ interface ShareController { * @param navController - [NavController] used for navigation. * @param dismiss - callback signalling sharing can be closed. */ -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LongParameterList") class DefaultShareController( private val context: Context, private val shareSubject: String?, private val shareData: List, private val sendTabUseCases: SendTabUseCases, + private val saveToPdfUseCase: SessionUseCases.SaveToPdfUseCase, private val snackbar: FenixSnackbar, private val navController: NavController, private val recentAppsStorage: RecentAppsStorage, @@ -130,6 +138,12 @@ class DefaultShareController( dismiss(result) } + override fun handleSaveToPDF(tabId: String?) { + Events.saveToPdfTapped.record(NoExtras()) + handleShareClosed() + saveToPdfUseCase.invoke(tabId) + } + override fun handleAddNewDevice() { val directions = ShareFragmentDirections.actionShareFragmentToAddNewDeviceFragment() navController.navigate(directions) diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt index 6a871d490..0574448ac 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt @@ -10,6 +10,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatDialogFragment +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.core.view.isVisible import androidx.fragment.app.clearFragmentResult import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels @@ -22,11 +24,13 @@ import mozilla.components.browser.state.selector.findTabOrCustomTab import mozilla.components.concept.engine.prompt.PromptRequest import mozilla.components.feature.accounts.push.SendTabUseCases import mozilla.components.feature.share.RecentAppsStorage +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.databinding.FragmentShareBinding import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.theme.FirefoxTheme class ShareFragment : AppCompatDialogFragment() { @@ -80,6 +84,7 @@ class ShareFragment : AppCompatDialogFragment() { ), navController = findNavController(), sendTabUseCases = SendTabUseCases(accountManager), + saveToPdfUseCase = requireComponents.useCases.sessionUseCases.saveToPdf, recentAppsStorage = RecentAppsStorage(requireContext()), viewLifecycleScope = viewLifecycleOwner.lifecycleScope, ) { result -> @@ -111,6 +116,20 @@ class ShareFragment : AppCompatDialogFragment() { } shareToAppsView = ShareToAppsView(binding.appsShareLayout, shareInteractor) + if (FeatureFlags.saveToPDF) { + binding.dividerLineAppsShareAndPdfSection.isVisible = true + binding.savePdf.apply { + isVisible = true + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + FirefoxTheme { + SaveToPDFItem { + shareInteractor.onSaveToPDF(tabId = args.sessionId) + } + } + } + } + } return binding.root } diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareInteractor.kt b/app/src/main/java/org/mozilla/fenix/share/ShareInteractor.kt index fe6897d51..bd945b5ce 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareInteractor.kt @@ -12,7 +12,7 @@ import org.mozilla.fenix.share.listadapters.AppShareOption */ class ShareInteractor( private val controller: ShareController, -) : ShareCloseInteractor, ShareToAccountDevicesInteractor, ShareToAppsInteractor { +) : ShareCloseInteractor, ShareToAccountDevicesInteractor, ShareToAppsInteractor, SaveToPDFInteractor { override fun onReauth() { controller.handleReauth() } @@ -40,4 +40,8 @@ class ShareInteractor( override fun onShareToApp(appToShareTo: AppShareOption) { controller.handleShareToApp(appToShareTo) } + + override fun onSaveToPDF(tabId: String?) { + controller.handleSaveToPDF(tabId) + } } diff --git a/app/src/main/res/layout/fragment_share.xml b/app/src/main/res/layout/fragment_share.xml index edf766367..f7a284739 100644 --- a/app/src/main/res/layout/fragment_share.xml +++ b/app/src/main/res/layout/fragment_share.xml @@ -35,16 +35,16 @@ app:layout_constraintBottom_toBottomOf="parent"> + app:layout_constraintBottom_toTopOf="@id/divider_line" /> + app:layout_constraintTop_toBottomOf="@id/divider_line" /> + + + + Share + + Save as PDF Send to device diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt index 3e8a41354..82f505f02 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt @@ -623,6 +623,7 @@ class DefaultBrowserToolbarMenuControllerTest { navController.navigate( directionsEq( NavGraphDirections.actionGlobalShareFragment( + sessionId = browserStore.state.selectedTabId, data = arrayOf(ShareData(url = "https://mozilla.org", title = "Mozilla")), showPage = true, ), @@ -656,6 +657,7 @@ class DefaultBrowserToolbarMenuControllerTest { navController.navigate( directionsEq( NavGraphDirections.actionGlobalShareFragment( + sessionId = browserStore.state.selectedTabId, data = arrayOf(ShareData(url = "https://mozilla.org", title = "Mozilla")), showPage = true, ), diff --git a/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt b/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt index 40319abb0..bba52f217 100644 --- a/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/ShareControllerTest.kt @@ -24,6 +24,7 @@ import mozilla.components.concept.sync.Device import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.TabData import mozilla.components.feature.accounts.push.SendTabUseCases +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.share.RecentAppsStorage import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.robolectric.testContext @@ -37,6 +38,7 @@ import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.SyncAccount import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar @@ -61,6 +63,7 @@ class ShareControllerTest { ) private val textToShare = "${shareData[0].url}\n\n${shareData[1].url}" private val sendTabUseCases = mockk(relaxed = true) + private val saveToPdfUseCase = mockk(relaxed = true) private val snackbar = mockk(relaxed = true) private val navController = mockk(relaxed = true) private val dismiss = mockk<(ShareController.Result) -> Unit>(relaxed = true) @@ -74,7 +77,7 @@ class ShareControllerTest { private val testDispatcher = coroutinesTestRule.testDispatcher private val testCoroutineScope = coroutinesTestRule.scope private val controller = DefaultShareController( - context, shareSubject, shareData, sendTabUseCases, snackbar, navController, + context, shareSubject, shareData, sendTabUseCases, saveToPdfUseCase, snackbar, navController, recentAppStorage, testCoroutineScope, testDispatcher, dismiss, ) @@ -96,7 +99,7 @@ class ShareControllerTest { // need to use an Activity Context. val activityContext: Context = mockk() val testController = DefaultShareController( - activityContext, shareSubject, shareData, mockk(), + activityContext, shareSubject, shareData, mockk(), mockk(), mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, ) every { activityContext.startActivity(capture(shareIntent)) } just Runs @@ -133,8 +136,17 @@ class ShareControllerTest { // need to use an Activity Context. val activityContext: Context = mockk() val testController = DefaultShareController( - activityContext, shareSubject, shareData, mockk(), - snackbar, mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = shareSubject, + shareData = shareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = snackbar, + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) every { recentAppStorage.updateRecentApp(appShareOption.activityName) } just Runs every { activityContext.startActivity(capture(shareIntent)) } throws SecurityException() @@ -161,8 +173,17 @@ class ShareControllerTest { // need to use an Activity Context. val activityContext: Context = mockk() val testController = DefaultShareController( - activityContext, shareSubject, shareData, mockk(), - snackbar, mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = shareSubject, + shareData = shareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = snackbar, + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) every { recentAppStorage.updateRecentApp(appShareOption.activityName) } just Runs every { activityContext.startActivity(capture(shareIntent)) } throws ActivityNotFoundException() @@ -178,12 +199,47 @@ class ShareControllerTest { } } + @Test + fun `WHEN handleSaveToPDF THEN send telemetry, close the dialog and save the page to pdf`() { + val testController = DefaultShareController( + context = mockk(), + shareSubject = shareSubject, + shareData = shareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = saveToPdfUseCase, + snackbar = snackbar, + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, + ) + + testController.handleSaveToPDF("tabID") + + verify { + saveToPdfUseCase.invoke("tabID") + dismiss(ShareController.Result.DISMISSED) + } + + assertNotNull(Events.saveToPdfTapped.testGetValue()) + } + @Test fun `getShareSubject should return the shareSubject when shareSubject is not null`() { val activityContext: Context = mockk() val testController = DefaultShareController( - activityContext, shareSubject, shareData, mockk(), - mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = shareSubject, + shareData = shareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals(shareSubject, testController.getShareSubject()) @@ -193,8 +249,17 @@ class ShareControllerTest { fun `getShareSubject should return a combination of non-null titles when shareSubject is null`() { val activityContext: Context = mockk() val testController = DefaultShareController( - activityContext, null, shareData, mockk(), - mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = null, + shareData = shareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals("title0, title1", testController.getShareSubject()) @@ -208,8 +273,17 @@ class ShareControllerTest { ShareData(url = "url1", title = "title1"), ) val testController = DefaultShareController( - activityContext, null, partialTitlesShareData, mockk(), - mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = null, + shareData = partialTitlesShareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals("title1", testController.getShareSubject()) @@ -223,8 +297,17 @@ class ShareControllerTest { ShareData(url = "url1", title = null), ) val testController = DefaultShareController( - activityContext, null, noTitleShareData, mockk(), - mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = null, + shareData = noTitleShareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals("", testController.getShareSubject()) @@ -238,8 +321,17 @@ class ShareControllerTest { ShareData(url = "url1", title = ""), ) val testController = DefaultShareController( - activityContext, null, noTitleShareData, mockk(), - mockk(), mockk(), recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = activityContext, + shareSubject = null, + shareData = noTitleShareData, + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals("", testController.getShareSubject()) @@ -384,16 +476,17 @@ class ShareControllerTest { @Test fun `getSuccessMessage should return different strings depending on the number of shared tabs`() { val controllerWithOneSharedTab = DefaultShareController( - context, - shareSubject, - listOf(ShareData(url = "url0", title = "title0")), - mockk(), - mockk(), - mockk(), - mockk(), - mockk(), - mockk(), - mockk(), + context = context, + shareSubject = shareSubject, + shareData = listOf(ShareData(url = "url0", title = "title0")), + sendTabUseCases = mockk(), + saveToPdfUseCase = mockk(), + snackbar = mockk(), + navController = mockk(), + recentAppsStorage = mockk(), + viewLifecycleScope = mockk(), + dispatcher = mockk(), + dismiss = mockk(), ) val controllerWithMoreSharedTabs = controller val expectedTabSharedMessage = context.getString(R.string.sync_sent_tab_snackbar) @@ -420,8 +513,17 @@ class ShareControllerTest { ShareData(url = "url1"), ) val controller = DefaultShareController( - context, shareSubject, shareData, sendTabUseCases, snackbar, navController, - recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = context, + shareSubject = shareSubject, + shareData = shareData, + sendTabUseCases = sendTabUseCases, + saveToPdfUseCase = mockk(), + snackbar = snackbar, + navController = navController, + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) val expectedShareText = "${shareData[0].url}\n\nurl0\n\n${shareData[2].url}" @@ -436,8 +538,17 @@ class ShareControllerTest { @Test fun `getShareSubject will return a concatenation of tab titles if 'shareSubject' is null`() { val controller = DefaultShareController( - context, null, shareData, sendTabUseCases, snackbar, navController, - recentAppStorage, testCoroutineScope, testDispatcher, dismiss, + context = context, + shareSubject = null, + shareData = shareData, + sendTabUseCases = sendTabUseCases, + saveToPdfUseCase = mockk(), + snackbar = snackbar, + navController = navController, + recentAppsStorage = recentAppStorage, + viewLifecycleScope = testCoroutineScope, + dispatcher = testDispatcher, + dismiss = dismiss, ) assertEquals("title0, title1", controller.getShareSubject()) diff --git a/app/src/test/java/org/mozilla/fenix/share/ShareInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/share/ShareInteractorTest.kt index 3afac05d6..c9d94ee2a 100644 --- a/app/src/test/java/org/mozilla/fenix/share/ShareInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/ShareInteractorTest.kt @@ -68,4 +68,11 @@ class ShareInteractorTest { verify { controller.handleShareToApp(app) } } + + @Test + fun `WHEN onSaveToPDF is call THEN call handleSaveToPDF`() { + interactor.onSaveToPDF("tabID") + + verify { controller.handleSaveToPDF("tabID") } + } } From 11af9ab3944c7e8277fb519cdc7a99e2d50ecb17 Mon Sep 17 00:00:00 2001 From: mergify Date: Wed, 5 Oct 2022 18:42:26 +0000 Subject: [PATCH 109/407] update initial_experiments.json based on the current first-run experiments in experimenter --- app/src/main/res/raw/initial_experiments.json | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/raw/initial_experiments.json b/app/src/main/res/raw/initial_experiments.json index 268c73f0e..7a7e1796e 100644 --- a/app/src/main/res/raw/initial_experiments.json +++ b/app/src/main/res/raw/initial_experiments.json @@ -1,3 +1,73 @@ { - "data": [] + "data": [ + { + "schemaVersion": "1.9.0", + "slug": "firefox-android-mr-2022-new-user-onboarding", + "id": "firefox-android-mr-2022-new-user-onboarding", + "arguments": {}, + "application": "org.mozilla.firefox", + "appName": "fenix", + "appId": "org.mozilla.firefox", + "channel": "release", + "userFacingName": "Firefox Android 2022 New User Onboarding", + "userFacingDescription": "Firefox Android 2022 New User Onboarding experiment", + "isEnrollmentPaused": false, + "isRollout": false, + "bucketConfig": { + "randomizationUnit": "nimbus_id", + "namespace": "fenix-mr2022-release-1", + "start": 0, + "count": 1500, + "total": 10000 + }, + "featureIds": [ + "mr2022" + ], + "probeSets": [], + "outcomes": [], + "branches": [ + { + "slug": "control", + "ratio": 1, + "feature": { + "featureId": "mr2022", + "enabled": true, + "value": { + "sections-enabled": { + "home-onboarding-dialog-new-users": false, + "home-onboarding-dialog-existing-users": false, + "sync-cfr": false, + "wallpapers-selection-tool": false, + "jump-back-in-cfr": false + } + } + } + }, + { + "slug": "treatment-a", + "ratio": 1, + "feature": { + "featureId": "mr2022", + "enabled": true, + "value": { + "sections-enabled": { + "home-onboarding-dialog-new-users": true, + "home-onboarding-dialog-existing-users": true, + "sync-cfr": true, + "wallpapers-selection-tool": true, + "jump-back-in-cfr": true + } + } + } + } + ], + "targeting": "((is_already_enrolled) || ((days_since_install < 7) && (app_version|versionCompare('106.!') >= 0)))", + "startDate": "2022-10-05", + "enrollmentEndDate": "2022-10-29", + "endDate": null, + "proposedDuration": 73, + "proposedEnrollment": 24, + "referenceBranch": "control" + } + ] } From c26bdae1f6b73657672587c5391086296f9ea1da Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 6 Oct 2022 02:33:49 +0200 Subject: [PATCH 110/407] Import l10n. (#27296) --- app/src/main/res/values-da/strings.xml | 80 ++++++++++++++++------ app/src/main/res/values-fr/strings.xml | 10 +++ app/src/main/res/values-pt-rPT/strings.xml | 55 ++++++++++++++- app/src/main/res/values-sl/strings.xml | 4 ++ app/src/main/res/values-uz/strings.xml | 30 ++++++++ 5 files changed, 157 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index fe9701918..5e1da0ecc 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -281,11 +281,15 @@ Mød din tilpassede startside. Seneste faneblade, bogmærker og søgeresultater vises her. - Velkommen til et uafhængigt internet + Velkommen til et uafhængigt internet + + Velkommen til et mere personligt internet Flere farver. Bedre beskyttelse af dit privatliv. Samme forpligtelse til mennesker frem for profit. - Hop fra telefonen til computeren og tilbage + Hop fra telefonen til computeren og tilbage + + Det er nemmere end nogensinde før at skifte mellem skærme Fortsæt hvor du slap med faneblade fra andre enheder - nu på din startside. @@ -385,8 +389,6 @@ Tilpas - Synkroniser bogmærker, historik og mere med din Firefox-konto - Log ind for at synkronisere dine faneblade, bogmærker, adgangskoder med mere. Firefox-konto @@ -470,6 +472,14 @@ Baggrund opdateret! Vis + + Kunne ikke hente baggrund + + Prøv igen + + Kunne ikke ændre baggrund + + Læs mere Skift baggrund ved at trykke på Firefox-logoet på startsiden @@ -477,6 +487,21 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox-logo - skift baggrund, knap + + Klassisk %s + + Begrænset udgave + + Den nye kollektion "Uafhængige stemmer". %s + + Den nye kollektion "Uafhængige stemmer". + + Tilføj lidt farve + + Vælg en baggrund, der taler til dig. + + Udforsk flere baggrunde + Tilføjelsen understøttes ikke @@ -557,8 +582,6 @@ Tillad at Mozilla installerer og afvikler undersøgelser - - Aktiver Sync Synkroniser og gem dine data @@ -774,9 +797,6 @@ %1$s (Privat tilstand) - - Andre faneblade - Indtast søgestrenge @@ -1178,8 +1198,6 @@ Afslut - - Dette sletter alle dine browserdata. Tidsinterval der skal slettes @@ -1215,20 +1233,34 @@ - Velkommen til %s! + Velkommen til %s! + + Velkommen til et bedre internet + + En browser lavet for mennesker, ikke profit. - Synkroniser Firefox mellem enheder + Synkroniser Firefox mellem enheder + + Fortsæt hvor du slap - Synkroniser bogmærker, historik og adgangskoder med %1$s på denne enhed. + Synkroniser bogmærker, historik og adgangskoder med %1$s på denne enhed. + + Synkroniser faneblade og adgangskoder på tværs af enheder for problemfri skift mellem skærme. - Tilmeld dig + Tilmeld dig + + Log ind Synkronisering er slået til - Altid aktiveret privatlivsbeskyttelse + Altid aktiveret privatlivsbeskyttelse + + Privatlivsbeskyttelse som standard - %1$s forhindrer automatisk virksomheder i at følge dig i smug på nettet. + %1$s forhindrer automatisk virksomheder i at følge dig i smug på nettet. + + Med Komplet Cookiebeskyttelse, der forhindrer sporings-tjenester i at følge dig på tværs af websteder. Standard @@ -1240,15 +1272,23 @@ Vælg placeringen af din værktøjslinje - Placer værktøjslinjen indenfor rækkevidde. Behold den nederst, eller flyt den til toppen. + Placer værktøjslinjen indenfor rækkevidde. Behold den nederst, eller flyt den til toppen. + + Behold den nederst, eller flyt den til toppen. - Bedre beskyttelse af dit privatliv + Bedre beskyttelse af dit privatliv + + Du styrer dine data - Vi har designet %s til at give dig kontrol over, hvad du deler på nettet - og hvad du deler med os. + Vi har designet %s til at give dig kontrol over, hvad du deler på nettet - og hvad du deler med os. + + Firefox giver dig kontrol over, hvad du deler på nettet - og hvad du deler med os. Læs vores privatlivspolitik + + Klar til at åbne op for et fantastisk internet? Afslut rundvisningen diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5c9d430d6..81a77f602 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1287,6 +1287,8 @@ Reprenez là où vous en étiez Importez vos marque-pages, votre historique et vos mots de passe dans %1$s sur cet appareil. + + Synchronisez onglets et mots de passe entre vos appareils pour passer d’un écran à l’autre sans accroc. Se connecter @@ -1299,6 +1301,8 @@ Protection de la vie privée par défaut %1$s empêche automatiquement les entreprises de vous suivre secrètement sur le Web. + + La protection totale contre les cookies incluse empêche les traqueurs d’utiliser des cookies pour vous pister de site en site. Standard (par défaut) @@ -1311,8 +1315,12 @@ Choisissez l’emplacement de votre barre d’outils Placez la barre d’outils à portée de main. Laissez-la en bas ou déplacez-la en haut. + + Conservez-la en bas ou déplacez-la en haut. Votre vie privée + + Vous gardez le contrôle de vos données Nous avons conçu %s pour vous donner le contrôle de ce que vous partagez en ligne et de ce que vous partagez avec nous. @@ -1321,6 +1329,8 @@ Consulter notre politique de confidentialité + + On part découvrir un Internet incroyable ? Commencer la navigation diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d2761e16b..b23e7f3e8 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -280,8 +280,20 @@ A sua página inicial personalizada do Firefox faz com que agora seja mais simples continuar de onde parou. Encontre os seus separadores, marcadores e resultados de pesquisa recentes. + + Conheça a sua página inicial personalizada. Aqui vão ser apresentados separadores recentes, marcadores e resultados de pesquisas. + + Bem-vindo/a a uma Internet independente Bem-vindo a uma internet mais pessoal + + Mais cores. Melhor privacidade. O mesmo compromisso com as pessoas, acima dos lucros. + + Alternar do telemóvel para o portátil e vice-versa + + Alterar entre ecrãs é mais fácil do que nunca + + Continue de onde parou com os separadores de outros dispositivos agora na sua página inicial. Começar @@ -290,7 +302,7 @@ Saltar - Os seus separadores estão a sincronizar! Retorne de onde parou no seu outro dispositivo. + Os seus separadores estão a ser sincronizados! Continue de onde parou no seu outro dispositivo. @@ -463,8 +475,12 @@ Fundo atualizado! Ver + + Não foi possível transferir o fundo Tentar novamente + + Não foi possível alterar o fundo Saber mais @@ -475,10 +491,21 @@ Logótipo do Firefox - altere o fundo, botão - Clássico %s + %s clássico Edição limitada + + A nova coleção de vozes independentes. %s + + A nova coleção de vozes independentes. + + Experimente um toque de cor + + Escolha um fundo que lhe diga alguma coisa. + + Explorar mais fundos + O extra não é suportado @@ -1219,10 +1246,16 @@ Bem-vindo a uma internet melhor + + Um navegador feito para as pessoas e não para os lucros. Sincronizar o Firefox entre dispositivos + + Continue de onde ficou Traga os marcadores, histórico e palavras-passe para o %1$s neste dispositivo. + + Sincronize separadores e palavras-passe entre dispositivos para uma troca transparente entre ecrãs. Registar @@ -1232,8 +1265,12 @@ Privacidade sempre ativa + + Proteção de privacidade por predefinição O %1$s impede automaticamente que as empresas o sigam secretamente pela Internet. + + A apresentar a Proteção total de cookies para parar os rastreadores de utilizar cookies que o/a perseguem na Internet. Padrão (predefinição) @@ -1246,14 +1283,22 @@ Escolha o posicionamento da barra de ferramentas Facilite o acesso à barra de ferramentas. Mantenha a mesma na parte inferior ou mova-a para cima. + + Manter na parte inferior ou mover para o topo. A sua privacidade + + Você controla os seus dados Nós desenhámos o %s para lhe dar mais controlo sobre o que partilha online e o que partilha connosco. + + O Firefox dá-lhe mais controlo sobre o que partilha na Internet e o que partilha connosco. Leia a nossa política de privacidade + + Pronto para abrir uma Internet incrível? Começar a navegar @@ -1342,6 +1387,8 @@ Todos os cookies de terceiros (poderá resultar em falhas nos sites) Todos os cookies (irá causar falhas nos sites) + + Isolar cookies inter-sites Conteúdo de monitorização @@ -1365,8 +1412,12 @@ Cookies de monitorização entre sites + + Cookies inter-sites Bloqueia os cookies que as redes de anúncios e empresas de análise utilizam para compilar os seus dados de navegação entre vários sites. + + A Proteção Total de Cookies isola cookies para o site que estiver a visitar, para que rastreadores (como redes de anúncios) não possam utilizá-los para o/a monitorizar enquanto navega entre sites. Criptomineradores diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 2ef43e9bd..e08914de4 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1296,6 +1296,8 @@ Vaša zasebnost + + Vaši podatki pod vašim nadzorom %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite na spletu in kaj delite z nami. @@ -1304,6 +1306,8 @@ Preberite naše obvestilo o zasebnosti + + Pripravljeni na vstop v neverjeten internet? Začnite brskati diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index cf44098e7..04dcab1c6 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -128,6 +128,16 @@ %d is a placeholder for the number of sites in the group. This number will always be more than one. --> %d ta sayt + + Barcha sinxronlangan varaqlarni qidirish + + Sinxronlangan qurilma + + Olib tashlash + + Olib tashlash + @@ -240,8 +250,16 @@ Toʻgʻridan-toʻgʻri manzil panelidan qidiring + + Izlash sozlamalari + + + + %1$sda yangiliklar Endi toʻxtagan joydan davom etish osonroq. + + Moslashtirilgan %1$s bosh sahifasi Ochiq varaqlar, xatchoʻplar va tarixiga oʻting. @@ -256,6 +274,18 @@ Moslashtirilgan Firefox bosh sahifasi endi toʻxtagan joydan davom etishni osonlashtiradi. Oxirgi varaqlar, xatchoʻplar va qidiruv natijalarini endi osongina topasiz. + + Moshlashtirilgan bosh sahifangizni kutib oling. Oxirgi varaqlar, xatchoʻplar va qidiruv natijalar shu yerda chiqadi. + + Mustaqil internetga xush kelibsiz + + Shaxsiy internetga xush kelibsiz + + Koʻplab ranglar. Yaxshiroq maxfiylik. Odamlarga foydali bir xil majburiyat. + + Telefondan noutbukka yoki aksincha qayting + + Ekranlarga oʻtish har doimgidan osonroq Boshlash From 18eb3678af8f0e15cf3142f7b7257fe3e701d5d0 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 5 Oct 2022 23:02:28 +0000 Subject: [PATCH 111/407] Update to Android-Components 107.0.20221005223456. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 06e276beb..5f704b4d8 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221005143122" + const val VERSION = "107.0.20221005223456" } From fbe8dfee6fac79e1c3aa038f6e3b802d6984d5c8 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Wed, 5 Oct 2022 21:22:30 -0400 Subject: [PATCH 112/407] Bump Sentry to 6.4.2 --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 5ac14a4a3..5f5cc43aa 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -14,7 +14,7 @@ object Versions { const val android_gradle_plugin = "7.3.0" const val android_lint_api = "30.3.0" - const val sentry = "5.7.3" + const val sentry = "6.4.2" const val leakcanary = "2.8.1" const val osslicenses_plugin = "0.10.4" const val detekt = "1.19.0" From 7a240eb9f62343ab8fb1dc3b9251385b2c5e05b4 Mon Sep 17 00:00:00 2001 From: mcarare Date: Mon, 12 Sep 2022 10:36:37 +0300 Subject: [PATCH 113/407] For #26930: Upgrade kotlin to 1.7.10 and compose compiler to 1.3.0. Replace deprecated Xopt-in with op-in. Replace deprecated Xjvm-default=enable with Xjvm-default=all. --- app/build.gradle | 2 +- build.gradle | 2 +- buildSrc/src/main/java/Dependencies.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7ae95168e..ac3415888 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -449,7 +449,7 @@ configurations { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { - freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi" + freeCompilerArgs += "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi" } } diff --git a/build.gradle b/build.gradle index a3022875e..f7e4d142b 100644 --- a/build.gradle +++ b/build.gradle @@ -144,7 +144,7 @@ allprojects { kotlinOptions.jvmTarget = "1.8" kotlinOptions.allWarningsAsErrors = true kotlinOptions.freeCompilerArgs += [ - "-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=enable" + "-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all" ] } } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 5f5cc43aa..be5f4afb7 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -6,7 +6,7 @@ // FORCE REBUILD 2022-09-16 object Versions { - const val kotlin = "1.6.10" + const val kotlin = "1.7.10" const val coroutines = "1.6.1" // These versions are linked: lint should be X+23.Y.Z of gradle_plugin version, according to: @@ -21,7 +21,7 @@ object Versions { const val jna = "5.8.0" const val androidx_compose = "1.2.1" - const val androidx_compose_compiler = "1.1.1" + const val androidx_compose_compiler = "1.3.0" const val androidx_appcompat = "1.3.0" const val androidx_benchmark = "1.0.0" const val androidx_biometric = "1.1.0" From 30b8de0dcefb4fc0a5652cdbebfbc85950e8f5e3 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Wed, 5 Oct 2022 16:06:08 +0300 Subject: [PATCH 114/407] For #27128 - Fix accessibility for wallpaper settings "Learn more" heading --- .../settings/wallpaper/WallpaperSettings.kt | 21 ++++++++++++++++++- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt index 3d9f8438b..dcdedd429 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/wallpaper/WallpaperSettings.kt @@ -40,7 +40,11 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.SemanticsPropertyReceiver import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.role import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview @@ -126,7 +130,22 @@ private fun WallpaperGroupHeading( style = FirefoxTheme.typography.subtitle2, ) } else { - Column { + val label = stringResource(id = R.string.a11y_action_label_wallpaper_collection_learn_more) + val headingSemantics: SemanticsPropertyReceiver.() -> Unit = + if (collection.learnMoreUrl.isNullOrEmpty()) { + {} + } else { + { + role = Role.Button + onClick(label = label) { + onLearnMoreClick(collection.learnMoreUrl, collection.name) + false + } + } + } + Column( + modifier = Modifier.semantics(mergeDescendants = true, properties = headingSemantics), + ) { Text( text = stringResource(R.string.wallpaper_limited_edition_title), color = FirefoxTheme.colors.textSecondary, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf45efe2c..97f13d4a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1880,4 +1880,6 @@ collapse expand + + open link to learn more about this collection From fb80d2ee8c72a9710f71ff6214e3a6c8f435856e Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Thu, 6 Oct 2022 13:40:04 -0400 Subject: [PATCH 115/407] No issue: Disable ETP permanent UI test failures --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 1 + .../mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 48d59a41c..3827e3f44 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -403,6 +403,7 @@ class SmokeTest { } } + @Ignore("Permanent failure: https://github.com/mozilla-mobile/fenix/issues/27312") @Test fun customTrackingProtectionSettingsTest() { val genericWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt index 5182c61d3..5bc3e474c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.ui import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -160,6 +161,7 @@ class StrictEnhancedTrackingProtectionTest { } } + @Ignore("Permanent failure: https://github.com/mozilla-mobile/fenix/issues/27312") @Test fun testStrictVisitSheetDetails() { val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) From 102acb3a4bc20e3cfa67fd6539e31d8f8eafade5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 6 Oct 2022 14:54:23 +0000 Subject: [PATCH 116/407] Update to Android-Components 107.0.20221006143319. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5f704b4d8..be3dbeb1d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221005223456" + const val VERSION = "107.0.20221006143319" } From e81da189cd8097551026ab34eeb0d22292e3564f Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Wed, 5 Oct 2022 18:35:08 -0400 Subject: [PATCH 117/407] Close #24498: Add test for history search telemetry --- .../fenix/library/history/HistoryFragment.kt | 1 - .../fenix/library/history/HistoryInteractor.kt | 3 +++ .../fenix/library/history/HistoryInteractorTest.kt | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index d23d5b54e..e82761c38 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -287,7 +287,6 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { true } R.id.history_search -> { - GleanHistory.searchIconTapped.record(NoExtras()) historyInteractor.onSearch() true } diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryInteractor.kt index 6aef87012..d9395a010 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryInteractor.kt @@ -4,7 +4,9 @@ package org.mozilla.fenix.library.history +import mozilla.components.service.glean.private.NoExtras import org.mozilla.fenix.selection.SelectionInteractor +import org.mozilla.fenix.GleanMetrics.History as GleanHistory /** * Interface for the HistoryInteractor. This interface is implemented by objects that want @@ -86,6 +88,7 @@ class DefaultHistoryInteractor( } override fun onSearch() { + GleanHistory.searchIconTapped.record(NoExtras()) historyController.handleSearch() } diff --git a/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt index 83b209703..9ee32319f 100644 --- a/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt @@ -7,14 +7,26 @@ package org.mozilla.fenix.library.history import io.mockk.every import io.mockk.mockk import io.mockk.verifyAll +import mozilla.components.service.glean.testing.GleanTestRule +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue +import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.History as GleanHistory +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +@RunWith(FenixRobolectricTestRunner::class) // For GleanTestRule class HistoryInteractorTest { private val historyItem = History.Regular(0, "title", "url", 0.toLong(), HistoryItemTimeGroup.timeGroupForTimestamp(0)) val controller: HistoryController = mockk(relaxed = true) val interactor = DefaultHistoryInteractor(controller) + @get:Rule + val gleanTestRule = GleanTestRule(testContext) + @Test fun onOpen() { interactor.open(historyItem) @@ -67,11 +79,13 @@ class HistoryInteractorTest { @Test fun onSearch() { + assertNull(GleanHistory.searchIconTapped.testGetValue()) interactor.onSearch() verifyAll { controller.handleSearch() } + assertNotNull(GleanHistory.searchIconTapped.testGetValue()) } @Test From 3f7391a3227b770dfcc72e57d6102da8da9f5ea2 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 4 Oct 2022 14:26:07 -0400 Subject: [PATCH 118/407] Close #27147: Add telemetry for bookmark search --- app/metrics.yaml | 33 +++++++++++++++++++ .../bookmarks/BookmarkFragmentInteractor.kt | 1 + .../bookmarks/BookmarkSearchController.kt | 3 ++ .../BookmarkFragmentInteractorTest.kt | 2 ++ .../bookmarks/BookmarkSearchControllerTest.kt | 16 +++++++++ 5 files changed, 55 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index bc00d8713..d8a329771 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2696,6 +2696,39 @@ bookmarks_management: metadata: tags: - Bookmarks + search_icon_tapped: + type: event + description: | + A user tapped on the search icon in bookmarks management. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/27147 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27268 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 120 + metadata: + tags: + - Bookmarks + search_result_tapped: + type: event + description: | + A user tapped on the search result in bookmarks management. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/27147 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27268 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 120 + metadata: + tags: + - Bookmarks + activation: identifier: type: string diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 9515764a1..4fec702ac 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -41,6 +41,7 @@ class BookmarkFragmentInteractor( } override fun onSearch() { + BookmarksManagement.searchIconTapped.record(NoExtras()) bookmarksController.handleSearch() } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchController.kt index ebefc9404..e88f0678f 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchController.kt @@ -5,7 +5,9 @@ package org.mozilla.fenix.library.bookmarks import mozilla.components.concept.engine.EngineSession.LoadUrlFlags +import mozilla.components.service.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.HomeActivity /** @@ -32,6 +34,7 @@ class BookmarkSearchDialogController( } override fun handleUrlTapped(url: String, flags: LoadUrlFlags) { + BookmarksManagement.searchResultTapped.record(NoExtras()) clearToolbarFocus() activity.openToBrowserAndLoad( diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index 58a4c0b69..a11357e9e 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -222,10 +222,12 @@ class BookmarkFragmentInteractorTest { @Test fun `WHEN onSearch is called THEN call controller handleSearch`() { + assertNull(BookmarksManagement.searchIconTapped.testGetValue()) interactor.onSearch() verify { bookmarkController.handleSearch() } + assertNotNull(BookmarksManagement.searchIconTapped.testGetValue()) } } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchControllerTest.kt index 5dc822812..f3a8dcd02 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkSearchControllerTest.kt @@ -9,14 +9,26 @@ import io.mockk.impl.annotations.MockK import io.mockk.verify import kotlinx.coroutines.test.runTest import mozilla.components.concept.engine.EngineSession +import mozilla.components.service.glean.testing.GleanTestRule +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before +import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +@RunWith(FenixRobolectricTestRunner::class) class BookmarkSearchControllerTest { + @get:Rule + val gleanTestRule = GleanTestRule(testContext) + @MockK(relaxed = true) private lateinit var activity: HomeActivity @@ -63,6 +75,8 @@ class BookmarkSearchControllerTest { val url = "https://www.google.com/" val flags = EngineSession.LoadUrlFlags.none() + assertNull(BookmarksManagement.searchResultTapped.testGetValue()) + createController().handleUrlTapped(url, flags) createController().handleUrlTapped(url) @@ -74,6 +88,8 @@ class BookmarkSearchControllerTest { flags = flags, ) } + + assertNotNull(BookmarksManagement.searchResultTapped.testGetValue()) } private fun createController( From 62f5f44917d0705254634dfe326b874963bd3b69 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 7 Oct 2022 02:36:55 +0200 Subject: [PATCH 119/407] Import l10n. (#27323) --- app/src/main/res/values-lo/strings.xml | 6 ++++++ app/src/main/res/values-su/strings.xml | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index a2552e259..ef60174d8 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1377,6 +1377,8 @@ ສິ່ງທີ່ຈະຖືກບັອກໂດຍການປ້ອງກັນການຕິດຕາມແບບມາດຕະຖານ ເຂັ້ມງວດ + + ປິດກັ້ນຕົວຕິດຕາມຫຼາຍຂຶ້ນເພື່ອໃຫ້ຫນ້າໂຫລດໄວຂຶ້ນ, ແຕ່ບາງຫນ້າທີ່ຢູ່ໃນຫນ້າອາດຈະພັງ. ສິ່ງທີ່ຈະຖືກບັອກໂດຍການປ້ອງກັນການຕິດຕາມຢ່າງເຂັ້ມງວດ @@ -1436,6 +1438,8 @@ ຕົວຕິດຕາມເນື້ອຫາ + + ຢຸດການໂຄສະນາພາຍນອກ, ວິດີໂອ, ແລະເນື້ອຫາອື່ນໆຈາກການໂຫຼດທີ່ມີລະຫັດຕິດຕາມ. ອາດຈະສົ່ງຜົນກະທົບຕໍ່ການເຮັດວຽກຂອງເວັບໄຊທ໌ບາງຢ່າງ. ການປົກປ້ອງແມ່ນເປີດຢູ່ສຳລັບເວັບໄຊນີ້ @@ -1662,6 +1666,8 @@ ປົດລັອກເພື່ອເບິ່ງບັດທີ່ທ່ານໄດ້ບັນທຶກໄວ້ ຮັກສາບັດເຄດິດຂອງທ່ານ + + ຕັ້ງຄ່າຮູບແບບການລັອກອຸປະກອນ, PIN, ຫຼືລະຫັດຜ່ານເພື່ອປົກປ້ອງບັດເຄຣດິດທີ່ບັນທຶກໄວ້ຂອງທ່ານຈາກການຖືກເຂົ້າເຖິງຖ້າຄົນອື່ນມີອຸປະກອນຂອງທ່ານ. ຕິດຕັ້ງດ່ຽວນີ້ diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 8e9609cdb..0a214a752 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -279,6 +279,8 @@ Tepas Firefox pribadi kiwari mantuan anjeun nyokot ti anu ditinggalkeun. Néangan tab anu can lila, markah, jeung hasil nyungsi. + + Nepangkeun kaca tepas pribadi anjeun. Tab mutahir, markah, jeung hasil maluruh bakal némbongan di dieu. Wilujeng sumping di internét mandiri @@ -289,6 +291,8 @@ Luncat tina telepon ka laptop jeung sabalikna Ngagilirkeun layar leuwih babari ti nu atos-atos + + Buka ti panungtung anu ditinggalkeun maké tab ti séjén parabot ayeuna dina kaca tepas. Mitembeyan @@ -296,6 +300,9 @@ Liwat + + Tab anjeun keur disingkronkeun! Pilih ti nu ditinggalkeun dina séjén parabot anjeun. + Buka dina tab %1$s anyar @@ -383,6 +390,8 @@ Réngkak Sesuaikeun + + Asup pikeun nyingkronkeun tab, markah, kecap sandi, jeung sajabana. Akun Firefox @@ -1250,6 +1259,8 @@ Panyungsi anu diwangun pikeun jalma, lain bati. Singkronkeun Firefox sakur parabot + + Angkut di tempat nu ku anjeun tinggalkeun Bawa markah, jujutan, jeung kecap sandi ka %1$s di ieu parabot. @@ -1287,6 +1298,8 @@ Maca wawaran salindungan kami + + Siap muka internét anu hébring? Mitembeyan nyungsi @@ -1404,6 +1417,8 @@ Meungpeuk réréméh anu dipaké ku maskapé jaringan iklan jeung analitika pikeun ngumpulkeun data langlangan anjeun di loka anu kaanjangan. + + Total Cookie Protection ngerem réréméh dina loka anu keur dibuka sangkan teu bisa dipaké ku palacak kayaning jaringan iklan pikeun nunutur anjeun meuntas-loa. Gurandil kripto From 4ecc432b69b5c92627bdd8c2fedcada5e90dd77a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 7 Oct 2022 14:54:01 +0000 Subject: [PATCH 120/407] Update to Android-Components 107.0.20221007143235. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index be3dbeb1d..5ea75438d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221006143319" + const val VERSION = "107.0.20221007143235" } From b6b892faabe57d738ce6e4e315d6729dd202c557 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Thu, 6 Oct 2022 19:21:40 -0400 Subject: [PATCH 121/407] For #27307 - Use the correct warning button text and icon color for DestructiveButton --- app/src/main/res/values-night/colors.xml | 4 ++-- app/src/main/res/values/colors.xml | 4 ++-- app/src/main/res/values/styles.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index e0891dc73..db86e2c29 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -60,7 +60,7 @@ @color/photonRed20 - @color/photonRed70 + @color/photonRed70 @color/photonViolet20 @@ -97,7 +97,7 @@ @color/photonLightGrey05 @color/photonRed20 - @color/photonRed70 + @color/photonRed70 @color/photonViolet20 @color/photonBlue20 @color/photonPink20 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 61352760c..48a699234 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -60,7 +60,7 @@ @color/photonRed70 - @color/photonRed70 + @color/photonRed70 @color/photonViolet70 @@ -97,7 +97,7 @@ @color/photonInk20 @color/photonRed70 - @color/photonRed70 + @color/photonRed70 @color/photonViolet60 @color/photonBlue60 @color/photonPink60 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 94479402c..a01eab4de 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -368,8 +368,8 @@ - From 4e481f4f3ef34312b3e62433c693a94f69d930cd Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 09:34:41 +0300 Subject: [PATCH 139/407] For #25980: Use new extension function to get fragment's NavController. --- .../java/org/mozilla/fenix/ext/Fragment.kt | 3 +-- .../org/mozilla/fenix/ext/FragmentTest.kt | 22 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt b/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt index bbfcb84e3..c25c42429 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt @@ -11,7 +11,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.navigation.NavDirections import androidx.navigation.NavOptions -import androidx.navigation.fragment.NavHostFragment.findNavController import androidx.navigation.fragment.findNavController import mozilla.components.concept.base.crash.Breadcrumb import org.mozilla.fenix.NavHostActivity @@ -25,7 +24,7 @@ val Fragment.requireComponents: Components get() = requireContext().components fun Fragment.nav(@IdRes id: Int?, directions: NavDirections, options: NavOptions? = null) { - findNavController(this).nav(id, directions, options) + findNavController().nav(id, directions, options) } fun Fragment.getPreferenceKey(@StringRes resourceId: Int): String = getString(resourceId) diff --git a/app/src/test/java/org/mozilla/fenix/ext/FragmentTest.kt b/app/src/test/java/org/mozilla/fenix/ext/FragmentTest.kt index 5fd193f54..9d0e08ecf 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/FragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/FragmentTest.kt @@ -10,7 +10,7 @@ import androidx.navigation.NavDestination import androidx.navigation.NavDirections import androidx.navigation.NavOptions import androidx.navigation.Navigator.Extras -import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController import io.mockk.Runs import io.mockk.confirmVerified import io.mockk.every @@ -38,31 +38,31 @@ class FragmentTest { @Before fun setup() { - mockkStatic(NavHostFragment::class) - every { (NavHostFragment.findNavController(mockFragment)) } returns navController - every { (NavHostFragment.findNavController(mockFragment).currentDestination) } returns mockDestination + mockkStatic("androidx.navigation.fragment.FragmentKt") + every { (mockFragment.findNavController()) } returns navController + every { (mockFragment.findNavController().currentDestination) } returns mockDestination every { (mockDestination.id) } returns mockId every { (navController.currentDestination) } returns mockDestination - every { (NavHostFragment.findNavController(mockFragment).currentDestination?.id) } answers { (mockDestination.id) } + every { (mockFragment.findNavController().currentDestination?.id) } answers { (mockDestination.id) } } @Test fun `Test nav fun with ID and directions`() { - every { (NavHostFragment.findNavController(mockFragment).navigate(navDirections, null)) } just Runs + every { (mockFragment.findNavController().navigate(navDirections, null)) } just Runs mockFragment.nav(mockId, navDirections) - verify { (NavHostFragment.findNavController(mockFragment).currentDestination) } - verify { (NavHostFragment.findNavController(mockFragment).navigate(navDirections, null)) } + verify { (mockFragment.findNavController().currentDestination) } + verify { (mockFragment.findNavController().navigate(navDirections, null)) } confirmVerified(mockFragment) } @Test fun `Test nav fun with ID, directions, and options`() { - every { (NavHostFragment.findNavController(mockFragment).navigate(navDirections, mockOptions)) } just Runs + every { (mockFragment.findNavController().navigate(navDirections, mockOptions)) } just Runs mockFragment.nav(mockId, navDirections, mockOptions) - verify { (NavHostFragment.findNavController(mockFragment).currentDestination) } - verify { (NavHostFragment.findNavController(mockFragment).navigate(navDirections, mockOptions)) } + verify { (mockFragment.findNavController().currentDestination) } + verify { (mockFragment.findNavController().navigate(navDirections, mockOptions)) } confirmVerified(mockFragment) } } From 0b4d9dc27097c54feaf982ce5b128ed8f9fd9834 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 09:37:01 +0300 Subject: [PATCH 140/407] For #25980: Update method signatures for SimpleOnGestureListener. GestureDetector onTouchEvent now expects only a NonNull MotionEvent. --- .../java/org/mozilla/fenix/browser/SwipeGestureLayout.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt b/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt index a1084602e..c34279ed1 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt @@ -106,8 +106,8 @@ class SwipeGestureLayout @JvmOverloads constructor( listeners.add(listener) } - override fun onInterceptTouchEvent(event: MotionEvent?): Boolean { - return when (event?.actionMasked) { + override fun onInterceptTouchEvent(event: MotionEvent): Boolean { + return when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { handledInitialScroll = false gestureDetector.onTouchEvent(event) @@ -117,8 +117,8 @@ class SwipeGestureLayout @JvmOverloads constructor( } } - override fun onTouchEvent(event: MotionEvent?): Boolean { - return when (event?.actionMasked) { + override fun onTouchEvent(event: MotionEvent): Boolean { + return when (event.actionMasked) { MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { gestureDetector.onTouchEvent(event) // If the active listener is not null here, then we haven't detected a fling From 0ceeda92dfe953e9caf31c5ef00958e69948bee0 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 09:37:26 +0300 Subject: [PATCH 141/407] For #25980: Update method signatures for onInitializeAccessibilityNodeInfo. --- .../fenix/trackingprotection/TrackingProtectionPanelView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt index 74a080131..d9cb2f93f 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt @@ -297,7 +297,7 @@ class TrackingProtectionPanelView( view2, object : AccessibilityDelegateCompat() { override fun onInitializeAccessibilityNodeInfo( - host: View?, + host: View, info: AccessibilityNodeInfoCompat, ) { info.setTraversalAfter(view1) From 2b8b6a9aca981c3c3f2bd4443b6a2257d67ca96e Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 09:38:36 +0300 Subject: [PATCH 142/407] For #25980: Replace deprecated popUpTo var. --- .../org/mozilla/fenix/home/intent/StartSearchIntentProcessor.kt | 2 +- app/src/test/java/org/mozilla/fenix/ext/MockKMatcherScope.kt | 2 +- .../mozilla/fenix/home/intent/StartSearchIntentProcessorTest.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessor.kt index feadb1900..adde11b87 100644 --- a/app/src/main/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessor.kt @@ -48,7 +48,7 @@ class StartSearchIntentProcessor : HomeIntentProcessor { } directions?.let { val options = navOptions { - popUpTo = R.id.homeFragment + popUpTo(R.id.homeFragment) } navController.nav(null, it, options) } diff --git a/app/src/test/java/org/mozilla/fenix/ext/MockKMatcherScope.kt b/app/src/test/java/org/mozilla/fenix/ext/MockKMatcherScope.kt index 81e810676..ace18a0e7 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/MockKMatcherScope.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/MockKMatcherScope.kt @@ -41,7 +41,7 @@ private data class EqNavDirectionsMatcher(private val value: NavDirections) : Ma private data class EqNavOptionsMatcher(private val value: NavOptions) : Matcher { override fun match(arg: NavOptions?): Boolean = - value.popUpTo == arg?.popUpTo && value.isPopUpToInclusive == arg.isPopUpToInclusive + value.popUpToId == arg?.popUpToId && value.isPopUpToInclusive() == arg.isPopUpToInclusive() override fun substitute(map: Map) = copy(value = value.internalSubstitute(map)) diff --git a/app/src/test/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessorTest.kt b/app/src/test/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessorTest.kt index bd200c138..c3ab27465 100644 --- a/app/src/test/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/intent/StartSearchIntentProcessorTest.kt @@ -58,7 +58,7 @@ class StartSearchIntentProcessorTest { } StartSearchIntentProcessor().process(intent, navController, out) val options = navOptions { - popUpTo = R.id.homeFragment + popUpTo(R.id.homeFragment) } assertNotNull(SearchWidget.newTabButton.testGetValue()) From d9d01db7cc7a9bd66472d2c2dc6b86d6d1a2cc34 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 15:14:07 +0300 Subject: [PATCH 143/407] For #25980: Replace deprecated setHasOptionsMenu with MenuProvider. --- .../library/bookmarks/BookmarkFragment.kt | 19 +++++++------- .../addfolder/AddBookmarkFolderFragment.kt | 18 ++++++------- .../bookmarks/edit/EditBookmarkFragment.kt | 17 ++++++------- .../SelectBookmarkFolderFragment.kt | 21 +++++++++------- .../library/downloads/DownloadFragment.kt | 14 +++++++---- .../fenix/library/history/HistoryFragment.kt | 14 ++++++----- .../HistoryMetadataGroupFragment.kt | 18 ++++++------- .../recentlyclosed/RecentlyClosedFragment.kt | 17 +++++++++---- .../settings/address/AddressEditorFragment.kt | 10 +++++--- .../advanced/LocaleSettingsFragment.kt | 12 ++++++--- .../creditcards/CreditCardEditorFragment.kt | 12 ++++++--- .../logins/fragment/AddLoginFragment.kt | 10 +++++--- .../logins/fragment/EditLoginFragment.kt | 10 +++++--- .../logins/fragment/LoginDetailFragment.kt | 14 +++++------ .../logins/fragment/SavedLoginsFragment.kt | 11 +++++--- .../search/AddSearchEngineFragment.kt | 15 +++++++---- .../search/EditCustomSearchEngineFragment.kt | 13 ++++++---- detekt-baseline.xml | 25 ++++++++++--------- 18 files changed, 157 insertions(+), 113 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 34e15347c..5eb7f3898 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -16,8 +16,10 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService +import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDirections import androidx.navigation.fragment.findNavController @@ -61,7 +63,7 @@ import org.mozilla.fenix.utils.allowUndo * The screen that displays the user's bookmark list in their Library. */ @Suppress("TooManyFunctions", "LargeClass") -class BookmarkFragment : LibraryPageFragment(), UserInteractionHandler { +class BookmarkFragment : LibraryPageFragment(), UserInteractionHandler, MenuProvider { private lateinit var bookmarkStore: BookmarkFragmentStore private lateinit var bookmarkView: BookmarkView @@ -134,6 +136,9 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + val accountManager = requireComponents.backgroundServices.accountManager consumeFrom(bookmarkStore) { bookmarkView.update(it) @@ -147,11 +152,6 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - override fun onResume() { super.onResume() @@ -176,7 +176,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { when (val mode = bookmarkStore.state.mode) { is BookmarkFragmentState.Mode.Normal -> { if (mode.showMenu) { @@ -205,7 +205,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.bookmark_search -> { bookmarkInteractor.onSearch() @@ -251,7 +251,8 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan deleteMulti(bookmarkStore.state.mode.selectedItems) true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt index f8d671d64..d2e38e771 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt @@ -10,8 +10,10 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.View.GONE +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.Navigation import kotlinx.coroutines.Dispatchers.IO @@ -34,21 +36,18 @@ import org.mozilla.fenix.library.bookmarks.friendlyRootTitle /** * Menu to create a new bookmark folder. */ -class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { +class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark), MenuProvider { private var _binding: FragmentEditBookmarkBinding? = null private val binding get() = _binding!! private val sharedViewModel: BookmarksSharedViewModel by activityViewModels() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - /** * Hides fields for bookmark items present in the shared layout file. */ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + _binding = FragmentEditBookmarkBinding.bind(view) binding.bookmarkUrlLabel.visibility = GONE @@ -87,11 +86,11 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { binding.bookmarkNameEdit.hideKeyboard() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.bookmarks_add_folder, menu) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.confirm_add_folder_button -> { if (binding.bookmarkNameEdit.text.isNullOrBlank()) { @@ -116,7 +115,8 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { } true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index 443b10f4c..cc085b975 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -17,8 +17,10 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController @@ -53,7 +55,7 @@ import org.mozilla.fenix.library.bookmarks.friendlyRootTitle /** * Menu to edit the name, URL, and location of a bookmark item. */ -class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { +class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark), MenuProvider { private var _binding: FragmentEditBookmarkBinding? = null private val binding get() = _binding!! @@ -63,13 +65,9 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { private var bookmarkParent: BookmarkNode? = null private var initialParentGuid: String? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) _binding = FragmentEditBookmarkBinding.bind(view) @@ -191,11 +189,11 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { binding.progressBarBookmark.visibility = View.GONE } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.bookmarks_edit, menu) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.delete_bookmark_button -> { displayDeleteBookmarkDialog() @@ -206,7 +204,8 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt index 20a67c191..92acd0c8f 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/selectfolder/SelectBookmarkFolderFragment.kt @@ -11,8 +11,10 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs import kotlinx.coroutines.Dispatchers.IO @@ -29,24 +31,24 @@ import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel import org.mozilla.fenix.library.bookmarks.DesktopFolders -class SelectBookmarkFolderFragment : Fragment() { +class SelectBookmarkFolderFragment : Fragment(), MenuProvider { private var _binding: FragmentSelectBookmarkFolderBinding? = null private val binding get() = _binding!! private val sharedViewModel: BookmarksSharedViewModel by activityViewModels() private var bookmarkNode: BookmarkNode? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { _binding = FragmentSelectBookmarkFolderBinding.inflate(inflater, container, false) return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + } + override fun onDestroyView() { super.onDestroyView() @@ -72,14 +74,14 @@ class SelectBookmarkFolderFragment : Fragment() { } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { val args: SelectBookmarkFolderFragmentArgs by navArgs() if (!args.allowCreatingNewFolder) { inflater.inflate(R.menu.bookmarks_select_folder, menu) } } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.add_folder_button -> { viewLifecycleOwner.lifecycleScope.launch(Main) { @@ -91,7 +93,8 @@ class SelectBookmarkFolderFragment : Fragment() { } true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } } diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt index 40db18a01..8509c67af 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt @@ -14,6 +14,8 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.MainScope @@ -38,7 +40,7 @@ import org.mozilla.fenix.library.LibraryPageFragment import org.mozilla.fenix.utils.allowUndo @SuppressWarnings("TooManyFunctions", "LargeClass") -class DownloadFragment : LibraryPageFragment(), UserInteractionHandler { +class DownloadFragment : LibraryPageFragment(), UserInteractionHandler, MenuProvider { private lateinit var downloadStore: DownloadFragmentStore private lateinit var downloadView: DownloadView private lateinit var downloadInteractor: DownloadInteractor @@ -116,7 +118,6 @@ class DownloadFragment : LibraryPageFragment(), UserInteractionHan override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) } /** @@ -140,6 +141,8 @@ class DownloadFragment : LibraryPageFragment(), UserInteractionHan override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + consumeFrom(downloadStore) { downloadView.update(it) } @@ -150,7 +153,7 @@ class DownloadFragment : LibraryPageFragment(), UserInteractionHan showToolbar(getString(R.string.library_downloads)) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { val menuRes = when (downloadStore.state.mode) { is DownloadFragmentState.Mode.Normal -> R.menu.library_menu is DownloadFragmentState.Mode.Editing -> R.menu.download_select_multi @@ -163,7 +166,7 @@ class DownloadFragment : LibraryPageFragment(), UserInteractionHan } } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.close_history -> { close() true @@ -181,7 +184,8 @@ class DownloadFragment : LibraryPageFragment(), UserInteractionHan } true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } /** diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index e82761c38..ecdb54868 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -17,7 +17,9 @@ import android.view.View import android.view.ViewGroup import android.widget.RadioGroup import androidx.appcompat.app.AlertDialog +import androidx.core.view.MenuProvider import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDirections import androidx.navigation.fragment.findNavController @@ -57,7 +59,7 @@ import org.mozilla.fenix.utils.allowUndo import org.mozilla.fenix.GleanMetrics.History as GleanHistory @SuppressWarnings("TooManyFunctions", "LargeClass") -class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { +class HistoryFragment : LibraryPageFragment(), UserInteractionHandler, MenuProvider { private lateinit var historyStore: HistoryFragmentStore private lateinit var historyInteractor: HistoryInteractor private lateinit var historyProvider: DefaultPagedHistoryProvider @@ -154,8 +156,6 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { historyProvider = DefaultPagedHistoryProvider(requireComponents.core.historyStorage) GleanHistory.opened.record(NoExtras()) - - setHasOptionsMenu(true) } private fun deleteSnackbar( @@ -186,6 +186,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) consumeFrom(historyStore) { historyView.update(it) @@ -212,7 +213,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { (activity as NavHostActivity).getSupportActionBarAndInflateIfNecessary().show() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { if (historyStore.state.mode is HistoryFragmentState.Mode.Editing) { inflater.inflate(R.menu.history_select_multi, menu) menu.findItem(R.id.share_history_multi_select)?.isVisible = true @@ -229,7 +230,7 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { } } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.share_history_multi_select -> { val selectedHistory = historyStore.state.mode.selectedItems val shareTabs = mutableListOf() @@ -294,7 +295,8 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler { historyInteractor.onDeleteTimeRange() true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } private fun showTabTray() { diff --git a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt index 624057e37..637df1314 100644 --- a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt @@ -16,7 +16,9 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog +import androidx.core.view.MenuProvider import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Lifecycle import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import kotlinx.coroutines.CoroutineScope @@ -51,7 +53,7 @@ import org.mozilla.fenix.utils.allowUndo */ @SuppressWarnings("TooManyFunctions") class HistoryMetadataGroupFragment : - LibraryPageFragment(), UserInteractionHandler { + LibraryPageFragment(), UserInteractionHandler, MenuProvider { private lateinit var historyMetadataGroupStore: HistoryMetadataGroupFragmentStore private lateinit var interactor: HistoryMetadataGroupInteractor @@ -67,11 +69,6 @@ class HistoryMetadataGroupFragment : override val selectedItems: Set get() = historyMetadataGroupStore.state.items.filter { it.selected }.toSet() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -121,6 +118,8 @@ class HistoryMetadataGroupFragment : } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + consumeFrom(historyMetadataGroupStore) { state -> historyMetadataGroupView.update(state) activity?.invalidateOptionsMenu() @@ -150,7 +149,7 @@ class HistoryMetadataGroupFragment : override fun onBackPressed(): Boolean = interactor.onBackPressed(selectedItems) - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { if (selectedItems.isNotEmpty()) { inflater.inflate(R.menu.history_select_multi, menu) @@ -164,7 +163,7 @@ class HistoryMetadataGroupFragment : } } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.share_history_multi_select -> { interactor.onShareMenuItem(selectedItems) @@ -199,7 +198,8 @@ class HistoryMetadataGroupFragment : interactor.onDeleteAll() true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt b/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt index 44c6661b8..14abd9837 100644 --- a/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt @@ -12,6 +12,8 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import kotlinx.coroutines.flow.collect @@ -35,7 +37,10 @@ import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.library.LibraryPageFragment @Suppress("TooManyFunctions") -class RecentlyClosedFragment : LibraryPageFragment(), UserInteractionHandler { +class RecentlyClosedFragment : + LibraryPageFragment(), + UserInteractionHandler, + MenuProvider { private lateinit var recentlyClosedFragmentStore: RecentlyClosedFragmentStore private var _recentlyClosedFragmentView: RecentlyClosedFragmentView? = null private val recentlyClosedFragmentView: RecentlyClosedFragmentView @@ -49,7 +54,7 @@ class RecentlyClosedFragment : LibraryPageFragment(), UserIntera showToolbar(getString(R.string.library_recently_closed_tabs)) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { if (recentlyClosedFragmentStore.state.selectedTabs.isNotEmpty()) { inflater.inflate(R.menu.history_select_multi, menu) menu.findItem(R.id.delete_history_multi_select)?.let { deleteItem -> @@ -61,7 +66,7 @@ class RecentlyClosedFragment : LibraryPageFragment(), UserIntera } } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { val selectedTabs = recentlyClosedFragmentStore.state.selectedTabs return when (item.itemId) { @@ -86,13 +91,13 @@ class RecentlyClosedFragment : LibraryPageFragment(), UserIntera recentlyClosedController.handleOpen(selectedTabs, BrowsingMode.Private) true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) RecentlyClosedTabs.opened.record(NoExtras()) } @@ -144,6 +149,8 @@ class RecentlyClosedFragment : LibraryPageFragment(), UserIntera } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + consumeFrom(recentlyClosedFragmentStore) { state -> recentlyClosedFragmentView.update(state) activity?.invalidateOptionsMenu() diff --git a/app/src/main/java/org/mozilla/fenix/settings/address/AddressEditorFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/address/AddressEditorFragment.kt index 251477135..542028ef6 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/address/AddressEditorFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/address/AddressEditorFragment.kt @@ -9,6 +9,8 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -27,7 +29,7 @@ import org.mozilla.fenix.settings.address.view.AddressEditorView /** * Displays an address editor for adding and editing an address. */ -class AddressEditorFragment : SecureFragment(R.layout.fragment_address_editor) { +class AddressEditorFragment : SecureFragment(R.layout.fragment_address_editor), MenuProvider { private lateinit var addressEditorView: AddressEditorView private lateinit var interactor: AddressEditorInteractor @@ -44,6 +46,7 @@ class AddressEditorFragment : SecureFragment(R.layout.fragment_address_editor) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) val storage = requireContext().components.core.autofillStorage @@ -56,7 +59,6 @@ class AddressEditorFragment : SecureFragment(R.layout.fragment_address_editor) { ) val binding = FragmentAddressEditorBinding.bind(view) - setHasOptionsMenu(true) val searchRegion = requireComponents.core.store.state.search.region addressEditorView = AddressEditorView(binding, interactor, searchRegion, args.address) @@ -82,14 +84,14 @@ class AddressEditorFragment : SecureFragment(R.layout.fragment_address_editor) { this.view?.hideKeyboard() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.address_editor, menu) this.menu = menu menu.findItem(R.id.delete_address_button).isVisible = isEditing } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.delete_address_button -> { args.address?.let { addressEditorView.showConfirmDeleteAddressDialog(requireContext(), it.guid) diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt index d453eb834..fa1efc95f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt @@ -8,11 +8,14 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.locale.LocaleUseCases @@ -22,7 +25,7 @@ import org.mozilla.fenix.databinding.FragmentLocaleSettingsBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.showToolbar -class LocaleSettingsFragment : Fragment() { +class LocaleSettingsFragment : Fragment(), MenuProvider { private lateinit var localeSettingsStore: LocaleSettingsStore private lateinit var interactor: LocaleSettingsInteractor @@ -33,7 +36,6 @@ class LocaleSettingsFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) } override fun onCreateView( @@ -63,7 +65,7 @@ class LocaleSettingsFragment : Fragment() { return view } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.languages_list, menu) val searchItem = menu.findItem(R.id.search) val searchView: SearchView = searchItem.actionView as SearchView @@ -85,6 +87,8 @@ class LocaleSettingsFragment : Fragment() { ) } + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = false + override fun onResume() { super.onResume() localeView.onResume() @@ -98,6 +102,8 @@ class LocaleSettingsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + consumeFrom(localeSettingsStore) { localeView.update(it) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt index 3fe41720c..36b5da0a6 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt @@ -11,6 +11,8 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -34,7 +36,9 @@ import org.mozilla.fenix.settings.creditcards.view.CreditCardEditorView /** * Display a credit card editor for adding and editing a credit card. */ -class CreditCardEditorFragment : SecureFragment(R.layout.fragment_credit_card_editor) { +class CreditCardEditorFragment : + SecureFragment(R.layout.fragment_credit_card_editor), + MenuProvider { private lateinit var creditCardEditorState: CreditCardEditorState private lateinit var creditCardEditorView: CreditCardEditorView @@ -55,7 +59,7 @@ class CreditCardEditorFragment : SecureFragment(R.layout.fragment_credit_card_ed override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setHasOptionsMenu(true) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) val storage = requireContext().components.core.autofillStorage interactor = DefaultCreditCardEditorInteractor( @@ -112,7 +116,7 @@ class CreditCardEditorFragment : SecureFragment(R.layout.fragment_credit_card_ed super.onPause() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.credit_card_editor, menu) this.menu = menu @@ -120,7 +124,7 @@ class CreditCardEditorFragment : SecureFragment(R.layout.fragment_credit_card_ed } @Suppress("MagicNumber") - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.delete_credit_card_button -> { args.creditCard?.let { interactor.onDeleteCardButtonClicked(it.guid) } true diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt index 11eba29d7..c84583afc 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt @@ -15,8 +15,10 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import mozilla.components.lib.state.ext.consumeFrom @@ -40,7 +42,7 @@ import org.mozilla.fenix.settings.logins.interactor.AddLoginInteractor * Displays the editable new login information for a single website */ @Suppress("TooManyFunctions", "NestedBlockDepth", "ForbiddenComment") -class AddLoginFragment : Fragment(R.layout.fragment_add_login) { +class AddLoginFragment : Fragment(R.layout.fragment_add_login), MenuProvider { private lateinit var loginsFragmentStore: LoginsFragmentStore private lateinit var interactor: AddLoginInteractor @@ -57,7 +59,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setHasOptionsMenu(true) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) _binding = FragmentAddLoginBinding.bind(view) @@ -332,7 +334,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login) { activity?.invalidateOptionsMenu() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.login_save, menu) } @@ -356,7 +358,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login) { showToolbar(getString(R.string.add_login)) } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.save_login_button -> { view?.hideKeyboard() interactor.onAddLogin( diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt index ae058e5d8..6f6d45537 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt @@ -14,8 +14,10 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -42,7 +44,7 @@ import org.mozilla.fenix.settings.logins.togglePasswordReveal * Displays the editable saved login information for a single website */ @Suppress("TooManyFunctions", "NestedBlockDepth", "ForbiddenComment") -class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { +class EditLoginFragment : Fragment(R.layout.fragment_edit_login), MenuProvider { private val args by navArgs() private lateinit var loginsFragmentStore: LoginsFragmentStore @@ -62,7 +64,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setHasOptionsMenu(true) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) _binding = FragmentEditLoginBinding.bind(view) @@ -278,7 +280,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { activity?.invalidateOptionsMenu() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.login_save, menu) } @@ -299,7 +301,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login) { super.onPause() } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.save_login_button -> { view?.hideKeyboard() interactor.onSaveLogin( diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt index 01e3c8b1f..5d2245c87 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/LoginDetailFragment.kt @@ -15,6 +15,8 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -47,7 +49,7 @@ import org.mozilla.fenix.settings.logins.view.LoginDetailsBindingDelegate * Displays saved login information for a single website. */ @Suppress("TooManyFunctions", "ForbiddenComment") -class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail) { +class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail), MenuProvider { private val args by navArgs() private var login: SavedLogin? = null @@ -79,6 +81,7 @@ class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) interactor = LoginDetailInteractor( SavedLoginsStorageController( @@ -103,11 +106,6 @@ class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail) { togglePasswordReveal(binding.passwordText, binding.revealPasswordButton) } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - /** * As described in #10727, the User should re-auth if the fragment is paused and the user is not * navigating to SavedLoginsFragment or EditLoginFragment @@ -157,12 +155,12 @@ class LoginDetailFragment : SecureFragment(R.layout.fragment_login_detail) { ) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.login_options_menu, menu) this.menu = menu } - override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.delete_login_button -> { displayDeleteLoginDialog() true diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt index 9291fd976..2d02903a9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo @@ -16,6 +17,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import mozilla.components.concept.menu.MenuController @@ -42,7 +45,7 @@ import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor import org.mozilla.fenix.settings.logins.view.SavedLoginsListView @SuppressWarnings("TooManyFunctions") -class SavedLoginsFragment : SecureFragment() { +class SavedLoginsFragment : SecureFragment(), MenuProvider { private lateinit var savedLoginsStore: LoginsFragmentStore private lateinit var savedLoginsListView: SavedLoginsListView private lateinit var savedLoginsInteractor: SavedLoginsInteractor @@ -108,7 +111,7 @@ class SavedLoginsFragment : SecureFragment() { } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.login_list, menu) val searchItem = menu.findItem(R.id.search) val searchView: SearchView = searchItem.actionView as SearchView @@ -134,6 +137,8 @@ class SavedLoginsFragment : SecureFragment() { ) } + override fun onMenuItemSelected(menuItem: MenuItem): Boolean = false + /** * If we pause this fragment, we want to pop users back to reauth */ @@ -160,7 +165,7 @@ class SavedLoginsFragment : SecureFragment() { ) = (activity as HomeActivity).openToBrowserAndLoad(searchTermOrURL, newTab, from) private fun initToolbar() { - setHasOptionsMenu(true) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) showToolbar(getString(R.string.preferences_passwords_saved_logins)) (activity as HomeActivity).getSupportActionBarAndInflateIfNecessary() .setDisplayShowTitleEnabled(false) diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt index 97528cba7..da6831ba1 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/AddSearchEngineFragment.kt @@ -18,7 +18,9 @@ import android.widget.CompoundButton import android.widget.LinearLayout import android.widget.RadioButton import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import kotlinx.coroutines.Dispatchers.IO @@ -45,7 +47,8 @@ import org.mozilla.fenix.settings.SupportUtils @SuppressWarnings("LargeClass", "TooManyFunctions") class AddSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine), - CompoundButton.OnCheckedChangeListener { + CompoundButton.OnCheckedChangeListener, + MenuProvider { private var availableEngines: List = listOf() private var selectedIndex: Int = -1 private val engineViews = mutableListOf() @@ -56,7 +59,6 @@ class AddSearchEngineFragment : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) availableEngines = requireContext() .components @@ -71,6 +73,8 @@ class AddSearchEngineFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) + val layoutInflater = LayoutInflater.from(context) val layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -125,11 +129,11 @@ class AddSearchEngineFragment : _binding = null } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.add_custom_searchengine_menu, menu) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.add_search_engine -> { when (selectedIndex) { @@ -143,7 +147,8 @@ class AddSearchEngineFragment : true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt index 9be8f75ed..054016960 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt @@ -9,7 +9,9 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -32,7 +34,7 @@ import org.mozilla.fenix.settings.SupportUtils /** * Fragment to enter a custom search engine name and URL template. */ -class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine) { +class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine), MenuProvider { private val args by navArgs() private lateinit var searchEngine: SearchEngine @@ -43,7 +45,6 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) searchEngine = requireNotNull( requireComponents.core.store.state.search.customSearchEngines.find { engine -> @@ -54,6 +55,7 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) val url = searchEngine.resultUrls[0] @@ -85,17 +87,18 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng _binding = null } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.edit_custom_searchengine_menu, menu) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { + override fun onMenuItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.save_button -> { saveCustomEngine() true } - else -> super.onOptionsItemSelected(item) + // other options are not handled by this menu provider + else -> false } } diff --git a/detekt-baseline.xml b/detekt-baseline.xml index 7117a6d97..1016bfd23 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -6,11 +6,12 @@ FunctionOnlyReturningConstant:MetricsUtils.kt$MetricsUtils$ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal fun getHashingSalt(): String FunctionOnlyReturningConstant:SupportUtils.kt$SupportUtils$fun getFirefoxAccountSumoUrl(): String FunctionParameterNaming:FenixSnackbar.kt$FenixSnackbar.Companion$_view: View? - LongParameterList:BrowserToolbarController.kt$DefaultBrowserToolbarController$( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val activity: HomeActivity, private val navController: NavController, private val readerModeController: ReaderModeController, private val engineView: EngineView, private val homeViewModel: HomeScreenViewModel, private val customTabSessionId: String?, private val browserAnimator: BrowserAnimator, private val onTabCounterClicked: () -> Unit, private val onCloseTab: (SessionState) -> Unit, ) - LongParameterList:BrowserToolbarMenuController.kt$DefaultBrowserToolbarMenuController$( private val store: BrowserStore, private val activity: HomeActivity, private val navController: NavController, private val settings: Settings, private val readerModeController: ReaderModeController, private val sessionFeature: ViewBoundFeatureWrapper<SessionFeature>, private val findInPageLauncher: () -> Unit, private val browserAnimator: BrowserAnimator, private val swipeRefresh: SwipeRefreshLayout, private val customTabSessionId: String?, private val openInFenixIntent: Intent, private val bookmarkTapped: (String, String) -> Unit, private val scope: CoroutineScope, private val tabCollectionStorage: TabCollectionStorage, private val topSitesStorage: DefaultTopSitesStorage, private val pinnedSiteStorage: PinnedSiteStorage, private val browserStore: BrowserStore, ) - LongParameterList:CrashContentIntegration.kt$CrashContentIntegration$( private val browserStore: BrowserStore, private val appStore: AppStore, private val toolbar: BrowserToolbar, private val isToolbarPlacedAtTop: Boolean, private val crashReporterView: CrashContentView, private val components: Components, private val settings: Settings, private val navController: NavController, private val sessionId: String?, ) - LongParameterList:CustomTabsIntegration.kt$CustomTabsIntegration$( store: BrowserStore, useCases: CustomTabsUseCases, toolbar: BrowserToolbar, sessionId: String, activity: Activity, onItemTapped: (ToolbarMenu.Item) -> Unit = {}, shouldReverseItems: Boolean, isPrivate: Boolean, ) - LongParameterList:DeleteBrowsingDataController.kt$DefaultDeleteBrowsingDataController$( private val removeAllTabs: TabsUseCases.RemoveAllTabsUseCase, private val removeAllDownloads: DownloadsUseCases.RemoveAllDownloadsUseCase, private val historyStorage: HistoryStorage, private val permissionStorage: PermissionStorage, private val store: BrowserStore, private val iconsStorage: BrowserIcons, private val engine: Engine, private val coroutineContext: CoroutineContext = Dispatchers.Main, ) + LongParameterList:BrowserToolbarController.kt$DefaultBrowserToolbarController$( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val activity: HomeActivity, private val navController: NavController, private val readerModeController: ReaderModeController, private val engineView: EngineView, private val homeViewModel: HomeScreenViewModel, private val customTabSessionId: String?, private val browserAnimator: BrowserAnimator, private val onTabCounterClicked: () -> Unit, private val onCloseTab: (SessionState) -> Unit ) + LongParameterList:BrowserToolbarMenuController.kt$DefaultBrowserToolbarMenuController$( private val store: BrowserStore, private val activity: HomeActivity, private val navController: NavController, private val settings: Settings, private val readerModeController: ReaderModeController, private val sessionFeature: ViewBoundFeatureWrapper<SessionFeature>, private val findInPageLauncher: () -> Unit, private val browserAnimator: BrowserAnimator, private val swipeRefresh: SwipeRefreshLayout, private val customTabSessionId: String?, private val openInFenixIntent: Intent, private val bookmarkTapped: (String, String) -> Unit, private val scope: CoroutineScope, private val tabCollectionStorage: TabCollectionStorage, private val topSitesStorage: DefaultTopSitesStorage, private val pinnedSiteStorage: PinnedSiteStorage, private val browserStore: BrowserStore ) + LongParameterList:CrashContentIntegration.kt$CrashContentIntegration$( private val browserStore: BrowserStore, private val appStore: AppStore, private val toolbar: BrowserToolbar, private val isToolbarPlacedAtTop: Boolean, private val crashReporterView: CrashContentView, private val components: Components, private val settings: Settings, private val navController: NavController, private val sessionId: String? ) + LongParameterList:CustomTabsIntegration.kt$CustomTabsIntegration$( store: BrowserStore, useCases: CustomTabsUseCases, toolbar: BrowserToolbar, sessionId: String, activity: Activity, onItemTapped: (ToolbarMenu.Item) -> Unit = {}, shouldReverseItems: Boolean, isPrivate: Boolean ) + LongParameterList:DeleteBrowsingDataController.kt$DefaultDeleteBrowsingDataController$( private val removeAllTabs: TabsUseCases.RemoveAllTabsUseCase, private val removeAllDownloads: DownloadsUseCases.RemoveAllDownloadsUseCase, private val historyStorage: HistoryStorage, private val permissionStorage: PermissionStorage, private val store: BrowserStore, private val iconsStorage: BrowserIcons, private val engine: Engine, private val coroutineContext: CoroutineContext = Dispatchers.Main ) + LongParameterList:HistoryController.kt$DefaultHistoryController$( private val store: HistoryFragmentStore, private val navController: NavController, private val scope: CoroutineScope, private val openToBrowser: (item: History.Regular) -> Unit, private val displayDeleteAll: () -> Unit, private val invalidateOptionsMenu: () -> Unit, private val deleteHistoryItems: (Set<History>) -> Unit, private val syncHistory: suspend () -> Unit, private val metrics: MetricController ) LongParameterList:QuickSettingsController.kt$DefaultQuickSettingsController$( private val context: Context, private val quickSettingsStore: QuickSettingsFragmentStore, private val browserStore: BrowserStore, private val ioScope: CoroutineScope, private val navController: NavController, @VisibleForTesting internal val sessionId: String, @VisibleForTesting internal var sitePermissions: SitePermissions?, private val settings: Settings, private val permissionStorage: PermissionStorage, private val reload: ReloadUrlUseCase, private val requestRuntimePermissions: OnNeedToRequestPermissions = { }, private val displayPermissions: () -> Unit, private val engine: Engine = context.components.core.engine, ) LongParameterList:ShareController.kt$DefaultShareController$( private val context: Context, private val shareSubject: String?, private val shareData: List<ShareData>, private val sendTabUseCases: SendTabUseCases, private val snackbar: FenixSnackbar, private val navController: NavController, private val recentAppsStorage: RecentAppsStorage, private val viewLifecycleScope: CoroutineScope, private val dispatcher: CoroutineDispatcher = Dispatchers.IO, private val dismiss: (ShareController.Result) -> Unit, ) LongParameterList:TabsTrayController.kt$DefaultTabsTrayController$( private val trayStore: TabsTrayStore, private val browserStore: BrowserStore, private val browsingModeManager: BrowsingModeManager, private val navController: NavController, private val navigateToHomeAndDeleteSession: (String) -> Unit, private val profiler: Profiler?, private val navigationInteractor: NavigationInteractor, private val tabsUseCases: TabsUseCases, private val selectTabPosition: (Int, Boolean) -> Unit, private val dismissTray: () -> Unit, private val showUndoSnackbarForTab: (Boolean) -> Unit, @VisibleForTesting internal val showCancelledDownloadWarning: (downloadCount: Int, tabId: String?, source: String?) -> Unit, ) @@ -46,7 +47,7 @@ UndocumentedPublicClass:AccountSettingsInteractor.kt$AccountSettingsUserActions UndocumentedPublicClass:AccountUiView.kt$AccountUiView UndocumentedPublicClass:ActivationPing.kt$ActivationPing - UndocumentedPublicClass:AddSearchEngineFragment.kt$AddSearchEngineFragment : FragmentOnCheckedChangeListener + UndocumentedPublicClass:AddSearchEngineFragment.kt$AddSearchEngineFragment : FragmentOnCheckedChangeListenerMenuProvider UndocumentedPublicClass:AddonDetailsBindingDelegate.kt$AddonDetailsInteractor UndocumentedPublicClass:AddonPermissionDetailsBindingDelegate.kt$AddonPermissionsDetailsInteractor UndocumentedPublicClass:AdjustMetricsService.kt$AdjustMetricsService : MetricsService @@ -145,7 +146,7 @@ UndocumentedPublicClass:DownloadAdapter.kt$DownloadAdapter : AdapterSelectionHolder UndocumentedPublicClass:DownloadController.kt$DefaultDownloadController : DownloadController UndocumentedPublicClass:DownloadController.kt$DownloadController - UndocumentedPublicClass:DownloadFragment.kt$DownloadFragment : LibraryPageFragmentUserInteractionHandler + UndocumentedPublicClass:DownloadFragment.kt$DownloadFragment : LibraryPageFragmentUserInteractionHandlerMenuProvider UndocumentedPublicClass:DownloadFragmentStore.kt$DownloadFragmentAction$AddItemForRemoval : DownloadFragmentAction UndocumentedPublicClass:DownloadFragmentStore.kt$DownloadFragmentAction$AddPendingDeletionSet : DownloadFragmentAction UndocumentedPublicClass:DownloadFragmentStore.kt$DownloadFragmentAction$EnterDeletionMode : DownloadFragmentAction @@ -180,7 +181,7 @@ UndocumentedPublicClass:GroupableRadioButton.kt$GroupableRadioButton UndocumentedPublicClass:HistoryController.kt$DefaultHistoryController : HistoryController UndocumentedPublicClass:HistoryController.kt$HistoryController - UndocumentedPublicClass:HistoryFragment.kt$HistoryFragment : LibraryPageFragmentUserInteractionHandler + UndocumentedPublicClass:HistoryFragment.kt$HistoryFragment : LibraryPageFragmentUserInteractionHandlerMenuProvider UndocumentedPublicClass:HistoryFragmentStore.kt$HistoryFragmentAction$AddItemForRemoval : HistoryFragmentAction UndocumentedPublicClass:HistoryFragmentStore.kt$HistoryFragmentAction$EnterDeletionMode : HistoryFragmentAction UndocumentedPublicClass:HistoryFragmentStore.kt$HistoryFragmentAction$ExitDeletionMode : HistoryFragmentAction @@ -229,7 +230,7 @@ UndocumentedPublicClass:LocaleAdapter.kt$LocaleAdapter : Adapter UndocumentedPublicClass:LocaleAdapter.kt$LocaleAdapter$ItemType UndocumentedPublicClass:LocaleAdapter.kt$LocaleAdapter$LocaleDiffUtil : Callback - UndocumentedPublicClass:LocaleSettingsFragment.kt$LocaleSettingsFragment : Fragment + UndocumentedPublicClass:LocaleSettingsFragment.kt$LocaleSettingsFragment : FragmentMenuProvider UndocumentedPublicClass:LocaleSettingsInteractor.kt$LocaleSettingsInteractor : LocaleSettingsViewInteractor UndocumentedPublicClass:LocaleSettingsStore.kt$LocaleSettingsAction$Search : LocaleSettingsAction UndocumentedPublicClass:LocaleSettingsStore.kt$LocaleSettingsAction$Select : LocaleSettingsAction @@ -309,7 +310,7 @@ UndocumentedPublicClass:RecentlyClosedAdapter.kt$RecentlyClosedAdapter : ListAdapterSelectionHolder UndocumentedPublicClass:RecentlyClosedController.kt$DefaultRecentlyClosedController : RecentlyClosedController UndocumentedPublicClass:RecentlyClosedController.kt$RecentlyClosedController - UndocumentedPublicClass:RecentlyClosedFragment.kt$RecentlyClosedFragment : LibraryPageFragmentUserInteractionHandler + UndocumentedPublicClass:RecentlyClosedFragment.kt$RecentlyClosedFragment : LibraryPageFragmentUserInteractionHandlerMenuProvider UndocumentedPublicClass:RecentlyClosedFragmentStore.kt$RecentlyClosedFragmentAction$Change : RecentlyClosedFragmentAction UndocumentedPublicClass:RecentlyClosedFragmentStore.kt$RecentlyClosedFragmentAction$Deselect : RecentlyClosedFragmentAction UndocumentedPublicClass:RecentlyClosedFragmentStore.kt$RecentlyClosedFragmentAction$DeselectAll : RecentlyClosedFragmentAction @@ -319,7 +320,7 @@ UndocumentedPublicClass:SaveCollectionListAdapter.kt$CollectionViewHolder : ViewHolder UndocumentedPublicClass:SaveCollectionListAdapter.kt$SaveCollectionListAdapter : Adapter UndocumentedPublicClass:SavedLoginsAuthFragment.kt$SavedLoginsAuthFragment : PreferenceFragmentCompat - UndocumentedPublicClass:SavedLoginsFragment.kt$SavedLoginsFragment : SecureFragment + UndocumentedPublicClass:SavedLoginsFragment.kt$SavedLoginsFragment : SecureFragmentMenuProvider UndocumentedPublicClass:SavedLoginsSettingFragment.kt$SavedLoginsSettingFragment : PreferenceFragmentCompat UndocumentedPublicClass:SavedLoginsSortingStrategyMenu.kt$SavedLoginsSortingStrategyMenu UndocumentedPublicClass:SavedLoginsSortingStrategyMenu.kt$SavedLoginsSortingStrategyMenu$Item @@ -338,7 +339,7 @@ UndocumentedPublicClass:SecretSettingsFragment.kt$SecretSettingsFragment : PreferenceFragmentCompat UndocumentedPublicClass:SelectBookmarkFolderAdapter.kt$SelectBookmarkFolderAdapter : ListAdapter UndocumentedPublicClass:SelectBookmarkFolderAdapter.kt$SelectBookmarkFolderAdapter$BookmarkFolderViewHolder : ViewHolder - UndocumentedPublicClass:SelectBookmarkFolderFragment.kt$SelectBookmarkFolderFragment : Fragment + UndocumentedPublicClass:SelectBookmarkFolderFragment.kt$SelectBookmarkFolderFragment : FragmentMenuProvider UndocumentedPublicClass:SelectionMenu.kt$SelectionMenu UndocumentedPublicClass:SelectionMenu.kt$SelectionMenu$Item UndocumentedPublicClass:SelectionMenu.kt$SelectionMenu.Item$BookmarkTabs : Item From d9d39bd9797dfedd8e4d05c4b26df143e3fdd4b5 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 12 Jul 2022 15:46:42 +0300 Subject: [PATCH 144/407] For #25980: Solve overload resolution ambiguity. --- .../org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt index 5f59c46fd..6b6fcea9c 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt @@ -224,7 +224,7 @@ class DefaultTabsTrayControllerTest { assertTrue(dismissTrayInvoked) verify(exactly = 0) { navController.popBackStack() } - verify(exactly = 0) { navController.popBackStack(any(), any()) } + verify(exactly = 0) { navController.popBackStack(any(), any()) } verify(exactly = 0) { navController.navigate(any()) } verify(exactly = 0) { navController.navigate(any()) } verify(exactly = 0) { navController.navigate(any(), any()) } From 5e88437d61cd374909a72135c919f53378c1f0a5 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 9 Aug 2022 13:48:01 +0300 Subject: [PATCH 145/407] For #25980: Update method signatures for View.OnAttachStateChangeListener. --- .../org/mozilla/fenix/compose/cfr/CFRPopupFullscreenLayout.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/cfr/CFRPopupFullscreenLayout.kt b/app/src/main/java/org/mozilla/fenix/compose/cfr/CFRPopupFullscreenLayout.kt index 836359f4a..096511b60 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/cfr/CFRPopupFullscreenLayout.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/cfr/CFRPopupFullscreenLayout.kt @@ -380,11 +380,11 @@ internal class CFRPopupFullscreenLayout( * [View.OnAttachStateChangeListener.onViewDetachedFromWindow]. */ private class OnViewDetachedListener(val onDismiss: () -> Unit) : View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View?) { + override fun onViewAttachedToWindow(v: View) { // no-op } - override fun onViewDetachedFromWindow(v: View?) { + override fun onViewDetachedFromWindow(v: View) { onDismiss() } } From 55724deda9ca20e1ed546fe967f52b3c10aa44e1 Mon Sep 17 00:00:00 2001 From: mcarare Date: Mon, 19 Sep 2022 16:02:49 +0300 Subject: [PATCH 146/407] For #25980: Suppress LongParameterList warning. Remove issues from baseline. --- .../fenix/components/toolbar/BrowserToolbarController.kt | 1 + .../fenix/components/toolbar/BrowserToolbarMenuController.kt | 2 +- .../org/mozilla/fenix/crashes/CrashContentIntegration.kt | 2 ++ .../org/mozilla/fenix/customtabs/CustomTabsIntegration.kt | 1 + .../deletebrowsingdata/DeleteBrowsingDataController.kt | 1 + detekt-baseline.xml | 5 ----- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index 0166ce89d..08545bfcf 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -49,6 +49,7 @@ interface BrowserToolbarController { fun handleHomeButtonClick() } +@Suppress("LongParameterList") class DefaultBrowserToolbarController( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index ff31317c1..02ab6be31 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -58,7 +58,7 @@ interface BrowserToolbarMenuController { fun handleToolbarItemInteraction(item: ToolbarMenu.Item) } -@Suppress("LargeClass", "ForbiddenComment") +@Suppress("LargeClass", "ForbiddenComment", "LongParameterList") class DefaultBrowserToolbarMenuController( private val store: BrowserStore, private val activity: HomeActivity, diff --git a/app/src/main/java/org/mozilla/fenix/crashes/CrashContentIntegration.kt b/app/src/main/java/org/mozilla/fenix/crashes/CrashContentIntegration.kt index 1cd803469..05f6a69c8 100644 --- a/app/src/main/java/org/mozilla/fenix/crashes/CrashContentIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/crashes/CrashContentIntegration.kt @@ -38,6 +38,8 @@ import org.mozilla.fenix.utils.Settings * @param sessionId [String] Id of the tab or custom tab which should be observed for [EngineState.crashed] * depending on which [crashReporterView] will be shown or hidden. */ + +@Suppress("LongParameterList") class CrashContentIntegration( private val browserStore: BrowserStore, private val appStore: AppStore, diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt index 0663ba028..3df602f67 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt @@ -16,6 +16,7 @@ import mozilla.components.support.base.feature.UserInteractionHandler import org.mozilla.fenix.R import org.mozilla.fenix.components.toolbar.ToolbarMenu +@Suppress("LongParameterList") class CustomTabsIntegration( store: BrowserStore, useCases: CustomTabsUseCases, diff --git a/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataController.kt b/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataController.kt index e118b6a92..cd668b699 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteBrowsingDataController.kt @@ -26,6 +26,7 @@ interface DeleteBrowsingDataController { suspend fun deleteDownloads() } +@Suppress("LongParameterList") class DefaultDeleteBrowsingDataController( private val removeAllTabs: TabsUseCases.RemoveAllTabsUseCase, private val removeAllDownloads: DownloadsUseCases.RemoveAllDownloadsUseCase, diff --git a/detekt-baseline.xml b/detekt-baseline.xml index 1016bfd23..41a921e1e 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -6,11 +6,6 @@ FunctionOnlyReturningConstant:MetricsUtils.kt$MetricsUtils$ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal fun getHashingSalt(): String FunctionOnlyReturningConstant:SupportUtils.kt$SupportUtils$fun getFirefoxAccountSumoUrl(): String FunctionParameterNaming:FenixSnackbar.kt$FenixSnackbar.Companion$_view: View? - LongParameterList:BrowserToolbarController.kt$DefaultBrowserToolbarController$( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val activity: HomeActivity, private val navController: NavController, private val readerModeController: ReaderModeController, private val engineView: EngineView, private val homeViewModel: HomeScreenViewModel, private val customTabSessionId: String?, private val browserAnimator: BrowserAnimator, private val onTabCounterClicked: () -> Unit, private val onCloseTab: (SessionState) -> Unit ) - LongParameterList:BrowserToolbarMenuController.kt$DefaultBrowserToolbarMenuController$( private val store: BrowserStore, private val activity: HomeActivity, private val navController: NavController, private val settings: Settings, private val readerModeController: ReaderModeController, private val sessionFeature: ViewBoundFeatureWrapper<SessionFeature>, private val findInPageLauncher: () -> Unit, private val browserAnimator: BrowserAnimator, private val swipeRefresh: SwipeRefreshLayout, private val customTabSessionId: String?, private val openInFenixIntent: Intent, private val bookmarkTapped: (String, String) -> Unit, private val scope: CoroutineScope, private val tabCollectionStorage: TabCollectionStorage, private val topSitesStorage: DefaultTopSitesStorage, private val pinnedSiteStorage: PinnedSiteStorage, private val browserStore: BrowserStore ) - LongParameterList:CrashContentIntegration.kt$CrashContentIntegration$( private val browserStore: BrowserStore, private val appStore: AppStore, private val toolbar: BrowserToolbar, private val isToolbarPlacedAtTop: Boolean, private val crashReporterView: CrashContentView, private val components: Components, private val settings: Settings, private val navController: NavController, private val sessionId: String? ) - LongParameterList:CustomTabsIntegration.kt$CustomTabsIntegration$( store: BrowserStore, useCases: CustomTabsUseCases, toolbar: BrowserToolbar, sessionId: String, activity: Activity, onItemTapped: (ToolbarMenu.Item) -> Unit = {}, shouldReverseItems: Boolean, isPrivate: Boolean ) - LongParameterList:DeleteBrowsingDataController.kt$DefaultDeleteBrowsingDataController$( private val removeAllTabs: TabsUseCases.RemoveAllTabsUseCase, private val removeAllDownloads: DownloadsUseCases.RemoveAllDownloadsUseCase, private val historyStorage: HistoryStorage, private val permissionStorage: PermissionStorage, private val store: BrowserStore, private val iconsStorage: BrowserIcons, private val engine: Engine, private val coroutineContext: CoroutineContext = Dispatchers.Main ) LongParameterList:HistoryController.kt$DefaultHistoryController$( private val store: HistoryFragmentStore, private val navController: NavController, private val scope: CoroutineScope, private val openToBrowser: (item: History.Regular) -> Unit, private val displayDeleteAll: () -> Unit, private val invalidateOptionsMenu: () -> Unit, private val deleteHistoryItems: (Set<History>) -> Unit, private val syncHistory: suspend () -> Unit, private val metrics: MetricController ) LongParameterList:QuickSettingsController.kt$DefaultQuickSettingsController$( private val context: Context, private val quickSettingsStore: QuickSettingsFragmentStore, private val browserStore: BrowserStore, private val ioScope: CoroutineScope, private val navController: NavController, @VisibleForTesting internal val sessionId: String, @VisibleForTesting internal var sitePermissions: SitePermissions?, private val settings: Settings, private val permissionStorage: PermissionStorage, private val reload: ReloadUrlUseCase, private val requestRuntimePermissions: OnNeedToRequestPermissions = { }, private val displayPermissions: () -> Unit, private val engine: Engine = context.components.core.engine, ) LongParameterList:ShareController.kt$DefaultShareController$( private val context: Context, private val shareSubject: String?, private val shareData: List<ShareData>, private val sendTabUseCases: SendTabUseCases, private val snackbar: FenixSnackbar, private val navController: NavController, private val recentAppsStorage: RecentAppsStorage, private val viewLifecycleScope: CoroutineScope, private val dispatcher: CoroutineDispatcher = Dispatchers.IO, private val dismiss: (ShareController.Result) -> Unit, ) From 8ed3bf704f8d8b9b2e3b9142c994a08c2ad33cce Mon Sep 17 00:00:00 2001 From: mcarare Date: Mon, 10 Oct 2022 11:47:21 +0300 Subject: [PATCH 147/407] For #25980: Use new backQueue instead of removed backStack. --- .../org/mozilla/fenix/search/SearchDialogFragment.kt | 2 +- .../org/mozilla/fenix/search/SearchDialogFragmentTest.kt | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index 6b74da3d1..e6068897a 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -917,7 +917,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { internal fun getPreviousDestination(): NavBackStackEntry? { // This duplicates the platform functionality for "previousBackStackEntry" but additionally skips this entry. - val descendingEntries = findNavController().backStack.descendingIterator() + val descendingEntries = findNavController().backQueue.reversed().iterator() // Throw the topmost destination away. if (descendingEntries.hasNext()) { descendingEntries.next() diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt index 0c32f0117..da26a2102 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchDialogFragmentTest.kt @@ -17,7 +17,6 @@ import org.junit.Assert.assertNull import org.junit.Assert.assertSame import org.junit.Before import org.junit.Test -import java.util.ArrayDeque internal class SearchDialogFragmentTest { private val navController: NavController = mockk() @@ -36,14 +35,14 @@ internal class SearchDialogFragmentTest { @Test fun `GIVEN this is the only visible fragment WHEN asking for the previous destination THEN return null`() { - every { navController.backStack } returns ArrayDeque(listOf(getDestination(fragmentName))) + every { navController.backQueue } returns ArrayDeque(listOf(getDestination(fragmentName))) assertNull(fragment.getPreviousDestination()) } @Test fun `GIVEN this and FragmentB on top of this are visible WHEN asking for the previous destination THEN return null`() { - every { navController.backStack } returns ArrayDeque( + every { navController.backQueue } returns ArrayDeque( listOf( getDestination(fragmentName), getDestination("FragmentB"), @@ -56,7 +55,7 @@ internal class SearchDialogFragmentTest { @Test fun `GIVEN FragmentA, this and FragmentB are visible WHEN asking for the previous destination THEN return FragmentA`() { val fragmentADestination = getDestination("FragmentA") - every { navController.backStack } returns ArrayDeque( + every { navController.backQueue } returns ArrayDeque( listOf( fragmentADestination, getDestination(fragmentName), @@ -70,7 +69,7 @@ internal class SearchDialogFragmentTest { @Test fun `GIVEN FragmentA and this on top of it are visible WHEN asking for the previous destination THEN return FragmentA`() { val fragmentADestination = getDestination("FragmentA") - every { navController.backStack } returns ArrayDeque( + every { navController.backQueue } returns ArrayDeque( listOf( fragmentADestination, getDestination(fragmentName), From c6ff008f4b5d82c8d0613ad4cdba6828dd673338 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 11 Oct 2022 14:52:52 +0000 Subject: [PATCH 148/407] Update to Android-Components 107.0.20221011143144. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 8175c0c60..2aa50350c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221010143126" + const val VERSION = "107.0.20221011143144" } From 165a516c38720aafef52f3e51e5dab23dfd04bbb Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Tue, 11 Oct 2022 09:51:18 -0700 Subject: [PATCH 149/407] For #27330 - Cache selected wallpaper card colors --- .../java/org/mozilla/fenix/utils/Settings.kt | 18 ++++++++++ .../org/mozilla/fenix/wallpapers/Wallpaper.kt | 9 +++-- .../fenix/wallpapers/WallpaperFileManager.kt | 12 ++++--- .../fenix/wallpapers/WallpapersUseCases.kt | 6 +++- app/src/main/res/values/preference_keys.xml | 2 ++ .../wallpapers/WallpaperFileManagerTest.kt | 33 ++++++++++++------- .../wallpapers/WallpapersUseCasesTest.kt | 8 +++++ 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index ca97ad365..8a7d3f77c 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -200,6 +200,24 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = 0, ) + /** + * A cache of the background color to use on cards overlaying the current wallpaper when the user's + * theme is set to Light. + */ + var currentWallpaperCardColorLight by longPreference( + appContext.getPreferenceKey(R.string.pref_key_current_wallpaper_card_color_light), + default = 0, + ) + + /** + * A cache of the background color to use on cards overlaying the current wallpaper when the user's + * theme is set to Dark. + */ + var currentWallpaperCardColorDark by longPreference( + appContext.getPreferenceKey(R.string.pref_key_current_wallpaper_card_color_dark), + default = 0, + ) + /** * Indicates if the current legacy wallpaper should be migrated. */ diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt index 897478d01..efcbed05c 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/Wallpaper.kt @@ -117,15 +117,18 @@ data class Wallpaper( * * @param settings The local cache. */ + @Suppress("ComplexCondition") fun getCurrentWallpaperFromSettings(settings: Settings): Wallpaper? { val name = settings.currentWallpaperName val textColor = settings.currentWallpaperTextColor - return if (name.isNotEmpty() && textColor != 0L) { + val cardColorLight = settings.currentWallpaperCardColorLight + val cardColorDark = settings.currentWallpaperCardColorDark + return if (name.isNotEmpty() && textColor != 0L && cardColorLight != 0L && cardColorDark != 0L) { Wallpaper( name = name, textColor = textColor, - cardColorLight = null, - cardColorDark = null, + cardColorLight = cardColorLight, + cardColorDark = cardColorDark, collection = DefaultCollection, thumbnailFileState = ImageFileState.Downloaded, assetsFileState = ImageFileState.Downloaded, diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperFileManager.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperFileManager.kt index e8d87c8f9..d7421dc06 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperFileManager.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperFileManager.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.wallpapers.Wallpaper.Companion.getLocalPath import java.io.File @@ -28,15 +29,18 @@ class WallpaperFileManager( /** * Lookup all the files for a wallpaper name. This lookup will fail if there are not * files for each of a portrait and landscape orientation as well as a thumbnail. + * + * @param settings The local cache. */ - suspend fun lookupExpiredWallpaper(name: String): Wallpaper? = withContext(coroutineDispatcher) { + suspend fun lookupExpiredWallpaper(settings: Settings): Wallpaper? = withContext(coroutineDispatcher) { + val name = settings.currentWallpaperName if (allAssetsExist(name)) { Wallpaper( name = name, collection = Wallpaper.DefaultCollection, - textColor = null, - cardColorLight = null, - cardColorDark = null, + textColor = settings.currentWallpaperTextColor, + cardColorLight = settings.currentWallpaperCardColorLight, + cardColorDark = settings.currentWallpaperCardColorDark, thumbnailFileState = Wallpaper.ImageFileState.Downloaded, assetsFileState = Wallpaper.ImageFileState.Downloaded, ) diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index 6f96672ef..72ea35829 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -261,7 +261,7 @@ class WallpapersUseCases( !it.isExpired() && it.isAvailableInLocale() } val currentWallpaper = possibleWallpapers.find { it.name == currentWallpaperName } - ?: fileManager.lookupExpiredWallpaper(currentWallpaperName) + ?: fileManager.lookupExpiredWallpaper(settings) ?: Wallpaper.Default // Dispatching this early will make it accessible to the home screen ASAP. If it has been @@ -459,6 +459,8 @@ class WallpapersUseCases( override suspend fun invoke(wallpaper: Wallpaper): Wallpaper.ImageFileState { settings.currentWallpaperName = wallpaper.name settings.currentWallpaperTextColor = wallpaper.textColor ?: 0 + settings.currentWallpaperCardColorLight = wallpaper.cardColorLight ?: 0 + settings.currentWallpaperCardColorDark = wallpaper.cardColorDark ?: 0 store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) return Wallpaper.ImageFileState.Downloaded } @@ -496,6 +498,8 @@ class WallpapersUseCases( internal fun selectWallpaper(wallpaper: Wallpaper) { settings.currentWallpaperName = wallpaper.name settings.currentWallpaperTextColor = wallpaper.textColor ?: 0L + settings.currentWallpaperCardColorLight = wallpaper.cardColorLight ?: 0L + settings.currentWallpaperCardColorDark = wallpaper.cardColorDark ?: 0L store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 6f1875619..6809cdda6 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -205,6 +205,8 @@ pref_key_wallpapers pref_key_current_wallpaper pref_key_current_wallpaper_text_color + pref_key_current_wallpaper_card_color_light + pref_key_current_wallpaper_card_color_dark pref_key_wallpapers_onboarding pref_key_should_migrate_wallpaper diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperFileManagerTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperFileManagerTest.kt index a0013ba0a..2f31e91b4 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperFileManagerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperFileManagerTest.kt @@ -1,5 +1,7 @@ package org.mozilla.fenix.wallpapers +import io.mockk.every +import io.mockk.mockk import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -9,6 +11,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import org.mozilla.fenix.utils.Settings import java.io.File class WallpaperFileManagerTest { @@ -21,6 +24,8 @@ class WallpaperFileManagerTest { private lateinit var fileManager: WallpaperFileManager + private lateinit var settings: Settings + @Before fun setup() { wallpapersFolder = File(tempFolder.root, "wallpapers") @@ -28,14 +33,19 @@ class WallpaperFileManagerTest { storageRootDirectory = tempFolder.root, coroutineDispatcher = dispatcher, ) + settings = mockk { + every { currentWallpaperName } returns wallpaperName + every { currentWallpaperTextColor } returns 0L + every { currentWallpaperCardColorLight } returns 0L + every { currentWallpaperCardColorDark } returns 0L + } } @Test fun `GIVEN wallpaper directory exists WHEN looked up THEN wallpaper created with correct name`() = runTest { - val wallpaperName = "name" createAllFiles(wallpaperName) - val result = fileManager.lookupExpiredWallpaper(wallpaperName) + val result = fileManager.lookupExpiredWallpaper(settings) val expected = generateWallpaper(name = wallpaperName) assertEquals(expected, result) @@ -43,7 +53,6 @@ class WallpaperFileManagerTest { @Test fun `GIVEN portrait file missing in directories WHEN expired wallpaper looked up THEN null returned`() = runTest { - val wallpaperName = "name" File(wallpapersFolder, "$wallpaperName/landscape.png").apply { mkdirs() createNewFile() @@ -53,14 +62,13 @@ class WallpaperFileManagerTest { createNewFile() } - val result = fileManager.lookupExpiredWallpaper(wallpaperName) + val result = fileManager.lookupExpiredWallpaper(settings) assertEquals(null, result) } @Test fun `GIVEN landscape file missing in directories WHEN expired wallpaper looked up THEN null returned`() = runTest { - val wallpaperName = "name" File(wallpapersFolder, "$wallpaperName/portrait.png").apply { mkdirs() createNewFile() @@ -70,14 +78,13 @@ class WallpaperFileManagerTest { createNewFile() } - val result = fileManager.lookupExpiredWallpaper(wallpaperName) + val result = fileManager.lookupExpiredWallpaper(settings) assertEquals(null, result) } @Test fun `GIVEN thumbnail file missing in directories WHEN expired wallpaper looked up THEN null returned`() = runTest { - val wallpaperName = "name" File(wallpapersFolder, "$wallpaperName/portrait.png").apply { mkdirs() createNewFile() @@ -87,7 +94,7 @@ class WallpaperFileManagerTest { createNewFile() } - val result = fileManager.lookupExpiredWallpaper(wallpaperName) + val result = fileManager.lookupExpiredWallpaper(settings) assertEquals(null, result) } @@ -153,11 +160,15 @@ class WallpaperFileManagerTest { private fun generateWallpaper(name: String) = Wallpaper( name = name, - textColor = null, - cardColorLight = null, - cardColorDark = null, + textColor = 0L, + cardColorLight = 0L, + cardColorDark = 0L, thumbnailFileState = Wallpaper.ImageFileState.Downloaded, assetsFileState = Wallpaper.ImageFileState.Downloaded, collection = Wallpaper.DefaultCollection, ) + + private companion object { + const val wallpaperName = "name" + } } diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt index 5e96665ff..9a6993bcd 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt @@ -41,6 +41,10 @@ class WallpapersUseCasesTest { private val mockSettings = mockk { every { currentWallpaperTextColor } returns 0L every { currentWallpaperTextColor = any() } just Runs + every { currentWallpaperCardColorLight } returns 0L + every { currentWallpaperCardColorLight = any() } just Runs + every { currentWallpaperCardColorDark } returns 0L + every { currentWallpaperCardColorDark = any() } just Runs every { shouldMigrateLegacyWallpaper } returns false every { shouldMigrateLegacyWallpaper = any() } just Runs } @@ -609,6 +613,8 @@ class WallpapersUseCasesTest { val wallpaper: Wallpaper = mockk { every { name } returns "Test" every { textColor } returns null + every { cardColorLight } returns null + every { cardColorDark } returns null } wallpaperFileState.selectWallpaper(wallpaper) @@ -631,6 +637,8 @@ class WallpapersUseCasesTest { val wallpaper: Wallpaper = mockk { every { name } returns "Test" every { textColor } returns 321L + every { cardColorLight } returns 321L + every { cardColorDark } returns 321L } wallpaperFileState.selectWallpaper(wallpaper) From 46e463db316892ac87f5bed42f60854cc47e590f Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 12 Oct 2022 02:32:35 +0200 Subject: [PATCH 150/407] Import l10n. (#27376) --- app/src/main/res/values-en-rCA/strings.xml | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 577d648bc..3eeda2d74 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -473,12 +473,36 @@ Wallpaper updated! View + + Couldn’t download wallpaper + + Try again + + Couldn’t change wallpaper + + Learn more Change wallpaper by tapping Firefox homepage logo Firefox logo - change the wallpaper, button + + Classic %s + + Limited Edition + + The new Independent Voices collection. %s + + The new Independent Voices collection. + + + Try a splash of colour + + Choose a wallpaper that speaks to you. + + Explore more wallpapers + Add-on is not supported @@ -1210,18 +1234,32 @@ Welcome to %s! + + Welcome to a better internet + + A browser built for people, not profits. Sync Firefox between devices + + Pick up where you left off Bring bookmarks, history, and passwords to %1$s on this device. + + Sync tabs and passwords across devices for seamless screen-switching. Sign up + + Sign in Sync is on Always-on privacy + + Privacy protection by default %1$s automatically stops companies from secretly following you around the web. + + Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites. Standard (default) @@ -1234,14 +1272,22 @@ Pick your toolbar placement Put the toolbar within easy reach. Keep it on the bottom, or move it to the top. + + Keep it on the bottom, or move it to the top. Your privacy + + You control your data We’ve designed %s to give you control over what you share online and what you share with us. + + Firefox gives you control over what you share online and what you share with us. Read our privacy notice + + Ready to open up an amazing internet? Start browsing From 8b0fd1b85aff051dc8997aed20e295ca31ffecfa Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 11 Oct 2022 19:48:28 +0000 Subject: [PATCH 151/407] Update to Android-Components 107.0.20221011190253. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2aa50350c..2f2698c3b 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221011143144" + const val VERSION = "107.0.20221011190253" } From f0aced49c0fd6b573490f09383717117ec1c42aa Mon Sep 17 00:00:00 2001 From: Mugurell Date: Tue, 11 Oct 2022 15:37:08 +0300 Subject: [PATCH 152/407] For #27366 - Revert "For #26644 - Apply the new theme earlier to the private browsing button" This reverts commit c7c5682104264ad1396fd0dc2852c0b9f9224b82 given that the severity of the new issue is much higher. --- .../org/mozilla/fenix/home/HomeFragment.kt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 7bdf82337..f8e8ff240 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -39,7 +39,6 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView.SmoothScroller -import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import com.google.android.material.appbar.AppBarLayout import com.google.android.material.button.MaterialButton import com.google.android.material.snackbar.Snackbar @@ -994,22 +993,7 @@ class HomeFragment : Fragment() { } binding.wordmarkText.imageTintList = tintColor - - // Need to preemptively apply the new theme to the private browsing button drawable - // See https://github.com/mozilla-mobile/fenix/issues/26644#issuecomment-1254961616 - (activity as? HomeActivity)?.themeManager?.let { themeManager -> - with(binding.privateBrowsingButton) { - val drawable = VectorDrawableCompat.create( - resources, - R.drawable.private_browsing_button, - resources.newTheme().apply { - applyStyle(themeManager.currentThemeResource, true) - }, - ) - setImageDrawable(drawable) - imageTintList = tintColor - } - } + binding.privateBrowsingButton.imageTintList = tintColor } private fun observeWallpaperUpdates() { From 8ee0a8a27afce553ff7158029f341fd8ceef4111 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 12 Oct 2022 14:57:42 +0000 Subject: [PATCH 153/407] Update to Android-Components 107.0.20221012143145. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2f2698c3b..973c77c6d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221011190253" + const val VERSION = "107.0.20221012143145" } From 09b11da8c2f8545484258bc05c122e6a335bf67a Mon Sep 17 00:00:00 2001 From: Mugurell Date: Wed, 12 Oct 2022 14:46:15 +0300 Subject: [PATCH 154/407] For #27381 - Unregister FXA observer to prevent memory leaks --- .../fenix/settings/SettingsFragment.kt | 27 +++++++++++++------ .../fenix/settings/SettingsFragmentTest.kt | 22 +++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 725a78ba4..fa5fc6a84 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -67,7 +67,8 @@ class SettingsFragment : PreferenceFragmentCompat() { private lateinit var accountUiView: AccountUiView private val profilerViewModel: ProfilerViewModel by activityViewModels() - private val accountObserver = object : AccountObserver { + @VisibleForTesting + internal val accountObserver = object : AccountObserver { private fun updateAccountUi(profile: Profile? = null) { val context = context ?: return lifecycleScope.launch { @@ -101,13 +102,6 @@ class SettingsFragment : PreferenceFragmentCompat() { updateFxAAllowDomesticChinaServerMenu = ::updateFxAAllowDomesticChinaServerMenu, ) - // Observe account changes to keep the UI up-to-date. - requireComponents.backgroundServices.accountManager.register( - accountObserver, - owner = this, - autoPause = true, - ) - // It's important to update the account UI state in onCreate since that ensures we'll never // display an incorrect state in the UI. We take care to not also call it as part of onResume // if it was just called here (via the 'creatingFragment' flag). @@ -186,6 +180,23 @@ class SettingsFragment : PreferenceFragmentCompat() { creatingFragment = false } + override fun onStart() { + super.onStart() + // Observe account changes to keep the UI up-to-date. + requireComponents.backgroundServices.accountManager.register( + accountObserver, + owner = this, + autoPause = true, + ) + } + + override fun onStop() { + super.onStop() + // If the screen isn't visible we don't need to show updates. + // Also prevent the observer registered to the FXA singleton causing memory leaks. + requireComponents.backgroundServices.accountManager.unregister(accountObserver) + } + override fun onDestroyView() { super.onDestroyView() accountUiView.cancel() diff --git a/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt index aefd14c31..6efac7a62 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt @@ -10,8 +10,10 @@ import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkObject +import io.mockk.verify import kotlinx.coroutines.test.advanceUntilIdle import mozilla.components.concept.fetch.Client +import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.runTestOnMain @@ -177,6 +179,26 @@ class SettingsFragmentTest { assertEquals(summary, httpsOnlyPreference.summary) } + @Test + fun `GIVEN an account observer WHEN the fragment is visible THEN register it for updates`() { + val accountManager: FxaAccountManager = mockk(relaxed = true) + every { testContext.components.backgroundServices.accountManager } returns accountManager + + settingsFragment.onStart() + + verify { accountManager.register(settingsFragment.accountObserver, settingsFragment, true) } + } + + @Test + fun `GIVEN an account observer WHEN the fragment stops being visible THEN unregister it for updates`() { + val accountManager: FxaAccountManager = mockk(relaxed = true) + every { testContext.components.backgroundServices.accountManager } returns accountManager + + settingsFragment.onStop() + + verify { accountManager.unregister(settingsFragment.accountObserver) } + } + @After fun tearDown() { unmockkObject(FeatureFlags) From 846e60987a00b73df09e9a32161f7fea2a221323 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Wed, 5 Oct 2022 16:03:01 -0700 Subject: [PATCH 155/407] Closes #27292: renew telemetry expiring in 108 and 109 --- app/metrics.yaml | 81 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index d8a329771..3995b1cb4 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -158,11 +158,12 @@ events: - https://github.com/mozilla-mobile/fenix/pull/18143 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21316#issuecomment-944615938 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 108 + expires: 122 default_browser_changed: type: event description: | @@ -314,11 +315,12 @@ events: - https://github.com/mozilla-mobile/fenix/pull/18143 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21316#issuecomment-944615938 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 108 + expires: 122 opened_link: type: event description: | @@ -422,11 +424,12 @@ events: - https://github.com/mozilla-mobile/fenix/pull/19936 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21316#issuecomment-944615938 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 108 + expires: 122 tab_view_changed: type: event description: | @@ -2804,11 +2807,12 @@ error_page: - https://github.com/mozilla-mobile/fenix/pull/18143 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21316#issuecomment-944615938 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 108 + expires: 122 metadata: tags: - ErrorMessages @@ -3467,11 +3471,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 closed: type: event description: | @@ -3480,11 +3485,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 show_full_history: type: event description: | @@ -3493,11 +3499,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 open_tab: type: event description: | @@ -3506,11 +3513,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 delete_tab: type: event description: | @@ -3519,11 +3527,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 menu_close: type: event description: | @@ -3532,11 +3541,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 menu_share: type: event description: | @@ -3545,11 +3555,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 menu_delete: type: event description: | @@ -3558,11 +3569,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 menu_open_in_normal_tab: type: event description: | @@ -3571,11 +3583,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 menu_open_in_private_tab: type: event description: | @@ -3584,11 +3597,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 enter_multiselect: type: event description: | @@ -3597,11 +3611,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 exit_multiselect: type: event description: | @@ -3611,11 +3626,12 @@ recently_closed_tabs: - https://github.com/mozilla-mobile/fenix/issues/21009 data_reviews: - https://github.com/mozilla-mobile/fenix/pull/22588#issuecomment-1024352995 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 reader_mode: available: @@ -5690,11 +5706,12 @@ app_theme: - https://github.com/mozilla-mobile/fenix/pull/18143 - https://github.com/mozilla-mobile/fenix/pull/19924#issuecomment-861423789 - https://github.com/mozilla-mobile/fenix/pull/21316#issuecomment-944615938 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 108 + expires: 122 metadata: tags: - Themes @@ -7228,11 +7245,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - technical notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 enabled: type: boolean description: | @@ -7243,11 +7261,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 request_matching_logins: type: event description: | @@ -7258,11 +7277,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 request_no_matching_logins: type: event description: | @@ -7273,11 +7293,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 search_displayed: type: event description: | @@ -7288,11 +7309,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 search_item_selected: type: event description: | @@ -7302,11 +7324,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 unlock_cancelled: type: event description: | @@ -7317,11 +7340,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 unlock_successful: type: event description: | @@ -7331,11 +7355,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 confirm_cancelled: type: event description: | @@ -7346,11 +7371,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 confirm_successful: type: event description: | @@ -7360,11 +7386,12 @@ android_autofill: data_reviews: - https://github.com/mozilla-mobile/fenix/pull/20547#issuecomment-889051503 - https://github.com/mozilla-mobile/fenix/pull/22871#issuecomment-995092496 + - https://github.com/mozilla-mobile/fenix/pull/27295 data_sensitivity: - interaction notification_emails: - android-probes@mozilla.com - expires: 109 + expires: 122 home_menu: settings_item_clicked: From 56c80f25392d0124cad05bd41dee61b36c085c74 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 12 Oct 2022 19:36:37 +0000 Subject: [PATCH 156/407] Update to Android-Components 107.0.20221012190125. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 973c77c6d..f067db6be 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221012143145" + const val VERSION = "107.0.20221012190125" } From 538fd700bdfdab32b45a95e12a5293a40d586e9b Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Wed, 12 Oct 2022 11:46:31 -0700 Subject: [PATCH 157/407] For #27388 - Add optional background colors to SelectableChip --- .../mozilla/fenix/compose/SelectableChip.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt b/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt index 95060db7b..3e709f50d 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt @@ -18,6 +18,7 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale @@ -32,12 +33,16 @@ import org.mozilla.fenix.theme.Theme * * @param text [String] displayed in this chip. Ideally should only be one word. * @param isSelected Whether this should be shown as selected. + * @param selectedBackgroundColor Optional background [Color] when the chip is selected. + * @param unselectedBackgroundColor Optional background [Color] when the chip is not selected. * @param onClick Callback for when the user taps this. */ @Composable fun SelectableChip( text: String, isSelected: Boolean, + selectedBackgroundColor: Color? = null, + unselectedBackgroundColor: Color? = null, onClick: () -> Unit, ) { Box( @@ -46,9 +51,9 @@ fun SelectableChip( .clip(MaterialTheme.shapes.small) .background( color = if (isSelected) { - FirefoxTheme.colors.actionPrimary + selectedBackgroundColor ?: FirefoxTheme.colors.actionPrimary } else { - FirefoxTheme.colors.actionTertiary + unselectedBackgroundColor ?: FirefoxTheme.colors.actionTertiary }, ) .padding(horizontal = 16.dp, vertical = 10.dp), @@ -67,7 +72,8 @@ fun SelectableChip( @Composable @Preview(uiMode = UI_MODE_NIGHT_YES) -private fun SelectableChipDarkThemePreview() { +@Preview(uiMode = UI_MODE_NIGHT_NO) +private fun SelectableChipPreview() { FirefoxTheme(theme = Theme.getTheme()) { Row( modifier = Modifier @@ -82,8 +88,9 @@ private fun SelectableChipDarkThemePreview() { } @Composable +@Preview(uiMode = UI_MODE_NIGHT_YES) @Preview(uiMode = UI_MODE_NIGHT_NO) -private fun SelectableChipLightThemePreview() { +private fun SelectableChipWithBackgroundColorPreview() { FirefoxTheme(theme = Theme.getTheme()) { Row( modifier = Modifier @@ -91,8 +98,8 @@ private fun SelectableChipLightThemePreview() { .background(FirefoxTheme.colors.layer1), horizontalArrangement = Arrangement.SpaceEvenly, ) { - SelectableChip(text = "Chirp", isSelected = false) { } - SelectableChip(text = "Chirp", isSelected = true) { } + SelectableChip(text = "Chirp", isSelected = false, unselectedBackgroundColor = Color.Cyan) { } + SelectableChip(text = "Chirp", isSelected = true, selectedBackgroundColor = Color.Yellow) { } } } } From 5e282ae3264228b6542703f2940698f1abd82a44 Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Thu, 22 Sep 2022 16:02:01 -0700 Subject: [PATCH 158/407] For #27101: set dialog to be dismissed when touched outside --- .../fenix/onboarding/WallpaperOnboardingDialogFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/WallpaperOnboardingDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/onboarding/WallpaperOnboardingDialogFragment.kt index fd42b1b57..679606d13 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/WallpaperOnboardingDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/WallpaperOnboardingDialogFragment.kt @@ -80,6 +80,7 @@ class WallpaperOnboardingDialogFragment : BottomSheetDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle?, ): View = ComposeView(requireContext()).apply { + this@WallpaperOnboardingDialogFragment.dialog?.setCanceledOnTouchOutside(true) setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { From 832e832ec7adbf2360cc7a6a10fa94a781f3c294 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 13 Oct 2022 03:08:59 +0200 Subject: [PATCH 159/407] Import l10n. (#27391) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/res/values-be/strings.xml | 13 ++++++++++++ app/src/main/res/values-co/strings.xml | 13 ++++++++++++ app/src/main/res/values-de/strings.xml | 23 ++++++++++++--------- app/src/main/res/values-el/strings.xml | 18 +++++++--------- app/src/main/res/values-en-rGB/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-es-rAR/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-fi/strings.xml | 23 ++++++++++++--------- app/src/main/res/values-fr/strings.xml | 13 +++++++++++- app/src/main/res/values-fy-rNL/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-hy-rAM/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-ia/strings.xml | 24 ++++++++++++---------- app/src/main/res/values-is/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-it/strings.xml | 23 ++++++++++++--------- app/src/main/res/values-iw/strings.xml | 13 ++++++++++++ app/src/main/res/values-ja/strings.xml | 13 ++++++++++++ app/src/main/res/values-ko/strings.xml | 23 ++++++++++++--------- app/src/main/res/values-lo/strings.xml | 13 ++++++++++++ app/src/main/res/values-nl/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-oc/strings.xml | 13 ++++++++++++ app/src/main/res/values-pt-rPT/strings.xml | 13 ++++++++++++ app/src/main/res/values-ru/strings.xml | 13 ++++++++++++ app/src/main/res/values-sv-rSE/strings.xml | 17 ++++++++------- app/src/main/res/values-tr/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-uk/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-vi/strings.xml | 22 ++++++++++++-------- app/src/main/res/values-zh-rTW/strings.xml | 13 ++++++++++++ 26 files changed, 326 insertions(+), 153 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f720b5455..cc319e019 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -301,6 +301,9 @@ Вашыя карткі сінхранізуюцца! Працягвайце з таго месца, дзе спыніліся на іншай прыладзе. + + Закрыць + Адкрыць новую картку %1$s @@ -1072,6 +1075,8 @@ Падзяліцца + + Захаваць як PDF Даслаць на прыладу @@ -1969,4 +1974,12 @@ Перайсці ў налады Прапановы Firefox + + + + згарнуць + + разгарнуць + + адкрыйце спасылку, каб даведацца больш аб гэтай калекцыі diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index dba74f647..99ec9740c 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -306,6 +306,9 @@ E vostre unghjette sò sincrunizate ! Ripigliate induve vi site piantati nant’à u vostru altru apparechju. + + Chjode + Apre una nova unghjetta in %1$s @@ -1080,6 +1083,8 @@ Sparte + + Arregistrà cum’è PDF Mandà à l’apparechju @@ -1956,4 +1961,12 @@ Andà à e preferenze Firefox suggerisce + + + + riduce + + allargà + + apre u liame per sapene di più nant’à sta cullezzione diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3b00e5fd8..d9405513c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -309,6 +309,9 @@ Ihre Tabs werden synchronisiert! Machen Sie dort weiter, wo Sie auf Ihrem anderen Gerät aufgehört haben. + + Schließen + Neuen %1$s-Tab öffnen @@ -398,8 +401,6 @@ Anpassen - Synchronisieren Sie Lesezeichen, Chronik und mehr mit Ihrem Firefox-Konto - Melden Sie sich an, um Tabs, Lesezeichen, Passwörter und mehr zu synchronisieren. Firefox-Konto @@ -598,9 +599,6 @@ Ermöglicht Mozilla die Installation und Durchführung von Studien - - Sync aktivieren - Ihre Daten synchronisieren und speichern @@ -820,9 +818,6 @@ %1$s (Privater Modus) - - Andere Tabs - Suchbegriffe eingeben @@ -1105,6 +1100,8 @@ Teilen + + Als PDF speichern An Gerät senden @@ -1251,8 +1248,6 @@ Beenden - - Dadurch werden alle Ihre Browser-Daten gelöscht. Zu löschender Zeitraum @@ -1986,4 +1981,12 @@ Einstellungen öffnen Firefox-Vorschläge + + + + Einklappen + + Ausklappen + + Link öffnen, um mehr über diese Sammlung zu erfahren diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6a613c0f0..23357b346 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -310,6 +310,9 @@ Οι καρτέλες σας συγχρονίζονται! Συνεχίστε από εκεί που σταματήσατε στην άλλη συσκευή σας. + + Κλείσιμο + Άνοιγμα νέας καρτέλας %1$s @@ -400,8 +403,6 @@ Προσαρμογή - Συγχρονισμός σελιδοδεικτών, ιστορικού και άλλων δεδομένων με τον λογαριασμό Firefox σας - Συνδεθείτε για να συγχρονίσετε τις καρτέλες, τους σελιδοδείκτες, τους κωδικούς πρόσβασης και πολλά άλλα. Λογαριασμός Firefox @@ -597,9 +598,6 @@ Επιτρέπει στο Mozilla την εγκατάσταση και εκτέλεση μελετών - - Ενεργοποίηση Sync - Συγχρονισμός και αποθήκευση δεδομένων @@ -817,9 +815,6 @@ %1$s (Ιδιωτική λειτουργία) - - Άλλες καρτέλες - Εισαγωγή όρων αναζήτησης @@ -1087,6 +1082,8 @@ Κοινή χρήση + + Αποθήκευση ως PDF Αποστολή σε συσκευή @@ -1228,8 +1225,6 @@ Έξοδος - - Αυτό θα διαγράψει όλα τα δεδομένα περιήγησής σας. Χρονικό διάστημα διαγραφής @@ -1974,4 +1969,5 @@ Μετάβαση στις ρυθμίσεις Προτάσεις Firefox - + + diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 97c06910a..c03a9db8f 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -301,6 +301,9 @@ Your tabs are synchronising! Pick up where you left off on your other device. + + Close + Open a new %1$s tab @@ -390,8 +393,6 @@ Customise - Synchronise bookmarks, history and more with your Firefox Account - Sign in to synchronise tabs, bookmarks, passwords, and more. Firefox Account @@ -585,8 +586,6 @@ Allows Mozilla to install and run studies - - Turn on Sync Synchronise and save your data @@ -804,9 +803,6 @@ %1$s (Private Mode) - - Other tabs - Enter search terms @@ -1072,6 +1068,8 @@ Share + + Save as PDF Send to device @@ -1209,8 +1207,6 @@ Quit - - This will delete all of your browsing data. Time range to delete @@ -1940,4 +1936,12 @@ Go to settings Firefox Suggest + + + + collapse + + expand + + open link to learn more about this collection diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 8e2bbbff6..8d72e2d5e 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -309,6 +309,9 @@ ¡Tus pestañas se están sincronizando! Continuá donde lo dejaste en tu otro dispositivo. + + Cerrar + Abrir una nueva pestaña de %1$s @@ -397,8 +400,6 @@ Personalizar - Sincronizar marcadores, historial y más con tu cuenta Firefox - Iniciá la sesión para sincronizar pestañas, marcadores, contraseñas y más. Cuenta Firefox @@ -598,8 +599,6 @@ - - Activar Sync Sincronizá y guardá los datos @@ -823,9 +822,6 @@ %1$s (modo privado) - - Otras pestañas - Ingresar términos de búsqueda @@ -1096,6 +1092,8 @@ Compartir + + Guardar como PDF Enviar al dispositivo @@ -1237,8 +1235,6 @@ Salir - - Esto eliminará todos tus datos de navegación. Intervalo de tiempo para borrar @@ -1978,4 +1974,12 @@ Ir a ajustes Sugerencia de Firefox + + + + contraer + + expandir + + abrir enlace para conocer más sobre esta colección diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a9dec0061..97e4356c1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -308,6 +308,9 @@ Välilehtiäsi synkronoidaan! Jatka siitä, mihin jäit toisella laitteellasi. + + Sulje + Avaa uusi %1$s-välilehti @@ -398,8 +401,6 @@ Mukauta - Synkronoi kirjanmerkit, historia ja paljon muuta Firefox-tilillä - Kirjaudu sisään synkronoidaksesi välilehtesi, kirjanmerkkisi, salasanasi ja muita tietoja. Firefox-tili @@ -597,8 +598,6 @@ Salli Mozillan asentaa ja suorittaa tutkimuksia - - Ota Sync käyttöön Synkronoi ja tallenna tietosi @@ -818,9 +817,6 @@ %1$s (yksityinen tila) - - Muut välilehdet - Kirjoita hakuehdot @@ -1090,6 +1086,8 @@ Jaa + + Tallenna PDF-muodossa Lähetä laitteeseen @@ -1233,9 +1231,6 @@ Lopeta - - Kaikki selaustietosi poistetaan. - Tyhjennettävä aikajakso @@ -1972,4 +1967,12 @@ Siirry asetuksiin Firefox-ehdotukset + + + + supista + + laajenna + + avataksesi linkin, josta saat lisätietoja tästä kokoelmasta diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 81a77f602..109e03c14 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -307,6 +307,9 @@ Vos onglets sont synchronisés ! Reprenez là vous en étiez sur votre autre appareil. + + Fermer + Ouvrir un nouvel onglet %1$s @@ -1093,6 +1096,8 @@ Partager + + Enregistrer en PDF Envoyer à l’appareil @@ -1973,4 +1978,10 @@ Ouvrir les paramètres Firefox suggère - + + + + réduire + + développer + diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 2f9286d0b..0f01b7312 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -305,6 +305,9 @@ Jo ljepblêden wurde syngronisearre! Gean fierder wêr’t jo bleaun wiene op jo oare apparaat. + + Slute + In nij %1$s-ljepblêd iepenje @@ -393,8 +396,6 @@ Oanpasse - Syngronisearje blêdwizers, skiednis en mear mei jo Firefox-account - Meld jo oan om jo ljepblêden, blêdwizers, wachtwurden en mear te syngronisearjen. Firefox-account @@ -589,8 +590,6 @@ Stelt Mozilla yn steat om ûndersiken te ynstallearjen en út te fieren - - Sync ynskeakelje Syngronisearje en jo gegevens bewarje @@ -805,9 +804,6 @@ %1$s (priveemodus) - - Oare ljeplêden - Fier syktermen yn @@ -1072,6 +1068,8 @@ Diele + + Bewarje as PDF Ferstjoere nei apparaat @@ -1212,8 +1210,6 @@ Ofslute - - Hjirtroch wurde al jo navigaasjegegevens fuortsmiten. Te wiskjen tiidrek @@ -1951,4 +1947,12 @@ Nei Ynstellingen Firefox Suggestjes + + + + ynklappe + + útklappe + + keppeling iepenje foar mear ynfo oer dizze kolleksje diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index e615d81ae..b3425f5a7 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -301,6 +301,9 @@ Ձեր ներդիրները համաժամացվում են: Շարունակեք այնտեղից, որտեղ դադարեցրել եք ձեր մյուս սարքում: + + Փակել + Բացել նոր %1$s ներդիր @@ -389,8 +392,6 @@ Հարմարեցնել - Համաժամեցրեք էջանիշները, պատմությունը և ավելին ձեր Firefox հաշվի հետ - Մուտք գործեք՝ ներդիրները, էջանիշերը, գաղտնաբառերը և ավելին համաժամեցնելու համար: Firefox-ի հաշիվ @@ -585,8 +586,6 @@ Թույլ է տալիս Mozilla-ին տեղադրել և իրականացնել ուսումնասիրություններ - - Միացնել համաժամեցումը Համաժամեցրեք և պահեք ձեր տվյալները @@ -802,9 +801,6 @@ %1$s (Գաղտնի կերպ) - - Այլ ներդիրներ - Մուտքագրեք որոնվող բառը @@ -1073,6 +1069,8 @@ "Share" button. Opens the share menu when pressed. --> Համօգտագործել + + Պահել որպես PDF Ուղարկել սարքի @@ -1212,8 +1210,6 @@ Փակել - - Սա կջնջի ձեր դիտարկման բոլոր տվյալները: Ջնջելու ենթակա ժամանակահատվածը @@ -1947,4 +1943,12 @@ Անցնել Կարգավորումներին Firefox-ի առաջարկ + + + + Կոծկել + + Ընդարձակել + + բացեք հղումը՝ այս հավաքածուի մասին ավելին իմանալու համար diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index dc6b6ede6..0421002f5 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -306,6 +306,9 @@ Tu schedas es synchronisate! Reprende de ubi tu exiva sur un tu altere apparato. + + Clauder + Aperir un nove scheda %1$s @@ -395,8 +398,6 @@ Personalisar - Synchronisa marcapaginas, chronologia e altero ancora con tu Firefox Account - Authentica te pro synchronisar tu schedas, marca-paginas, contrasignos e plus. Firefox Account @@ -602,10 +603,6 @@ - - Activar Sync - - Synchronisar e salvar datos @@ -837,9 +834,6 @@ %1$s (modo private) - - Altere schedas - Insere le terminos de recerca @@ -1111,6 +1105,8 @@ "Share" button. Opens the share menu when pressed. --> Compartir + + Salvar como PDF Inviar a un apparato @@ -1254,8 +1250,6 @@ Quitar - - Isto delera tote tu datos de navigation. Intervallo pro deler @@ -2004,4 +1998,12 @@ Ir a parametros Firefox suggere + + + + contraher + + expander + + aperi le ligamine pro apprender plus re iste collection diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index ac3a23442..95a6c24ba 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -301,6 +301,9 @@ Fliparnir þínir eru að samstillast! Haltu áfram þar sem frá var horfið í hinu tækinu þínu. + + Loka + Opna nýjan %1$s-flipa @@ -390,8 +393,6 @@ Sérsníða - Samstilla bókamerki, feril og fleira með Firefox reikningnum þínum - Skráðu þig inn til að samstilla flipana þína, bókamerki, lykilorð og fleira. Firefox reikningur @@ -586,8 +587,6 @@ Leyfir Mozilla að setja upp og keyra rannsóknir - - Kveikja á samstillingu Samstilltu og vistaðu gögnin þín @@ -803,9 +802,6 @@ %1$s (huliðshamur) - - Aðrir flipar - Settu inn leitarorð @@ -1070,6 +1066,8 @@ Deila + + Vista sem PDF Senda til tækis @@ -1209,8 +1207,6 @@ Hætta - - Þetta mun eyða öllum vafragögnum þínum. Tímabil sem á að hreinsa @@ -1943,4 +1939,12 @@ Farðu í stillingar Firefox-tillögur + + + + fella saman + + þenja út + + opna tengil til að læra meira um þetta safn diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 50b975a50..bb859ac0e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -308,6 +308,9 @@ La sincronizzazione delle tue schede è in corso. Riprendi da dove avevi interrotto sull’altro dispositivo. + + Chiudi + Apri una nuova scheda in %1$s @@ -398,8 +401,6 @@ Personalizza - Sincronizza segnalibri, cronologia e molto altro con il tuo account Firefox - Accedi per sincronizzare schede, segnalibri, password e altro ancora. Account Firefox @@ -601,9 +602,6 @@ Consenti a Mozilla di installare e condurre studi - - Attiva Sync - Sincronizza e salva i tuoi dati @@ -824,9 +822,6 @@ %1$s (modalità Navigazione anonima) - - Altre schede - Immetti i termini di ricerca @@ -1107,6 +1102,8 @@ Condividi + + Salva come PDF Invia a dispositivo @@ -1254,8 +1251,6 @@ Esci - - Questa azione eliminerà tutti i dati di navigazione. Intervallo di tempo da cancellare @@ -1995,4 +1990,12 @@ Vai alle impostazioni Firefox Suggest + + + + comprimi + + espandi + + apri il link per ulteriori informazioni su questa raccolta diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index cdb3cf4c0..ce8bf5b70 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -303,6 +303,9 @@ הלשוניות שלך מסתנכרנות! אפשר להמשיך מאיפה שהפסקת משאר המכשירים שלך. + + סגירה + פתיחת לשונית %1$s חדשה @@ -1059,6 +1062,8 @@ שיתוף + + שמירה כ־PDF שליחה למכשיר @@ -1933,4 +1938,12 @@ מעבר להגדרות הצעות של Firefox + + + + לכווץ + + להרחיב + + לפתוח קישור כדי ללמוד עוד על אוסף זה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 44f9f4108..17a731cf4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -310,6 +310,9 @@ タブが同期されます! 他の端末の中断したところから再開しましょう。 + + 閉じる + %1$s の新しいタブで開く @@ -1084,6 +1087,8 @@ 共有 + + PDF として保存 端末へ送信 @@ -1966,4 +1971,12 @@ 設定を開く Firefox Suggest + + + + 折りたたむ + + 展開する + + このコレクションの詳細についてはリンク先をご覧ください diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 7403aac93..1e5783d7a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -310,6 +310,9 @@ 탭이 동기화 중입니다! 다른 기기에서 중단한 부분부터 다시 시작하세요. + + 닫기 + 새 %1$s 탭 열기 @@ -399,8 +402,6 @@ 사용자 지정 - Firefox 계정으로 북마크, 기록 등을 동기화하세요 - 탭, 북마크, 비밀번호 등을 동기화하려면 로그인하세요. Firefox 계정 @@ -599,9 +600,6 @@ Mozilla가 연구를 설치하고 실행하도록 허용 - - Sync 켜기 - 데이터 동기화 및 저장 @@ -821,9 +819,6 @@ %1$s (사생활 보호 모드) - - 기타 탭 - 검색어 입력 @@ -1108,6 +1103,8 @@ 공유 + + PDF로 저장 기기로 보내기 @@ -1257,8 +1254,6 @@ 종료 - - 탐색 데이터가 모두 삭제됩니다. 삭제할 시간 범위 @@ -2001,4 +1996,12 @@ 설정으로 이동 Firefox 제안 + + + + 접기 + + 펼치기 + + 이 모음집에 대해 더 알아보려면 링크를 여세요 diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index ce8cd7f2a..f3d5ebea1 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -302,6 +302,9 @@ ແຖບຂອງທ່ານກຳລັງຊິ້ງຢູ່! ເອົາບ່ອນທີ່ເຈົ້າຄ້າງໄວ້ໃນອຸປະກອນອື່ນຂອງເຈົ້າ. + + ປິດ + ເປີດແຖບ %1$s ໃໝ່ @@ -1078,6 +1081,8 @@ ແບ່ງປັນ + + ບັກທຶກເປັນ PDF ສົ່ງໄປຫາອຸປະກອນ @@ -1971,4 +1976,12 @@ ໄປທີ່ການຕັ້ງຄ່າ Firefox ແນະນໍາ + + + + ຫຍໍ້ + + ຂະຫຍາຍອອກ + + ເປີດລິ້ງເພື່ອສຶກສາເພີ່ມເຕີມກ່ຽວກັບຄໍເລັກຊັນນີ້ diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7a3dd7101..5758e615b 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -311,6 +311,9 @@ Uw tabbladen worden gesynchroniseerd! Ga verder waar u was gebleven op uw andere apparaat. + + Sluiten + Een nieuw %1$s-tabblad openen @@ -399,8 +402,6 @@ Aanpassen - Synchroniseer bladwijzers, geschiedenis en meer met uw Firefox-account - Meld u aan om uw tabbladen, bladwijzers, wachtwoorden en meer te synchroniseren. Firefox-account @@ -596,8 +597,6 @@ Stelt Mozilla in staat om onderzoeken te installeren en uit te voeren - - Sync inschakelen Uw gegevens synchroniseren en opslaan @@ -818,9 +817,6 @@ %1$s (privémodus) - - Overige tabbladen - Voer zoektermen in @@ -1086,6 +1082,8 @@ Delen + + Opslaan als PDF Verzenden naar apparaat @@ -1227,8 +1225,6 @@ Afsluiten - - Hierdoor worden al uw navigatiegegevens verwijderd. Te verwijderen tijdsperiode @@ -1962,4 +1958,12 @@ Naar Instellingen Firefox Suggesties + + + + samenvouwen + + uitvouwen + + koppeling openen voor meer info over deze collectie diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index d09d866a2..1566e6e4b 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -304,6 +304,9 @@ Vòstre onglets son sincronizatz ! Tornatz ont èretz sus vòstre autre aparelh. + + Tampar + Dobrir dins un onglet %1$s novèl @@ -1085,6 +1088,8 @@ Partejar + + Enregistrar en PDF Enviar al periferic @@ -1975,4 +1980,12 @@ Anar als paramètres Firefox suggerís + + + + plegar + + desplegar + + dobrir lo ligam per ne saber mai tocant aquesta colleccion diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index b23e7f3e8..fea9e02a5 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -304,6 +304,9 @@ Os seus separadores estão a ser sincronizados! Continue de onde parou no seu outro dispositivo. + + Fechar + Abrir um novo separador do %1$s @@ -1069,6 +1072,8 @@ Partilhar + + Guardar como PDF Enviar para o dispositivo @@ -1947,4 +1952,12 @@ Ir para as definições Sugestões Firefox + + + + colapsar + + expandir + + abrir ligação para saber mais sobre esta coleção diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b96bad7ac..5d0cad7b7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -313,6 +313,9 @@ Ваши вкладки синхронизируются! Продолжайте с того места, на котором остановились на другом устройстве. + + Закрыть + Открыть новую вкладку %1$s @@ -1093,6 +1096,8 @@ Поделиться + + Сохранить как PDF Отправить на устройство @@ -1969,4 +1974,12 @@ Перейти в настройки Firefox Suggest + + + + свернуть + + развернуть + + откройте ссылку, чтобы узнать больше об этой коллекции diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 69b453b48..0e3dc73f2 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -309,6 +309,9 @@ Dina flikar synkroniseras! Fortsätt där du slutade på din andra enhet. + + Stäng + Öppna en ny %1$s-flik @@ -397,8 +400,6 @@ Anpassa - Synkronisera bokmärken, historik och mer med ditt Firefox-konto - Logga in för att synkronisera flikar, bokmärken, lösenord och mer. Firefox-konto @@ -597,8 +598,6 @@ Tillåter Mozilla att installera och köra undersökningar - - Aktivera Sync Synkronisera och spara din data @@ -817,9 +816,6 @@ %1$s (Privat läge) - - Andra flikar - Ange söktermer @@ -1086,6 +1082,8 @@ Dela + + Spara som PDF Skicka till enhet @@ -1229,8 +1227,6 @@ Avsluta - - Detta kommer att ta bort all dina surfdata. Tidsintervall att radera @@ -1966,4 +1962,7 @@ Gå till inställningar Firefox-förslag + + + öppna länken för att lära dig mer om denna samling diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index fc7b84b58..2f3ebc1a1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -305,6 +305,9 @@ Sekmeleriniz eşitleniyor! Diğer cihazınızda kaldığınız yerden devam edin. + + Kapat + Yeni %1$s sekmesi aç @@ -393,8 +396,6 @@ Özelleştir - Firefox hesabınızı kullanarak yer imlerini, geçmişi ve daha fazlasını eşitleyin - Sekmeleri, yer imlerini, parolaları ve daha fazlasını eşitlemek için giriş yapın. Firefox Hesabı @@ -590,8 +591,6 @@ Mozilla’nın araştırmalar yükleyip çalıştırmasına izin verir - - Sync’i etkinleştir Verilerinizi eşitleyin ve kaydedin @@ -810,9 +809,6 @@ %1$s (Gizli Mod) - - Diğer sekmeler - Aranacak terimleri yazın @@ -1079,6 +1075,8 @@ Paylaş + + PDF olarak kaydet Cihaza gönder @@ -1218,8 +1216,6 @@ Çık - - Bu işlem tüm gezinti verilerinizi silecektir. Silinecek zaman aralığı @@ -1953,4 +1949,12 @@ Ayarlara git Firefox Önerileri + + + + daralt + + genişlet + + bu koleksiyon hakkında daha fazla bilgi edinmek için bağlantıyı açın diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3b03db096..751cab7bd 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -305,6 +305,9 @@ Ваші вкладки синхронізуються! Продовжте з того ж місця, де зупинилися на іншому пристрої. + + Закрити + Відкрити нову вкладку %1$s @@ -395,8 +398,6 @@ Пристосування - Синхронізуйте закладки, історію та інші дані з Обліковим записом Firefox - Увійдіть для синхронізації вкладок, закладок, паролів та інших даних. Обліковий запис Firefox @@ -595,8 +596,6 @@ Дозволяє Mozilla встановлювати та запускати дослідження - - Увімкнути синхронізацію Синхронізувати та зберегти дані @@ -814,9 +813,6 @@ %1$s (Приватний режим) - - Інші вкладки - Введіть пошукові терміни @@ -1084,6 +1080,8 @@ Поділитися + + Зберегти як PDF Надіслати на пристрій @@ -1223,8 +1221,6 @@ Вихід - - Це видалить усі ваші дані перегляду. Проміжок часу для видалення @@ -1964,4 +1960,12 @@ Перейти до налаштувань Пропозиції Firefox + + + + згорнути + + розгорнути + + відкрийте посилання, щоб дізнатися більше про цю збірку diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index b60038145..060d4d8fc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -302,6 +302,9 @@ Các thẻ của bạn đang đồng bộ hóa! Tiếp tục nơi bạn đã dừng lại trên thiết bị khác của mình. + + Đóng + Mở thẻ %1$s mới @@ -390,8 +393,6 @@ Tùy biến - Đồng bộ hóa dấu trang, lịch sử và hơn thế nữa với tài khoản Firefox của bạn - Đăng nhập để đồng bộ các thẻ, dấu trang, mật khẩu, v.v. Tài khoản Firefox @@ -586,8 +587,6 @@ Cho phép Mozilla cài đặt và chạy các nghiên cứu - - Bật đồng bộ hóa Đồng bộ hóa và lưu dữ liệu của bạn @@ -803,9 +802,6 @@ %1$s (Chế độ riêng tư) - - Các thẻ khác - Nhập từ tìm kiếm @@ -1071,6 +1067,8 @@ Chia sẻ + + Lưu dưới dạng PDF Gửi đến thiết bị @@ -1208,8 +1206,6 @@ Thoát - - Điều này sẽ xóa tất cả dữ liệu duyệt web của bạn. Khoảng thời gian để xóa @@ -1939,4 +1935,12 @@ Đi đến cài đặt Đề xuất của Firefox + + + + thu gọn + + mở rộng + + mở liên kết để tìm hiểu thêm về bộ sưu tập này diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index dafae6f59..a686b1386 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -307,6 +307,9 @@ 分頁同步中!繼續瀏覽其他裝置上開啟的分頁。 + + 關閉 + 開啟新 %1$s 分頁 @@ -1094,6 +1097,8 @@ 分享 + + 儲存為 PDF 傳送到裝置 @@ -1975,4 +1980,12 @@ 開啟設定 Firefox 建議 + + + + 摺疊 + + 展開 + + 開啟鏈結,了解此收藏集的更多資訊 From 881d761d4f4edcead48545b11cdec0c94afcb649 Mon Sep 17 00:00:00 2001 From: sv-ohorvath Date: Wed, 12 Oct 2022 12:05:32 +0300 Subject: [PATCH 160/407] No issue: Adds TCP & jump back in contextual hints UI tests --- .../mozilla/fenix/ui/ContextualHintsTest.kt | 70 +++++++++++++++++++ .../fenix/ui/OnboardingFeaturesTest.kt | 9 ++- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 17 ++++- .../fenix/ui/robots/HomeScreenRobot.kt | 10 +++ .../fenix/ui/robots/NavigationToolbarRobot.kt | 18 ++--- 5 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/ContextualHintsTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextualHintsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextualHintsTest.kt new file mode 100644 index 000000000..b5c16efc4 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextualHintsTest.kt @@ -0,0 +1,70 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset +import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for verifying the new Cookie protection & homescreen feature hints. + * Note: This involves setting the feature flags On for CFRs which are disabled elsewhere. + * + */ +class ContextualHintsTest { + private lateinit var mockWebServer: MockWebServer + + @get:Rule + val activityTestRule = HomeActivityTestRule( + isJumpBackInCFREnabled = true, + isTCPCFREnabled = true, + isPocketEnabled = false, + isRecentlyVisitedFeatureEnabled = false, + ) + + @Before + fun setUp() { + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun jumpBackInCFRTest() { + val genericPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericPage.url) { + verifyCookiesProtectionHint() + // One back press to dismiss the TCP hint + mDevice.pressBack() + }.goToHomescreen { + verifyJumpBackInMessage() + } + } + + @Test + fun cookieProtectionHintTest() { + val genericPage = getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericPage.url) { + verifyCookiesProtectionHint() + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt index 877d3f95e..83a616680 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingFeaturesTest.kt @@ -9,12 +9,12 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.ui.robots.homeScreen /** * Tests for verifying the new onboarding features. - * Note: This involves setting the feature flags on for the onboarding dialog and - * other CFRs which are disabled elsewhere. + * Note: This involves setting the feature flag On for the onboarding dialog * */ class OnboardingFeaturesTest { @@ -36,7 +36,6 @@ class OnboardingFeaturesTest { } } - @SmokeTest @Test fun upgradingUsersOnboardingSignInButtonTest() { homeScreen { @@ -45,6 +44,10 @@ class OnboardingFeaturesTest { verifyUpgradingUserOnboardingSecondScreen(activityTestRule) }.clickUpgradingUserOnboardingSignInButton(activityTestRule) { verifyTurnOnSyncMenu() + mDevice.pressBack() + } + homeScreen { + verifyHomeScreen() } } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index bab7ef9ac..aa60544f7 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -43,6 +43,7 @@ import org.mozilla.fenix.helpers.Constants.RETRY_COUNT import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.waitForObjects @@ -816,6 +817,15 @@ class BrowserRobot { setCookiesButton.click() } + fun verifyCookiesProtectionHint() { + val hintMessage = + mDevice.findObject( + UiSelector() + .textContains(getStringResource(R.string.tcp_cfr_message)), + ) + assertTrue(hintMessage.waitForExists(waitingTime)) + } + class Transition { private fun threeDotButton() = onView( allOf( @@ -881,7 +891,12 @@ class BrowserRobot { assertTrue( mDevice.findObject(UiSelector().resourceId("$packageName:id/homeLayout")) - .waitForExists(waitingTime), + .waitForExists(waitingTime) || + mDevice.findObject( + UiSelector().text( + getStringResource(R.string.onboarding_home_screen_jump_back_contextual_hint_2), + ), + ).waitForExists(waitingTime), ) HomeScreenRobot().interact() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index 23c4d5814..f0362fff8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -343,6 +343,16 @@ class HomeScreenRobot { return sponsoredShortcut } + fun verifyJumpBackInMessage() { + assertTrue( + mDevice.findObject( + UiSelector().text( + getStringResource(R.string.onboarding_home_screen_jump_back_contextual_hint_2), + ), + ).waitForExists(waitingTime), + ) + } + class Transition { fun openTabDrawer(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt index cddd0a982..a4108bd58 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt @@ -22,18 +22,17 @@ import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent -import androidx.test.espresso.matcher.ViewMatchers.withResourceName import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers.allOf -import org.hamcrest.CoreMatchers.anyOf import org.hamcrest.CoreMatchers.not import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click @@ -98,12 +97,15 @@ class NavigationToolbarRobot { mDevice.pressEnter() runWithIdleRes(sessionLoadedIdlingResource) { - onView( - anyOf( - withResourceName("browserLayout"), - withResourceName("download_button"), - ), - ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + assertTrue( + mDevice.findObject( + UiSelector().resourceId("$packageName:id/browserLayout"), + ).waitForExists(waitingTime) || mDevice.findObject( + UiSelector().resourceId("$packageName:id/download_button"), + ).waitForExists(waitingTime) || mDevice.findObject( + UiSelector().text(getStringResource(R.string.tcp_cfr_message)), + ).waitForExists(waitingTime), + ) } BrowserRobot().interact() From 3dfbae0d101e573b7ddd48aa7e113de824731664 Mon Sep 17 00:00:00 2001 From: Johan Lorenzo Date: Thu, 13 Oct 2022 17:37:10 +0200 Subject: [PATCH 161/407] Pin relbot Github Action to the 1.0.0 tag https://github.com/mozilla-mobile/relbot/pull/88 will introduce some breaking changes that shouldn't make the fenix repo. --- .github/workflows/update-ac.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-ac.yml b/.github/workflows/update-ac.yml index 952b16c30..22d25bffd 100644 --- a/.github/workflows/update-ac.yml +++ b/.github/workflows/update-ac.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: "Update Android-Components" - uses: mozilla-mobile/relbot@master + uses: mozilla-mobile/relbot@1.0.0 if: github.repository == 'mozilla-mobile/fenix' with: project: fenix From ba9791e41ffb2fab9d688b3975c2db18c62658b7 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 13 Oct 2022 14:51:47 +0000 Subject: [PATCH 162/407] Update to Android-Components 107.0.20221013143128. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f067db6be..5274fe246 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221012190125" + const val VERSION = "107.0.20221013143128" } From faf6d30928692196c1ebf1d36098e3ae45ea79b3 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 10 Oct 2022 21:13:16 -0400 Subject: [PATCH 163/407] Update Kotlin and coroutines. --- buildSrc/src/main/java/Dependencies.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 084cd2db3..81e94bda4 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -6,8 +6,8 @@ // FORCE REBUILD 2022-09-16 object Versions { - const val kotlin = "1.7.10" - const val coroutines = "1.6.1" + const val kotlin = "1.7.20" + const val coroutines = "1.6.4" // These versions are linked: lint should be X+23.Y.Z of gradle_plugin version, according to: // https://github.com/alexjlockwood/android-lint-checks-demo/blob/0245fc027463137b1b4afb97c5295d60dce998b6/dependencies.gradle#L3 @@ -21,7 +21,7 @@ object Versions { const val jna = "5.8.0" const val androidx_compose = "1.2.1" - const val androidx_compose_compiler = "1.3.0" + const val androidx_compose_compiler = "1.3.2" const val androidx_appcompat = "1.3.0" const val androidx_benchmark = "1.0.0" const val androidx_biometric = "1.1.0" From aac92cbb492bf2c7e501064936dbc74078f34d21 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 13 Oct 2022 19:36:12 +0000 Subject: [PATCH 164/407] Update to Android-Components 107.0.20221013190102. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5274fe246..204b94fe3 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221013143128" + const val VERSION = "107.0.20221013190102" } From 1d4fc6aa360f764ccde4e34ee511db141873a81e Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Thu, 13 Oct 2022 10:36:00 -0700 Subject: [PATCH 165/407] For #27396 - Add optional text colors to SelectableChip --- .../mozilla/fenix/compose/SelectableChip.kt | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt b/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt index 3e709f50d..ae2e04aba 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/SelectableChip.kt @@ -33,6 +33,8 @@ import org.mozilla.fenix.theme.Theme * * @param text [String] displayed in this chip. Ideally should only be one word. * @param isSelected Whether this should be shown as selected. + * @param selectedTextColor Optional text [Color] when the chip is selected. + * @param unselectedTextColor Optional text [Color] when the chip is not selected. * @param selectedBackgroundColor Optional background [Color] when the chip is selected. * @param unselectedBackgroundColor Optional background [Color] when the chip is not selected. * @param onClick Callback for when the user taps this. @@ -41,6 +43,8 @@ import org.mozilla.fenix.theme.Theme fun SelectableChip( text: String, isSelected: Boolean, + selectedTextColor: Color? = null, + unselectedTextColor: Color? = null, selectedBackgroundColor: Color? = null, unselectedBackgroundColor: Color? = null, onClick: () -> Unit, @@ -62,9 +66,9 @@ fun SelectableChip( text = text.capitalize(Locale.current), style = TextStyle(fontSize = 14.sp), color = if (isSelected) { - FirefoxTheme.colors.textActionPrimary + selectedTextColor ?: FirefoxTheme.colors.textActionPrimary } else { - FirefoxTheme.colors.textActionTertiary + unselectedTextColor ?: FirefoxTheme.colors.textActionTertiary }, ) } @@ -90,7 +94,7 @@ private fun SelectableChipPreview() { @Composable @Preview(uiMode = UI_MODE_NIGHT_YES) @Preview(uiMode = UI_MODE_NIGHT_NO) -private fun SelectableChipWithBackgroundColorPreview() { +private fun SelectableChipWithCustomColorsPreview() { FirefoxTheme(theme = Theme.getTheme()) { Row( modifier = Modifier @@ -98,8 +102,18 @@ private fun SelectableChipWithBackgroundColorPreview() { .background(FirefoxTheme.colors.layer1), horizontalArrangement = Arrangement.SpaceEvenly, ) { - SelectableChip(text = "Chirp", isSelected = false, unselectedBackgroundColor = Color.Cyan) { } - SelectableChip(text = "Chirp", isSelected = true, selectedBackgroundColor = Color.Yellow) { } + SelectableChip( + text = "Chirp", + isSelected = false, + unselectedTextColor = FirefoxTheme.colors.textSecondary, + unselectedBackgroundColor = Color.Cyan, + ) { } + SelectableChip( + text = "Chirp", + isSelected = true, + selectedTextColor = Color.Black, + selectedBackgroundColor = Color.Yellow, + ) { } } } } From b36ce9fd34d66b17d156d53f16e00f4674e06c11 Mon Sep 17 00:00:00 2001 From: Sammy Khamis Date: Thu, 13 Oct 2022 09:24:26 -1000 Subject: [PATCH 166/407] For #27117 - Update copy for the menu from "Sign in to sync" to "Sync and save data" --- .../fenix/ui/robots/SettingsSubMenuLoginsAndPasswordRobot.kt | 2 +- .../java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt | 4 ++-- .../mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt | 2 +- app/src/main/res/values/strings.xml | 4 +++- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordRobot.kt index 103f6e5fe..ddb1ff91b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuLoginsAndPasswordRobot.kt @@ -110,5 +110,5 @@ private fun assertDefaultValueAutofillLogins(context: Context) = onView( private fun assertDefaultValueExceptions() = onView(ViewMatchers.withText("Exceptions")) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -private fun assertDefaultValueSyncLogins() = onView(ViewMatchers.withText("Sign in to Sync")) +private fun assertDefaultValueSyncLogins() = onView(ViewMatchers.withText("Sync and save data")) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 865e17ada..d8f11ee79 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -173,7 +173,7 @@ class ThreeDotMenuMainRobot { fun openSyncSignIn(interact: SyncSignInRobot.() -> Unit): SyncSignInRobot.Transition { threeDotMenuRecyclerView().perform(swipeDown()) - mDevice.waitNotNull(Until.findObject(By.text("Sign in to sync")), waitingTime) + mDevice.waitNotNull(Until.findObject(By.text("Sync and save data")), waitingTime) signInToSyncButton().click() SyncSignInRobot().interact() @@ -440,7 +440,7 @@ private fun bookmarksButton() = onView(allOf(withText(R.string.library_bookmarks private fun assertBookmarksButton() = bookmarksButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -private fun signInToSyncButton() = onView(withText("Sign in to sync")) +private fun signInToSyncButton() = onView(withText("Sync and save data")) private fun assertSignInToSyncButton() = signInToSyncButton().check(matches(isDisplayed())) private fun helpButton() = onView(allOf(withText(R.string.browser_menu_help))) diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 385ec50d1..e1cf0ff2e 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -352,7 +352,7 @@ open class DefaultToolbarMenu( private fun syncMenuItem(): BrowserMenuImageText? { val syncItemTitle = if (context.components.backgroundServices.accountManagerAvailableQueue.isReady()) { - accountManager.accountProfileEmail ?: context.getString(R.string.sync_menu_sign_in) + accountManager.accountProfileEmail ?: context.getString(R.string.sync_menu_sync_and_save_data) } else { null } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index 60a28586f..a5425ad61 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -100,7 +100,7 @@ class HomeMenu( private fun syncSignInMenuItem(): BrowserMenuImageText? { val syncItemTitle = if (context.components.backgroundServices.accountManagerAvailableQueue.isReady()) { - accountManager.accountProfileEmail ?: context.getString(R.string.sync_menu_sign_in) + accountManager.accountProfileEmail ?: context.getString(R.string.sync_menu_sync_and_save_data) } else { null } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 97f13d4a4..8ed348ef6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1043,9 +1043,11 @@ Copied to clipboard - Sign in to sync + Sign in to sync Sign in to Sync + + Sync and save data Send to all devices From 6661a61e57006c910048753e8b0379eaff3941e5 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 14 Oct 2022 03:02:21 +0200 Subject: [PATCH 167/407] Import l10n. (#27404) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/res/values-cy/strings.xml | 22 ++++++++++++--------- app/src/main/res/values-hu/strings.xml | 22 ++++++++++++--------- app/src/main/res/values-kk/strings.xml | 13 ++++++++++++ app/src/main/res/values-nb-rNO/strings.xml | 23 ++++++++++++---------- app/src/main/res/values-pa-rIN/strings.xml | 13 ++++++++++++ app/src/main/res/values-pt-rBR/strings.xml | 13 ++++++++++++ app/src/main/res/values-sk/strings.xml | 13 ++++++++++++ app/src/main/res/values-sv-rSE/strings.xml | 5 +++++ app/src/main/res/values-zh-rCN/strings.xml | 13 ++++++++++++ 9 files changed, 109 insertions(+), 28 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index eada27a7d..a922678c1 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -301,6 +301,9 @@ Mae eich tabiau’n cydweddu! Ewch ymlaen o’r lle roeddech chi ar eich dyfais arall. + + Cau + Agor tab %1$s newydd @@ -390,8 +393,6 @@ Cyfaddasu - Cydweddu nodau tudalen, hanes, a mwy gyda’ch Cyfrif Firefox - Mewngofnodwch i gydweddu tabiau, nodau tudalen, cyfrineiriau, a rhagor. Cyfrif Firefox @@ -586,8 +587,6 @@ Yn caniatáu i Mozilla osod a rhedeg astudiaethau - - Cychwyn Sync Cydweddu a chadw eich data @@ -805,9 +804,6 @@ %1$s (Modd Preifat) - - Tabiau eraill - Rhowch gair chwilio @@ -1074,6 +1070,8 @@ Rhannu + + Cadw fel PDF Anfon i ddyfais @@ -1212,8 +1210,6 @@ Gadael - - Bydd hyn yn dileu’ch holl ddata pori. Ystod amser i’w ddileu @@ -1948,4 +1944,12 @@ Mynd i gosodiadau Awgrymiadau Firefox + + + + cau + + ehangu + + agorwch y ddolen i ddysgu rhagor am y casgliad hwn diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 2a89dd1a6..be2e7497e 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -306,6 +306,9 @@ A lapjai szinkronizálódnak! Folytassa onnan, ahol abbahagyta a másik eszközén. + + Bezárás + Új %1$s lap megnyitása @@ -394,8 +397,6 @@ Testreszabás - Könyvjelzők, előzmények és egyebek szinkronizálása a Firefox-fiókjával - Jelentkezzen be a lapok, könyvjelzők, jelszavak és sok más szinkronizálásához. Firefox-fiók @@ -591,8 +592,6 @@ Engedélyezés, hogy a Mozilla tanulmányokat telepítsen és futtasson - - Sync bekapcsolása Szinkronizálja és mentse adatait @@ -814,9 +813,6 @@ %1$s (privát mód) - - Más lapok - Adja meg a keresési kifejezéseket @@ -1083,6 +1079,8 @@ Megosztás + + Mentés PDF-ként Küldés eszközre @@ -1224,8 +1222,6 @@ Kilépés - - Ez törli az összes böngészési adatot. Törlendő időtartomány @@ -1964,4 +1960,12 @@ Ugrás a beállításokhoz Firefox Suggest + + + + összecsukás + + kibontás + + hivatkozás megnyitása, hogy többet tudjon meg a gyűjteményről diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 744402d83..0e697a978 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -300,6 +300,9 @@ Сіздің беттеріңіз синхрондалуда! Осында басқа құрылғыда тоқтаған жерден жалғастырыңыз. + + Жабу + Жаңа %1$s бетін ашу @@ -1059,6 +1062,8 @@ Бөлісу + + PDF ретінде сақтау Құрылғыға жіберу @@ -1935,4 +1940,12 @@ Баптауларға өту Firefox ұсынысы + + + + бүктеу + + жазық қылу + + осы жинақ туралы көбірек білу үшін сілтемені ашыңыз diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d26d1f6e9..472eb1a74 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -306,6 +306,9 @@ Fanene dine synkroniseres! Fortsett der du sluttet på den andre enheten. + + Lukk + Åpne en ny %1$s-fane @@ -394,8 +397,6 @@ Tilpass - Synkroniser bokmerker, historikk og mer med Firefox-kontoen din - Logg inn for å synkronisere faner, bokmerker, passord med mer. Firefox-konto @@ -591,8 +592,6 @@ Tillater Mozilla å installere og kjøre undersøkelser - - Slå på Sync Synkroniser og lagre dataene dine @@ -810,9 +809,6 @@ %1$s (privatmodus) - - Andre faner - Skriv inn søketekst @@ -1082,6 +1078,8 @@ Del + + Lagre som PDF Send til enhet @@ -1221,9 +1219,6 @@ Avslutt - - Dette vil slette alle dine nettleserdata. - Tidsrom for sletting @@ -1971,4 +1966,12 @@ Gå til innstillinger Firefox-forslag + + + + slå sammen + + fold ut + + åpne lenken for å lære mer om denne samlingen diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 618dc3c4f..eb7d6b1a3 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -310,6 +310,9 @@ ਤੁਹਾਡੀਆਂ ਟੈਬਾਂ ਸਿੰਕ ਹੋ ਰਹੀਆਂ ਹਨ! ਆਪਣੇ ਹੋਰ ਡਿਵਾਈਸ ਉੱਤੇ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡੋ, ਉਥੋਂ ਹੀ ਤੁਸੀਂ ਹੀ ਸ਼ੁਰੂ ਕਰੋ। + + ਬੰਦ ਕਰੋ + ਨਵੀਂ %1$s ਟੈਬ ਖੋਲ੍ਹੋ @@ -1083,6 +1086,8 @@ ਸਾਂਝਾ ਕਰੋ + + PDF ਵਜੋਂ ਸੰਭਾਲੋ ਡਿਵਾਈਸ ‘ਤੇ ਭੇਜੋ @@ -1959,4 +1964,12 @@ ਸੈਟਿੰਗਾਂ ਉੱਤੇ ਜਾਓ Firefox ਸੁਝਾਅ + + + + ਸਮੇਟੋ + + ਫੈਲਾਓ + + ਇਹ ਭੰਡਾਰ ਬਾਰੇ ਹੋਰ ਸਿੱਖਣ ਲਈ ਲਿੰਕ ਖੋਲ੍ਹੋ diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7aaca4538..a1bc2ee68 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -306,6 +306,9 @@ Suas abas estão sendo sincronizadas! Continue de onde parou em outro dispositivo. + + Fechar + Abrir nova aba no %1$s @@ -1072,6 +1075,8 @@ Compartilhar + + Salvar como PDF Enviar para dispositivo @@ -1952,4 +1957,12 @@ Ir para configurações Sugestões Firefox + + + + recolher + + expandir + + abrir link para saber mais sobre esta coleção diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 796ed45e5..c4071e913 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -307,6 +307,9 @@ Vaše karty sa synchronizujú! Na druhom zariadení pokračujte tam, kde ste tu prestali. + + Zavrieť + Otvoriť novú kartu %1$su @@ -1078,6 +1081,8 @@ Zdieľať + + Uložiť ako PDF Odoslať do zariadenia @@ -1949,4 +1954,12 @@ Prejsť do nastavení Návrhy Firefoxu + + + + zbaliť + + rozbaliť + + otvorte odkaz a dozviete sa viac o tejto kolekcii diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 0e3dc73f2..e8c757253 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -1963,6 +1963,11 @@ Gå till inställningar Firefox-förslag + + + fäll in + + expandera öppna länken för att lära dig mer om denna samling diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9e5147942..8ab775811 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -313,6 +313,9 @@ 标签页正在同步!您可在另一设备上继续浏览。 + + 关闭 + 新建 %1$s 标签页 @@ -1106,6 +1109,8 @@ 分享 + + 保存为 PDF 发送到设备 @@ -1988,4 +1993,12 @@ 前往设置 Firefox 建议 + + + + 折叠 + + 展开 + + 访问链接了解此壁纸集的更多信息 From e6ca08df3b0ab99add3e61d32ecb3d79016470a0 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Thu, 13 Oct 2022 19:55:09 -0400 Subject: [PATCH 168/407] Update Google Play Review dependency to 2.0.0 --- app/build.gradle | 4 +++- buildSrc/src/main/java/Dependencies.kt | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ac3415888..c23a12a92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -590,7 +590,9 @@ dependencies { implementation Deps.google_ads_id // Required for the Google Advertising ID - implementation Deps.google_play_store // Required for in-app reviews + // Required for in-app reviews + implementation Deps.google_play_review + implementation Deps.google_play_review_ktx androidTestImplementation Deps.uiautomator androidTestImplementation "tools.fastlane:screengrab:2.0.0" diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 81e94bda4..20f3a2a9c 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -57,7 +57,7 @@ object Versions { const val google_ads_id_version = "16.0.0" - const val google_play_store_version = "1.8.0" + const val google_play_review_version = "2.0.0" const val protobuf = "3.21.6" // keep in sync with the version used in AS. } @@ -260,7 +260,8 @@ object Deps { const val google_ads_id = "com.google.android.gms:play-services-ads-identifier:${Versions.google_ads_id_version}" // Required for in-app reviews - const val google_play_store = "com.google.android.play:core:${Versions.google_play_store_version}" + const val google_play_review = "com.google.android.play:review:${Versions.google_play_review_version}" + const val google_play_review_ktx = "com.google.android.play:review-ktx:${Versions.google_play_review_version}" const val detektApi = "io.gitlab.arturbosch.detekt:detekt-api:${Versions.detekt}" const val detektTest = "io.gitlab.arturbosch.detekt:detekt-test:${Versions.detekt}" From ab7ba4194673a82ad7b6f0b14e11dfd67339e7d5 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 10 Oct 2022 21:18:06 -0400 Subject: [PATCH 169/407] Update Adjust to latest release --- buildSrc/src/main/java/Dependencies.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 20f3a2a9c..0ac991013 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -45,8 +45,8 @@ object Versions { const val mozilla_android_components = AndroidComponents.VERSION - const val adjust = "4.18.3" - const val installreferrer = "1.0" + const val adjust = "4.32.0" + const val installreferrer = "2.2" const val junit = "5.5.2" const val mockk = "1.12.0" From 01990accf9a0254cfe9cee6ad8f20f10d852b777 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 14 Oct 2022 14:55:10 +0000 Subject: [PATCH 170/407] Update to Android-Components 107.0.20221014143152. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 204b94fe3..0a31c3f2f 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221013190102" + const val VERSION = "107.0.20221014143152" } From 53ecff6a21f745171a8bcf74ad7d1bc4092b34c9 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 14 Oct 2022 19:35:23 +0000 Subject: [PATCH 171/407] Update to Android-Components 107.0.20221014190058. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0a31c3f2f..04da6b0f2 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221014143152" + const val VERSION = "107.0.20221014190058" } From 16062968ccca55c9a29a2ea41a6ae3b03fc55f43 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 15 Oct 2022 02:36:14 +0200 Subject: [PATCH 172/407] Import l10n. (#27419) --- app/src/main/res/values-be/strings.xml | 6 +++-- app/src/main/res/values-co/strings.xml | 4 +++- app/src/main/res/values-de/strings.xml | 4 +++- app/src/main/res/values-el/strings.xml | 13 +++++++++-- app/src/main/res/values-es-rMX/strings.xml | 21 +++++++++-------- app/src/main/res/values-fi/strings.xml | 4 +++- app/src/main/res/values-fy-rNL/strings.xml | 4 +++- app/src/main/res/values-hsb/strings.xml | 17 +++++++++++++- app/src/main/res/values-ia/strings.xml | 4 +++- app/src/main/res/values-is/strings.xml | 4 +++- app/src/main/res/values-it/strings.xml | 4 +++- app/src/main/res/values-iw/strings.xml | 4 +++- app/src/main/res/values-ko/strings.xml | 4 +++- app/src/main/res/values-lo/strings.xml | 4 +++- app/src/main/res/values-nb-rNO/strings.xml | 4 +++- app/src/main/res/values-nl/strings.xml | 4 +++- app/src/main/res/values-pt-rBR/strings.xml | 6 +++-- app/src/main/res/values-ru/strings.xml | 4 +++- app/src/main/res/values-skr/strings.xml | 17 +++++++++++++- app/src/main/res/values-sl/strings.xml | 12 ++++++++-- app/src/main/res/values-su/strings.xml | 27 +++++++++++++++++++++- app/src/main/res/values-sv-rSE/strings.xml | 4 +++- app/src/main/res/values-tg/strings.xml | 26 +++++++++++++-------- app/src/main/res/values-tr/strings.xml | 4 +++- app/src/main/res/values-uk/strings.xml | 4 +++- app/src/main/res/values-vi/strings.xml | 4 +++- app/src/main/res/values-zh-rCN/strings.xml | 4 +++- app/src/main/res/values-zh-rTW/strings.xml | 4 +++- 28 files changed, 171 insertions(+), 50 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index cc319e019..01f72005f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1088,9 +1088,11 @@ Скапіявана ў буфер абмену - Увайсці ў сінхранізацыю + Увайсці ў сінхранізацыю Увайсці ў сінхранізацыю + + Сінхранізаваць і захаваць дадзеныя Даслаць на ўсе прылады @@ -1938,7 +1940,7 @@ Аўтазакрыццё ўключана - Наладзьце аўтаматычна адкрываць спасылкі з сайтаў, пошты і паведамленняў у Firefox. + Наладзьце аўтаматычнае адкрыццё спасылак з сайтаў, пошты і паведамленняў у Firefox. Выдаліць diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index 99ec9740c..c9086800e 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -1096,9 +1096,11 @@ Cupiatu in u preme’papei - Cunnettesi per sincrunizà + Cunnettesi per sincrunizà Cunnettesi à Sync + + Sincrunizà è arregistrà i dati Mandà à tutti l’apparechji diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d9405513c..3d61b66d9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1113,9 +1113,11 @@ In Zwischenablage kopiert - Zum Synchronisieren anmelden + Zum Synchronisieren anmelden Bei Sync anmelden + + Daten synchronisieren und speichern An alle Geräte senden diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 23357b346..3cddb5fa9 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1095,9 +1095,11 @@ Αντιγράφηκε στο πρόχειρο - Σύνδεση για συγχρονισμό + Σύνδεση για συγχρονισμό Σύνδεση στο Sync + + Συγχρονισμός και αποθήκευση δεδομένων Αποστολή σε όλες τις συσκευές @@ -1970,4 +1972,11 @@ Μετάβαση στις ρυθμίσεις Προτάσεις Firefox - + + + σύμπτυξη + + ανάπτυξη + + άνοιγμα συνδέσμου για περισσότερες πληροφορίες σχετικά με αυτήν τη συλλογή + diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 76354b0c7..537032cb2 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -303,6 +303,9 @@ ¡Tus pestañas se están sincronizando! Continua donde te quedaste en otro dispositivo. + + Cerrar + Abrir una nueva pestaña en %1$s @@ -392,8 +395,6 @@ Personalizar - Sincronizar marcadores, historial y más con tu cuenta de Firefox - Inicia sesión para sincronizar pestañas, marcadores, contraseñas y más. Cuenta de Firefox @@ -590,8 +591,6 @@ Permite a Mozilla instalar y ejecutar estudios - - Activar Sync Sincroniza y guarda tu información @@ -808,9 +807,6 @@ %1$s (Modo Privado) - - Otras pestañas - Ingresa los términos de búsqueda @@ -1076,6 +1072,8 @@ Compartir + + Guardar como PDF Enviar a dispositivo @@ -1087,9 +1085,11 @@ Copiado al portapapeles - Iniciar sesión para sincronizar + Iniciar sesión para sincronizar Iniciar sesión en Sync + + Sincronizar y guardar datos Enviar a todos los dispositivos @@ -1214,8 +1214,6 @@ Salir - - Se eliminarán todos tus datos de navegación. Rango de tiempo a eliminar @@ -1951,4 +1949,7 @@ Ir a la configuración Firefox Suggest + + + abrir enlace para saber más sobre esta colección diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 97e4356c1..024d45957 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1099,9 +1099,11 @@ Kopioitu leikepöydälle - Kirjaudu Sync-palveluun + Kirjaudu Sync-palveluun Kirjaudu sisään Synciin + + Synkronoi ja tallenna tiedot Lähetä kaikkiin laitteisiin diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 0f01b7312..c2e3574ef 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -1081,9 +1081,11 @@ Kopiearre nei klamboerd - Oanmelde om te syngronisearjen + Oanmelde om te syngronisearjen Oanmelde by Sync + + Syngronisearje en gegevens bewarje Ferstjoere nei alle apparaten diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index 872de2ee1..9d1f97517 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -302,6 +302,9 @@ Waše rajtarki so synchronizuja! Pokročujće, hdźež sće na druhim graće přestał. + + Začinić + Nowy rajtark %1$s wočinić @@ -1073,6 +1076,8 @@ Dźělić + + Jako PDF składować Na grat pósłać @@ -1084,9 +1089,11 @@ Do mjezyskłada kopěrowane - Pola Sync přizjewić + Pola Sync přizjewić Pola Sync přizjewić + + Daty synchronizować a składować Na wšě graty pósłać @@ -1945,4 +1952,12 @@ K nastajenjam Namjety Firefox + + + + schować + + pokazać + + wočińće wotkaz, zo byšće wjace wo tutej zběrce zhonił diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 0421002f5..abd87617d 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -1119,9 +1119,11 @@ Copiate al area de transferentia - Accede pro synchronisar + Accede pro synchronisar Aperir session in Sync + + Synchronisar e salvar datos Inviar a tote le apparatos diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 95a6c24ba..94c44a6ce 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -1079,9 +1079,11 @@ Afritað á klippispjald - Skráðu þig inn til að samstilla + Skráðu þig inn til að samstilla Skráðu þig inn til að samstilla + + Samstilltu og vistaðu gögn Senda í öll tæki diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bb859ac0e..ff53548ad 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1115,9 +1115,11 @@ Copiato negli appunti - Accedi per sincronizzare + Accedi per sincronizzare Accedi per sincronizzare + + Sincronizza e salva i dati Invia a tutti i dispositivi diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index ce8bf5b70..8d72d206e 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1075,9 +1075,11 @@ הועתק ללוח - כניסה כדי לסנכרן + כניסה כדי לסנכרן התחברות אל Sync + + סנכרון ושמירת נתונים שליחה לכל המכשירים diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1e5783d7a..da35c756a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1116,9 +1116,11 @@ 클립보드에 복사됨 - Sync에 로그인 + Sync에 로그인 Sync에 로그인 + + 데이터 동기화 및 저장 모든 기기에 보내기 diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index f3d5ebea1..1c742446b 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1094,9 +1094,11 @@ ສຳເນົາໃສ່ຄລິບບອດແລ້ວ - ເຂົ້າສູ່ລະບົບເພື່ອ Sync + ເຂົ້າສູ່ລະບົບເພື່ອ Sync ລົງຊື່ເຂົ້າໃຊ້ເພື່ອ Sync + + ຊິງຄ໌ແລະບັນທຶກຂໍ້ມູນ ສົ່ງໄປຫາທຸກອຸປະກອນ diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 472eb1a74..9aee186b0 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1091,9 +1091,11 @@ Kopiert til utklippstavle - Logg inn for å synkronisere + Logg inn for å synkronisere Logg inn på Sync + + Synkroniser og lagre data Send til alle enheter diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5758e615b..a07683500 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1095,9 +1095,11 @@ Naar klembord gekopieerd - Aanmelden om te synchroniseren + Aanmelden om te synchroniseren Aanmelden bij Sync + + Synchroniseren en gegevens opslaan Verzenden naar alle apparaten diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a1bc2ee68..34a96c232 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -291,7 +291,7 @@ Mais cores. Melhor privacidade. Mesmo compromisso com pessoas acima de lucros. - Alterne entre celular e notebook + Alterne entre celular e computador Mudar de tela está mais fácil do que nunca @@ -1088,9 +1088,11 @@ Copiado para área de transferência - Entrar para sincronizar + Entrar para sincronizar Entrar no Sync + + Sincronizar e salvar dados Enviar para todos os dispositivos diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5d0cad7b7..9351de8a8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1109,9 +1109,11 @@ Скопировано в буфер обмена - Войти в синхронизацию + Войти в синхронизацию Войти в синхронизацию + + Синхронизация и сохранение данных Отправить на все устройства diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index e0fd0f3c6..568a97ec3 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -299,6 +299,9 @@ تہاݙے ٹیب ہم وقت تھیندے پئے ہن۔ آپݨی ݙوجھی ڈیوائس تے اتھاہوں شروع کرو جتھ تساں چھوڑیا ہائی۔ + + بند کرو + نویں %1$s ٹیب کھولو @@ -1070,6 +1073,8 @@ "Share" button. Opens the share menu when pressed. --> شیئر + + پی ڈی ایف محفوظ کرو ڈیوائس تے بھیڄو @@ -1081,9 +1086,11 @@ کلپ بورڈ تے نقل تھی ڳیا - ہم وقت کرݨ کیتے سائن ان تھیوو + ہم وقت کرݨ کیتے سائن ان تھیوو ہم وقت کرݨ کیتے سائن ان تھیوو + + ڈیٹا ہم وقت کرو تے محفوظ کرو ساریاں ڈیوائساں تے بھیڄو @@ -1951,4 +1958,12 @@ ترتیباں تے ون٘ڄو فائرفوکس تجویز + + + + کٹھا کرو + + کھنڈاؤ + + ایں مجموعے بارے ٻیا سکھݨ کیتے لنک کھولو diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 4355ccd03..bc31d68a9 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -305,6 +305,9 @@ Vaši zavihki se sinhronizirajo! Nadaljujte tam, kjer ste končali na drugi napravi. + + Zapri + Odpri nov zavihek v %1$su @@ -1081,6 +1084,8 @@ Deli + + Shrani kot PDF Pošlji na napravo @@ -1092,9 +1097,11 @@ Kopirano v odložišče - Prijava v sinhronizacijo + Prijava v sinhronizacijo Prijava v Sync + + Sinhroniziraj in shrani podatke Pošlji na vse naprave @@ -1962,4 +1969,5 @@ Pojdi v nastavitve Firefoxovi predlogi - + + diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 0a214a752..0b81fe1b4 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -303,6 +303,9 @@ Tab anjeun keur disingkronkeun! Pilih ti nu ditinggalkeun dina séjén parabot anjeun. + + Tutup + Buka dina tab %1$s anyar @@ -501,6 +504,8 @@ Kumpulan Independent Voices anyar. %s Kumpulan Independent Voices anyar. + + Cobaan képrétkeun kelir Pilih latar anu nyarita ka anjeun. @@ -1073,6 +1078,8 @@ Bagikeun + + Simpen salaku PDF Kirim ka parangkat @@ -1084,9 +1091,11 @@ Ditiron kana papan klip - Asup pikeun nyingkronkeun + Asup pikeun nyingkronkeun Asup ka Sync + + Singkronkeun tur simpen data Kirim ka sadaya parangkat @@ -1263,6 +1272,8 @@ Angkut di tempat nu ku anjeun tinggalkeun Bawa markah, jujutan, jeung kecap sandi ka %1$s di ieu parabot. + + Singkronkeun tab jeung kecap sandi dina sadaya paranti pikeun pindah layar anu mulus. Daptar @@ -1272,8 +1283,12 @@ Pripasi salawasna + + Salindung pripasi sacara baku %1$s otomatis megat maskapé rerencepan nunutur anjeun ngalanglang raramat. + + Miturkeun Total Cookie Protection pikeun ngeureunkeun palacak tina maké réréméh pikeun ngintip anjeun meuntas loka. Baku (bawaan) @@ -1295,6 +1310,8 @@ Kami geus ngarancang %s sangkan anjeun bisa ngatur naon anu dibagikeun onlén jeung naon anu dibagikeun ka kami. + + Firefox ngatur sangkan anjeun bisa nangtukeun naon anu dibagikeun onlén jeung naon anu dibagikeun ka kami. Maca wawaran salindungan kami @@ -1947,4 +1964,12 @@ Buka setélan Firefox Suggest + + + + tilep + + batek + + buka tutumbu pikeun leuwih teleb ngeunaan ieu koléksi diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index e8c757253..e604db7bb 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -1095,9 +1095,11 @@ Kopierad till urklipp - Logga in för att synkronisera + Logga in för att synkronisera Logga in till Sync + + Synkronisera och spara data Skicka till alla enheter diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index cbae94f1a..171a9971e 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -306,6 +306,9 @@ Варақаҳои шумо ҳамоҳанг карда мешаванд! Ҳамаи он ҷойҳоеро, ки шумо дар дастгоҳи дигари худ дидаед, ба даст оред. + + Пӯшидан + Кушодани варақаи нави %1$s @@ -394,8 +397,6 @@ Фармоишдиҳӣ - Ба воситаи ҳисоби Firefox-и худ хатбаракҳо, таърих ва чизҳои дигарро ҳамоҳанг кунед. - Барои ҳамоҳангсозии варақаҳо, хатбаракҳо, ниҳонвожаҳо ва чизҳои дигар, ворид шавед. Ҳисоби Firefox @@ -589,8 +590,6 @@ Ба Mozilla иҷозат медиҳад, ки таҳқиқҳоро насб ва иҷро кунад - - Фаъол кардани ҳамоҳангсозӣ Ҳамоҳангсозӣ ва нигоҳ доштани маълумоти шумо @@ -808,9 +807,6 @@ %1$s (Реҷаи хусусӣ) - - Варақаҳои дигар - Вожаҳои ҷустуҷӯиро ворид намоед @@ -1079,6 +1075,8 @@ Мубодила кардан + + Нигоҳ доштан ҳамчун PDF Фиристодан ба дастгоҳ @@ -1090,9 +1088,11 @@ Ба ҳофизаи муваққатӣ нусха бардошта шуд - Барои ҳамоҳангсозӣ ворид шавед + Барои ҳамоҳангсозӣ ворид шавед Барои ҳамоҳангсозӣ ворид шавед + + Ҳамоҳангсозӣ ва нигоҳ доштани маълумот Фиристодан ба ҳамаи дастгоҳҳо @@ -1221,8 +1221,6 @@ Баромадан - - Ин амал маълумоти тамошокуниро нест мекунад. Фосилаи вақте, ки нест карда мешавад @@ -1957,4 +1955,12 @@ Гузариш ба танзимот Пешниҳоди Firefox + + + + печондан + + баркушодан + + барои гирифтани маълумоти бештар оид ба ин маҷмуа пайвандро кушоед diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2f3ebc1a1..c50979c74 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1088,9 +1088,11 @@ Panoya kopyalandı - Eşitlemek için giriş yap + Eşitlemek için giriş yap Sync’e giriş yap + + Verileri eşitle ve kaydet Tüm cihazlara gönder diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 751cab7bd..204d56131 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1094,9 +1094,11 @@ Скопійовано у буфер обміну - Увійти до синхронізації + Увійти до синхронізації Увійти до Синхронізації + + Синхронізувати й зберегти дані Надіслати на всі пристрої diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 060d4d8fc..f63c60758 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1080,9 +1080,11 @@ Đã sao chép vào khay nhớ tạm - Đăng nhập vào đồng bộ hóa + Đăng nhập vào đồng bộ hóa Đăng nhập vào đồng bộ hóa + + Đồng bộ hóa và lưu dữ liệu Gửi đến tất cả các thiết bị diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8ab775811..4d4e1dec1 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1122,9 +1122,11 @@ 已复制到剪贴板 - 登录同步服务 + 登录同步服务 登录同步服务 + + 同步并保存数据 发送到所有设备 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a686b1386..ad2092156 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1110,9 +1110,11 @@ 已複製至剪貼簿 - 登入進行同步 + 登入進行同步 登入 Sync + + 同步並儲存資料 傳送到所有裝置 From 4c0571af2261f88936c495b8e74cee04bee0300e Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 15 Oct 2022 15:21:55 +0000 Subject: [PATCH 173/407] Update to Android-Components 107.0.20221015145354. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 04da6b0f2..29201b84d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221014190058" + const val VERSION = "107.0.20221015145354" } From cd2a8987ea8fc47f39f194bf7f39f7362b283227 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sun, 16 Oct 2022 02:34:27 +0200 Subject: [PATCH 174/407] Import l10n. (#27424) --- app/src/main/res/values-ast/strings.xml | 6 +++--- app/src/main/res/values-en-rGB/strings.xml | 4 +++- app/src/main/res/values-es-rAR/strings.xml | 4 +++- app/src/main/res/values-pt-rPT/strings.xml | 4 +++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 36d7c8d90..a09cc4648 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -704,7 +704,7 @@ Perdona mas %1$s nun pue cargar esa páxina. - Unviar un informe del fallu a Mozilla + Unviar un informe del error a Mozilla Zarrar la llingüeta @@ -895,7 +895,7 @@ Usóse apocayá - Aniciar sesión pa sincronizar + Aniciar sesión pa sincronizar Aniciar sesión en Sync @@ -1409,7 +1409,7 @@ en llinia y con nós. Comprueba que la cadena de busca concase col formatu del exemplu - Fallu al conectar con «%s» + Prodúxose un error al conectase a «%s» Creóse %s diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index c03a9db8f..0b9a8ecb1 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -1081,9 +1081,11 @@ Copied to clipboard - Sign in to synchronise + Sign in to synchronise Sign in to Sync + + Synchronise and save data Send to all devices diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 8d72e2d5e..f86d87cd2 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -1105,9 +1105,11 @@ Copiado al portapapeles - Iniciá sesión para sincronizar + Iniciá sesión para sincronizar Iniciar sesión en Sync + + Sincronizar y guardar datos Enviar a todos los dispositivos diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index fea9e02a5..0d7cbf4cd 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -1085,9 +1085,11 @@ Copiado para a área de transferência - Iniciar sessão para sincronizar + Iniciar sessão para sincronizar Iniciar sessão para sincronizar + + Sincronizar e guardar os dados Enviar para todos os dispositivos From f362aed4b22a84462cf30e6eda26c2e9279979b4 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 16 Oct 2022 14:51:32 +0000 Subject: [PATCH 175/407] Update to Android-Components 107.0.20221016143152. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 29201b84d..13c57a7e2 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221015145354" + const val VERSION = "107.0.20221016143152" } From 9284513b494bbd6dc0802631f678b82ad22f349a Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 17 Oct 2022 02:35:26 +0200 Subject: [PATCH 176/407] Import l10n. (#27431) --- app/src/main/res/values-es-rES/strings.xml | 17 +++++++- app/src/main/res/values-in/strings.xml | 17 +++++++- app/src/main/res/values-kk/strings.xml | 6 ++- app/src/main/res/values-kmr/strings.xml | 50 +++++++++++++++++++++- app/src/main/res/values-sk/strings.xml | 4 +- 5 files changed, 88 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index c5c1b44c6..e6fc24b1e 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -309,6 +309,9 @@ ¡Tus pestañas se están sincronizando! Continúa donde lo dejaste en otro dispositivo. + + Cerrar + Abrir una pestaña nueva de %1$s @@ -1092,6 +1095,8 @@ Compartir + + Guardar como PDF Enviar a dispositivo @@ -1103,9 +1108,11 @@ Copiado al portapapeles - Inicia sesión para sincronizar + Inicia sesión para sincronizar Iniciar sesión en Sync + + Sincronizar y guardar datos Enviar a todos los dispositivos @@ -1979,4 +1986,12 @@ Ir a ajustes Firefox Suggest + + + + contraer + + expandir + + abrir enlace para saber más sobre esta colección diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 8c2d2ce9c..f5b7da4de 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -308,6 +308,9 @@ Tab Anda sedang disinkronkan! Lanjutkan di mana Anda tinggalkan di perangkat Anda yang lain. + + Tutup + Buka di tab %1$s baru @@ -1078,6 +1081,8 @@ Bagikan + + Simpan sebagai PDF Kirim ke peranti @@ -1089,9 +1094,11 @@ Tersalin ke papan klip - Masuk untuk menyinkronkan + Masuk untuk menyinkronkan Masuk ke Sync + + Sinkronkan dan simpan data Kirim ke semua peranti @@ -1949,4 +1956,12 @@ Buka pengaturan Saran Firefox + + + + ciutkan + + bentangkan + + buka tautan untuk mempelajari lebih lanjut tentang koleksi ini diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 0e697a978..e7a10d853 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -583,7 +583,7 @@ - Деректерді синхрондау және сақтау + Синхрондау және деректерді сақтау Қайта байланысу үшін кіру @@ -1075,9 +1075,11 @@ Алмасу буферіне көшірілді - Синхрондау ішіне кіру + Синхрондау ішіне кіру Синхрондау ішіне кіру + + Синхрондау және деректерді сақтау Барлық құрылғыларға жіберу diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index cf81b9d18..b0be0f7a6 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -80,6 +80,9 @@ Bigire + + + Fonksiyona me ya ewlekariyê ya heta niha herî xurt, kodên şopandinê yên di navbera malperan de îzole dike. Li ser parastina xurekan a giştî agahî bistîne @@ -279,10 +282,20 @@ Serûpela te ya Firefoxê ya şexsîkirî niha hêsantir dike ku tu li ciyê lê mayî dewam bikî. Hilpekîn, bijare û encamên dawiyê yên lêgerînên xwe bibîne. + + Serûpela xwe ya taybet nas bike. Tu yê li virê hilpekîn, bijare û encamên lêgerînên xwe yên dawiyê bibînî. Tu bi xêr hatiyî înterneteke serbixwe Tu bi xêr hatiyî înterneteke kesanetir + + Rengên zêdetir. Ewlekariya çêtir. Ne ji bo pereyan, ji bo mirovahiyê. + + Ji telefonê derbasî kompîturê, ji kompîturê derbasî telefonê bibe + + Derbasbûna ji cîhazekê bo cîhazeke din êdî hêsantir e + + Êdî hilpekînên te yên cîhazên din di serûpela te de ne. Dest pê bike @@ -290,6 +303,11 @@ Derbas bike + + Hilpekînên te tên senkronîzekirin! Di cîhazên din de li ciyê lê mayî dewam bike. + + Bigire + Hilpekînek nû ya %1$s `ê veke @@ -478,6 +496,8 @@ Klasîk %s + + Edîsyona Sînorkirî Koleksiyana dengên serbixwe ya nû. %s @@ -1055,6 +1075,8 @@ Parve bike + + Wekî PDF qeyd bike Bişîne cîhazê @@ -1066,9 +1088,11 @@ Li panoyê hat kopîkirin - Ji bo senkronîzekirinê têkevê + Ji bo senkronîzekirinê têkevê Têkeve Sync’ê + + Senkronîze bike û daneyan qeyd bike Ji hemû cîhazan re bişîne @@ -1233,10 +1257,16 @@ Tu bi xêr hatî %s’ê! Tu bi xêr hatiyî înterneta baştir + + Gerokeke ji bo mirovan hatiye çêkirin, ne ji bo pereyan. Firefoxê di navbera amûran de senkronîze bike + + Ji ciyê lê mayî dewam bike Bijareyan, raboriyê û şîfreyan bîne nav %1$s`ê. + + Ji bo derbasbûna bêproblem ya di navbera cîhazan de hilpekîn û şîfreyên xwe senkronîze bike. Xwe tomar bike @@ -1249,6 +1279,8 @@ Parastina nihêniyê temî vekirî ye %1$s bi awayekî xweber asteng dike ku şirket we li ser webê bi dizî bişopînin. + + Parastina çerezan ya bi temamî kodên şopandinê asteng dike ku nikaribin te li ser webê bişopînin. Standard (jixweber) @@ -1270,9 +1302,13 @@ Me %s ji bo hindê çêkiriye ku derbarê tiştên tu li ser înternetê û tiştên bi me re parve dikî de kontrol di destê te de be. + + Firefox kontrola hindê dide te ka tu li ser înternetê bi kesên din û bi me re çi parve dikî. Agahdariya me ya nihêniyê bixwîne + + Tu amadeyî ku înterneteke nûwaze keşf bikî? Dest bi gerînê bike @@ -1360,6 +1396,8 @@ Hemû çerezên partiya sêyemîn (dibe ku hin malper xera bibin) Hemû çerez (dibe ku hin malper xera bibin) + + Çerezên nav-malperî îzole bike Naverokên ji bo şopandinê @@ -1382,6 +1420,8 @@ Taybetiya şopandina çalakiyên te yên gera li ser torên civakî bisînor dike. Çerezên şopandinê yên nav-malperî + + Çerezên nav-malperî Çerezên ku torên reklamê û şirketên analîtîkê ji bo şopandina gera di navbera malperên cuda de bi kar tînin asteng dike. @@ -1906,4 +1946,12 @@ Here eyaran Pêşniyara Firefoxê + + + + teng bike + + fireh bike + + ji bo derbarê vê koleksiyonê de bêtir bizanî, girêdankê veke diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c4071e913..1ef6f9cf6 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -1094,9 +1094,11 @@ Skopírované do schránky - Prihlásiť sa a synchronizovať + Prihlásiť sa a synchronizovať Prihlásiť sa k službe Sync + + Synchronizovať a uložiť údaje Odoslať do všetkých zariadení From 573d854e7c2a34d171d704077ea9b07ad24d1dc0 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 17 Oct 2022 14:56:19 +0000 Subject: [PATCH 177/407] Update to Android-Components 107.0.20221017143148. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 13c57a7e2..1ec25527b 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221016143152" + const val VERSION = "107.0.20221017143148" } From c0fbd2bd13e92bb327cc6d47d3f8d21a01d3d6f4 Mon Sep 17 00:00:00 2001 From: DonalMe <76789979+DonalMe@users.noreply.github.com> Date: Mon, 17 Oct 2022 14:19:31 -0400 Subject: [PATCH 178/407] Update version.txt to 108.0b1. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index fdbbd449f..f9917e586 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -107.0b1 +108.0b1 \ No newline at end of file From 4a118751a3c47406936988700dd6fef8dee9a192 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 14 Oct 2022 10:36:18 -0400 Subject: [PATCH 179/407] Update protobuf to 3.21.7 --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 0ac991013..a04440536 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -59,7 +59,7 @@ object Versions { const val google_play_review_version = "2.0.0" - const val protobuf = "3.21.6" // keep in sync with the version used in AS. + const val protobuf = "3.21.7" // keep in sync with the version used in AS. } @Suppress("unused") From cfe143ae6aaf6aaec7753159e5cb9bfb06315ef7 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 17 Oct 2022 19:40:04 +0000 Subject: [PATCH 180/407] Update to Android-Components 108.0.20221017190200. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 1ec25527b..1c3fb5d85 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "107.0.20221017143148" + const val VERSION = "108.0.20221017190200" } From 8fa81d4cd24eab8f7cbe9467a85490cf2525bb45 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Tue, 18 Oct 2022 02:35:36 +0200 Subject: [PATCH 181/407] Import l10n. (#27441) --- app/src/main/res/values-cy/strings.xml | 4 +- app/src/main/res/values-da/strings.xml | 17 +++++- app/src/main/res/values-es-rMX/strings.xml | 5 ++ app/src/main/res/values-es/strings.xml | 17 +++++- app/src/main/res/values-pt-rBR/strings.xml | 12 ++-- app/src/main/res/values-sat/strings.xml | 65 +++++++++++++++------- 6 files changed, 92 insertions(+), 28 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index a922678c1..bcba4c597 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -1083,9 +1083,11 @@ Copïwyd i’r clipfwrdd - Mewngofnodi i gydweddu + Mewngofnodi i gydweddu Mewngofnodi i Sync + + Cydweddu a chadw data Anfon at bob dyfais diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 5e1da0ecc..7e04a7a2f 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -301,6 +301,9 @@ Dine faneblade synkroniseres! Fortsæt, hvor du slap, på din anden enhed. + + Luk + Åbn et nyt %1$s-faneblad @@ -1061,6 +1064,8 @@ Del + + Gem som PDF Send til enhed @@ -1072,9 +1077,11 @@ Kopieret til udklipsholder - Log ind for at synkronisere + Log ind for at synkronisere Log ind på Sync + + Synkroniser og gem data Send til alle enheder @@ -1928,4 +1935,12 @@ Gå til indstillinger Firefox-forslag + + + + folde sammen + + udvide + + åbne link for at læse mere om denne samling diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 537032cb2..ef748ddb0 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -1950,6 +1950,11 @@ Ir a la configuración Firefox Suggest + + + contraer + + aumentar abrir enlace para saber más sobre esta colección diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c5c1b44c6..e6fc24b1e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -309,6 +309,9 @@ ¡Tus pestañas se están sincronizando! Continúa donde lo dejaste en otro dispositivo. + + Cerrar + Abrir una pestaña nueva de %1$s @@ -1092,6 +1095,8 @@ Compartir + + Guardar como PDF Enviar a dispositivo @@ -1103,9 +1108,11 @@ Copiado al portapapeles - Inicia sesión para sincronizar + Inicia sesión para sincronizar Iniciar sesión en Sync + + Sincronizar y guardar datos Enviar a todos los dispositivos @@ -1979,4 +1986,12 @@ Ir a ajustes Firefox Suggest + + + + contraer + + expandir + + abrir enlace para saber más sobre esta colección diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 34a96c232..cc5ce5c29 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -353,13 +353,13 @@ Permitir captura de tela na navegação privativa - Se permitido, as abas privativas também ficam visíveis quando vários aplicativos estão abertos + Se permitido, abas privativas também permanecem visíveis ao mudar para outros aplicativos Adicionar atalho para navegação privativa Modo somente HTTPS - Tenta se conectar com sites usando automaticamente o protocolo de criptografia HTTPS para maior segurança. + Tentar se conectar com sites usando automaticamente o protocolo de criptografia HTTPS para maior segurança. Ativado @@ -502,9 +502,9 @@ Edição limitada - A nova coleção de vozes independentes. %s + Nova coleção de vozes independentes. %s - A nova coleção de vozes independentes. + Nova coleção de vozes independentes. Experimente um toque de cores @@ -1216,7 +1216,7 @@ Limpar dados de navegação ao sair - Excluir automaticamente os dados de navegação selecionados abaixo ao selecionar \"Sair\" no menu principal + Excluir automaticamente os dados de navegação selecionados abaixo ao tocar em \"Sair\" no menu principal Sair @@ -1347,7 +1347,7 @@ Usar email - Crie uma para sincronizar o Firefox entre dispositivos.]]> + Crie para sincronizar o Firefox entre dispositivos.]]> O %s deixará de sincronizar com sua conta, mas não excluirá seus dados de navegação neste dispositivo. diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 1805074e2..8ea1851ed 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -276,11 +276,16 @@ ᱟᱢᱟᱜ ᱢᱚᱱᱮᱛᱮᱭᱟᱜ Firefox ᱚᱲᱟᱜᱥᱟᱦᱴᱟ ᱫᱚ ᱱᱤᱛᱚᱜ ᱡᱟᱦᱟᱸ ᱨᱮ ᱟᱲᱟᱜ ᱠᱟᱜᱼᱟᱢ ᱚᱱᱰᱮ ᱜᱮ ᱤᱫᱤ ᱢᱮᱭᱟᱭ ᱾ ᱟᱢᱟᱜ ᱱᱤᱛᱚᱜᱟᱜ ᱴᱮᱵᱽ ᱠᱚ, ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱟᱨ ᱥᱮᱸᱫᱽᱨᱟ ᱠᱚ ᱯᱟᱱᱛᱮ ᱛᱟᱢ ᱾ + + ᱫᱮᱞᱟ ᱮᱛᱦᱚᱵ ᱞᱮᱜᱮ ᱵᱚᱱ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱟᱲᱟᱜ + + ᱵᱚᱸᱫᱚᱭ ᱢᱮ + ᱱᱟᱶᱟ ᱴᱮᱵᱽ %1$s ᱡᱷᱤᱡᱽ ᱢᱮ @@ -368,8 +373,6 @@ ᱠᱩᱥᱤᱭᱟᱜ ᱛᱮᱭᱟᱨ - ᱵᱩᱠᱢᱟᱨᱠ, ᱱᱟᱜᱟᱢ ᱟᱨ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱟᱢᱟᱜ Firefox ᱠᱷᱟᱛᱟ ᱥᱟᱶᱛᱮ ᱥᱭᱝᱠ ᱢᱮ - ᱟᱢᱟᱜ ᱴᱮᱵᱽ ᱠᱚ, ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ, ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱟᱨ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱛᱚᱞ ᱡᱚᱠᱷᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱥᱩᱦᱤ ᱮᱢ ᱢᱮ ᱾ Firefox ᱠᱷᱟᱛᱟ @@ -454,6 +457,14 @@ ᱧᱮᱞ + + ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱰᱟᱩᱱᱞᱳᱰ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ + + ᱫᱩᱦᱲᱟᱹ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱢᱮ + + ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱵᱚᱫᱚᱞ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ + + ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ Firefox ᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱞᱚᱜᱚ ᱨᱮ ᱴᱤᱯᱟᱹᱣ ᱠᱟᱛᱮ ᱞᱟᱴᱷᱟ ᱪᱤᱛᱟᱹᱨ ᱵᱚᱫᱚᱞ ᱢᱮ @@ -461,6 +472,13 @@ able to tap on the app logo in the home screen and can switch to different wallpapers by tapping. --> Firefox ᱪᱤᱱᱦᱟᱹᱯ - ᱠᱟᱸᱛᱷᱥᱟᱦᱴᱟ, ᱵᱩᱛᱟᱹᱢ ᱵᱚᱫᱚᱞ ᱢᱮ + + ᱠᱞᱟᱥᱤᱠ %s + + ᱥᱤᱢᱤᱛ ᱮᱰᱤᱥᱚᱱ + + ᱰᱷᱮᱨ ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + ᱮᱰᱼᱚᱱ ᱫᱚ ᱵᱟᱭ ᱟᱠᱟᱱᱟ @@ -542,8 +560,6 @@ Mozilla ᱥᱚᱫᱽᱷ ᱞᱚ ᱟᱹᱛᱩᱨ ᱟᱨ ᱫᱟᱹᱲ ᱪᱷᱚ ᱞᱟᱹᱤᱫᱽ ᱢᱮᱛᱟᱭ ᱢᱮ - - ᱥᱭᱝᱠ ᱪᱟᱹᱞᱩᱭ ᱢᱮ ᱥᱭᱝᱠᱢᱮ ᱟᱨ ᱟᱢᱟᱜ ᱰᱟᱴᱟ ᱥᱟᱺᱪᱟᱣ ᱛᱟᱢ @@ -763,9 +779,6 @@ %1$s (ᱯᱨᱭᱣᱮᱴ ᱢᱳᱰ) - - ᱵᱷᱮᱜᱟᱨ ᱴᱮᱵᱽ ᱠᱚ - ᱥᱮᱸᱫᱽᱨᱟ ᱚᱞ ᱠᱚ ᱟᱫᱮᱨ ᱢᱮ @@ -1033,6 +1046,8 @@ "Share" button. Opens the share menu when pressed. --> ᱦᱟᱹᱴᱤᱧ ᱢᱮ + + PDF ᱞᱮᱠᱷᱟ ᱥᱟᱺᱪᱟᱣ ᱢᱮ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ @@ -1044,9 +1059,11 @@ ᱨᱮᱴᱚᱯ ᱵᱳᱨᱰ ᱨᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ - ᱥᱭᱝᱠ ᱞᱟᱹᱜᱤᱫ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + ᱥᱭᱝᱠ ᱞᱟᱹᱜᱤᱫ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ ᱥᱭᱝᱠ ᱞᱟᱹᱜᱤᱫ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ + + ᱥᱭᱝᱠ ᱟᱨ ᱰᱟᱴᱟ ᱥᱟᱺᱪᱟᱣ ᱡᱚᱛᱚ ᱥᱟᱫᱷᱚᱱ ᱛᱮ ᱵᱷᱮᱡᱟᱭᱢᱮ @@ -1174,8 +1191,6 @@ ᱟᱲᱟᱹᱜ ᱢᱮ - - ᱱᱚᱶᱟ ᱫᱚ ᱟᱢᱟᱜ ᱥᱟᱱᱟᱢ ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱢᱮᱴᱟᱣ ᱛᱟᱢᱟᱭ ᱾ ᱢᱮᱴᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱚᱠᱛᱚ ᱨᱮᱭᱟᱜ ᱨᱮᱧᱡᱽ @@ -1210,19 +1225,21 @@ - %s ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ! + %s ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ! - ᱥᱟᱫᱷᱚᱱ ᱵᱷᱤᱛᱨᱤ ᱨᱮ Firefox ᱥᱭᱝᱠ ᱢᱮ + ᱥᱟᱫᱷᱚᱱ ᱵᱷᱤᱛᱨᱤ ᱨᱮ Firefox ᱥᱭᱝᱠ ᱢᱮ - %1$s ᱨᱮ ᱵᱩᱠᱢᱟᱨᱠᱥ, ᱦᱤᱛᱟᱹᱞ, ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱨᱮ ᱟᱹᱜᱩ ᱪᱷᱚᱭ ᱢᱮ ᱾ + %1$s ᱨᱮ ᱵᱩᱠᱢᱟᱨᱠᱥ, ᱦᱤᱛᱟᱹᱞ, ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱨᱮ ᱟᱹᱜᱩ ᱪᱷᱚᱭ ᱢᱮ ᱾ - ᱥᱩᱦᱤ ᱮᱡ ᱪᱷᱚ + ᱥᱩᱦᱤ ᱮᱡ ᱪᱷᱚ + + ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱥᱭᱝᱠ ᱪᱟᱹᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ - ᱯᱨᱟᱭᱣᱮᱥᱭ ᱡᱷᱚᱛᱚ ᱵᱮᱲᱟ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ + ᱯᱨᱟᱭᱣᱮᱥᱭ ᱡᱷᱚᱛᱚ ᱵᱮᱲᱟ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ - %1$s ᱫᱚ ᱵᱟᱦᱨᱮ ᱠᱚᱢᱯᱟᱱᱤ ᱠᱚ ᱣᱮᱵᱽ ᱨᱮ ᱟᱢ ᱯᱟᱸᱡᱟ ᱠᱚ ᱵᱚᱸᱫᱚᱜᱼᱟ ᱾ + %1$s ᱫᱚ ᱵᱟᱦᱨᱮ ᱠᱚᱢᱯᱟᱱᱤ ᱠᱚ ᱣᱮᱵᱽ ᱨᱮ ᱟᱢ ᱯᱟᱸᱡᱟ ᱠᱚ ᱵᱚᱸᱫᱚᱜᱼᱟ ᱾ ᱵᱮᱥᱟᱜ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) @@ -1234,13 +1251,15 @@ ᱟᱢᱟᱜ ᱴᱩᱞᱵᱟᱨ ᱯᱞᱮᱥᱢᱮᱱᱴ ᱨᱟᱠᱟᱵᱽ ᱛᱟᱢ - ᱴᱩᱞᱵᱟᱨ ᱫᱚ ᱥᱮᱴᱮᱨᱚᱜ ᱴᱷᱮᱱ ᱫᱚᱦᱚᱭ ᱢᱮ ᱾ ᱞᱟᱛᱟᱨ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ, ᱟᱨ ᱵᱟᱝ ᱪᱮᱛᱟᱱ ᱥᱮᱫ ᱩᱪᱟᱹᱲ ᱢᱮ ᱾ + ᱴᱩᱞᱵᱟᱨ ᱫᱚ ᱥᱮᱴᱮᱨᱚᱜ ᱴᱷᱮᱱ ᱫᱚᱦᱚᱭ ᱢᱮ ᱾ ᱞᱟᱛᱟᱨ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ, ᱟᱨ ᱵᱟᱝ ᱪᱮᱛᱟᱱ ᱥᱮᱫ ᱩᱪᱟᱹᱲ ᱢᱮ ᱾ - ᱟᱢᱟᱜ ᱱᱤᱥᱚᱱ + ᱟᱢᱟᱜ ᱱᱤᱥᱚᱱ + + ᱟᱢᱟᱜ ᱰᱟᱴᱟ ᱟᱢᱟᱜ ᱠᱚᱵᱚᱡᱽ ᱨᱮ ᱛᱟᱦᱮᱱ ᱟ - ᱟᱞᱮ %s ᱞᱮ ᱰᱤᱡᱟᱭᱤᱱ ᱟᱠᱟᱫᱼᱟ ᱚᱠᱟ ᱫᱚ ᱡᱟᱦᱟᱱᱟᱜ ᱠᱚ ᱚᱱᱞᱟᱭᱤᱱ ᱦᱟᱹᱴᱤᱧ ᱨᱮ ᱟᱨ ᱚᱠᱟ ᱠᱚ ᱟᱞᱮ ᱦᱟᱹᱤᱧ ᱟᱞᱮᱭᱟᱢ, ᱜᱚᱲᱚ ᱮᱢᱟᱭ ᱾ + ᱟᱞᱮ %s ᱞᱮ ᱰᱤᱡᱟᱭᱤᱱ ᱟᱠᱟᱫᱼᱟ ᱚᱠᱟ ᱫᱚ ᱡᱟᱦᱟᱱᱟᱜ ᱠᱚ ᱚᱱᱞᱟᱭᱤᱱ ᱦᱟᱹᱴᱤᱧ ᱨᱮ ᱟᱨ ᱚᱠᱟ ᱠᱚ ᱟᱞᱮ ᱦᱟᱹᱤᱧ ᱟᱞᱮᱭᱟᱢ, ᱜᱚᱲᱚ ᱮᱢᱟᱭ ᱾ ᱟᱞᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱱᱚᱴᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱯᱮ @@ -1883,4 +1902,12 @@ ᱥᱟᱡᱟᱣ ᱴᱷᱮᱱ ᱪᱟᱞᱟᱜ ᱢᱮ Firefox ᱵᱟᱛᱟᱣ + + + + ᱜᱷᱟᱥᱟᱣ + + ᱚᱥᱟᱨ + + ᱱᱚᱶᱟ ᱡᱟᱣᱨᱟ ᱵᱮᱵᱚᱫ ᱰᱷᱮᱨ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱞᱤᱝᱠ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ From 2b2f3a711ea0cf582a3df4f67cc345e770a4ab5e Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Mon, 17 Oct 2022 16:28:54 +0300 Subject: [PATCH 182/407] For #27405 - Clean up references to "Sing in to Sync" phrase --- .../java/org/mozilla/fenix/ui/BookmarksTest.kt | 2 +- .../org/mozilla/fenix/ui/robots/BookmarksRobot.kt | 8 ++++---- .../mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt | 11 +++++------ .../org/mozilla/fenix/settings/SyncPreferenceView.kt | 7 +++---- .../settings/autofill/AutofillSettingFragment.kt | 2 +- .../logins/fragment/SavedLoginsAuthFragment.kt | 2 +- .../fenix/settings/logins/SyncPreferenceViewTest.kt | 2 +- 7 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index c1c4a4252..8b704f95e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -101,7 +101,7 @@ class BookmarksTest { verifyFolderTitle("Bookmarks Menu") verifyFolderTitle("Bookmarks Toolbar") verifyFolderTitle("Other Bookmarks") - verifySignInToSyncButton() + verifySyncSignInButton() } }.clickSingInToSyncButton { verifyTurnOnSyncToolbarTitle() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 0b4a6d043..2ea293c60 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -138,8 +138,8 @@ class BookmarksRobot { mDevice.waitNotNull(Until.findObject(By.text(childFolderName)), waitingTime) } - fun verifySignInToSyncButton() = - signInToSyncButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + fun verifySyncSignInButton() = + syncSignInButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) fun verifyDeleteFolderConfirmationMessage() = assertDeleteFolderConfirmationMessage() @@ -244,7 +244,7 @@ class BookmarksRobot { } fun clickSingInToSyncButton(interact: SettingsTurnOnSyncRobot.() -> Unit): SettingsTurnOnSyncRobot.Transition { - signInToSyncButton().click() + syncSignInButton().click() SettingsTurnOnSyncRobot().interact() return SettingsTurnOnSyncRobot.Transition() @@ -308,7 +308,7 @@ private fun saveBookmarkButton() = onView(withId(R.id.save_bookmark_button)) private fun deleteInEditModeButton() = onView(withId(R.id.delete_bookmark_button)) -private fun signInToSyncButton() = onView(withId(R.id.bookmark_folders_sign_in)) +private fun syncSignInButton() = onView(withId(R.id.bookmark_folders_sign_in)) private fun assertBookmarksView() { onView( diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index d8f11ee79..008d46869 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -50,7 +50,7 @@ class ThreeDotMenuMainRobot { fun verifyAddOnsButton() = assertAddOnsButton() fun verifyHistoryButton() = assertHistoryButton() fun verifyBookmarksButton() = assertBookmarksButton() - fun verifySyncSignInButton() = assertSignInToSyncButton() + fun verifySyncSignInButton() = assertSyncSignInButton() fun verifyHelpButton() = assertHelpButton() fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists() fun verifyForwardButton() = assertForwardButton() @@ -77,7 +77,6 @@ class ThreeDotMenuMainRobot { fun verifyDesktopSite() = assertDesktopSite() fun verifyDownloadsButton() = assertDownloadsButton() fun verifyShareTabsOverlay() = assertShareTabsOverlay() - fun verifySignInToSyncButton() = assertSignInToSyncButton() fun verifyNewTabButton() = assertNormalBrowsingNewTabButton() fun verifyReportSiteIssueButton() = assertReportSiteIssueButton() @@ -97,7 +96,7 @@ class ThreeDotMenuMainRobot { verifyHistoryButton() verifyDownloadsButton() verifyAddOnsButton() - verifySignInToSyncButton() + verifySyncSignInButton() threeDotMenuRecyclerView().perform(swipeUp()) verifyFindInPageButton() verifyDesktopSite() @@ -174,7 +173,7 @@ class ThreeDotMenuMainRobot { fun openSyncSignIn(interact: SyncSignInRobot.() -> Unit): SyncSignInRobot.Transition { threeDotMenuRecyclerView().perform(swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Sync and save data")), waitingTime) - signInToSyncButton().click() + syncSignInButton().click() SyncSignInRobot().interact() return SyncSignInRobot.Transition() @@ -440,8 +439,8 @@ private fun bookmarksButton() = onView(allOf(withText(R.string.library_bookmarks private fun assertBookmarksButton() = bookmarksButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -private fun signInToSyncButton() = onView(withText("Sync and save data")) -private fun assertSignInToSyncButton() = signInToSyncButton().check(matches(isDisplayed())) +private fun syncSignInButton() = onView(withText("Sync and save data")) +private fun assertSyncSignInButton() = syncSignInButton().check(matches(isDisplayed())) private fun helpButton() = onView(allOf(withText(R.string.browser_menu_help))) private fun assertHelpButton() = helpButton() diff --git a/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt b/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt index daf90a145..f88973c02 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SyncPreferenceView.kt @@ -26,8 +26,7 @@ import mozilla.components.service.fxa.manager.SyncEnginesStorage * @param syncEngine The sync engine that will be used for the sync status lookup. * @param loggedOffTitle Text label for the setting when user is not logged in. * @param loggedInTitle Text label for the setting when user is logged in. - * @param onSignInToSyncClicked A callback executed when the [syncPreference] is clicked with a - * preference status of "Sign in to Sync". + * @param onSyncSignInClicked A callback executed when the sync sign in [syncPreference] is clicked. * @param onReconnectClicked A callback executed when the [syncPreference] is clicked with a * preference status of "Reconnect". */ @@ -39,7 +38,7 @@ class SyncPreferenceView( private val syncEngine: SyncEngine, private val loggedOffTitle: String, private val loggedInTitle: String, - private val onSignInToSyncClicked: () -> Unit = {}, + private val onSyncSignInClicked: () -> Unit = {}, private val onReconnectClicked: () -> Unit = {}, ) { @@ -102,7 +101,7 @@ class SyncPreferenceView( title = loggedOffTitle setOnPreferenceChangeListener { _, _ -> - onSignInToSyncClicked() + onSyncSignInClicked() false } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt index ab8e17b8c..530f6cbc9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/autofill/AutofillSettingFragment.kt @@ -162,7 +162,7 @@ class AutofillSettingFragment : BiometricPromptPreferenceFragment() { .getString(R.string.preferences_credit_cards_sync_cards_across_devices), loggedInTitle = requireContext() .getString(R.string.preferences_credit_cards_sync_cards), - onSignInToSyncClicked = { + onSyncSignInClicked = { findNavController().navigate( NavGraphDirections.actionGlobalTurnOnSync(), ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index e81381454..468fe6cff 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -146,7 +146,7 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { .getString(R.string.preferences_passwords_sync_logins_across_devices), loggedInTitle = requireContext() .getString(R.string.preferences_passwords_sync_logins), - onSignInToSyncClicked = { + onSyncSignInClicked = { val directions = SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment() findNavController().navigate(directions) diff --git a/app/src/test/java/org/mozilla/fenix/settings/logins/SyncPreferenceViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/logins/SyncPreferenceViewTest.kt index 37794627c..9f85a8ac9 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/logins/SyncPreferenceViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/logins/SyncPreferenceViewTest.kt @@ -182,7 +182,7 @@ class SyncPreferenceViewTest { syncEngine = SyncEngine.Passwords, loggedOffTitle = notLoggedInTitle, loggedInTitle = loggedInTitle, - onSignInToSyncClicked = { + onSyncSignInClicked = { val directions = SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToTurnOnSyncFragment() navController.navigate(directions) From c1b2f7821981bc257387f346c5de75ea513f7b98 Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Thu, 13 Oct 2022 14:35:00 -0400 Subject: [PATCH 183/407] No issue: Add source commit pair to Flank client-details flag --- automation/taskcluster/androidTest/ui-test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh index 0a86dffc1..135becb5d 100755 --- a/automation/taskcluster/androidTest/ui-test.sh +++ b/automation/taskcluster/androidTest/ui-test.sh @@ -138,6 +138,7 @@ set -o pipefail && $JAVA_BIN -jar $FLANK_BIN android run \ --app=$APK_APP --test=$APK_TEST \ --local-result-dir="${RESULTS_DIR}" \ --project=$GOOGLE_PROJECT \ + --client-details=commit=$MOBILE_BASE_REPOSITORY/commit/$MOBILE_HEAD_REV,pullRequest=$MOBILE_BASE_REPOSITORY/pull/$PULL_REQUEST_NUMBER \ | tee flank.log exitcode=$? From 14d169dd4cd570ed6f9c0c7102d18dcfdfc1b695 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 18 Oct 2022 16:31:19 +0000 Subject: [PATCH 184/407] Update to Android-Components 108.0.20221018160640. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 1c3fb5d85..1f8402234 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221017190200" + const val VERSION = "108.0.20221018160640" } From 0194e11a19ce3edb3da916950e8d828fc640605a Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Tue, 18 Oct 2022 09:13:37 -0400 Subject: [PATCH 185/407] Update jna to version 5.12.1 --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index a04440536..328b1c4e7 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -18,7 +18,7 @@ object Versions { const val leakcanary = "2.9.1" const val osslicenses_plugin = "0.10.4" const val detekt = "1.19.0" - const val jna = "5.8.0" + const val jna = "5.12.1" const val androidx_compose = "1.2.1" const val androidx_compose_compiler = "1.3.2" From 20b25d77dde61ea23acb4747c1a357ca9c863708 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 18 Oct 2022 12:15:31 -0400 Subject: [PATCH 186/407] For #27439: Remove all unused strings marked moz:removedIn <= 105 --- app/src/main/res/values/strings.xml | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ed348ef6..7341d0a96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,12 +126,6 @@ Show all Show all recent tabs button - - Your search for \"%1$s\" - - %d sites See all synced tabs @@ -465,11 +459,6 @@ Couldn’t change wallpaper Learn more - - Change wallpaper by tapping Firefox homepage logo - - Firefox logo - change the wallpaper, button Classic %s @@ -651,10 +640,6 @@ List Grid - - Search groups - - Group related sites together Close tabs @@ -800,16 +785,6 @@ Older No history here - - Synced from other devices - - From other devices - - Sign in to see history synced from your other devices. - - Sign in - - Or create a Firefox account to start syncing]]> From 1e8a7191970abc4b2fd947052192a170eba96107 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 19 Oct 2022 02:35:54 +0200 Subject: [PATCH 187/407] Import l10n. (#27462) --- app/src/main/res/values-es-rCL/strings.xml | 17 ++++++++++++++++- app/src/main/res/values-fr/strings.xml | 8 ++++++-- app/src/main/res/values-hu/strings.xml | 4 +++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 60dceea24..3931e471a 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -302,6 +302,9 @@ ¡Tus pestañas se están sincronizando! Continua donde te quedaste en otro dispositivo. + + Cerrar + Abrir una nueva pestaña de %1$s @@ -1067,6 +1070,8 @@ Compartir + + Guardar como PDF Enviar a dispositivo @@ -1078,9 +1083,11 @@ Copiado al portapapeles - Conectarse para sincronizar + Conectarse para sincronizar Conectarse para sincronizar + + Sincronizar y guardar datos Enviar a todos los dispositivos @@ -1939,4 +1946,12 @@ Ir a ajustes Sugerencias de Firefox + + + + contraer + + expandir + + abrir enlace para aprender más acerca de esta colección diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 109e03c14..1153663eb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1109,9 +1109,11 @@ Copié dans le presse-papiers - Se connecter pour synchroniser + Se connecter pour synchroniser Se connecter à Sync + + Synchroniser et enregistrer les données Envoyer à tous les appareils @@ -1984,4 +1986,6 @@ réduire développer - + + ouvrir le lien pour en savoir plus sur cette collection + diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index be2e7497e..53ee1770a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1092,9 +1092,11 @@ Vágólapra másolva - Jelentkezzen be a szinkronizálásba + Jelentkezzen be a szinkronizálásba Jelentkezzen be a Syncbe + + Adatok szinkronizálása és mentése Küldés az összes eszközre From a0df375b17ea4284d45efdd3c5f43b9bb6d32c88 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Tue, 18 Oct 2022 14:38:21 -0700 Subject: [PATCH 188/407] For #27456 - Migrate Context.isDark() into a top-level extension --- app/src/main/java/org/mozilla/fenix/ext/Context.kt | 9 +++++++++ .../org/mozilla/fenix/wallpapers/WallpapersUseCases.kt | 8 ++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/Context.kt b/app/src/main/java/org/mozilla/fenix/ext/Context.kt index cb355b70f..8afb8b727 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Context.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Context.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.ext import android.app.Activity import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.os.Build import android.provider.Settings import android.view.ContextThemeWrapper @@ -103,3 +104,11 @@ fun Context.navigateToNotificationsSettings() { } startActivity(intent) } + +/** + * Helper function used to determine if the user's device is set to dark mode. + * + * @return true if the system is considered to be in dark theme. + */ +fun Context.isSystemInDarkTheme(): Boolean = + resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index 72ea35829..ad66e7e7a 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -16,6 +16,7 @@ import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.ext.isSystemInDarkTheme import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.Settings import java.io.File @@ -355,18 +356,13 @@ class WallpapersUseCases( */ private fun Wallpaper.getLocalPathFromContext(context: Context): String { val orientation = if (context.isLandscape()) "landscape" else "portrait" - val theme = if (context.isDark()) "dark" else "light" + val theme = if (context.isSystemInDarkTheme()) "dark" else "light" return Wallpaper.legacyGetLocalPath(orientation, theme, name) } private fun Context.isLandscape(): Boolean { return resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE } - - private fun Context.isDark(): Boolean { - return resources.configuration.uiMode and - Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES - } } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) From 8cd394b88e85cb8cfb3275d49b55db77d37b2b46 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 14 Oct 2022 14:15:32 +0300 Subject: [PATCH 189/407] No issue: Refactor web page items clicks and setting text --- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 294 ++++++------------ .../mozilla/fenix/ui/robots/CustomTabRobot.kt | 93 +++--- 2 files changed, 149 insertions(+), 238 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index aa60544f7..c9e2d18a9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -11,7 +11,6 @@ import android.content.Intent import android.net.Uri import android.os.SystemClock import android.util.Log -import android.widget.EditText import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions import androidx.test.espresso.assertion.ViewAssertions.matches @@ -27,6 +26,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.By.text +import androidx.test.uiautomator.UiObject import androidx.test.uiautomator.UiObjectNotFoundException import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until @@ -344,14 +344,8 @@ class BrowserRobot { }.bookmarkPage { } } - fun clickLinkMatchingText(expectedText: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTimeLong) - - val element = mDevice.findObject(UiSelector().textContains(expectedText)) - element.click() - } + fun clickLinkMatchingText(expectedText: String) = + clickPageObject(webPageItemContainingText(expectedText)) fun longClickMatchingText(expectedText: String) { try { @@ -475,35 +469,10 @@ class BrowserRobot { switchButton.clickAndWaitForNewWindow(waitingTime) } - fun verifySaveLoginPromptIsShown() { - for (i in 1..RETRY_COUNT) { - try { - mDevice.findObject( - UiSelector() - .text("submit") - .resourceId("submit") - .className("android.widget.Button"), - ) - .also { it.waitForExists(waitingTime) } - .also { it.clickAndWaitForNewWindow(waitingTime) } - - break - } catch (e: UiObjectNotFoundException) { - if (i == RETRY_COUNT) { - throw e - } else { - browserScreen { - }.openThreeDotMenu { - }.refreshPage { } - } - } - } - } + fun verifySaveLoginPromptIsShown() = clickPageObject(webPageItemWithResourceId("submit")) fun verifyUpdateLoginPromptIsShown() { - val submitButton = mDevice.findObject(By.res("submit")) - submitButton.clickAndWait(Until.newWindow(), waitingTime) - + clickPageObject(webPageItemWithResourceId("submit")) mDevice.waitNotNull(Until.findObjects(text("Update"))) } @@ -517,63 +486,13 @@ class BrowserRobot { } fun enterPassword(password: String) { - val passwordField = mDevice.findObject( - UiSelector() - .resourceId("password") - .className(EditText::class.java), - ) - try { - passwordField.waitForExists(waitingTime) - mDevice.findObject( - By - .res("password") - .clazz(EditText::class.java), - ).click() - passwordField.clearTextField() - passwordField.text = password - // wait until the password is hidden - assertTrue(mDevice.findObject(UiSelector().text(password)).waitUntilGone(waitingTime)) - } catch (e: UiObjectNotFoundException) { - println(e) + clickPageObject(webPageItemWithResourceId("password")) + setPageObjectText(webPageItemWithResourceId("password"), password) - // Lets refresh the page and try again - browserScreen { - }.openThreeDotMenu { - }.refreshPage { - mDevice.waitForIdle() - } - } finally { - passwordField.waitForExists(waitingTime) - mDevice.findObject( - By - .res("password") - .clazz(EditText::class.java), - ).click() - passwordField.clearTextField() - passwordField.text = password - // wait until the password is hidden - assertTrue(mDevice.findObject(UiSelector().text(password)).waitUntilGone(waitingTime)) - } + assertTrue(mDevice.findObject(UiSelector().text(password)).waitUntilGone(waitingTime)) } - fun clickMediaPlayerPlayButton() { - for (i in 1..RETRY_COUNT) { - try { - mediaPlayerPlayButton().waitForExists(waitingTime) - mediaPlayerPlayButton().click() - - break - } catch (e: UiObjectNotFoundException) { - if (i == RETRY_COUNT) { - throw e - } else { - browserScreen { - }.openThreeDotMenu { - }.refreshPage { } - } - } - } - } + fun clickMediaPlayerPlayButton() = clickPageObject(webPageItemWithText("Play")) /** * Get the current playback state of the currently selected tab. @@ -637,26 +556,17 @@ class BrowserRobot { } fun fillAndSubmitLoginCredentials(userName: String, password: String) { - var currentTries = 0 - while (currentTries++ < 3) { - try { - mDevice.waitForIdle(waitingTime) - userNameTextBox.setText(userName) - passwordTextBox.setText(password) - submitLoginButton.click() - - mDevice.waitForObjects(mDevice.findObject(UiSelector().resourceId("$packageName:id/save_confirm"))) + mDevice.waitForIdle(waitingTime) + setPageObjectText(webPageItemWithResourceId("username"), userName) + setPageObjectText(webPageItemWithResourceId("password"), password) + clickPageObject(webPageItemWithResourceId("submit")) - break - } catch (e: UiObjectNotFoundException) { - Log.e("BROWSER_ROBOT", "Failed to find locator: ${e.localizedMessage}") - } - } + mDevice.waitForObjects(mDevice.findObject(UiSelector().resourceId("$packageName:id/save_confirm"))) } fun clearUserNameLoginCredential() { - mDevice.waitForObjects(userNameTextBox) - userNameTextBox.clearTextField() + mDevice.waitForObjects(webPageItemWithResourceId("username")) + webPageItemWithResourceId("username").clearTextField() mDevice.waitForIdle(waitingTime) } @@ -669,25 +579,19 @@ class BrowserRobot { mDevice.waitForObjects(suggestedLogins) break } catch (e: UiObjectNotFoundException) { - userNameTextBox.click() + clickPageObject(webPageItemWithResourceId("username")) } } } - fun clickStreetAddressTextBox() { - streetAddressTextBox().waitForExists(waitingTime) - streetAddressTextBox().click() - } + fun clickStreetAddressTextBox() = clickPageObject(webPageItemWithResourceId("streetAddress")) fun clickSelectAddressButton() { selectAddressButton.waitForExists(waitingTime) selectAddressButton.clickAndWaitForNewWindow(waitingTime) } - fun clickCardNumberTextBox() { - creditCardNumberTextBox().waitForExists(waitingTime) - creditCardNumberTextBox().click() - } + fun clickCardNumberTextBox() = clickPageObject(webPageItemWithResourceId("cardNumber")) fun clickSelectCreditCardButton() { selectCreditCardButton.waitForExists(waitingTime) @@ -731,8 +635,8 @@ class BrowserRobot { // Sometimes the assertion of the pre-filled logins fails so we are re-trying after refreshing the page while (currentTries++ < 3) { try { - mDevice.waitForObjects(userNameTextBox) - assertTrue(userNameTextBox.text.equals(userName)) + mDevice.waitForObjects(webPageItemWithResourceId("username")) + assertTrue(webPageItemWithResourceId("username").text.equals(userName)) break } catch (e: AssertionError) { @@ -746,18 +650,24 @@ class BrowserRobot { } } } - mDevice.waitForObjects(userNameTextBox) - assertTrue(userNameTextBox.text.equals(userName)) + mDevice.waitForObjects(webPageItemWithResourceId("username")) + assertTrue(webPageItemWithResourceId("username").text.equals(userName)) } fun verifyAutofilledAddress(streetAddress: String) { - mDevice.waitForObjects(streetAddressTextBox(streetAddress)) - assertTrue(streetAddressTextBox(streetAddress).waitForExists(waitingTime)) + mDevice.waitForObjects(webPageItemContainingTextAndResourceId("streetAddress", streetAddress)) + assertTrue( + webPageItemContainingTextAndResourceId("streetAddress", streetAddress) + .waitForExists(waitingTime), + ) } fun verifyAutofilledCreditCard(creditCardNumber: String) { - mDevice.waitForObjects(creditCardNumberTextBox(creditCardNumber)) - assertTrue(creditCardNumberTextBox(creditCardNumber).waitForExists(waitingTime)) + mDevice.waitForObjects(webPageItemContainingTextAndResourceId("cardNumber", creditCardNumber)) + assertTrue( + webPageItemContainingTextAndResourceId("cardNumber", creditCardNumber) + .waitForExists(waitingTime), + ) } fun verifyPrefilledPWALoginCredentials(userName: String, shortcutTitle: String) { @@ -766,9 +676,9 @@ class BrowserRobot { var currentTries = 0 while (currentTries++ < 3) { try { - assertTrue(submitLoginButton.waitForExists(waitingTime)) - submitLoginButton.click() - assertTrue(userNameTextBox.text.equals(userName)) + assertTrue(webPageItemWithResourceId("submit").waitForExists(waitingTime)) + webPageItemWithResourceId("submit").click() + assertTrue(webPageItemWithResourceId("username").text.equals(userName)) break } catch (e: AssertionError) { addToHomeScreen { @@ -811,11 +721,7 @@ class BrowserRobot { } } - fun clickSetCookiesButton() { - val setCookiesButton = mDevice.findObject(UiSelector().resourceId("setCookies")) - setCookiesButton.waitForExists(waitingTimeLong) - setCookiesButton.click() - } + fun clickSetCookiesButton() = clickPageObject(webPageItemWithResourceId("setCookies")) fun verifyCookiesProtectionHint() { val hintMessage = @@ -934,13 +840,12 @@ class BrowserRobot { } fun clickDownloadLink(title: String, interact: DownloadRobot.() -> Unit): DownloadRobot.Transition { - val downloadLink = mDevice.findObject(UiSelector().textContains(title)) - assertTrue( "$title download link not found", - downloadLink.waitForExists(waitingTime), + webPageItemContainingText(title).waitForExists(waitingTime), ) - downloadLink.click() + + clickPageObject(webPageItemContainingText(title)) DownloadRobot().interact() return DownloadRobot.Transition() @@ -948,8 +853,7 @@ class BrowserRobot { fun clickStartCameraButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { // Test page used for testing permissions located at https://mozilla-mobile.github.io/testapp/permissions - cameraButton.waitForExists(waitingTime) - cameraButton.click() + clickPageObject(webPageItemWithText("Open camera")) SitePermissionsRobot().interact() return SitePermissionsRobot.Transition() @@ -957,8 +861,7 @@ class BrowserRobot { fun clickStartMicrophoneButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { // Test page used for testing permissions located at https://mozilla-mobile.github.io/testapp/permissions - microphoneButton.waitForExists(waitingTime) - microphoneButton.click() + clickPageObject(webPageItemWithText("Open microphone")) SitePermissionsRobot().interact() return SitePermissionsRobot.Transition() @@ -966,8 +869,7 @@ class BrowserRobot { fun clickStartAudioVideoButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { // Test page used for testing permissions located at https://mozilla-mobile.github.io/testapp/permissions - audioVideoButton.waitForExists(waitingTime) - audioVideoButton.click() + clickPageObject(webPageItemWithText("Camera & Microphone")) SitePermissionsRobot().interact() return SitePermissionsRobot.Transition() @@ -975,8 +877,7 @@ class BrowserRobot { fun clickOpenNotificationButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { // Test page used for testing permissions located at https://mozilla-mobile.github.io/testapp/permissions - notificationButton.waitForExists(waitingTime) - notificationButton.click() + clickPageObject(webPageItemWithText("Open notifications dialogue")) mDevice.waitForObjects(mDevice.findObject(UiSelector().textContains("Allow to send notifications?"))) SitePermissionsRobot().interact() @@ -985,8 +886,7 @@ class BrowserRobot { fun clickGetLocationButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { // Test page used for testing permissions located at https://mozilla-mobile.github.io/testapp/permissions - getLocationButton.waitForExists(waitingTime) - getLocationButton.click() + clickPageObject(webPageItemWithText("Get Location")) SitePermissionsRobot().interact() return SitePermissionsRobot.Transition() @@ -1036,13 +936,6 @@ private fun assertMenuButton() { private fun tabsCounter() = mDevice.findObject(By.res("$packageName:id/counter_root")) -private fun mediaPlayerPlayButton() = - mDevice.findObject( - UiSelector() - .className("android.widget.Button") - .text("Play"), - ) - private var progressBar = mDevice.findObject( UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_progress"), @@ -1059,24 +952,6 @@ private fun addressSuggestion(streetName: String) = .textContains(streetName), ) -private fun streetAddressTextBox(streetAddress: String = "") = - mDevice.findObject( - UiSelector() - .resourceId("streetAddress") - .textContains(streetAddress) - .className("android.widget.EditText") - .packageName("$packageName"), - ) - -private fun creditCardNumberTextBox(creditCardNumber: String = "") = - mDevice.findObject( - UiSelector() - .resourceId("cardNumber") - .textContains(creditCardNumber) - .className("android.widget.EditText") - .packageName("$packageName"), - ) - private fun creditCardSuggestion(creditCardNumber: String) = mDevice.findObject( UiSelector() @@ -1087,41 +962,64 @@ private fun creditCardSuggestion(creditCardNumber: String) = private fun siteSecurityToolbarButton() = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_security_indicator")) -// Permissions test page elements & prompts -// Test page used located at https://mozilla-mobile.github.io/testapp/permissions -private val cameraButton = mDevice.findObject(UiSelector().text("Open camera")) +private fun clickPageObject(webPageItem: UiObject) { + for (i in 1..RETRY_COUNT) { + try { + webPageItem.also { + it.waitForExists(waitingTime) + it.click() + } -private val microphoneButton = mDevice.findObject(UiSelector().text("Open microphone")) + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + progressBar.waitUntilGone(waitingTime) + } + } + } + } +} -private val audioVideoButton = mDevice.findObject(UiSelector().text("Camera & Microphone")) +private fun webPageItemContainingText(itemText: String) = + mDevice.findObject(UiSelector().textContains(itemText)) -private val notificationButton = mDevice.findObject(UiSelector().text("Open notifications dialogue")) +private fun webPageItemWithText(itemText: String) = + mDevice.findObject(UiSelector().text(itemText)) -private val getLocationButton = mDevice.findObject(UiSelector().text("Get Location")) +private fun webPageItemWithResourceId(resourceId: String) = + mDevice.findObject(UiSelector().resourceId(resourceId)) -// Login form test page elements -// Test page used located at https://mozilla-mobile.github.io/testapp/loginForm -val userNameTextBox = +private fun webPageItemContainingTextAndResourceId(resourceId: String, itemText: String) = mDevice.findObject( UiSelector() - .resourceId("username") - .className("android.widget.EditText") - .packageName("$packageName"), + .resourceId(resourceId) + .textContains(itemText), ) -private val submitLoginButton = - mDevice.findObject( - UiSelector() - .resourceId("submit") - .textContains("Submit Query") - .className("android.widget.Button") - .packageName("$packageName"), - ) +private fun setPageObjectText(webPageItem: UiObject, text: String) { + for (i in 1..RETRY_COUNT) { + try { + webPageItem.also { + it.waitForExists(waitingTime) + it.setText(text) + } -val passwordTextBox = - mDevice.findObject( - UiSelector() - .resourceId("password") - .className("android.widget.EditText") - .packageName("$packageName"), - ) + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + progressBar.waitUntilGone(waitingTime) + } + } + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt index 7730ec0d6..d4af3d7d4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt @@ -11,11 +11,13 @@ import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiObject import androidx.test.uiautomator.UiObjectNotFoundException import androidx.test.uiautomator.UiSelector import junit.framework.TestCase.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION +import org.mozilla.fenix.helpers.Constants.RETRY_COUNT import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.mDevice @@ -92,49 +94,40 @@ class CustomTabRobot { } fun fillAndSubmitLoginCredentials(userName: String, password: String) { - var currentTries = 0 - while (currentTries++ < 3) { - try { - mDevice.waitForIdle(waitingTime) - userNameTextBox.setText(userName) - passwordTextBox.setText(password) - submitLoginButton.click() - mDevice.waitForObjects(mDevice.findObject(UiSelector().resourceId("$packageName:id/save_confirm"))) - break - } catch (e: UiObjectNotFoundException) { - customTabScreen { - }.openMainMenu { - refreshButton().click() - waitForPageToLoad() - } - } - } + mDevice.waitForIdle(waitingTime) + setPageObjectText(webPageItemWithResourceId("username"), userName) + setPageObjectText(webPageItemWithResourceId("password"), password) + clickPageObject(webPageItemWithResourceId("submit")) + mDevice.waitForObjects(mDevice.findObject(UiSelector().resourceId("$packageName:id/save_confirm"))) } - fun clickLinkMatchingText(expectedText: String) { - var currentTries = 0 - while (currentTries++ < 3) { + fun clickLinkMatchingText(expectedText: String) = clickPageObject(webPageItemContainingText(expectedText)) + + fun waitForPageToLoad() = progressBar.waitUntilGone(waitingTime) + + fun clickPageObject(webPageItem: UiObject) { + for (i in 1..RETRY_COUNT) { try { - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)) - .waitForExists(waitingTime) + webPageItem.also { + it.waitForExists(waitingTime) + it.click() + } - val element = mDevice.findObject(UiSelector().textContains(expectedText)) - element.click() break } catch (e: UiObjectNotFoundException) { - customTabScreen { - }.openMainMenu { - refreshButton().click() - waitForPageToLoad() + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + progressBar.waitUntilGone(waitingTime) + } } } } } - fun waitForPageToLoad() = progressBar.waitUntilGone(waitingTime) - class Transition { fun openMainMenu(interact: CustomTabRobot.() -> Unit): Transition { mainMenuButton().waitForExists(waitingTime) @@ -176,16 +169,36 @@ private fun closeButton() = onView(withContentDescription("Return to previous ap private fun customTabToolbar() = mDevice.findObject(By.res("$packageName:id/toolbar")) +private fun setPageObjectText(webPageItem: UiObject, text: String) { + for (i in 1..RETRY_COUNT) { + try { + webPageItem.also { + it.waitForExists(waitingTime) + it.setText(text) + } + + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + progressBar.waitUntilGone(waitingTime) + } + } + } + } +} + private val progressBar = mDevice.findObject( UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_progress"), ) -private val submitLoginButton = - mDevice.findObject( - UiSelector() - .resourceId("submit") - .textContains("Submit Query") - .className("android.widget.Button") - .packageName("$packageName"), - ) +private fun webPageItemContainingText(itemText: String) = + mDevice.findObject(UiSelector().textContains(itemText)) + +private fun webPageItemWithResourceId(resourceId: String) = + mDevice.findObject(UiSelector().resourceId(resourceId)) From 6a07c171cacbb5382ecbf816427d3055a4f38b3d Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 19 Oct 2022 12:59:52 +0300 Subject: [PATCH 190/407] No issue: Refactor web page items long clicks --- .../org/mozilla/fenix/ui/ContextMenusTest.kt | 22 +-- .../java/org/mozilla/fenix/ui/SearchTest.kt | 16 +- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 144 ++++++------------ 3 files changed, 62 insertions(+), 120 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt index 43600d148..087121e39 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ContextMenusTest.kt @@ -72,7 +72,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("Link 1") + longClickLink("Link 1") verifyLinkContextMenuItems(genericURL.url) clickContextOpenLinkInNewTab() verifySnackBarText("New tab opened") @@ -96,7 +96,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("Link 2") + longClickLink("Link 2") verifyLinkContextMenuItems(genericURL.url) clickContextOpenLinkInPrivateTab() verifySnackBarText("New private tab opened") @@ -118,7 +118,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("Link 3") + longClickLink("Link 3") verifyLinkContextMenuItems(genericURL.url) clickContextCopyLink() verifySnackBarText("Link copied to clipboard") @@ -138,7 +138,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("Link 1") + longClickLink("Link 1") verifyLinkContextMenuItems(genericURL.url) clickContextShareLink(genericURL.url) // verify share intent is matched with associated URL } @@ -154,7 +154,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("test_link_image") + longClickLink("test_link_image") verifyLinkImageContextMenuItems(imageResource.url) clickContextOpenImageNewTab() verifySnackBarText("New tab opened") @@ -173,7 +173,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("test_link_image") + longClickLink("test_link_image") verifyLinkImageContextMenuItems(imageResource.url) clickContextCopyImageLocation() verifySnackBarText("Link copied to clipboard") @@ -193,7 +193,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("test_link_image") + longClickLink("test_link_image") verifyLinkImageContextMenuItems(imageResource.url) clickContextSaveImage() } @@ -218,13 +218,13 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(pageLinks.url) { mDevice.waitForIdle() - longClickMatchingText("Link 1") + longClickLink("Link 1") verifyLinkContextMenuItems(genericURL.url) dismissContentContextMenu(genericURL.url) - longClickMatchingText("test_link_image") + longClickLink("test_link_image") verifyLinkImageContextMenuItems(imageResource.url) dismissContentContextMenu(imageResource.url) - longClickMatchingText("test_no_link_image") + longClickLink("test_no_link_image") verifyNoLinkImageContextMenuItems(imageResource.url) } } @@ -236,7 +236,7 @@ class ContextMenusTest { navigationToolbar { }.enterURLAndEnterToBrowser(genericURL.url) { - longClickMatchingText(genericURL.content) + longClickLink(genericURL.content) }.clickShareSelectedText { verifyAndroidShareLayout() } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index e5dbcbafe..25b7a1f25 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -186,9 +186,9 @@ class SearchTest { homeScreen { }.openSearch { }.submitQuery("test search") { - longClickMatchingText("Link 1") + longClickLink("Link 1") clickContextOpenLinkInNewTab() - longClickMatchingText("Link 2") + longClickLink("Link 2") clickContextOpenLinkInNewTab() }.goToHomescreen { verifyJumpBackInSectionIsDisplayed() @@ -221,9 +221,9 @@ class SearchTest { homeScreen { }.openSearch { }.submitQuery("test search") { - longClickMatchingText("Link 1") + longClickLink("Link 1") clickContextOpenLinkInPrivateTab() - longClickMatchingText("Link 2") + longClickLink("Link 2") clickContextOpenLinkInPrivateTab() }.goToHomescreen { verifyCurrentSearchGroupIsDisplayed(false, "test search", 3) @@ -254,9 +254,9 @@ class SearchTest { homeScreen { }.openSearch { }.submitQuery("test search") { - longClickMatchingText("Link 1") + longClickLink("Link 1") clickContextOpenLinkInPrivateTab() - longClickMatchingText("Link 2") + longClickLink("Link 2") clickContextOpenLinkInPrivateTab() }.openTabDrawer { }.openTab(firstPage) { @@ -290,9 +290,9 @@ class SearchTest { homeScreen { }.openSearch { }.submitQuery("test search") { - longClickMatchingText("Link 1") + longClickLink("Link 1") clickContextOpenLinkInNewTab() - longClickMatchingText("Link 2") + longClickLink("Link 2") clickContextOpenLinkInNewTab() }.openTabDrawer { }.openTabFromGroup(firstPage) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index c9e2d18a9..2cfd7ad44 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -347,116 +347,35 @@ class BrowserRobot { fun clickLinkMatchingText(expectedText: String) = clickPageObject(webPageItemContainingText(expectedText)) - fun longClickMatchingText(expectedText: String) { - try { - mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) - val link = mDevice.findObject(By.textContains(expectedText)) - link.click(LONG_CLICK_DURATION) - } catch (e: NullPointerException) { - println(e) - - // Refresh the page in case the first long click didn't succeed - navigationToolbar { - }.openThreeDotMenu { - }.refreshPage { - mDevice.waitForIdle() - } + fun longClickLink(expectedText: String) = + longClickPageObject(webPageItemWithText(expectedText)) - // Long click again the desired text - mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) - val link = mDevice.findObject(By.textContains(expectedText)) - link.click(LONG_CLICK_DURATION) - } - } + fun longClickMatchingText(expectedText: String) = + longClickPageObject(webPageItemContainingText(expectedText)) fun longClickAndCopyText(expectedText: String, selectAll: Boolean = false) { - try { - // Long click desired text - mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) - val link = mDevice.findObject(By.textContains(expectedText)) - link.click(LONG_CLICK_DURATION) - - // Click Select all from the text selection toolbar - if (selectAll) { - mDevice.findObject(UiSelector().textContains("Select all")).waitForExists(waitingTime) - val selectAllText = mDevice.findObject(By.textContains("Select all")) - selectAllText.click() - } + longClickPageObject(webPageItemContainingText(expectedText)) - // Click Copy from the text selection toolbar - mDevice.findObject(UiSelector().textContains("Copy")).waitForExists(waitingTime) - val copyText = mDevice.findObject(By.textContains("Copy")) - copyText.click() - } catch (e: NullPointerException) { - println("Failed to long click desired text: ${e.localizedMessage}") - - // Refresh the page in case the first long click didn't succeed - navigationToolbar { - }.openThreeDotMenu { - }.refreshPage { - mDevice.waitForIdle() - } - - // Long click again the desired text - mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) - val link = mDevice.findObject(By.textContains(expectedText)) - link.click(LONG_CLICK_DURATION) - - // Click again Select all from the text selection toolbar - if (selectAll) { - mDevice.findObject(UiSelector().textContains("Select all")).waitForExists(waitingTime) - val selectAllText = mDevice.findObject(By.textContains("Select all")) - selectAllText.click() - } - - // Click again Copy from the text selection toolbar - mDevice.findObject(UiSelector().textContains("Copy")).waitForExists(waitingTime) - val copyText = mDevice.findObject(By.textContains("Copy")) - copyText.click() + // Click Select all from the text selection toolbar + if (selectAll) { + mDevice.findObject(UiSelector().textContains("Select all")).waitForExists(waitingTime) + val selectAllText = mDevice.findObject(By.textContains("Select all")) + selectAllText.click() } + + // Click Copy from the text selection toolbar + mDevice.findObject(UiSelector().textContains("Copy")).waitForExists(waitingTime) + val copyText = mDevice.findObject(By.textContains("Copy")) + copyText.click() } fun longClickAndSearchText(searchButton: String, expectedText: String) { - var currentTries = 0 - while (currentTries++ < 3) { - try { - // Long click desired text - mDevice.waitForWindowUpdate(packageName, waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/engineView")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().textContains(expectedText)).waitForExists(waitingTime) - val link = mDevice.findObject(By.textContains(expectedText)) - link.click(LONG_CLICK_DURATION) - - // Click search from the text selection toolbar - mDevice.findObject(UiSelector().textContains(searchButton)).waitForExists(waitingTime) - val searchText = mDevice.findObject(By.textContains(searchButton)) - searchText.click() + longClickPageObject(webPageItemContainingText(expectedText)) - break - } catch (e: NullPointerException) { - println("Failed to long click desired text: ${e.localizedMessage}") - - // Refresh the page in case the first long click didn't succeed - navigationToolbar { - }.openThreeDotMenu { - }.refreshPage { - mDevice.waitForIdle() - } - } - } + // Click search from the text selection toolbar + mDevice.findObject(UiSelector().textContains(searchButton)).waitForExists(waitingTime) + val searchText = mDevice.findObject(By.textContains(searchButton)) + searchText.click() } fun snackBarButtonClick() { @@ -985,6 +904,29 @@ private fun clickPageObject(webPageItem: UiObject) { } } +fun longClickPageObject(webPageItem: UiObject) { + for (i in 1..RETRY_COUNT) { + try { + webPageItem.also { + it.waitForExists(waitingTime) + it.longClick() + } + + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + browserScreen { + }.openThreeDotMenu { + }.refreshPage { + } + progressBar.waitUntilGone(waitingTime) + } + } + } +} + private fun webPageItemContainingText(itemText: String) = mDevice.findObject(UiSelector().textContains(itemText)) From 89acf3b3a2d647a6c46a0f8f7627800a6cab8b6f Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Tue, 18 Oct 2022 12:02:16 -0400 Subject: [PATCH 191/407] No issue: Fix for None key-pair in Flank client-details Remove URL construction --- automation/taskcluster/androidTest/ui-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh index 135becb5d..bca9d4042 100755 --- a/automation/taskcluster/androidTest/ui-test.sh +++ b/automation/taskcluster/androidTest/ui-test.sh @@ -138,7 +138,7 @@ set -o pipefail && $JAVA_BIN -jar $FLANK_BIN android run \ --app=$APK_APP --test=$APK_TEST \ --local-result-dir="${RESULTS_DIR}" \ --project=$GOOGLE_PROJECT \ - --client-details=commit=$MOBILE_BASE_REPOSITORY/commit/$MOBILE_HEAD_REV,pullRequest=$MOBILE_BASE_REPOSITORY/pull/$PULL_REQUEST_NUMBER \ + --client-details=commit=${MOBILE_HEAD_REV:-None},pullRequest=${PULL_REQUEST_NUMBER:-None} \ | tee flank.log exitcode=$? From 9721381243ee8d2e534318e7e0fc4b517b3537be Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 18 Oct 2022 14:10:11 +0300 Subject: [PATCH 192/407] For #25029 and #26087 re-enable useAppWhileTabIsCrashedTest and privateBrowsingUseAppWhileTabIsCrashedTest UI tests --- .../mozilla/fenix/ui/CrashReportingTest.kt | 4 +--- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt index 60c7a6f19..4d6df1534 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt @@ -29,6 +29,7 @@ class CrashReportingTest { isPocketEnabled = false, isJumpBackInCFREnabled = false, isWallpaperOnboardingEnabled = false, + isTCPCFREnabled = false, ), ) { it.activity } @@ -73,7 +74,6 @@ class CrashReportingTest { } } - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/25029") @SmokeTest @Test fun useAppWhileTabIsCrashedTest() { @@ -106,7 +106,6 @@ class CrashReportingTest { @SmokeTest @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") fun privateBrowsingUseAppWhileTabIsCrashedTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) @@ -120,7 +119,6 @@ class CrashReportingTest { }.openNewTab { }.submitQuery(secondWebPage.url.toString()) { waitForPageToLoad() - verifyPageContent("Page content: 2") } navigationToolbar { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 2cfd7ad44..dc934ca9d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -678,12 +678,22 @@ class BrowserRobot { } fun openTabDrawer(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { - mDevice.findObject( - UiSelector().descriptionContains("Tap to switch tabs."), - ).waitForExists(waitingTime) + mDevice.waitForObjects( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/mozac_browser_toolbar_browser_actions"), + ), + waitingTime, + ) tabsCounter().click() - mDevice.waitNotNull(Until.findObject(By.res("$packageName:id/tab_layout"))) + + mDevice.waitForObjects( + mDevice.findObject( + UiSelector().resourceId("$packageName:id/new_tab_button"), + ), + waitingTime, + ) TabDrawerRobot().interact() return TabDrawerRobot.Transition() @@ -853,7 +863,8 @@ private fun assertMenuButton() { .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } -private fun tabsCounter() = mDevice.findObject(By.res("$packageName:id/counter_root")) +private fun tabsCounter() = + mDevice.findObject(By.res("$packageName:id/mozac_browser_toolbar_browser_actions")) private var progressBar = mDevice.findObject( From 61a3f26cbac215019cf1ba8380608329828914db Mon Sep 17 00:00:00 2001 From: sv-ohorvath Date: Thu, 13 Oct 2022 13:02:12 +0300 Subject: [PATCH 193/407] No issue: refactoring for ETP tests --- ...t.kt => EnhancedTrackingProtectionTest.kt} | 46 +++++++++++++++++-- .../java/org/mozilla/fenix/ui/SmokeTest.kt | 33 ------------- 2 files changed, 42 insertions(+), 37 deletions(-) rename app/src/androidTest/java/org/mozilla/fenix/ui/{StrictEnhancedTrackingProtectionTest.kt => EnhancedTrackingProtectionTest.kt} (80%) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt similarity index 80% rename from app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt rename to app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt index 5bc3e474c..6da3a625b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/StrictEnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt @@ -11,10 +11,13 @@ import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.ETPPolicy import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.appContext +import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.ui.robots.enhancedTrackingProtection import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar @@ -33,7 +36,7 @@ import org.mozilla.fenix.ui.robots.settingsSubMenuEnhancedTrackingProtection * - Verifying Enhanced Tracking Protection site exceptions */ -class StrictEnhancedTrackingProtectionTest { +class EnhancedTrackingProtectionTest { private lateinit var mockWebServer: MockWebServer @get:Rule @@ -41,7 +44,6 @@ class StrictEnhancedTrackingProtectionTest { isJumpBackInCFREnabled = false, isTCPCFREnabled = false, isWallpaperOnboardingEnabled = false, - etpPolicy = ETPPolicy.STRICT, ) @Before @@ -84,8 +86,8 @@ class StrictEnhancedTrackingProtectionTest { }.openEnhancedTrackingProtectionSubMenu { switchEnhancedTrackingProtectionToggle() verifyEnhancedTrackingProtectionOptionsEnabled(false) - }.goBack { - }.goBack { } + exitMenu() + } navigationToolbar { }.enterURLAndEnterToBrowser(genericPage.url) { } @@ -108,6 +110,7 @@ class StrictEnhancedTrackingProtectionTest { @Test fun testStrictVisitProtectionSheet() { + appContext.settings().setStrictETP() val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val trackingProtectionTest = TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) @@ -129,6 +132,7 @@ class StrictEnhancedTrackingProtectionTest { @Test fun testStrictVisitDisableExceptionToggle() { + appContext.settings().setStrictETP() val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val trackingProtectionTest = TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) @@ -164,6 +168,7 @@ class StrictEnhancedTrackingProtectionTest { @Ignore("Permanent failure: https://github.com/mozilla-mobile/fenix/issues/27312") @Test fun testStrictVisitSheetDetails() { + appContext.settings().setStrictETP() val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val trackingProtectionTest = TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) @@ -191,4 +196,37 @@ class StrictEnhancedTrackingProtectionTest { viewTrackingContentBlockList() } } + + @Ignore("Permanent failure: https://github.com/mozilla-mobile/fenix/issues/27312") + @SmokeTest + @Test + fun customTrackingProtectionSettingsTest() { + val genericWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val trackingPage = TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openEnhancedTrackingProtectionSubMenu { + verifyEnhancedTrackingProtectionOptionsEnabled() + selectTrackingProtectionOption("Custom") + verifyCustomTrackingProtectionSettings() + }.goBackToHomeScreen {} + + navigationToolbar { + // browsing a basic page to allow GV to load on a fresh run + }.enterURLAndEnterToBrowser(genericWebPage.url) { + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(trackingPage.url) {} + + enhancedTrackingProtection { + }.openEnhancedTrackingProtectionSheet { + }.openDetails { + verifyTrackingCookiesBlocked() + verifyCryptominersBlocked() + verifyFingerprintersBlocked() + verifyTrackingContentBlocked() + viewTrackingContentBlockList() + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 3827e3f44..cf38a8978 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -41,7 +41,6 @@ import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.customTabScreen -import org.mozilla.fenix.ui.robots.enhancedTrackingProtection import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.notificationShade @@ -403,38 +402,6 @@ class SmokeTest { } } - @Ignore("Permanent failure: https://github.com/mozilla-mobile/fenix/issues/27312") - @Test - fun customTrackingProtectionSettingsTest() { - val genericWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - val trackingPage = TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openEnhancedTrackingProtectionSubMenu { - verifyEnhancedTrackingProtectionOptionsEnabled() - selectTrackingProtectionOption("Custom") - verifyCustomTrackingProtectionSettings() - }.goBackToHomeScreen {} - - navigationToolbar { - // browsing a basic page to allow GV to load on a fresh run - }.enterURLAndEnterToBrowser(genericWebPage.url) { - }.openNavigationToolbar { - }.enterURLAndEnterToBrowser(trackingPage.url) {} - - enhancedTrackingProtection { - }.openEnhancedTrackingProtectionSheet { - }.openDetails { - verifyTrackingCookiesBlocked() - verifyCryptominersBlocked() - verifyFingerprintersBlocked() - verifyTrackingContentBlocked() - viewTrackingContentBlockList() - } - } - // Verifies changing the default engine from the Search Shortcut menu @Test fun selectSearchEnginesShortcutTest() { From 106b692c410237642defbbb0c203d43f52ea012b Mon Sep 17 00:00:00 2001 From: sv-ohorvath Date: Tue, 18 Oct 2022 16:52:00 +0300 Subject: [PATCH 194/407] Adds TCP prompt & storage access tests --- .../assets/pages/cross-site-cookies.html | 8 +++++ .../ui/EnhancedTrackingProtectionTest.kt | 34 ++++++++++++++++++- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 8 +++++ .../fenix/ui/robots/SitePermissionsRobot.kt | 11 ++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 app/src/androidTest/assets/pages/cross-site-cookies.html diff --git a/app/src/androidTest/assets/pages/cross-site-cookies.html b/app/src/androidTest/assets/pages/cross-site-cookies.html new file mode 100644 index 000000000..1ff5ce938 --- /dev/null +++ b/app/src/androidTest/assets/pages/cross-site-cookies.html @@ -0,0 +1,8 @@ + + +

Cross-site cookies storage access test

+

anti-tracker-test.com

+

different site, cross-origin iframe

+ + + diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt index 6da3a625b..7bdd0b5ab 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.ui +import androidx.core.net.toUri import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before @@ -13,7 +14,6 @@ import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher -import org.mozilla.fenix.helpers.ETPPolicy import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper.appContext @@ -229,4 +229,36 @@ class EnhancedTrackingProtectionTest { viewTrackingContentBlockList() } } + + @Test + fun blockCookiesStorageAccessTest() { + // With Standard TrackingProtection settings + val page = mockWebServer.url("pages/cross-site-cookies.html").toString().toUri() + val originSite = "https://mozilla-mobile.github.io" + val currentSite = "http://localhost:${mockWebServer.port}" + + navigationToolbar { + }.enterURLAndEnterToBrowser(page) { + }.clickRequestStorageAccessButton { + verifyCrossOriginCookiesPermissionPrompt(originSite, currentSite) + }.clickPagePermissionButton(allow = false) { + verifyPageContent("access denied") + } + } + + @Test + fun allowCookiesStorageAccessTest() { + // With Standard TrackingProtection settings + val page = mockWebServer.url("pages/cross-site-cookies.html").toString().toUri() + val originSite = "https://mozilla-mobile.github.io" + val currentSite = "http://localhost:${mockWebServer.port}" + + navigationToolbar { + }.enterURLAndEnterToBrowser(page) { + }.clickRequestStorageAccessButton { + verifyCrossOriginCookiesPermissionPrompt(originSite, currentSite) + }.clickPagePermissionButton(allow = true) { + verifyPageContent("access granted") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index dc934ca9d..92bb17e0d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -821,6 +821,14 @@ class BrowserRobot { return SitePermissionsRobot.Transition() } + fun clickRequestStorageAccessButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { + mDevice.findObject(UiSelector().text("requestStorageAccess()")).waitForExists(waitingTime) + mDevice.findObject(UiSelector().text("requestStorageAccess()")).click() + + SitePermissionsRobot().interact() + return SitePermissionsRobot.Transition() + } + fun openSiteSecuritySheet(interact: SiteSecurityRobot.() -> Unit): SiteSecurityRobot.Transition { siteSecurityToolbarButton().waitForExists(waitingTime) siteSecurityToolbarButton().clickAndWaitForNewWindow(waitingTime) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt index 3e35bca01..c204c23dc 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.ui.robots import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.uiautomator.UiSelector @@ -82,6 +83,16 @@ class SitePermissionsRobot { } } + fun verifyCrossOriginCookiesPermissionPrompt(originSite: String, currentSite: String) { + mDevice.findObject(UiSelector().text("Allow $originSite to use its cookies on $currentSite?")) + .waitForExists(waitingTime) + onView(ViewMatchers.withText("Allow $originSite to use its cookies on $currentSite?")).check(matches(isDisplayed())) + onView(ViewMatchers.withText("You may want to block access if it's not clear why $originSite needs this data.")).check(matches(isDisplayed())) + onView(ViewMatchers.withText("Learn more")).check(matches(isDisplayed())) + onView(ViewMatchers.withText("Block")).check(matches(isDisplayed())) + onView(ViewMatchers.withText("Allow")).check(matches(isDisplayed())) + } + fun selectRememberPermissionDecision() { onView(withId(R.id.do_not_ask_again)) .check(matches(isDisplayed())) From 90960153ce763adb327917c80491c4f0e998c651 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 19 Oct 2022 15:04:36 +0000 Subject: [PATCH 195/407] Update to Android-Components 108.0.20221019143129. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 1f8402234..9d7c5d12b 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221018160640" + const val VERSION = "108.0.20221019143129" } From fe25aa8e14fb6ded21f946e909d9d2ac63e1c4f2 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Wed, 19 Oct 2022 16:26:08 +0300 Subject: [PATCH 196/407] For #21787 - Update the Pocket stories toggle label and summary from homepage settings --- .../mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt | 2 +- app/src/main/res/values/strings.xml | 6 +++++- app/src/main/res/xml/home_preferences.xml | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt index 7bd5aa6e1..64f3eb2ba 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt @@ -130,7 +130,7 @@ private fun recentlyVisitedButton() = onView(allOf(withText(R.string.customize_toggle_recently_visited))) private fun pocketButton() = - onView(allOf(withText(R.string.customize_toggle_pocket))) + onView(allOf(withText(R.string.customize_toggle_pocket_2))) private fun sponsoredStoriesButton() = onView(allOf(withText(R.string.customize_toggle_pocket_sponsored))) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7341d0a96..df656d452 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -436,7 +436,11 @@ a section where users see a list of tabs that they have visited in the past few days --> Recently visited - Pocket + Pocket + + Thought-provoking stories + + Articles powered by Pocket Sponsored stories diff --git a/app/src/main/res/xml/home_preferences.xml b/app/src/main/res/xml/home_preferences.xml index a13a10e16..87d829368 100644 --- a/app/src/main/res/xml/home_preferences.xml +++ b/app/src/main/res/xml/home_preferences.xml @@ -32,7 +32,8 @@ Date: Wed, 19 Oct 2022 18:47:42 -0400 Subject: [PATCH 197/407] Bug 1791998 - Disable TCP popup when running performance tests. (#27451) * Disable TCP popup when running performance tests. * Run some perf tests. * Undo testing changes. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/java/org/mozilla/fenix/perf/Performance.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/perf/Performance.kt b/app/src/main/java/org/mozilla/fenix/perf/Performance.kt index ad02cc1a0..d286d4ad9 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/Performance.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/Performance.kt @@ -34,6 +34,7 @@ object Performance { disableOnboarding(context) disableTrackingProtectionPopups(context) disableFirstTimePWAPopup(context) + disableTCPPopup(context) } /** @@ -85,4 +86,11 @@ object Performance { private fun disableFirstTimePWAPopup(context: Context) { context.components.settings.userKnowsAboutPwas = true } + + /** + * Disables the TCP popup. + */ + private fun disableTCPPopup(context: Context) { + context.components.settings.shouldShowTotalCookieProtectionCFR = false + } } From 0cfa44e634dcfefa0caa7d8a2168f95f67df76e6 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 20 Oct 2022 02:39:13 +0200 Subject: [PATCH 198/407] Import l10n. (#27474) --- app/src/main/res/values-gn/strings.xml | 52 +++++----------------- app/src/main/res/values-ka/strings.xml | 46 +++++++------------- app/src/main/res/values-si/strings.xml | 57 +++++++++---------------- app/src/main/res/values-skr/strings.xml | 36 +++------------- 4 files changed, 52 insertions(+), 139 deletions(-) diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 2e93c4254..007768ae2 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -129,13 +129,6 @@ Ehechauka votõ opaite tendayke ramoguápe - - Eheka \"%1$s\" rupive - - - %d tendakuéra Ehechapaite tendayke mbojuehepyre @@ -295,6 +288,9 @@ Jepo + + Mboty + Embojuruja tendayke pyahu %1$s mba’e @@ -384,8 +380,6 @@ Ñemomba’ete - Embojuehe techaukaha, tembiasakue ha mba’ete Firefox pegua ndive - Eñepyrũ tembiapo embojuehe hag̃ua tendayke, techaukaha, ñe’ẽñemi ha hetave. Firefox Account @@ -478,12 +472,6 @@ Noñemoambuekuaái mba’erechaha rugua Kuaave - - Emoambue mba’erechaha rugua opokóvo Firefox kuatiarogue ñepyrũ ra’ãnga’i - - - Firefox ra’ãnga’i - emoambue mba’erechaha rugua, votõ Jepokuaa %s @@ -577,8 +565,6 @@ Emoneĩ Mozilla-pe omohenda ha omongu’évo ñembokatupyry - - Emyandy Sync Embojuehe ha eñongatu mba’ekuaarã @@ -670,10 +656,6 @@ Tysýi Kora’ieta - - Eheka atýhápe - - Ambyaty tenda ojueheguáva Emboty tendayke @@ -802,9 +784,6 @@ %1$s (Ayvu Ñemigua) - - Ambue tendayke - Emoinge ñe’ẽ ehekaséva @@ -834,20 +813,6 @@ Ndaipóri tembiasakue - - Oñembojuehepyre ambue mba’e’okáre - - - Ambue mba’e’oka guive - - - Eike ehecha hag̃ua tembiasakue mbojojapyre ambue nemba’e’okagua. - - Eñemboheraguapy - - - Térã emoheñói Firefox mba’ete embojuehe hag̃ua]]> - Ñemboguejy Mboguetepyre @@ -1077,6 +1042,8 @@ "Share" button. Opens the share menu when pressed. --> Moherakuã + + Eñongatu PDF ramo Emondo mba’e’okápe @@ -1089,9 +1056,11 @@ Emondo kuatiajohápe - Eike embojuehe hag̃ua + Eike embojuehe hag̃ua Eñepyrũ tembiapo Sync-pe + + Embojuehe ha eñongatu mba’ekuaarã Emondo opaite mba’e’okápe @@ -1219,8 +1188,6 @@ Ñesẽ - - Oñemboguepáta opaite ne kundahára mba’ekuaarã. Pa’ũ embogue hag̃ua @@ -1958,4 +1925,5 @@ Eho ñembohekópe Firefox Kuave’ẽmby - + + diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 9578d476e..4129268d1 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -126,13 +126,6 @@ ყველა ბოლო ჩანართის ღილაკის ჩვენება - - მოძიებული „%1$s“ - - - %d საიტი ყველა დასინქრონებულის ნახვა @@ -298,6 +291,9 @@ თქვენი ჩანართები სინქრონდება! განაგრძეთ იქიდანვე, სადაც შეჩერდით სხვა მოწყობილობაზე. + + დახურვა + ახალი %1$s-ჩანართის გახსნა @@ -479,12 +475,6 @@ ფონის შეცვლა ვერ მოხერხდა ვრცლად - - შეცვალეთ ფონი Firefox-ის საწყისი გვერდის ნიშანზე შეხებით - - - Firefox-ლოგო – შეცვალეთ ფონი, ღილაკი ჩვეული %s @@ -672,10 +662,6 @@ სია ბადისებრი - - ძიების ჯგუფები - - დაკავშირებული საიტების დაჯგუფება ჩანართების დახურვა @@ -826,18 +812,6 @@ ისტორია არ არის - - სხვა მოწყობილობებიდან დასინქრონებული - - სხვა მოწყობილობებიდან - - - შედით თქვენი სხვა მოწყობილობებიდან ისტორიის სანახავად. - - შესვლა - - ან შექმენით Firefox-ანგარიში სინქრონიზაციისთვის]]> - ჩამოტვირთვები მოცილებულია @@ -1065,6 +1039,8 @@ გაზიარება + + შენახვა PDF-სახით მოწყობილობაზე გაგზავნა @@ -1076,9 +1052,11 @@ ასლი აღებულია - სინქრონიზაციაში შესვლა + სინქრონიზაციაში შესვლა დასინქრონებაში შესვლა + + დასინქრონება და შენახვა ყველა მოწყობილობაზე გაგზავნა @@ -1943,4 +1921,12 @@ პარამეტრებზე გადასვლა Firefox-შეთავაზება + + + + აკეცვა + + გაშლა + + გახსენით ბმული და იხილეთ ვრცლად ამ კრებულზე diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 4eb658767..835f5731a 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -126,12 +126,6 @@ සියල්ල පෙන්වන්න සියළු මෑත පටිති බොත්තම පෙන්වන්න - - \"%1$s\" සඳහා ඔබගේ සෙවුම - - අඩවි %d සියළු සමමුහූර්ත පටිති බලන්න @@ -293,6 +287,9 @@ පටිති සමමුහූර්ත වෙමින්! අනෙක් උපාංගයේ ඔබ නතර කළ තැනින් අතට ගන්න. + + වසන්න + නව %1$s පටිත්තක් අරින්න @@ -382,8 +379,6 @@ රිසිකරණය - ෆයර්ෆොක්ස් ගිණුමක් සමඟ පොත්යොමු, ඉතිහාසය හා තවත් දෑ සමමුහූර්ත කරන්න - පටිති, පොත්යොමු, මුරපද හා තවත් දෑ සමමුහූර්තයට පිවිසෙන්න. ෆයර්ෆොක්ස් ගිණුම @@ -449,6 +444,8 @@ මෑතදී ගොඩවැදුණු + + පොකට් අනුග්‍රහය ලද කතා @@ -473,11 +470,6 @@ බිතුපත වෙනස් කළ නොහැකි විය තව දැනගන්න - - ෆයර්ෆොක්ස් මුල්පිටුවේ ලාංඡනය එබීමෙන් බිතුපත වෙනස් කරන්න - - ෆයර්ෆොක්ස් ලාංඡනය - බිතුපත සංශෝධනය, බොත්තම පරණ %s @@ -573,8 +565,6 @@ මොස්ල්ලා සඳහා අධ්‍යන ස්ථාපනයට හා ධාවනයට ඉඩ දෙන්න - - සමමුහූර්තය සක්‍රිය කරන්න සමමුහූර්ත කර සුරකින්න @@ -670,10 +660,6 @@ ලේඛනය ජාලකය - - සෙවුම් සමූහ - - ආශ්‍රිත අඩවි සමූහගත කරන්න පටිති වසන්න @@ -795,8 +781,6 @@ ඉතිහාසයෙන් මකන්න %1$s (පෞද්ගලික ප්‍රකාරය) - - වෙනත් පටිති @@ -824,17 +808,6 @@ පරණ මෙහි ඉතිහාසයක් නැත - - වෙනත් උපාංග වලින් සමමුහූර්තයි - - වෙනත් උපාංග වෙතින් - - අන් උපාංග වලින් සමමුහූර්ත වූ ඉතිහාසය බැලීමට පිවිසෙන්න. - - පිවිසෙන්න - - - හෝ සමමුහූර්තය ඇරඹීමට ෆයර්ෆොක්ස් ගිණුමක් සාදන්න]]> @@ -1055,6 +1028,8 @@ බෙදාගන්න + + පීඩීඑෆ් ලෙස සුරකින්න උපාංගයට යවන්න @@ -1066,9 +1041,11 @@ පසුරු පුවරුවට පිටපත් විය - සමමුහූර්තයට පිවිසෙන්න + සමමුහූර්තයට පිවිසෙන්න සමමුහූර්තයට පිවිසෙන්න + + සමමුහූර්ත කර සුරකින්න සියළු උපාංග වෙත යවන්න @@ -1196,8 +1173,6 @@ ඉවත් වන්න - - මෙය ඔබගේ පිරික්සුම් දත්ත සියල්ල මකනු ඇත. මකා දමන කාල පරාසය @@ -1899,6 +1874,8 @@ මාතෘකාව අනුව කතා තව සොයා ගන්න + + පොකට් මගින් බලගැන්වේ. ෆයර්ෆොක්ස් පවුලේ කොටසකි. %s @@ -1908,4 +1885,12 @@ සැකසුම් වෙත යන්න - + + + + හැකිළීම + + විහිදුවීම + + මෙම එකතුව ගැන තව දැන ගැනීමට සබැඳිය අරින්න + diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index 568a97ec3..15174a5b9 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -41,11 +41,11 @@ - حالیہ کتاب نشان + حالیہ نشانیاں حالیہ محفوظ تھیاں - سارے محفوظ تھئے کتاب نشان ݙکھاؤ + سارے محفوظ تھیاں نشانیاں ݙکھاؤ ہٹاؤ @@ -130,12 +130,6 @@ سارے ݙکھاؤ سارے حالیہ ٹیب بٹݨ ݙکھاؤ - - \"%1$s\" کیتے تہاݙیاں ڳولاں - - %d سائٹاں ساریاں ہم وقت تھیاں ٹیباں ݙیکھو @@ -417,7 +411,7 @@ براؤزنگ تاریخ ڳولو - کتاب نشانیاں ڳولو + نشانیاں ڳولو ہم وقت تھیاں ٹیباں ݙیکھو @@ -485,11 +479,6 @@ وال پیپر کائنی وٹا سڳا ٻیا سِکھو - - فائرفوکس مکھ پنے لوگو تے انگل پھیرݨ نال وال پیپر وٹاؤ - - فائر فوکس لوگو ــ وال پیپر وٹاؤ، بٹݨ کلاسیکل %s @@ -522,7 +511,7 @@ تاریخ - کتاب نشان + نشانیاں @@ -634,7 +623,7 @@ ڈاؤن لوڈاں - کتاب نشان + نشانیاں ڈیسک ٹاپ نشانیاں @@ -683,10 +672,6 @@ گرڈ - - گروپ ڳولو - - ہکو سن٘ویاں سائٹاں کٹھیاں گروپ کرو ٹیباں بند کرو @@ -840,17 +825,6 @@ اتھ کوئی تاریخ کائنی - - ٻیاں ڈیوائساں کنوں ہم وقت تھیاں - - ٻیاں ڈیوائساں کنوں - - - آپݨیاں ٻنھاں ڈیوائساں کنوں ہم وقت تھئی تاریخ ݙیکھݨ کیتے سائن ان تھیوو۔ - - سائن ان - - یا ہم وقت کرݨ کیتے فائرفوکس کھاتہ بݨاؤ]]> From adfed996a2957efc2d25a15275c1831cb7c0ab1f Mon Sep 17 00:00:00 2001 From: Meiirbek Baimuratov Date: Wed, 12 Oct 2022 13:46:14 +0600 Subject: [PATCH 199/407] For mozilla-mobile#27282: delete WallpaperManager --- .../org/mozilla/fenix/FenixApplication.kt | 7 +++- .../mozilla/fenix/components/Components.kt | 10 ----- .../fenix/wallpapers/WallpaperManager.kt | 33 --------------- .../fenix/wallpapers/WallpaperManagerTest.kt | 40 ------------------- 4 files changed, 5 insertions(+), 85 deletions(-) delete mode 100644 app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperManager.kt delete mode 100644 app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperManagerTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 9a3f158f1..f4b25852e 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -93,7 +93,7 @@ import org.mozilla.fenix.telemetry.TelemetryLifecycleObserver import org.mozilla.fenix.utils.BrowsersCache import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHOLD -import org.mozilla.fenix.wallpapers.WallpaperManager +import org.mozilla.fenix.wallpapers.Wallpaper import java.util.UUID import java.util.concurrent.TimeUnit @@ -696,7 +696,10 @@ open class FenixApplication : LocaleAwareApplication(), Provider { } installSource.set(installSourcePackage.orEmpty()) - defaultWallpaper.set(WallpaperManager.isDefaultTheCurrentWallpaper(settings)) + val isDefaultTheCurrentWallpaper = + Wallpaper.nameIsDefault(settings.currentWallpaperName) + + defaultWallpaper.set(isDefaultTheCurrentWallpaper) } with(AndroidAutofill) { diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index c0ce93069..97944688c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -8,7 +8,6 @@ import android.annotation.SuppressLint import android.app.Application import android.content.Context import android.content.Intent -import android.os.StrictMode import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.core.net.toUri @@ -46,7 +45,6 @@ import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.utils.ClipboardHandler import org.mozilla.fenix.utils.Settings -import org.mozilla.fenix.wallpapers.WallpaperManager import org.mozilla.fenix.wifi.WifiConnectionMonitor import java.util.concurrent.TimeUnit @@ -164,14 +162,6 @@ class Components(private val context: Context) { val wifiConnectionMonitor by lazyMonitored { WifiConnectionMonitor(context as Application) } val strictMode by lazyMonitored { StrictModeManager(Config, this) } - val wallpaperManager by lazyMonitored { - strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { - WallpaperManager( - appStore, - ) - } - } - val settings by lazyMonitored { Settings(context) } val reviewPromptController by lazyMonitored { diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperManager.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperManager.kt deleted file mode 100644 index 5d6bef29b..000000000 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperManager.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.wallpapers - -import mozilla.components.support.base.log.logger.Logger -import org.mozilla.fenix.components.AppStore -import org.mozilla.fenix.utils.Settings - -/** - * Provides access to available wallpapers and manages their states. - */ -@Suppress("TooManyFunctions") -class WallpaperManager( - private val appStore: AppStore, -) { - val logger = Logger("WallpaperManager") - - val wallpapers get() = appStore.state.wallpaperState.availableWallpapers - val currentWallpaper: Wallpaper get() = appStore.state.wallpaperState.currentWallpaper - - companion object { - /** - * Get whether the default wallpaper should be used. - */ - fun isDefaultTheCurrentWallpaper(settings: Settings): Boolean = with(settings.currentWallpaperName) { - return isEmpty() || equals(defaultWallpaper.name) - } - - val defaultWallpaper = Wallpaper.Default - } -} diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperManagerTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperManagerTest.kt deleted file mode 100644 index 311ebbf76..000000000 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpaperManagerTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.mozilla.fenix.wallpapers - -import io.mockk.every -import io.mockk.mockk -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Test -import org.mozilla.fenix.utils.Settings - -class WallpaperManagerTest { - - private val mockSettings: Settings = mockk() - - @Test - fun `GIVEN no custom wallpaper set WHEN checking whether the current wallpaper should be default THEN return true`() { - every { mockSettings.currentWallpaperName } returns "" - - val result = WallpaperManager.isDefaultTheCurrentWallpaper(mockSettings) - - assertTrue(result) - } - - @Test - fun `GIVEN the default wallpaper is set to be shown WHEN checking whether the current wallpaper should be default THEN return true`() { - every { mockSettings.currentWallpaperName } returns WallpaperManager.defaultWallpaper.name - - val result = WallpaperManager.isDefaultTheCurrentWallpaper(mockSettings) - - assertTrue(result) - } - - @Test - fun `GIVEN a custom wallpaper is set to be shown WHEN checking whether the current wallpaper should be default THEN return false`() { - every { mockSettings.currentWallpaperName } returns "test" - - val result = WallpaperManager.isDefaultTheCurrentWallpaper(mockSettings) - - assertFalse(result) - } -} From 8ac2dc317b01f7bd03a93779c5c2eb6f5df8071f Mon Sep 17 00:00:00 2001 From: sarah541 Date: Tue, 11 Oct 2022 13:56:50 -0400 Subject: [PATCH 200/407] Truncate urls to prevent slowing down of UI --- app/src/main/java/org/mozilla/fenix/ext/String.kt | 2 +- .../fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt | 3 ++- .../org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt | 5 +++-- .../mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt | 3 ++- .../fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt | 2 +- .../java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt | 6 +++--- .../java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt | 4 ++-- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 8 files changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/ext/String.kt b/app/src/main/java/org/mozilla/fenix/ext/String.kt index b9c710617..618172d8e 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/String.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/String.kt @@ -11,9 +11,9 @@ import android.util.Patterns import android.webkit.URLUtil import androidx.compose.runtime.Composable import androidx.core.net.toUri -import mozilla.components.browser.toolbar.MAX_URI_LENGTH import mozilla.components.lib.publicsuffixlist.PublicSuffixList import mozilla.components.support.ktx.android.net.hostWithoutCommonPrefixes +import mozilla.components.support.ktx.kotlin.MAX_URI_LENGTH import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.inComposePreview import java.net.IDN diff --git a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt index b1a3d6c71..b3079c3a9 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import mozilla.components.concept.sync.DeviceType +import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.R import org.mozilla.fenix.compose.Image import org.mozilla.fenix.compose.ThumbnailCard @@ -127,7 +128,7 @@ fun RecentSyncedTab( RecentTabTitlePlaceholder() } else { Text( - text = tab.title, + text = tab.title.trimmed(), color = FirefoxTheme.colors.textPrimary, fontSize = 14.sp, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt index 8a0fb538e..62f49c368 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt @@ -52,6 +52,7 @@ import mozilla.components.browser.icons.compose.Placeholder import mozilla.components.browser.icons.compose.WithIcon import mozilla.components.browser.state.state.ContentState import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.support.ktx.kotlin.trimmed import mozilla.components.ui.colors.PhotonColors import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.Image @@ -143,7 +144,7 @@ private fun RecentTabItem( verticalArrangement = Arrangement.SpaceBetween, ) { Text( - text = tab.state.content.title.ifEmpty { tab.state.content.url }, + text = tab.state.content.title.ifEmpty { tab.state.content.url.trimmed() }, color = FirefoxTheme.colors.textPrimary, fontSize = 14.sp, maxLines = 2, @@ -163,7 +164,7 @@ private fun RecentTabItem( Spacer(modifier = Modifier.width(8.dp)) Text( - text = tab.state.content.url, + text = tab.state.content.url.trimmed(), color = FirefoxTheme.colors.textSecondary, fontSize = 12.sp, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt index c1cdc9bbb..910e8f8d5 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.R import org.mozilla.fenix.compose.EagerFlingBehavior import org.mozilla.fenix.compose.Favicon @@ -239,7 +240,7 @@ private fun RecentlyVisitedHistoryHighlight( Box(modifier = Modifier.fillMaxSize()) { RecentlyVisitedTitle( - text = recentVisit.title, + text = recentVisit.title.trimmed(), modifier = Modifier.align(Alignment.CenterStart), ) diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt index 696366c73..0866e2ed1 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt @@ -25,10 +25,10 @@ import mozilla.components.browser.tabstray.SelectableTabViewHolder import mozilla.components.browser.tabstray.TabsTray import mozilla.components.browser.tabstray.TabsTrayStyling import mozilla.components.browser.tabstray.thumbnail.TabThumbnailView -import mozilla.components.browser.toolbar.MAX_URI_LENGTH import mozilla.components.concept.base.images.ImageLoadRequest import mozilla.components.concept.base.images.ImageLoader import mozilla.components.concept.engine.mediasession.MediaSession +import mozilla.components.support.ktx.kotlin.MAX_URI_LENGTH import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Tab diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt index e1fc53c34..f66bf6560 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.tabstray.ext import mozilla.components.browser.storage.sync.SyncedDeviceTabs -import mozilla.components.browser.toolbar.MAX_URI_LENGTH +import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListItem /** @@ -20,7 +20,7 @@ fun List.toComposeList( } else { tabs.map { val url = it.active().url - val titleText = it.active().title.ifEmpty { url.take(MAX_URI_LENGTH) } + val titleText = it.active().title.ifEmpty { url.trimmed() } SyncedTabsListItem.Tab(titleText, url, it) } } @@ -32,7 +32,7 @@ fun List.toComposeList( } else { tabs.asSequence().map { val url = it.active().url - val titleText = it.active().title.ifEmpty { url.take(MAX_URI_LENGTH) } + val titleText = it.active().title.ifEmpty { url.trimmed() } SyncedTabsListItem.Tab(titleText, url, it) } } diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt index 216ce4955..5fb9f02d6 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/ext/TabSessionState.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.tabstray.ext import mozilla.components.browser.state.state.TabSessionState -import mozilla.components.browser.toolbar.MAX_URI_LENGTH +import mozilla.components.support.ktx.kotlin.trimmed fun TabSessionState.isActive(maxActiveTime: Long): Boolean { val lastActiveTime = maxOf(lastAccess, createdAt) @@ -58,4 +58,4 @@ internal fun TabSessionState.isNormalTab(): Boolean { /** * Returns a [String] for displaying a [TabSessionState]'s title or its url when a title is not available. */ -fun TabSessionState.toDisplayTitle(): String = content.title.ifEmpty { content.url.take(MAX_URI_LENGTH) } +fun TabSessionState.toDisplayTitle(): String = content.title.ifEmpty { content.url.trimmed() } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 9d7c5d12b..2ed30d1d8 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221019143129" + const val VERSION = "108.0.20221019190112" } From 6834aadf84d216d4342e78e6061d71d08e16d9e6 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Oct 2022 11:33:21 +0300 Subject: [PATCH 201/407] For #27478 fix for allowCookiesStorageAccessTest UI test --- .../java/org/mozilla/fenix/ui/robots/BrowserRobot.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 92bb17e0d..49c3e46b8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -822,8 +822,7 @@ class BrowserRobot { } fun clickRequestStorageAccessButton(interact: SitePermissionsRobot.() -> Unit): SitePermissionsRobot.Transition { - mDevice.findObject(UiSelector().text("requestStorageAccess()")).waitForExists(waitingTime) - mDevice.findObject(UiSelector().text("requestStorageAccess()")).click() + clickPageObject(webPageItemContainingText("requestStorageAccess()")) SitePermissionsRobot().interact() return SitePermissionsRobot.Transition() From 990d015c3d81991005100215d8bdc2182eef78fc Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Oct 2022 14:50:07 +0300 Subject: [PATCH 202/407] Add smoke test annotations for blockCookiesStorageAccessTest and allowCookiesStorageAccessTest UI tests --- .../java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt index 7bdd0b5ab..95ea1083f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/EnhancedTrackingProtectionTest.kt @@ -230,6 +230,7 @@ class EnhancedTrackingProtectionTest { } } + @SmokeTest @Test fun blockCookiesStorageAccessTest() { // With Standard TrackingProtection settings @@ -246,6 +247,7 @@ class EnhancedTrackingProtectionTest { } } + @SmokeTest @Test fun allowCookiesStorageAccessTest() { // With Standard TrackingProtection settings From 79a55e0b0fe6f7e97c71705b55355b266367d853 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 20 Oct 2022 17:02:50 +0000 Subject: [PATCH 203/407] Update to Android-Components 108.0.20221020143135. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 2ed30d1d8..91728b6e9 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221019190112" + const val VERSION = "108.0.20221020143135" } From 83e2ab5d38f9edd5adbcbcb8e896b4fd7140b24d Mon Sep 17 00:00:00 2001 From: MatthewTighe Date: Tue, 11 Oct 2022 15:46:45 -0700 Subject: [PATCH 204/407] No issue: add script to generate filled telemetry renewal request --- tools/.gitignore | 2 ++ tools/data_renewal_generate.py | 0 tools/data_renewal_request.py | 52 ++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 tools/.gitignore mode change 100644 => 100755 tools/data_renewal_generate.py create mode 100755 tools/data_renewal_request.py diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 000000000..2a20e4947 --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1,2 @@ +*_expiry_list.csv +*_renewal_request.txt diff --git a/tools/data_renewal_generate.py b/tools/data_renewal_generate.py old mode 100644 new mode 100755 diff --git a/tools/data_renewal_request.py b/tools/data_renewal_request.py new file mode 100755 index 000000000..50228bd45 --- /dev/null +++ b/tools/data_renewal_request.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +""" +A script to help generate a data review request comment. Once the CSV has been filled by product, +copy the filled version into the tools directory and run this script from there to generate a filled +renewal request data review comment. +""" + +import csv +import sys + +try: + version = sys.argv[1] +except: + print ("usage is to include arguments of the form ") + quit() + +expiry_filename = version + "_expiry_list.csv" +filled_renewal_filename = version + "_filled_renewal_request.txt" + +csv_reader = csv.DictReader(open(expiry_filename, 'r')) +output_string = "" +total_count = 0 +updated_version = int(version) + 13 +for row in csv_reader: + (section, metric) = row["name"].split('.') + if row["keep(Y/N)"] == 'n': + continue + total_count += 1 + output_string += f'` {row["name"]}`\n' + output_string += "1) Provide a link to the initial Data Collection Review Request for this collection.\n" + output_string += f' - {eval(row["data_reviews"])[0]}\n' + output_string += "\n" + output_string += "2) When will this collection now expire?\n" + output_string += f' - {updated_version}\n' + output_string += "\n" + output_string += "3) Why was the initial period of collection insufficient?\n" + output_string += f' - {row["reason to extend"]}\n' + output_string += "\n" + output_string += "———\n" + +header = "# Request for Data Collection Renewal\n" +header += "### Renew for 1 year\n" +header += f'Total: {total_count}\n' +header += "———\n\n" + +with open(filled_renewal_filename, 'w+') as out: + out.write(header + output_string) + out.close() From 37a3f438758f57f450f1a663444e86b283ebad88 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 20 Oct 2022 19:23:06 +0000 Subject: [PATCH 205/407] Update to Android-Components 108.0.20221020190123. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 91728b6e9..4aead1bdb 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221020143135" + const val VERSION = "108.0.20221020190123" } From 2517804c8f497a69ae9d4218279e573caacf9205 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 21 Oct 2022 02:39:17 +0200 Subject: [PATCH 206/407] Import l10n. (#27488) --- app/src/main/res/values-hr/strings.xml | 77 +++++++------------------- 1 file changed, 21 insertions(+), 56 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 37ef3f0d9..94136c355 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -41,7 +41,9 @@ - Nedavne zabilješke + Nedavne zabilješke + + Nedavno spremljeno Prikaži sve spremljene zabilješke @@ -121,13 +123,6 @@ Prikaži tipku za prikaz svih nedavnih kartica - - Tvoja pretraga za \"%1$s\" - - - %d stranica Pogledaj sve sinkronizirane kartice @@ -249,24 +244,24 @@ - Što je novo u %1$s + Što je novo u %1$s - Sada je lakše nastaviti pregledavati web. + Sada je lakše nastaviti pregledavati web. - %1$s personalizirana početna stranica + %1$s personalizirana početna stranica - Skoči na svoje otvorene kartice, zabilješke i povijest pregledavanja. + Skoči na svoje otvorene kartice, zabilješke i povijest pregledavanja. - Čiste, organizirane kartice + Čiste, organizirane kartice - Očisti nered među karticama pomoću poboljšanog rasporeda i automatskog zatvaranja kartica. + Očisti nered među karticama pomoću poboljšanog rasporeda i automatskog zatvaranja kartica. - Nedavne pretrage + Nedavne pretrage - Ponovno pregledaj svoja posljednja pretraživanja na početnoj stranici i karticama. + Ponovno pregledaj svoja posljednja pretraživanja na početnoj stranici i karticama. - Tvoja personalizirana Firefoxova početna stranica sada ti olakšava da nastaviš pretraživati. Pronađi svoje nedavne kartice, zabilješke i rezultate pretraživanja. + Tvoja personalizirana Firefoxova početna stranica sada ti olakšava da nastaviš pretraživati. Pronađi svoje nedavne kartice, zabilješke i rezultate pretraživanja. @@ -353,8 +348,6 @@ Geste Prilagodi - - Sinkroniziraj zabilješke, lozinke i ostalo sa svojim Firefox računom Firefox račun @@ -438,11 +431,6 @@ Pozadina ažurirana! Prikaži - - Promijeni sliku pozadine dodirom na logotip početne stranice Firefoxa - - Firefox logo - promijenite pozadinu, tipka @@ -525,8 +513,6 @@ Omogućuje Mozilli instalaciju i pokretanje istraživanja - - Uključi sinkronizaciju Sinkronizirajte i spremite svoje podatke @@ -618,10 +604,6 @@ Popis Mreža - - Grupe pretraživanja - - Grupiraj povezane web-stranice Zatvori kartice @@ -727,8 +709,6 @@ Izbornik za otvorene kartice Spremi kartice u zbirku - - Izbornik za kartice Izbriši zbirku @@ -748,9 +728,6 @@ %1$s (privatni modus) - - Ostale kartice - Upiši pojmove pretrage @@ -781,15 +758,6 @@ Nema povijesti - - Sinkronizirano s drugih uređaja - - S drugih uređaja - - Prijava - - Ili stvorite Firefox račun za početak sinkronizacije]]> - Uklonjena preuzimanja @@ -1030,10 +998,10 @@ Kopirano u međuspremnik - Prijavi se za sinkronizaciju + Prijavi se za sinkronizaciju Prijavi se za sinkronizaciju - + Pošalji na sve uređaje Ponovo se poveži za sinkronizaciju @@ -1157,9 +1125,6 @@ Zatvori - - Ovo će izbrisati sve tvoje podatke pregledavanja. - Vremenski opseg za brisanje @@ -1194,16 +1159,16 @@ - Dobro došao, dobro došla u %s! + Dobro došao, dobro došla u %s! - Sinkroniziraj Firefox između uređaja + Sinkroniziraj Firefox između uređaja - Registriraj se + Registriraj se Sinkronizacija je uključena - Uvijek uključena privatnost + Uvijek uključena privatnost Standardno (zadano) @@ -1215,13 +1180,13 @@ Odaberi položaj alatne trake - Stavi alatnu traku na dohvat ruke. Zadrži ju na dnu ili premjesti na vrh. + Stavi alatnu traku na dohvat ruke. Zadrži ju na dnu ili premjesti na vrh. - Tvoja privatnost + Tvoja privatnost - %s smo stvorili za jednostavno upravljanje podacima koje dijeliš na mreži i koje dijeliš s nama. + %s smo stvorili za jednostavno upravljanje podacima koje dijeliš na mreži i koje dijeliš s nama. Pročitaj naša pravila privatnosti From bd465bb44faa7d51f59c638ac2d37179fc82e1ca Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 21 Oct 2022 02:36:12 +0000 Subject: [PATCH 207/407] Update to Android-Components 108.0.20221021021005. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 4aead1bdb..8f42a9b10 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221020190123" + const val VERSION = "108.0.20221021021005" } From dbc05b4aa5d8d68d49e7f478d4954d02cf7e1ced Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Fri, 14 Oct 2022 14:58:38 +0300 Subject: [PATCH 208/407] For #9323 - Use android:background to set small search widget microphone icon --- .../main/res/drawable/ic_microphone_widget.xml | 18 +++++++++++++----- .../drawable/ic_microphone_widget_padded.xml | 6 ------ .../main/res/layout/search_widget_large.xml | 2 +- .../main/res/layout/search_widget_medium.xml | 2 +- .../main/res/layout/search_widget_small.xml | 3 +-- 5 files changed, 16 insertions(+), 15 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_microphone_widget_padded.xml diff --git a/app/src/main/res/drawable/ic_microphone_widget.xml b/app/src/main/res/drawable/ic_microphone_widget.xml index c3275599b..a12cbdca4 100644 --- a/app/src/main/res/drawable/ic_microphone_widget.xml +++ b/app/src/main/res/drawable/ic_microphone_widget.xml @@ -1,8 +1,16 @@ - - - - + + + + + diff --git a/app/src/main/res/drawable/ic_microphone_widget_padded.xml b/app/src/main/res/drawable/ic_microphone_widget_padded.xml deleted file mode 100644 index 665b13f1b..000000000 --- a/app/src/main/res/drawable/ic_microphone_widget_padded.xml +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/app/src/main/res/layout/search_widget_large.xml b/app/src/main/res/layout/search_widget_large.xml index e17529759..cf8326f75 100644 --- a/app/src/main/res/layout/search_widget_large.xml +++ b/app/src/main/res/layout/search_widget_large.xml @@ -38,6 +38,6 @@ android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginEnd="1dp" - android:background="@drawable/ic_microphone_widget_padded" + android:background="@drawable/ic_microphone_widget" android:contentDescription="@string/search_widget_voice" /> diff --git a/app/src/main/res/layout/search_widget_medium.xml b/app/src/main/res/layout/search_widget_medium.xml index c51ff6b61..c564ca044 100644 --- a/app/src/main/res/layout/search_widget_medium.xml +++ b/app/src/main/res/layout/search_widget_medium.xml @@ -39,5 +39,5 @@ android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginEnd="1dp" - android:background="@drawable/ic_microphone_widget_padded" /> + android:background="@drawable/ic_microphone_widget" /> diff --git a/app/src/main/res/layout/search_widget_small.xml b/app/src/main/res/layout/search_widget_small.xml index db0531acc..91e19b896 100644 --- a/app/src/main/res/layout/search_widget_small.xml +++ b/app/src/main/res/layout/search_widget_small.xml @@ -3,7 +3,6 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + android:background="@drawable/ic_microphone_widget" /> From 9a99666d2b49e652bf713560b2bdc49cbab53597 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Tue, 18 Oct 2022 12:57:50 +0300 Subject: [PATCH 209/407] For #27135 - Correctly report top sites for a11y services --- .../org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt | 4 ++-- .../mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt index ab13c2abb..5af87487f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt @@ -39,7 +39,7 @@ class TopSiteItemViewHolder( private val binding = TopSiteItemBinding.bind(view) init { - binding.topSiteItem.setOnLongClickListener { + itemView.setOnLongClickListener { interactor.onTopSiteMenuOpened() TopSites.longPress.record(TopSites.LongPressExtra(topSite.name())) @@ -72,7 +72,7 @@ class TopSiteItemViewHolder( } fun bind(topSite: TopSite, position: Int) { - binding.topSiteItem.setOnClickListener { + itemView.setOnClickListener { interactor.onSelectTopSite(topSite, position) } diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt index 97aef255b..cd41e14d8 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt @@ -58,7 +58,7 @@ class TopSiteItemViewHolderTest { fun `calls interactor on click`() { TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(pocket, position = 0) - binding.topSiteItem.performClick() + binding.root.performClick() verify { interactor.onSelectTopSite(pocket, position = 0) } } @@ -67,7 +67,7 @@ class TopSiteItemViewHolderTest { every { testContext.components.analytics } returns mockk(relaxed = true) TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(pocket, position = 0) - binding.topSiteItem.performLongClick() + binding.root.performLongClick() verify { interactor.onTopSiteMenuOpened() } } From 8c22f3faabec15b11229158e9a4c16d792770999 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 21 Oct 2022 14:58:54 +0000 Subject: [PATCH 210/407] Update to Android-Components 108.0.20221021143146. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 8f42a9b10..0f49a14ca 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221021021005" + const val VERSION = "108.0.20221021143146" } From d44e8b0052fdf6a0dd85b559fd8d3daa732aa397 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 22 Oct 2022 02:39:02 +0200 Subject: [PATCH 211/407] Import l10n. (#27498) --- app/src/main/res/values-en-rCA/strings.xml | 45 ++++++++-------------- app/src/main/res/values-gn/strings.xml | 33 +++++++++++++++- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 3eeda2d74..92393435b 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -131,13 +131,6 @@ Show all recent tabs button - - Your search for \"%1$s\" - - - %d sites See all synced tabs @@ -302,6 +295,9 @@ Your tabs are syncing! Pick up where you left off on your other device. + + Close + Open a new %1$s tab @@ -481,11 +477,6 @@ Couldn’t change wallpaper Learn more - - Change wallpaper by tapping Firefox homepage logo - - Firefox logo - change the wallpaper, button Classic %s @@ -671,10 +662,6 @@ List Grid - - Search groups - - Group related sites together Close tabs @@ -825,18 +812,6 @@ No history here - - Synced from other devices - - From other devices - - - Sign in to see history synced from your other devices. - - Sign in - - Or create a Firefox account to start syncing]]> - Downloads Removed @@ -1062,6 +1037,8 @@ Share + + Save as PDF Send to device @@ -1073,9 +1050,11 @@ Copied to clipboard - Sign in to sync + Sign in to sync Sign in to Sync + + Sync and save data Send to all devices @@ -1928,4 +1907,12 @@ Go to settings Firefox Suggest + + + + collapse + + expand + + open link to learn more about this collection diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 007768ae2..3afeb0da7 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -81,6 +81,9 @@ Mboyke + + + Ore rembiapo tekoñemigua iporãvéva omboyke tapykuehoha tendakuéra pa’ũme. Maranduve kookie ñemo’ã guasu rehegua @@ -273,14 +276,20 @@ Nde kuatiarogue ñepyrũgua mboavapyre Firefox pegua nombohasyive eñepyrũjeývo eheja haguégui. Ejuhu ne rendayke, techaukaha ha ehekaramovéva. + + Ehecha nde kuatiarogue ñepyrũha. Umi tendayke ramovegua, techaukaha ha jeheka rapykuere oĩta ápe. Eg̃uahẽporãite ñanduti ijeheguívape Eg̃uahẽporãite ñanduti mba’eguáva + + Sa’yve. Tekorosãve. Roykekove tapichakuérape roma’ẽ’ỹre virúre. Eva pumbyrýgui mohendahápe ha ambueháicha Mba’erechaha ñemoambue ndahasyiete + + Eku’ejey eheja haguégui tendayke ambue mba’e’oka ndive nde kuatiarogue ñepyrũme. Eñepyrũ @@ -288,6 +297,8 @@ Jepo + + ¡Tendayke oñembojuehehína! Eku’ejey eheja haguégui ambue mba’e’okápe. Mboty @@ -477,12 +488,19 @@ Jepokuaa %s Ñemoheñói sa’íva + + Pe ñembyaty pyahu Voces Independientes. %s + + Pe ñembyaty pyahu Voces Independientes. Eipurukuaa sa’y sa’imi Eiporavo mba’erechaha rugua nde ehecharamóva. + + Ema’ẽjeyjey mba’erechaha ruguáre + Pe moĩmbaha ndojokupytýi @@ -1226,8 +1244,14 @@ ¡Eg̃uahẽporãite %s-pe! + + Eg̃uahẽporãite ñanduti iporãvévape + + Kundahára heñóiva tapichápe g̃uarã, ndaha’éi virurã. Embojuehe Firefox mba’e’oka pa’ũme + + Eku’ejey eheja haguégui Egueru techaukaha, tembiasakue ha ñe’ẽñemi %1$s-pe ko mba’e’okápe. @@ -1926,4 +1950,11 @@ Eho ñembohekópe Firefox Kuave’ẽmby - + + + pa’ãmba + + myasãi + + embojuruja juajuha eikuaave hag̃ua ko ñembyaty + From 5f136e82272417d19888ee8cf701477296642ea5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 22 Oct 2022 14:49:39 +0000 Subject: [PATCH 212/407] Update to Android-Components 108.0.20221022143114. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0f49a14ca..5e505c353 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221021143146" + const val VERSION = "108.0.20221022143114" } From 8b0157848864ce5edd2c59aabf1a735f28eecfa3 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 23 Oct 2022 14:49:45 +0000 Subject: [PATCH 213/407] Update to Android-Components 108.0.20221023143208. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5e505c353..8260ada50 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221022143114" + const val VERSION = "108.0.20221023143208" } From 731748a5b15a83a6053aab15f25a3f839ec4ef18 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 24 Oct 2022 02:31:07 +0200 Subject: [PATCH 214/407] Import l10n. (#27512) --- app/src/main/res/values-eu/strings.xml | 45 +++++++++----------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 6f256d446..887426ebd 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -131,13 +131,6 @@ Azken fitxa guztiak erakusteko botoia - - Zure bilaketa: \"%1$s\" - - - %d gune Ikusi sinkronizatutako fitxa guztiak @@ -306,6 +299,9 @@ Zure fitxak sinkronizatzen ari dira! Jarraitu zure beste gailuan utzi zenuen tokitik. + + Itxi + Ireki %1$s fitxa berria @@ -486,11 +482,6 @@ Ezin da horma-papera aldatu Argibide gehiago - - Aldatu horma-papera Firefoxen hasiera-orriko logoa sakatuz - - Firefox logoa - aldatu horma-papera, botoia %s klasikoa @@ -681,10 +672,6 @@ Zerrenda Sareta - - Bilaketa-taldeak - - Taldekatu antzerako guneak Itxi fitxak @@ -835,18 +822,6 @@ Historiarik ez hemen - - Beste gailuetatik sinkronizatuta - - Beste gailuetakoa - - - Hasi saioa zure beste gailuetatik sinkronizatutako historia ikusteko. - - Hasi saioa - - Edo sortu Firefox kontua sinkronizatzen hasteko]]> - Deskargak kenduta @@ -1075,6 +1050,8 @@ Partekatu + + Gorde PDF gisa Bidali gailura @@ -1086,9 +1063,11 @@ Arbelean kopiatuta - Hasi saioa sinkronizatzeko + Hasi saioa sinkronizatzeko Hasi saioa Sync-en + + Sinkronizatu eta gorde datuak Bidali gailu guztietara @@ -1948,4 +1927,12 @@ Joan ezarpenetara Firefoxen iradokizunak + + + + tolestu + + zabaldu + + ireki lotura bilduma honi buruzko argibide gehiagorako From f369129aad5b5d277a920b9161576d2bfc4c4f23 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Oct 2022 13:06:39 +0300 Subject: [PATCH 215/407] Add HTML controls static asset --- .../assets/pages/htmlControls.html | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/src/androidTest/assets/pages/htmlControls.html diff --git a/app/src/androidTest/assets/pages/htmlControls.html b/app/src/androidTest/assets/pages/htmlControls.html new file mode 100644 index 000000000..a094974fc --- /dev/null +++ b/app/src/androidTest/assets/pages/htmlControls.html @@ -0,0 +1,74 @@ + + + + Html_Control_Form + + + + +

Calendar Form

+
+ + +
+
+ +

Clock Form

+
+ + +
+
+ +

Color Form

+
+ + +
+
+ +

Drop-down Form

+ + +
+ + + + + + + + + + From ce3d6b84ca622a1f3efdc6262819678cfe575816 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Oct 2022 13:15:34 +0300 Subject: [PATCH 216/407] Add external links static asset --- .../assets/pages/externalLinks.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/src/androidTest/assets/pages/externalLinks.html diff --git a/app/src/androidTest/assets/pages/externalLinks.html b/app/src/androidTest/assets/pages/externalLinks.html new file mode 100644 index 000000000..adf03cffc --- /dev/null +++ b/app/src/androidTest/assets/pages/externalLinks.html @@ -0,0 +1,22 @@ + + + + Html_Control_Form + + + + +

Misc Link Types

+
+ External link +
+ +
+ Email link +
+ +
+ Telephone link +
+ + From 699880903952421cfb4edf77136b30c23c0212c2 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 20 Oct 2022 13:52:06 +0300 Subject: [PATCH 217/407] For #26286 new web control UI tests --- .../mozilla/fenix/helpers/TestAssetHelper.kt | 12 + .../org/mozilla/fenix/ui/WebControlsTest.kt | 150 ++++++++++++ .../mozilla/fenix/ui/robots/BrowserRobot.kt | 231 ++++++++++++++++++ 3 files changed, 393 insertions(+) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt index 8b3c42387..fd3874b30 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt @@ -99,6 +99,18 @@ object TestAssetHelper { return TestAsset(url, "", "") } + fun getHTMLControlsFormAsset(server: MockWebServer): TestAsset { + val url = server.url("pages/htmlControls.html").toString().toUri()!! + + return TestAsset(url, "", "") + } + + fun getExternalLinksAsset(server: MockWebServer): TestAsset { + val url = server.url("pages/externalLinks.html").toString().toUri()!! + + return TestAsset(url, "", "") + } + fun getAudioPageAsset(server: MockWebServer): TestAsset { val url = server.url("pages/audioMediaPage.html").toString().toUri()!! val title = "Audio_Test_Page" diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt new file mode 100644 index 000000000..611b952ae --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt @@ -0,0 +1,150 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ui + +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.ui.robots.navigationToolbar + +/** + * Tests for verifying basic interactions with web control elements + * + */ + +class WebControlsTest { + private lateinit var mockWebServer: MockWebServer + + private val hour = 10 + private val minute = 10 + private val colorHexValue = "#5b2067" + + @get:Rule + val activityTestRule = HomeActivityTestRule( + isJumpBackInCFREnabled = false, + isTCPCFREnabled = false, + ) + + @Before + fun setUp() { + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun cancelCalendarFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Calendar Form") + clickFormViewButton("CANCEL") + clickSubmitDateButton() + verifyNoDateIsSelected() + } + } + + @Test + fun setAndClearCalendarFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Calendar Form") + selectDate() + clickFormViewButton("OK") + clickSubmitDateButton() + verifySelectedDate() + clickForm("Calendar Form") + clickFormViewButton("CLEAR") + clickSubmitDateButton() + verifyNoDateIsSelected() + } + } + + @Test + fun cancelClockFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Clock Form") + clickFormViewButton("CANCEL") + clickSubmitTimeButton() + verifyNoTimeIsSelected(hour, minute) + } + } + + @Test + fun setAndClearClockFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Clock Form") + selectTime(hour, minute) + clickFormViewButton("OK") + clickSubmitTimeButton() + verifySelectedTime(hour, minute) + clickForm("Clock Form") + clickFormViewButton("CLEAR") + clickSubmitTimeButton() + verifyNoTimeIsSelected(hour, minute) + } + } + + @Test + fun cancelColorFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Color Form") + selectColor(colorHexValue) + clickFormViewButton("CANCEL") + clickSubmitColorButton() + verifyColorIsNotSelected(colorHexValue) + } + } + + @Test + fun setColorFormTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Color Form") + selectColor(colorHexValue) + clickFormViewButton("SET") + clickSubmitColorButton() + verifySelectedColor(colorHexValue) + } + } + + @Test + fun verifyDropdownMenuTest() { + val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(htmlControlsPage.url) { + clickForm("Drop-down Form") + selectDropDownOption("The National") + clickSubmitDropDownButton() + verifySelectedDropDownOption("The National") + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 49c3e46b8..fb5ed4a10 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -11,14 +11,17 @@ import android.content.Intent import android.net.Uri import android.os.SystemClock import android.util.Log +import android.widget.TimePicker import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.contrib.PickerActions import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.BundleMatchers import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility @@ -34,6 +37,7 @@ import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.mediasession.MediaSession import org.hamcrest.CoreMatchers.allOf +import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.mozilla.fenix.R @@ -49,6 +53,7 @@ import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.waitForObjects import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull +import java.time.LocalDate class BrowserRobot { private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource @@ -651,6 +656,227 @@ class BrowserRobot { assertTrue(hintMessage.waitForExists(waitingTime)) } + fun clickForm(formType: String) { + when (formType) { + "Calendar Form" -> { + clickPageObject(webPageItemWithResourceId("calendar")) + mDevice.waitForIdle(waitingTime) + } + "Clock Form" -> { + clickPageObject(webPageItemWithResourceId("clock")) + mDevice.waitForIdle(waitingTime) + } + "Color Form" -> { + clickPageObject(webPageItemWithResourceId("colorPicker")) + mDevice.waitForIdle(waitingTime) + } + "Drop-down Form" -> { + clickPageObject(webPageItemWithResourceId("dropDown")) + mDevice.waitForIdle(waitingTime) + } + } + } + + fun clickFormViewButton(button: String) = mDevice.findObject(UiSelector().textContains(button)).click() + + fun selectDate() { + mDevice.findObject(UiSelector().resourceId("android:id/month_view")).waitForExists(waitingTime) + + mDevice.findObject( + UiSelector() + .textContains("$currentDay") + .descriptionContains("$currentDay $currentMonth $currentYear"), + ).click() + } + + fun selectTime(hour: Int, minute: Int) = + onView( + isAssignableFrom(TimePicker::class.java), + ).inRoot( + isDialog(), + ).perform(PickerActions.setTime(hour, minute)) + + fun selectColor(hexValue: String) { + mDevice.findObject( + UiSelector() + .textContains("Choose a color") + .resourceId("$packageName:id/alertTitle"), + ).waitForExists(waitingTime) + + val colorSelection = + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/color_item") + .descriptionContains(hexValue), + ) + colorSelection.click() + } + + fun selectDropDownOption(optionName: String) { + mDevice.findObject( + UiSelector().resourceId("$packageName:id/customPanel"), + ).waitForExists(waitingTime) + mDevice.findObject(UiSelector().textContains(optionName)).click() + } + + fun clickSubmitDateButton() = clickPageObject(webPageItemWithResourceId("submitDate")) + + fun clickSubmitTimeButton() = clickPageObject(webPageItemWithResourceId("submitTime")) + + fun clickSubmitColorButton() = clickPageObject(webPageItemWithResourceId("submitColor")) + + fun clickSubmitDropDownButton() = clickPageObject(webPageItemWithResourceId("submitOption")) + + fun verifySelectedDate() { + for (i in 1..RETRY_COUNT) { + try { + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected date is: $currentDate"), + ).waitForExists(waitingTime), + ) + + break + } catch (e: AssertionError) { + Log.e("TestLog", "Selected time isn't displayed ${e.localizedMessage}") + + clickForm("Calendar Form") + selectDate() + clickFormViewButton("OK") + clickSubmitDateButton() + } + } + + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected date is: $currentDate"), + ).waitForExists(waitingTime), + ) + } + + fun verifyNoDateIsSelected() { + assertFalse( + mDevice.findObject( + UiSelector() + .text("Selected date is: $currentDate"), + ).waitForExists(waitingTime), + ) + } + + fun verifySelectedTime(hour: Int, minute: Int) { + for (i in 1..RETRY_COUNT) { + try { + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected time is: $hour:$minute"), + ).waitForExists(waitingTime), + ) + + break + } catch (e: AssertionError) { + Log.e("TestLog", "Selected time isn't displayed ${e.localizedMessage}") + + clickForm("Clock Form") + clickFormViewButton("CLEAR") + clickForm("Clock Form") + selectTime(hour, minute) + clickFormViewButton("OK") + clickSubmitTimeButton() + } + } + + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected time is: $hour:$minute"), + ).waitForExists(waitingTime), + ) + } + + fun verifySelectedColor(hexValue: String) { + for (i in 1..RETRY_COUNT) { + try { + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected color is: $hexValue"), + ).waitForExists(waitingTime), + ) + + break + } catch (e: AssertionError) { + Log.e("TestLog", "Selected color isn't displayed ${e.localizedMessage}") + + clickForm("Color Form") + selectColor(hexValue) + clickFormViewButton("SET") + clickSubmitColorButton() + } + } + + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected color is: $hexValue"), + ).waitForExists(waitingTime), + ) + } + + fun verifySelectedDropDownOption(optionName: String) { + for (i in 1..RETRY_COUNT) { + try { + mDevice.findObject( + UiSelector() + .textContains("Submit drop down option") + .resourceId("submitOption"), + ).waitForExists(waitingTime) + + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected option is: $optionName"), + ).waitForExists(waitingTime), + ) + + break + } catch (e: AssertionError) { + Log.e("TestLog", "Selected option isn't displayed ${e.localizedMessage}") + + clickForm("Drop-down Form") + selectDropDownOption(optionName) + clickSubmitDropDownButton() + } + } + + assertTrue( + mDevice.findObject( + UiSelector() + .text("Selected option is: $optionName"), + ).waitForExists(waitingTime), + ) + } + + fun verifyNoTimeIsSelected(hour: Int, minute: Int) { + assertFalse( + mDevice.findObject( + UiSelector() + .text("Selected date is: $hour:$minute"), + ).waitForExists(waitingTime), + ) + } + + fun verifyColorIsNotSelected(hexValue: String) { + assertFalse( + mDevice.findObject( + UiSelector() + .text("Selected date is: $hexValue"), + ).waitForExists(waitingTime), + ) + } + class Transition { private fun threeDotButton() = onView( allOf( @@ -983,3 +1209,8 @@ private fun setPageObjectText(webPageItem: UiObject, text: String) { } } } + +private val currentDate = LocalDate.now() +private val currentDay = currentDate.dayOfMonth +private val currentMonth = currentDate.month +private val currentYear = currentDate.year From 7ea69a43ab661a57b0185f7696ba2222dbdf8cb9 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 21 Oct 2022 15:49:42 +0300 Subject: [PATCH 218/407] For #26286 new external links UI tests --- .../org/mozilla/fenix/ui/WebControlsTest.kt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt index 611b952ae..fd06ab548 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt @@ -10,8 +10,10 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.Constants import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens import org.mozilla.fenix.ui.robots.navigationToolbar /** @@ -25,6 +27,8 @@ class WebControlsTest { private val hour = 10 private val minute = 10 private val colorHexValue = "#5b2067" + private val emailLink = "mailto://example@example.com" + private val phoneLink = "tel://1234567890" @get:Rule val activityTestRule = HomeActivityTestRule( @@ -147,4 +151,37 @@ class WebControlsTest { verifySelectedDropDownOption("The National") } } + + @Test + fun externalLinkTest() { + val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(externalLinksPage.url) { + clickLinkMatchingText("External link") + verifyUrl("duckduckgo") + } + } + + @Test + fun emailLinkTest() { + val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(externalLinksPage.url) { + clickLinkMatchingText("Email link") + assertNativeAppOpens(Constants.PackageName.GMAIL_APP, emailLink) + } + } + + @Test + fun telephoneLinkTest() { + val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + + navigationToolbar { + }.enterURLAndEnterToBrowser(externalLinksPage.url) { + clickLinkMatchingText("Telephone link") + assertNativeAppOpens(Constants.PackageName.PHONE_APP, phoneLink) + } + } } From 7ceb931940612f54617b7719741492d6fa5027ba Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 24 Oct 2022 15:05:17 +0000 Subject: [PATCH 219/407] Update to Android-Components 108.0.20221024143125. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 8260ada50..ad8ab596c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221023143208" + const val VERSION = "108.0.20221024143125" } From 814f87f9f38396723f9edecb97273b8bc72d9ed3 Mon Sep 17 00:00:00 2001 From: Timshel Date: Mon, 19 Sep 2022 18:09:39 +0200 Subject: [PATCH 220/407] For #26577 - resetFocus only when camera permission is denied --- .../java/org/mozilla/fenix/search/SearchDialogFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index e6068897a..6562e5942 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -11,6 +11,7 @@ import android.app.Dialog import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.content.pm.PackageManager import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable @@ -655,7 +656,9 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { when (requestCode) { REQUEST_CODE_CAMERA_PERMISSIONS -> qrFeature.withFeature { it.onPermissionsResult(permissions, grantResults) - resetFocus() + if (grantResults.contains(PackageManager.PERMISSION_DENIED)) { + resetFocus() + } requireContext().settings().setCameraPermissionNeededState = false } else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults) From 722ea2b5599c58d19eada4a9f3085e9f8b3c3767 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 24 Oct 2022 19:49:31 +0000 Subject: [PATCH 221/407] Update to Android-Components 108.0.20221024190111. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ad8ab596c..84bd1f06c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221024143125" + const val VERSION = "108.0.20221024190111" } From 5a0b85fad2d8e3872275ae58ac3d58eea23197c4 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 25 Oct 2022 01:53:45 +0000 Subject: [PATCH 222/407] Update to Android-Components 108.0.20221025010754. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 84bd1f06c..fad14862d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221024190111" + const val VERSION = "108.0.20221025010754" } From 6237b26e36f21bfb5a589e1e56a477f434cc5d2e Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Mon, 24 Oct 2022 14:29:58 -0400 Subject: [PATCH 223/407] No issue: Update data renewal request script --- tools/data_renewal_request.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/data_renewal_request.py b/tools/data_renewal_request.py index 50228bd45..895b3043c 100755 --- a/tools/data_renewal_request.py +++ b/tools/data_renewal_request.py @@ -26,7 +26,6 @@ output_string = "" total_count = 0 updated_version = int(version) + 13 for row in csv_reader: - (section, metric) = row["name"].split('.') if row["keep(Y/N)"] == 'n': continue total_count += 1 @@ -35,7 +34,11 @@ for row in csv_reader: output_string += f' - {eval(row["data_reviews"])[0]}\n' output_string += "\n" output_string += "2) When will this collection now expire?\n" - output_string += f' - {updated_version}\n' + if len(row["new expiry version"]) == 0: + output_string += f' - {updated_version}\n' + else: + output_string += f' - {row["new expiry version"]}\n' + output_string += "\n" output_string += "3) Why was the initial period of collection insufficient?\n" output_string += f' - {row["reason to extend"]}\n' From 919c40e40710bb35c53bb68698c18c8cc1b1d60a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 25 Oct 2022 14:57:17 +0000 Subject: [PATCH 224/407] Update to Android-Components 108.0.20221025143110. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index fad14862d..7f0c31cba 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221025010754" + const val VERSION = "108.0.20221025143110" } From 6913cd59c9429df6a44cfcc544c9b511c026a134 Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 25 Oct 2022 20:08:33 +0300 Subject: [PATCH 225/407] For #27541: Update AndroidX Annotation to latest version. Add AndroidX Annotation as a direct dependency to app build.gradle. Update imports for annotations moved to Companion Object. --- app/build.gradle | 1 + app/src/main/java/org/mozilla/fenix/HomeActivity.kt | 2 +- .../java/org/mozilla/fenix/components/BackgroundServices.kt | 2 +- .../mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt | 2 +- app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt | 2 +- app/src/main/java/org/mozilla/fenix/ext/View.kt | 2 +- app/src/main/java/org/mozilla/fenix/home/HomeMenuBuilder.kt | 2 +- .../recentbookmarks/controller/RecentBookmarksController.kt | 2 +- .../fenix/home/recenttabs/controller/RecentTabController.kt | 2 +- .../home/recentvisits/controller/RecentVisitsController.kt | 2 +- .../org/mozilla/fenix/perf/ProfilerMarkerFactProcessor.kt | 2 +- .../main/java/org/mozilla/fenix/perf/StartupActivityLog.kt | 4 ++-- .../main/java/org/mozilla/fenix/perf/StartupPathProvider.kt | 4 ++-- .../main/java/org/mozilla/fenix/perf/StartupTypeTelemetry.kt | 4 ++-- .../main/java/org/mozilla/fenix/perf/StorageStatsMetrics.kt | 2 +- app/src/main/java/org/mozilla/fenix/perf/StrictModeManager.kt | 2 +- .../mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt | 2 +- app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 2 +- .../java/org/mozilla/gecko/search/SearchWidgetProvider.kt | 2 +- buildSrc/src/main/java/Dependencies.kt | 2 +- .../mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt | 2 +- 21 files changed, 24 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c23a12a92..6d8e1e2b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -560,6 +560,7 @@ dependencies { implementation Deps.mozilla_lib_dataprotect debugImplementation Deps.leakcanary + implementation Deps.androidx_annotation implementation Deps.androidx_compose_ui implementation Deps.androidx_compose_ui_tooling implementation Deps.androidx_compose_foundation diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index fc70fd044..6791c3bbd 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -25,7 +25,7 @@ import android.view.WindowManager.LayoutParams.FLAG_SECURE import androidx.annotation.CallSuper import androidx.annotation.IdRes import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PROTECTED +import androidx.annotation.VisibleForTesting.Companion.PROTECTED import androidx.appcompat.app.ActionBar import androidx.appcompat.widget.Toolbar import androidx.lifecycle.lifecycleScope diff --git a/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt b/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt index 5103bf20a..d8d04e1d8 100644 --- a/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt +++ b/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.components import android.content.Context import android.os.Build import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import mozilla.components.browser.storage.sync.PlacesBookmarksStorage diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index e1cf0ff2e..edcca2f93 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.components.toolbar import android.content.Context import androidx.annotation.ColorRes import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.core.content.ContextCompat.getColor import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope diff --git a/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt b/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt index a5cc5cb5f..0dce7cf83 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/SpannableString.kt @@ -11,7 +11,7 @@ import android.text.style.AbsoluteSizeSpan import android.text.style.ForegroundColorSpan import androidx.annotation.AttrRes import androidx.annotation.Dimension -import androidx.annotation.Dimension.DP +import androidx.annotation.Dimension.Companion.DP import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.util.dpToPx diff --git a/app/src/main/java/org/mozilla/fenix/ext/View.kt b/app/src/main/java/org/mozilla/fenix/ext/View.kt index feb645248..f8891e35f 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/View.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/View.kt @@ -12,7 +12,7 @@ import android.view.TouchDelegate import android.view.View import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.Dimension -import androidx.annotation.Dimension.DP +import androidx.annotation.Dimension.Companion.DP import androidx.annotation.VisibleForTesting import androidx.core.view.WindowInsetsCompat import mozilla.components.support.ktx.android.util.dpToPx diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenuBuilder.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenuBuilder.kt index efd819370..d964670b2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenuBuilder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenuBuilder.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.home import android.content.Context import android.view.View import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope diff --git a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt index 8e809191e..b2eb61dbf 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.home.recentbookmarks.controller import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.navigation.NavController import mozilla.appservices.places.BookmarkRoot import mozilla.components.concept.engine.EngineSession diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/controller/RecentTabController.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/controller/RecentTabController.kt index 3168dabd9..f344a81f0 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/controller/RecentTabController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/controller/RecentTabController.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.home.recenttabs.controller import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.navigation.NavController import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.tabs.TabsUseCases.SelectTabUseCase diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt index 338f2ac4c..b769db94f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/controller/RecentVisitsController.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.home.recentvisits.controller import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/app/src/main/java/org/mozilla/fenix/perf/ProfilerMarkerFactProcessor.kt b/app/src/main/java/org/mozilla/fenix/perf/ProfilerMarkerFactProcessor.kt index ce1b49e0a..e93e39c7c 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/ProfilerMarkerFactProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/ProfilerMarkerFactProcessor.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.perf import android.os.Handler import android.os.Looper import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import mozilla.components.concept.base.profiler.Profiler import mozilla.components.support.base.facts.Action import mozilla.components.support.base.facts.Fact diff --git a/app/src/main/java/org/mozilla/fenix/perf/StartupActivityLog.kt b/app/src/main/java/org/mozilla/fenix/perf/StartupActivityLog.kt index 73f0b078f..1f53b3e64 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StartupActivityLog.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StartupActivityLog.kt @@ -8,8 +8,8 @@ import android.app.Activity import android.app.Application import android.os.Bundle import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.NONE -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.NONE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner diff --git a/app/src/main/java/org/mozilla/fenix/perf/StartupPathProvider.kt b/app/src/main/java/org/mozilla/fenix/perf/StartupPathProvider.kt index 85ae4363b..1cd626306 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StartupPathProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StartupPathProvider.kt @@ -7,8 +7,8 @@ package org.mozilla.fenix.perf import android.app.Activity import android.content.Intent import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.NONE -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.NONE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/app/src/main/java/org/mozilla/fenix/perf/StartupTypeTelemetry.kt b/app/src/main/java/org/mozilla/fenix/perf/StartupTypeTelemetry.kt index ef87ecec0..4ebb7208a 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StartupTypeTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StartupTypeTelemetry.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.perf import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.NONE -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.NONE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/app/src/main/java/org/mozilla/fenix/perf/StorageStatsMetrics.kt b/app/src/main/java/org/mozilla/fenix/perf/StorageStatsMetrics.kt index 930ec5952..79d56eefe 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StorageStatsMetrics.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StorageStatsMetrics.kt @@ -10,7 +10,7 @@ import android.content.Context import android.os.Build import androidx.annotation.RequiresApi import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.annotation.WorkerThread import androidx.core.content.getSystemService import kotlinx.coroutines.DelicateCoroutinesApi diff --git a/app/src/main/java/org/mozilla/fenix/perf/StrictModeManager.kt b/app/src/main/java/org/mozilla/fenix/perf/StrictModeManager.kt index 1264e3b8f..470f90f0b 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StrictModeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StrictModeManager.kt @@ -14,7 +14,7 @@ import android.os.Handler import android.os.Looper import android.os.StrictMode import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import mozilla.components.support.ktx.android.os.resetAfter diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt index 656fa9fd3..637213c0d 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/PrivateBrowserTrayList.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.tabstray.browser import android.content.Context import android.util.AttributeSet import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PACKAGE_PRIVATE import org.mozilla.fenix.ext.components class PrivateBrowserTrayList @JvmOverloads constructor( diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 8a7d3f77c..675d626c0 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -13,7 +13,7 @@ import android.content.pm.ShortcutManager import android.os.Build import android.view.accessibility.AccessibilityManager import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import androidx.lifecycle.LifecycleOwner import mozilla.components.concept.engine.Engine.HttpsOnlyMode import mozilla.components.feature.sitepermissions.SitePermissionsRules diff --git a/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt b/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt index a2fb3843e..4656b04d5 100644 --- a/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt +++ b/app/src/main/java/org/mozilla/gecko/search/SearchWidgetProvider.kt @@ -17,7 +17,7 @@ import android.speech.RecognizerIntent import android.view.View import android.widget.RemoteViews import androidx.annotation.Dimension -import androidx.annotation.Dimension.DP +import androidx.annotation.Dimension.Companion.DP import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.drawable.toBitmap diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 328b1c4e7..1fa8457be 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -29,7 +29,7 @@ object Versions { const val androidx_constraint_layout = "2.0.4" const val androidx_preference = "1.1.1" const val androidx_legacy = "1.0.0" - const val androidx_annotation = "1.1.0" + const val androidx_annotation = "1.5.0" const val androidx_lifecycle = "2.5.1" const val androidx_fragment = "1.5.1" const val androidx_navigation = "2.5.1" diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt index abfaf8720..e700a6388 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.detektrules.perf import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE +import androidx.annotation.VisibleForTesting.Companion.PRIVATE import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Debt From adb9cfbb24ded739140b9290c2f0e226636da01a Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 26 Oct 2022 02:37:04 +0200 Subject: [PATCH 226/407] Import l10n. (#27546) --- app/src/main/res/values-kab/strings.xml | 49 ++++++++-------------- app/src/main/res/values-pa-rIN/strings.xml | 33 ++------------- app/src/main/res/values-pt-rPT/strings.xml | 31 +------------- 3 files changed, 22 insertions(+), 91 deletions(-) diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index b8316de02..20daebeca 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -133,13 +133,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Sken tqeffalt n meṛṛa accaren n melmi kan - - Anadi-inek•inem i \"%1$s\" - - - %d yismal Wali akk accaren yemtawan @@ -307,6 +300,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Accaren-ik·im mtawan! Kemmel seg wanda i tḥebseḍ ɣef yibenk-ik·im-nniḍen. + + Mdel + Ldi-t iccer amaynut %1$s @@ -491,12 +487,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Tegguma ad tbeddel tugna n ugilal Issin ugar - - Beddel tugna n ugilal s tira n ulugu n usebter agejdan n Firefox - - - Alogo Firefox - beddel agilal, taqeffalt Aklasik %s @@ -685,10 +675,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Tabdart Iẓiki - - Igrawen n unadi - - Ismal n yinagrawen i d-yittuɣalen lwaḥid Mdel iccaren @@ -843,19 +829,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ulac amazray dagi - - Yemtawi seg yibenk-nniḍen - - Seg yibenkan-nniḍen - - - Qqen akken ad twaliḍ azray yemtawan seg yibenkan-ik-nniḍen. - - Qqen - - - Neɣ fren amiḍan Firefox i beddu n umtawi]]> - Isadaren ttwakksen @@ -1084,6 +1057,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Bḍu + + Kles d PDF Azen ɣer yibenk @@ -1095,9 +1070,11 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ittwanɣel ɣeṛ tecfawt - Kcem akken ad tsemtawiḍ + Kcem akken ad tsemtawiḍ Qqen ɣer Sync + + Mtawi sakin sekles isefka Azen ɣer yibenkan meṛṛa @@ -1261,6 +1238,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ansuf ɣer %s! Ansuf ɣer internet ifazen + + D iminig i yettwafeṣṣlen i yimdanen, yerna baṭel. Mtawi Firefox gar yibenkan @@ -1955,4 +1934,12 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ddu ɣer yiɣewwaren Firefox Suggest + + + + fneẓ + + snefli + + Ldi aseɣwen i wakken ad tissineḍ ugar ɣef tefrant-a. diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index eb7d6b1a3..595e229c0 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -135,13 +135,6 @@ ਸਾਰੀਆਂ ਸੱਜਰੀਆਂ ਟੈਬਾਂ ਬਟਨ ਨੂੰ ਵੇਖਾਓ - - \"%1$s\" ਲਈ ਤੁਹਾਡੀ ਖੋਜ - - - %d ਸਾਈਟਾਂ ਸਾਰੀਆਂ ਸਿੰਕ ਕੀਤੀਆਂ ਟੈਬਾਂ ਵੇਖੋ। @@ -495,12 +488,6 @@ ਵਾਲਪੇਪਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ ਹੋਰ ਜਾਣੋ - - Firefox ਮੁੱਖ-ਸਫ਼ੇ ਲੋਗੋ ਨੂੰ ਛੂਹ ਕੇ ਵਾਲਪੇਪਰ ਬਦਲੋ - - - Firefox ਲੋਗੋ - ਵਾਲਪੇਪਰ ,ਬਟਨ ਬਦਲੋ ਕਲਾਸਿਕ %s @@ -692,10 +679,6 @@ ਸੂਚੀ ਗਰਿੱਡ - - ਗਰੁੱਪ ਲੱਭੋ - - ਮਿਲਦੀਆਂ ਸਾਈਟਾਂ ਨੂੰ ਇਕੱਠੀਆਂ ਕਰਕੇ ਗਰੁੱਪ ਬਣਾਓ ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕਰੋ @@ -847,18 +830,6 @@ ਇ਼ੱਥੇ ਕੋਈ ਅਤੀਤ ਨਹੀਂ ਹੈ - - ਹੋਰ ਡਿਵਾਈਸਾਂ ਤੋਂ ਸਿੰਕ ਕੀਤੇ - - ਹੋਰ ਡਿਵਾਈਸਾਂ ਤੋਂ - - - ਆਪਣੇ ਹੋਰ ਡਿਵਾਈਸਾਂ ਤੋਂ ਸਿੰਕ ਕੀਤੀ ਅਤੀਤ ਵੇਖਣ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ। - - ਸਾਇਨ ਇਨ - - ਜਾਂ ਸਿੰਕ ਕਰਨ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ Firefox ਖਾਤਾ ਬਣਾਓ]]> - ਡਾਊਨਲੋਡ ਹਟਾਏ ਗਏ @@ -1099,9 +1070,11 @@ ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਕੀਤਾ - ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ + ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ ਸਿੰਕ ਕਰਨ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ + + ਡਾਟਾ ਸਿੰਕ ਕਰੋ ਤੇ ਸੰਭਾਲੋ ਸਾਰੇ ਡਿਵਾਈਸਾਂ ‘ਤੇ ਭੇਜੋ diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 0d7cbf4cd..d8c22a7d5 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -131,13 +131,6 @@ Mostrar botão todos os separadores recentes - - A sua pesquisa por \"%1$s\" - - - %d sites Ver todos os separadores sincronizados @@ -486,12 +479,6 @@ Não foi possível alterar o fundo Saber mais - - Altere o fundo ao tocar no logótipo da página principal do Firefox - - - Logótipo do Firefox - altere o fundo, botão %s clássico @@ -680,10 +667,6 @@ Lista Grelha - - Pesquisar grupos - - Agrupar sites relacionados Fechar separadores @@ -833,18 +816,6 @@ Sem histórico - - Sincronizado de outros dispositivos - - De outros dispositivos - - - Inicie sessão para ver o histórico sincronizado dos seus outros dispositivos. - - Iniciar sessão - - Ou crie uma conta Firefox para iniciar a sincronização]]> - Transferências removidas @@ -1517,7 +1488,7 @@ Nunca guardar - Auto-preenchimento em %1$s + Autopreenchimento do %1$s Preencher e guardar nomes de utilizador e palavras-passe em site ao utilizar o %1$s. From 489548b0de46141449b87bd118879dfb8b85a87f Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 23 Sep 2022 12:12:43 -0400 Subject: [PATCH 227/407] For #11404 - Add 'Open all' options in bookmarks * Add "Open all in new tabs" options in bookmarks * Add "Open all in private tabs" options in bookmarks * Add metrics tracking if the usage of "Open all in..." in bookmarks Co-authored-by: Pg --- app/metrics.yaml | 32 ++++++ .../org/mozilla/fenix/ui/BookmarksTest.kt | 77 +++++++++++++ .../mozilla/fenix/ui/robots/BookmarksRobot.kt | 11 +- .../mozilla/fenix/ui/robots/BrowserRobot.kt | 11 +- .../mozilla/fenix/ui/robots/TabDrawerRobot.kt | 10 ++ .../ui/robots/ThreeDotMenuBookmarksRobot.kt | 18 +++ .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 8 ++ .../library/bookmarks/BookmarkController.kt | 58 +++++++++- .../library/bookmarks/BookmarkFragment.kt | 26 ++++- .../bookmarks/BookmarkFragmentInteractor.kt | 10 ++ .../library/bookmarks/BookmarkItemMenu.kt | 33 +++++- .../fenix/library/bookmarks/BookmarkView.kt | 14 +++ .../viewholders/BookmarkNodeViewHolder.kt | 10 +- app/src/main/res/values/strings.xml | 15 +++ .../bookmarks/BookmarkControllerTest.kt | 103 +++++++++++++++++- .../BookmarkFragmentInteractorTest.kt | 48 ++++++++ .../library/bookmarks/BookmarkItemMenuTest.kt | 79 +++++++++++--- detekt-baseline.xml | 2 +- 18 files changed, 536 insertions(+), 29 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index 3995b1cb4..d3757f7e2 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -2479,6 +2479,22 @@ bookmarks_management: metadata: tags: - Bookmarks + open_all_in_new_tabs: + type: event + description: | + A user opened all the bookmarks in a folder in new tabs. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11404 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27138 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 120 + metadata: + tags: + - Bookmarks open_in_private_tab: type: event description: | @@ -2523,6 +2539,22 @@ bookmarks_management: metadata: tags: - Bookmarks + open_all_in_private_tabs: + type: event + description: | + A user opened all the bookmarks in a folder in new private tabs. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11404 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27138 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: 120 + metadata: + tags: + - Bookmarks edited: type: event description: | diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 8b704f95e..80a966e83 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -260,6 +260,83 @@ class BookmarksTest { } } + @Test + fun openAllInTabsTest() { + val webPages = listOf( + TestAssetHelper.getGenericAsset(mockWebServer, 1), + TestAssetHelper.getGenericAsset(mockWebServer, 2), + TestAssetHelper.getGenericAsset(mockWebServer, 3), + TestAssetHelper.getGenericAsset(mockWebServer, 4), + ) + + homeScreen { + }.openThreeDotMenu { + }.openBookmarks { + createFolder("root") + createFolder("sub", "root") + createFolder("empty", "root") + }.closeMenu { + } + + browserScreen { + createBookmark(webPages[0].url) + createBookmark(webPages[1].url, "root") + createBookmark(webPages[2].url, "root") + createBookmark(webPages[3].url, "sub") + }.openTabDrawer { + closeTab() + } + + browserScreen { + }.openThreeDotMenu { + }.openBookmarks { + }.openThreeDotMenu("root") { + }.clickOpenAllInTabs { + verifyTabTrayIsOpened() + verifyNormalModeSelected() + + verifyExistingOpenTabs("Test_Page_2", "Test_Page_3", "Test_Page_4") + + // Bookmark that is not under the root folder should not be opened + verifyNoExistingOpenTabs("Test_Page_1") + } + } + + @Test + fun openAllInPrivateTabsTest() { + val webPages = listOf( + TestAssetHelper.getGenericAsset(mockWebServer, 1), + TestAssetHelper.getGenericAsset(mockWebServer, 2), + ) + + homeScreen { + }.openThreeDotMenu { + }.openBookmarks { + createFolder("root") + createFolder("sub", "root") + createFolder("empty", "root") + }.closeMenu { + } + + browserScreen { + createBookmark(webPages[0].url, "root") + createBookmark(webPages[1].url, "sub") + }.openTabDrawer { + closeTab() + } + + browserScreen { + }.openThreeDotMenu { + }.openBookmarks { + }.openThreeDotMenu("root") { + }.clickOpenAllInPrivateTabs { + verifyTabTrayIsOpened() + verifyPrivateModeSelected() + + verifyExistingOpenTabs("Test_Page_1", "Test_Page_2") + } + } + @Test fun openBookmarkInPrivateTabTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 2ea293c60..27e3b1fb4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -150,12 +150,21 @@ class BookmarksRobot { .click() } - fun createFolder(name: String) { + fun createFolder(name: String, parent: String? = null) { clickAddFolderButton() addNewFolderName(name) + if (!parent.isNullOrBlank()) { + setParentFolder(parent) + } saveNewFolder() } + fun setParentFolder(parentName: String) { + clickParentFolderSelector() + selectFolder(parentName) + navigateUp() + } + fun clickAddFolderButton() { mDevice.waitNotNull( Until.findObject(By.desc("Add folder")), diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index fb5ed4a10..7a5d4341e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -340,13 +340,20 @@ class BrowserRobot { menuSaveImage.click() } - fun createBookmark(url: Uri) { + fun createBookmark(url: Uri, folder: String? = null) { navigationToolbar { }.enterURLAndEnterToBrowser(url) { // needs to wait for the right url to load before saving a bookmark verifyUrl(url.toString()) }.openThreeDotMenu { - }.bookmarkPage { } + }.bookmarkPage { + }.takeIf { !folder.isNullOrBlank() }?.let { + it.openThreeDotMenu { + }.editBookmarkPage { + setParentFolder(folder!!) + saveEditBookmark() + } + } } fun clickLinkMatchingText(expectedText: String) = diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index 6f55f6bb6..c0488b4c9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -33,6 +33,7 @@ import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until.findObject import com.google.android.material.bottomsheet.BottomSheetBehavior import junit.framework.AssertionFailedError +import junit.framework.TestCase.assertFalse import junit.framework.TestCase.assertTrue import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.anyOf @@ -78,6 +79,7 @@ class TabDrawerRobot { assertSyncedTabsButtonIsSelected(isSelected) fun verifyExistingOpenTabs(vararg titles: String) = assertExistingOpenTabs(*titles) + fun verifyNoExistingOpenTabs(vararg titles: String) = assertNoExistingOpenTabs(*titles) fun verifyCloseTabsButton(title: String) = assertCloseTabsButton(title) fun verifyExistingTabList() = assertExistingTabList() @@ -490,6 +492,14 @@ private fun assertExistingOpenTabs(vararg tabTitles: String) { } } +private fun assertNoExistingOpenTabs(vararg tabTitles: String) { + for (title in tabTitles) { + assertFalse( + tabItem(title).waitForExists(waitingTimeLong), + ) + } +} + private fun assertExistingTabList() { mDevice.findObject( UiSelector().resourceId("$packageName:id/tabsTray"), diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt index 2c13ba626..035aa87ff 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuBookmarksRobot.kt @@ -52,6 +52,20 @@ class ThreeDotMenuBookmarksRobot { return TabDrawerRobot.Transition() } + fun clickOpenAllInTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { + openAllInTabsButton().click() + + TabDrawerRobot().interact() + return TabDrawerRobot.Transition() + } + + fun clickOpenAllInPrivateTabs(interact: TabDrawerRobot.() -> Unit): TabDrawerRobot.Transition { + openAllInPrivateTabsButton().click() + + TabDrawerRobot().interact() + return TabDrawerRobot.Transition() + } + fun clickDelete(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { deleteButton().click() @@ -71,4 +85,8 @@ private fun openInNewTabButton() = onView(withText("Open in new tab")) private fun openInPrivateTabButton() = onView(withText("Open in private tab")) +private fun openAllInTabsButton() = onView(withText("Open all in new tabs")) + +private fun openAllInPrivateTabsButton() = onView(withText("Open all in private tabs")) + private fun deleteButton() = onView(withText("Delete")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 008d46869..1e5f6f114 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -207,6 +207,14 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } + fun editBookmarkPage(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) + editBookmarkButton().click() + + BookmarksRobot().interact() + return BookmarksRobot.Transition() + } + fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) helpButton().click() diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index 4f96e26ac..c3da16fb7 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.library.bookmarks import android.content.ClipData import android.content.ClipboardManager import android.content.res.Resources +import androidx.annotation.VisibleForTesting import androidx.navigation.NavController import androidx.navigation.NavDirections import kotlinx.coroutines.CoroutineScope @@ -15,6 +16,7 @@ import mozilla.appservices.places.BookmarkRoot import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.storage.BookmarkNode +import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.service.fxa.sync.SyncReason import org.mozilla.fenix.BrowserDirection @@ -27,6 +29,9 @@ import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.navigateSafe import org.mozilla.fenix.utils.Settings +@VisibleForTesting +internal const val WARN_OPEN_ALL_SIZE = 15 + /** * [BookmarkFragment] controller. * Delegated by View Interactors, handles container business logic and operates changes on it. @@ -44,6 +49,7 @@ interface BookmarkController { fun handleCopyUrl(item: BookmarkNode) fun handleBookmarkSharing(item: BookmarkNode) fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) + fun handleOpeningFolderBookmarks(folder: BookmarkNode, mode: BrowsingMode) /** * Handle bookmark nodes deletion @@ -73,11 +79,12 @@ class DefaultBookmarkController( private val store: BookmarkFragmentStore, private val sharedViewModel: BookmarksSharedViewModel, private val tabsUseCases: TabsUseCases?, - private val loadBookmarkNode: suspend (String) -> BookmarkNode?, + private val loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode?, private val showSnackbar: (String) -> Unit, private val deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit, private val deleteBookmarkFolder: (Set) -> Unit, private val showTabTray: () -> Unit, + private val warnLargeOpenAll: (Int, () -> Unit) -> Unit, private val settings: Settings, ) : BookmarkController { @@ -105,7 +112,7 @@ class DefaultBookmarkController( override fun handleBookmarkExpand(folder: BookmarkNode) { handleAllBookmarksDeselected() scope.launch { - val node = loadBookmarkNode.invoke(folder.guid) ?: return@launch + val node = loadBookmarkNode.invoke(folder.guid, false) ?: return@launch sharedViewModel.selectedFolder = node store.dispatch(BookmarkFragmentAction.Change(node)) } @@ -158,6 +165,53 @@ class DefaultBookmarkController( showTabTray() } + private fun extractURLsFromTree(node: BookmarkNode): MutableList { + val urls = mutableListOf() + + when (node.type) { + BookmarkNodeType.FOLDER -> { + node.children?.forEach { + urls.addAll(extractURLsFromTree(it)) + } + } + BookmarkNodeType.ITEM -> { + node.url?.let { urls.add(it) } + } + BookmarkNodeType.SEPARATOR -> {} + } + + return urls + } + + override fun handleOpeningFolderBookmarks(folder: BookmarkNode, mode: BrowsingMode) { + scope.launch { + val tree = loadBookmarkNode.invoke(folder.guid, true) ?: return@launch + val urls = extractURLsFromTree(tree) + + val openAll = { load: Boolean -> + for (url in urls) { + tabsUseCases?.addTab?.invoke( + url, + private = (mode == BrowsingMode.Private), + startLoading = load, + ) + } + activity.browsingModeManager.mode = + BrowsingMode.fromBoolean(mode == BrowsingMode.Private) + showTabTray() + } + + // Warn user if more than maximum number of bookmarks are being opened + if (urls.size >= WARN_OPEN_ALL_SIZE) { + warnLargeOpenAll(urls.size) { + openAll(false) + } + } else { + openAll(true) + } + } + } + override fun handleBookmarkDeletion(nodes: Set, removeType: BookmarkRemoveType) { deleteBookmarkNodes(nodes, removeType) } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 5eb7f3898..1f9ff22ce 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -106,6 +106,7 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan deleteBookmarkNodes = ::deleteMulti, deleteBookmarkFolder = ::showRemoveFolderDialog, showTabTray = ::showTabTray, + warnLargeOpenAll = ::warnLargeOpenAll, settings = requireComponents.settings, ), ) @@ -272,11 +273,11 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan return bookmarkView.onBackPressed() } - private suspend fun loadBookmarkNode(guid: String): BookmarkNode? = withContext(IO) { + private suspend fun loadBookmarkNode(guid: String, recursive: Boolean = false): BookmarkNode? = withContext(IO) { // Only runs if the fragment is attached same as [runIfFragmentIsAttached] context?.let { requireContext().bookmarkStorage - .getTree(guid, false) + .getTree(guid, recursive) ?.let { desktopFolders.withOptionalDesktopFolders(it) } } } @@ -293,6 +294,27 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan } } + private fun warnLargeOpenAll(numberOfTabs: Int, function: () -> (Unit)) { + AlertDialog.Builder(requireContext()).apply { + setTitle(String.format(context.getString(R.string.open_all_warning_title), numberOfTabs)) + setMessage(context.getString(R.string.open_all_warning_message, context.getString(R.string.app_name))) + setPositiveButton( + R.string.open_all_warning_confirm, + ) { dialog, _ -> + function() + dialog.dismiss() + } + setNegativeButton( + R.string.open_all_warning_cancel, + ) { dialog: DialogInterface, _ -> + dialog.dismiss() + } + setCancelable(false) + create() + show() + } + } + private fun deleteMulti( selected: Set, eventType: BookmarkRemoveType = BookmarkRemoveType.MULTIPLE, diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 4fec702ac..a0da5d34d 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -80,6 +80,16 @@ class BookmarkFragmentInteractor( } } + override fun onOpenAllInNewTabs(folder: BookmarkNode) { + require(folder.type == BookmarkNodeType.FOLDER) + bookmarksController.handleOpeningFolderBookmarks(folder, BrowsingMode.Normal) + } + + override fun onOpenAllInPrivateTabs(folder: BookmarkNode) { + require(folder.type == BookmarkNodeType.FOLDER) + bookmarksController.handleOpeningFolderBookmarks(folder, BrowsingMode.Private) + } + override fun onDelete(nodes: Set) { if (nodes.find { it.type == BookmarkNodeType.SEPARATOR } != null) { throw IllegalStateException("Cannot delete separators") diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index e437490ca..533f1878c 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -13,6 +13,7 @@ import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import org.mozilla.fenix.R +import org.mozilla.fenix.ext.bookmarkStorage class BookmarkItemMenu( private val context: Context, @@ -25,6 +26,8 @@ class BookmarkItemMenu( Share, OpenInNewTab, OpenInPrivateTab, + OpenAllInNewTabs, + OpenAllInPrivateTabs, Delete, ; } @@ -32,7 +35,10 @@ class BookmarkItemMenu( val menuController: MenuController by lazy { BrowserMenuController() } @VisibleForTesting - internal fun menuItems(itemType: BookmarkNodeType): List { + @SuppressWarnings("LongMethod") + internal suspend fun menuItems(itemType: BookmarkNodeType, itemId: String): List { + val hasAtLeastOneChild = !context.bookmarkStorage.getTree(itemId)?.children.isNullOrEmpty() + return listOfNotNull( if (itemType != BookmarkNodeType.SEPARATOR) { TextMenuCandidate( @@ -79,6 +85,24 @@ class BookmarkItemMenu( } else { null }, + if (hasAtLeastOneChild && itemType == BookmarkNodeType.FOLDER) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_open_all_in_tabs_button), + ) { + onItemTapped.invoke(Item.OpenAllInNewTabs) + } + } else { + null + }, + if (hasAtLeastOneChild && itemType == BookmarkNodeType.FOLDER) { + TextMenuCandidate( + text = context.getString(R.string.bookmark_menu_open_all_in_private_tabs_button), + ) { + onItemTapped.invoke(Item.OpenAllInPrivateTabs) + } + } else { + null + }, TextMenuCandidate( text = context.getString(R.string.bookmark_menu_delete_button), textStyle = TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), @@ -88,7 +112,10 @@ class BookmarkItemMenu( ) } - fun updateMenu(itemType: BookmarkNodeType) { - menuController.submitList(menuItems(itemType)) + /** + * Update the menu items for the type of bookmark. + */ + suspend fun updateMenu(itemType: BookmarkNodeType, itemId: String) { + menuController.submitList(menuItems(itemType, itemId)) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index b6cbcf292..5c5c018ae 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -79,6 +79,20 @@ interface BookmarkViewInteractor : SelectionInteractor { */ fun onOpenInPrivateTab(item: BookmarkNode) + /** + * Opens all bookmark items in new tabs. + * + * @param folder the bookmark folder containing all items to open in new tabs + */ + fun onOpenAllInNewTabs(folder: BookmarkNode) + + /** + * Opens all bookmark items in new private tabs. + * + * @param folder the bookmark folder containing all items to open in new private tabs + */ + fun onOpenAllInPrivateTabs(folder: BookmarkNode) + /** * Deletes a set of bookmark nodes. * diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index dc1d8c8b9..e071ae6f4 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -6,6 +6,9 @@ package org.mozilla.fenix.library.bookmarks.viewholders import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.mozilla.fenix.R @@ -42,6 +45,8 @@ class BookmarkNodeViewHolder( BookmarkItemMenu.Item.Share -> interactor.onSharePressed(item) BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item) BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item) + BookmarkItemMenu.Item.OpenAllInNewTabs -> interactor.onOpenAllInNewTabs(item) + BookmarkItemMenu.Item.OpenAllInPrivateTabs -> interactor.onOpenAllInPrivateTabs(item) BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item)) } } @@ -58,7 +63,10 @@ class BookmarkNodeViewHolder( containerView.urlView.isVisible = item.type == BookmarkNodeType.ITEM containerView.setSelectionInteractor(item, mode, interactor) - menu.updateMenu(item.type) + + CoroutineScope(Dispatchers.Default).launch { + menu.updateMenu(item.type, item.guid) + } // Hide menu button if this item is a root folder or is selected if (item.type == BookmarkNodeType.FOLDER && item.inRoots()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df656d452..2ade8fc1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -615,6 +615,17 @@ Close + + Open %d tabs? + + Opening this many tabs may slow down %s while the pages are loading. Are you sure you want to continue? + + Open tabs + + Cancel + %d site @@ -837,6 +848,10 @@ Open in new tab Open in private tab + + Open all in new tabs + + Open all in private tabs Delete diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index 510389f5f..dc81cbf2f 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -17,9 +17,11 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk +import io.mockk.mockkConstructor import io.mockk.runs import io.mockk.slot import io.mockk.spyk +import io.mockk.unmockkConstructor import io.mockk.verify import io.mockk.verifyOrder import mozilla.appservices.places.BookmarkRoot @@ -87,6 +89,16 @@ class BookmarkControllerTest { 0, listOf(item, item, childItem, subfolder), ) + private val largeTree = BookmarkNode( + BookmarkNodeType.FOLDER, + "123", + null, + 0u, + "Mobile", + null, + 0, + List(WARN_OPEN_ALL_SIZE) { item }, + ) private val root = BookmarkNode( BookmarkNodeType.FOLDER, BookmarkRoot.Root.id, @@ -193,7 +205,7 @@ class BookmarkControllerTest { fun `handleBookmarkExpand should refresh and change the active bookmark node`() = runTestOnMain { var loadBookmarkNodeInvoked = false createController( - loadBookmarkNode = { + loadBookmarkNode = { _: String, _: Boolean -> loadBookmarkNodeInvoked = true tree }, @@ -358,6 +370,91 @@ class BookmarkControllerTest { } } + @Test + fun `WHEN handle opening folder bookmarks THEN all bookmarks in folder is opened in normal tabs`() { + var showTabTrayInvoked = false + createController( + showTabTray = { + showTabTrayInvoked = true + }, + loadBookmarkNode = { guid: String, _: Boolean -> + fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { + if (item.guid == guid) { + return item + } else { + item.children?.iterator()?.forEach { + val res = recurseFind(it, guid) + if (res != null) { + return res + } + } + return null + } + } + recurseFind(tree, guid) + }, + ).handleOpeningFolderBookmarks(tree, BrowsingMode.Normal) + + assertTrue(showTabTrayInvoked) + verifyOrder { + addNewTabUseCase.invoke(item.url!!, private = false) + addNewTabUseCase.invoke(item.url!!, private = false) + addNewTabUseCase.invoke(childItem.url!!, private = false) + homeActivity.browsingModeManager.mode = BrowsingMode.Normal + } + } + + @Test + fun `WHEN handle opening folder bookmarks in private tabs THEN all bookmarks in folder is opened in private tabs`() { + var showTabTrayInvoked = false + createController( + showTabTray = { + showTabTrayInvoked = true + }, + loadBookmarkNode = { guid: String, _: Boolean -> + fun recurseFind(item: BookmarkNode, guid: String): BookmarkNode? { + if (item.guid == guid) { + return item + } else { + item.children?.iterator()?.forEach { + val res = recurseFind(it, guid) + if (res != null) { + return res + } + } + return null + } + } + recurseFind(tree, guid) + }, + ).handleOpeningFolderBookmarks(tree, BrowsingMode.Private) + + assertTrue(showTabTrayInvoked) + verifyOrder { + addNewTabUseCase.invoke(item.url!!, private = true) + addNewTabUseCase.invoke(item.url!!, private = true) + addNewTabUseCase.invoke(childItem.url!!, private = true) + homeActivity.browsingModeManager.mode = BrowsingMode.Private + } + } + + @Test + fun `WHEN handle opening folder bookmarks with more than max items THEN warning is invoked`() { + var warningInvoked = false + + mockkConstructor(DefaultBookmarkController::class) + createController( + loadBookmarkNode = { _: String, _: Boolean -> + largeTree + }, + warnLargeOpenAll = { _: Int, _: () -> Unit -> warningInvoked = true }, + ).handleOpeningFolderBookmarks(tree, BrowsingMode.Normal) + + unmockkConstructor(DefaultBookmarkController::class) + + assertTrue(warningInvoked) + } + @Test fun `handleBookmarkDeletion for an item should properly call a passed in delegate`() { var deleteBookmarkNodesInvoked = false @@ -426,11 +523,12 @@ class BookmarkControllerTest { @Suppress("LongParameterList") private fun createController( - loadBookmarkNode: suspend (String) -> BookmarkNode? = { _ -> null }, + loadBookmarkNode: suspend (String, Boolean) -> BookmarkNode? = { _, _ -> null }, showSnackbar: (String) -> Unit = { _ -> }, deleteBookmarkNodes: (Set, BookmarkRemoveType) -> Unit = { _, _ -> }, deleteBookmarkFolder: (Set) -> Unit = { _ -> }, showTabTray: () -> Unit = { }, + warnLargeOpenAll: (Int, () -> Unit) -> Unit = { _: Int, _: () -> Unit -> }, ): BookmarkController { return DefaultBookmarkController( activity = homeActivity, @@ -445,6 +543,7 @@ class BookmarkControllerTest { deleteBookmarkNodes = deleteBookmarkNodes, deleteBookmarkFolder = deleteBookmarkFolder, showTabTray = showTabTray, + warnLargeOpenAll = warnLargeOpenAll, settings = settings, ) } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index a11357e9e..8593cad3c 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -140,6 +140,11 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.copied.testGetValue()!!.single().extra) } + @Test(expected = IllegalArgumentException::class) + fun `WHEN copying bookmark with folder THEN illegal argument exception is thrown`() { + interactor.onCopyPressed(tree) + } + @Test fun `share a bookmark item`() { interactor.onSharePressed(item) @@ -150,6 +155,11 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.shared.testGetValue()!!.single().extra) } + @Test(expected = IllegalArgumentException::class) + fun `WHEN sharing bookmark with folder THEN illegal argument exception is thrown`() { + interactor.onSharePressed(tree) + } + @Test fun `open a bookmark item in a new tab`() { interactor.onOpenInNormalTab(item) @@ -160,6 +170,11 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.openInNewTab.testGetValue()!!.single().extra) } + @Test(expected = IllegalArgumentException::class) + fun `WHEN open bookmark with folder THEN illegal argument exception is thrown`() { + interactor.onOpenInNormalTab(tree) + } + @Test fun `open a bookmark item in a private tab`() { interactor.onOpenInPrivateTab(item) @@ -170,6 +185,39 @@ class BookmarkFragmentInteractorTest { assertNull(BookmarksManagement.openInPrivateTab.testGetValue()!!.single().extra) } + @Test(expected = IllegalArgumentException::class) + fun `WHEN open bookmark in private with folder THEN illegal argument exception is thrown`() { + interactor.onOpenInPrivateTab(tree) + } + + @Test + fun `WHEN open all bookmarks THEN call handle opening folder bookmarks`() { + interactor.onOpenAllInNewTabs(tree) + + verify { + bookmarkController.handleOpeningFolderBookmarks(tree, BrowsingMode.Normal) + } + } + + @Test(expected = IllegalArgumentException::class) + fun `WHEN open all bookmarks with single item THEN illegal argument exception is thrown`() { + interactor.onOpenAllInNewTabs(item) + } + + @Test + fun `WHEN open all bookmarks in private tabs THEN call handle opening folder bookmarks with private mode`() { + interactor.onOpenAllInPrivateTabs(tree) + + verify { + bookmarkController.handleOpeningFolderBookmarks(tree, BrowsingMode.Private) + } + } + + @Test(expected = IllegalArgumentException::class) + fun `WHEN open all bookmarks in private with single item THEN illegal argument exception is thrown`() { + interactor.onOpenAllInPrivateTabs(item) + } + @Test fun `delete a bookmark item`() { interactor.onDelete(setOf(item)) diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index f251132bf..f16d3cef4 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -6,15 +6,23 @@ package org.mozilla.fenix.library.bookmarks import android.content.Context import androidx.appcompat.view.ContextThemeWrapper +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import kotlinx.coroutines.runBlocking +import mozilla.components.concept.menu.candidate.TextMenuCandidate import mozilla.components.concept.menu.candidate.TextStyle import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R +import org.mozilla.fenix.ext.bookmarkStorage import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu.Item @@ -34,37 +42,78 @@ class BookmarkItemMenuTest { } @Test - fun `delete item has special styling`() { - val deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR).last() - assertEquals("Delete", deleteItem.text) + fun `delete item has special styling`() = runBlocking { + var deleteItem: TextMenuCandidate? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + deleteItem = menu.menuItems(BookmarkNodeType.SEPARATOR, "").last() + } + assertNotNull(deleteItem) + assertEquals("Delete", deleteItem!!.text) assertEquals( TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), - deleteItem.textStyle, + deleteItem!!.textStyle, ) - deleteItem.onClick() + deleteItem!!.onClick() assertEquals(Item.Delete, lastItemTapped) } @Test - fun `edit item appears for folders`() { - val folderItems = menu.menuItems(BookmarkNodeType.FOLDER) - assertEquals(2, folderItems.size) - val (edit, delete) = folderItems + fun `edit item appears for folders`() = runBlocking { + // empty folder + var emptyFolderItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + emptyFolderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") + } + assertNotNull(emptyFolderItems) + assertEquals(2, emptyFolderItems!!.size) + + // not empty + var folderItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + coEvery { any().bookmarkStorage.getTree("")?.children } returns listOf(mockk(relaxed = true)) + + folderItems = menu.menuItems(BookmarkNodeType.FOLDER, "") + } + assertNotNull(folderItems) + assertEquals(4, folderItems!!.size) + + val (edit, openAll, openAllPrivate, delete) = folderItems!! assertEquals("Edit", edit.text) - edit.onClick() + assertEquals("Open all in new tabs", openAll.text) + assertEquals("Open all in private tabs", openAllPrivate.text) + assertEquals("Delete", delete.text) + edit.onClick() assertEquals(Item.Edit, lastItemTapped) - assertEquals("Delete", delete.text) + + openAll.onClick() + assertEquals(Item.OpenAllInNewTabs, lastItemTapped) + + openAllPrivate.onClick() + assertEquals(Item.OpenAllInPrivateTabs, lastItemTapped) + + delete.onClick() + assertEquals(Item.Delete, lastItemTapped) } @Test - fun `all item appears for sites`() { - val siteItems = menu.menuItems(BookmarkNodeType.ITEM) - assertEquals(6, siteItems.size) - val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems + fun `all item appears for sites`() = runBlocking { + var siteItems: List? = null + mockkStatic("org.mozilla.fenix.ext.BookmarkNodeKt") { + every { any().bookmarkStorage } returns mockk(relaxed = true) + + siteItems = menu.menuItems(BookmarkNodeType.ITEM, "") + } + assertNotNull(siteItems) + assertEquals(6, siteItems!!.size) + val (edit, copy, share, openInNewTab, openInPrivateTab, delete) = siteItems!! assertEquals("Edit", edit.text) assertEquals("Copy", copy.text) diff --git a/detekt-baseline.xml b/detekt-baseline.xml index 41a921e1e..82d166a5f 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -543,11 +543,11 @@ UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleBookmarkTapped(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleCopyUrl(item: BookmarkNode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleOpeningBookmark(item: BookmarkNode, mode: BrowsingMode) + UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleOpeningFolderBookmarks(folder: BookmarkNode, mode: BrowsingMode) UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleRequestSync() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSearch() UndocumentedPublicFunction:BookmarkController.kt$BookmarkController$fun handleSelectionModeSwitch() UndocumentedPublicFunction:BookmarkFragmentStore.kt$operator fun BookmarkNode.contains(item: BookmarkNode): Boolean - UndocumentedPublicFunction:BookmarkItemMenu.kt$BookmarkItemMenu$fun updateMenu(itemType: BookmarkNodeType) UndocumentedPublicFunction:BookmarkNodeViewHolder.kt$BookmarkNodeViewHolder$fun bind( item: BookmarkNode, mode: BookmarkFragmentState.Mode, payload: BookmarkPayload, ) UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleEditingCancelled() UndocumentedPublicFunction:BookmarkSearchController.kt$BookmarkSearchController$fun handleTextChanged(text: String) From e9387e50d478a280a45d8e6b0728418d6fd6c5fe Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 26 Oct 2022 18:32:14 +0200 Subject: [PATCH 228/407] Import l10n. (#27553) --- app/src/main/res/values-hy-rAM/strings.xml | 33 ++------------------ app/src/main/res/values-ja/strings.xml | 35 +++------------------- app/src/main/res/values-oc/strings.xml | 33 ++------------------ 3 files changed, 10 insertions(+), 91 deletions(-) diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index b3425f5a7..4f32aee0a 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -129,13 +129,6 @@ Ցուցադրել բոլոր վերջին ներդիրների կոճակները - - Ձեր որոնումը \"%1$s\"-ի համար - - - %d կայքեր Դիտեք բոլոր համաժամացված ներդիրները @@ -484,12 +477,6 @@ Չհաջողվեց փոխել պաստառը Իմանալ ավելին - - Փոխեք պաստառը՝ կտտացնելով Firefox-ի գլխավոր էջի պատկերանշանին - - - Firefox լոգոն` փոխել պաստառը, կոճակը Դասական %s @@ -675,10 +662,6 @@ Ցանկ Ցանց - - Որոնել խմբեր - - Խմբավորել առնչվող կայքերը միասին Փակել ներդիրները @@ -828,18 +811,6 @@ Այստեղ պատմություն չկա - - Համաժամեցված այլ սարքից - - Այլ սարքերից - - - Մուտք գործե՛ք՝ տեսնելու Ձեր այլ սարքերից համաժամեցված պատմությունը: - - Մուտք գործել - - Կամ ստեղծեք Firefox հաշիվ՝ համաժամացումը սկսելու համար]]> - Ներբեռնումները հեռացված են @@ -1082,9 +1053,11 @@ Պատճենվել է սեղմատախտակին - Մուտք գործեք՝ համաժամեցնելու համար + Մուտք գործեք՝ համաժամեցնելու համար Մուտք գործել Համաժամեցում + + Համաժամեցնել և պահել տվյալները Ուղարկել բոլոր սարքերին diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 17a731cf4..bc0024804 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -68,7 +68,7 @@ プライベートタブを開くショートカットをホーム画面に追加します。 - ショートカットを追加 + 追加する 追加しない @@ -135,13 +135,6 @@ 最近のタブをすべて表示するボタンです - - \"%1$s\" についての検索 - - - %d サイト 同期したタブをすべて見る @@ -494,12 +487,6 @@ 壁紙を変更できませんでした 詳細情報 - - Firefox ホームページのロゴをタップして壁紙を変更する - - - Firefox ロゴ - 壁紙変更ボタンです %s の定番 @@ -687,10 +674,6 @@ リスト グリッド - - タブグループを検索 - - 関連サイトをグループ化します タブを閉じる期間 @@ -844,18 +827,6 @@ 履歴はありません - - 他の端末から同期 - - 他の端末から - - - 他の端末と同期した履歴を表示するにはログインしてください。 - - ログイン - - または Firefox アカウントを作成して同期を開始します]]> - ダウンロード履歴を削除しました @@ -1100,9 +1071,11 @@ クリップボードにコピーしました - ログインして同期 + ログインして同期 Sync にログイン + + 同期してデータを保存 すべての端末へ送信 diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 1566e6e4b..b810156bc 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -130,13 +130,6 @@ Afichar lo boton dels onglets recents - - Vòstre recèrca per \« %1$s \ » - - - %d sites Veire totes los onglets sincronizats @@ -490,12 +483,6 @@ Cambiament impossible del papièr pintrat Ne saber mai - - Cambiar lo fons d’ecran en tocant lo logotipe de Firefox de la pagina iniciala - - - Logotipe Firefox - cambiar lo fons d’ecran, boton %s classic @@ -686,10 +673,6 @@ Lista Grasilha - - Cercar en grops - - Agropar los sites ligats Tampar los onglets @@ -844,18 +827,6 @@ Cap d’istoric - - Sincronizat a partir d’autres periferics - - A partir d’autres periferics - - - Connectatz-vos per consultar l’istoric sincronizat a partir de vòstres autres aparelhs. - - Se connectar - - O crear un compte Firefox per lançar la sincronizacion]]> - Telecargament suprimits @@ -1101,9 +1072,11 @@ Copiat dins lo quichapapièrs - Se connectar per sincronizar + Se connectar per sincronizar Se connectar a Sync + + Sincronizar e enregistrar las donadas Enviar a totes los periferics From 374bff84c41d6aac6bb05d2645dcc11dca55834d Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 26 Oct 2022 15:02:16 +0000 Subject: [PATCH 229/407] Update to Android-Components 108.0.20221026143138. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 7f0c31cba..ee6b3919c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221025143110" + const val VERSION = "108.0.20221026143138" } From f4e7471aead52bbb9813a4de84df4bde605c384c Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Tue, 25 Oct 2022 14:33:14 -0700 Subject: [PATCH 230/407] For #26520 - Color homepage cards via wallpaper card colors --- .../home/pocket/PocketCategoriesViewHolder.kt | 36 +++++++++++++++ .../home/pocket/PocketStoriesComposables.kt | 37 +++++++++++++-- .../home/pocket/PocketStoriesViewHolder.kt | 19 +++++--- .../recentbookmarks/view/RecentBookmarks.kt | 10 ++++- .../view/RecentBookmarksViewHolder.kt | 7 ++- .../recentsyncedtabs/view/RecentSyncedTab.kt | 20 +++++---- .../view/RecentSyncedTabViewHolder.kt | 25 ++++++++++- .../recenttabs/view/RecentTabViewHolder.kt | 4 ++ .../fenix/home/recenttabs/view/RecentTabs.kt | 8 +++- .../home/recentvisits/view/RecentlyVisited.kt | 5 ++- .../view/RecentlyVisitedViewHolder.kt | 4 ++ .../sessioncontrol/SessionControlAdapter.kt | 1 + .../CustomizeHomeButtonViewHolder.kt | 30 ++++++++++++- .../home/topsites/TopSiteItemViewHolder.kt | 29 +++++++++++- .../home/topsites/TopSitePagerViewHolder.kt | 4 +- .../fenix/home/topsites/TopSiteViewHolder.kt | 4 +- .../fenix/home/topsites/TopSitesAdapter.kt | 4 +- .../home/topsites/TopSitesPagerAdapter.kt | 4 +- .../fenix/wallpapers/WallpaperState.kt | 45 +++++++++++++++++++ app/src/main/res/layout/top_site_item.xml | 1 + app/src/main/res/values/styles.xml | 1 - .../topsites/TopSiteItemViewHolderTest.kt | 15 ++++--- .../home/topsites/TopSiteViewHolderTest.kt | 5 ++- .../home/topsites/TopSitesPagerAdapterTest.kt | 2 +- .../fenix/perf/StartupReportFullyDrawnTest.kt | 2 +- 25 files changed, 281 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt index 5283300e5..1e3d1a044 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketCategoriesViewHolder.kt @@ -5,12 +5,14 @@ package org.mozilla.fenix.home.pocket import android.view.View +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -24,6 +26,7 @@ import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.compose.home.HomeSectionHeader import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.wallpapers.WallpaperState internal const val POCKET_CATEGORIES_SELECTED_AT_A_TIME_COUNT = 8 @@ -55,12 +58,37 @@ class PocketCategoriesViewHolder( val categoriesSelections = components.appStore .observeAsComposableState { state -> state.pocketStoriesCategoriesSelections }.value + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default + + var selectedBackgroundColor: Color? = null + var unselectedBackgroundColor: Color? = null + var selectedTextColor: Color? = null + var unselectedTextColor: Color? = null + wallpaperState.composeRunIfWallpaperCardColorsAreAvailable { cardColorLight, cardColorDark -> + if (isSystemInDarkTheme()) { + selectedBackgroundColor = cardColorDark + unselectedBackgroundColor = cardColorLight + selectedTextColor = FirefoxTheme.colors.textActionPrimary + unselectedTextColor = FirefoxTheme.colors.textActionSecondary + } else { + selectedBackgroundColor = cardColorLight + unselectedBackgroundColor = cardColorDark + selectedTextColor = FirefoxTheme.colors.textActionSecondary + unselectedTextColor = FirefoxTheme.colors.textActionPrimary + } + } + // See the detailed comment in PocketStoriesViewHolder for reasoning behind this change. if (!homeScreenReady) return Column { Spacer(Modifier.height(24.dp)) PocketTopics( + selectedBackgroundColor = selectedBackgroundColor, + unselectedBackgroundColor = unselectedBackgroundColor, + selectedTextColor = selectedTextColor, + unselectedTextColor = unselectedTextColor, categories = categories ?: emptyList(), categoriesSelections = categoriesSelections ?: emptyList(), onCategoryClick = interactor::onCategoryClicked, @@ -75,6 +103,10 @@ class PocketCategoriesViewHolder( @Composable private fun PocketTopics( + selectedTextColor: Color? = null, + unselectedTextColor: Color? = null, + selectedBackgroundColor: Color? = null, + unselectedBackgroundColor: Color? = null, categories: List = emptyList(), categoriesSelections: List = emptyList(), onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit, @@ -89,6 +121,10 @@ private fun PocketTopics( PocketStoriesCategories( categories = categories, selections = categoriesSelections, + selectedTextColor = selectedTextColor, + unselectedTextColor = unselectedTextColor, + selectedBackgroundColor = selectedBackgroundColor, + unselectedBackgroundColor = unselectedBackgroundColor, onCategoryClick = onCategoryClick, modifier = Modifier .fillMaxWidth(), diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt index 014fbf8ed..9f14af698 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt @@ -98,11 +98,13 @@ private val placeholderStory = PocketRecommendedStory("", "", "", "", "", 0, 0) * Displays a single [PocketRecommendedStory]. * * @param story The [PocketRecommendedStory] to be displayed. + * @param backgroundColor The background [Color] of the story. * @param onStoryClick Callback for when the user taps on this story. */ @Composable fun PocketStory( @PreviewParameter(PocketStoryProvider::class) story: PocketRecommendedStory, + backgroundColor: Color, onStoryClick: (PocketRecommendedStory) -> Unit, ) { val imageUrl = story.imageUrl.replace( @@ -113,6 +115,7 @@ fun PocketStory( val isValidTimeToRead = story.timeToRead >= 0 ListItemTabLarge( imageUrl = imageUrl, + backgroundColor = backgroundColor, onClick = { onStoryClick(story) }, title = { Text( @@ -151,11 +154,13 @@ fun PocketStory( * Displays a single [PocketSponsoredStory]. * * @param story The [PocketSponsoredStory] to be displayed. + * @param backgroundColor The background [Color] of the story. * @param onStoryClick Callback for when the user taps on this story. */ @Composable fun PocketSponsoredStory( story: PocketSponsoredStory, + backgroundColor: Color, onStoryClick: (PocketSponsoredStory) -> Unit, ) { val (imageWidth, imageHeight) = with(LocalDensity.current) { @@ -168,6 +173,7 @@ fun PocketSponsoredStory( ListItemTabSurface( imageUrl = imageUrl, + backgroundColor = backgroundColor, onClick = { onStoryClick(story) }, ) { Text( @@ -208,14 +214,17 @@ fun PocketSponsoredStory( * @param stories The list of [PocketStory]ies to be displayed. Expect a list with 8 items. * @param contentPadding Dimension for padding the content after it has been clipped. * This space will be used for shadows and also content rendering when the list is scrolled. + * @param backgroundColor The background [Color] of each story. * @param onStoryShown Callback for when a certain story is visible to the user. * @param onStoryClicked Callback for when the user taps on a recommended story. * @param onDiscoverMoreClicked Callback for when the user taps an element which contains an */ +@Suppress("LongParameterList") @Composable fun PocketStories( @PreviewParameter(PocketStoryProvider::class) stories: List, contentPadding: Dp, + backgroundColor: Color = FirefoxTheme.colors.layer2, onStoryShown: (PocketStory, Pair) -> Unit, onStoryClicked: (PocketStory, Pair) -> Unit, onDiscoverMoreClicked: (String) -> Unit, @@ -241,7 +250,10 @@ fun PocketStories( onDiscoverMoreClicked("https://getpocket.com/explore?$POCKET_FEATURE_UTM_KEY_VALUE") } } else if (story is PocketRecommendedStory) { - PocketStory(story) { + PocketStory( + story = story, + backgroundColor = backgroundColor, + ) { val uri = Uri.parse(story.url) .buildUpon() .appendQueryParameter(URI_PARAM_UTM_KEY, POCKET_STORIES_UTM_VALUE) @@ -254,7 +266,10 @@ fun PocketStories( onStoryShown(story, rowIndex to columnIndex) }, ) { - PocketSponsoredStory(story) { + PocketSponsoredStory( + story = story, + backgroundColor = backgroundColor, + ) { onStoryClicked(story, rowIndex to columnIndex) } } @@ -359,13 +374,22 @@ private fun Rect.getIntersectPercentage(realSize: IntSize, other: Rect): Float { * * @param categories The categories needed to be displayed. * @param selections List of categories currently selected. + * @param selectedTextColor Text [Color] when the category is selected. + * @param unselectedTextColor Text [Color] when the category is not selected. + * @param selectedBackgroundColor Background [Color] when the category is selected. + * @param unselectedBackgroundColor Background [Color] when the category is not selected. * @param onCategoryClick Callback for when the user taps a category. * @param modifier [Modifier] to be applied to the layout. */ +@Suppress("LongParameterList") @Composable fun PocketStoriesCategories( categories: List, selections: List, + selectedTextColor: Color? = null, + unselectedTextColor: Color? = null, + selectedBackgroundColor: Color? = null, + unselectedBackgroundColor: Color? = null, onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit, modifier: Modifier = Modifier, ) { @@ -375,7 +399,14 @@ fun PocketStoriesCategories( verticalItemsSpacing = 16.dp, ) { categories.filter { it.name != POCKET_STORIES_DEFAULT_CATEGORY_NAME }.forEach { category -> - SelectableChip(category.name, selections.map { it.name }.contains(category.name)) { + SelectableChip( + text = category.name, + isSelected = selections.map { it.name }.contains(category.name), + selectedTextColor = selectedTextColor, + unselectedTextColor = unselectedTextColor, + selectedBackgroundColor = selectedBackgroundColor, + unselectedBackgroundColor = unselectedBackgroundColor, + ) { onCategoryClick(category) } } diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesViewHolder.kt index d7ffc9eac..f8d799a38 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesViewHolder.kt @@ -23,12 +23,12 @@ import androidx.recyclerview.widget.RecyclerView import mozilla.components.lib.state.ext.observeAsComposableState import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory import org.mozilla.fenix.R -import org.mozilla.fenix.R.dimen import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.compose.home.HomeSectionHeader import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme +import org.mozilla.fenix.wallpapers.WallpaperState /** * [RecyclerView.ViewHolder] for displaying the list of [PocketRecommendedStory]s from [AppStore]. @@ -49,7 +49,7 @@ class PocketStoriesViewHolder( @Composable override fun Content() { - val horizontalPadding = dimensionResource(dimen.home_item_horizontal_margin) + val horizontalPadding = dimensionResource(R.dimen.home_item_horizontal_margin) val homeScreenReady = components.appStore .observeAsComposableState { state -> state.firstFrameDrawn }.value ?: false @@ -57,6 +57,9 @@ class PocketStoriesViewHolder( val stories = components.appStore .observeAsComposableState { state -> state.pocketStories }.value + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default + /* This was originally done to address this perf issue: * https://github.com/mozilla-mobile/fenix/issues/25545 for details. * It was determined that Pocket content was becoming available before the first frame was @@ -88,11 +91,12 @@ class PocketStoriesViewHolder( Spacer(Modifier.height(16.dp)) PocketStories( - stories ?: emptyList(), - horizontalPadding, - interactor::onStoryShown, - interactor::onStoryClicked, - interactor::onDiscoverMoreClicked, + stories = stories ?: emptyList(), + contentPadding = horizontalPadding, + backgroundColor = wallpaperState.wallpaperCardColor, + onStoryShown = interactor::onStoryShown, + onStoryClicked = interactor::onStoryClicked, + onDiscoverMoreClicked = interactor::onDiscoverMoreClicked, ) } } @@ -113,6 +117,7 @@ fun PocketStoriesViewHolderPreview() { PocketStories( stories = getFakePocketStories(8), contentPadding = 0.dp, + backgroundColor = FirefoxTheme.colors.layer2, onStoryShown = { _, _ -> }, onStoryClicked = { _, _ -> }, onDiscoverMoreClicked = {}, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt index a891b9e1b..1f62aa6e3 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt @@ -36,6 +36,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -64,6 +65,7 @@ private val imageModifier = Modifier * * @param bookmarks List of [RecentBookmark]s to display. * @param menuItems List of [RecentBookmarksMenuItem] shown when long clicking a [RecentBookmarkItem] + * @param backgroundColor The background [Color] of each bookmark. * @param onRecentBookmarkClick Invoked when the user clicks on a recent bookmark. * @param onRecentBookmarkLongClick Invoked when the user long clicks on a recent bookmark. */ @@ -71,6 +73,7 @@ private val imageModifier = Modifier fun RecentBookmarks( bookmarks: List, menuItems: List, + backgroundColor: Color, onRecentBookmarkClick: (RecentBookmark) -> Unit = {}, onRecentBookmarkLongClick: () -> Unit = {}, ) { @@ -82,6 +85,7 @@ fun RecentBookmarks( RecentBookmarkItem( bookmark = bookmark, menuItems = menuItems, + backgroundColor = backgroundColor, onRecentBookmarkClick = onRecentBookmarkClick, onRecentBookmarkLongClick = onRecentBookmarkLongClick, ) @@ -93,6 +97,8 @@ fun RecentBookmarks( * A recent bookmark item. * * @param bookmark The [RecentBookmark] to display. + * @param menuItems The list of [RecentBookmarksMenuItem] shown when long clicking on the recent bookmark item. + * @param backgroundColor The background [Color] of the recent bookmark item. * @param onRecentBookmarkClick Invoked when the user clicks on the recent bookmark item. * @param onRecentBookmarkLongClick Invoked when the user long clicks on the recent bookmark item. */ @@ -101,6 +107,7 @@ fun RecentBookmarks( private fun RecentBookmarkItem( bookmark: RecentBookmark, menuItems: List, + backgroundColor: Color, onRecentBookmarkClick: (RecentBookmark) -> Unit = {}, onRecentBookmarkLongClick: () -> Unit = {}, ) { @@ -118,7 +125,7 @@ private fun RecentBookmarkItem( }, ), shape = cardShape, - backgroundColor = FirefoxTheme.colors.layer2, + backgroundColor = backgroundColor, elevation = 6.dp, ) { Column( @@ -277,6 +284,7 @@ private fun RecentBookmarksPreview() { ), ), menuItems = listOf(), + backgroundColor = FirefoxTheme.colors.layer2, ) } } diff --git a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt index 5f0b69046..8ea83ce60 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt @@ -15,6 +15,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor +import org.mozilla.fenix.wallpapers.WallpaperState import org.mozilla.fenix.GleanMetrics.RecentBookmarks as RecentBookmarksMetrics class RecentBookmarksViewHolder( @@ -33,11 +34,13 @@ class RecentBookmarksViewHolder( @Composable override fun Content() { - val recentBookmarks = components.appStore - .observeAsComposableState { state -> state.recentBookmarks } + val recentBookmarks = components.appStore.observeAsComposableState { state -> state.recentBookmarks } + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default RecentBookmarks( bookmarks = recentBookmarks.value ?: emptyList(), + backgroundColor = wallpaperState.wallpaperCardColor, onRecentBookmarkClick = interactor::onRecentBookmarkClicked, menuItems = listOf( RecentBookmarksMenuItem( diff --git a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt index b3079c3a9..32471d3ae 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt @@ -34,6 +34,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.painterResource @@ -57,16 +58,22 @@ import org.mozilla.fenix.theme.Theme * A recent synced tab card. * * @param tab The [RecentSyncedTab] to display. + * @param backgroundColor The background [Color] of the item. + * @param buttonBackgroundColor The background [Color] of the item's button. + * @param buttonTextColor The [Color] of the button's text. * @param onRecentSyncedTabClick Invoked when the user clicks on the recent synced tab. * @param onSeeAllSyncedTabsButtonClick Invoked when user clicks on the "See all" button in the synced tab card. * @param onRemoveSyncedTab Invoked when user clicks on the "Remove" dropdown menu option. * @param onRecentSyncedTabLongClick Invoked when user long presses the recent synced tab. */ @OptIn(ExperimentalFoundationApi::class) -@Suppress("LongMethod") +@Suppress("LongMethod", "LongParameterList") @Composable fun RecentSyncedTab( tab: RecentSyncedTab?, + backgroundColor: Color = FirefoxTheme.colors.layer2, + buttonBackgroundColor: Color = FirefoxTheme.colors.actionSecondary, + buttonTextColor: Color = FirefoxTheme.colors.textActionSecondary, onRecentSyncedTabClick: (RecentSyncedTab) -> Unit, onSeeAllSyncedTabsButtonClick: () -> Unit, onRemoveSyncedTab: (RecentSyncedTab) -> Unit, @@ -91,7 +98,7 @@ fun RecentSyncedTab( }, ), shape = RoundedCornerShape(8.dp), - backgroundColor = FirefoxTheme.colors.layer2, + backgroundColor = backgroundColor, elevation = 6.dp, ) { Column(modifier = Modifier.padding(16.dp)) { @@ -178,12 +185,8 @@ fun RecentSyncedTab( } else { "" }, - textColor = FirefoxTheme.colors.textActionSecondary, - backgroundColor = if (tab == null) { - FirefoxTheme.colors.layer3 - } else { - FirefoxTheme.colors.actionSecondary - }, + textColor = buttonTextColor, + backgroundColor = buttonBackgroundColor, tint = FirefoxTheme.colors.iconActionSecondary, onClick = onSeeAllSyncedTabsButtonClick, ) @@ -302,6 +305,7 @@ private fun LoadingRecentSyncedTab() { FirefoxTheme(theme = Theme.getTheme()) { RecentSyncedTab( tab = null, + buttonBackgroundColor = FirefoxTheme.colors.layer3, onRecentSyncedTabClick = {}, onSeeAllSyncedTabsButtonClick = {}, onRemoveSyncedTab = {}, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt index e4f17d769..75b681285 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.home.recentsyncedtabs.view import android.view.View +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.LifecycleOwner @@ -14,6 +15,9 @@ import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recentsyncedtabs.interactor.RecentSyncedTabInteractor +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.wallpapers.Wallpaper +import org.mozilla.fenix.wallpapers.WallpaperState /** * View holder for a recent synced tab item. @@ -42,8 +46,11 @@ class RecentSyncedTabViewHolder( @Composable override fun Content() { - val recentSyncedTabState = - components.appStore.observeAsComposableState { state -> state.recentSyncedTabState } + val recentSyncedTabState = components.appStore.observeAsComposableState { state -> state.recentSyncedTabState } + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default + val isWallpaperNotDefault = !Wallpaper.nameIsDefault(wallpaperState.currentWallpaper.name) + recentSyncedTabState.value?.let { val syncedTab = when (it) { RecentSyncedTabState.None, @@ -51,8 +58,22 @@ class RecentSyncedTabViewHolder( -> null is RecentSyncedTabState.Success -> it.tabs.firstOrNull() } + val buttonBackgroundColor = when { + syncedTab != null && isWallpaperNotDefault -> FirefoxTheme.colors.layer1 + syncedTab != null -> FirefoxTheme.colors.actionSecondary + else -> FirefoxTheme.colors.layer3 + } + val buttonTextColor = when { + wallpaperState.currentWallpaper.cardColorDark != null && + isSystemInDarkTheme() -> FirefoxTheme.colors.textPrimary + else -> FirefoxTheme.colors.textActionSecondary + } + RecentSyncedTab( tab = syncedTab, + backgroundColor = wallpaperState.wallpaperCardColor, + buttonBackgroundColor = buttonBackgroundColor, + buttonTextColor = buttonTextColor, onRecentSyncedTabClick = recentSyncedTabInteractor::onRecentSyncedTabClicked, onSeeAllSyncedTabsButtonClick = recentSyncedTabInteractor::onSyncedTabShowAllClicked, onRemoveSyncedTab = recentSyncedTabInteractor::onRemovedRecentSyncedTab, diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt index eb598a8ea..f53bd1f61 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt @@ -14,6 +14,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.home.recenttabs.interactor.RecentTabInteractor +import org.mozilla.fenix.wallpapers.WallpaperState /** * View holder for a recent tab item. @@ -42,9 +43,12 @@ class RecentTabViewHolder( @Composable override fun Content() { val recentTabs = components.appStore.observeAsComposableState { state -> state.recentTabs } + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default RecentTabs( recentTabs = recentTabs.value ?: emptyList(), + backgroundColor = wallpaperState.wallpaperCardColor, onRecentTabClick = { recentTabInteractor.onRecentTabClicked(it) }, onRecentTabLongClick = { recentTabInteractor.onRecentTabLongClicked() }, menuItems = listOf( diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt index 62f49c368..75a085d13 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt @@ -39,6 +39,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.layout.ContentScale @@ -66,12 +67,14 @@ import org.mozilla.fenix.theme.FirefoxTheme * * @param recentTabs List of [RecentTab] to display. * @param menuItems List of [RecentTabMenuItem] shown long clicking a [RecentTab]. + * @param backgroundColor The background [Color] of each item. * @param onRecentTabClick Invoked when the user clicks on a recent tab. */ @Composable fun RecentTabs( recentTabs: List, menuItems: List, + backgroundColor: Color = FirefoxTheme.colors.layer2, onRecentTabClick: (String) -> Unit = {}, onRecentTabLongClick: () -> Unit = {}, ) { @@ -85,6 +88,7 @@ fun RecentTabs( RecentTabItem( tab = tab, menuItems = menuItems, + backgroundColor = backgroundColor, onRecentTabClick = onRecentTabClick, onRecentTabLongClick = onRecentTabLongClick, ) @@ -98,6 +102,7 @@ fun RecentTabs( * A recent tab item. * * @param tab [RecentTab.Tab] that was recently viewed. + * @param backgroundColor The background [Color] of the item. * @param onRecentTabClick Invoked when the user clicks on a recent tab. */ @OptIn(ExperimentalFoundationApi::class) @@ -105,6 +110,7 @@ fun RecentTabs( private fun RecentTabItem( tab: RecentTab.Tab, menuItems: List, + backgroundColor: Color, onRecentTabClick: (String) -> Unit = {}, onRecentTabLongClick: () -> Unit = {}, ) { @@ -123,7 +129,7 @@ private fun RecentTabItem( }, ), shape = RoundedCornerShape(8.dp), - backgroundColor = FirefoxTheme.colors.layer2, + backgroundColor = backgroundColor, elevation = 6.dp, ) { Row( diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt index 910e8f8d5..954c2cb1b 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt @@ -39,6 +39,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -64,6 +65,7 @@ private const val VISITS_PER_COLUMN = 3 * * @param recentVisits List of [RecentlyVisitedItem] to display. * @param menuItems List of [RecentVisitMenuItem] shown long clicking a [RecentlyVisitedItem]. + * @param backgroundColor The background [Color] of each item. * @param onRecentVisitClick Invoked when the user clicks on a recent visit. * @param onRecentVisitLongClick Invoked when the user long clicks on a recent visit. */ @@ -71,13 +73,14 @@ private const val VISITS_PER_COLUMN = 3 fun RecentlyVisited( recentVisits: List, menuItems: List, + backgroundColor: Color = FirefoxTheme.colors.layer2, onRecentVisitClick: (RecentlyVisitedItem, Int) -> Unit = { _, _ -> }, onRecentVisitLongClick: () -> Unit = {}, ) { Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(8.dp), - backgroundColor = FirefoxTheme.colors.layer2, + backgroundColor = backgroundColor, elevation = 6.dp, ) { val listState = rememberLazyListState() diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt index 6a7a66932..7f7a6a4df 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisitedViewHolder.kt @@ -20,6 +20,7 @@ import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGroup import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHighlight import org.mozilla.fenix.home.recentvisits.interactor.RecentVisitsInteractor +import org.mozilla.fenix.wallpapers.WallpaperState /** * View holder for [RecentlyVisitedItem]s. @@ -43,6 +44,8 @@ class RecentlyVisitedViewHolder( override fun Content() { val recentVisits = components.appStore .observeAsComposableState { state -> state.recentHistory } + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default RecentlyVisited( recentVisits = recentVisits.value ?: emptyList(), @@ -59,6 +62,7 @@ class RecentlyVisitedViewHolder( }, ), ), + backgroundColor = wallpaperState.wallpaperCardColor, onRecentVisitClick = { recentlyVisitedItem, pageNumber -> when (recentlyVisitedItem) { is RecentHistoryHighlight -> { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index dd14e3a59..a34973eef 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -309,6 +309,7 @@ class SessionControlAdapter( TopPlaceholderViewHolder.LAYOUT_ID -> TopPlaceholderViewHolder(view) TopSitePagerViewHolder.LAYOUT_ID -> TopSitePagerViewHolder( view = view, + store = components.appStore, viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, ) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt index 52d438031..601b63134 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt @@ -5,19 +5,27 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.view.View +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.LifecycleOwner +import mozilla.components.lib.state.ext.observeAsComposableState import org.mozilla.fenix.R +import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder +import org.mozilla.fenix.compose.button.Button import org.mozilla.fenix.compose.button.TertiaryButton import org.mozilla.fenix.home.sessioncontrol.CustomizeHomeIteractor +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.wallpapers.Wallpaper +import org.mozilla.fenix.wallpapers.WallpaperState class CustomizeHomeButtonViewHolder( composeView: ComposeView, @@ -37,11 +45,31 @@ class CustomizeHomeButtonViewHolder( @Composable override fun Content() { + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default + var buttonColor: Color = FirefoxTheme.colors.actionTertiary + val textColor: Color = FirefoxTheme.colors.textActionTertiary + + wallpaperState.composeRunIfWallpaperCardColorsAreAvailable { cardColorLight, cardColorDark -> + buttonColor = if (isSystemInDarkTheme()) { + cardColorDark + } else { + cardColorLight + } + } + Column { Spacer(modifier = Modifier.height(68.dp)) - TertiaryButton( + /** + * This button will be stylized as a [TertiaryButton] when no wallpaper is selected. + * Otherwise, the background will use [Wallpaper.cardColorLight] or [Wallpaper.cardColorDark]. + * */ + Button( text = stringResource(R.string.browser_menu_customize_home_1), + textColor = textColor, + backgroundColor = buttonColor, + tint = FirefoxTheme.colors.iconActionTertiary, onClick = interactor::openCustomizeHomePage, ) } diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt index 5af87487f..469362cdc 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt @@ -10,28 +10,36 @@ import android.view.View import android.widget.PopupWindow import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.feature.top.sites.TopSite +import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.GleanMetrics.Pings import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.TopSiteItemBinding import org.mozilla.fenix.ext.bitmapForUrl import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.isSystemInDarkTheme import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.ext.name import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.utils.view.ViewHolder +@SuppressLint("ClickableViewAccessibility") class TopSiteItemViewHolder( view: View, + store: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ViewHolder(view) { @@ -63,12 +71,30 @@ class TopSiteItemViewHolder( } val menu = topSiteMenu.menuBuilder.build(view.context).show(anchor = it) - it.setOnTouchListener @SuppressLint("ClickableViewAccessibility") { v, event -> + it.setOnTouchListener { v, event -> onTouchEvent(v, event, menu) } true } + + store.flowScoped(viewLifecycleOwner) { flow -> + flow.map { state -> state.wallpaperState } + .ifChanged() + .collect { currentState -> + var backgroundColor = ContextCompat.getColor(view.context, R.color.fx_mobile_layer_color_2) + + currentState.runIfWallpaperCardColorsAreAvailable { cardColorLight, cardColorDark -> + backgroundColor = if (view.context.isSystemInDarkTheme()) { + cardColorDark + } else { + cardColorLight + } + } + + binding.topSiteCard.setCardBackgroundColor(backgroundColor) + } + } } fun bind(topSite: TopSite, position: Int) { @@ -140,6 +166,7 @@ class TopSiteItemViewHolder( Pings.topsitesImpression.submit() } + @SuppressLint("ClickableViewAccessibility") private fun onTouchEvent( v: View, event: MotionEvent, diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt index 62732cfb7..cf0db7220 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt @@ -12,18 +12,20 @@ import androidx.viewpager2.widget.ViewPager2 import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.ComponentTopSitesPagerBinding import org.mozilla.fenix.home.sessioncontrol.AdapterItem import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor class TopSitePagerViewHolder( view: View, + store: AppStore, viewLifecycleOwner: LifecycleOwner, interactor: TopSiteInteractor, ) : RecyclerView.ViewHolder(view) { private val binding = ComponentTopSitesPagerBinding.bind(view) - private val topSitesPagerAdapter = TopSitesPagerAdapter(viewLifecycleOwner, interactor) + private val topSitesPagerAdapter = TopSitesPagerAdapter(store, viewLifecycleOwner, interactor) private val pageIndicator = binding.pageIndicator private var currentPage = 0 diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt index aa1073d95..4cd719216 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt @@ -9,17 +9,19 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.ComponentTopSitesBinding import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.utils.AccessibilityGridLayoutManager class TopSiteViewHolder( view: View, + store: AppStore, viewLifecycleOwner: LifecycleOwner, interactor: TopSiteInteractor, ) : RecyclerView.ViewHolder(view) { - private val topSitesAdapter = TopSitesAdapter(viewLifecycleOwner, interactor) + private val topSitesAdapter = TopSitesAdapter(store, viewLifecycleOwner, interactor) val binding = ComponentTopSitesBinding.bind(view) init { diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt index 0dfab5b9c..d68452534 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt @@ -10,17 +10,19 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import mozilla.components.feature.top.sites.TopSite +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.perf.StartupTimeline class TopSitesAdapter( + private val store: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ListAdapter(TopSitesDiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteItemViewHolder { val view = LayoutInflater.from(parent.context) .inflate(TopSiteItemViewHolder.LAYOUT_ID, parent, false) - return TopSiteItemViewHolder(view, viewLifecycleOwner, interactor) + return TopSiteItemViewHolder(view, store, viewLifecycleOwner, interactor) } override fun onBindViewHolder(holder: TopSiteItemViewHolder, position: Int) { diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt index 235211062..1785f1477 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt @@ -11,11 +11,13 @@ import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import mozilla.components.feature.top.sites.TopSite +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.topsites.TopSitePagerViewHolder.Companion.TOP_SITES_PER_PAGE class TopSitesPagerAdapter( + private val store: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ListAdapter, TopSiteViewHolder>(TopSiteListDiffCallback) { @@ -23,7 +25,7 @@ class TopSitesPagerAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteViewHolder { val view = LayoutInflater.from(parent.context) .inflate(TopSiteViewHolder.LAYOUT_ID, parent, false) - return TopSiteViewHolder(view, viewLifecycleOwner, interactor) + return TopSiteViewHolder(view, store, viewLifecycleOwner, interactor) } override fun onBindViewHolder( diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperState.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperState.kt index 4ac633ffd..8e7a584d6 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperState.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperState.kt @@ -4,6 +4,11 @@ package org.mozilla.fenix.wallpapers +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import org.mozilla.fenix.theme.FirefoxTheme + /** * Represents all state related to the Wallpapers feature. * @@ -20,4 +25,44 @@ data class WallpaperState( availableWallpapers = listOf(), ) } + + /** + * Helper property used to obtain the [Color] to fill-in cards in front of a wallpaper. + * + * @return The appropriate light or dark wallpaper card [Color], if available, otherwise a default. + */ + val wallpaperCardColor: Color + @Composable get() = when { + currentWallpaper.cardColorLight != null && currentWallpaper.cardColorDark != null -> { + if (isSystemInDarkTheme()) { + Color(currentWallpaper.cardColorDark) + } else { + Color(currentWallpaper.cardColorLight) + } + } + else -> FirefoxTheme.colors.layer2 + } + + /** + * Run the Composable [run] block only if the current wallpaper's card colors are available. + */ + @Composable + fun composeRunIfWallpaperCardColorsAreAvailable( + run: @Composable (cardColorLight: Color, cardColorDark: Color) -> Unit, + ) { + if (currentWallpaper.cardColorLight != null && currentWallpaper.cardColorDark != null) { + run(Color(currentWallpaper.cardColorLight), Color(currentWallpaper.cardColorDark)) + } + } + + /** + * Run the [run] block only if the current wallpaper's card colors are available. + */ + fun runIfWallpaperCardColorsAreAvailable( + run: (cardColorLight: Int, cardColorDark: Int) -> Unit, + ) { + if (currentWallpaper.cardColorLight != null && currentWallpaper.cardColorDark != null) { + run(currentWallpaper.cardColorLight.toInt(), currentWallpaper.cardColorDark.toInt()) + } + } } diff --git a/app/src/main/res/layout/top_site_item.xml b/app/src/main/res/layout/top_site_item.xml index 73b58699e..f29343ed7 100644 --- a/app/src/main/res/layout/top_site_item.xml +++ b/app/src/main/res/layout/top_site_item.xml @@ -11,6 +11,7 @@ android:focusable="true"> center_horizontal noHideDescendants @dimen/top_sites_card_padding - ?mozac_widget_favicon_background_color @dimen/top_sites_card_radius @dimen/top_sites_card_elevation diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt index cd41e14d8..e318ac1fa 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt @@ -23,6 +23,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Pings import org.mozilla.fenix.GleanMetrics.TopSites +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.TopSiteItemBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @@ -37,6 +38,7 @@ class TopSiteItemViewHolderTest { private lateinit var binding: TopSiteItemBinding private lateinit var interactor: TopSiteInteractor private lateinit var lifecycleOwner: LifecycleOwner + private lateinit var store: AppStore private val pocket = TopSite.Default( id = 1L, @@ -50,13 +52,14 @@ class TopSiteItemViewHolderTest { binding = TopSiteItemBinding.inflate(LayoutInflater.from(testContext)) interactor = mockk(relaxed = true) lifecycleOwner = mockk(relaxed = true) + store = mockk(relaxed = true) every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true)) } @Test fun `calls interactor on click`() { - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(pocket, position = 0) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pocket, position = 0) binding.root.performClick() verify { interactor.onSelectTopSite(pocket, position = 0) } @@ -65,7 +68,7 @@ class TopSiteItemViewHolderTest { @Test fun `calls interactor on long click`() { every { testContext.components.analytics } returns mockk(relaxed = true) - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(pocket, position = 0) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pocket, position = 0) binding.root.performLongClick() verify { interactor.onTopSiteMenuOpened() } @@ -80,7 +83,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(defaultTopSite, position = 0) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(defaultTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNotNull(pinIndicator) @@ -95,7 +98,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(pinnedTopSite, position = 0) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pinnedTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNotNull(pinIndicator) @@ -110,7 +113,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).bind(frecentTopSite, position = 0) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(frecentTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNull(pinIndicator) @@ -144,7 +147,7 @@ class TopSiteItemViewHolderTest { topSiteImpressionSubmitted = true } - TopSiteItemViewHolder(binding.root, lifecycleOwner, interactor).submitTopSitesImpressionPing(topSite, position) + TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).submitTopSitesImpressionPing(topSite, position) assertNotNull(TopSites.contileImpression.testGetValue()) diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt index 0d6eba275..a270597e0 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt @@ -13,6 +13,7 @@ import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.ComponentTopSitesBinding import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor @@ -23,17 +24,19 @@ class TopSiteViewHolderTest { private lateinit var binding: ComponentTopSitesBinding private lateinit var lifecycleOwner: LifecycleOwner private lateinit var interactor: TopSiteInteractor + private lateinit var store: AppStore @Before fun setup() { binding = ComponentTopSitesBinding.inflate(LayoutInflater.from(testContext)) interactor = mockk(relaxed = true) lifecycleOwner = mockk(relaxed = true) + store = mockk(relaxed = true) } @Test fun `binds list of top sites`() { - TopSiteViewHolder(binding.root, lifecycleOwner, interactor).bind( + TopSiteViewHolder(binding.root, store, lifecycleOwner, interactor).bind( listOf( TopSite.Default( id = 1L, diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapterTest.kt index 4b0fb269a..6cbc3c58d 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapterTest.kt @@ -49,7 +49,7 @@ class TopSitesPagerAdapterTest { @Before fun setup() { - topSitesPagerAdapter = spyk(TopSitesPagerAdapter(mockk(), mockk())) + topSitesPagerAdapter = spyk(TopSitesPagerAdapter(mockk(), mockk(), mockk())) } @Test diff --git a/app/src/test/java/org/mozilla/fenix/perf/StartupReportFullyDrawnTest.kt b/app/src/test/java/org/mozilla/fenix/perf/StartupReportFullyDrawnTest.kt index 27a4710b6..dc3d98126 100644 --- a/app/src/test/java/org/mozilla/fenix/perf/StartupReportFullyDrawnTest.kt +++ b/app/src/test/java/org/mozilla/fenix/perf/StartupReportFullyDrawnTest.kt @@ -53,7 +53,7 @@ class StartupReportFullyDrawnTest { holderItemView = spyk(binding.root) every { activity.findViewById(R.id.rootContainer) } returns rootContainer every { holderItemView.context } returns activity - holder = TopSiteItemViewHolder(holderItemView, mockk(), mockk()) + holder = TopSiteItemViewHolder(holderItemView, mockk(), mockk(), mockk()) every { rootContainer.viewTreeObserver } returns viewTreeObserver every { holderItemView.viewTreeObserver } returns viewTreeObserver From ba02e745b224f8c06d3de210a715f96e43bf30f5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 26 Oct 2022 19:32:03 +0000 Subject: [PATCH 231/407] Update to Android-Components 108.0.20221026190101. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ee6b3919c..73785d593 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221026143138" + const val VERSION = "108.0.20221026190101" } From 1255319747dc7dfd47adfc6a29c189dc589cae3c Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 27 Oct 2022 04:31:25 +0200 Subject: [PATCH 232/407] Import l10n. (#27558) --- app/src/main/res/values-dsb/strings.xml | 46 +++++++++---------------- 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index 92c6eb99c..e5d3161e1 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -130,13 +130,6 @@ Tłocašk „Njedawno wócynjone rejtariki“ pokazaś - - Wašo pytanje za \"%1$s\" - - - Sedła: %d Synchronizěrowane rejtariki pokazaś @@ -302,6 +295,9 @@ Waše rejtariki se synchronizěruju! Pókšačujśo, źož sćo pśestał na drugem rěźe. + + Zacyniś + Nowy rejtarik %1$s wócyniś @@ -483,12 +479,6 @@ Slězynowy wobraz njedajo se změniś Dalšne informacije - - Pótusniśo logo startowego boka Firefox, aby slězynowy wobraz změnił - - - Logo Firefox - slězynowy wobraz změniś, tłocašk Klasiski %s @@ -674,10 +664,6 @@ Lisćina Kśidno - - Pytańske kupki - - Gromadu słušajuce sedła rědowaś Rejtariki zacyniś @@ -830,18 +816,6 @@ How žedna historija njejo - - Z drugich rědow synchronizěrowane - - Z drugich rědow - - - Pśizjawśo se, aby historiju wiźeł, kótaruž sćo synchronizěrował ze swójich drugich rědow. - - Pśizjawiś - - Abo załožćo konto Firefox, aby synchronizěrowanje zachopił]]> - Ześěgnjenja wótwónoźone @@ -1069,6 +1043,8 @@ Źěliś + + Ako PDF składowaś Rědoju pósłaś @@ -1080,9 +1056,11 @@ Do mjazyskłada kopěrowane - Pla Sync pśizjawiś + Pla Sync pśizjawiś Pla Sync pśizjawiś + + Synchronizěrowaś a daty składowaś Na wše rědy pósłaś @@ -1939,4 +1917,12 @@ K nastajenjam Naraźenja Firefox + + + + schowaś + + pokazaś + + wocyńśo wótkaz, aby wěcej wó toś tej zběrce zgónił From 2f34e8f8cd49771b385b7dfe8133b5086f9c8f7a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 27 Oct 2022 01:08:26 +0000 Subject: [PATCH 233/407] Update to Android-Components 108.0.20221026223604. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 73785d593..7946c2bb9 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221026190101" + const val VERSION = "108.0.20221026223604" } From 02d4da00d6e9485acfc85f4176d48bc000f0ab47 Mon Sep 17 00:00:00 2001 From: ohall-m <93344309+ohall-m@users.noreply.github.com> Date: Tue, 18 Oct 2022 17:59:42 -0400 Subject: [PATCH 234/407] For #27458: Add AD_ID Permission Added AD_ID Permission to Manifest for Android 13. --- app/src/main/AndroidManifest.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aab865ec7..9a3019274 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,9 @@ + + + From 7d39494c0644e679456c309572f3153bc28e6aff Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 27 Oct 2022 17:10:04 +0200 Subject: [PATCH 235/407] Import l10n. (#27566) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/res/values-be/strings.xml | 31 +------------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 01f72005f..c6a7c7e22 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -127,13 +127,6 @@ Кнопка паказу ўсіх нядаўніх картак - - Вынік пошуку \"%1$s\" - - - Сайты: %d Усе сінхранізаваныя карткі @@ -381,7 +374,7 @@ Уліковы запіс - Паліца прылад + Паліца інструментаў Тэма @@ -485,12 +478,6 @@ Не ўдалося змяніць шпалеры Падрабязней - - Змяняць шпалеры дотыкам да лагатыпа хатняй старонкі Firefox - - - Лагатып Firefox — змяніць шпалеры, кнопка Класічны %s @@ -678,10 +665,6 @@ Спіс Сетка - - Пошукавыя групы - - Групуйце звязаныя сайты разам Закрываць карткі @@ -834,18 +817,6 @@ Няма гісторыі - - Сінхранавана з іншых прылад - - З іншых прылад - - - Увайдзіце, каб убачыць гісторыю, сінхранізаваную з іншых вашых прылад. - - Увайсці - - Або стварыць уліковы запіс Firefox, каб пачаць сінхранізацыю]]> - Сцягванні выдалены From 0c13a5aa5d86b49fe32b3fc5cfe1ce99fc5f0b36 Mon Sep 17 00:00:00 2001 From: t-p-white Date: Thu, 27 Oct 2022 13:51:00 +0100 Subject: [PATCH 236/407] For #27455 - Rename all reference names to `AppStore` as appStore --- .../fenix/gleanplumb/MessagingFeature.kt | 4 +- .../org/mozilla/fenix/home/HomeFragment.kt | 4 +- .../intent/CrashReporterIntentProcessor.kt | 4 +- .../sessioncontrol/SessionControlAdapter.kt | 2 +- .../home/topsites/DefaultTopSitesView.kt | 4 +- .../home/topsites/TopSiteItemViewHolder.kt | 4 +- .../home/topsites/TopSitePagerViewHolder.kt | 4 +- .../fenix/home/topsites/TopSiteViewHolder.kt | 4 +- .../fenix/home/topsites/TopSitesAdapter.kt | 4 +- .../home/topsites/TopSitesPagerAdapter.kt | 4 +- .../fenix/wallpapers/WallpapersUseCases.kt | 44 ++-- .../components/appstate/AppActionTest.kt | 8 +- .../DefaultMessageControllerTest.kt | 10 +- .../fenix/gleanplumb/MessagingFeatureTest.kt | 6 +- .../state/MessagingMiddlewareTest.kt | 8 +- .../home/blocklist/BlocklistMiddlewareTest.kt | 210 +++++++++--------- .../CrashReporterIntentProcessorTest.kt | 10 +- .../topsites/TopSiteItemViewHolderTest.kt | 16 +- .../home/topsites/TopSiteViewHolderTest.kt | 6 +- .../settings/HomeSettingsFragmentTest.kt | 8 +- .../wallpapers/WallpapersUseCasesTest.kt | 50 ++--- 21 files changed, 207 insertions(+), 207 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/gleanplumb/MessagingFeature.kt b/app/src/main/java/org/mozilla/fenix/gleanplumb/MessagingFeature.kt index f7df88b76..9a27bb159 100644 --- a/app/src/main/java/org/mozilla/fenix/gleanplumb/MessagingFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/gleanplumb/MessagingFeature.kt @@ -12,11 +12,11 @@ import org.mozilla.fenix.components.appstate.AppAction.MessagingAction /** * A message observer that updates the provided. */ -class MessagingFeature(val store: AppStore) : LifecycleAwareFeature { +class MessagingFeature(val appStore: AppStore) : LifecycleAwareFeature { override fun start() { if (FeatureFlags.messagingFeature) { - store.dispatch(MessagingAction.Evaluate) + appStore.dispatch(MessagingAction.Evaluate) } } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f8e8ff240..0b13281aa 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -254,7 +254,7 @@ class HomeFragment : Fragment() { if (requireContext().settings().isExperimentationEnabled) { messagingFeature.set( feature = MessagingFeature( - store = requireComponents.appStore, + appStore = requireComponents.appStore, ), owner = viewLifecycleOwner, view = binding.root, @@ -265,7 +265,7 @@ class HomeFragment : Fragment() { topSitesFeature.set( feature = TopSitesFeature( view = DefaultTopSitesView( - store = components.appStore, + appStore = components.appStore, settings = components.settings, ), storage = components.core.topSitesStorage, diff --git a/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt index b3002a07c..f698d24f5 100644 --- a/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt @@ -17,14 +17,14 @@ import mozilla.components.lib.crash.CrashReporter * Process the [Intent] from [CrashReporter] through which the app is informed about * recoverable native crashes. */ -class CrashReporterIntentProcessor(private val store: AppStore) : HomeIntentProcessor { +class CrashReporterIntentProcessor(private val appStore: AppStore) : HomeIntentProcessor { override fun process(intent: Intent, navController: NavController, out: Intent): Boolean { return if (Crash.isCrashIntent(intent)) { val crash = Crash.fromIntent(intent) // If only a child process crashed we can handle this gracefully. if ((crash as? NativeCodeCrash)?.isFatal == false) { - store.dispatch(AppAction.AddNonFatalCrash(crash)) + appStore.dispatch(AppAction.AddNonFatalCrash(crash)) } else { // A fatal crash means the app's main process is affected. // An UncaughtExceptionCrash refers to a [Throwable] that would otherwise crash the app diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index a34973eef..6fd052569 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -309,7 +309,7 @@ class SessionControlAdapter( TopPlaceholderViewHolder.LAYOUT_ID -> TopPlaceholderViewHolder(view) TopSitePagerViewHolder.LAYOUT_ID -> TopSitePagerViewHolder( view = view, - store = components.appStore, + appStore = components.appStore, viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, ) diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/DefaultTopSitesView.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/DefaultTopSitesView.kt index c1c68d330..f13c4107d 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/DefaultTopSitesView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/DefaultTopSitesView.kt @@ -12,12 +12,12 @@ import org.mozilla.fenix.ext.sort import org.mozilla.fenix.utils.Settings class DefaultTopSitesView( - val store: AppStore, + val appStore: AppStore, val settings: Settings, ) : TopSitesView { override fun displayTopSites(topSites: List) { - store.dispatch( + appStore.dispatch( AppAction.TopSitesChange( if (!settings.showContileFeature) { topSites diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt index 469362cdc..d9c4cfe9e 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt @@ -39,7 +39,7 @@ import org.mozilla.fenix.utils.view.ViewHolder @SuppressLint("ClickableViewAccessibility") class TopSiteItemViewHolder( view: View, - store: AppStore, + appStore: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ViewHolder(view) { @@ -78,7 +78,7 @@ class TopSiteItemViewHolder( true } - store.flowScoped(viewLifecycleOwner) { flow -> + appStore.flowScoped(viewLifecycleOwner) { flow -> flow.map { state -> state.wallpaperState } .ifChanged() .collect { currentState -> diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt index cf0db7220..1c9a2784a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitePagerViewHolder.kt @@ -19,13 +19,13 @@ import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor class TopSitePagerViewHolder( view: View, - store: AppStore, + appStore: AppStore, viewLifecycleOwner: LifecycleOwner, interactor: TopSiteInteractor, ) : RecyclerView.ViewHolder(view) { private val binding = ComponentTopSitesPagerBinding.bind(view) - private val topSitesPagerAdapter = TopSitesPagerAdapter(store, viewLifecycleOwner, interactor) + private val topSitesPagerAdapter = TopSitesPagerAdapter(appStore, viewLifecycleOwner, interactor) private val pageIndicator = binding.pageIndicator private var currentPage = 0 diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt index 4cd719216..e3a29d22a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteViewHolder.kt @@ -16,12 +16,12 @@ import org.mozilla.fenix.utils.AccessibilityGridLayoutManager class TopSiteViewHolder( view: View, - store: AppStore, + appStore: AppStore, viewLifecycleOwner: LifecycleOwner, interactor: TopSiteInteractor, ) : RecyclerView.ViewHolder(view) { - private val topSitesAdapter = TopSitesAdapter(store, viewLifecycleOwner, interactor) + private val topSitesAdapter = TopSitesAdapter(appStore, viewLifecycleOwner, interactor) val binding = ComponentTopSitesBinding.bind(view) init { diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt index d68452534..9bd5a5711 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesAdapter.kt @@ -15,14 +15,14 @@ import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.perf.StartupTimeline class TopSitesAdapter( - private val store: AppStore, + private val appStore: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ListAdapter(TopSitesDiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteItemViewHolder { val view = LayoutInflater.from(parent.context) .inflate(TopSiteItemViewHolder.LAYOUT_ID, parent, false) - return TopSiteItemViewHolder(view, store, viewLifecycleOwner, interactor) + return TopSiteItemViewHolder(view, appStore, viewLifecycleOwner, interactor) } override fun onBindViewHolder(holder: TopSiteItemViewHolder, position: Int) { diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt index 1785f1477..0a56a0c9c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSitesPagerAdapter.kt @@ -17,7 +17,7 @@ import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.topsites.TopSitePagerViewHolder.Companion.TOP_SITES_PER_PAGE class TopSitesPagerAdapter( - private val store: AppStore, + private val appStore: AppStore, private val viewLifecycleOwner: LifecycleOwner, private val interactor: TopSiteInteractor, ) : ListAdapter, TopSiteViewHolder>(TopSiteListDiffCallback) { @@ -25,7 +25,7 @@ class TopSitesPagerAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteViewHolder { val view = LayoutInflater.from(parent.context) .inflate(TopSiteViewHolder.LAYOUT_ID, parent, false) - return TopSiteViewHolder(view, store, viewLifecycleOwner, interactor) + return TopSiteViewHolder(view, appStore, viewLifecycleOwner, interactor) } override fun onBindViewHolder( diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index ad66e7e7a..30dd45567 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -26,7 +26,7 @@ import java.util.Date * Contains use cases related to the wallpaper feature. * * @param context Used for various file and configuration checks. - * @param store Will receive dispatches of metadata updates like the currently selected wallpaper. + * @param appStore Will receive dispatches of metadata updates like the currently selected wallpaper. * @param client Handles downloading wallpapers and their metadata. * @param storageRootDirectory The top level app-local storage directory. * @param currentLocale The locale currently being used on the device. @@ -38,7 +38,7 @@ import java.util.Date */ class WallpapersUseCases( context: Context, - store: AppStore, + appStore: AppStore, client: Client, storageRootDirectory: File, currentLocale: String, @@ -54,7 +54,7 @@ class WallpapersUseCases( selectWallpaper::invoke, ) DefaultInitializeWallpaperUseCase( - store = store, + appStore = appStore, downloader = downloader, fileManager = fileManager, metadataFetcher = metadataFetcher, @@ -66,7 +66,7 @@ class WallpapersUseCases( val fileManager = LegacyWallpaperFileManager(storageRootDirectory) val downloader = LegacyWallpaperDownloader(context, client) LegacyInitializeWallpaperUseCase( - store = store, + appStore = appStore, downloader = downloader, fileManager = fileManager, settings = context.settings(), @@ -90,9 +90,9 @@ class WallpapersUseCases( } val selectWallpaper: SelectWallpaperUseCase by lazy { if (FeatureFlags.wallpaperV2Enabled) { - DefaultSelectWallpaperUseCase(context.settings(), store, fileManager, downloader) + DefaultSelectWallpaperUseCase(context.settings(), appStore, fileManager, downloader) } else { - LegacySelectWallpaperUseCase(context.settings(), store) + LegacySelectWallpaperUseCase(context.settings(), appStore) } } @@ -109,7 +109,7 @@ class WallpapersUseCases( @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal class LegacyInitializeWallpaperUseCase( - private val store: AppStore, + private val appStore: AppStore, private val downloader: LegacyWallpaperDownloader, private val fileManager: LegacyWallpaperFileManager, private val settings: Settings, @@ -119,7 +119,7 @@ class WallpapersUseCases( /** * Downloads the currently available wallpaper metadata from a remote source. - * Updates the [store] with that metadata and with the selected wallpaper found in storage. + * Updates the [appStore] with that metadata and with the selected wallpaper found in storage. * Removes any unused promotional or time-limited assets from local storage. * Should usually be called early the app's lifetime to ensure that metadata and thumbnails * are available as soon as they are needed. @@ -131,7 +131,7 @@ class WallpapersUseCases( withContext(Dispatchers.IO) { val dispatchedCurrent = Wallpaper.getCurrentWallpaperFromSettings(settings)?.let { // Dispatch this ASAP so the home screen can render. - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) true } ?: false val availableWallpapers = possibleWallpapers.getAvailableWallpapers() @@ -145,9 +145,9 @@ class WallpapersUseCases( possibleWallpapers, ) downloadAllRemoteWallpapers(availableWallpapers) - store.dispatch(AppAction.WallpaperAction.UpdateAvailableWallpapers(availableWallpapers)) + appStore.dispatch(AppAction.WallpaperAction.UpdateAvailableWallpapers(availableWallpapers)) if (!dispatchedCurrent) { - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(currentWallpaper)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(currentWallpaper)) } } } @@ -237,7 +237,7 @@ class WallpapersUseCases( @Suppress("LongParameterList") @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal class DefaultInitializeWallpaperUseCase( - private val store: AppStore, + private val appStore: AppStore, private val downloader: WallpaperDownloader, private val fileManager: WallpaperFileManager, private val metadataFetcher: WallpaperMetadataFetcher, @@ -247,7 +247,7 @@ class WallpapersUseCases( ) : InitializeWallpapersUseCase { override suspend fun invoke() { Wallpaper.getCurrentWallpaperFromSettings(settings)?.let { - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) } val currentWallpaperName = if (settings.shouldMigrateLegacyWallpaper) { val migratedWallpaperName = @@ -267,7 +267,7 @@ class WallpapersUseCases( // Dispatching this early will make it accessible to the home screen ASAP. If it has been // dispatched above, we may still need to update other metadata about it. - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(currentWallpaper)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(currentWallpaper)) fileManager.clean( currentWallpaper, @@ -280,7 +280,7 @@ class WallpapersUseCases( } val defaultIncluded = listOf(Wallpaper.Default) + wallpapersWithUpdatedThumbnailState - store.dispatch(AppAction.WallpaperAction.UpdateAvailableWallpapers(defaultIncluded)) + appStore.dispatch(AppAction.WallpaperAction.UpdateAvailableWallpapers(defaultIncluded)) } private fun Wallpaper.isExpired(): Boolean = when (this) { @@ -445,10 +445,10 @@ class WallpapersUseCases( @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal class LegacySelectWallpaperUseCase( private val settings: Settings, - private val store: AppStore, + private val appStore: AppStore, ) : SelectWallpaperUseCase { /** - * Select a new wallpaper. Storage and the store will be updated appropriately. + * Select a new wallpaper. Storage and the app store will be updated appropriately. * * @param wallpaper The selected wallpaper. */ @@ -457,7 +457,7 @@ class WallpapersUseCases( settings.currentWallpaperTextColor = wallpaper.textColor ?: 0 settings.currentWallpaperCardColorLight = wallpaper.cardColorLight ?: 0 settings.currentWallpaperCardColorDark = wallpaper.cardColorDark ?: 0 - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) return Wallpaper.ImageFileState.Downloaded } } @@ -465,12 +465,12 @@ class WallpapersUseCases( @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal class DefaultSelectWallpaperUseCase( private val settings: Settings, - private val store: AppStore, + private val appStore: AppStore, private val fileManager: WallpaperFileManager, private val downloader: WallpaperDownloader, ) : SelectWallpaperUseCase { /** - * Select a new wallpaper. Storage and the store will be updated appropriately. + * Select a new wallpaper. Storage and the app store will be updated appropriately. * * @param wallpaper The selected wallpaper. */ @@ -496,11 +496,11 @@ class WallpapersUseCases( settings.currentWallpaperTextColor = wallpaper.textColor ?: 0L settings.currentWallpaperCardColorLight = wallpaper.cardColorLight ?: 0L settings.currentWallpaperCardColorDark = wallpaper.cardColorDark ?: 0L - store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) + appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } private fun dispatchDownloadState(wallpaper: Wallpaper, downloadState: Wallpaper.ImageFileState) { - store.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(wallpaper, downloadState)) + appStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(wallpaper, downloadState)) } } } diff --git a/app/src/test/java/org/mozilla/fenix/components/appstate/AppActionTest.kt b/app/src/test/java/org/mozilla/fenix/components/appstate/AppActionTest.kt index 8bbd4f551..f953b271e 100644 --- a/app/src/test/java/org/mozilla/fenix/components/appstate/AppActionTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/appstate/AppActionTest.kt @@ -14,14 +14,14 @@ import org.mozilla.fenix.components.AppStore class AppActionTest { private val capture = CaptureActionsMiddleware() - private val store = AppStore(middlewares = listOf(capture)) + private val appStore = AppStore(middlewares = listOf(capture)) @Test fun `WHEN UpdateInactiveExpanded is dispatched THEN update inactiveTabsExpanded`() { - assertFalse(store.state.inactiveTabsExpanded) + assertFalse(appStore.state.inactiveTabsExpanded) - store.dispatch(AppAction.UpdateInactiveExpanded(true)).joinBlocking() + appStore.dispatch(AppAction.UpdateInactiveExpanded(true)).joinBlocking() - assertTrue(store.state.inactiveTabsExpanded) + assertTrue(appStore.state.inactiveTabsExpanded) } } diff --git a/app/src/test/java/org/mozilla/fenix/gleanplumb/DefaultMessageControllerTest.kt b/app/src/test/java/org/mozilla/fenix/gleanplumb/DefaultMessageControllerTest.kt index 04c2e5233..68fd418a0 100644 --- a/app/src/test/java/org/mozilla/fenix/gleanplumb/DefaultMessageControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/gleanplumb/DefaultMessageControllerTest.kt @@ -36,19 +36,19 @@ class DefaultMessageControllerTest { private val activity: HomeActivity = mockk(relaxed = true) private val storageNimbus: NimbusMessagingStorage = mockk(relaxed = true) private lateinit var controller: DefaultMessageController - private val store: AppStore = mockk(relaxed = true) + private val appStore: AppStore = mockk(relaxed = true) @Before fun setup() { controller = DefaultMessageController( messagingStorage = storageNimbus, - appStore = store, + appStore = appStore, homeActivity = activity, ) } @Test - fun `WHEN calling onMessagePressed THEN update the store and handle the action`() { + fun `WHEN calling onMessagePressed THEN update the app store and handle the action`() { val customController = spyk(controller) val message = mockMessage() every { customController.handleAction(any()) } returns mockk() @@ -63,7 +63,7 @@ class DefaultMessageControllerTest { assertEquals(message.id, event.single().extra!!["message_key"]) assertEquals("uuid", event.single().extra!!["action_uuid"]) verify { customController.handleAction(any()) } - verify { store.dispatch(MessageClicked(message)) } + verify { appStore.dispatch(MessageClicked(message)) } } @Test @@ -99,7 +99,7 @@ class DefaultMessageControllerTest { val event = Messaging.messageDismissed.testGetValue()!! assertEquals(1, event.size) assertEquals(message.id, event.single().extra!!["message_key"]) - verify { store.dispatch(AppAction.MessagingAction.MessageDismissed(message)) } + verify { appStore.dispatch(AppAction.MessagingAction.MessageDismissed(message)) } } private fun mockMessage(data: MessageData = MessageData()) = Message( diff --git a/app/src/test/java/org/mozilla/fenix/gleanplumb/MessagingFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/gleanplumb/MessagingFeatureTest.kt index 558ea209d..e620e08ad 100644 --- a/app/src/test/java/org/mozilla/fenix/gleanplumb/MessagingFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/gleanplumb/MessagingFeatureTest.kt @@ -20,11 +20,11 @@ class MessagingFeatureTest { @Test fun `WHEN start is called THEN evaluate messages`() { - val store: AppStore = spyk(AppStore()) - val binding = MessagingFeature(store) + val appStore: AppStore = spyk(AppStore()) + val binding = MessagingFeature(appStore) binding.start() - verify { store.dispatch(MessagingAction.Evaluate) } + verify { appStore.dispatch(MessagingAction.Evaluate) } } } diff --git a/app/src/test/java/org/mozilla/fenix/gleanplumb/state/MessagingMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/gleanplumb/state/MessagingMiddlewareTest.kt index f95255ba0..e54424548 100644 --- a/app/src/test/java/org/mozilla/fenix/gleanplumb/state/MessagingMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/gleanplumb/state/MessagingMiddlewareTest.kt @@ -44,7 +44,7 @@ class MessagingMiddlewareTest { @get:Rule val coroutinesTestRule = MainCoroutineRule() private val coroutineScope = coroutinesTestRule.scope - private lateinit var store: AppStore + private lateinit var appStore: AppStore private lateinit var middleware: MessagingMiddleware private lateinit var messagingStorage: NimbusMessagingStorage private lateinit var middlewareContext: MiddlewareContext @@ -54,10 +54,10 @@ class MessagingMiddlewareTest { @Before fun setUp() { - store = mockk(relaxed = true) + appStore = mockk(relaxed = true) messagingStorage = mockk(relaxed = true) middlewareContext = mockk(relaxed = true) - every { middlewareContext.store } returns store + every { middlewareContext.store } returns appStore middleware = MessagingMiddleware( messagingStorage, @@ -73,7 +73,7 @@ class MessagingMiddlewareTest { middleware.invoke(middlewareContext, {}, Restore) - verify { store.dispatch(UpdateMessages(messages)) } + verify { appStore.dispatch(UpdateMessages(messages)) } } @Test diff --git a/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt index 46e94fbb4..3339df1ee 100644 --- a/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt @@ -36,25 +36,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf() val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, store.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) } @Test @@ -63,25 +63,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf("https://www.github.org/".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, store.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) } @Test @@ -90,25 +90,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf("https://github.com/mozilla-mobile/fenix".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, store.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) } @Test @@ -117,25 +117,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf("https://www.mozilla.org/".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(store.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.recentBookmarks.isEmpty()) } @Test @@ -146,26 +146,26 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(blockedUrl.stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = updatedRecentTabs, recentBookmarks = updatedBookmarks, - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(store.state.recentBookmarks.isEmpty()) - assertTrue(store.state.recentTabs.isEmpty()) + assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.recentTabs.isEmpty()) } @Test @@ -184,26 +184,26 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(blockedUrl.stripAndHash()) every { mockSettings.frecencyFilterQuery } returns "" val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = updatedRecentTabs, recentBookmarks = updatedBookmarks, - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(unblockedBookmark, store.state.recentBookmarks[0]) - assertEquals(unblockedRecentTab, store.state.recentTabs[0]) + assertEquals(unblockedBookmark, appStore.state.recentBookmarks[0]) + assertEquals(unblockedRecentTab, appStore.state.recentTabs[0]) } @Test @@ -216,12 +216,12 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf() andThen setOf(removedUrl.stripAndHash()) every { mockSettings.homescreenBlocklist = capture(updateSlot) } returns Unit val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(recentBookmarks = listOf(removedBookmark)), middlewares = listOf(middleware, captureMiddleware), ) - store.dispatch( + appStore.dispatch( AppAction.RemoveRecentBookmark(removedBookmark), ).joinBlocking() @@ -237,25 +237,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf("https://$host".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(store.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.recentBookmarks.isEmpty()) } @Test @@ -265,25 +265,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(host.stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(store.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.recentBookmarks.isEmpty()) } @Test @@ -293,25 +293,25 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf("https://$host".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.Change( - topSites = store.state.topSites, - mode = store.state.mode, - collections = store.state.collections, - showCollectionPlaceholder = store.state.showCollectionPlaceholder, - recentTabs = store.state.recentTabs, + topSites = appStore.state.topSites, + mode = appStore.state.mode, + collections = appStore.state.collections, + showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, + recentTabs = appStore.state.recentTabs, recentBookmarks = listOf(updatedBookmark), - recentHistory = store.state.recentHistory, - recentSyncedTabState = store.state.recentSyncedTabState, + recentHistory = appStore.state.recentHistory, + recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(store.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.recentBookmarks.isEmpty()) } @Test @@ -335,12 +335,12 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(blockedHost.stripAndHash()) every { mockSettings.frecencyFilterQuery } returns "" val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.RecentSyncedTabStateChange( RecentSyncedTabState.Success( listOf( @@ -353,7 +353,7 @@ class BlocklistMiddlewareTest { assertEquals( allowedTab, - (store.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.single(), + (appStore.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.single(), ) } @@ -362,18 +362,18 @@ class BlocklistMiddlewareTest { val blockedHost = "https://www.mozilla.org" every { mockSettings.homescreenBlocklist } returns setOf(blockedHost.stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.RecentSyncedTabStateChange( RecentSyncedTabState.None, ), ).joinBlocking() - assertEquals(RecentSyncedTabState.None, store.state.recentSyncedTabState) + assertEquals(RecentSyncedTabState.None, appStore.state.recentSyncedTabState) } @Test @@ -389,12 +389,12 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(blockedHost.stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) - val store = AppStore( + val appStore = AppStore( AppState(), middlewares = listOf(middleware), ) - store.dispatch( + appStore.dispatch( AppAction.RecentSyncedTabStateChange( RecentSyncedTabState.Success( listOf(blockedTab), @@ -404,7 +404,7 @@ class BlocklistMiddlewareTest { assertEquals( RecentSyncedTabState.None, - store.state.recentSyncedTabState, + appStore.state.recentSyncedTabState, ) } @@ -434,7 +434,7 @@ class BlocklistMiddlewareTest { previewImageUrl = null, ), ) - val store = AppStore( + val appStore = AppStore( AppState(recentSyncedTabState = RecentSyncedTabState.Success(currentTabs)), middlewares = listOf(BlocklistMiddleware(blocklistHandler)), ) @@ -443,7 +443,7 @@ class BlocklistMiddlewareTest { every { mockSettings.homescreenBlocklist } returns setOf(tabUrls[0].stripAndHash()) every { mockSettings.frecencyFilterQuery } returns "" - store.dispatch( + appStore.dispatch( AppAction.RemoveRecentSyncedTab( currentTabs.first(), ), @@ -451,12 +451,12 @@ class BlocklistMiddlewareTest { assertEquals( 2, - (store.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.size, + (appStore.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.size, ) assertEquals(setOf(tabUrls[0].stripAndHash()), updateSlot.captured) assertEquals( currentTabs[1], - (store.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.firstOrNull(), + (appStore.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.firstOrNull(), ) } } diff --git a/app/src/test/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessorTest.kt b/app/src/test/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessorTest.kt index 43854c41c..182604d9f 100644 --- a/app/src/test/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessorTest.kt @@ -23,25 +23,25 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @RunWith(FenixRobolectricTestRunner::class) class CrashReporterIntentProcessorTest { - private val store: AppStore = mockk(relaxed = true) + private val appStore: AppStore = mockk(relaxed = true) private val navController: NavController = mockk() private val out: Intent = mockk() @Test fun `GIVEN a blank Intent WHEN processing it THEN do nothing and return false`() { - val processor = CrashReporterIntentProcessor(store) + val processor = CrashReporterIntentProcessor(appStore) val result = processor.process(Intent(), navController, out) assertFalse(result) verify { navController wasNot Called } verify { out wasNot Called } - verify { store wasNot Called } + verify { appStore wasNot Called } } @Test fun `GIVEN a crash Intent WHEN processing it THEN update crash details and return true`() { - val processor = CrashReporterIntentProcessor(store) + val processor = CrashReporterIntentProcessor(appStore) val intent = Intent() val crash = mockk(relaxed = true) @@ -54,7 +54,7 @@ class CrashReporterIntentProcessorTest { assertTrue(result) verify { navController wasNot Called } verify { out wasNot Called } - verify { store.dispatch(AppAction.AddNonFatalCrash(crash)) } + verify { appStore.dispatch(AppAction.AddNonFatalCrash(crash)) } } } } diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt index e318ac1fa..806344111 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolderTest.kt @@ -38,7 +38,7 @@ class TopSiteItemViewHolderTest { private lateinit var binding: TopSiteItemBinding private lateinit var interactor: TopSiteInteractor private lateinit var lifecycleOwner: LifecycleOwner - private lateinit var store: AppStore + private lateinit var appStore: AppStore private val pocket = TopSite.Default( id = 1L, @@ -52,14 +52,14 @@ class TopSiteItemViewHolderTest { binding = TopSiteItemBinding.inflate(LayoutInflater.from(testContext)) interactor = mockk(relaxed = true) lifecycleOwner = mockk(relaxed = true) - store = mockk(relaxed = true) + appStore = mockk(relaxed = true) every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true)) } @Test fun `calls interactor on click`() { - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pocket, position = 0) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind(pocket, position = 0) binding.root.performClick() verify { interactor.onSelectTopSite(pocket, position = 0) } @@ -68,7 +68,7 @@ class TopSiteItemViewHolderTest { @Test fun `calls interactor on long click`() { every { testContext.components.analytics } returns mockk(relaxed = true) - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pocket, position = 0) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind(pocket, position = 0) binding.root.performLongClick() verify { interactor.onTopSiteMenuOpened() } @@ -83,7 +83,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(defaultTopSite, position = 0) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind(defaultTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNotNull(pinIndicator) @@ -98,7 +98,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(pinnedTopSite, position = 0) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind(pinnedTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNotNull(pinIndicator) @@ -113,7 +113,7 @@ class TopSiteItemViewHolderTest { createdAt = 0, ) - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).bind(frecentTopSite, position = 0) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind(frecentTopSite, position = 0) val pinIndicator = binding.topSiteTitle.compoundDrawables[0] assertNull(pinIndicator) @@ -147,7 +147,7 @@ class TopSiteItemViewHolderTest { topSiteImpressionSubmitted = true } - TopSiteItemViewHolder(binding.root, store, lifecycleOwner, interactor).submitTopSitesImpressionPing(topSite, position) + TopSiteItemViewHolder(binding.root, appStore, lifecycleOwner, interactor).submitTopSitesImpressionPing(topSite, position) assertNotNull(TopSites.contileImpression.testGetValue()) diff --git a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt index a270597e0..c7bb4d13c 100644 --- a/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/topsites/TopSiteViewHolderTest.kt @@ -24,19 +24,19 @@ class TopSiteViewHolderTest { private lateinit var binding: ComponentTopSitesBinding private lateinit var lifecycleOwner: LifecycleOwner private lateinit var interactor: TopSiteInteractor - private lateinit var store: AppStore + private lateinit var appStore: AppStore @Before fun setup() { binding = ComponentTopSitesBinding.inflate(LayoutInflater.from(testContext)) interactor = mockk(relaxed = true) lifecycleOwner = mockk(relaxed = true) - store = mockk(relaxed = true) + appStore = mockk(relaxed = true) } @Test fun `binds list of top sites`() { - TopSiteViewHolder(binding.root, store, lifecycleOwner, interactor).bind( + TopSiteViewHolder(binding.root, appStore, lifecycleOwner, interactor).bind( listOf( TopSite.Default( id = 1L, diff --git a/app/src/test/java/org/mozilla/fenix/settings/HomeSettingsFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/settings/HomeSettingsFragmentTest.kt index fc8675b42..2d1240cec 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/HomeSettingsFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/HomeSettingsFragmentTest.kt @@ -45,7 +45,7 @@ internal class HomeSettingsFragmentTest { private lateinit var appPrefs: SharedPreferences private lateinit var appPrefsEditor: SharedPreferences.Editor private lateinit var pocketService: PocketStoriesService - private lateinit var store: AppStore + private lateinit var appStore: AppStore @Before fun setup() { @@ -60,10 +60,10 @@ internal class HomeSettingsFragmentTest { every { preferences } returns appPrefs } every { any().settings() } returns appSettings - store = mockk(relaxed = true) + appStore = mockk(relaxed = true) pocketService = mockk(relaxed = true) every { any().components } returns mockk { - every { appStore } returns store + every { appStore } returns this@HomeSettingsFragmentTest.appStore every { core.pocketStoriesService } returns pocketService } @@ -149,6 +149,6 @@ internal class HomeSettingsFragmentTest { assertTrue(result) verify { appPrefsEditor.putBoolean(testContext.getString(R.string.pref_key_pocket_sponsored_stories), false) } verify { pocketService.deleteProfile() } - verify { store.dispatch(AppAction.PocketSponsoredStoriesChange(emptyList())) } + verify { appStore.dispatch(AppAction.PocketSponsoredStoriesChange(emptyList())) } } } diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt index 9a6993bcd..7163ddfdf 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt @@ -199,7 +199,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN legacy use case and a wallpaper has not been selected WHEN invoking initialize use case THEN store contains default`() = runTest { + fun `GIVEN legacy use case and a wallpaper has not been selected WHEN invoking initialize use case THEN app store contains default`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) } @@ -220,7 +220,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN legacy use case a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the store`() = runTest { + fun `GIVEN legacy use case a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the app store`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) @@ -402,7 +402,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN available wallpapers WHEN invoking initialize use case THEN thumbnails downloaded and the store state is updated to reflect that`() = runTest { + fun `GIVEN available wallpapers WHEN invoking initialize use case THEN thumbnails downloaded and the app store state is updated to reflect that`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) } @@ -433,7 +433,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN thumbnail download fails WHEN invoking initialize use case THEN the store state is updated to reflect that`() = runTest { + fun `GIVEN thumbnail download fails WHEN invoking initialize use case THEN the app store state is updated to reflect that`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) } @@ -460,7 +460,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN a wallpaper has not been selected WHEN invoking initialize use case THEN store contains default`() = runTest { + fun `GIVEN a wallpaper has not been selected WHEN invoking initialize use case THEN app store contains default`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) } @@ -484,7 +484,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the store`() = runTest { + fun `GIVEN a wallpaper is selected and there are available wallpapers WHEN invoking initialize use case THEN these are dispatched to the app store`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) @@ -514,7 +514,7 @@ class WallpapersUseCasesTest { } @Test - fun `WHEN legacy selected wallpaper usecase invoked THEN storage updated and store receives dispatch`() = runTest { + fun `WHEN legacy selected wallpaper usecase invoked THEN storage updated and app store receives dispatch`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") every { mockSettings.currentWallpaperName = any() } just Runs @@ -532,7 +532,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN wallpaper downloaded WHEN selecting a wallpaper THEN storage updated and store receives dispatch`() = runTest { + fun `GIVEN wallpaper downloaded WHEN selecting a wallpaper THEN storage updated and app store receives dispatch`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") val slot = slot() coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null @@ -554,10 +554,10 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and download succeeds THEN storage updated and store receives dispatch`() = runTest { + fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and download succeeds THEN storage updated and app store receives dispatch`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") val slot = slot() - val mockStore = mockk(relaxed = true) + val mockAppStore = mockk(relaxed = true) coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null every { mockSettings.currentWallpaperName } returns "" every { mockSettings.currentWallpaperName = capture(slot) } just runs @@ -566,22 +566,22 @@ class WallpapersUseCasesTest { val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( mockSettings, - mockStore, + mockAppStore, mockFileManager, mockDownloader, ).invoke(selectedWallpaper) - verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) } - verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloaded)) } - verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(selectedWallpaper)) } + verify { mockAppStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) } + verify { mockAppStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloaded)) } + verify { mockAppStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(selectedWallpaper)) } assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Downloaded) } @Test - fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and any download fails THEN wallpaper not set and store receives dispatch`() = runTest { + fun `GIVEN wallpaper is not downloaded WHEN selecting a wallpaper and any download fails THEN wallpaper not set and app store receives dispatch`() = runTest { val selectedWallpaper = makeFakeRemoteWallpaper(TimeRelation.LATER, "selected") val slot = slot() - val mockStore = mockk(relaxed = true) + val mockAppStore = mockk(relaxed = true) coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns null every { mockSettings.currentWallpaperName } returns "" every { mockSettings.currentWallpaperName = capture(slot) } just runs @@ -590,23 +590,23 @@ class WallpapersUseCasesTest { val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( mockSettings, - mockStore, + mockAppStore, mockFileManager, mockDownloader, ).invoke(selectedWallpaper) - verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) } - verify { mockStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Error)) } + verify { mockAppStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Downloading)) } + verify { mockAppStore.dispatch(AppAction.WallpaperAction.UpdateWallpaperDownloadState(selectedWallpaper, Wallpaper.ImageFileState.Error)) } assertEquals(wallpaperFileState, Wallpaper.ImageFileState.Error) } @Test fun `GIVEN a wallpaper with no text color WHEN it is is selected THEN persist the wallpaper name and missing text color and dispatch the update`() { every { mockSettings.currentWallpaperName = any() } just Runs - val store = mockk(relaxed = true) + val appStore = mockk(relaxed = true) val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( settings = mockSettings, - store = store, + appStore = appStore, fileManager = mockk(), downloader = mockk(), ) @@ -621,16 +621,16 @@ class WallpapersUseCasesTest { verify { mockSettings.currentWallpaperName = "Test" } verify { mockSettings.currentWallpaperTextColor = 0L } - verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } + verify { appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } } @Test fun `GIVEN a wallpaper with available text color WHEN it is is selected THEN persist the wallpaper name and text color and dispatch the update`() { every { mockSettings.currentWallpaperName = any() } just Runs - val store = mockk(relaxed = true) + val appStore = mockk(relaxed = true) val wallpaperFileState = WallpapersUseCases.DefaultSelectWallpaperUseCase( settings = mockSettings, - store = store, + appStore = appStore, fileManager = mockk(), downloader = mockk(), ) @@ -645,7 +645,7 @@ class WallpapersUseCasesTest { verify { mockSettings.currentWallpaperName = "Test" } verify { mockSettings.currentWallpaperTextColor = 321L } - verify { store.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } + verify { appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(wallpaper)) } } private enum class TimeRelation { From 9fd2d20310b53d5da948c8f137d8ab3ed7a7ae82 Mon Sep 17 00:00:00 2001 From: Alexander Gramiak Date: Sat, 15 Oct 2022 18:49:17 -0600 Subject: [PATCH 237/407] For #16162: Simplify site addresses in saved logins view This is what Firefox Desktop does. --- .../mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt index c387a2ac9..198fb83fc 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/view/LoginsListViewHolder.kt @@ -9,6 +9,7 @@ import androidx.core.view.isVisible import org.mozilla.fenix.databinding.LoginsItemBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView +import org.mozilla.fenix.ext.simplifiedUrl import org.mozilla.fenix.settings.logins.SavedLogin import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor import org.mozilla.fenix.utils.view.ViewHolder @@ -29,7 +30,7 @@ class LoginsListViewHolder( timeLastUsed = item.timeLastUsed, ) val binding = LoginsItemBinding.bind(view) - binding.webAddressView.text = item.origin + binding.webAddressView.text = item.origin.simplifiedUrl() binding.usernameView.isVisible = item.username.isNotEmpty() binding.usernameView.text = item.username From 5c2679006d9d6c2c4830597b1db9f4ee9c25f1e9 Mon Sep 17 00:00:00 2001 From: Alexander Gramiak Date: Sat, 15 Oct 2022 18:49:53 -0600 Subject: [PATCH 238/407] Add and update tests for login address view holder --- .../logins/LoginsListViewHolderTest.kt | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsListViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsListViewHolderTest.kt index e031ec53c..b3d99e287 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsListViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/logins/LoginsListViewHolderTest.kt @@ -25,7 +25,7 @@ class LoginsListViewHolderTest { private val baseLogin = SavedLogin( guid = "abcd", - origin = "mozilla.org", + origin = "https://www.mozilla.org", username = "admin", password = "password", timeLastUsed = 100L, @@ -33,32 +33,40 @@ class LoginsListViewHolderTest { private lateinit var interactor: SavedLoginsInteractor private lateinit var binding: LoginsItemBinding + private lateinit var holder: LoginsListViewHolder @Before fun setup() { binding = LoginsItemBinding.inflate(LayoutInflater.from(testContext)) interactor = mockk(relaxed = true) + holder = LoginsListViewHolder( + binding.root, + interactor, + ) every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true)) } @Test fun `bind url and username`() { - val holder = LoginsListViewHolder( - binding.root, - interactor, - ) holder.bind(baseLogin) assertEquals("mozilla.org", binding.webAddressView.text) assertEquals("admin", binding.usernameView.text) } + @Test + fun `GIVEN url has a mobile prefix WHEN url is binded THEN mobile prefix is stripped`() { + holder.bind(baseLogin.copy(origin = "https://m.mozilla.org")) + + assertEquals("mozilla.org", binding.webAddressView.text) + + holder.bind(baseLogin.copy(origin = "https://mobile.mozilla.org")) + + assertEquals("mozilla.org", binding.webAddressView.text) + } + @Test fun `call interactor on click`() { - val holder = LoginsListViewHolder( - binding.root, - interactor, - ) holder.bind(baseLogin) binding.root.performClick() From 5e44259f173971d04f36b1e84eecc40ff071b510 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 27 Oct 2022 15:36:45 +0000 Subject: [PATCH 239/407] Update to Android-Components 108.0.20221027143133. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 7946c2bb9..9485fb20c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221026223604" + const val VERSION = "108.0.20221027143133" } From 5f51a6242485d062c0279a1a5061bcbd522f3d9a Mon Sep 17 00:00:00 2001 From: chettas Date: Tue, 18 Oct 2022 13:25:46 +0530 Subject: [PATCH 240/407] For #27336: Combine Google package name regex --- build.gradle | 16 ++++------------ buildSrc/src/main/java/Dependencies.kt | 11 +---------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/build.gradle b/build.gradle index 9bc9853df..3241aff78 100644 --- a/build.gradle +++ b/build.gradle @@ -34,10 +34,8 @@ buildscript { content { // Improve performance: only check google maven for google deps. includeGroupByRegex RepoMatching.androidx - includeGroupByRegex RepoMatching.comGoogleAndroid - includeGroupByRegex RepoMatching.comGoogleFirebase - includeGroupByRegex RepoMatching.comGoogleTesting includeGroupByRegex RepoMatching.comAndroid + includeGroupByRegex RepoMatching.comGoogle } } } @@ -54,10 +52,8 @@ buildscript { // Improve security: don't search deps with known repos. excludeGroupByRegex RepoMatching.mozilla excludeGroupByRegex RepoMatching.androidx - excludeGroupByRegex RepoMatching.comGoogleAndroid - excludeGroupByRegex RepoMatching.comGoogleFirebase - excludeGroupByRegex RepoMatching.comGoogleTesting excludeGroupByRegex RepoMatching.comAndroid + excludeGroupByRegex RepoMatching.comGoogle } } } @@ -114,10 +110,8 @@ allprojects { content { // Improve performance: only check google maven for google deps. includeGroupByRegex RepoMatching.androidx - includeGroupByRegex RepoMatching.comGoogleAndroid - includeGroupByRegex RepoMatching.comGoogleFirebase - includeGroupByRegex RepoMatching.comGoogleTesting includeGroupByRegex RepoMatching.comAndroid + includeGroupByRegex RepoMatching.comGoogle } } } @@ -134,10 +128,8 @@ allprojects { // Improve security: don't search deps with known repos. excludeGroupByRegex RepoMatching.mozilla excludeGroupByRegex RepoMatching.androidx - excludeGroupByRegex RepoMatching.comGoogleAndroid - excludeGroupByRegex RepoMatching.comGoogleFirebase - excludeGroupByRegex RepoMatching.comGoogleTesting excludeGroupByRegex RepoMatching.comAndroid + excludeGroupByRegex RepoMatching.comGoogle } } } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 1fa8457be..855c1746a 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -281,14 +281,5 @@ object RepoMatching { const val mozilla = "org\\.mozilla\\..*" const val androidx = "androidx\\..*" const val comAndroid = "com\\.android.*" - const val comGoogleFirebase = "com\\.google\\.firebase" - const val comGoogleTesting = "com\\.google\\.testing\\..*" - - /** - * A matcher for com.google.android.* with one exception: the espresso-contrib dependency includes the - * accessibility-test-framework dependency, which is not available in the google repo. As such, we must - * explicitly exclude it from this regex so it can be found on Maven Central. Note that the transitive - * dependency com.google.guava is also not available on google's repo. - */ - const val comGoogleAndroid = "com\\.google\\.android\\..*" + const val comGoogle = "com\\.google\\..*" } From e8ef439469819b82f944f7e1e9158328171d0745 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 24 Oct 2022 17:28:18 -0400 Subject: [PATCH 241/407] Update Sentry to 6.6.0 --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 855c1746a..125a86840 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -14,7 +14,7 @@ object Versions { const val android_gradle_plugin = "7.3.0" const val android_lint_api = "30.3.0" - const val sentry = "6.4.2" + const val sentry = "6.6.0" const val leakcanary = "2.9.1" const val osslicenses_plugin = "0.10.4" const val detekt = "1.19.0" From 35e0afe329c88764c5098ee9cb19d002be927a71 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 25 Oct 2022 16:50:37 -0400 Subject: [PATCH 242/407] Close #24613: Remove history improvement feature flag --- .../java/org/mozilla/fenix/FeatureFlags.kt | 5 ---- .../history/PagedHistoryProvider.kt | 19 ++---------- .../home/recentvisits/RecentVisitsFeature.kt | 8 +---- .../library/bookmarks/BookmarkFragment.kt | 5 ---- .../fenix/library/history/HistoryFragment.kt | 5 ---- .../java/org/mozilla/fenix/utils/Settings.kt | 5 ++-- .../history/PagedHistoryProviderTest.kt | 6 ++-- .../recentvisits/RecentVisitsFeatureTest.kt | 29 ++++++++++--------- 8 files changed, 23 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index c17efab61..b1cfa8e71 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -92,11 +92,6 @@ object FeatureFlags { */ const val showHomeOnboarding = true - /** - * Enables history improvement features. - */ - const val historyImprovementFeatures = true - /** * Enables the Task Continuity enhancements. */ diff --git a/app/src/main/java/org/mozilla/fenix/components/history/PagedHistoryProvider.kt b/app/src/main/java/org/mozilla/fenix/components/history/PagedHistoryProvider.kt index d95a8c8ff..00cf6002b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/history/PagedHistoryProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/components/history/PagedHistoryProvider.kt @@ -11,7 +11,6 @@ import mozilla.components.concept.storage.HistoryMetadataKey import mozilla.components.concept.storage.VisitInfo import mozilla.components.concept.storage.VisitType import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.library.history.History import org.mozilla.fenix.library.history.HistoryItemTimeGroup import org.mozilla.fenix.utils.Settings.Companion.SEARCH_GROUP_MINIMUM_SITES @@ -86,7 +85,6 @@ interface PagedHistoryProvider { */ class DefaultPagedHistoryProvider( private val historyStorage: PlacesHistoryStorage, - private val historyImprovementFeatures: Boolean = FeatureFlags.historyImprovementFeatures, ) : PagedHistoryProvider { /** @@ -132,11 +130,7 @@ class DefaultPagedHistoryProvider( ) } .filter { - if (historyImprovementFeatures) { - it.items.size >= SEARCH_GROUP_MINIMUM_SITES - } else { - true - } + it.items.size >= SEARCH_GROUP_MINIMUM_SITES } .toList() } @@ -207,10 +201,7 @@ class DefaultPagedHistoryProvider( emptyList() } val historyMetadata = historyGroupsInOffset.flatMap { it.items } - - if (historyImprovementFeatures) { - history = history.distinctBy { Pair(it.historyTimeGroup, it.url) } - } + history = history.distinctBy { Pair(it.historyTimeGroup, it.url) } // Add all history items that are not in a group filtering out any matches with a history // metadata item. @@ -227,11 +218,7 @@ class DefaultPagedHistoryProvider( }, ) - return if (historyImprovementFeatures) { - result.sortedByDescending { it.visitedAt } - } else { - result.removeConsecutiveDuplicates().sortedByDescending { it.visitedAt } - } + return result.sortedByDescending { it.visitedAt } } private fun transformVisitInfoToHistoryItem(visit: VisitInfo): HistoryDB.Regular { diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeature.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeature.kt index af35ce52c..f1bdcd008 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeature.kt @@ -17,7 +17,6 @@ import mozilla.components.concept.storage.HistoryHighlightWeights import mozilla.components.concept.storage.HistoryMetadata import mozilla.components.concept.storage.HistoryMetadataStorage import mozilla.components.support.base.feature.LifecycleAwareFeature -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.home.HomeFragment @@ -52,7 +51,6 @@ class RecentVisitsFeature( private val historyHighlightsStorage: Lazy, private val scope: CoroutineScope, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, - private val historyImprovementFeatures: Boolean = FeatureFlags.historyImprovementFeatures, ) : LifecycleAwareFeature { private var job: Job? = null @@ -214,11 +212,7 @@ class RecentVisitsFeature( ) } .filter { - if (historyImprovementFeatures) { - it.groupItems.size >= SEARCH_GROUP_MINIMUM_SITES - } else { - true - } + it.groupItems.size >= SEARCH_GROUP_MINIMUM_SITES } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 1f9ff22ce..316228583 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -40,7 +40,6 @@ import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.telemetry.glean.private.NoExtras -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.BookmarksManagement import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.NavHostActivity @@ -183,10 +182,6 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan if (mode.showMenu) { inflater.inflate(R.menu.bookmarks_menu, menu) } - - if (!FeatureFlags.historyImprovementFeatures) { - menu.findItem(R.id.bookmark_search)?.isVisible = false - } } is BookmarkFragmentState.Mode.Selecting -> { if (mode.selectedItems.any { it.type != BookmarkNodeType.ITEM }) { diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index ecdb54868..5df4e92cd 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -38,7 +38,6 @@ import mozilla.components.service.fxa.sync.SyncReason import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.NavHostActivity import org.mozilla.fenix.R @@ -224,10 +223,6 @@ class HistoryFragment : LibraryPageFragment(), UserInteractionHandler, } else { inflater.inflate(R.menu.history_menu, menu) } - - if (!FeatureFlags.historyImprovementFeatures) { - menu.findItem(R.id.history_search)?.isVisible = false - } } override fun onMenuItemSelected(item: MenuItem): Boolean = when (item.itemId) { diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 675d626c0..7f76ccbba 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -31,7 +31,6 @@ import mozilla.components.support.locale.LocaleManager import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags -import org.mozilla.fenix.FeatureFlags.historyImprovementFeatures import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.metrics.MozillaProductDetector @@ -82,9 +81,9 @@ class Settings(private val appContext: Context) : PreferencesHolder { /** * The minimum number a search groups should contain. - * Filtering is applied depending on the [historyImprovementFeatures] flag value. */ - const val SEARCH_GROUP_MINIMUM_SITES: Int = 2 + @VisibleForTesting + internal var SEARCH_GROUP_MINIMUM_SITES: Int = 2 // The maximum number of top sites to display. const val TOP_SITES_MAX_COUNT = 16 diff --git a/app/src/test/java/org/mozilla/fenix/components/history/PagedHistoryProviderTest.kt b/app/src/test/java/org/mozilla/fenix/components/history/PagedHistoryProviderTest.kt index 2c6bff52f..ccdccba8e 100644 --- a/app/src/test/java/org/mozilla/fenix/components/history/PagedHistoryProviderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/history/PagedHistoryProviderTest.kt @@ -17,6 +17,7 @@ import mozilla.components.concept.storage.VisitType import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test +import org.mozilla.fenix.utils.Settings class PagedHistoryProviderTest { @@ -25,13 +26,13 @@ class PagedHistoryProviderTest { @Before fun setup() { storage = mockk() + Settings.SEARCH_GROUP_MINIMUM_SITES = 1 } @Test fun `getHistory uses getVisitsPaginated`() = runTest { val provider = DefaultPagedHistoryProvider( historyStorage = storage, - historyImprovementFeatures = false, ) val visitInfo1 = VisitInfo( @@ -148,7 +149,6 @@ class PagedHistoryProviderTest { fun `history metadata matching lower bound`() = runTest { val provider = DefaultPagedHistoryProvider( historyStorage = storage, - historyImprovementFeatures = false, ) // Oldest history visit on the page is 15 seconds (buffer time) newer than matching // metadata record. @@ -218,7 +218,6 @@ class PagedHistoryProviderTest { fun `history metadata matching upper bound`() = runTest { val provider = DefaultPagedHistoryProvider( historyStorage = storage, - historyImprovementFeatures = false, ) // Newest history visit on the page is 15 seconds (buffer time) older than matching // metadata record. @@ -288,7 +287,6 @@ class PagedHistoryProviderTest { fun `redirects are filtered out from history metadata groups`() = runTest { val provider = DefaultPagedHistoryProvider( historyStorage = storage, - historyImprovementFeatures = false, ) val visitInfo1 = VisitInfo( diff --git a/app/src/test/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeatureTest.kt index 92a60da53..4b0933b7a 100644 --- a/app/src/test/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/recentvisits/RecentVisitsFeatureTest.kt @@ -35,6 +35,7 @@ import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGrou import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHighlight import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItemInternal.HistoryGroupInternal import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItemInternal.HistoryHighlightInternal +import org.mozilla.fenix.utils.Settings import kotlin.random.Random @OptIn(ExperimentalCoroutinesApi::class) @@ -55,6 +56,7 @@ class RecentVisitsFeatureTest { fun setup() { historyHightlightsStorage = mockk(relaxed = true) historyMetadataStorage = mockk(relaxed = true) + Settings.SEARCH_GROUP_MINIMUM_SITES = 1 } @Test @@ -391,7 +393,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN a list of history highlights and groups WHEN updateState is called THEN emit RecentHistoryChange`() { - val feature = spyk(RecentVisitsFeature(appStore, mockk(), mockk(), mockk(), mockk(), false)) + val feature = spyk(RecentVisitsFeature(appStore, mockk(), mockk(), mockk(), mockk())) val expected = List(1) { mockk() } every { feature.getCombinedHistory(any(), any()) } returns expected @@ -405,7 +407,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN highlights visits exist in search groups WHEN getCombined is called THEN remove the highlights already in groups`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(4) val directVisits = getDirectVisitsHistoryMetadataItems(4) val directDupeVisits = getSearchFromHistoryMetadataItems(2).map { @@ -429,7 +431,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN fewer than needed highlights and search groups WHEN getCombined is called THEN the result is sorted by date`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(4) val directVisits = getDirectVisitsHistoryMetadataItems(4) val expected = directVisits.reversed().toRecentHistoryHighlights() @@ -448,7 +450,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN more highlights are newer than search groups WHEN getCombined is called THEN then return an even split then sorted by date`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(5) val directVisits = getDirectVisitsHistoryMetadataItems(14) val expected = directVisits.takeLast(5).reversed().toRecentHistoryHighlights() + @@ -464,7 +466,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN more search groups are newer than highlights WHEN getCombined is called THEN then return an even split then sorted by date`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(14) val directVisits = getDirectVisitsHistoryMetadataItems(5) val expected = visitsFromSearch.takeLast(4).toIndividualRecentHistoryGroups() + @@ -480,7 +482,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN all highlights have metadata WHEN getHistoryHighlights is called THEN return a list of highlights with an inferred last access time`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10) @@ -497,7 +499,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN not all highlights have metadata WHEN getHistoryHighlights is called THEN set 0 for the highlights with not found last access time`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10) val highlightsWithUnknownAccessTime = directVisits.toHistoryHighlightsInternal().take(5).map { @@ -518,7 +520,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN multiple metadata records for the same highlight WHEN getHistoryHighlights is called THEN set the latest access time from multiple available`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10) val newerDirectVisits = directVisits.mapIndexed { index, item -> @@ -540,7 +542,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN multiple metadata entries only for direct accessed pages WHEN getHistorySearchGroups is called THEN return an empty list`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val directVisits = getDirectVisitsHistoryMetadataItems(10) val result = feature.getHistorySearchGroups(directVisits) @@ -550,7 +552,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN multiple metadata entries WHEN getHistorySearchGroups is called THEN group all entries by their search term`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10) @@ -563,7 +565,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN multiple metadata entries for the same url WHEN getHistorySearchGroups is called THEN entries are deduped`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val newerVisitsFromSearch = visitsFromSearch.map { it.copy(updatedAt = it.updatedAt * 2) } val directVisits = getDirectVisitsHistoryMetadataItems(10) @@ -582,7 +584,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN highlights and search groups WHEN getSortedHistory is called THEN sort descending all items based on the last access time`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10) val expected = directVisits.reversed().toRecentHistoryHighlights() @@ -601,7 +603,7 @@ class RecentVisitsFeatureTest { @Test fun `GIVEN highlights don't have a valid title WHEN getSortedHistory is called THEN the url is set as title`() { - val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk(), false) + val feature = RecentVisitsFeature(mockk(), mockk(), mockk(), mockk(), mockk()) val visitsFromSearch = getSearchFromHistoryMetadataItems(10) val directVisits = getDirectVisitsHistoryMetadataItems(10).mapIndexed { index, item -> when (index % 3) { @@ -653,7 +655,6 @@ class RecentVisitsFeatureTest { lazy { historyHightlightsStorage }, scope, testDispatcher, - false, ) assertEquals(emptyList(), appStore.state.recentHistory) From f352a4f9dcfc870a6aa2f41c43e35c7357aede86 Mon Sep 17 00:00:00 2001 From: Alexander Gramiak Date: Fri, 14 Oct 2022 16:53:20 -0600 Subject: [PATCH 243/407] For #27269: Use parentFile method over substring extraction This fixes gradle tests on Windows, where the file separator is "\" and not "/". --- .../java/org/mozilla/fenix/wallpapers/WallpaperDownloader.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperDownloader.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperDownloader.kt index d0ecc4252..2beff12a7 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperDownloader.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpaperDownloader.kt @@ -80,7 +80,7 @@ class WallpaperDownloader( if (!response.isSuccess) { throw IllegalStateException() } - File(localFile.path.substringBeforeLast("/")).mkdirs() + localFile.parentFile?.mkdirs() response.body.useStream { input -> input.copyTo(localFile.outputStream()) } From b67fb6573e3d06505231237b16b12bd692016440 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 28 Oct 2022 02:39:09 +0200 Subject: [PATCH 244/407] Import l10n. (#27581) --- app/src/main/res/values-ia/strings.xml | 39 ++++---------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index abd87617d..2bdd4111d 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -125,19 +125,12 @@ - Revenir in + Saltar retro Monstrar toto - Monstrar tote le recente button de schedas - - Tu recerca de \"%1$s\" - - - %d sitos + Button pro monstrar tote le schedas recente Vider tote le schedas synchronisate @@ -460,7 +453,7 @@ - Revenir hic + Saltar retro Marcapaginas recente Pro saper plus - - Cambia le fundo toccante le logo de Firefox in le pagina initial - - - Logo Firefox, button cambiar le fundo %s classic @@ -699,10 +686,6 @@ Lista Grillia - - Cercar gruppos - - Aggruppar sitos associate Clauder le schedas @@ -794,7 +777,7 @@ - Marcapaginas + Adder al marcapaginas Clauder @@ -863,18 +846,6 @@ Nulle chronologia hic - - Synchronisate ab altere apparatos - - Ab altere apparatos - - - Accede pro vider le chronologia synchronisate de tu altere apparatos. - - Acceder - - O crea un conto Firefox pro initiar a synchronisar]]> - Discargamentos removite @@ -931,7 +902,7 @@ The first parameter is the number of bookmarks selected --> %1$d seligite - Rediger le marcapaginas + Modificar marcapagina Modificar dossier From 75460afc10c07cbc876ec1a1c03095417a478d3f Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 28 Oct 2022 00:50:56 +0000 Subject: [PATCH 245/407] Update to Android-Components 108.0.20221028000535. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 9485fb20c..3f8b232ad 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221027143133" + const val VERSION = "108.0.20221028000535" } From 9a4d4c1371fe6e41cc05f0f716c390476ae7ac9a Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Sun, 23 Oct 2022 00:54:36 -0400 Subject: [PATCH 246/407] For #27584 - Replace Button in RecentSyncedTab with SecondaryButton --- .../main/java/org/mozilla/fenix/compose/button/Button.kt | 8 ++++++-- .../fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt | 5 ++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt b/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt index d9a5e691b..22c4a5255 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt @@ -102,19 +102,23 @@ fun PrimaryButton( * Secondary button. * * @param text The button text to be displayed. + * @param textColor [Color] to apply to the button text. + * @param backgroundColor The background [Color] of the button. * @param icon Optional [Painter] used to display an [Icon] before the button text. * @param onClick Invoked when the user clicks on the button. */ @Composable fun SecondaryButton( text: String, + textColor: Color = FirefoxTheme.colors.textActionSecondary, + backgroundColor: Color = FirefoxTheme.colors.actionSecondary, icon: Painter? = null, onClick: () -> Unit, ) { Button( text = text, - textColor = FirefoxTheme.colors.textActionSecondary, - backgroundColor = FirefoxTheme.colors.actionSecondary, + textColor = textColor, + backgroundColor = backgroundColor, icon = icon, tint = FirefoxTheme.colors.iconActionSecondary, onClick = onClick, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt index 32471d3ae..c0f8a7c14 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt @@ -48,7 +48,7 @@ import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.R import org.mozilla.fenix.compose.Image import org.mozilla.fenix.compose.ThumbnailCard -import org.mozilla.fenix.compose.button.Button +import org.mozilla.fenix.compose.button.SecondaryButton import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.theme.FirefoxTheme @@ -179,7 +179,7 @@ fun RecentSyncedTab( Spacer(modifier = Modifier.height(32.dp)) - Button( + SecondaryButton( text = if (tab != null) { stringResource(R.string.recent_tabs_see_all_synced_tabs_button_text) } else { @@ -187,7 +187,6 @@ fun RecentSyncedTab( }, textColor = buttonTextColor, backgroundColor = buttonBackgroundColor, - tint = FirefoxTheme.colors.iconActionSecondary, onClick = onSeeAllSyncedTabsButtonClick, ) } From 1362ec6b66c87da08a89be06e50b5887f8603d5b Mon Sep 17 00:00:00 2001 From: iorgamgabriel Date: Mon, 24 Oct 2022 13:29:01 +0300 Subject: [PATCH 247/407] For #27524 Set as default browser toggle get set to true after user select Fenix as default browser --- .../org/mozilla/fenix/settings/SettingsFragment.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index fa5fc6a84..a0ebfa39d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -432,7 +432,8 @@ class SettingsFragment : PreferenceFragmentCompat() { val preferenceLeakCanary = findPreference(leakKey) val preferenceRemoteDebugging = findPreference(debuggingKey) val preferenceMakeDefaultBrowser = - requirePreference(R.string.pref_key_make_default_browser) + requirePreference(R.string.pref_key_make_default_browser) + val preferenceOpenLinksInExternalApp = findPreference(getPreferenceKey(R.string.pref_key_open_links_in_external_app)) if (!Config.channel.isReleased) { @@ -451,8 +452,11 @@ class SettingsFragment : PreferenceFragmentCompat() { true } - preferenceMakeDefaultBrowser.onPreferenceClickListener = - getClickListenerForMakeDefaultBrowser() + preferenceMakeDefaultBrowser.apply { + updateSwitch() + onPreferenceClickListener = + getClickListenerForMakeDefaultBrowser() + } preferenceOpenLinksInExternalApp?.onPreferenceChangeListener = SharedPreferenceUpdater() From 1da0d91ed99998665214e0406db2379b0b4e7595 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 28 Oct 2022 15:39:46 +0000 Subject: [PATCH 248/407] Update to Android-Components 108.0.20221028143126. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 3f8b232ad..f7f5d0758 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221028000535" + const val VERSION = "108.0.20221028143126" } From c528c371d57211b56e523e63dde33d462c33f55e Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Thu, 27 Oct 2022 16:40:29 +0300 Subject: [PATCH 249/407] For #27522: New search settings UI tests coverage --- .../org/mozilla/fenix/helpers/TestHelper.kt | 16 +- .../org/mozilla/fenix/ui/BookmarksTest.kt | 2 +- .../org/mozilla/fenix/ui/CustomTabsTest.kt | 2 +- .../java/org/mozilla/fenix/ui/SearchTest.kt | 4 +- .../mozilla/fenix/ui/SettingsSearchTest.kt | 100 ++++++++++- .../java/org/mozilla/fenix/ui/SmokeTest.kt | 5 +- .../fenix/ui/robots/NavigationToolbarRobot.kt | 47 +++-- .../mozilla/fenix/ui/robots/SearchRobot.kt | 161 ++++++++++++------ .../ui/robots/SettingsSubMenuSearchRobot.kt | 161 ++++++++++-------- 9 files changed, 357 insertions(+), 141 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index 0fa6823c1..3cb04c23d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -9,6 +9,8 @@ package org.mozilla.fenix.helpers import android.app.ActivityManager import android.app.PendingIntent import android.content.ActivityNotFoundException +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -43,6 +45,8 @@ import androidx.test.uiautomator.UiObjectNotFoundException import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until +import java.util.Locale +import java.util.regex.Pattern import junit.framework.AssertionFailedError import mozilla.components.browser.state.search.SearchEngine import mozilla.components.support.ktx.android.content.appName @@ -63,8 +67,6 @@ import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource import org.mozilla.fenix.ui.robots.BrowserRobot import org.mozilla.fenix.utils.IntentUtils import org.mozilla.gecko.util.ThreadUtils -import java.util.Locale -import java.util.regex.Pattern object TestHelper { @@ -418,4 +420,14 @@ object TestHelper { Configuration::class.java, ).invoke(am, config) } + + /** + * Creates clipboard data. + */ + fun setTextToClipBoard(context: Context, message: String) { + val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText("label", message) + + clipBoard.setPrimaryClip(clipData) + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 80a966e83..3c776d238 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -218,7 +218,7 @@ class BookmarksTest { clickClearButton() longClickToolbar() clickPasteText() - verifyPastedToolbarText(defaultWebPage.url.toString()) + verifyTypedToolbarText(defaultWebPage.url.toString()) } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt index a35433b19..9b6b8ac7a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/CustomTabsTest.kt @@ -147,7 +147,7 @@ class CustomTabsTest { clickClearButton() longClickToolbar() clickPasteText() - verifyPastedToolbarText(customTabPage.url.toString()) + verifyTypedToolbarText(customTabPage.url.toString()) } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 25b7a1f25..5dc61172c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -124,7 +124,7 @@ class SearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - enableShowSearchShortcuts() + toggleShowSearchShortcuts() }.goBack { }.goBack { }.openSearch { @@ -147,7 +147,7 @@ class SearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - enableShowSearchShortcuts() + toggleShowSearchShortcuts() }.goBack { }.goBack { }.openSearch { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 79218bc33..569ed63ff 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -12,6 +12,8 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset +import org.mozilla.fenix.helpers.TestHelper.appContext +import org.mozilla.fenix.helpers.TestHelper.setTextToClipBoard import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar @@ -47,6 +49,11 @@ class SettingsSearchTest { verifySearchToolbar() verifyDefaultSearchEngineHeader() verifySearchEngineList() + verifyShowSearchSuggestions() + verifyShowSearchShortcuts() + verifySearchBrowsingHistory() + verifySearchBookmarks() + verifyShowClipboardSuggestionsDefault() } } @@ -65,7 +72,27 @@ class SettingsSearchTest { } @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") + fun toggleSearchAutocomplete() { + homeScreen { + }.openSearch { + typeSearch("mo") + verifyTypedToolbarText("monster.com") + typeSearch("moz") + verifyTypedToolbarText("mozilla.org") + }.dismissSearchBar { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + toggleAutocomplete() + }.goBack { + }.goBack { + }.openSearch { + typeSearch("moz") + verifyTypedToolbarText("moz") + } + } + + @Test fun toggleSearchBookmarksAndHistoryTest() { // Bookmarks 2 websites, toggles the bookmarks and history search settings off, // then verifies if the websites do not show in the suggestions. @@ -93,8 +120,9 @@ class SettingsSearchTest { }.openSearch { typeSearch("test") expandSearchSuggestionsList() - verifySearchEngineSuggestionResults(activityTestRule, "Test_Page_1") - verifySearchEngineSuggestionResults(activityTestRule, "Test_Page_2") + verifyFirefoxSuggestResults(activityTestRule, "Firefox Suggest") + verifyFirefoxSuggestResults(activityTestRule, "Test_Page_1") + verifyFirefoxSuggestResults(activityTestRule, "Test_Page_2") }.dismissSearchBar { }.openThreeDotMenu { }.openSettings { @@ -110,6 +138,7 @@ class SettingsSearchTest { }.openSearch { typeSearch("test") expandSearchSuggestionsList() + verifyNoSuggestionsAreDisplayed(activityTestRule, "Firefox Suggest") verifyNoSuggestionsAreDisplayed(activityTestRule, "Test_Page_1") verifyNoSuggestionsAreDisplayed(activityTestRule, "Test_Page_2") } @@ -192,7 +221,48 @@ class SettingsSearchTest { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { - disableShowSearchSuggestions() + toggleShowSearchSuggestions() + }.goBack { + }.goBack { + }.openSearch { + typeSearch("mozilla") + verifyNoSuggestionsAreDisplayed(activityTestRule, "mozilla firefox") + } + } + + // Tests the "Don't allow" option from private mode search suggestions onboarding dialog + @Test + fun blockSearchSuggestionsInPrivateModeOnboardingTest() { + homeScreen { + togglePrivateBrowsingModeOnOff() + }.openSearch { + typeSearch("mozilla") + verifyAllowSuggestionsInPrivateModeDialog() + denySuggestionsInPrivateMode() + verifyNoSuggestionsAreDisplayed(activityTestRule, "mozilla firefox") + }.dismissSearchBar { + togglePrivateBrowsingModeOnOff() + }.openSearch { + typeSearch("mozilla") + verifySearchEngineSuggestionResults(activityTestRule, "mozilla firefox") + } + } + + // Tests the "Allow" option from private mode search suggestions onboarding dialog + @Test + fun allowSearchSuggestionsInPrivateModeOnboardingTest() { + homeScreen { + togglePrivateBrowsingModeOnOff() + }.openSearch { + typeSearch("mozilla") + verifyAllowSuggestionsInPrivateModeDialog() + allowSuggestionsInPrivateMode() + verifySearchEngineSuggestionResults(activityTestRule, "mozilla firefox") + }.dismissSearchBar { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + toggleShowSuggestionsInPrivateSessions() }.goBack { }.goBack { }.openSearch { @@ -220,4 +290,26 @@ class SettingsSearchTest { verifyVoiceSearchButtonVisibility(false) } } + + @Test + fun toggleShowClipboardSuggestionsTest() { + val link = "https://www.mozilla.org/en-US/" + setTextToClipBoard(appContext, link) + + homeScreen { + }.openNavigationToolbar { + verifyClipboardSuggestionsAreDisplayed(link, true) + }.visitLinkFromClipboard { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + verifyShowClipboardSuggestionsDefault() + toggleClipboardSuggestion() + exitMenu() + } + homeScreen { + }.openNavigationToolbar { + verifyClipboardSuggestionsAreDisplayed(link, false) + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index cf38a8978..d0a85e27a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -862,7 +862,7 @@ class SmokeTest { clickClearButton() longClickToolbar() clickPasteText() - verifyPastedToolbarText("content") + verifyTypedToolbarText("content") } } @@ -881,7 +881,8 @@ class SmokeTest { clickClearButton() longClickToolbar() clickPasteText() - verifyPastedToolbarText("Page content: 1") + // with Select all, some white space is copied over, so we need to include that too + verifyTypedToolbarText(" Page content: 1 ") } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt index a4108bd58..ed09b5a9c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt @@ -28,10 +28,12 @@ import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not +import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName @@ -53,8 +55,6 @@ class NavigationToolbarRobot { fun verifyCloseReaderViewDetected(visible: Boolean = false) = assertCloseReaderViewDetected(visible) - fun typeSearchTerm(searchTerm: String) = awesomeBar().setText(searchTerm) - fun toggleReaderView() { mDevice.findObject( UiSelector() @@ -65,6 +65,33 @@ class NavigationToolbarRobot { readerViewToggle().click() } + fun verifyClipboardSuggestionsAreDisplayed(link: String, shouldBeDisplayed: Boolean) { + when (shouldBeDisplayed) { + true -> { + assertTrue( + mDevice.findObject(UiSelector().resourceId("$packageName:id/fill_link_from_clipboard")) + .waitForExists(waitingTime), + ) + + assertTrue( + mDevice.findObject(UiSelector().resourceId("$packageName:id/clipboard_url").text(link)) + .waitForExists(waitingTime), + ) + } + false -> { + assertFalse( + mDevice.findObject(UiSelector().resourceId("$packageName:id/fill_link_from_clipboard")) + .waitForExists(waitingTime), + ) + + assertFalse( + mDevice.findObject(UiSelector().resourceId("$packageName:id/clipboard_url").text(link)) + .waitForExists(waitingTime), + ) + } + } + } + class Transition { private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource @@ -151,14 +178,12 @@ class NavigationToolbarRobot { } fun visitLinkFromClipboard(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - mDevice.waitNotNull( - Until.findObject(By.res("org.mozilla.fenix.debug:id/mozac_browser_toolbar_clear_view")), - waitingTime, - ) - clearAddressBar().click() + if (clearAddressBar().waitForExists(waitingTimeShort)) { + clearAddressBar().click() + } mDevice.waitNotNull( - Until.findObject(By.res("org.mozilla.fenix.debug:id/clipboard_title")), + Until.findObject(By.res("$packageName:id/clipboard_title")), waitingTime, ) @@ -166,7 +191,7 @@ class NavigationToolbarRobot { // See for mor information https://github.com/mozilla-mobile/fenix/issues/22271 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { mDevice.waitNotNull( - Until.findObject(By.res("org.mozilla.fenix.debug:id/clipboard_url")), + Until.findObject(By.res("$packageName:id/clipboard_url")), waitingTime, ) } @@ -286,7 +311,9 @@ private fun threeDotButton() = onView(withId(R.id.mozac_browser_toolbar_menu)) private fun tabTrayButton() = onView(withId(R.id.tab_button)) private fun fillLinkButton() = onView(withId(R.id.fill_link_from_clipboard)) private fun clearAddressBar() = - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_clear_view")) + mDevice.findObject( + UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_clear_view"), + ) private fun goBackButton() = mDevice.pressBack() private fun readerViewToggle() = onView(withParent(withId(R.id.mozac_browser_toolbar_page_actions))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index 7e3a54b70..a50808cca 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollToIndex +import androidx.compose.ui.test.performScrollToNode import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.assertion.ViewAssertions.matches @@ -28,10 +29,8 @@ import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withSubstring import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By -import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers.allOf @@ -41,10 +40,12 @@ import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.Constants import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION +import org.mozilla.fenix.helpers.Constants.RETRY_COUNT import org.mozilla.fenix.helpers.Constants.SPEECH_RECOGNITION import org.mozilla.fenix.helpers.SessionLoadedIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.isPackageInstalled import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName @@ -94,13 +95,98 @@ class SearchRobot { } fun verifySearchEngineButton() = assertSearchButton() - fun verifySearchWithText() = assertSearchWithText() - fun verifySearchEngineResults(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String) = - assertSearchEngineResults(rule, searchSuggestion, searchEngineName) - fun verifySearchEngineSuggestionResults(rule: ComposeTestRule, searchSuggestion: String) = - assertSearchEngineSuggestionResults(rule, searchSuggestion) - fun verifyNoSuggestionsAreDisplayed(rule: ComposeTestRule, searchSuggestion: String) = - assertNoSuggestionsAreDisplayed(rule, searchSuggestion) + + fun verifySearchEngineResults(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String) { + rule.waitUntil(waitingTime, waitForSearchSuggestions(rule, searchSuggestion, searchEngineName)) + rule.onNodeWithText(searchSuggestion).assertIsDisplayed() + } + + fun verifySearchEngineSuggestionResults(rule: ComposeTestRule, searchSuggestion: String) { + rule.waitForIdle() + for (i in 1..RETRY_COUNT) { + try { + assertTrue( + mDevice.findObject(UiSelector().textContains(searchSuggestion)) + .waitForExists(waitingTime), + ) + break + } catch (e: AssertionError) { + if (i == RETRY_COUNT) { + throw e + } else { + expandSearchSuggestionsList() + } + } + } + } + + fun verifyFirefoxSuggestResults(rule: ComposeTestRule, searchSuggestion: String) { + rule.waitForIdle() + for (i in 1..RETRY_COUNT) { + try { + rule.onNodeWithTag("mozac.awesomebar.suggestions") + .performScrollToNode(hasText(searchSuggestion)) + .assertExists() + break + } catch (e: AssertionError) { + if (i == RETRY_COUNT) { + throw e + } else { + expandSearchSuggestionsList() + } + } + } + } + + fun verifyNoSuggestionsAreDisplayed(rule: ComposeTestRule, searchSuggestion: String) { + rule.waitForIdle() + + assertFalse( + mDevice.findObject(UiSelector().textContains(searchSuggestion)) + .waitForExists(waitingTime), + ) + } + + fun verifyAllowSuggestionsInPrivateModeDialog() { + assertTrue( + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_title)), + ).waitForExists(waitingTime), + ) + assertTrue( + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_text)), + ).exists(), + ) + assertTrue( + mDevice.findObject( + UiSelector().text("Learn more"), + ).exists(), + ) + assertTrue( + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_allow_button)), + ).exists(), + ) + assertTrue( + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_do_not_allow_button)), + ).exists(), + ) + } + + fun denySuggestionsInPrivateMode() { + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_do_not_allow_button)), + ).click() + } + + fun allowSuggestionsInPrivateMode() { + mDevice.findObject( + UiSelector().text(getStringResource(R.string.search_suggestions_onboarding_allow_button)), + ).click() + } + fun verifySearchSettings() = assertSearchSettings() fun verifySearchBarEmpty() = assertSearchBarEmpty() @@ -226,10 +312,24 @@ class SearchRobot { } fun expandSearchSuggestionsList() { + onView(allOf(withId(R.id.search_wrapper))).perform( + closeSoftKeyboard(), + ) awesomeBar.swipeUp(2) } - fun verifyPastedToolbarText(expectedText: String) = assertPastedToolbarText(expectedText) + fun verifyTypedToolbarText(expectedText: String) { + mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) + .waitForExists(waitingTime) + mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) + .waitForExists(waitingTime) + onView( + allOf( + withText(expectedText), + withId(R.id.mozac_browser_toolbar_edit_url_view), + ), + ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + } class Transition { private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource @@ -300,11 +400,6 @@ private fun clearButton() = private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper")) -private fun assertSearchEngineResults(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String) { - rule.waitUntil(waitingTime, waitForSearchSuggestions(rule, searchSuggestion, searchEngineName)) - rule.onNodeWithText(searchSuggestion).assertIsDisplayed() -} - private fun waitForSearchSuggestions(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String): () -> Boolean = { rule.waitForIdle() @@ -313,24 +408,6 @@ private fun waitForSearchSuggestions(rule: ComposeTestRule, searchSuggestion: St mDevice.findObject(UiSelector().textContains(searchSuggestion)).waitForExists(waitingTime) } -private fun assertSearchEngineSuggestionResults(rule: ComposeTestRule, searchResult: String) { - rule.waitForIdle() - - assertTrue( - mDevice.findObject(UiSelector().textContains(searchResult)) - .waitForExists(waitingTime), - ) -} - -private fun assertNoSuggestionsAreDisplayed(rule: ComposeTestRule, searchTerm: String) { - rule.waitForIdle() - - assertFalse( - mDevice.findObject(UiSelector().textContains(searchTerm)) - .waitForExists(waitingTime), - ) -} - private fun assertSearchView() = assertTrue( mDevice.findObject( @@ -462,25 +539,7 @@ private fun assertDefaultSearchEngine(expectedText: String) = ).waitForExists(waitingTime), ) -private fun assertPastedToolbarText(expectedText: String) { - mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) - .waitForExists(waitingTime) - mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_url_view")) - .waitForExists(waitingTime) - onView( - allOf( - withSubstring(expectedText), - withId(R.id.mozac_browser_toolbar_edit_url_view), - ), - ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -} - private val awesomeBar = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) private val voiceSearchButton = mDevice.findObject(UiSelector().description("Voice search")) - -private val searchSuggestionsList = - UiScrollable( - UiSelector().className("android.widget.ScrollView"), - ) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index 935b8b70d..abdf9fced 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -15,6 +15,7 @@ import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withChild +import androidx.test.espresso.matcher.ViewMatchers.withClassName import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId @@ -24,12 +25,16 @@ import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import org.hamcrest.CoreMatchers import org.hamcrest.Matchers.allOf +import org.hamcrest.Matchers.endsWith import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestHelper.getStringResource +import org.mozilla.fenix.helpers.TestHelper.hasCousin import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click +import org.mozilla.fenix.helpers.isChecked /** * Implementation of Robot Pattern for the settings search sub menu. @@ -38,18 +43,90 @@ class SettingsSubMenuSearchRobot { fun verifySearchToolbar() = assertSearchToolbar() fun verifyDefaultSearchEngineHeader() = assertDefaultSearchEngineHeader() fun verifySearchEngineList() = assertSearchEngineList() - fun verifyShowSearchSuggestions() = assertShowSearchSuggestions() + + fun verifyShowSearchSuggestions() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Show search suggestions")), + ), + ) + onView(withText("Show search suggestions")) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + } + fun verifyShowSearchShortcuts() = assertShowSearchShortcuts() - fun verifyShowClipboardSuggestions() = assertShowClipboardSuggestions() - fun verifySearchBrowsingHistory() = assertSearchBrowsingHistory() - fun verifySearchBookmarks() = assertSearchBookmarks() + + fun verifyShowClipboardSuggestionsDefault() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))), + ), + ) + onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(true))))) + } + + fun toggleClipboardSuggestion() { + onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) + .click() + } + + fun verifySearchBrowsingHistory() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Search browsing history")), + ), + ) + searchHistoryToggle + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + } + + fun verifySearchBookmarks() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Search bookmarks")), + ), + ) + searchBookmarksToggle + .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + } fun changeDefaultSearchEngine(searchEngineName: String) = selectSearchEngine(searchEngineName) - fun disableShowSearchSuggestions() = toggleShowSearchSuggestions() + fun toggleAutocomplete() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))), + ), + ) - fun enableShowSearchShortcuts() = toggleShowSearchShortcuts() + onView(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))) + .click() + } + + fun toggleShowSearchSuggestions() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Show search suggestions")), + ), + ) + + onView(withText("Show search suggestions")) + .perform(click()) + } + + fun toggleShowSearchShortcuts() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText("Show search engines")), + ), + ) + + onView(withText("Show search engines")) + .perform(click()) + } fun toggleVoiceSearch() { onView(withId(androidx.preference.R.id.recycler_view)).perform( @@ -78,6 +155,16 @@ class SettingsSubMenuSearchRobot { searchBookmarksToggle.click() } + fun toggleShowSuggestionsInPrivateSessions() { + onView(withId(androidx.preference.R.id.recycler_view)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))), + ), + ) + onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))) + .click() + } + fun openAddSearchEngineMenu() = addSearchEngineButton().click() fun verifyAddSearchEngineList() = assertAddSearchEngineList() @@ -215,16 +302,6 @@ private fun assertSearchEngineList() { .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } -private fun assertShowSearchSuggestions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search suggestions")), - ), - ) - onView(withText("Show search suggestions")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -} - private fun assertShowSearchShortcuts() { onView(withId(androidx.preference.R.id.recycler_view)).perform( RecyclerViewActions.scrollTo( @@ -235,38 +312,8 @@ private fun assertShowSearchShortcuts() { .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) } -private fun assertShowClipboardSuggestions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show clipboard suggestions")), - ), - ) - onView(withText("Show clipboard suggestions")) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -} - -private fun assertSearchBrowsingHistory() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search browsing history")), - ), - ) - searchHistoryToggle - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -} - private val searchHistoryToggle = onView(withText("Search browsing history")) -private fun assertSearchBookmarks() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Search bookmarks")), - ), - ) - searchBookmarksToggle - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) -} - private val searchBookmarksToggle = onView(withText("Search bookmarks")) private fun selectSearchEngine(searchEngine: String) { @@ -275,28 +322,6 @@ private fun selectSearchEngine(searchEngine: String) { .perform(click()) } -private fun toggleShowSearchSuggestions() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search suggestions")), - ), - ) - - onView(withText("Show search suggestions")) - .perform(click()) -} - -private fun toggleShowSearchShortcuts() { - onView(withId(androidx.preference.R.id.recycler_view)).perform( - RecyclerViewActions.scrollTo( - hasDescendant(withText("Show search engines")), - ), - ) - - onView(withText("Show search engines")) - .perform(click()) -} - private fun goBackButton() = onView(CoreMatchers.allOf(withContentDescription("Navigate up"))) From 3fe88c05b2d69fad1614dc713a90fb9641ef702a Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Thu, 27 Oct 2022 13:20:29 -0400 Subject: [PATCH 250/407] Bug 1780639 - let Save as PDF ride the trains. --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index b1cfa8e71..f93488240 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -125,5 +125,5 @@ object FeatureFlags { /** * Enables the save to PDF feature. */ - val saveToPDF = Config.channel.isNightlyOrDebug + const val saveToPDF = true } From 703d9ba466fdba85e0acbf4b410a1ba0098899ae Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Thu, 27 Oct 2022 13:45:00 -0400 Subject: [PATCH 251/407] Update Google Cloud SDK Version in ui-tests Dockerfile 203 -> 407 https://cloud.google.com/sdk/docs/release-notes --- taskcluster/docker/ui-tests/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taskcluster/docker/ui-tests/Dockerfile b/taskcluster/docker/ui-tests/Dockerfile index 41dcd026c..23a712d42 100644 --- a/taskcluster/docker/ui-tests/Dockerfile +++ b/taskcluster/docker/ui-tests/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get install -y jq \ USER worker:worker ENV GOOGLE_SDK_DOWNLOAD ./gcloud.tar.gz -ENV GOOGLE_SDK_VERSION 233 +ENV GOOGLE_SDK_VERSION 407 ENV TEST_TOOLS /builds/worker/test-tools ENV PATH ${PATH}:${TEST_TOOLS}:${TEST_TOOLS}/google-cloud-sdk/bin From db31b3e2fbba141ebc34986456e6e69515547fb5 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 29 Oct 2022 02:37:13 +0200 Subject: [PATCH 252/407] Import l10n. (#27606) --- app/src/main/res/values-it/strings.xml | 33 ++-------------------- app/src/main/res/values-sl/strings.xml | 38 ++++++-------------------- 2 files changed, 10 insertions(+), 61 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ff53548ad..5cb43615e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -130,13 +130,6 @@ Pulsante per mostrare tutte le schede recenti - - La tua ricerca per “%1$s” - - - %d siti Mostra tutte le schede sincronizzate @@ -496,12 +489,6 @@ Impossibile cambiare lo sfondo Ulteriori informazioni - - Cambia lo sfondo toccando il logo di Firefox nella pagina iniziale - - - Logo di Firefox. Pulsante per cambiare lo sfondo %s classico @@ -692,10 +679,6 @@ Elenco Griglia - - Gruppi di ricerca - - Raggruppa siti correlati Chiudi schede @@ -850,18 +833,6 @@ Nessuna cronologia disponibile. - - Sincronizzata da altri dispositivi - - Da altri dispositivi - - - Accedi per visualizzare la cronologia sincronizzata con altri dispositivi. - - Accedi - - Oppure crea un account Firefox per iniziare a sincronizzare]]> - Download eliminati @@ -1131,7 +1102,7 @@ Per inviare una scheda, accedi all’account Firefox su almeno un altro dispositivo. - Tutto chiaro + OK Impossibile condividere con questa app @@ -1912,7 +1883,7 @@ Per aggiungere una nuova scorciatoia è necessario rimuoverne una esistente. Toccare il sito da eliminare tenendo premuto e selezionare rimuovi. - OK, tutto chiaro + OK Scorciatoie diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index bc31d68a9..fb6baf12b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -132,13 +132,6 @@ Gumb za prikaz vseh nedavnih zavihkov - - Vaše iskanje \"%1$s\" - - - %d spletnih mest Prikaži vse sinhronizirane zavihke @@ -491,11 +484,6 @@ Ozadja ni bilo mogoče spremeniti Več o tem - - Spremeni ozadje z dotikom logotipa na domači strani Firefoxa - - Logtip Firefoxa – spremeni ozadje, gumb Klasični %s @@ -685,10 +673,6 @@ Seznam Mreža - - Išči skupine - - Združi sorodna spletna mesta v skupine Zapri zavihke @@ -843,19 +827,6 @@ Ni zgodovine - - Sinhronizirano z drugih naprav - - Z drugih naprav - - - Prijavite se za ogled sinhronizirane zgodovine z drugih naprav. - - Prijava - - - Ali ustvarite Firefox Račun za začetek sinhronizacije]]> - Prenosi odstranjeni @@ -1970,4 +1941,11 @@ Pojdi v nastavitve Firefoxovi predlogi - + + + strnete + + razširite + + odprete povezavo z več informacijami o tej zbirki + From 5d3f2ad5c537a1086003384dba9947f4867d0757 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 29 Oct 2022 01:30:38 +0000 Subject: [PATCH 253/407] Update to Android-Components 108.0.20221029010307. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f7f5d0758..f250fbbb9 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221028143126" + const val VERSION = "108.0.20221029010307" } From 9f8216d654bca7f33c9297695b80dc808791de22 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 29 Oct 2022 15:02:20 +0000 Subject: [PATCH 254/407] Update to Android-Components 108.0.20221029143054. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f250fbbb9..585bc4ab7 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221029010307" + const val VERSION = "108.0.20221029143054" } From cb12f20cc94ce55c619dc5ffad7dd0001632745a Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sun, 30 Oct 2022 02:39:19 +0200 Subject: [PATCH 255/407] Import l10n. (#27612) --- app/src/main/res/values-oc/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index b810156bc..a6a61d8ba 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -1160,7 +1160,7 @@ URL copiada - Aquò es un exemple de tèxt. Aquí es una demotracion de coma apareisserà lo tèxt quand aumentatz o redusissètz la talha amb aqueste paramètre. + Aquò es un exemple de tèxt. Aquí es una demostracion de coma apareisserà lo tèxt quand aumentatz o redusissètz la talha amb aqueste paramètre. Va venir lo tèxt dels sites mai grand o mai pichon From 4768aa2599ad330b5ce63249b0ecc7d9c244f6e3 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 30 Oct 2022 15:02:20 +0000 Subject: [PATCH 256/407] Update to Android-Components 108.0.20221030143256. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 585bc4ab7..ff892b377 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221029143054" + const val VERSION = "108.0.20221030143256" } From d027b47d3e4d8a1ae456dc96326c3f1cb1c5c55c Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 31 Oct 2022 01:36:41 +0100 Subject: [PATCH 257/407] Import l10n. (#27618) --- app/src/main/res/values-kab/strings.xml | 6 +++++ app/src/main/res/values-sat/strings.xml | 36 +++++-------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 20daebeca..5a674f1d7 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -1246,6 +1246,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Kemmel seg wanida i tḥebseḍ Awi-d ticraḍ n yisebtar, amazray, d wawalen uffiren ɣer %1$s deg yibenk-a. + + Mtawi accaren d wawalen uffiren gar yibenkan-ik·im i wakken add tɛeddiḍ seg ugdil ɣer wayeḍ s wudem afrawan. Jerred @@ -1258,6 +1260,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ammesten n tudert tabaḍnit s wudem amezwer %1$s yessewḥal s wudem awurman tikebbaniyin ara ak-iḍefren deg web. + + Ammesten asemday mgal y inagan n tuqqna yessewḥal ineḍfaren ad sqedc inagan n tuqqna i wakken ad ak•akem-ḍefren deg web. Alugan (amezwer) @@ -1280,6 +1284,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Nfeṣṣel %si w akken ad nerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid aked wayen tbeṭṭuḍ yid-neɣ. + + Firefox ad yerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid akked wayen tbeṭṭuḍ yid-neɣ. Ɣer tasertit-nneɣ n tbaḍnit diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 8ea1851ed..8ad4c6768 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -78,6 +78,12 @@ ᱵᱚᱸᱫ + + + ᱟᱞᱮᱭᱟᱜ ᱡᱷᱚᱛᱚ ᱠᱷᱚᱱ ᱫᱟᱲᱮ ᱱᱤᱥᱚᱱ ᱯᱷᱤᱪᱚᱨ ᱫᱚ ᱯᱟᱧᱡᱟ ᱵᱟᱨ ᱯᱟᱦᱴᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱵᱟᱫ ᱠᱚᱣᱟᱭ ᱾ + + ᱢᱩᱴ ᱯᱟᱧᱡᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱵᱟᱵᱚᱛ ᱰᱷᱮᱨ ᱵᱟᱲᱟᱭ ᱢᱮ + ᱠᱚᱢᱨᱟ ᱵᱮᱵᱷᱟᱨ ᱫᱚᱨᱠᱟᱨ ᱾ ᱮᱸᱰᱨᱚᱭᱮᱰ ᱥᱟᱡᱟᱣ ᱛᱮ ᱪᱟᱹᱞᱟᱜ ᱢᱮ, ᱪᱷᱟᱹᱲ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ , ᱟᱨ ᱮᱞᱞᱟᱣ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ ᱾ @@ -125,13 +131,6 @@ ᱱᱤᱛᱚᱜᱟᱜ ᱴᱮᱵᱽ ᱵᱩᱛᱟᱹᱢ ᱠᱚ ᱡᱷᱚᱛᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ - - \"%1$s\" ᱞᱟᱹᱜᱤᱜ ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ - - - %d ᱥᱟᱭᱤᱴ ᱠᱚ ᱤᱧᱟᱜ ᱡᱷᱚᱛᱚ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱠᱟᱱ ᱴᱮᱵᱽ ᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ @@ -465,12 +464,6 @@ ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱵᱚᱫᱚᱞ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ - - Firefox ᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱞᱚᱜᱚ ᱨᱮ ᱴᱤᱯᱟᱹᱣ ᱠᱟᱛᱮ ᱞᱟᱴᱷᱟ ᱪᱤᱛᱟᱹᱨ ᱵᱚᱫᱚᱞ ᱢᱮ - - - Firefox ᱪᱤᱱᱦᱟᱹᱯ - ᱠᱟᱸᱛᱷᱥᱟᱦᱴᱟ, ᱵᱩᱛᱟᱹᱢ ᱵᱚᱫᱚᱞ ᱢᱮ ᱠᱞᱟᱥᱤᱠ %s @@ -651,10 +644,6 @@ ᱞᱤᱥᱴᱤ ᱡᱟᱸᱜᱞᱟ - - ᱥᱮᱸᱫᱽᱨᱟ ᱫᱳᱞ ᱠᱚ - - ᱡᱩᱲᱟᱹᱣ ᱠᱟᱱ ᱥᱟᱭᱤᱴ ᱠᱚ ᱫᱳᱞ ᱠᱟᱜ ᱢᱮ ᱴᱮᱵᱽ ᱠᱚ ᱵᱚᱸᱫᱚᱭ ᱢᱮ @@ -806,19 +795,6 @@ ᱱᱚᱰᱮ ᱱᱟᱜᱟᱢ ᱵᱚᱱᱩᱜ-ᱟ - - ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱠᱟᱱᱟ - - ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ - - - ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱠᱷᱚᱱ ᱦᱤᱛᱟᱹᱞ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱥᱩᱦᱤ ᱮᱢ ᱢᱮ ᱾ - - ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ - - - ᱟᱨᱵᱟᱝᱠᱷᱟᱱ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫᱴᱟᱹᱝ Firefox ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ ᱢᱮ]]> - ᱰᱟᱩᱱᱞᱚᱰᱠᱚ ᱚᱪᱚᱜᱮᱱᱟ From 29f1356cdf1e347b042ac5d434795a0f11edbcc2 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 21 Oct 2022 16:24:18 +0300 Subject: [PATCH 258/407] For #27522 new undo delete search engine UI test --- .../org/mozilla/fenix/ui/SettingsSearchTest.kt | 15 +++++++++++++++ .../fenix/ui/robots/SettingsSubMenuSearchRobot.kt | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 569ed63ff..2293455bd 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -312,4 +312,19 @@ class SettingsSearchTest { verifyClipboardSuggestionsAreDisplayed(link, false) } } + + // Expected for en-us defaults + @Test + fun undoDeleteSearchEngineTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + verifyEngineListContains("Bing") + openEngineOverflowMenu("Bing") + clickDeleteSearchEngine() + clickUndoSnackBarButton() + verifyEngineListContains("Bing") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index abdf9fced..025963bf0 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -249,6 +249,17 @@ class SettingsSubMenuSearchRobot { fun clickEdit() = onView(withText("Edit")).click() + fun clickDeleteSearchEngine() = + mDevice.findObject( + UiSelector().textContains(getStringResource(R.string.search_engine_delete)), + ).click() + + fun clickUndoSnackBarButton() = + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/snackbar_btn"), + ).click() + fun saveEditSearchEngine() { onView(withId(R.id.save_button)).click() assertTrue( From c47986e742057f460f5af3a273bd301fabba9b6c Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 27 Oct 2022 16:49:12 +0300 Subject: [PATCH 259/407] For #27522 new delete default search engine UI test --- .../org/mozilla/fenix/ui/SettingsSearchTest.kt | 16 ++++++++++++++++ .../ui/robots/SettingsSubMenuSearchRobot.kt | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 2293455bd..4734a16c5 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -327,4 +327,20 @@ class SettingsSearchTest { verifyEngineListContains("Bing") } } + + // Expected for en-us defaults + @Test + fun deleteDefaultSearchEngineTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + verifyEngineListContains("Google") + verifyDefaultSearchEngine("Google") + openEngineOverflowMenu("Google") + clickDeleteSearchEngine() + verifyEngineListDoesNotContain("Google") + verifyDefaultSearchEngine("Bing") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index 025963bf0..acd649e27 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -24,6 +24,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import org.hamcrest.CoreMatchers +import org.hamcrest.CoreMatchers.not import org.hamcrest.Matchers.allOf import org.hamcrest.Matchers.endsWith import org.junit.Assert.assertTrue @@ -171,6 +172,10 @@ class SettingsSubMenuSearchRobot { fun verifyEngineListContains(searchEngineName: String) = assertEngineListContains(searchEngineName) + fun verifyEngineListDoesNotContain(searchEngineName: String) = assertEngineListDoesNotContain(searchEngineName) + + fun verifyDefaultSearchEngine(searchEngineName: String) = assertDefaultSearchEngine(searchEngineName) + fun saveNewSearchEngine() { addSearchEngineSaveButton().click() assertTrue( @@ -350,6 +355,18 @@ private fun assertEngineListContains(searchEngineName: String) { onView(withId(R.id.search_engine_group)).check(matches(hasDescendant(withText(searchEngineName)))) } +private fun assertDefaultSearchEngine(searchEngineName: String) = + onView( + allOf( + withId(R.id.radio_button), + withParent(withChild(withText(searchEngineName))), + ), + ).check(matches(isChecked(true))) + +private fun assertEngineListDoesNotContain(searchEngineName: String) { + onView(withId(R.id.search_engine_group)).check(matches(not(hasDescendant(withText(searchEngineName))))) +} + private fun threeDotMenu(searchEngineName: String) = onView( allOf( From a16e6ce1026a95413bd2e12352ba9c7e6181ca0a Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 27 Oct 2022 16:50:08 +0300 Subject: [PATCH 260/407] For #27522 new delete all search engines UI test --- .../mozilla/fenix/ui/SettingsSearchTest.kt | 27 +++++++++++++++++++ .../ui/robots/SettingsSubMenuSearchRobot.kt | 18 +++++++++++++ 2 files changed, 45 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 4734a16c5..7ecec9759 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -343,4 +343,31 @@ class SettingsSearchTest { verifyDefaultSearchEngine("Bing") } } + + // Expected for en-us defaults + @Test + fun deleteAllSearchEnginesTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + deleteMultipleSearchEngines( + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + ) + verifyDefaultSearchEngine("Wikipedia") + verifyThreeDotButtonIsNotDisplayed("Wikipedia") + openAddSearchEngineMenu() + verifyAddSearchEngineListContains( + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + ) + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index acd649e27..cee8dcd7f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -176,6 +176,14 @@ class SettingsSubMenuSearchRobot { fun verifyDefaultSearchEngine(searchEngineName: String) = assertDefaultSearchEngine(searchEngineName) + fun verifyThreeDotButtonIsNotDisplayed(searchEngineName: String) = assertThreeDotButtonIsNotDisplayed(searchEngineName) + + fun verifyAddSearchEngineListContains(vararg searchEngines: String) { + for (searchEngine in searchEngines) { + assertEngineListContains(searchEngine) + } + } + fun saveNewSearchEngine() { addSearchEngineSaveButton().click() assertTrue( @@ -252,6 +260,13 @@ class SettingsSubMenuSearchRobot { threeDotMenu(searchEngineName).click() } + fun deleteMultipleSearchEngines(vararg searchEngines: String) { + for (searchEngine in searchEngines) { + openEngineOverflowMenu(searchEngine) + clickDeleteSearchEngine() + } + } + fun clickEdit() = onView(withText("Edit")).click() fun clickDeleteSearchEngine() = @@ -367,6 +382,9 @@ private fun assertEngineListDoesNotContain(searchEngineName: String) { onView(withId(R.id.search_engine_group)).check(matches(not(hasDescendant(withText(searchEngineName))))) } +private fun assertThreeDotButtonIsNotDisplayed(searchEngineName: String) = + threeDotMenu(searchEngineName).check(matches(not(isDisplayed()))) + private fun threeDotMenu(searchEngineName: String) = onView( allOf( From ef79099e972be2a6ad0fe78e089c564b3528a81c Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 31 Oct 2022 12:03:05 +0000 Subject: [PATCH 261/407] Update to Android-Components 108.0.20221031113629. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ff892b377..847a1f949 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221030143256" + const val VERSION = "108.0.20221031113629" } From 400fc98d350a5b6eedb4c6c7113d1b0e1cbda5f2 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 31 Oct 2022 15:02:15 +0000 Subject: [PATCH 262/407] Update to Android-Components 108.0.20221031143305. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 847a1f949..0aabb4e79 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221031113629" + const val VERSION = "108.0.20221031143305" } From e052493cd55515d71d92ca28dfe6fc11d782f40b Mon Sep 17 00:00:00 2001 From: Harrison Oglesby Date: Mon, 31 Oct 2022 12:36:41 -0700 Subject: [PATCH 263/407] For #27459 - Add divider composable (#27544) --- .../java/org/mozilla/fenix/compose/Divider.kt | 108 ++++++++++++++++++ .../fenix/compose/tabstray/TabGridItem.kt | 7 +- .../home/recentvisits/view/RecentlyVisited.kt | 22 +--- .../fenix/tabstray/syncedtabs/SyncedTabs.kt | 4 +- 4 files changed, 115 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/compose/Divider.kt diff --git a/app/src/main/java/org/mozilla/fenix/compose/Divider.kt b/app/src/main/java/org/mozilla/fenix/compose/Divider.kt new file mode 100644 index 000000000..67e71db87 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/compose/Divider.kt @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.compose + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Generic divider. + * + * @param modifier [Modifier] used to be applied to the layout of the divider. + */ +@Composable +fun Divider( + modifier: Modifier = Modifier, +) { + androidx.compose.material.Divider( + modifier = modifier, + color = FirefoxTheme.colors.borderPrimary, + ) +} + +/** + * An example of a vertical divider. + */ +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun VerticalDividerPreview() { + FirefoxTheme { + Box( + Modifier + .background(FirefoxTheme.colors.layer1) + .height(75.dp), + ) { + Row { + Text( + text = "Before the line", + modifier = Modifier.padding(end = 10.dp), + ) + + Divider( + modifier = Modifier + .fillMaxHeight() + .width(0.5.dp) + .padding(vertical = 10.dp), + ) + + Text( + text = "After the line", + modifier = Modifier.padding(start = 10.dp), + ) + } + } + } +} + +/** + * An example of divider usage in a list menu. + */ +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun HorizontalDividerPreview() { + FirefoxTheme { + Box( + Modifier + .background(FirefoxTheme.colors.layer1) + .width(100.dp) + .height(175.dp), + ) { + Column(Modifier.padding(start = 4.dp)) { + Text(text = "New") + + Text(text = "Open") + + Text(text = "Open Recent") + + Divider(modifier = Modifier.padding(vertical = 10.dp, horizontal = 24.dp)) + + Text(text = "Close") + + Text(text = "Save") + + Text(text = "Save as") + + Text(text = "Rename") + + Divider(modifier = Modifier.padding(vertical = 10.dp, horizontal = 24.dp)) + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt index 0137dbba4..c5981a985 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt @@ -25,7 +25,6 @@ import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card -import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -46,6 +45,7 @@ import androidx.core.text.BidiFormatter import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.createTab import org.mozilla.fenix.R +import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.Favicon import org.mozilla.fenix.compose.HorizontalFadingEdgeBox import org.mozilla.fenix.compose.ThumbnailCard @@ -159,10 +159,7 @@ fun TabGridItem( ) } - Divider( - color = FirefoxTheme.colors.borderPrimary, - thickness = 1.dp, - ) + Divider() Thumbnail( tab = tab, diff --git a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt index 954c2cb1b..c20f30649 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recentvisits/view/RecentlyVisited.kt @@ -27,7 +27,6 @@ import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card -import androidx.compose.material.Divider import androidx.compose.material.DropdownMenu import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Text @@ -49,6 +48,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.R +import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.EagerFlingBehavior import org.mozilla.fenix.compose.Favicon import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem @@ -188,7 +188,7 @@ private fun RecentlyVisitedHistoryGroup( ) if (showDividerLine) { - RecentlyVisitedDivider() + Divider() } } @@ -248,7 +248,7 @@ private fun RecentlyVisitedHistoryHighlight( ) if (showDividerLine) { - RecentlyVisitedDivider(modifier = Modifier.align(Alignment.BottomCenter)) + Divider(modifier = Modifier.align(Alignment.BottomCenter)) } } @@ -359,22 +359,6 @@ private fun RecentlyVisitedMenu( } } -/** - * A recent item divider. - * - * @param modifier [Modifier] allowing to perfectly place this. - */ -@Composable -private fun RecentlyVisitedDivider( - modifier: Modifier = Modifier, -) { - Divider( - modifier = modifier, - color = FirefoxTheme.colors.borderPrimary, - thickness = 0.5.dp, - ) -} - /** * Get the indexes in list of all items which have more than half showing. */ diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt index 49ed93fff..8ad5ee0c4 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt @@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.Divider import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -35,6 +34,7 @@ import androidx.compose.ui.unit.sp import mozilla.components.browser.storage.sync.TabEntry import mozilla.components.feature.syncedtabs.view.SyncedTabsView import org.mozilla.fenix.R +import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.button.PrimaryButton import org.mozilla.fenix.compose.ext.dashedBorder import org.mozilla.fenix.compose.list.ExpandableListHeader @@ -170,7 +170,7 @@ fun SyncedTabsSectionHeader( onClick = onClick, ) - Divider(color = FirefoxTheme.colors.borderPrimary) + Divider() } } From f0cc6e071e604aba27533f8fe347bb71bd46cb3c Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Tue, 1 Nov 2022 01:44:40 +0100 Subject: [PATCH 264/407] Import l10n. (#27631) --- app/src/main/res/values-nn-rNO/strings.xml | 50 ++++++++-------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 4201cbf6c..7dd2a8c6b 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -81,6 +81,13 @@ Ignorer + + + Vår kraftigaste personvernfunksjon til no isolerer sporarar på tvers av nettstadar. + + + Les meir om totalt vern mot infokapslar + Kameratilgang er nødvendig. Gå til Android-innstillingar, trykk på løyve, og trykk på tillat. @@ -127,13 +134,6 @@ Vis alle nylege faner-knappen - - Du søkte etter «%1$s» - - - %d nettstadar Vis alle synkroniserte faner @@ -277,10 +277,14 @@ Den personlege Firefox-startsida di gjer det no lettare å fortsetje der du slutta. Finn dei siste fanene, bokmerka og søkjeresultata. + + Møt den personlege heimesida di. Nylege faner, bokmerke og søkjeresultat vert viste her. Velkomen til eit uavhengig internett Byt frå telefonen til datamaskina og tilbake + + Hald fram der du slapp med faner frå andre einingar - no på startsida di. Kom i gang @@ -289,6 +293,9 @@ Hopp over + + Lat att + Opne ei ny %1$s-fane @@ -467,12 +474,6 @@ Prøv igjen Les meir - - Endre bakgrunnsbilde ved å trykkje på Firefox-logoen på startsida - - - Firefox-logo - knapp for å endre bakgrunnsbilde Klassisk %s @@ -658,10 +659,6 @@ Liste Rutenett - - Søkjegrupper - - Grupper relaterte nettstadar saman Lat att faner @@ -814,18 +811,6 @@ Ingen historikk her - - Synkronisert frå andre einingar - - Frå andre einingar - - - Logg inn for å sjå historikken synkronisert frå dei andre einingane dine. - - Logga in - - Eller opprett ein Firefox-konto for å starte synkronisering]]> - Nedlastingar fjerna @@ -1065,10 +1050,10 @@ Kopier til utklippstavla - Logg inn for å synkronisere + Logg inn for å synkronisere Logg inn på Sync - + Send til alle einingar Kople til Sync på nytt @@ -1920,4 +1905,5 @@ Gå til innstillingar Firefox-forslag - + + From 7ac5674e81c86c0c202575178596b7f184633be2 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 31 Oct 2022 16:02:49 +0200 Subject: [PATCH 265/407] For #26934 fix showDefaultHomeScreen screenshot test --- .../org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt | 1 - .../java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt index 8f5e632eb..9a359314c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt @@ -43,7 +43,6 @@ class DefaultHomeScreenTest : ScreenshotTest() { @Test fun showDefaultHomeScreen() { homeScreen { - swipeToBottom() verifyAccountsSignInButton() Screengrab.screenshot("HomeScreenRobot_home-screen-scroll") TestAssetHelper.waitingTime diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index f0362fff8..bd9e7817d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -706,9 +706,11 @@ private fun assertStartSyncHeader() { onView(allOf(withText(R.string.onboarding_account_sign_in_header))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } -private fun assertAccountsSignInButton() = +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") From 5ae0ed3830aa7ab6c2407f6b3983c2d7b626cd36 Mon Sep 17 00:00:00 2001 From: iorgamgabriel Date: Fri, 21 Oct 2022 15:56:47 +0300 Subject: [PATCH 266/407] For #27450 Fix Crash from Navigation action/destination org.mozilla.firefox:id/action_savedLoginsAuthFragment_to_loginsListFragment --- .../logins/fragment/SavedLoginsAuthFragment.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index 468fe6cff..b5d0d2735 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -224,10 +224,12 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { * Called when authentication succeeds. */ private fun navigateToSavedLoginsFragment() { - Logins.openLogins.record(NoExtras()) - val directions = - SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToLoginsListFragment() - findNavController().navigate(directions) + if (findNavController().currentDestination?.id == R.id.savedLoginsAuthFragment) { + Logins.openLogins.record(NoExtras()) + val directions = + SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToLoginsListFragment() + findNavController().navigate(directions) + } } private fun navigateToSaveLoginSettingFragment() { From 97f3a1fd8ad65271c9a120ce11476c1a6a13a2d2 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Mon, 31 Oct 2022 14:13:47 +0200 Subject: [PATCH 267/407] For #25811 - Add header to unified search engine menu --- .../fenix/search/SearchDialogFragment.kt | 4 +- .../search/toolbar/SearchSelectorMenu.kt | 34 +++++++------- app/src/main/res/values/strings.xml | 2 + .../search/toolbar/SearchSelectorMenuTest.kt | 47 +++++++++++++++++++ 4 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenuTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index 6562e5942..d4d885a3b 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -730,9 +730,9 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { ) { interactor.onMenuItemTapped(SearchSelectorMenu.Item.SearchEngine(it)) } - } + searchSelectorMenu.menuItems() + } - searchSelectorMenu.menuController.submitList(searchEngineList) + searchSelectorMenu.menuController.submitList(searchSelectorMenu.menuItems(searchEngineList)) toolbarView.view.invalidateActions() } diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt index 8f3ca1320..3152c05dc 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenu.kt @@ -5,12 +5,13 @@ package org.mozilla.fenix.search.toolbar import android.content.Context -import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources import mozilla.components.browser.menu2.BrowserMenuController import mozilla.components.browser.state.search.SearchEngine import mozilla.components.concept.menu.MenuController +import mozilla.components.concept.menu.candidate.DecorativeTextMenuCandidate import mozilla.components.concept.menu.candidate.DrawableMenuIcon +import mozilla.components.concept.menu.candidate.MenuCandidate import mozilla.components.concept.menu.candidate.TextMenuCandidate import mozilla.components.support.ktx.android.content.getColorFromAttr import org.mozilla.fenix.R @@ -47,21 +48,22 @@ class SearchSelectorMenu( val menuController: MenuController by lazy { BrowserMenuController() } - @VisibleForTesting - internal fun menuItems(): List { - return listOf( - TextMenuCandidate( - text = context.getString(R.string.search_settings_menu_item), - start = DrawableMenuIcon( - drawable = AppCompatResources.getDrawable( - context, - R.drawable.mozac_ic_settings, - ), - tint = context.getColorFromAttr(R.attr.textPrimary), - ), - ) { - interactor.onMenuItemTapped(Item.SearchSettings) - }, + internal fun menuItems(searchEngines: List): List { + val headerCandidate = DecorativeTextMenuCandidate( + text = context.getString(R.string.search_header_menu_item), ) + val settingsCandidate = TextMenuCandidate( + text = context.getString(R.string.search_settings_menu_item), + start = DrawableMenuIcon( + drawable = AppCompatResources.getDrawable( + context, + R.drawable.mozac_ic_settings, + ), + tint = context.getColorFromAttr(R.attr.textPrimary), + ), + ) { + interactor.onMenuItemTapped(Item.SearchSettings) + } + return listOf(headerCandidate) + searchEngines + listOf(settingsCandidate) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ade8fc1d..3c24676a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -239,6 +239,8 @@ Search directly from the address bar Search settings + + This time search: diff --git a/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenuTest.kt b/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenuTest.kt new file mode 100644 index 000000000..38c49564d --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/search/toolbar/SearchSelectorMenuTest.kt @@ -0,0 +1,47 @@ +package org.mozilla.fenix.search.toolbar + +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.verify +import mozilla.components.concept.menu.candidate.DecorativeTextMenuCandidate +import mozilla.components.concept.menu.candidate.TextMenuCandidate +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class SearchSelectorMenuTest { + + private lateinit var menu: SearchSelectorMenu + private val interactor = mockk() + + @Before + fun setup() { + menu = SearchSelectorMenu(testContext, interactor) + } + + @Test + fun `WHEN building the menu items THEN the header is the first item AND the search settings is the last item`() { + every { interactor.onMenuItemTapped(any()) } just Runs + + val items = menu.menuItems(listOf()) + val lastItem = (items.last() as TextMenuCandidate) + lastItem.onClick() + + assertEquals( + testContext.getString(R.string.search_header_menu_item), + (items.first() as DecorativeTextMenuCandidate).text, + ) + assertEquals( + testContext.getString(R.string.search_settings_menu_item), + lastItem.text, + ) + verify { interactor.onMenuItemTapped(SearchSelectorMenu.Item.SearchSettings) } + } +} From 418302dbfaeccefab1c69806e2f34c6e48ff1eae Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 31 Oct 2022 12:23:06 +0200 Subject: [PATCH 268/407] For #27522 new changeSearchEnginesBasedOnTextTest UI test --- .../java/org/mozilla/fenix/ui/SettingsSearchTest.kt | 13 +++++++++++++ .../java/org/mozilla/fenix/ui/robots/SearchRobot.kt | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 7ecec9759..4380a0400 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -370,4 +370,17 @@ class SettingsSearchTest { ) } } + + // Expected for en-us defaults + @Test + fun changeSearchEnginesBasedOnTextTest() { + homeScreen { + }.openSearch { + typeSearch("D") + verifySearchEnginePrompt(activityTestRule, "DuckDuckGo") + clickSearchEnginePrompt(activityTestRule, "DuckDuckGo") + }.submitQuery("firefox") { + verifyUrl("duckduckgo.com/?q=firefox") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index a50808cca..6181f3aa3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -188,6 +188,8 @@ class SearchRobot { } fun verifySearchSettings() = assertSearchSettings() + fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) = + assertSearchEnginePrompt(rule, searchEngineName) fun verifySearchBarEmpty() = assertSearchBarEmpty() fun verifyKeyboardVisibility() = assertKeyboardVisibility(isExpectedToBeVisible = true) @@ -311,6 +313,9 @@ class SearchRobot { pasteText.click() } + fun clickSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) = + rule.onNodeWithText("Search $searchEngineName").performClick() + fun expandSearchSuggestionsList() { onView(allOf(withId(R.id.search_wrapper))).perform( closeSoftKeyboard(), @@ -408,6 +413,14 @@ private fun waitForSearchSuggestions(rule: ComposeTestRule, searchSuggestion: St mDevice.findObject(UiSelector().textContains(searchSuggestion)).waitForExists(waitingTime) } +private fun assertSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) { + rule.waitForIdle() + rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed() + rule.onNodeWithText( + getStringResource(R.string.search_engine_suggestions_description), + ).assertIsDisplayed() +} + private fun assertSearchView() = assertTrue( mDevice.findObject( From 3efd1dc9f201432ac3cf4a24e3514c17e7d5ce6a Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Mon, 31 Oct 2022 12:29:25 +0200 Subject: [PATCH 269/407] For #27522 new verifySearchEnginesWithRTLLocale UI test --- .../mozilla/fenix/ui/SettingsSearchTest.kt | 45 +++++++++++++++++++ .../mozilla/fenix/ui/robots/SearchRobot.kt | 23 ++++++++++ .../java/org/mozilla/fenix/ui/util/Strings.kt | 3 +- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 4380a0400..fc2ea4080 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -7,16 +7,20 @@ import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test +import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset +import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.setTextToClipBoard import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.util.ARABIC_LANGUAGE_HEADER class SettingsSearchTest { private lateinit var mockWebServer: MockWebServer @@ -383,4 +387,45 @@ class SettingsSearchTest { verifyUrl("duckduckgo.com/?q=firefox") } } + + // Expected for app language set to Arabic + @Test + fun verifySearchEnginesWithRTLLocale() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + toggleShowSearchShortcuts() + }.goBack { + }.openLanguageSubMenu { + TestHelper.registerAndCleanupIdlingResources( + RecyclerViewIdlingResource( + activityTestRule.activity.findViewById(R.id.locale_list), + 2, + ), + ) { + selectLanguage("Arabic") + verifyLanguageHeaderIsTranslated(ARABIC_LANGUAGE_HEADER) + } + } + + exitMenu() + + homeScreen { + }.openSearch { + verifyTranslatedFocusedNavigationToolbar("ابحث أو أدخِل عنوانا") + verifySearchEngineShortcuts( + activityTestRule, + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + /* Disabled Arabic Wikipedia verification + until https://github.com/mozilla-mobile/fenix/issues/12236 gets fixed + "ويكيبيديا (ar)" + */ + ) + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index 6181f3aa3..1b0d69cb3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -323,6 +323,20 @@ class SearchRobot { awesomeBar.swipeUp(2) } + fun verifyTranslatedFocusedNavigationToolbar(toolbarHintString: String) = + assertTranslatedFocusedNavigationToolbar(toolbarHintString) + + fun verifySearchEngineShortcuts(rule: ComposeTestRule, vararg searchEngines: String) { + mDevice.findObject( + UiSelector().resourceId("$packageName:id/awesome_bar"), + ).swipeUp(1) + + for (searchEngine in searchEngines) { + rule.waitForIdle() + rule.onNodeWithText(searchEngine).assertIsDisplayed() + } + } + fun verifyTypedToolbarText(expectedText: String) { mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) @@ -552,6 +566,15 @@ private fun assertDefaultSearchEngine(expectedText: String) = ).waitForExists(waitingTime), ) +private fun assertTranslatedFocusedNavigationToolbar(toolbarHintString: String) = + assertTrue( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view") + .textContains(toolbarHintString), + ).waitForExists(waitingTime), + ) + private val awesomeBar = mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt index 4e92643b3..729200c54 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt @@ -8,6 +8,7 @@ const val STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER = "Pick up where you left off const val STRING_ONBOARDING_TRACKING_PROTECTION_HEADER = "Privacy protection by default" const val STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER = "Pick your toolbar placement" const val FRENCH_LANGUAGE_HEADER = "Langues" +const val ROMANIAN_LANGUAGE_HEADER = "Limbă" +const val ARABIC_LANGUAGE_HEADER = "اللغة" const val FR_SETTINGS = "Paramètres" const val FRENCH_SYSTEM_LOCALE_OPTION = "Utiliser la langue de l’appareil" -const val ROMANIAN_LANGUAGE_HEADER = "Limbă" From 9c466393314e6cbc47a17c5818270162ef2e9b4e Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 1 Nov 2022 12:44:56 +0200 Subject: [PATCH 270/407] For #27522 new toggleSearchEnginesShortcutListTest UI test --- .../java/org/mozilla/fenix/ui/SearchTest.kt | 4 +- .../mozilla/fenix/ui/SettingsSearchTest.kt | 56 +++++++++++++++++++ .../mozilla/fenix/ui/robots/SearchRobot.kt | 31 +++++++--- .../ui/robots/SettingsSubMenuSearchRobot.kt | 29 ++++++++++ 4 files changed, 111 insertions(+), 9 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 5dc61172c..95f492c64 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -152,8 +152,8 @@ class SearchTest { }.goBack { }.openSearch { scrollToSearchEngineSettings(activityTestRule) - clickSearchEngineSettings(activityTestRule) - verifySearchSettings() + }.clickSearchEngineSettings(activityTestRule) { + verifySearchToolbar() } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index fc2ea4080..d1de65624 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -428,4 +428,60 @@ class SettingsSearchTest { ) } } + + // Expected for en-us defaults + @Test + fun toggleSearchEnginesShortcutListTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + verifyShowSearchEnginesToggleState(false) + toggleShowSearchShortcuts() + verifyShowSearchEnginesToggleState(true) + } + + exitMenu() + + homeScreen { + }.openSearch { + verifySearchEngineShortcuts( + activityTestRule, + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + "Wikipedia", + ) + }.clickSearchEngineSettings(activityTestRule) { + toggleShowSearchShortcuts() + verifyShowSearchEnginesToggleState(false) + } + + exitMenu() + + homeScreen { + }.openSearch { + verifySearchEngineShortcutsAreNotDisplayed( + activityTestRule, + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + "Wikipedia", + ) + clickSearchEngineShortcutButton() + verifySearchEngineShortcuts( + activityTestRule, + "Google", + "Bing", + "Amazon.com", + "DuckDuckGo", + "eBay", + "Wikipedia", + ) + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index 1b0d69cb3..f4fb7a62d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -286,13 +286,6 @@ class SearchRobot { .performScrollToIndex(5) } - fun clickSearchEngineSettings(rule: ComposeTestRule) { - rule.onNodeWithText("Search engine settings") - .assertIsDisplayed() - .assertHasClickAction() - .performClick() - } - fun clickClearButton() { clearButton().click() } @@ -337,6 +330,17 @@ class SearchRobot { } } + fun verifySearchEngineShortcutsAreNotDisplayed(rule: ComposeTestRule, vararg searchEngines: String) { + mDevice.findObject( + UiSelector().resourceId("$packageName:id/pill_wrapper_divider"), + ).waitForExists(waitingTime) + + for (searchEngine in searchEngines) { + rule.waitForIdle() + rule.onNodeWithText(searchEngine).assertDoesNotExist() + } + } + fun verifyTypedToolbarText(expectedText: String) { mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) @@ -399,6 +403,19 @@ class SearchRobot { NavigationToolbarRobot().interact() return NavigationToolbarRobot.Transition() } + + fun clickSearchEngineSettings( + rule: ComposeTestRule, + interact: SettingsSubMenuSearchRobot.() -> Unit, + ): SettingsSubMenuSearchRobot.Transition { + rule.onNodeWithText("Search engine settings") + .assertIsDisplayed() + .assertHasClickAction() + .performClick() + + SettingsSubMenuSearchRobot().interact() + return SettingsSubMenuSearchRobot.Transition() + } } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt index cee8dcd7f..102283070 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSearchRobot.kt @@ -289,6 +289,8 @@ class SettingsSubMenuSearchRobot { ) } + fun verifyShowSearchEnginesToggleState(enabled: Boolean) = assertShowSearchEnginesToggle(enabled) + class Transition { fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { mDevice.waitForIdle() @@ -385,6 +387,33 @@ private fun assertEngineListDoesNotContain(searchEngineName: String) { private fun assertThreeDotButtonIsNotDisplayed(searchEngineName: String) = threeDotMenu(searchEngineName).check(matches(not(isDisplayed()))) +private fun assertShowSearchEnginesToggle(enabled: Boolean) = + if (enabled) { + onView(withText(R.string.preferences_show_search_engines)) + .check( + matches( + hasCousin( + allOf( + withClassName(endsWith("Switch")), + ViewMatchers.isChecked(), + ), + ), + ), + ) + } else { + onView(withText(R.string.preferences_show_search_engines)) + .check( + matches( + hasCousin( + allOf( + withClassName(endsWith("Switch")), + ViewMatchers.isNotChecked(), + ), + ), + ), + ) + } + private fun threeDotMenu(searchEngineName: String) = onView( allOf( From 307460c3c351536dfaa1bdea50901482dde9704d Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 1 Nov 2022 12:46:22 +0200 Subject: [PATCH 271/407] For #27522 refactor shortcutSearchEngineSettingsTest to setDefaultSearchEngineFromShortcut --- .../java/org/mozilla/fenix/ui/SearchTest.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 95f492c64..e524841fd 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -142,7 +142,7 @@ class SearchTest { } @Test - fun shortcutSearchEngineSettingsTest() { + fun setDefaultSearchEngineFromShortcutsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { @@ -153,7 +153,15 @@ class SearchTest { }.openSearch { scrollToSearchEngineSettings(activityTestRule) }.clickSearchEngineSettings(activityTestRule) { - verifySearchToolbar() + changeDefaultSearchEngine("DuckDuckGo") + } + + exitMenu() + + homeScreen { + }.openSearch { + }.submitQuery("firefox") { + verifyUrl("duckduckgo.com/?q=firefox") } } From a5c1c578bd89524752a84ea06065cebf1f25d60c Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 1 Nov 2022 12:47:25 +0200 Subject: [PATCH 272/407] For #27522 remove shortcutButtonTest UI test and unused SearchRobot functions --- .../java/org/mozilla/fenix/ui/SearchTest.kt | 26 -------- .../mozilla/fenix/ui/robots/SearchRobot.kt | 59 ------------------- 2 files changed, 85 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index e524841fd..2ceda2859 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -30,7 +30,6 @@ import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.helpers.TestHelper.grantPermission import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem import org.mozilla.fenix.helpers.TestHelper.setCustomSearchEngine -import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.multipleSelectionToolbar @@ -116,31 +115,6 @@ class SearchTest { } } - @Test - fun shortcutButtonTest() { - val searchEngineURL = "bing.com/search?q=mozilla%20firefox" - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - }.openSearchSubMenu { - toggleShowSearchShortcuts() - }.goBack { - }.goBack { - }.openSearch { - verifySearchBarEmpty() - clickSearchEngineButton(activityTestRule, "Bing") - typeSearch("mozilla") - verifySearchEngineResults(activityTestRule, "mozilla firefox", "Bing") - clickSearchEngineResult(activityTestRule, "mozilla firefox") - } - - browserScreen { - waitForPageToLoad() - verifyUrl(searchEngineURL) - } - } - @Test fun setDefaultSearchEngineFromShortcutsTest() { homeScreen { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt index f4fb7a62d..592ce4d9d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -8,13 +8,11 @@ package org.mozilla.fenix.ui.robots import android.os.Build import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertAny import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.junit4.android.ComposeNotIdleException -import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -32,7 +30,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector -import androidx.test.uiautomator.Until import org.hamcrest.CoreMatchers.allOf import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse @@ -49,9 +46,7 @@ import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.isPackageInstalled import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName -import org.mozilla.fenix.helpers.TestHelper.waitForObjects import org.mozilla.fenix.helpers.click -import org.mozilla.fenix.helpers.ext.waitNotNull /** * Implementation of Robot Pattern for the search fragment. @@ -96,11 +91,6 @@ class SearchRobot { fun verifySearchEngineButton() = assertSearchButton() - fun verifySearchEngineResults(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String) { - rule.waitUntil(waitingTime, waitForSearchSuggestions(rule, searchSuggestion, searchEngineName)) - rule.onNodeWithText(searchSuggestion).assertIsDisplayed() - } - fun verifySearchEngineSuggestionResults(rule: ComposeTestRule, searchSuggestion: String) { rule.waitForIdle() for (i in 1..RETRY_COUNT) { @@ -187,7 +177,6 @@ class SearchRobot { ).click() } - fun verifySearchSettings() = assertSearchSettings() fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) = assertSearchEnginePrompt(rule, searchEngineName) fun verifySearchBarEmpty() = assertSearchBarEmpty() @@ -245,33 +234,6 @@ class SearchRobot { mDevice.waitForIdle() } - fun clickSearchEngineButton(rule: ComposeTestRule, searchEngineName: String) { - rule.waitForIdle() - - mDevice.waitForObjects( - mDevice.findObject( - UiSelector().textContains(searchEngineName), - ), - ) - - rule.onNodeWithText(searchEngineName) - .assertExists() - .assertHasClickAction() - .performClick() - } - - fun clickSearchEngineResult(rule: ComposeTestRule, searchSuggestion: String) { - mDevice.waitNotNull( - Until.findObjects(By.text(searchSuggestion)), - waitingTime, - ) - - rule.onNodeWithText(searchSuggestion) - .assertIsDisplayed() - .assertHasClickAction() - .performClick() - } - @OptIn(ExperimentalTestApi::class) fun scrollToSearchEngineSettings(rule: ComposeTestRule) { // Soft keyboard is visible on screen on view access; hide it @@ -399,11 +361,6 @@ class SearchRobot { return BrowserRobot.Transition() } - fun goToSearchEngine(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition { - NavigationToolbarRobot().interact() - return NavigationToolbarRobot.Transition() - } - fun clickSearchEngineSettings( rule: ComposeTestRule, interact: SettingsSubMenuSearchRobot.() -> Unit, @@ -436,14 +393,6 @@ private fun clearButton() = private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper")) -private fun waitForSearchSuggestions(rule: ComposeTestRule, searchSuggestion: String, searchEngineName: String): () -> Boolean = - { - rule.waitForIdle() - mDevice.waitForObjects(mDevice.findObject(UiSelector().textContains(searchSuggestion))) - rule.onAllNodesWithTag("mozac.awesomebar.suggestion").assertAny(hasText(searchSuggestion) and hasText(searchEngineName)) - mDevice.findObject(UiSelector().textContains(searchSuggestion)).waitForExists(waitingTime) - } - private fun assertSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) { rule.waitForIdle() rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed() @@ -478,14 +427,6 @@ private fun assertSearchButton() = ).waitForExists(waitingTime), ) -private fun assertSearchWithText() = - onView(allOf(withText("THIS TIME, SEARCH WITH:"))) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - -private fun assertSearchSettings() = - onView(allOf(withText("Default search engine"))) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - private fun assertSearchBarEmpty() = assertTrue( mDevice.findObject( From bc7690760581369299750be7c79e17d0b3924da2 Mon Sep 17 00:00:00 2001 From: DreVla Date: Tue, 1 Nov 2022 12:50:12 +0200 Subject: [PATCH 273/407] For #10344 - Enable tab reordering in beta/release --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 5 ----- .../fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt | 3 +-- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index f93488240..06acac6c2 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -66,11 +66,6 @@ object FeatureFlags { */ const val inactiveTabs = true - /** - * Allows tabs to be dragged around as long as tab groups are disabled - */ - val tabReorderingFeature = Config.channel.isNightlyOrDebug - /** * Show Pocket recommended stories on home. */ diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt index 0866e2ed1..f816c9bdc 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt @@ -30,7 +30,6 @@ import mozilla.components.concept.base.images.ImageLoader import mozilla.components.concept.engine.mediasession.MediaSession import mozilla.components.support.ktx.kotlin.MAX_URI_LENGTH import mozilla.telemetry.glean.private.NoExtras -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Tab import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -244,7 +243,7 @@ abstract class AbstractBrowserTabViewHolder( val touchStart = touchStartPoint val selected = holder.selectedItems val selectsOnlyThis = (selected.size == 1 && selected.contains(item)) - if (FeatureFlags.tabReorderingFeature && selectsOnlyThis && touchStart != null) { + if (selectsOnlyThis && touchStart != null) { // If the parent is null then return early and mark the event as unhandled val parent = itemView.parent as? AbstractBrowserTrayList ?: return@setOnTouchListener false From 50c8e56bd205b0dff7a7167cae9b1d4f78b98abe Mon Sep 17 00:00:00 2001 From: Mugurell Date: Mon, 31 Oct 2022 18:39:06 +0200 Subject: [PATCH 274/407] For #27627 - Check the TCP CFR status lazily Use lazyFeatureFlagPreference as a quick small way to avoid a race between initializing the value and the Nimbus initialization based on which the value should be calculated. This is the same flow that the other MR experiments use. --- app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 7f76ccbba..1fdd7d6e3 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -610,9 +610,10 @@ class Settings(private val appContext: Context) : PreferencesHolder { /** * Indicates if the total cookie protection CRF should be shown. */ - var shouldShowTotalCookieProtectionCFR by booleanPreference( + var shouldShowTotalCookieProtectionCFR by lazyFeatureFlagPreference( appContext.getPreferenceKey(R.string.pref_key_should_show_total_cookie_protection_popup), - default = mr2022Sections[Mr2022Section.TCP_CFR] == true, + featureFlag = true, + default = { mr2022Sections[Mr2022Section.TCP_CFR] == true }, ) val blockCookiesSelectionInCustomTrackingProtection by stringPreference( From 90b8d339e104a6f4f39fea2f5e288dc4ce705b68 Mon Sep 17 00:00:00 2001 From: dsmithpadilla <88508950+dsmithpadilla@users.noreply.github.com> Date: Tue, 1 Nov 2022 11:32:28 -0400 Subject: [PATCH 275/407] Update to Android-Components 108.0.20221101143225 AC version off the new firefox-android repo --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0aabb4e79..e32eac27d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221031143305" + const val VERSION = "108.0.20221101143225" } From 62a661ab970ef751d13f0a78710a6c06220c1ee8 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Tue, 1 Nov 2022 17:55:58 +0200 Subject: [PATCH 276/407] For #26911 - Allow users to enable re-supported Fennec extensions --- .../addons/InstalledAddonDetailsFragment.kt | 32 ++++++++- .../mozilla/fenix/components/Components.kt | 10 +-- .../InstalledAddonDetailsFragmentTest.kt | 65 +++++++++++++++++++ 3 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt index 7eb06ba7a..7c009bc30 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.VisibleForTesting import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -17,7 +18,9 @@ import androidx.navigation.fragment.findNavController import com.google.android.material.switchmaterial.SwitchMaterial import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import mozilla.components.concept.engine.webextension.EnableSource import mozilla.components.feature.addons.Addon +import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.ui.translateName import org.mozilla.fenix.HomeActivity @@ -32,7 +35,8 @@ import org.mozilla.fenix.ext.showToolbar */ @Suppress("LargeClass", "TooManyFunctions") class InstalledAddonDetailsFragment : Fragment() { - private lateinit var addon: Addon + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal lateinit var addon: Addon private var _binding: FragmentInstalledAddOnDetailsBinding? = null private val binding get() = _binding!! @@ -124,8 +128,8 @@ class InstalledAddonDetailsFragment : Fragment() { switch.isClickable = false binding.removeAddOn.isEnabled = false if (isChecked) { - addonManager.enableAddon( - addon, + enableAddon( + addonManager, onSuccess = { runIfFragmentIsAttached { this.addon = it @@ -207,6 +211,28 @@ class InstalledAddonDetailsFragment : Fragment() { } } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun enableAddon( + addonManager: AddonManager, + onSuccess: (Addon) -> Unit, + onError: (Throwable) -> Unit, + ) { + // If the addon is migrated from Fennec and supported in Fenix, for the addon to be enabled, + // we need to also request the addon to be enabled as supported by the app + if (addon.isSupported() && addon.isDisabledAsUnsupported()) { + addonManager.enableAddon( + addon, + EnableSource.APP_SUPPORT, + { enabledAddon -> + addonManager.enableAddon(enabledAddon, EnableSource.USER, onSuccess, onError) + }, + onError, + ) + } else { + addonManager.enableAddon(addon, EnableSource.USER, onSuccess, onError) + } + } + private fun bindSettings() { binding.settings.apply { isVisible = shouldSettingsBeVisible() diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 97944688c..1d48a4272 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -7,10 +7,8 @@ package org.mozilla.fenix.components import android.annotation.SuppressLint import android.app.Application import android.content.Context -import android.content.Intent import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -import androidx.core.net.toUri import com.google.android.play.core.review.ReviewManagerFactory import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.amo.AddonCollectionProvider @@ -22,7 +20,6 @@ import mozilla.components.support.base.worker.Frequency import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags -import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.autofill.AutofillConfirmActivity import org.mozilla.fenix.autofill.AutofillSearchActivity @@ -33,8 +30,8 @@ import org.mozilla.fenix.ext.asRecentTabs import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.filterState import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.gleanplumb.state.MessagingMiddleware import org.mozilla.fenix.ext.sort +import org.mozilla.fenix.gleanplumb.state.MessagingMiddleware import org.mozilla.fenix.home.PocketUpdatesMiddleware import org.mozilla.fenix.home.blocklist.BlocklistHandler import org.mozilla.fenix.home.blocklist.BlocklistMiddleware @@ -142,11 +139,6 @@ class Components(private val context: Context) { DefaultSupportedAddonsChecker( context, Frequency(12, TimeUnit.HOURS), - onNotificationClickIntent = Intent(context, HomeActivity::class.java).apply { - action = Intent.ACTION_VIEW - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - data = "${BuildConfig.DEEP_LINK_SCHEME}://settings_addon_manager".toUri() - }, ) } diff --git a/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt new file mode 100644 index 000000000..779c8b010 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt @@ -0,0 +1,65 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.addons + +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.slot +import io.mockk.spyk +import io.mockk.verify +import mozilla.components.concept.engine.webextension.EnableSource +import mozilla.components.feature.addons.Addon +import mozilla.components.feature.addons.AddonManager +import org.junit.Before +import org.junit.Test + +class InstalledAddonDetailsFragmentTest { + + private lateinit var fragment: InstalledAddonDetailsFragment + private val addonManager = mockk() + + @Before + fun setup() { + fragment = spyk(InstalledAddonDetailsFragment()) + } + + @Test + fun `GIVEN add-on is supported and not disabled WHEN enabling it THEN the add-on is requested by the user`() { + val addon = mockk() + every { addon.isDisabledAsUnsupported() } returns false + every { addon.isSupported() } returns true + every { fragment.addon } returns addon + every { addonManager.enableAddon(any(), any(), any(), any()) } just Runs + + fragment.enableAddon(addonManager, {}, {}) + + verify { addonManager.enableAddon(addon, EnableSource.USER, any(), any()) } + } + + @Test + fun `GIVEN add-on is supported and disabled as previously unsupported WHEN enabling it THEN the add-on is requested by both the app and the user`() { + val addon = mockk() + every { addon.isDisabledAsUnsupported() } returns true + every { addon.isSupported() } returns true + every { fragment.addon } returns addon + val capturedAddon = slot() + val capturedOnSuccess = slot<(Addon) -> Unit>() + every { + addonManager.enableAddon( + capture(capturedAddon), + any(), + capture(capturedOnSuccess), + any(), + ) + } answers { capturedOnSuccess.captured.invoke(capturedAddon.captured) } + + fragment.enableAddon(addonManager, {}, {}) + + verify { addonManager.enableAddon(addon, EnableSource.APP_SUPPORT, any(), any()) } + verify { addonManager.enableAddon(capturedAddon.captured, EnableSource.USER, any(), any()) } + } +} From 0933f901fc872c80a87f4919662cf82e0ee5afc4 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Fri, 28 Oct 2022 09:55:58 -0700 Subject: [PATCH 277/407] For #27579 - Fix broken previews for MessageCard --- .../org/mozilla/fenix/compose/MessageCard.kt | 119 +++++++----------- .../onboarding/MessageCardViewHolder.kt | 4 +- 2 files changed, 49 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt index a4aa3e14c..0f94e2b62 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.compose +import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -27,26 +28,27 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import org.mozilla.experiments.nimbus.StringHolder import org.mozilla.fenix.R import org.mozilla.fenix.compose.button.PrimaryButton -import org.mozilla.fenix.gleanplumb.Message -import org.mozilla.fenix.nimbus.MessageData -import org.mozilla.fenix.nimbus.StyleData import org.mozilla.fenix.theme.FirefoxTheme -import org.mozilla.fenix.theme.Theme /** * Message Card. * - * @param message [Message] that holds a representation of GleanPlum message from Nimbus. + * @param messageText The message card's body text to be displayed. + * @param titleText An optional title of message card. If the title is blank or null is provided, + * the title will not be shown. + * @param buttonText An optional button text of the message card. If the button text is blank or null is provided, + * the button won't be shown. * @param onClick Invoked when user clicks on the message card. * @param onCloseButtonClick Invoked when user clicks on close button to remove message. */ @Suppress("LongMethod") @Composable fun MessageCard( - message: Message, + messageText: String, + titleText: String? = null, + buttonText: String? = null, onClick: () -> Unit, onCloseButtonClick: () -> Unit, ) { @@ -54,7 +56,7 @@ fun MessageCard( modifier = Modifier .padding(vertical = 16.dp) .then( - if (message.data.buttonLabel.isNullOrBlank()) { + if (buttonText.isNullOrBlank()) { Modifier.clickable(onClick = onClick) } else { Modifier @@ -68,13 +70,12 @@ fun MessageCard( .padding(all = 16.dp) .fillMaxWidth(), ) { - val title = message.data.title - if (!title.isNullOrBlank()) { + if (!titleText.isNullOrBlank()) { Row( modifier = Modifier.fillMaxWidth(), ) { Text( - text = title, + text = titleText, modifier = Modifier.weight(1f), color = FirefoxTheme.colors.textPrimary, overflow = TextOverflow.Ellipsis, @@ -97,7 +98,7 @@ fun MessageCard( } Text( - text = message.data.text, + text = messageText, modifier = Modifier.fillMaxWidth(), fontSize = 14.sp, color = FirefoxTheme.colors.textSecondary, @@ -107,7 +108,7 @@ fun MessageCard( modifier = Modifier.fillMaxWidth(), ) { Text( - text = message.data.text, + text = messageText, modifier = Modifier.weight(1f), fontSize = 14.sp, color = FirefoxTheme.colors.textPrimary, @@ -128,12 +129,11 @@ fun MessageCard( } } - val buttonLabel = message.data.buttonLabel - if (!buttonLabel.isNullOrBlank()) { + if (!buttonText.isNullOrBlank()) { Spacer(modifier = Modifier.height(16.dp)) PrimaryButton( - text = buttonLabel, + text = buttonText, onClick = onClick, ) } @@ -142,28 +142,18 @@ fun MessageCard( } @Composable -@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) private fun MessageCardPreview() { - FirefoxTheme(theme = Theme.getTheme()) { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + FirefoxTheme { + Box( + Modifier + .background(FirefoxTheme.colors.layer1) + .padding(all = 16.dp), + ) { MessageCard( - message = Message( - id = "end-", - data = MessageData( - title = StringHolder( - R.string.bookmark_empty_title_error, - "Title", - ), - text = StringHolder( - R.string.default_browser_experiment_card_text, - "description", - ), - ), - action = "action", - style = StyleData(), - triggers = listOf("trigger"), - metadata = Message.Metadata("end-"), - ), + messageText = stringResource(id = R.string.default_browser_experiment_card_text), + titleText = stringResource(id = R.string.bookmark_empty_title_error), onClick = {}, onCloseButtonClick = {}, ) @@ -172,24 +162,17 @@ private fun MessageCardPreview() { } @Composable -@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) private fun MessageCardWithoutTitlePreview() { - FirefoxTheme(theme = Theme.getTheme()) { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + FirefoxTheme { + Box( + modifier = Modifier + .background(FirefoxTheme.colors.layer1) + .padding(all = 16.dp), + ) { MessageCard( - message = Message( - id = "end-", - data = MessageData( - text = StringHolder( - R.string.default_browser_experiment_card_text, - "description", - ), - ), - action = "action", - style = StyleData(), - triggers = listOf("trigger"), - metadata = Message.Metadata("end-"), - ), + messageText = stringResource(id = R.string.default_browser_experiment_card_text), onClick = {}, onCloseButtonClick = {}, ) @@ -198,29 +181,19 @@ private fun MessageCardWithoutTitlePreview() { } @Composable -@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) private fun MessageCardWithButtonLabelPreview() { - FirefoxTheme(theme = Theme.getTheme()) { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + FirefoxTheme { + Box( + modifier = Modifier + .background(FirefoxTheme.colors.layer1) + .padding(all = 16.dp), + ) { MessageCard( - message = Message( - id = "end-", - data = MessageData( - buttonLabel = StringHolder(R.string.preferences_set_as_default_browser, ""), - title = StringHolder( - R.string.bookmark_empty_title_error, - "Title", - ), - text = StringHolder( - R.string.default_browser_experiment_card_text, - "description", - ), - ), - action = "action", - style = StyleData(), - triggers = listOf("trigger"), - metadata = Message.Metadata("end-"), - ), + messageText = stringResource(id = R.string.default_browser_experiment_card_text), + titleText = stringResource(id = R.string.bookmark_empty_title_error), + buttonText = stringResource(id = R.string.preferences_set_as_default_browser), onClick = {}, onCloseButtonClick = {}, ) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt index 5af751f5f..f868e4520 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt @@ -49,7 +49,9 @@ class MessageCardViewHolder( val message by remember { mutableStateOf(messageGlobal) } MessageCard( - message = message, + messageText = message.data.text, + titleText = message.data.title, + buttonText = message.data.buttonLabel, onClick = { interactor.onMessageClicked(message) }, onCloseButtonClick = { interactor.onMessageClosedClicked(message) }, ) From 8857073e5b094c13d4ed9126c519981d92291a0f Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Tue, 1 Nov 2022 10:16:34 -0700 Subject: [PATCH 278/407] For #27485 - Add optional overrides for the colors in `Button` Composables --- .../mozilla/fenix/compose/button/Button.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt b/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt index 22c4a5255..d344fb681 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt @@ -38,7 +38,7 @@ import org.mozilla.fenix.theme.Theme * @param onClick Invoked when the user clicks on the button. */ @Composable -fun Button( +private fun Button( text: String, textColor: Color, backgroundColor: Color, @@ -79,19 +79,23 @@ fun Button( * Primary button. * * @param text The button text to be displayed. + * @param textColor [Color] to apply to the button text. + * @param backgroundColor The background [Color] of the button. * @param icon Optional [Painter] used to display an [Icon] before the button text. * @param onClick Invoked when the user clicks on the button. */ @Composable fun PrimaryButton( text: String, + textColor: Color = FirefoxTheme.colors.textActionPrimary, + backgroundColor: Color = FirefoxTheme.colors.actionPrimary, icon: Painter? = null, onClick: () -> Unit, ) { Button( text = text, - textColor = FirefoxTheme.colors.textActionPrimary, - backgroundColor = FirefoxTheme.colors.actionPrimary, + textColor = textColor, + backgroundColor = backgroundColor, icon = icon, tint = FirefoxTheme.colors.iconActionPrimary, onClick = onClick, @@ -129,19 +133,23 @@ fun SecondaryButton( * Tertiary button. * * @param text The button text to be displayed. + * @param textColor [Color] to apply to the button text. + * @param backgroundColor The background [Color] of the button. * @param icon Optional [Painter] used to display an [Icon] before the button text. * @param onClick Invoked when the user clicks on the button. */ @Composable fun TertiaryButton( text: String, + textColor: Color = FirefoxTheme.colors.textActionTertiary, + backgroundColor: Color = FirefoxTheme.colors.actionTertiary, icon: Painter? = null, onClick: () -> Unit, ) { Button( text = text, - textColor = FirefoxTheme.colors.textActionTertiary, - backgroundColor = FirefoxTheme.colors.actionTertiary, + textColor = textColor, + backgroundColor = backgroundColor, icon = icon, tint = FirefoxTheme.colors.iconActionTertiary, onClick = onClick, @@ -152,19 +160,23 @@ fun TertiaryButton( * Destructive button. * * @param text The button text to be displayed. + * @param textColor [Color] to apply to the button text. + * @param backgroundColor The background [Color] of the button. * @param icon Optional [Painter] used to display an [Icon] before the button text. * @param onClick Invoked when the user clicks on the button. */ @Composable fun DestructiveButton( text: String, + textColor: Color = FirefoxTheme.colors.textWarningButton, + backgroundColor: Color = FirefoxTheme.colors.actionSecondary, icon: Painter? = null, onClick: () -> Unit, ) { Button( text = text, - textColor = FirefoxTheme.colors.textWarningButton, - backgroundColor = FirefoxTheme.colors.actionSecondary, + textColor = textColor, + backgroundColor = backgroundColor, icon = icon, tint = FirefoxTheme.colors.iconWarningButton, onClick = onClick, From a44d9ff8d90f0a6347a1cff7a13ebf0895043660 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Tue, 1 Nov 2022 10:16:46 -0700 Subject: [PATCH 279/407] For #27485 - Replace `Button` in `CustomizeHomeButtonViewHolder` with `TertiaryButton` --- .../viewholders/CustomizeHomeButtonViewHolder.kt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt index 601b63134..d72f4a2df 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt @@ -20,11 +20,9 @@ import mozilla.components.lib.state.ext.observeAsComposableState import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder -import org.mozilla.fenix.compose.button.Button import org.mozilla.fenix.compose.button.TertiaryButton import org.mozilla.fenix.home.sessioncontrol.CustomizeHomeIteractor import org.mozilla.fenix.theme.FirefoxTheme -import org.mozilla.fenix.wallpapers.Wallpaper import org.mozilla.fenix.wallpapers.WallpaperState class CustomizeHomeButtonViewHolder( @@ -48,7 +46,6 @@ class CustomizeHomeButtonViewHolder( val wallpaperState = components.appStore .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default var buttonColor: Color = FirefoxTheme.colors.actionTertiary - val textColor: Color = FirefoxTheme.colors.textActionTertiary wallpaperState.composeRunIfWallpaperCardColorsAreAvailable { cardColorLight, cardColorDark -> buttonColor = if (isSystemInDarkTheme()) { @@ -61,15 +58,9 @@ class CustomizeHomeButtonViewHolder( Column { Spacer(modifier = Modifier.height(68.dp)) - /** - * This button will be stylized as a [TertiaryButton] when no wallpaper is selected. - * Otherwise, the background will use [Wallpaper.cardColorLight] or [Wallpaper.cardColorDark]. - * */ - Button( + TertiaryButton( text = stringResource(R.string.browser_menu_customize_home_1), - textColor = textColor, backgroundColor = buttonColor, - tint = FirefoxTheme.colors.iconActionTertiary, onClick = interactor::openCustomizeHomePage, ) } From 79f0ce4cd325a39a3c955d321d64e0425a369dde Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Fri, 28 Oct 2022 09:42:30 -0700 Subject: [PATCH 280/407] For #27331 - Add migration for Turning Red wallpaper card colors --- .../java/org/mozilla/fenix/utils/Settings.kt | 8 +++ .../wallpapers/LegacyWallpaperMigration.kt | 33 ++++++++++ .../fenix/wallpapers/WallpapersUseCases.kt | 6 ++ app/src/main/res/values/preference_keys.xml | 1 + .../wallpapers/WallpapersUseCasesTest.kt | 61 +++++++++++++++++-- 5 files changed, 105 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 1fdd7d6e3..14b0b4023 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -225,6 +225,14 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = true, ) + /** + * Indicates if the current legacy wallpaper card colors should be migrated. + */ + var shouldMigrateLegacyWallpaperCardColors by booleanPreference( + key = appContext.getPreferenceKey(R.string.pref_key_should_migrate_wallpaper_card_colors), + default = true, + ) + /** * Indicates if the wallpaper onboarding dialog should be shown. */ diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt index 3358b27a1..bbb3fa4e0 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/LegacyWallpaperMigration.kt @@ -97,6 +97,7 @@ class LegacyWallpaperMigration( } } catch (e: IOException) { Logger.error("Failed to migrate legacy wallpaper", e) + settings.shouldMigrateLegacyWallpaperCardColors = false } // Delete the remaining legacy files @@ -106,9 +107,41 @@ class LegacyWallpaperMigration( return@withContext migratedWallpaperName } + /** + * Helper function used to migrate a legacy wallpaper's card colors that previously did not exist. + */ + fun migrateExpiredWallpaperCardColors() { + // The card colors should NOT be migrated if the file migration was ran prior to these + // changes and it failed. We can verify this by checking [settings.currentWallpaperTextColor], + // since this is only initialized for legacy wallpapers in + // [LegacyWallpaperMigration.migrateLegacyWallpaper]. + if (settings.currentWallpaperTextColor != 0L) { + when (settings.currentWallpaperName) { + TURNING_RED_MEI_WALLPAPER_NAME -> { + settings.currentWallpaperCardColorLight = + TURNING_RED_MEI_WALLPAPER_CARD_COLOR_LIGHT.toLong(radix = 16) + settings.currentWallpaperCardColorDark = + TURNING_RED_MEI_WALLPAPER_CARD_COLOR_DARK.toLong(radix = 16) + } + TURNING_RED_PANDA_WALLPAPER_NAME -> { + settings.currentWallpaperCardColorLight = + TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_LIGHT.toLong(radix = 16) + settings.currentWallpaperCardColorDark = + TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_DARK.toLong(radix = 16) + } + } + } + + settings.shouldMigrateLegacyWallpaperCardColors = false + } + companion object { const val TURNING_RED_MEI_WALLPAPER_NAME = "mei" const val TURNING_RED_PANDA_WALLPAPER_NAME = "panda" const val TURNING_RED_WALLPAPER_TEXT_COLOR = "FFFBFBFE" + const val TURNING_RED_MEI_WALLPAPER_CARD_COLOR_LIGHT = "FFFDE9C3" + const val TURNING_RED_MEI_WALLPAPER_CARD_COLOR_DARK = "FF532906" + const val TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_LIGHT = "FFFFEDF1" + const val TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_DARK = "FF611B28" } } diff --git a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt index 30dd45567..4d32e9e2a 100644 --- a/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt +++ b/app/src/main/java/org/mozilla/fenix/wallpapers/WallpapersUseCases.kt @@ -249,6 +249,7 @@ class WallpapersUseCases( Wallpaper.getCurrentWallpaperFromSettings(settings)?.let { appStore.dispatch(AppAction.WallpaperAction.UpdateCurrentWallpaper(it)) } + val currentWallpaperName = if (settings.shouldMigrateLegacyWallpaper) { val migratedWallpaperName = migrationHelper.migrateLegacyWallpaper(settings.currentWallpaperName) @@ -258,6 +259,11 @@ class WallpapersUseCases( } else { settings.currentWallpaperName } + + if (settings.shouldMigrateLegacyWallpaperCardColors) { + migrationHelper.migrateExpiredWallpaperCardColors() + } + val possibleWallpapers = metadataFetcher.downloadWallpaperList().filter { !it.isExpired() && it.isAvailableInLocale() } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 6809cdda6..4b69d5dac 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -209,6 +209,7 @@ pref_key_current_wallpaper_card_color_dark pref_key_wallpapers_onboarding pref_key_should_migrate_wallpaper + pref_key_should_migrate_wallpaper_card_colors pref_key_encryption_key_generated diff --git a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt index 7163ddfdf..08d87edd2 100644 --- a/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wallpapers/WallpapersUseCasesTest.kt @@ -9,6 +9,7 @@ import io.mockk.just import io.mockk.mockk import io.mockk.runs import io.mockk.slot +import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.test.runTest import mozilla.components.service.glean.testing.GleanTestRule @@ -17,14 +18,19 @@ import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue +import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.utils.Settings -import java.util.Calendar -import java.util.Date +import org.mozilla.fenix.wallpapers.LegacyWallpaperMigration.Companion.TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_DARK +import org.mozilla.fenix.wallpapers.LegacyWallpaperMigration.Companion.TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_LIGHT +import org.mozilla.fenix.wallpapers.LegacyWallpaperMigration.Companion.TURNING_RED_PANDA_WALLPAPER_NAME +import org.mozilla.fenix.wallpapers.LegacyWallpaperMigration.Companion.TURNING_RED_WALLPAPER_TEXT_COLOR +import java.io.File +import java.util.* import kotlin.random.Random @RunWith(AndroidJUnit4::class) @@ -47,12 +53,14 @@ class WallpapersUseCasesTest { every { currentWallpaperCardColorDark = any() } just Runs every { shouldMigrateLegacyWallpaper } returns false every { shouldMigrateLegacyWallpaper = any() } just Runs + every { shouldMigrateLegacyWallpaperCardColors } returns false + every { shouldMigrateLegacyWallpaperCardColors = any() } just Runs } private val mockLegacyDownloader = mockk(relaxed = true) private val mockLegacyFileManager = mockk { every { clean(any(), any()) } just runs } - private val mockMigrationHelper = mockk(relaxed = true) + private lateinit var mockMigrationHelper: LegacyWallpaperMigration private val mockMetadataFetcher = mockk() private val mockDownloader = mockk { @@ -62,6 +70,20 @@ class WallpapersUseCasesTest { coEvery { clean(any(), any()) } returns mockk() } + private val mockFolder: File = mockk() + private val downloadWallpaper: (Wallpaper) -> Wallpaper.ImageFileState = mockk(relaxed = true) + + @Before + fun setup() { + mockMigrationHelper = spyk( + LegacyWallpaperMigration( + storageRootDirectory = mockFolder, + settings = mockSettings, + downloadWallpaper, + ), + ) + } + @Test fun `GIVEN legacy use case WHEN initializing THEN the default wallpaper is not downloaded`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> @@ -132,7 +154,7 @@ class WallpapersUseCasesTest { } @Test - fun `GIVEN leagacy use case and wallpapers that expired and an expired one is selected WHEN invoking initialize use case THEN selected wallpaper is not filtered out`() = runTest { + fun `GIVEN legacy use case and wallpapers that expired and an expired one is selected WHEN invoking initialize use case THEN selected wallpaper is not filtered out`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> makeFakeRemoteWallpaper(TimeRelation.LATER, name) } @@ -351,6 +373,37 @@ class WallpapersUseCasesTest { assertEquals(expiredWallpaper, appStore.state.wallpaperState.currentWallpaper) } + @Test + fun `GIVEN wallpapers that expired and an expired one is selected and card colors have not been migrated WHEN invoking initialize use case THEN migrate card colors`() = runTest { + val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> + makeFakeRemoteWallpaper(TimeRelation.LATER, name) + } + val expiredWallpaper = makeFakeRemoteWallpaper(TimeRelation.BEFORE, TURNING_RED_PANDA_WALLPAPER_NAME) + val allWallpapers = listOf(expiredWallpaper) + fakeRemoteWallpapers + every { mockSettings.currentWallpaperName } returns TURNING_RED_PANDA_WALLPAPER_NAME + every { mockSettings.shouldMigrateLegacyWallpaperCardColors } returns true + every { mockSettings.currentWallpaperTextColor } returns TURNING_RED_WALLPAPER_TEXT_COLOR.toLong(radix = 16) + coEvery { mockFileManager.lookupExpiredWallpaper(any()) } returns expiredWallpaper + coEvery { mockMetadataFetcher.downloadWallpaperList() } returns allWallpapers + coEvery { mockDownloader.downloadThumbnail(any()) } returns Wallpaper.ImageFileState.Downloaded + + WallpapersUseCases.DefaultInitializeWallpaperUseCase( + appStore, + mockDownloader, + mockFileManager, + mockMetadataFetcher, + mockMigrationHelper, + mockSettings, + "en-US", + ).invoke() + + appStore.waitUntilIdle() + + verify { mockMigrationHelper.migrateExpiredWallpaperCardColors() } + verify { mockSettings.currentWallpaperCardColorLight = TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_LIGHT.toLong(radix = 16) } + verify { mockSettings.currentWallpaperCardColorDark = TURNING_RED_PANDA_WALLPAPER_CARD_COLOR_DARK.toLong(radix = 16) } + } + @Test fun `GIVEN wallpapers that are in promotions outside of locale WHEN invoking initialize use case THEN promotional wallpapers are filtered out`() = runTest { val fakeRemoteWallpapers = listOf("first", "second", "third").map { name -> From d9d855685edc21cdf66aa563928f3df40afea1c5 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Tue, 1 Nov 2022 12:24:52 -0400 Subject: [PATCH 281/407] Close #27023: Add capability to override telemetry URL --- .../org/mozilla/fenix/FenixApplication.kt | 24 +++++++++---- .../org/mozilla/fenix/ext/Configuration.kt | 31 +++++++++++++++++ .../fenix/settings/SecretSettingsFragment.kt | 7 ++++ app/src/main/res/values/preference_keys.xml | 1 + app/src/main/res/values/static_strings.xml | 2 ++ .../res/xml/secret_settings_preferences.xml | 6 ++++ .../mozilla/fenix/ext/ConfigurationKtTest.kt | 34 +++++++++++++++++++ 7 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/ext/Configuration.kt create mode 100644 app/src/test/java/org/mozilla/fenix/ext/ConfigurationKtTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index f4b25852e..192f4b810 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -75,6 +75,8 @@ import org.mozilla.fenix.components.metrics.MetricServiceType import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.containsQueryParameters +import org.mozilla.fenix.ext.getCustomGleanServerUrlIfAvailable +import org.mozilla.fenix.ext.setCustomEndpointIfAvailable import org.mozilla.fenix.ext.isCustomEngine import org.mozilla.fenix.ext.isKnownSearchDomain import org.mozilla.fenix.ext.settings @@ -154,14 +156,24 @@ open class FenixApplication : LocaleAwareApplication(), Provider { logger.debug("Initializing Glean (uploadEnabled=$telemetryEnabled})") + // for performance reasons, this is only available in Nightly or Debug builds + val customEndpoint = if (Config.channel.isNightlyOrDebug) { + // for testing, if custom glean server url is set in the secret menu, use it to initialize Glean + getCustomGleanServerUrlIfAvailable(this) + } else { + null + } + + val configuration = Configuration( + channel = BuildConfig.BUILD_TYPE, + httpClient = ConceptFetchHttpUploader( + lazy(LazyThreadSafetyMode.NONE) { components.core.client }, + ), + ) + Glean.initialize( applicationContext = this, - configuration = Configuration( - channel = BuildConfig.BUILD_TYPE, - httpClient = ConceptFetchHttpUploader( - lazy(LazyThreadSafetyMode.NONE) { components.core.client }, - ), - ), + configuration = configuration.setCustomEndpointIfAvailable(customEndpoint), uploadEnabled = telemetryEnabled, buildInfo = GleanBuildInfo.buildInfo, ) diff --git a/app/src/main/java/org/mozilla/fenix/ext/Configuration.kt b/app/src/main/java/org/mozilla/fenix/ext/Configuration.kt new file mode 100644 index 000000000..79bb3e43e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/Configuration.kt @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import android.content.Context +import androidx.preference.PreferenceManager +import mozilla.components.service.glean.config.Configuration +import org.mozilla.fenix.R + +/** + * Get custom Glean server URL if available. + */ +fun getCustomGleanServerUrlIfAvailable(context: Context): String? { + return PreferenceManager.getDefaultSharedPreferences(context).getString( + context.getPreferenceKey(R.string.pref_key_custom_glean_server_url), + null, + ) +} + +/** + * Applies the custom Glean server URL to the Configuration if available. + */ +fun Configuration.setCustomEndpointIfAvailable(serverEndpoint: String?): Configuration { + if (!serverEndpoint.isNullOrEmpty()) { + return copy(serverEndpoint = serverEndpoint) + } + + return this +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index e2bbaaca5..97f3fd4b7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -5,9 +5,11 @@ package org.mozilla.fenix.settings import android.os.Bundle +import androidx.preference.EditTextPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference +import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -53,5 +55,10 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { isChecked = context.settings().showUnifiedSearchFeature onPreferenceChangeListener = SharedPreferenceUpdater() } + + // for performance reasons, this is only available in Nightly or Debug builds + requirePreference(R.string.pref_key_custom_glean_server_url).apply { + isVisible = Config.channel.isNightlyOrDebug + } } } diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 4b69d5dac..ca7b8a329 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -307,4 +307,5 @@ pref_key_nimbus_use_preview pref_key_history_metadata_feature pref_key_show_unified_search + pref_key_custom_glean_server_url diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 7df846a95..c11b7cb60 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -44,6 +44,8 @@ Enable Task Continuity Enable Unified Search (requires restart) + + Custom Glean server URL (requires restart) Sync Debug diff --git a/app/src/main/res/xml/secret_settings_preferences.xml b/app/src/main/res/xml/secret_settings_preferences.xml index ff6af4699..da10b2948 100644 --- a/app/src/main/res/xml/secret_settings_preferences.xml +++ b/app/src/main/res/xml/secret_settings_preferences.xml @@ -25,4 +25,10 @@ android:key="@string/pref_key_show_unified_search" android:title="@string/preferences_debug_settings_unified_search" app:iconSpaceReserved="false" /> + diff --git a/app/src/test/java/org/mozilla/fenix/ext/ConfigurationKtTest.kt b/app/src/test/java/org/mozilla/fenix/ext/ConfigurationKtTest.kt new file mode 100644 index 000000000..909d38d72 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/ext/ConfigurationKtTest.kt @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import io.mockk.mockk +import mozilla.components.service.glean.config.Configuration +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Test + +class ConfigurationKtTest { + @Test + fun `GIVEN server endpoint is null THEN return the same configuration`() { + val configuration = Configuration(httpClient = mockk()) + + assertEquals(configuration, configuration.setCustomEndpointIfAvailable(null)) + } + + @Test + fun `GIVEN server endpoint is not empty THEN make a copy of configuration with server endpoint`() { + val configuration = Configuration(httpClient = mockk()) + + assertNotEquals(configuration, configuration.setCustomEndpointIfAvailable("test")) + } + + @Test + fun `GIVEN server endpoint is empty THEN return the same configuration`() { + val configuration = Configuration(httpClient = mockk()) + + assertEquals(configuration, configuration.setCustomEndpointIfAvailable("")) + } +} From d30753ccef3f163822d0903ffc36d4355b31110f Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 1 Nov 2022 19:28:31 +0000 Subject: [PATCH 282/407] Update to Android-Components 108.0.20221101190054. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index e32eac27d..46e1794b7 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221101143225" + const val VERSION = "108.0.20221101190054" } From 1b9a86bfaaaed1e475510a4b50e26aee16045172 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 1 Nov 2022 22:03:06 +0000 Subject: [PATCH 283/407] Update to Android-Components 108.0.20221101212406. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 46e1794b7..963741dfd 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221101190054" + const val VERSION = "108.0.20221101212406" } From 3c70d237d89288669c6252da74134a73db062be8 Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Tue, 1 Nov 2022 18:59:56 -0400 Subject: [PATCH 284/407] Bug 1796482 - Report save to PDF errors. --- .../java/org/mozilla/fenix/components/Core.kt | 2 + .../fenix/share/SaveToPDFMiddleware.kt | 46 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 50 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 5dfc2c576..b0d482f56 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -92,6 +92,7 @@ import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.advanced.getSelectedLocale +import org.mozilla.fenix.share.SaveToPDFMiddleware import org.mozilla.fenix.telemetry.TelemetryMiddleware import org.mozilla.fenix.utils.getUndoDelay import org.mozilla.geckoview.GeckoRuntime @@ -244,6 +245,7 @@ class Core( LastMediaAccessMiddleware(), HistoryMetadataMiddleware(historyMetadataService), SessionPrioritizationMiddleware(), + SaveToPDFMiddleware(context), ) BrowserStore( diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt new file mode 100644 index 000000000..6ea627b8f --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -0,0 +1,46 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.share + +import android.content.Context +import android.widget.Toast +import android.widget.Toast.LENGTH_LONG +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import mozilla.components.browser.state.action.BrowserAction +import mozilla.components.browser.state.action.EngineAction +import mozilla.components.browser.state.state.BrowserState +import mozilla.components.lib.state.Action +import mozilla.components.lib.state.Middleware +import mozilla.components.lib.state.MiddlewareContext +import org.mozilla.fenix.R + +/** + * [BrowserAction] middleware reacting in response to Save to PDF related [Action]s. + * @property context An Application context. + */ +class SaveToPDFMiddleware( + private val context: Context, +) : Middleware { + + @OptIn(DelicateCoroutinesApi::class) + override fun invoke( + ctx: MiddlewareContext, + next: (BrowserAction) -> Unit, + action: BrowserAction, + ) { + if (action is EngineAction.SaveToPdfExceptionAction) { + // See https://github.com/mozilla-mobile/fenix/issues/27649 for more details, + // why a Toast is used here. + GlobalScope.launch(Dispatchers.Main) { + Toast.makeText(context, R.string.unable_to_save_to_pdf_error, LENGTH_LONG).show() + } + } else { + next(action) + } + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3c24676a9..84f390873 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1028,6 +1028,8 @@ Share Save as PDF + + Unable to generate PDF Send to device From c75efe35b3f70836f37f0a0f589ca87152479933 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Wed, 2 Nov 2022 01:58:21 +0100 Subject: [PATCH 285/407] Import l10n. (#27654) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/res/values-kmr/strings.xml | 29 +----------- app/src/main/res/values-nn-rNO/strings.xml | 51 +++++++++++++++++++++- app/src/main/res/values-rm/strings.xml | 46 +++++++------------ 3 files changed, 67 insertions(+), 59 deletions(-) diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index b0be0f7a6..4930d6bbb 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -133,12 +133,6 @@ Bişkoka hemû hilpekînên kevn nîşan bide - - Lêgerîna te ya ji bo \"%1$s\" - - %d malper Hemû hilpekînên senkronîzekirî bibîne @@ -487,11 +481,6 @@ Wêneyê dîwêr nehat guhertin Zêdetir bizane - - Ji bo guhertina wêneyê dîwêr pêlî logoya Firefoxê ya serûpelê bike - - Logoya Firefoxê - wêneyê dîwêr biguherîne, bişkok Klasîk %s @@ -684,10 +673,6 @@ Grîd - - Komên lêgerînê - - Malperên têkildar bi hev re kom bikin Hilpekînan bigire @@ -838,18 +823,6 @@ Raborî tune - - Ji alavên din hatiye senkronîzekirin - - Ji alavên din - - - Têkevê da ku tu raboriya senkronîzekirî ya ji cîhazên xwe yên din bibînî. - - Têkeve - - Yan jî hesabekî Firefoxê biafirîne ku dest bi senkronîzekirinê bikî]]> - Daxistin hatin rakirin @@ -1424,6 +1397,8 @@ Çerezên nav-malperî Çerezên ku torên reklamê û şirketên analîtîkê ji bo şopandina gera di navbera malperên cuda de bi kar tînin asteng dike. + + Parastina çerezan a giştî, çerezan tenê ji bo malpera ku tu tê de yî îzole dike, bi xêra vê yekê torên reklaman ji bo şopandina te ya li ser malperan nikarin çerezan bi kar bînin. Kankerên krîpto diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 7dd2a8c6b..5dc23a5f1 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -281,8 +281,14 @@ Møt den personlege heimesida di. Nylege faner, bokmerke og søkjeresultat vert viste her. Velkomen til eit uavhengig internett + + Velkomen til eit meir personleg internett + + Fleire fargar. Betre personvern. Same forplikting til menneske over forteneste. Byt frå telefonen til datamaskina og tilbake + + Det er enklare enn nokon gong g å byte skjerm Hald fram der du slapp med faner frå andre einingar - no på startsida di. @@ -293,6 +299,8 @@ Hopp over + + Fanene dine synkroniserer no! Hald fram der du slutta på den andre eininga. Lat att @@ -470,8 +478,12 @@ Vis + + Klarte ikkje å laste ned bakgrunnsbildet Prøv igjen + + Klarte ikkje å endre bakgrunnsbildet Les meir @@ -479,6 +491,10 @@ Klassisk %s Avgrensa utgåve + + Den nye kolleksjonen Uavhengige røyster. %s + + Den nye kolleksjonen uavhengige røyster. Prøv ein fargeklatt @@ -1039,6 +1055,8 @@ Del + + Lagre som PDF Send til eining @@ -1053,7 +1071,9 @@ Logg inn for å synkronisere Logg inn på Sync - + + Synkroniser og lagre data + Send til alle einingar Kople til Sync på nytt @@ -1216,6 +1236,10 @@ The first parameter is the name of the app (e.g. Firefox Preview) --> Velkomen til %s! + + Velkomen til eit betre internett + + Ein nettlesar bygd for personar, ikkje profitt. Synkroniser Firefox mellom einingar @@ -1223,6 +1247,8 @@ Hald fram der du slutta Ta med bokmerke, historikk og passord til %1$s på denne eininga. + + Synkroniser faner og passord på tvers av einingar for saumlaus byte av skjerm. Registrer deg @@ -1236,6 +1262,8 @@ Personvernsikring som standard %1$s stoppar selskap automatisk frå å spore aktivitetane dine på nettet i det skjulte. + + Totalt vern mot infokapslar stoppar sporarar frå å bruke infokapslar til å forfølgje deg på tvers av nettstadar. Standard (standard) @@ -1248,14 +1276,22 @@ Vel plassering for verktøylinja Plassere verktøylinja innanfor rekkjevidde. Ha henne i botn eller topp. + + Behald i botnen, eller flytt til toppen. Ditt personvern + + Du kontrollerer dine data Vi har utvikla %s for å gi deg kontroll over det du deler på nettet og kva du deler med oss. + + Firefox gir deg kontroll over kva du deler på nettet og kva du deler med oss. Les personvernmerknaden vår + + Klar til å oppdage eit fantastisk internett? Start nettlesinga @@ -1343,6 +1379,8 @@ Alle tredjeparts-infokapslar (kan lage feil på nettstadar) Alle infokapslar (vil føre til feil på nettstadar) + + Isoler infokapslar på tvers av nettstadar Sporingsinnhald @@ -1369,6 +1407,8 @@ Infokapslar på tvers av nettstadar Blokkerer informasjonskapslar som annonsenettverk og analyseselskap brukar for å samanstille aktiviteten din på nettet på tvers av nettstadar. + + Totalt vern mot infokapslar isolerer infokapslar til nettstaden du er på, så sporarar som annonsenettverk ikkje kan bruke dei til å følgje deg mellom nettstadar. Kryptoutvinnarar @@ -1906,4 +1946,11 @@ Gå til innstillingar Firefox-forslag - + + + slå saman + + fald ut + + opne lenka for å lære meir om denne samlinga + diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index b5233ea85..e3ff691f8 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -127,13 +127,6 @@ Buttun per mussar tut ils tabs averts dacurt - - Tia tschertga da «%1$s» - - - %d websites Mussar tut ils tabs sincronisads @@ -299,6 +292,9 @@ Tes tabs vegnan sincronisads! Cuntinuescha là nua che ti has smess sin tes auter apparat. + + Serrar + Avrir in nov tab da %1$s @@ -478,12 +474,6 @@ Impussibel da midar il maletg dal fund davos Ulteriuras infurmaziuns - - Mida il maletg dal fund davos cun tutgar il logo da Firefox sin la pagina da partenza - - - Logo da Firefox – midar il maletg dal fund davos, buttun %s classic @@ -669,10 +659,6 @@ Glista Griglia - - Gruppas da tschertgar - - Gruppar websites che tutgan ensemen Serrar ils tabs @@ -821,18 +807,6 @@ Nagina cronologia - - Sincronisà dad auters apparats - - Dad auters apparats - - - T\'annunzia per vesair la cronologia sincronisada da tes auters apparats. - - S\'annunziar - - U creescha in conto da Firefox per cumenzar a sincronisar]]> - Allontanà las telechargiadas @@ -1058,6 +1032,8 @@ Cundivider + + Memorisar sco PDF Trametter a l\'apparat @@ -1069,9 +1045,11 @@ Copià en l\'archiv provisoric - S\'annunziar per sincronisar + S\'annunziar per sincronisar S\'annunziar tar Sync + + Sincronisar e memorisar las datas Trametter a tut ils apparats @@ -1945,4 +1923,12 @@ Ir als parameters Firefox propona + + + + reducir + + extender + + avrir la colliaziun per vegnir a savair dapli davart questa collecziun From 4047d97ad6512e5a83ed16fce7a7f55ad7b00313 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Mon, 31 Oct 2022 15:59:51 +0200 Subject: [PATCH 286/407] For #25813 - Use specific hint for history, bookmarks and tab unified search --- .../org/mozilla/fenix/search/toolbar/ToolbarView.kt | 12 +++++++++--- app/src/main/res/values/strings.xml | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt index 97edb87f7..0fc4828dc 100644 --- a/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt @@ -16,6 +16,7 @@ import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.res.resolveAttribute import mozilla.components.support.ktx.android.view.hideKeyboard import org.mozilla.fenix.R +import org.mozilla.fenix.components.Core import org.mozilla.fenix.search.SearchFragmentState import org.mozilla.fenix.utils.Settings @@ -147,11 +148,16 @@ class ToolbarView( val searchEngine = searchState.searchEngineSource.searchEngine - when (searchEngine?.type) { + view.edit.hint = when (searchEngine?.type) { SearchEngine.Type.APPLICATION -> - view.edit.hint = context.getString(R.string.application_search_hint) + when (searchEngine.id) { + Core.HISTORY_SEARCH_ENGINE_ID -> context.getString(R.string.history_search_hint) + Core.BOOKMARKS_SEARCH_ENGINE_ID -> context.getString(R.string.bookmark_search_hint) + Core.TABS_SEARCH_ENGINE_ID -> context.getString(R.string.tab_search_hint) + else -> context.getString(R.string.application_search_hint) + } else -> - view.edit.hint = context.getString(R.string.search_hint) + context.getString(R.string.search_hint) } if (!settings.showUnifiedSearchFeature && searchEngine != null) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84f390873..07086f964 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,6 +16,12 @@ Disable private browsing Search or enter address + + Search history + + Search bookmarks + + Search tabs Enter search terms From e9ef7c2546ab689ec1901fe6fd19de2572c19ef6 Mon Sep 17 00:00:00 2001 From: "oana.horvath" Date: Tue, 1 Nov 2022 17:56:37 +0200 Subject: [PATCH 287/407] Issue #27522: Search groups tests refactoring --- .../java/org/mozilla/fenix/ui/SearchTest.kt | 77 ++++++------------- .../fenix/ui/robots/HomeScreenRobot.kt | 5 +- .../mozilla/fenix/ui/robots/TabDrawerRobot.kt | 22 +++--- 3 files changed, 34 insertions(+), 70 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 2ceda2859..654336b01 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.ui import android.content.Context import android.hardware.camera2.CameraManager import androidx.compose.ui.test.junit4.AndroidComposeTestRule -import androidx.core.net.toUri import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import mozilla.components.browser.icons.IconRequest import mozilla.components.browser.icons.generator.DefaultIconGenerator @@ -23,6 +22,7 @@ import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.Constants.PackageName.ANDROID_SETTINGS import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.SearchDispatcher +import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens import org.mozilla.fenix.helpers.TestHelper.denyPermission @@ -153,10 +153,11 @@ class SearchTest { @SmokeTest @Test fun searchGroupShowsInRecentlyVisitedTest() { - val firstPage = searchMockServer.url("generic1.html").toString() - val secondPage = searchMockServer.url("generic2.html").toString() + val firstPage = getGenericAsset(searchMockServer, 1) + val secondPage = getGenericAsset(searchMockServer, 2) // setting our custom mockWebServer search URL - val searchString = "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" + val searchString = + "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" val customSearchEngine = createSearchEngine( name = "TestSearchEngine", url = searchString, @@ -172,14 +173,10 @@ class SearchTest { clickContextOpenLinkInNewTab() longClickLink("Link 2") clickContextOpenLinkInNewTab() - }.goToHomescreen { - verifyJumpBackInSectionIsDisplayed() - verifyCurrentSearchGroupIsDisplayed(true, "test search", 3) - verifyRecentlyVisitedSearchGroupDisplayed(false, "test search", 3) }.openTabDrawer { - }.openTabFromGroup(firstPage) { + }.openTab(firstPage.title) { }.openTabDrawer { - }.openTabFromGroup(secondPage) { + }.openTab(secondPage.title) { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { @@ -189,38 +186,7 @@ class SearchTest { @SmokeTest @Test - fun noCurrentSearchGroupFromPrivateBrowsingTest() { - // setting our custom mockWebServer search URL - val searchString = "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" - val customSearchEngine = createSearchEngine( - name = "TestSearchEngine", - url = searchString, - icon = DefaultIconGenerator().generate(appContext, IconRequest(searchString)).bitmap, - ) - setCustomSearchEngine(customSearchEngine) - - // Performs a search and opens 2 dummy search results links to create a search group - homeScreen { - }.openSearch { - }.submitQuery("test search") { - longClickLink("Link 1") - clickContextOpenLinkInPrivateTab() - longClickLink("Link 2") - clickContextOpenLinkInPrivateTab() - }.goToHomescreen { - verifyCurrentSearchGroupIsDisplayed(false, "test search", 3) - }.openThreeDotMenu { - }.openHistory { - verifyHistoryItemExists(false, "3 sites") - } - } - - @SmokeTest - @Test - @Ignore("Failing after compose migration. See: https://github.com/mozilla-mobile/fenix/issues/26087") - fun noRecentlyVisitedSearchGroupInPrivateBrowsingTest() { - val firstPage = searchMockServer.url("generic1.html").toString() - val secondPage = searchMockServer.url("generic2.html").toString() + fun noSearchGroupFromPrivateBrowsingTest() { // setting our custom mockWebServer search URL val searchString = "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" val customSearchEngine = createSearchEngine( @@ -232,8 +198,6 @@ class SearchTest { // Performs a search and opens 2 dummy search results links to create a search group homeScreen { - }.togglePrivateBrowsingMode() - homeScreen { }.openSearch { }.submitQuery("test search") { longClickLink("Link 1") @@ -241,15 +205,18 @@ class SearchTest { longClickLink("Link 2") clickContextOpenLinkInPrivateTab() }.openTabDrawer { - }.openTab(firstPage) { + }.toggleToPrivateTabs { + }.openTabWithIndex(0) { }.openTabDrawer { - }.openTab(secondPage) { + }.openTabWithIndex(1) { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - homeScreen { - }.togglePrivateBrowsingMode() - verifyRecentlyVisitedSearchGroupDisplayed(false, "test search", 3) + togglePrivateBrowsingModeOnOff() + verifyCurrentSearchGroupIsDisplayed(false, "test search", 3) + }.openThreeDotMenu { + }.openHistory { + verifyHistoryItemExists(false, "3 sites") } } @@ -257,8 +224,8 @@ class SearchTest { @SmokeTest @Test fun deleteItemsFromSearchGroupsHistoryTest() { - val firstPage = searchMockServer.url("generic1.html").toString() - val secondPage = searchMockServer.url("generic2.html").toString() + val firstPage = getGenericAsset(searchMockServer, 1) + val secondPage = getGenericAsset(searchMockServer, 2) // setting our custom mockWebServer search URL val searchString = "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" val customSearchEngine = createSearchEngine( @@ -277,16 +244,16 @@ class SearchTest { longClickLink("Link 2") clickContextOpenLinkInNewTab() }.openTabDrawer { - }.openTabFromGroup(firstPage) { + }.openTab(firstPage.title) { }.openTabDrawer { - }.openTabFromGroup(secondPage) { + }.openTab(secondPage.title) { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(true, "test search", 3) }.openRecentlyVisitedSearchGroupHistoryList("test search") { - clickDeleteHistoryButton(firstPage) - longTapSelectItem(secondPage.toUri()) + clickDeleteHistoryButton(firstPage.url.toString()) + longTapSelectItem(secondPage.url) multipleSelectionToolbar { openActionBarOverflowOrOptionsMenu(activityTestRule.activity) clickMultiSelectionDelete() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index bd9e7817d..20d97d2aa 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -192,10 +192,7 @@ class HomeScreenRobot { fun verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed: Boolean, searchTerm: String, groupSize: Int) { // checks if the search group exists in the Recently visited section if (shouldBeDisplayed) { - recentlyVisitedList.waitForExists(waitingTime) scrollToElementByText("Recently visited") - recentlyVisitedList.getChildByText(UiSelector().text(searchTerm), searchTerm, true) - .waitForExists(waitingTimeShort) assertTrue( mDevice.findObject(UiSelector().text(searchTerm)) .getFromParent(UiSelector().text("$groupSize sites")) @@ -580,7 +577,7 @@ class HomeScreenRobot { } fun openRecentlyVisitedSearchGroupHistoryList(title: String, interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { - val searchGroup = recentlyVisitedList.getChildByText(UiSelector().text(title), title, true) + val searchGroup = mDevice.findObject(UiSelector().text(title)) searchGroup.waitForExists(waitingTimeShort) searchGroup.click() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index c0488b4c9..89088f6a9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -340,19 +340,19 @@ class TabDrawerRobot { return BrowserRobot.Transition() } - fun openTabFromGroup( - title: String, + // Temporary method to use indexes instead of tab titles, until the compose migration is complete + fun openTabWithIndex( + tabPosition: Int, interact: BrowserRobot.() -> Unit, ): BrowserRobot.Transition { - val tab = UiScrollable(UiSelector().resourceId("$packageName:id/tab_group_list")) - .setAsHorizontalList() - .getChildByText( - UiSelector() - .resourceId("$packageName:id/mozac_browser_tabstray_title") - .textContains(title), - title, - true, - ) + val tab = mDevice.findObject( + UiSelector() + .className("androidx.compose.ui.platform.ComposeView") + .index(tabPosition), + ) + + UiScrollable(UiSelector().resourceId("$packageName:id/tray_list_item")).scrollIntoView(tab) + tab.waitForExists(waitingTime) tab.click() BrowserRobot().interact() From 7d2f18b314ae38ed0733ceb5c01d8f6df05f863e Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Tue, 1 Nov 2022 14:16:39 +0200 Subject: [PATCH 288/407] For #27522 new search codes UI tests --- .../org/mozilla/fenix/helpers/Constants.kt | 6 ++ .../java/org/mozilla/fenix/ui/SearchTest.kt | 83 ++++++++++++++++--- 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt index 2162531d4..d0e69cb86 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt @@ -21,4 +21,10 @@ object Constants { const val LONG_CLICK_DURATION: Long = 5000 const val LISTS_MAXSWIPES: Int = 3 const val RETRY_COUNT = 3 + + val searchEngineCodes = mapOf( + "Google" to "client=firefox-b-m", + "Bing" to "firefox&pc=MOZB&form=MOZMBA", + "DuckDuckGo" to "t=fpas", + ) } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index 654336b01..3646a6dee 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -20,6 +20,7 @@ import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.Constants.PackageName.ANDROID_SETTINGS +import org.mozilla.fenix.helpers.Constants.searchEngineCodes import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset @@ -45,6 +46,7 @@ import org.mozilla.fenix.ui.robots.multipleSelectionToolbar class SearchTest { lateinit var searchMockServer: MockWebServer + lateinit var queryString: String @get:Rule val activityTestRule = AndroidComposeTestRule( @@ -117,6 +119,8 @@ class SearchTest { @Test fun setDefaultSearchEngineFromShortcutsTest() { + queryString = "firefox" + homeScreen { }.openThreeDotMenu { }.openSettings { @@ -134,16 +138,18 @@ class SearchTest { homeScreen { }.openSearch { - }.submitQuery("firefox") { + }.submitQuery(queryString) { verifyUrl("duckduckgo.com/?q=firefox") } } @Test fun clearSearchTest() { + queryString = "test" + homeScreen { }.openSearch { - typeSearch("test") + typeSearch(queryString) clickClearButton() verifySearchBarEmpty() } @@ -153,6 +159,7 @@ class SearchTest { @SmokeTest @Test fun searchGroupShowsInRecentlyVisitedTest() { + queryString = "test search" val firstPage = getGenericAsset(searchMockServer, 1) val secondPage = getGenericAsset(searchMockServer, 2) // setting our custom mockWebServer search URL @@ -168,7 +175,7 @@ class SearchTest { // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { - }.submitQuery("test search") { + }.submitQuery(queryString) { longClickLink("Link 1") clickContextOpenLinkInNewTab() longClickLink("Link 2") @@ -180,13 +187,14 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, "test search", 3) + verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) } } @SmokeTest @Test fun noSearchGroupFromPrivateBrowsingTest() { + queryString = "test search" // setting our custom mockWebServer search URL val searchString = "http://localhost:${searchMockServer.port}/searchResults.html?search={searchTerms}" val customSearchEngine = createSearchEngine( @@ -199,7 +207,7 @@ class SearchTest { // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { - }.submitQuery("test search") { + }.submitQuery(queryString) { longClickLink("Link 1") clickContextOpenLinkInPrivateTab() longClickLink("Link 2") @@ -213,7 +221,7 @@ class SearchTest { }.openTabsListThreeDotMenu { }.closeAllTabs { togglePrivateBrowsingModeOnOff() - verifyCurrentSearchGroupIsDisplayed(false, "test search", 3) + verifyCurrentSearchGroupIsDisplayed(false, queryString, 3) }.openThreeDotMenu { }.openHistory { verifyHistoryItemExists(false, "3 sites") @@ -224,6 +232,7 @@ class SearchTest { @SmokeTest @Test fun deleteItemsFromSearchGroupsHistoryTest() { + queryString = "test search" val firstPage = getGenericAsset(searchMockServer, 1) val secondPage = getGenericAsset(searchMockServer, 2) // setting our custom mockWebServer search URL @@ -238,7 +247,7 @@ class SearchTest { // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { - }.submitQuery("test search") { + }.submitQuery(queryString) { longClickLink("Link 1") clickContextOpenLinkInNewTab() longClickLink("Link 2") @@ -250,8 +259,8 @@ class SearchTest { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { - verifyRecentlyVisitedSearchGroupDisplayed(true, "test search", 3) - }.openRecentlyVisitedSearchGroupHistoryList("test search") { + verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3) + }.openRecentlyVisitedSearchGroupHistoryList(queryString) { clickDeleteHistoryButton(firstPage.url.toString()) longTapSelectItem(secondPage.url) multipleSelectionToolbar { @@ -262,7 +271,61 @@ class SearchTest { } homeScreen { // checking that the group is removed when only 1 item is left - verifyRecentlyVisitedSearchGroupDisplayed(false, "test search", 1) + verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 1) + } + } + + // Default search code for Google-US + @Test + fun defaultSearchCodeGoogleUS() { + queryString = "firefox" + + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + verifyUrl(searchEngineCodes["Google"]!!) + } + } + + // Default search code for Bing-US + @Test + fun defaultSearchCodeBingUS() { + queryString = "firefox" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + changeDefaultSearchEngine("Bing") + } + + exitMenu() + + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + verifyUrl(searchEngineCodes["Bing"]!!) + } + } + + // Default search code for DuckDuckGo-US + @Test + fun defaultSearchCodeDuckDuckGoUS() { + queryString = "firefox" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + changeDefaultSearchEngine("DuckDuckGo") + } + + exitMenu() + + homeScreen { + }.openSearch { + }.submitQuery(queryString) { + verifyUrl(searchEngineCodes["DuckDuckGo"]!!) } } } From 03e6ac04e8966f2937f00040b8751c8495563a79 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Wed, 2 Nov 2022 00:37:46 -0400 Subject: [PATCH 289/407] For #27656 - Add a Fenix prefix to GitHub actions --- .github/workflows/{sync-strings.yml => fenix-sync-strings.yml} | 2 +- .github/workflows/{update-ac.yml => fenix-update-ac.yml} | 2 +- ...mbus-experiments.yml => fenix-update-nimbus-experiments.yml} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .github/workflows/{sync-strings.yml => fenix-sync-strings.yml} (98%) rename .github/workflows/{update-ac.yml => fenix-update-ac.yml} (93%) rename .github/workflows/{update-nimbus-experiments.yml => fenix-update-nimbus-experiments.yml} (97%) diff --git a/.github/workflows/sync-strings.yml b/.github/workflows/fenix-sync-strings.yml similarity index 98% rename from .github/workflows/sync-strings.yml rename to .github/workflows/fenix-sync-strings.yml index 6f757fb09..ed337da5d 100644 --- a/.github/workflows/sync-strings.yml +++ b/.github/workflows/fenix-sync-strings.yml @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/ -name: "Sync Strings" +name: "Fenix - Sync Strings" on: schedule: diff --git a/.github/workflows/update-ac.yml b/.github/workflows/fenix-update-ac.yml similarity index 93% rename from .github/workflows/update-ac.yml rename to .github/workflows/fenix-update-ac.yml index 22d25bffd..ee02e44ca 100644 --- a/.github/workflows/update-ac.yml +++ b/.github/workflows/fenix-update-ac.yml @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/ -name: "Update Android-Components" +name: "Fenix - Update Android-Components" on: schedule: diff --git a/.github/workflows/update-nimbus-experiments.yml b/.github/workflows/fenix-update-nimbus-experiments.yml similarity index 97% rename from .github/workflows/update-nimbus-experiments.yml rename to .github/workflows/fenix-update-nimbus-experiments.yml index 1758970ef..81006e71e 100644 --- a/.github/workflows/update-nimbus-experiments.yml +++ b/.github/workflows/fenix-update-nimbus-experiments.yml @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/ -name: "Update Nimbus Experiments" +name: "Fenix - Update Nimbus Experiments" on: schedule: From 1dbee2291be49bf6237571e4260c1a166d5a0e19 Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Wed, 2 Nov 2022 11:10:33 -0400 Subject: [PATCH 290/407] Closes #27652: Fix A-C auto publish docs in README --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b2bb54c1c..1729c3e1e 100644 --- a/README.md +++ b/README.md @@ -199,10 +199,12 @@ raptorEnabled If you're making changes to these projects and want to test them in Fenix, auto-publication workflow is the fastest, most reliable way to do that. -In `local.properties`, specify a relative path to your local `android-components` and/or `application-services` checkouts. E.g.: -- `autoPublish.android-components.dir=../android-components` +In `local.properties`, specify a relative path to your local `android-components` and/or `application-services` projects. E.g.: +- `autoPublish.android-components.dir=../firefox-android/android-components` - `autoPublish.application-services.dir=../application-services` +*Note that the Android Components project was already migrated to the new [firefox-android](https://github.com/mozilla-mobile/firefox-android) repository. Therefore, this auto publication workflow won't be neccessary for Android Components once Fenix is integrated in the new repository as well.* + Once these flags are set, your Fenix builds will include any local modifications present in these projects. See a [demo of auto-publication workflow in action](https://www.youtube.com/watch?v=qZKlBzVvQGc). From 063f00ca95a7f29ec09a38e9ced7316b83fcb003 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 2 Nov 2022 14:49:45 +0000 Subject: [PATCH 291/407] Update to Android-Components 108.0.20221102143037. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 963741dfd..c47e7fe36 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221101212406" + const val VERSION = "108.0.20221102143037" } From 27c34cecbf4c690cf192388d6d7fae0ce9e1eb1b Mon Sep 17 00:00:00 2001 From: DreVla Date: Wed, 2 Nov 2022 11:52:38 -0400 Subject: [PATCH 292/407] For #27635 - New telemetry for Save to PDF failures --- app/metrics.yaml | 17 ++++++++ .../fenix/share/SaveToPDFMiddleware.kt | 11 +++-- .../fenix/share/SaveToPDFMiddlewareTest.kt | 41 +++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt diff --git a/app/metrics.yaml b/app/metrics.yaml index d3757f7e2..e1a230c25 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -468,6 +468,23 @@ events: metadata: tags: - Sharing + save_to_pdf_failure: + type: event + description: | + A user tapped the save pdf but an error ocurred + and the process failed. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/27635 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27661#issuecomment-1300505370 + data_sensitivity: + - technical + notification_emails: + - android-probes@mozilla.com + expires: 122 + metadata: + tags: + - Sharing onboarding: syn_cfr_shown: diff --git a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt index 6ea627b8f..3b56847db 100644 --- a/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt +++ b/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -7,17 +7,16 @@ package org.mozilla.fenix.share import android.content.Context import android.widget.Toast import android.widget.Toast.LENGTH_LONG -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import mozilla.components.browser.state.action.BrowserAction import mozilla.components.browser.state.action.EngineAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.lib.state.Action import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext +import mozilla.telemetry.glean.private.NoExtras +import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R +import org.mozilla.gecko.util.ThreadUtils /** * [BrowserAction] middleware reacting in response to Save to PDF related [Action]s. @@ -27,7 +26,6 @@ class SaveToPDFMiddleware( private val context: Context, ) : Middleware { - @OptIn(DelicateCoroutinesApi::class) override fun invoke( ctx: MiddlewareContext, next: (BrowserAction) -> Unit, @@ -36,9 +34,10 @@ class SaveToPDFMiddleware( if (action is EngineAction.SaveToPdfExceptionAction) { // See https://github.com/mozilla-mobile/fenix/issues/27649 for more details, // why a Toast is used here. - GlobalScope.launch(Dispatchers.Main) { + ThreadUtils.runOnUiThread { Toast.makeText(context, R.string.unable_to_save_to_pdf_error, LENGTH_LONG).show() } + Events.saveToPdfFailure.record(NoExtras()) } else { next(action) } diff --git a/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt new file mode 100644 index 000000000..341ca2f1a --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt @@ -0,0 +1,41 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.share + +import mozilla.components.browser.state.action.EngineAction +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.service.glean.testing.GleanTestRule +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.robolectric.testContext +import mozilla.components.support.test.rule.MainCoroutineRule +import mozilla.components.support.test.rule.runTestOnMain +import org.junit.Assert.assertNotNull +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class SaveToPDFMiddlewareTest { + + @get:Rule + val gleanTestRule = GleanTestRule(testContext) + + @get:Rule + val mainCoroutineTestRule = MainCoroutineRule() + + @Test + fun `GIVEN a save to pdf request WHEN it fails THEN telemetry is sent`() = runTestOnMain { + val middleware = SaveToPDFMiddleware(testContext) + val browserStore = BrowserStore(middleware = listOf(middleware)) + + browserStore.dispatch(EngineAction.SaveToPdfExceptionAction("14", RuntimeException("reader save to pdf failed"))) + browserStore.waitUntilIdle() + testScheduler.advanceUntilIdle() + + assertNotNull(Events.saveToPdfFailure.testGetValue()) + } +} From ac1393e640897c1d2d21e4b32e6ec85a1cb60ba6 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 24 Oct 2022 17:08:26 -0400 Subject: [PATCH 293/407] Update Adjust to version 4.33.0 --- buildSrc/src/main/java/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 125a86840..5694a43b1 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -45,7 +45,7 @@ object Versions { const val mozilla_android_components = AndroidComponents.VERSION - const val adjust = "4.32.0" + const val adjust = "4.33.0" const val installreferrer = "2.2" const val junit = "5.5.2" From c18972c29df43a4e27613a7985fd99ef048b8527 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 2 Nov 2022 19:46:59 +0000 Subject: [PATCH 294/407] Update to Android-Components 108.0.20221102190107. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index c47e7fe36..c0f7310f1 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221102143037" + const val VERSION = "108.0.20221102190107" } From c89a0d20efb3e302695b547620e06f5c5116d0c0 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Wed, 2 Nov 2022 14:20:41 -0700 Subject: [PATCH 295/407] For #27578 - Add optional color parameters to MessageCard --- .../org/mozilla/fenix/compose/MessageCard.kt | 125 +++++++++++++----- 1 file changed, 91 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt index 0f94e2b62..e7b221543 100644 --- a/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt +++ b/app/src/main/java/org/mozilla/fenix/compose/MessageCard.kt @@ -9,12 +9,12 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card import androidx.compose.material.Icon @@ -22,6 +22,7 @@ import androidx.compose.material.IconButton import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow @@ -36,10 +37,11 @@ import org.mozilla.fenix.theme.FirefoxTheme * Message Card. * * @param messageText The message card's body text to be displayed. - * @param titleText An optional title of message card. If the title is blank or null is provided, + * @param titleText An optional title of message card. If the provided title text is blank or null, * the title will not be shown. - * @param buttonText An optional button text of the message card. If the button text is blank or null is provided, + * @param buttonText An optional button text of the message card. If the provided button text is blank or null, * the button won't be shown. + * @param messageColors The color set defined by [MessageCardColors] used to style the message card. * @param onClick Invoked when user clicks on the message card. * @param onCloseButtonClick Invoked when user clicks on close button to remove message. */ @@ -49,6 +51,7 @@ fun MessageCard( messageText: String, titleText: String? = null, buttonText: String? = null, + messageColors: MessageCardColors = MessageCardColors.buildMessageCardColors(), onClick: () -> Unit, onCloseButtonClick: () -> Unit, ) { @@ -63,7 +66,7 @@ fun MessageCard( }, ), shape = RoundedCornerShape(8.dp), - backgroundColor = FirefoxTheme.colors.layer2, + backgroundColor = messageColors.backgroundColor, ) { Column( Modifier @@ -77,31 +80,23 @@ fun MessageCard( Text( text = titleText, modifier = Modifier.weight(1f), - color = FirefoxTheme.colors.textPrimary, + color = messageColors.titleTextColor, overflow = TextOverflow.Ellipsis, maxLines = 2, style = FirefoxTheme.typography.headline7, ) - IconButton( - modifier = Modifier.size(20.dp), - onClick = onCloseButtonClick, - ) { - Icon( - painter = painterResource(R.drawable.mozac_ic_close_20), - contentDescription = stringResource( - R.string.content_description_close_button, - ), - tint = FirefoxTheme.colors.iconPrimary, - ) - } + MessageCardIconButton( + iconTint = messageColors.iconColor, + onCloseButtonClick = onCloseButtonClick, + ) } Text( text = messageText, modifier = Modifier.fillMaxWidth(), fontSize = 14.sp, - color = FirefoxTheme.colors.textSecondary, + color = messageColors.messageTextColor, ) } else { Row( @@ -111,21 +106,13 @@ fun MessageCard( text = messageText, modifier = Modifier.weight(1f), fontSize = 14.sp, - color = FirefoxTheme.colors.textPrimary, + color = messageColors.titleTextColor, ) - IconButton( - modifier = Modifier.size(20.dp), - onClick = onCloseButtonClick, - ) { - Icon( - painter = painterResource(R.drawable.mozac_ic_close_20), - contentDescription = stringResource( - R.string.content_description_close_button, - ), - tint = FirefoxTheme.colors.iconPrimary, - ) - } + MessageCardIconButton( + iconTint = messageColors.iconColor, + onCloseButtonClick = onCloseButtonClick, + ) } } @@ -134,6 +121,8 @@ fun MessageCard( PrimaryButton( text = buttonText, + textColor = messageColors.buttonTextColor, + backgroundColor = messageColors.buttonColor, onClick = onClick, ) } @@ -141,6 +130,74 @@ fun MessageCard( } } +/** + * IconButton within a MessageCard. + * + * @param iconTint The [Color] used to tint the button's icon. + * @param onCloseButtonClick Invoked when user clicks on close button to remove message. + */ +@Composable +private fun MessageCardIconButton( + iconTint: Color, + onCloseButtonClick: () -> Unit, +) { + IconButton( + modifier = Modifier.size(20.dp), + onClick = onCloseButtonClick, + ) { + Icon( + painter = painterResource(R.drawable.mozac_ic_close_20), + contentDescription = stringResource( + R.string.content_description_close_button, + ), + tint = iconTint, + ) + } +} + +/** + * Wrapper for the color parameters of [MessageCard]. + * + * @param backgroundColor The background [Color] of the message. + * @param titleTextColor [Color] to apply to the message's title, or the body text when there is no title. + * @param messageTextColor [Color] to apply to the message's body text. + * @param iconColor [Color] to apply to the message's icon. + * @param buttonColor The background [Color] of the message's button. + * @param buttonTextColor [Color] to apply to the button text. + */ +data class MessageCardColors( + val backgroundColor: Color, + val titleTextColor: Color, + val messageTextColor: Color, + val iconColor: Color, + val buttonColor: Color, + val buttonTextColor: Color, +) { + companion object { + + /** + * Builder function used to construct an instance of [MessageCardColors]. + */ + @Composable + fun buildMessageCardColors( + backgroundColor: Color = FirefoxTheme.colors.layer2, + titleTextColor: Color = FirefoxTheme.colors.textPrimary, + messageTextColor: Color = FirefoxTheme.colors.textSecondary, + iconColor: Color = FirefoxTheme.colors.iconPrimary, + buttonColor: Color = FirefoxTheme.colors.actionPrimary, + buttonTextColor: Color = FirefoxTheme.colors.textActionPrimary, + ): MessageCardColors = + MessageCardColors( + backgroundColor = backgroundColor, + titleTextColor = titleTextColor, + messageTextColor = messageTextColor, + iconColor = iconColor, + buttonColor = buttonColor, + buttonTextColor = buttonTextColor, + ) + } +} + @Composable @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) @Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) From cd5923f669be05190306279e033a80c8cd8343bf Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 2 Nov 2022 22:24:17 +0000 Subject: [PATCH 296/407] Update to Android-Components 108.0.20221102215151. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index c0f7310f1..d7f309c92 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221102190107" + const val VERSION = "108.0.20221102215151" } From 3a41b00e36016c3114f4e165849e34e1a9cdd088 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Thu, 3 Nov 2022 01:36:18 +0100 Subject: [PATCH 297/407] Import l10n. (#27679) --- app/src/main/res/values-sat/strings.xml | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 8ad4c6768..29a5980c3 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -275,6 +275,20 @@ ᱟᱢᱟᱜ ᱢᱚᱱᱮᱛᱮᱭᱟᱜ Firefox ᱚᱲᱟᱜᱥᱟᱦᱴᱟ ᱫᱚ ᱱᱤᱛᱚᱜ ᱡᱟᱦᱟᱸ ᱨᱮ ᱟᱲᱟᱜ ᱠᱟᱜᱼᱟᱢ ᱚᱱᱰᱮ ᱜᱮ ᱤᱫᱤ ᱢᱮᱭᱟᱭ ᱾ ᱟᱢᱟᱜ ᱱᱤᱛᱚᱜᱟᱜ ᱴᱮᱵᱽ ᱠᱚ, ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱟᱨ ᱥᱮᱸᱫᱽᱨᱟ ᱠᱚ ᱯᱟᱱᱛᱮ ᱛᱟᱢ ᱾ + + ᱟᱢᱟᱜ ᱠᱩᱥᱤ ᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱛᱟᱢ ᱾ ᱱᱤᱛᱚᱜᱟᱜ ᱴᱮᱵᱽ ᱠᱚ, ᱵᱩᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱟᱨ ᱥᱮᱱᱫᱽᱨᱟ ᱛᱮᱞᱟ ᱫᱚ ᱱᱚᱰᱮ ᱫᱮᱠᱷᱟᱣᱜᱼᱟ ᱾ + + ᱥᱟᱹᱫᱷᱤᱱ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱨᱮ ᱟᱢᱟᱜ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ + + ᱱᱤᱡᱚᱨᱟᱜ ᱞᱮᱠᱷᱟ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱨᱮ ᱟᱢᱟᱜ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ + + ᱰᱷᱮᱨ ᱨᱚᱝ ᱠᱚ ᱾ ᱵᱮᱥ ᱱᱤᱥᱚᱱ ᱾ ᱞᱟᱵᱷ ᱨᱮ ᱚᱱᱟ ᱥᱚᱯᱚᱛᱷ ᱜᱮ ᱡᱷᱚᱛᱚ ᱦᱚᱲ ᱾ + + ᱯᱷᱚᱱ ᱠᱷᱚᱱ ᱞᱮᱯᱴᱚᱯ ᱛᱮ ᱩᱪᱟᱹᱲ ᱢᱮ ᱵᱟᱨ ᱯᱟᱦᱴᱮ ᱞᱮᱠᱟᱛᱮ + + ᱯᱚᱨᱫᱟ ᱵᱚᱫᱚᱞ ᱫᱚ ᱱᱤᱛᱚᱜ ᱟᱹᱰᱤ ᱤᱫᱤᱜ ᱠᱟᱱᱟ + + ᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱨᱮ ᱱᱤᱛᱚᱜ ᱡᱟᱦᱟᱸ ᱠᱷᱚᱱ ᱮᱢ ᱟᱲᱟᱜ ᱞᱮᱜᱼᱟ ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱴᱮᱵᱽ ᱠᱷᱚᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ ᱫᱮᱞᱟ ᱮᱛᱦᱚᱵ ᱞᱮᱜᱮ ᱵᱚᱱ @@ -282,6 +296,8 @@ ᱟᱲᱟᱜ + + ᱟᱢᱟᱜ ᱴᱮᱵᱽ ᱫᱚ ᱟᱹᱭᱩᱨ ᱢᱤᱫᱚᱜ ᱠᱟᱱᱟ! ᱮᱴᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱴᱮᱵᱽ ᱠᱷᱚᱱ ᱯᱟᱧᱡᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ ᱾ ᱵᱚᱸᱫᱚᱭ ᱢᱮ @@ -469,6 +485,14 @@ ᱠᱞᱟᱥᱤᱠ %s ᱥᱤᱢᱤᱛ ᱮᱰᱤᱥᱚᱱ + + ᱱᱟᱶᱟ ᱥᱟᱫᱤᱱ ᱨᱚᱲ ᱛᱩᱢᱟᱹᱞ ᱾%s + + ᱱᱟᱶᱟ ᱥᱟᱫᱤᱱ ᱨᱚᱲ ᱛᱩᱢᱟᱹᱞ ᱾ + + ᱨᱚᱝ ᱨᱮᱭᱟᱜ ᱟᱨᱮᱡ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱢᱮ + + ᱟᱢᱟᱜ ᱠᱩᱥᱤᱭᱟᱜ ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱾ ᱰᱷᱮᱨ ᱠᱟᱱᱛᱷᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ @@ -1202,10 +1226,18 @@ %s ᱨᱮ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ! + + ᱢᱤᱫᱴᱟᱹᱝ ᱵᱮᱥ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱨᱮ ᱟᱢᱟᱜ ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ + + ᱦᱚᱲ ᱠᱚ ᱞᱟᱹᱜᱤᱫ, ᱵᱤᱱ ᱞᱟᱵᱷ ᱨᱮᱭᱟᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱵᱽᱨᱟᱣᱡᱚᱨ ᱾ ᱥᱟᱫᱷᱚᱱ ᱵᱷᱤᱛᱨᱤ ᱨᱮ Firefox ᱥᱭᱝᱠ ᱢᱮ + + ᱪᱟᱞᱟᱜ ᱢᱮ ᱡᱟᱦᱟᱸ ᱨᱮ ᱢᱟᱲᱟᱝ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟᱢ %1$s ᱨᱮ ᱵᱩᱠᱢᱟᱨᱠᱥ, ᱦᱤᱛᱟᱹᱞ, ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱨᱮ ᱟᱹᱜᱩ ᱪᱷᱚᱭ ᱢᱮ ᱾ + + ᱟᱨᱟᱢ ᱛᱮ ᱯᱚᱨᱫᱟ ᱠᱚ ᱩᱪᱟᱹᱲ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱫᱷᱚᱱ ᱥᱟᱨᱟ ᱨᱮ ᱴᱮᱵᱽ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱠᱚᱨᱮ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱢᱮ ᱾ ᱥᱩᱦᱤ ᱮᱡ ᱪᱷᱚ @@ -1214,8 +1246,12 @@ ᱥᱭᱝᱠ ᱪᱟᱹᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ ᱯᱨᱟᱭᱣᱮᱥᱭ ᱡᱷᱚᱛᱚ ᱵᱮᱲᱟ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ + + ᱢᱩᱞ ᱞᱮᱠᱷᱟᱛᱮ ᱱᱤᱥᱚᱱ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ %1$s ᱫᱚ ᱵᱟᱦᱨᱮ ᱠᱚᱢᱯᱟᱱᱤ ᱠᱚ ᱣᱮᱵᱽ ᱨᱮ ᱟᱢ ᱯᱟᱸᱡᱟ ᱠᱚ ᱵᱚᱸᱫᱚᱜᱼᱟ ᱾ + + ᱡᱷᱚᱛᱚ ᱥᱟᱭᱤᱴ ᱠᱚᱨᱮ ᱠᱩᱠᱤ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱵᱟᱹᱲ ᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱩᱴ ᱠᱩᱠᱤ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱮᱠᱷᱟᱣᱜ ᱠᱟᱱᱟ ᱾ ᱵᱮᱥᱟᱜ (ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ) @@ -1229,6 +1265,8 @@ ᱴᱩᱞᱵᱟᱨ ᱫᱚ ᱥᱮᱴᱮᱨᱚᱜ ᱴᱷᱮᱱ ᱫᱚᱦᱚᱭ ᱢᱮ ᱾ ᱞᱟᱛᱟᱨ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ, ᱟᱨ ᱵᱟᱝ ᱪᱮᱛᱟᱱ ᱥᱮᱫ ᱩᱪᱟᱹᱲ ᱢᱮ ᱾ + + ᱞᱟᱛᱟᱨ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ, ᱵᱟᱝᱠᱷᱟᱱ ᱪᱮᱛᱟᱱ ᱥᱮᱫ ᱩᱪᱟᱹᱲ ᱢᱮ ᱾ ᱟᱢᱟᱜ ᱱᱤᱥᱚᱱ @@ -1236,9 +1274,13 @@ ᱟᱞᱮ %s ᱞᱮ ᱰᱤᱡᱟᱭᱤᱱ ᱟᱠᱟᱫᱼᱟ ᱚᱠᱟ ᱫᱚ ᱡᱟᱦᱟᱱᱟᱜ ᱠᱚ ᱚᱱᱞᱟᱭᱤᱱ ᱦᱟᱹᱴᱤᱧ ᱨᱮ ᱟᱨ ᱚᱠᱟ ᱠᱚ ᱟᱞᱮ ᱦᱟᱹᱤᱧ ᱟᱞᱮᱭᱟᱢ, ᱜᱚᱲᱚ ᱮᱢᱟᱭ ᱾ + + Firefox ᱴᱷᱮᱱ ᱡᱟᱦᱱᱟᱜ ᱜᱮ ᱟᱢ ᱚᱱᱞᱟᱭᱤᱱ ᱦᱟᱹᱴᱤᱧ ᱮᱫᱟᱢ ᱟᱨ ᱟᱢ ᱟᱞᱮ ᱥᱟᱶ ᱪᱮᱫ ᱮᱢ ᱦᱟᱹᱴᱤᱧ ᱮᱫᱟᱢ ᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱠᱚᱵᱚᱡᱽ ᱮᱢᱟᱢ ᱠᱟᱱᱟᱭ ᱾ ᱟᱞᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱱᱚᱴᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱯᱮ + + ᱟᱹᱰᱤ ᱱᱟᱯᱟᱭ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱠᱷᱩᱞᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱥᱚᱡᱽ ᱜᱮᱭᱟᱢ ᱥᱮ ? ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱮᱦᱚᱵᱽ ᱢᱮ @@ -1325,6 +1367,8 @@ ᱡᱷᱚᱛᱚ ᱯᱮᱼᱯᱟᱨᱴᱭ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱶᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ) ᱠᱷᱚᱛᱚ ᱠᱩᱩᱠᱤ ᱠᱚ (ᱱᱚᱶᱟ ᱫᱚ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱠᱚ ᱨᱟᱹᱯᱩᱫᱟᱭ) + + ᱡᱷᱚᱛᱚ ᱥᱟᱭᱤᱴ ᱠᱩᱠᱤᱡᱽ ᱠᱚ ᱛᱷᱚᱞᱚᱜᱽ ᱠᱟᱜ ᱢᱮ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱡᱤᱱᱤᱥ @@ -1351,6 +1395,8 @@ ᱥᱟᱭᱤᱨᱼᱵᱟᱨᱯᱟᱦᱴᱟ ᱠᱩᱠᱤᱡᱽ ᱠᱚ ᱮᱰ ᱱᱮᱴᱣᱳᱨᱠ ᱠᱚ ᱟᱨ ᱮᱱᱟᱞᱭᱴᱤᱠ ᱠᱚᱢᱯᱟᱱᱤ ᱠᱚ ᱮᱢᱟᱱ ᱠᱩᱻᱠᱤᱡ ᱠᱚ, ᱚᱠᱟ ᱫᱚ ᱟᱭᱢᱟ ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱰᱟᱴᱟ ᱠᱚ ᱠᱚᱢᱯᱟᱭᱤᱞ ᱞᱟᱹᱜᱤᱫᱽ ᱵᱮᱵᱷᱟᱨᱚᱜᱼᱟ ᱚᱱᱟ ᱠᱚ ᱵᱞᱚᱠ ᱟᱭ ᱾ + + ᱢᱩᱴ ᱠᱩᱠᱤ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱚ ᱡᱟᱦᱟᱸ ᱥᱟᱭᱤᱴ ᱨᱮ ᱢᱮᱱᱟᱢᱟᱸ ᱚᱱᱰᱮ ᱠᱩᱠᱤ ᱛᱷᱚᱞᱚᱜᱽ ᱠᱚᱣᱟᱭ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱟᱧᱡᱟᱤᱭᱟᱹ ᱡᱮᱞᱠᱟ ᱰᱷᱟᱶᱨᱟ ᱡᱟᱹᱞᱤ ᱠᱚ ᱫᱚ ᱟᱢ ᱵᱟᱠᱚ ᱯᱟᱧᱡᱟ ᱫᱟᱲᱮ ᱢᱮᱭᱟ ᱠᱚ ᱾ ᱠᱨᱭᱯᱴᱚᱢᱟᱭᱱᱟᱹᱨ ᱠᱚ From ee0bff886ab98b8d16653ef41739b042bdf1522d Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Fri, 28 Oct 2022 18:15:23 +0300 Subject: [PATCH 298/407] For #25814 - Hide "Show search engines" toggle from search settings when unified search is enabled --- .../fenix/search/SearchDialogController.kt | 3 +- .../fenix/search/SearchDialogFragment.kt | 7 ++- .../fenix/search/SearchFragmentStore.kt | 6 ++- .../settings/search/SearchEngineFragment.kt | 1 + .../search/SearchDialogControllerTest.kt | 23 ++++++++++ .../fenix/search/SearchFragmentStoreTest.kt | 43 ++++++++++++++++++- 6 files changed, 77 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt index ba838e4ba..b7babc74f 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogController.kt @@ -144,7 +144,8 @@ class SearchDialogController( fragmentStore.dispatch(SearchFragmentAction.UpdateQuery(text)) fragmentStore.dispatch( SearchFragmentAction.ShowSearchShortcutEnginePicker( - (textMatchesCurrentUrl || textMatchesCurrentSearch || text.isEmpty()) && + !settings.showUnifiedSearchFeature && + (textMatchesCurrentUrl || textMatchesCurrentSearch || text.isEmpty()) && settings.shouldShowSearchShortcuts, ), ) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt index d4d885a3b..f600d74c2 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt @@ -296,7 +296,12 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { flow.map { state -> state.search } .ifChanged() .collect { search -> - store.dispatch(SearchFragmentAction.UpdateSearchState(search)) + store.dispatch( + SearchFragmentAction.UpdateSearchState( + search, + showUnifiedSearchFeature, + ), + ) updateSearchSelectorMenu(search.searchEngines) } diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt index 1fa8d5f67..6c7c81bce 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt @@ -212,8 +212,9 @@ sealed class SearchFragmentAction : Action { /** * Updates the local `SearchFragmentState` from the global `SearchState` in `BrowserStore`. + * If the unified search is enabled, then search shortcuts should not be shown. */ - data class UpdateSearchState(val search: SearchState) : SearchFragmentAction() + data class UpdateSearchState(val search: SearchState, val isUnifiedSearchEnabled: Boolean) : SearchFragmentAction() } /** @@ -304,7 +305,8 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen state.copy( defaultEngine = action.search.selectedOrDefaultSearchEngine, areShortcutsAvailable = action.search.searchEngines.size > 1, - showSearchShortcuts = state.url.isEmpty() && + showSearchShortcuts = !action.isUnifiedSearchEnabled && + state.url.isEmpty() && state.showSearchShortcutsSetting && action.search.searchEngines.size > 1, searchEngineSource = when (state.searchEngineSource) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt index 4cd6fb15b..109325b84 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt @@ -50,6 +50,7 @@ class SearchEngineFragment : PreferenceFragmentCompat() { val showSearchShortcuts = requirePreference(R.string.pref_key_show_search_engine_shortcuts).apply { isChecked = context.settings().shouldShowSearchShortcuts + isVisible = !context.settings().showUnifiedSearchFeature } val showHistorySuggestions = diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt index c143a15e3..76f99f64d 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt @@ -271,6 +271,29 @@ class SearchDialogControllerTest { verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) } } + @Test + fun `GIVEN show search shortcuts setting is enabled AND unified search is enabled WHEN query is empty THEN do not show search shortcuts`() { + val text = "" + every { settings.shouldShowSearchShortcuts } returns true + every { settings.showUnifiedSearchFeature } returns true + + createController().handleTextChanged(text) + + verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } + } + + @Test + fun `GIVEN show search shortcuts setting is enabled AND unified search is enabled WHEN query is url THEN do not show search shortcuts`() { + val text = "mozilla.org" + every { store.state.url } returns "mozilla.org" + every { settings.shouldShowSearchShortcuts } returns true + every { settings.showUnifiedSearchFeature } returns true + + createController().handleTextChanged(text) + + verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } + } + @Test fun `do not show search shortcuts when setting enabled AND query non-empty`() { val text = "mozilla" diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt index 3189cb616..3bbe0209b 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt @@ -268,7 +268,7 @@ class SearchFragmentStoreTest { store.dispatch( SearchFragmentAction.UpdateSearchState( - SearchState( + search = SearchState( region = RegionState("US", "US"), regionSearchEngines = listOf( SearchEngine("engine-a", "Engine A", mockk(), type = SearchEngine.Type.BUNDLED), @@ -293,6 +293,7 @@ class SearchFragmentStoreTest { userSelectedSearchEngineId = null, userSelectedSearchEngineName = null, ), + isUnifiedSearchEnabled = false, ), ) @@ -327,7 +328,7 @@ class SearchFragmentStoreTest { store.dispatch( SearchFragmentAction.UpdateSearchState( - SearchState( + search = SearchState( region = RegionState("US", "US"), regionSearchEngines = listOf( SearchEngine("engine-a", "Engine A", mockk(), type = SearchEngine.Type.BUNDLED), @@ -352,6 +353,7 @@ class SearchFragmentStoreTest { userSelectedSearchEngineId = null, userSelectedSearchEngineName = null, ), + isUnifiedSearchEnabled = false, ), ) @@ -368,6 +370,43 @@ class SearchFragmentStoreTest { assertEquals("Engine B", store.state.searchEngineSource.searchEngine!!.name) } + @Test + fun `GIVEN unified search is enabled WHEN updating the SearchFragmentState from SearchState THEN disable search shortcuts`() { + val store = SearchFragmentStore( + emptyDefaultState( + searchEngineSource = SearchEngineSource.None, + areShortcutsAvailable = false, + defaultEngine = null, + showSearchShortcutsSetting = false, + ), + ) + + assertFalse(store.state.showSearchShortcuts) + + store.dispatch( + SearchFragmentAction.UpdateSearchState( + search = SearchState( + region = RegionState("US", "US"), + regionSearchEngines = listOf( + SearchEngine("engine-a", "Engine A", mockk(), type = SearchEngine.Type.BUNDLED), + SearchEngine("engine-b", "Engine B", mockk(), type = SearchEngine.Type.BUNDLED), + ), + customSearchEngines = listOf(), + additionalSearchEngines = listOf(), + additionalAvailableSearchEngines = listOf(), + hiddenSearchEngines = listOf(), + regionDefaultSearchEngineId = "engine-b", + userSelectedSearchEngineId = null, + userSelectedSearchEngineName = null, + ), + isUnifiedSearchEnabled = true, + ), + ) + store.waitUntilIdle() + + assertFalse(store.state.showSearchShortcuts) + } + private fun emptyDefaultState( searchEngineSource: SearchEngineSource = mockk(), defaultEngine: SearchEngine? = mockk(), From ef2af26b693ea7879a655350b8567b46e271cdb5 Mon Sep 17 00:00:00 2001 From: Jonathan Almeida Date: Wed, 2 Nov 2022 16:20:48 -0400 Subject: [PATCH 299/407] Bug 1795105: Remove usages of ContentState.thumbnail --- .../mozilla/fenix/home/recenttabs/view/RecentTabs.kt | 12 ------------ .../tabstray/browser/AbstractBrowserTabViewHolder.kt | 6 +----- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt index 75a085d13..e79e70eaf 100644 --- a/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt +++ b/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt @@ -195,17 +195,14 @@ private fun RecentTabItem( * @param tab [RecentTab] that was recently viewed. * @param modifier [Modifier] used to draw the image content. * @param contentScale [ContentScale] used to draw image content. - * @param alignment [Alignment] used to draw the image content. */ @Composable fun RecentTabImage( tab: RecentTab.Tab, modifier: Modifier = Modifier, contentScale: ContentScale = ContentScale.FillWidth, - alignment: Alignment = Alignment.TopCenter, ) { val previewImageUrl = tab.state.content.previewImageUrl - val thumbnail = tab.state.content.thumbnail when { !previewImageUrl.isNullOrEmpty() -> { @@ -216,15 +213,6 @@ fun RecentTabImage( contentScale = ContentScale.Crop, ) } - thumbnail != null -> { - Image( - painter = BitmapPainter(thumbnail.asImageBitmap()), - contentDescription = null, - modifier = modifier, - contentScale = contentScale, - alignment = alignment, - ) - } else -> ThumbnailCard( url = tab.state.content.url, key = tab.state.id, diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt index f816c9bdc..57af576a8 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolder.kt @@ -109,11 +109,7 @@ abstract class AbstractBrowserTabViewHolder( } } - if (tab.content.thumbnail != null) { - thumbnailView.setImageBitmap(tab.content.thumbnail) - } else { - loadIntoThumbnailView(thumbnailView, tab.id) - } + loadIntoThumbnailView(thumbnailView, tab.id) } override fun showTabIsMultiSelectEnabled(selectedMaskView: View?, isSelected: Boolean) { From 6228dad8e431c904e99f905fcb68f9dda9b61370 Mon Sep 17 00:00:00 2001 From: t-p-white Date: Tue, 1 Nov 2022 16:35:23 +0000 Subject: [PATCH 300/407] For #27472 - Added telemetry data points for the Google Play Store review prompts --- app/metrics.yaml | 28 ++++++++++ .../components/ReviewPromptController.kt | 51 ++++++++++++++++++ .../components/ReviewPromptControllerTest.kt | 54 ++++++++++++++++++- 3 files changed, 131 insertions(+), 2 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index e1a230c25..90668eb9e 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -8456,3 +8456,31 @@ recent_synced_tabs: data_sensitivity: - interaction expires: 114 +review_prompt: + prompt_attempt: + type: event + description: | + Data captured for each attempt to display the review prompt. + extra_keys: + prompt_was_displayed: + description: | + Whether the prompt was displayed to the user. Value + reported will be: 'true', 'false' or 'error'. + type: string + local_datetime: + description: | + The local datetime. + type: string + number_of_app_launches: + description: | + The total number of times the app has been launched. + type: quantity + bugs: + - https://github.com/mozilla-mobile/fenix/issues/27472 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/27596 + notification_emails: + - android-probes@mozilla.com + data_sensitivity: + - interaction + expires: 121 diff --git a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt index 87c3a831b..bd82d6335 100644 --- a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt @@ -6,10 +6,15 @@ package org.mozilla.fenix.components import android.app.Activity import androidx.annotation.VisibleForTesting +import com.google.android.play.core.review.ReviewInfo import com.google.android.play.core.review.ReviewManager import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.withContext import org.mozilla.fenix.utils.Settings +import org.mozilla.fenix.GleanMetrics.ReviewPrompt +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale /** * Interface that describes the settings needed to track the Review Prompt. @@ -50,6 +55,11 @@ class ReviewPromptController( flow.addOnCompleteListener { if (it.isSuccessful) { manager.launchReviewFlow(activity, it.result) + recordReviewPromptEvent( + it.result.toString(), + reviewSettings.numberOfAppLaunches, + Date(), + ) } } } @@ -98,3 +108,44 @@ class ReviewPromptController( private const val NUMBER_OF_MONTHS_TO_PASS = 4 } } + +/** + * Records a [ReviewPrompt] with the required data. + * + * **Note:** The docs for [ReviewManager.launchReviewFlow] state 'In some circumstances the review + * flow will not be shown to the user, e.g. they have already seen it recently, so do not assume that + * calling this method will always display the review dialog.' + * However, investigation has shown that a [ReviewInfo] instance with the flag: + * - 'isNoOp=true' indicates that the prompt has NOT been displayed. + * - 'isNoOp=false' indicates that a prompt has been displayed. + * [ReviewManager.launchReviewFlow] will modify the ReviewInfo instance which can be used to determine + * which of these flags is present. + */ +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +fun recordReviewPromptEvent( + reviewInfoAsString: String, + numberOfAppLaunches: Int, + now: Date, +) { + val formattedLocalDatetime = + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault()).format(now) + + // The internals of ReviewInfo cannot be accessed directly or cast nicely, so lets simply use + // the object as a string. + // ReviewInfo is susceptible to changes outside of our control hence the catch-all 'else' statement. + val promptWasDisplayed = if (reviewInfoAsString.contains("isNoOp=true")) { + "false" + } else if (reviewInfoAsString.contains("isNoOp=false")) { + "true" + } else { + "error" + } + + ReviewPrompt.promptAttempt.record( + ReviewPrompt.PromptAttemptExtra( + promptWasDisplayed = promptWasDisplayed, + localDatetime = formattedLocalDatetime, + numberOfAppLaunches = numberOfAppLaunches, + ), + ) +} diff --git a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt index 6ee8dba60..9b5fc4205 100644 --- a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt @@ -8,14 +8,21 @@ import com.google.android.play.core.review.ReviewManager import com.google.android.play.core.review.ReviewManagerFactory import kotlinx.coroutines.test.runTest import mozilla.components.support.test.robolectric.testContext -import org.junit.Test +import mozilla.telemetry.glean.testing.GleanTestRule import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test import org.junit.Before +import org.junit.Rule import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.ReviewPrompt import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale class TestReviewSettings( override var numberOfAppLaunches: Int = 0, @@ -29,6 +36,9 @@ class TestReviewSettings( @RunWith(FenixRobolectricTestRunner::class) class ReviewPromptControllerTest { + @get:Rule + val gleanTestRule = GleanTestRule(testContext) + private lateinit var reviewManager: ReviewManager @Before @@ -208,9 +218,49 @@ class ReviewPromptControllerTest { assertFalse(controller.shouldShowPrompt()) } + @Test + fun reviewPromptWasDisplayed() { + testRecordReviewPromptEventRecordsTheExpectedData("isNoOp=false", "true") + } + + @Test + fun reviewPromptWasNotDisplayed() { + testRecordReviewPromptEventRecordsTheExpectedData("isNoOp=true", "false") + } + + @Test + fun reviewPromptDisplayStateUnknown() { + testRecordReviewPromptEventRecordsTheExpectedData(expected = "error") + } + + private fun testRecordReviewPromptEventRecordsTheExpectedData( + reviewInfoArg: String = "", + expected: String, + ) { + val numberOfAppLaunches = 1 + val reviewInfoAsString = + "ReviewInfo{pendingIntent=PendingIntent{5b613b1: android.os.BinderProxy@46c8096}, $reviewInfoArg}" + val datetime = Date(TEST_TIME_NOW) + val formattedNowLocalDatetime = SIMPLE_DATE_FORMAT.format(datetime) + + assertNull(ReviewPrompt.promptAttempt.testGetValue()) + recordReviewPromptEvent(reviewInfoAsString, numberOfAppLaunches, datetime) + + val reviewPromptData = ReviewPrompt.promptAttempt.testGetValue()!!.last().extra!! + assertEquals(expected, reviewPromptData["prompt_was_displayed"]) + assertEquals(numberOfAppLaunches, reviewPromptData["number_of_app_launches"]!!.toInt()) + assertEquals(formattedNowLocalDatetime, reviewPromptData["local_datetime"]) + } + companion object { private const val TEST_TIME_NOW = 1598416882805L private const val MORE_THAN_4_MONTHS_FROM_TEST_TIME_NOW = 1588048882804L private const val LESS_THAN_4_MONTHS_FROM_TEST_TIME_NOW = 1595824882905L + private val SIMPLE_DATE_FORMAT by lazy { + SimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ss", + Locale.getDefault(), + ) + } } } From 035305ceb2f165084272b1d709f8e14f5abeb99f Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 3 Nov 2022 17:17:30 +0200 Subject: [PATCH 301/407] For #27220 disable failing manageDownloadsInDownloadsMenuTest UI test --- app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt index ddf3f218c..d71c2b089 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -10,6 +10,7 @@ import androidx.test.runner.permission.PermissionRequester import androidx.test.uiautomator.UiDevice import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.rules.TestRule @@ -157,6 +158,7 @@ class DownloadTest { - downloads appear in the list - deleting a download from device storage, removes it from the Downloads Menu too */ + @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/27220") @SmokeTest @Test fun manageDownloadsInDownloadsMenuTest() { From 408d15af9b2b4c6f9409946ea30e190533411e0a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 3 Nov 2022 15:22:41 +0000 Subject: [PATCH 302/407] Update to Android-Components 108.0.20221103143443. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index d7f309c92..a90b11735 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221102215151" + const val VERSION = "108.0.20221103143443" } From dda6719c32dd8ecdeb7d8516716711dd0018f25a Mon Sep 17 00:00:00 2001 From: kycn <35106533+kycn@users.noreply.github.com> Date: Thu, 3 Nov 2022 15:12:21 +0100 Subject: [PATCH 303/407] Close #7227: Re-enable storage maintenance call. Re-enable storage maintenance call by introducing WorkManager worker on A-C side and consuming it from Fenix. The work request is periodic and the repeat interval is 24h. It requires the device to be idle and not to have low battery. This feature is available only for Nightly for now. --- .../java/org/mozilla/fenix/FeatureFlags.kt | 5 +++ .../org/mozilla/fenix/FenixApplication.kt | 42 ++++++++++--------- .../java/org/mozilla/fenix/utils/Settings.kt | 5 --- app/src/main/res/values/preference_keys.xml | 1 - 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 06acac6c2..d4a12f1aa 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -121,4 +121,9 @@ object FeatureFlags { * Enables the save to PDF feature. */ const val saveToPDF = true + + /** + * Enables storage maintenance feature + * */ + val storageMaintenanceFeature = Config.channel.isNightlyOrDebug } diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 192f4b810..38353ba59 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -28,6 +28,7 @@ import mozilla.appservices.Megazord import mozilla.components.browser.state.action.SystemAction import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.browser.storage.sync.GlobalPlacesDependencyProvider import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.concept.engine.webextension.WebExtension import mozilla.components.concept.engine.webextension.isUnsupported @@ -210,6 +211,14 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.core.engine.warmUp() } initializeWebExtensionSupport() + if (FeatureFlags.storageMaintenanceFeature) { + // Make sure to call this function before registering a storage worker + // (e.g. components.core.historyStorage.registerStorageMaintenanceWorker()) + // as the storage maintenance worker needs a places storage globally when + // it is needed while the app is not running and WorkManager wakes up the app + // for the periodic task. + GlobalPlacesDependencyProvider.initialize(components.core.historyStorage) + } restoreBrowserState() restoreDownloads() @@ -229,12 +238,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { registerActivityLifecycleCallbacks(visibilityLifecycleCallback) registerActivityLifecycleCallbacks(MarkersActivityLifecycleCallbacks(components.core.engine)) - // Storage maintenance disabled, for now, as it was interfering with background migrations. - // See https://github.com/mozilla-mobile/fenix/issues/7227 for context. - // if ((System.currentTimeMillis() - settings().lastPlacesStorageMaintenance) > ONE_DAY_MILLIS) { - // runStorageMaintenance() - // } - components.appStartReasonProvider.registerInAppOnCreate(this) components.startupActivityLog.registerInAppOnCreate(this) initVisualCompletenessQueueAndQueueTasks() @@ -343,6 +346,18 @@ open class FenixApplication : LocaleAwareApplication(), Provider { } } + fun queueStorageMaintenance() { + if (FeatureFlags.storageMaintenanceFeature) { + queue.runIfReadyOrQueue { + // Make sure GlobalPlacesDependencyProvider.initialize(components.core.historyStorage) + // is called before this call. When app is not running and WorkManager wakes up + // the app for the periodic task, it will require a globally provided places storage + // to run the maintenance on. + components.core.historyStorage.registerStorageMaintenanceWorker() + } + } + } + initQueue() // We init these items in the visual completeness queue to avoid them initing in the critical @@ -351,6 +366,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { queueMetrics() queueReviewPrompt() queueRestoreLocale() + queueStorageMaintenance() } private fun startMetricsIfEnabled() { @@ -363,20 +379,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { } } - // See https://github.com/mozilla-mobile/fenix/issues/7227 for context. - // To re-enable this, we need to do so in a way that won't interfere with any startup operations - // which acquire reserved+ sqlite lock. Currently, Fennec migrations need to write to storage - // on startup, and since they run in a background service we can't simply order these operations. - // @OptIn(DelicateCoroutinesApi::class) // GlobalScope usage - // private fun runStorageMaintenance() { - // GlobalScope.launch(Dispatchers.IO) { - // // Bookmarks and history storage sit on top of the same db file so we only need to - // // run maintenance on one - arbitrarily using bookmarks. - // // components.core.bookmarksStorage.runMaintenance() - // } - // settings().lastPlacesStorageMaintenance = System.currentTimeMillis() - // } - protected open fun setupLeakCanary() { // no-op, LeakCanary is disabled by default } diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 14b0b4023..597efc641 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1035,11 +1035,6 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = true, ) - var lastPlacesStorageMaintenance by longPreference( - appContext.getPreferenceKey(R.string.pref_key_last_maintenance), - default = 0, - ) - fun addSearchWidgetInstalled(count: Int) { val key = appContext.getPreferenceKey(R.string.pref_key_search_widget_installed) val newValue = preferences.getInt(key, 0) + count diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index ca7b8a329..c01bd3dfc 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -38,7 +38,6 @@ pref_key_addons pref_key_override_amo_user pref_key_override_amo_collection - pref_key_last_maintenance pref_key_help pref_key_rate pref_key_about From c4b4f07a25f8b391cd76ad96e062369e1b2a7659 Mon Sep 17 00:00:00 2001 From: Perry McManis Date: Wed, 2 Nov 2022 15:08:13 -0400 Subject: [PATCH 304/407] added search metrics to baseline ping --- app/metrics.yaml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index 90668eb9e..3c80a87fe 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -1315,6 +1315,7 @@ metrics: `other` option for the source but it should never enter on this case. send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/1158 - https://github.com/mozilla-mobile/fenix/issues/6556 @@ -1333,6 +1334,8 @@ metrics: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never + no_lint: + - BASELINE_PING metadata: tags: - Search @@ -2364,6 +2367,7 @@ search.default_engine: value will be "custom" send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/800 data_reviews: @@ -2380,6 +2384,8 @@ search.default_engine: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never + no_lint: + - BASELINE_PING name: type: string lifetime: application @@ -2390,6 +2396,7 @@ search.default_engine: value will be "custom" send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/800 data_reviews: @@ -2406,6 +2413,8 @@ search.default_engine: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never + no_lint: + - BASELINE_PING search_url: type: url lifetime: application @@ -6125,6 +6134,7 @@ browser.search: The key format is ``. send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/6558 data_reviews: @@ -6139,6 +6149,8 @@ browser.search: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never + no_lint: + - BASELINE_PING ad_clicks: type: labeled_counter description: | @@ -6146,6 +6158,7 @@ browser.search: The key format is ``. send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/6558 data_reviews: @@ -6160,12 +6173,15 @@ browser.search: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never + no_lint: + - BASELINE_PING in_content: type: labeled_counter description: | Records the type of interaction a user has on SERP pages. send_in_pings: - metrics + - baseline bugs: - https://github.com/mozilla-mobile/fenix/issues/6557 data_reviews: @@ -6180,7 +6196,8 @@ browser.search: - android-probes@mozilla.com - kbrosnan@mozilla.com expires: never - + no_lint: + - BASELINE_PING addons: open_addons_in_settings: type: event From 90d0d9a7c55b0287a1322e841f5bd3aeadacf0e4 Mon Sep 17 00:00:00 2001 From: perrymcmanis144 <95651456+perrymcmanis144@users.noreply.github.com> Date: Thu, 3 Nov 2022 07:52:42 -0500 Subject: [PATCH 305/407] Update app/metrics.yaml Co-authored-by: Alessio Placitelli --- app/metrics.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index 3c80a87fe..c16b223aa 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -6198,6 +6198,7 @@ browser.search: expires: never no_lint: - BASELINE_PING + addons: open_addons_in_settings: type: event From 62b65d3a57d903d599f4b56e5eff2064ca69a210 Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Thu, 3 Nov 2022 19:26:15 +0200 Subject: [PATCH 306/407] For #27691 - Replace 'Pocket' word in all strings with placeholder --- .../mozilla/fenix/home/pocket/PocketStoriesComposables.kt | 5 ++++- .../org/mozilla/fenix/settings/HomeSettingsFragment.kt | 4 ++++ app/src/main/res/values/static_strings.xml | 2 ++ app/src/main/res/values/strings.xml | 8 +++++--- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt index 9f14af698..1041d96b9 100644 --- a/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt +++ b/app/src/main/java/org/mozilla/fenix/home/pocket/PocketStoriesComposables.kt @@ -457,7 +457,10 @@ fun PoweredByPocketHeader( Column { Text( - text = stringResource(R.string.pocket_stories_feature_title), + text = stringResource( + R.string.pocket_stories_feature_title_2, + LocalContext.current.getString(R.string.pocket_product_name), + ), color = textColor, style = FirefoxTheme.typography.caption, ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt index 8565b3c86..80ea4a8e3 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt @@ -104,6 +104,10 @@ class HomeSettingsFragment : PreferenceFragmentCompat() { requirePreference(R.string.pref_key_pocket_homescreen_recommendations).apply { isVisible = FeatureFlags.isPocketRecommendationsFeatureEnabled(context) isChecked = context.settings().showPocketRecommendationsFeature + summary = context.getString( + R.string.customize_toggle_pocket_summary, + context.getString(R.string.pocket_product_name), + ) onPreferenceChangeListener = object : SharedPreferenceUpdater() { override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { CustomizeHome.preferenceToggled.record( diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index c11b7cb60..a03a71c09 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -26,6 +26,8 @@ AC AS + + Pocket diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 07086f964..c4d67edc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -447,8 +447,8 @@ Pocket Thought-provoking stories - - Articles powered by Pocket + + Articles powered by %s Sponsored stories @@ -1867,7 +1867,9 @@ Discover more - Powered by Pocket. + Powered by Pocket. + + Powered by %s. Part of the Firefox family. %s From 07e461390bffe5be3e1c0114cacd1e307f278398 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Wed, 2 Nov 2022 15:42:00 -0700 Subject: [PATCH 307/407] For #27468 - Backplate homepage MessageCard --- .../onboarding/MessageCardViewHolder.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt index f868e4520..835ca1232 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/MessageCardViewHolder.kt @@ -5,17 +5,24 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding import android.view.View +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.LifecycleOwner +import mozilla.components.lib.state.ext.observeAsComposableState import org.mozilla.fenix.R +import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.compose.MessageCard +import org.mozilla.fenix.compose.MessageCardColors import org.mozilla.fenix.gleanplumb.Message import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.wallpapers.Wallpaper +import org.mozilla.fenix.wallpapers.WallpaperState /** * View holder for the Nimbus Message Card. @@ -47,11 +54,31 @@ class MessageCardViewHolder( @Composable override fun Content() { val message by remember { mutableStateOf(messageGlobal) } + val wallpaperState = components.appStore + .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default + val isWallpaperNotDefault = !Wallpaper.nameIsDefault(wallpaperState.currentWallpaper.name) + + var (_, _, _, _, buttonColor, buttonTextColor) = MessageCardColors.buildMessageCardColors() + + if (isWallpaperNotDefault) { + buttonColor = FirefoxTheme.colors.layer1 + + if (!isSystemInDarkTheme()) { + buttonTextColor = FirefoxTheme.colors.textActionSecondary + } + } + + val messageCardColors = MessageCardColors.buildMessageCardColors( + backgroundColor = wallpaperState.wallpaperCardColor, + buttonColor = buttonColor, + buttonTextColor = buttonTextColor, + ) MessageCard( messageText = message.data.text, titleText = message.data.title, buttonText = message.data.buttonLabel, + messageColors = messageCardColors, onClick = { interactor.onMessageClicked(message) }, onCloseButtonClick = { interactor.onMessageClosedClicked(message) }, ) From 1b89abdf3eb72640e7d552fff0b01de20094d854 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Wed, 2 Nov 2022 16:11:49 -0700 Subject: [PATCH 308/407] For #27469 - Update no collections button colors when a wallpaper is selected --- .../NoCollectionsMessageViewHolder.kt | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt index 907aaa8f0..0d90c2230 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders import android.view.View import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.lifecycle.LifecycleOwner import kotlinx.coroutines.flow.map @@ -19,6 +20,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.databinding.NoCollectionsMessageBinding import org.mozilla.fenix.ext.increaseTapArea +import org.mozilla.fenix.ext.isSystemInDarkTheme import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor import org.mozilla.fenix.utils.view.ViewHolder @@ -58,9 +60,10 @@ class NoCollectionsMessageViewHolder( } appStore.flowScoped(viewLifecycleOwner) { flow -> - flow.map { state -> state.wallpaperState.currentWallpaper.textColor } + flow.map { state -> state.wallpaperState } .ifChanged() - .collect { textColor -> + .collect { wallpaperState -> + val textColor = wallpaperState.currentWallpaper.textColor if (textColor == null) { val context = view.context binding.noCollectionsHeader.setTextColor( @@ -78,6 +81,25 @@ class NoCollectionsMessageViewHolder( binding.noCollectionsDescription.setTextColor(color) binding.removeCollectionPlaceholder.setColorFilter(color) } + + var buttonColor = ContextCompat.getColor(view.context, R.color.fx_mobile_action_color_primary) + var buttonTextColor = ContextCompat.getColor( + view.context, + R.color.fx_mobile_text_color_action_primary, + ) + wallpaperState.runIfWallpaperCardColorsAreAvailable { _, _ -> + buttonColor = ContextCompat.getColor(view.context, R.color.fx_mobile_layer_color_1) + + if (!view.context.isSystemInDarkTheme()) { + buttonTextColor = ContextCompat.getColor( + view.context, + R.color.fx_mobile_text_color_action_secondary, + ) + } + } + + binding.addTabsToCollectionsButton.setBackgroundColor(buttonColor) + binding.addTabsToCollectionsButton.setTextColor(buttonTextColor) } } } From 9654b4dfb122b54b04369fe80a2f9c95811478e8 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Wed, 2 Nov 2022 22:37:21 -0400 Subject: [PATCH 309/407] For #27667 - Remove import-ordering from the list of disabled ktlint rules --- .editorconfig | 5 --- .git-blame-ignore-revs | 4 +- .../org/mozilla/fenix/components/FxaServer.kt | 2 +- .../mozilla/fenix/glean/BaselinePingTest.kt | 4 +- .../java/org/mozilla/fenix/helpers/Assert.kt | 5 --- .../fenix/helpers/MockLocationUpdatesRule.kt | 2 +- .../mozilla/fenix/helpers/SearchDispatcher.kt | 4 +- .../org/mozilla/fenix/helpers/TestHelper.kt | 4 +- .../helpers/matchers/BitmapDrawableMatcher.kt | 6 +-- .../screenshots/DefaultHomeScreenTest.kt | 2 +- .../fenix/ui/SettingsDeveloperToolsTest.kt | 4 +- .../mozilla/fenix/ui/SettingsSearchTest.kt | 2 +- .../org/mozilla/fenix/ui/SettingsSyncTest.kt | 4 +- .../java/org/mozilla/fenix/ui/SettingsTest.kt | 4 +- .../mozilla/fenix/ui/robots/DownloadRobot.kt | 2 +- ...rySubMenusMultipleSelectionToolbarRobot.kt | 12 +++--- .../fenix/ui/robots/NotificationRobot.kt | 2 +- ...ttingsSubMenuSitePermissionsCommonRobot.kt | 2 +- .../org/mozilla/fenix/FenixApplication.kt | 2 +- .../fenix/addons/AddonPopupBaseFragment.kt | 2 +- .../fenix/addons/AddonsManagementFragment.kt | 2 +- .../fenix/browser/BaseBrowserFragment.kt | 42 +++++++++---------- .../org/mozilla/fenix/components/Analytics.kt | 4 +- .../java/org/mozilla/fenix/components/Push.kt | 2 +- .../components/ReviewPromptController.kt | 2 +- .../fenix/components/appstate/AppAction.kt | 6 +-- .../fenix/components/appstate/AppState.kt | 2 +- .../components/metrics/MetricController.kt | 2 +- .../customtabs/ExternalAppBrowserFragment.kt | 2 +- .../java/org/mozilla/fenix/ext/Activity.kt | 6 +-- .../gleanplumb/CustomAttributeProvider.kt | 2 +- .../intent/CrashReporterIntentProcessor.kt | 2 +- .../fenix/library/LibraryPageFragment.kt | 2 +- .../viewholders/BookmarkNodeViewHolder.kt | 6 +-- .../library/downloads/DownloadFragment.kt | 4 +- .../DownloadsListItemViewHolder.kt | 6 +-- .../fenix/library/history/HistoryAdapter.kt | 2 +- .../HistoryMetadataGroupFragment.kt | 4 +- .../HistoryMetadataGroupController.kt | 2 +- .../DefaultBrowserNotificationWorker.kt | 2 +- .../fenix/perf/ProfilerReusableComposable.kt | 1 - .../fenix/perf/ProfilerStartDialogFragment.kt | 1 - .../fenix/settings/SettingsFragment.kt | 2 +- .../fenix/settings/SyncDebugFragment.kt | 2 +- .../TextPercentageSeekBarPreference.kt | 1 - .../fenix/settings/account/SignOutFragment.kt | 4 +- .../address/view/AddressEditorView.kt | 4 +- .../SavedLoginsStorageController.kt | 2 +- .../quicksettings/WebsitePermissionsView.kt | 6 +-- ...itePermissionsDetailsExceptionsFragment.kt | 6 +-- .../mozilla/fenix/share/ShareController.kt | 2 +- .../fenix/tabstray/NavigationInteractor.kt | 2 +- .../fenix/tabstray/TabsTrayFragment.kt | 2 +- .../tabstray/TabsTrayInfoBannerBinding.kt | 2 +- .../mozilla/fenix/utils/ToolbarPopupWindow.kt | 10 ++--- .../fenix/IntentReceiverActivityTest.kt | 2 +- .../fenix/browser/BaseBrowserFragmentTest.kt | 2 +- .../components/AccountAbnormalitiesTest.kt | 4 +- .../components/InflationAwareFeatureTest.kt | 2 +- .../components/ReviewPromptControllerTest.kt | 2 +- .../metrics/MetricControllerTest.kt | 2 +- .../toolbar/BrowserToolbarCFRPresenterTest.kt | 8 ++-- .../toolbar/BrowserToolbarViewTest.kt | 7 ++-- .../crashes/CrashReporterControllerTest.kt | 1 - .../mozilla/fenix/ext/AtomicIntegerTest.kt | 2 +- .../mozilla/fenix/ext/DownloadItemKtTest.kt | 3 +- .../org/mozilla/fenix/ext/ImageButtonTest.kt | 6 +-- .../DefaultSessionControlControllerTest.kt | 2 +- .../home/PrivateBrowsingButtonViewTest.kt | 2 +- ...dingToolbarPositionPickerViewHolderTest.kt | 2 +- .../library/bookmarks/BookmarkAdapterTest.kt | 2 +- .../library/history/HistoryInteractorTest.kt | 2 +- .../DefaultRecentlyClosedControllerTest.kt | 8 ++-- .../settings/DropDownListPreferenceTest.kt | 3 +- .../creditcards/CreditCardEditorViewTest.kt | 2 +- .../quicksettings/AutoplayValueTest.kt | 6 +-- .../WebsitePermissionViewTest.kt | 8 ++-- ...anageExceptionsPhoneFeatureFragmentTest.kt | 10 ++--- .../SitePermissionsWifiIntegrationTest.kt | 2 +- .../AccountDevicesShareAdapterTest.kt | 2 +- .../share/listadapters/AppShareAdapterTest.kt | 2 +- .../fenix/tabhistory/TabHistoryAdapterTest.kt | 6 +-- .../fenix/tabstray/TabsTrayFragmentTest.kt | 2 +- .../AbstractBrowserTabViewHolderTest.kt | 16 +++---- .../browser/BrowserTabsAdapterTest.kt | 6 +-- .../trackingprotection/TrackerBucketsTest.kt | 2 +- .../mozilla/fenix/utils/BrowsersCacheTest.kt | 2 +- .../fenix/wifi/WifiConnectionMonitorTest.kt | 2 +- .../mozilla/fenix/gradle/tasks/ApkSizeTask.kt | 1 - .../architectureexample/ContactsController.kt | 4 +- .../architectureexample/ContactsInteractor.kt | 2 +- docs/architectureexample/ContactsStore.kt | 6 +-- docs/architectureexample/ContactsView.kt | 2 +- .../detektrules/CustomRulesetProvider.kt | 4 +- .../MozillaCorrectUnitTestRunner.kt | 6 +-- .../perf/MozillaBannedPropertyAccess.kt | 4 +- .../perf/MozillaRunBlockingCheck.kt | 6 +-- .../perf/MozillaStrictModeSuppression.kt | 9 ++-- .../perf/MozillaUseLazyMonitored.kt | 6 +-- .../perf/MozillaBannedPropertyAccessTest.kt | 7 ++-- .../perf/MozillaUseLazyMonitoredTest.kt | 26 +++++++----- .../fenix/lintrules/AndroidSrcXmlDetector.kt | 8 ++-- .../fenix/lintrules/ButtonStyleXmlDetector.kt | 8 ++-- .../fenix/lintrules/ContextCompatDetector.kt | 17 ++++---- .../ImageViewAndroidTintXmlDetector.kt | 8 ++-- .../fenix/lintrules/LicenseCommentChecker.kt | 8 ++-- .../fenix/lintrules/LicenseDetector.kt | 9 ++-- .../fenix/lintrules/LintIssueRegistry.kt | 4 +- .../TextViewAndroidSrcXmlDetector.kt | 20 ++++----- .../perf/ConstraintLayoutPerfDetector.kt | 14 +++---- 110 files changed, 260 insertions(+), 272 deletions(-) diff --git a/.editorconfig b/.editorconfig index 005d63ee9..7ea380af1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,9 +1,4 @@ [*.{kt,kts}] -# Disabling rules that were added in the latest versions of ktlint -# tracking here: https://github.com/mozilla-mobile/fenix/issues/4861 - -ktlint_disabled_rules=import-ordering - ij_kotlin_allow_trailing_comma_on_call_site=true ij_kotlin_allow_trailing_comma=true diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 5f306c48a..f0554c1d2 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,5 @@ # .git-blame-ignore-revs -# 26901: Fix issues from ktlint baseline +# For #27667 - Remove import-ordering from the list of disabled ktlint rules (#27680) +463fcd53b8db5a43b0be7bf1a4c4bbe8f2a163e0 +# For #26844: Fix ktlint issues and remove them from baseline. (#26901) ffcef5ff2e3f78b6972dd16551f3f653b7035ccc diff --git a/app/src/androidTest/java/org/mozilla/fenix/components/FxaServer.kt b/app/src/androidTest/java/org/mozilla/fenix/components/FxaServer.kt index f67d862b4..bb0c3b687 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/components/FxaServer.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/components/FxaServer.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.components import android.content.Context -import mozilla.components.service.fxa.ServerConfig.Server import mozilla.components.service.fxa.ServerConfig +import mozilla.components.service.fxa.ServerConfig.Server /** * Utility to configure Firefox Account stage servers. diff --git a/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt index 59c89de0d..700dd438a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/glean/BaselinePingTest.kt @@ -24,8 +24,8 @@ import mozilla.components.service.glean.net.ConceptFetchHttpUploader import mozilla.components.service.glean.testing.GleanTestLocalServer import okhttp3.mockwebserver.RecordedRequest import org.json.JSONObject -import org.junit.Assert.assertTrue import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.BeforeClass import org.junit.Rule @@ -36,9 +36,9 @@ import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.MockWebServerHelper -import java.util.concurrent.TimeUnit import java.io.BufferedReader import java.io.ByteArrayInputStream +import java.util.concurrent.TimeUnit import java.util.zip.GZIPInputStream /** diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/Assert.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/Assert.kt index b960f132b..0fc65f27a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/Assert.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/Assert.kt @@ -5,11 +5,6 @@ package org.mozilla.fenix.helpers import android.graphics.Bitmap - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - import android.graphics.Color import org.junit.Assert.assertEquals diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/MockLocationUpdatesRule.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/MockLocationUpdatesRule.kt index 3e8ca4d87..119803bec 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/MockLocationUpdatesRule.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/MockLocationUpdatesRule.kt @@ -12,9 +12,9 @@ import android.os.SystemClock import android.util.Log import androidx.test.core.app.ApplicationProvider import org.junit.rules.ExternalResource +import org.mozilla.fenix.helpers.TestHelper.mDevice import java.util.Date import kotlin.random.Random -import org.mozilla.fenix.helpers.TestHelper.mDevice private const val mockProviderName = LocationManager.GPS_PROVIDER diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/SearchDispatcher.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/SearchDispatcher.kt index 3efe5025d..5d90a06a4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/SearchDispatcher.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/SearchDispatcher.kt @@ -7,14 +7,14 @@ package org.mozilla.fenix.helpers import android.os.Handler import android.os.Looper import androidx.test.platform.app.InstrumentationRegistry -import java.io.IOException -import java.io.InputStream import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.RecordedRequest import okio.Buffer import okio.source +import java.io.IOException +import java.io.InputStream /** * A [MockWebServer] [Dispatcher] that will return a generic search results page in the body of diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index 3cb04c23d..368cd8244 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -45,8 +45,6 @@ import androidx.test.uiautomator.UiObjectNotFoundException import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until -import java.util.Locale -import java.util.regex.Pattern import junit.framework.AssertionFailedError import mozilla.components.browser.state.search.SearchEngine import mozilla.components.support.ktx.android.content.appName @@ -67,6 +65,8 @@ import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource import org.mozilla.fenix.ui.robots.BrowserRobot import org.mozilla.fenix.utils.IntentUtils import org.mozilla.gecko.util.ThreadUtils +import java.util.Locale +import java.util.regex.Pattern object TestHelper { diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/matchers/BitmapDrawableMatcher.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/matchers/BitmapDrawableMatcher.kt index e1da90152..7e0c3bfc1 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/matchers/BitmapDrawableMatcher.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/matchers/BitmapDrawableMatcher.kt @@ -5,13 +5,13 @@ package org.mozilla.fenix.helpers.matchers import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.StateListDrawable import android.view.View import android.widget.ImageView import androidx.test.espresso.matcher.BoundedMatcher import org.hamcrest.Description -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.StateListDrawable -import android.graphics.drawable.Drawable class BitmapDrawableMatcher(private val bitmap: Bitmap, private val name: String) : BoundedMatcher(ImageView::class.java) { diff --git a/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt index 9a359314c..609c57650 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/screenshots/DefaultHomeScreenTest.kt @@ -14,8 +14,8 @@ import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test -import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.ui.robots.homeScreen import tools.fastlane.screengrab.Screengrab diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeveloperToolsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeveloperToolsTest.kt index 40dc48854..b9d978c6b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeveloperToolsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsDeveloperToolsTest.kt @@ -7,10 +7,10 @@ package org.mozilla.fenix.ui import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer -import org.junit.Rule -import org.junit.Before import org.junit.After +import org.junit.Before import org.junit.Ignore +import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index d1de65624..bedae77e2 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -16,8 +16,8 @@ import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.appContext -import org.mozilla.fenix.helpers.TestHelper.setTextToClipBoard import org.mozilla.fenix.helpers.TestHelper.exitMenu +import org.mozilla.fenix.helpers.TestHelper.setTextToClipBoard import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.util.ARABIC_LANGUAGE_HEADER diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSyncTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSyncTest.kt index 24eb93c80..bc479ea60 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSyncTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSyncTest.kt @@ -7,10 +7,10 @@ package org.mozilla.fenix.ui import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer -import org.junit.Rule -import org.junit.Before import org.junit.After +import org.junit.Before import org.junit.Ignore +import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsTest.kt index bf2b1224f..facbc22ca 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsTest.kt @@ -7,10 +7,10 @@ package org.mozilla.fenix.ui import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer -import org.junit.Rule -import org.junit.Before import org.junit.After +import org.junit.Before import org.junit.Ignore +import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/DownloadRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/DownloadRobot.kt index fc33ffd7a..52f87e576 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/DownloadRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/DownloadRobot.kt @@ -28,8 +28,8 @@ import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.assertExternalAppOpens -import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt index 942a7f44a..02277d6c3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt @@ -9,22 +9,22 @@ import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withParent -import androidx.test.espresso.matcher.ViewMatchers.withChild +import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until -import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime -import org.mozilla.fenix.helpers.click -import org.mozilla.fenix.helpers.ext.waitNotNull import org.hamcrest.Matchers.allOf +import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName +import org.mozilla.fenix.helpers.click +import org.mozilla.fenix.helpers.ext.waitNotNull /* * Implementation of Robot Pattern for the multiple selection toolbar of History and Bookmarks menus. diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt index 0efe1131d..5466ec1bb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NotificationRobot.kt @@ -13,12 +13,12 @@ import androidx.test.uiautomator.Until import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.appName import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.ext.waitNotNull import java.lang.AssertionError -import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort class NotificationRobot { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt index b64e4ad31..22d31aec8 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuSitePermissionsCommonRobot.kt @@ -17,9 +17,9 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime -import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.getStringResource +import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.assertIsChecked import org.mozilla.fenix.helpers.click diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 38353ba59..a8e47bd95 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -77,9 +77,9 @@ import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.containsQueryParameters import org.mozilla.fenix.ext.getCustomGleanServerUrlIfAvailable -import org.mozilla.fenix.ext.setCustomEndpointIfAvailable import org.mozilla.fenix.ext.isCustomEngine import org.mozilla.fenix.ext.isKnownSearchDomain +import org.mozilla.fenix.ext.setCustomEndpointIfAvailable import org.mozilla.fenix.ext.settings import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.MarkersActivityLifecycleCallbacks diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonPopupBaseFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonPopupBaseFragment.kt index 8fbd32ab4..ccee01685 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonPopupBaseFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonPopupBaseFragment.kt @@ -10,10 +10,10 @@ import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.action.CustomTabListAction -import mozilla.components.browser.state.state.createCustomTab import mozilla.components.browser.state.state.CustomTabSessionState import mozilla.components.browser.state.state.EngineState import mozilla.components.browser.state.state.SessionState +import mozilla.components.browser.state.state.createCustomTab import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.prompt.PromptRequest import mozilla.components.concept.engine.window.WindowRequest 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 e5aba2621..bbef7bec9 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -35,9 +35,9 @@ import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.databinding.FragmentAddOnsManagementBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getRootView +import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.theme.ThemeManager import java.lang.ref.WeakReference import java.util.concurrent.CancellationException diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index afe8376d6..f28c451af 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -54,6 +54,7 @@ import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.thumbnails.BrowserThumbnails +import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.accounts.FxaCapability import mozilla.components.feature.accounts.FxaWebChannelFeature @@ -68,31 +69,38 @@ import mozilla.components.feature.media.fullscreen.MediaSessionFullscreenFeature import mozilla.components.feature.privatemode.feature.SecureWindowFeature import mozilla.components.feature.prompts.PromptFeature import mozilla.components.feature.prompts.PromptFeature.Companion.PIN_REQUEST +import mozilla.components.feature.prompts.address.AddressDelegate +import mozilla.components.feature.prompts.creditcard.CreditCardDelegate +import mozilla.components.feature.prompts.login.LoginDelegate import mozilla.components.feature.prompts.share.ShareDelegate import mozilla.components.feature.readerview.ReaderViewFeature import mozilla.components.feature.search.SearchFeature import mozilla.components.feature.session.FullScreenFeature import mozilla.components.feature.session.PictureInPictureFeature +import mozilla.components.feature.session.ScreenOrientationFeature import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SwipeRefreshFeature -import mozilla.components.concept.engine.permission.SitePermissions -import mozilla.components.feature.prompts.address.AddressDelegate -import mozilla.components.feature.prompts.creditcard.CreditCardDelegate -import mozilla.components.feature.prompts.login.LoginDelegate -import mozilla.components.feature.session.ScreenOrientationFeature +import mozilla.components.feature.session.behavior.EngineViewBrowserToolbarBehavior import mozilla.components.feature.sitepermissions.SitePermissionsFeature +import mozilla.components.feature.webauthn.WebAuthnFeature import mozilla.components.lib.state.ext.consumeFlow import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.service.glean.private.NoExtras +import mozilla.components.service.sync.autofill.DefaultCreditCardValidationDelegate import mozilla.components.service.sync.logins.DefaultLoginValidationDelegate +import mozilla.components.support.base.feature.ActivityResultHandler import mozilla.components.support.base.feature.PermissionsFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.support.ktx.android.view.enterToImmersiveMode import mozilla.components.support.ktx.android.view.exitImmersiveMode import mozilla.components.support.ktx.android.view.hideKeyboard +import mozilla.components.support.ktx.kotlin.getOrigin import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.FeatureFlags +import org.mozilla.fenix.GleanMetrics.MediaState import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.NavGraphDirections @@ -109,6 +117,10 @@ import org.mozilla.fenix.components.toolbar.BrowserToolbarView import org.mozilla.fenix.components.toolbar.DefaultBrowserToolbarController import org.mozilla.fenix.components.toolbar.DefaultBrowserToolbarMenuController import org.mozilla.fenix.components.toolbar.ToolbarIntegration +import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor +import org.mozilla.fenix.components.toolbar.interactor.DefaultBrowserToolbarInteractor +import org.mozilla.fenix.crashes.CrashContentIntegration +import org.mozilla.fenix.databinding.FragmentBrowserBinding import org.mozilla.fenix.downloads.DownloadService import org.mozilla.fenix.downloads.DynamicDownloadDialog import org.mozilla.fenix.ext.accessibilityManager @@ -118,31 +130,19 @@ import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.hideToolbar import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents -import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.runIfFragmentIsAttached +import org.mozilla.fenix.ext.secure +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.SharedViewModel import org.mozilla.fenix.onboarding.FenixOnboarding +import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.biometric.BiometricPromptFeature import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.utils.allowUndo import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration import java.lang.ref.WeakReference -import mozilla.components.feature.session.behavior.EngineViewBrowserToolbarBehavior -import mozilla.components.feature.webauthn.WebAuthnFeature -import mozilla.components.service.glean.private.NoExtras -import mozilla.components.service.sync.autofill.DefaultCreditCardValidationDelegate -import mozilla.components.support.base.feature.ActivityResultHandler -import mozilla.components.support.ktx.android.view.enterToImmersiveMode -import mozilla.components.support.ktx.kotlin.getOrigin -import org.mozilla.fenix.GleanMetrics.MediaState -import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor -import org.mozilla.fenix.components.toolbar.interactor.DefaultBrowserToolbarInteractor -import org.mozilla.fenix.crashes.CrashContentIntegration -import org.mozilla.fenix.databinding.FragmentBrowserBinding -import org.mozilla.fenix.ext.secure -import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks -import org.mozilla.fenix.settings.biometric.BiometricPromptFeature import mozilla.components.feature.session.behavior.ToolbarPosition as MozacToolbarPosition /** diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt index e619965cc..63b98c17c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -10,10 +10,10 @@ import android.content.Context import android.content.Intent import android.os.Build import mozilla.components.lib.crash.CrashReporter +import mozilla.components.lib.crash.sentry.SentryService import mozilla.components.lib.crash.service.CrashReporterService import mozilla.components.lib.crash.service.GleanCrashReporterService import mozilla.components.lib.crash.service.MozillaSocorroService -import mozilla.components.lib.crash.sentry.SentryService import mozilla.components.service.nimbus.NimbusApi import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config @@ -27,8 +27,8 @@ import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.experiments.createNimbus import org.mozilla.fenix.ext.settings import org.mozilla.fenix.gleanplumb.CustomAttributeProvider -import org.mozilla.fenix.gleanplumb.OnDiskMessageMetadataStorage import org.mozilla.fenix.gleanplumb.NimbusMessagingStorage +import org.mozilla.fenix.gleanplumb.OnDiskMessageMetadataStorage import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.geckoview.BuildConfig.MOZ_APP_BUILDID diff --git a/app/src/main/java/org/mozilla/fenix/components/Push.kt b/app/src/main/java/org/mozilla/fenix/components/Push.kt index cc7a925ee..f99ef999c 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Push.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Push.kt @@ -7,8 +7,8 @@ package org.mozilla.fenix.components import android.content.Context import androidx.core.net.toUri import mozilla.components.feature.push.AutoPushFeature -import mozilla.components.feature.push.PushConfig import mozilla.components.feature.push.Protocol +import mozilla.components.feature.push.PushConfig import mozilla.components.lib.crash.CrashReporter import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.R diff --git a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt index bd82d6335..33e8704ad 100644 --- a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt @@ -10,8 +10,8 @@ import com.google.android.play.core.review.ReviewInfo import com.google.android.play.core.review.ReviewManager import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.withContext -import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.GleanMetrics.ReviewPrompt +import org.mozilla.fenix.utils.Settings import java.text.SimpleDateFormat import java.util.Date import java.util.Locale diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt index aa87697b6..4db4c26e0 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt @@ -11,17 +11,17 @@ import mozilla.components.lib.state.Action import mozilla.components.service.pocket.PocketStory import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory import org.mozilla.fenix.components.AppStore +import org.mozilla.fenix.gleanplumb.Message +import org.mozilla.fenix.gleanplumb.MessagingState import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesSelectedCategory import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem import org.mozilla.fenix.library.history.PendingDeletionHistory -import org.mozilla.fenix.gleanplumb.Message -import org.mozilla.fenix.gleanplumb.MessagingState -import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.wallpapers.Wallpaper /** diff --git a/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt b/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt index c24e61716..424e3c654 100644 --- a/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt +++ b/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt @@ -12,6 +12,7 @@ import mozilla.components.lib.state.State import mozilla.components.service.pocket.PocketStory import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory +import org.mozilla.fenix.gleanplumb.MessagingState import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory @@ -21,7 +22,6 @@ import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem import org.mozilla.fenix.library.history.PendingDeletionHistory -import org.mozilla.fenix.gleanplumb.MessagingState import org.mozilla.fenix.wallpapers.WallpaperState /** diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt index 4921f7dca..d5590efe7 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -36,10 +36,10 @@ import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.GleanMetrics.Addons import org.mozilla.fenix.GleanMetrics.Addresses -import org.mozilla.fenix.GleanMetrics.ContextMenu import org.mozilla.fenix.GleanMetrics.AndroidAutofill import org.mozilla.fenix.GleanMetrics.Awesomebar import org.mozilla.fenix.GleanMetrics.BrowserSearch +import org.mozilla.fenix.GleanMetrics.ContextMenu import org.mozilla.fenix.GleanMetrics.ContextualMenu import org.mozilla.fenix.GleanMetrics.CreditCards import org.mozilla.fenix.GleanMetrics.LoginDialog diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt index 3820a7aae..07a9b46d8 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt @@ -14,13 +14,13 @@ import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.concept.engine.manifest.WebAppManifestParser import mozilla.components.concept.engine.manifest.getOrNull +import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.feature.contextmenu.ContextMenuCandidate import mozilla.components.feature.customtabs.CustomTabWindowFeature import mozilla.components.feature.pwa.feature.ManifestUpdateFeature import mozilla.components.feature.pwa.feature.WebAppActivityFeature import mozilla.components.feature.pwa.feature.WebAppHideToolbarFeature import mozilla.components.feature.pwa.feature.WebAppSiteControlsFeature -import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.android.arch.lifecycle.addObservers diff --git a/app/src/main/java/org/mozilla/fenix/ext/Activity.kt b/app/src/main/java/org/mozilla/fenix/ext/Activity.kt index 17af5619f..00e2004f3 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Activity.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Activity.kt @@ -5,16 +5,16 @@ package org.mozilla.fenix.ext import android.app.Activity -import android.view.View -import android.view.WindowManager -import mozilla.components.concept.base.crash.Breadcrumb import android.app.role.RoleManager import android.content.Intent import android.os.Build import android.provider.Settings +import android.view.View +import android.view.WindowManager import androidx.annotation.DrawableRes import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf +import mozilla.components.concept.base.crash.Breadcrumb import mozilla.components.concept.engine.EngineSession import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity diff --git a/app/src/main/java/org/mozilla/fenix/gleanplumb/CustomAttributeProvider.kt b/app/src/main/java/org/mozilla/fenix/gleanplumb/CustomAttributeProvider.kt index c0a3d697d..d86824032 100644 --- a/app/src/main/java/org/mozilla/fenix/gleanplumb/CustomAttributeProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/gleanplumb/CustomAttributeProvider.kt @@ -9,8 +9,8 @@ import org.json.JSONObject import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.BrowsersCache import java.text.SimpleDateFormat -import java.util.Locale import java.util.Calendar +import java.util.Locale /** * Custom attributes that the messaging framework will use to evaluate if message is eligible diff --git a/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt b/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt index f698d24f5..06dc2348a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcessor.kt @@ -9,9 +9,9 @@ import android.util.Log import androidx.navigation.NavController import mozilla.components.lib.crash.Crash import mozilla.components.lib.crash.Crash.NativeCodeCrash +import mozilla.components.lib.crash.CrashReporter import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction -import mozilla.components.lib.crash.CrashReporter /** * Process the [Intent] from [CrashReporter] through which the app is informed about diff --git a/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt b/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt index 1756bdd0e..34d976c60 100644 --- a/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/LibraryPageFragment.kt @@ -6,8 +6,8 @@ package org.mozilla.fenix.library import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment -import mozilla.components.support.ktx.android.content.getColorFromAttr import androidx.navigation.fragment.findNavController +import mozilla.components.support.ktx.android.content.getColorFromAttr import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt index e071ae6f4..265aaa981 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/viewholders/BookmarkNodeViewHolder.kt @@ -12,11 +12,11 @@ import kotlinx.coroutines.launch import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.mozilla.fenix.R -import org.mozilla.fenix.ext.removeAndDisable -import org.mozilla.fenix.ext.hideAndDisable -import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.loadIntoView +import org.mozilla.fenix.ext.removeAndDisable +import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt index 8509c67af..c924b1325 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt @@ -19,8 +19,8 @@ import androidx.lifecycle.Lifecycle import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.MainScope -import mozilla.components.browser.state.state.BrowserState import kotlinx.coroutines.launch +import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.feature.downloads.AbstractFetchDownloadService import mozilla.components.lib.state.ext.consumeFrom @@ -32,10 +32,10 @@ import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.databinding.FragmentDownloadsBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.filterNotExistsOnDisk +import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.setTextColor import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.library.LibraryPageFragment import org.mozilla.fenix.utils.allowUndo diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt index 90e50f58a..789af3948 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt @@ -10,14 +10,14 @@ import mozilla.components.feature.downloads.toMegabyteOrKilobyteString import org.mozilla.fenix.R import org.mozilla.fenix.databinding.DownloadListItemBinding import org.mozilla.fenix.databinding.LibrarySiteItemBinding -import org.mozilla.fenix.selection.SelectionHolder -import org.mozilla.fenix.library.downloads.DownloadInteractor -import org.mozilla.fenix.library.downloads.DownloadItem import org.mozilla.fenix.ext.getIcon import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.library.downloads.DownloadFragmentState +import org.mozilla.fenix.library.downloads.DownloadInteractor +import org.mozilla.fenix.library.downloads.DownloadItem import org.mozilla.fenix.library.downloads.DownloadItemMenu +import org.mozilla.fenix.selection.SelectionHolder class DownloadsListItemViewHolder( view: View, diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryAdapter.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryAdapter.kt index bce5da93c..39f3f6a17 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryAdapter.kt @@ -8,8 +8,8 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil -import org.mozilla.fenix.selection.SelectionHolder import org.mozilla.fenix.library.history.viewholders.HistoryListItemViewHolder +import org.mozilla.fenix.selection.SelectionHolder /** * Adapter for the list of visited pages, that uses Paging 3 versions of the Paging library. diff --git a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt index 637df1314..2d61d1cae 100644 --- a/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt @@ -33,12 +33,12 @@ import org.mozilla.fenix.addons.showSnackBar import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.databinding.FragmentHistoryMetadataGroupBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.setTextColor import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.toShortUrl import org.mozilla.fenix.library.LibraryPageFragment import org.mozilla.fenix.library.history.History diff --git a/app/src/main/java/org/mozilla/fenix/library/historymetadata/controller/HistoryMetadataGroupController.kt b/app/src/main/java/org/mozilla/fenix/library/historymetadata/controller/HistoryMetadataGroupController.kt index 17a757e4c..0351c199a 100644 --- a/app/src/main/java/org/mozilla/fenix/library/historymetadata/controller/HistoryMetadataGroupController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/historymetadata/controller/HistoryMetadataGroupController.kt @@ -14,11 +14,11 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.storage.sync.PlacesHistoryStorage import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.tabs.TabsUseCases +import mozilla.components.service.glean.private.NoExtras import org.mozilla.fenix.R import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.ext.components -import mozilla.components.service.glean.private.NoExtras import org.mozilla.fenix.library.history.History import org.mozilla.fenix.library.history.toPendingDeletionHistory import org.mozilla.fenix.library.historymetadata.HistoryMetadataGroupFragment.DeleteAllConfirmationDialogFragment diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/DefaultBrowserNotificationWorker.kt b/app/src/main/java/org/mozilla/fenix/onboarding/DefaultBrowserNotificationWorker.kt index 8b1d8cc9a..05f693454 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/DefaultBrowserNotificationWorker.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/DefaultBrowserNotificationWorker.kt @@ -19,13 +19,13 @@ import androidx.work.OneTimeWorkRequest import androidx.work.WorkManager import androidx.work.Worker import androidx.work.WorkerParameters -import java.util.concurrent.TimeUnit import mozilla.components.support.base.ids.SharedIdsHelper import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.IntentUtils import org.mozilla.fenix.utils.Settings +import java.util.concurrent.TimeUnit class DefaultBrowserNotificationWorker( context: Context, diff --git a/app/src/main/java/org/mozilla/fenix/perf/ProfilerReusableComposable.kt b/app/src/main/java/org/mozilla/fenix/perf/ProfilerReusableComposable.kt index 3a2ec0b1b..c62d5b21e 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/ProfilerReusableComposable.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/ProfilerReusableComposable.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding - import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card import androidx.compose.material.CircularProgressIndicator diff --git a/app/src/main/java/org/mozilla/fenix/perf/ProfilerStartDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/perf/ProfilerStartDialogFragment.kt index b54558bd4..686a78362 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/ProfilerStartDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/ProfilerStartDialogFragment.kt @@ -37,7 +37,6 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.launch - import mozilla.components.concept.base.profiler.Profiler import org.mozilla.fenix.R import org.mozilla.fenix.ext.components diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index a0ebfa39d..efb867854 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -49,9 +49,9 @@ import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.navigateToNotificationsSettings +import org.mozilla.fenix.ext.openSetDefaultBrowserOption import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.ext.openSetDefaultBrowserOption import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.ProfilerViewModel diff --git a/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt index 1dbde6eab..615c53b9a 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt @@ -9,11 +9,11 @@ import androidx.preference.EditTextPreference import androidx.preference.Preference import androidx.preference.Preference.OnPreferenceClickListener import androidx.preference.PreferenceFragmentCompat -import kotlin.system.exitProcess import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.R import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar +import kotlin.system.exitProcess /** * Lets the user customize Private browsing options. diff --git a/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt index 58db2a041..5beb96143 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TextPercentageSeekBarPreference.kt @@ -37,7 +37,6 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCom import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import org.mozilla.fenix.R - import java.text.NumberFormat import kotlin.math.PI import kotlin.math.abs diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt index 714e437ff..35757878b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/SignOutFragment.kt @@ -10,11 +10,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import com.google.android.material.bottomsheet.BottomSheetDialog +import androidx.appcompat.app.AppCompatDialogFragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.bottomsheet.BottomSheetBehavior -import androidx.appcompat.app.AppCompatDialogFragment +import com.google.android.material.bottomsheet.BottomSheetDialog import kotlinx.coroutines.launch import mozilla.components.service.fxa.manager.FxaAccountManager import org.mozilla.fenix.R diff --git a/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt b/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt index aa838a446..517e73f2d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/address/view/AddressEditorView.kt @@ -8,11 +8,11 @@ import android.content.Context import android.content.DialogInterface import android.view.View import android.widget.AdapterView +import android.widget.ArrayAdapter import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible -import mozilla.components.concept.storage.Address -import android.widget.ArrayAdapter import mozilla.components.browser.state.search.RegionState +import mozilla.components.concept.storage.Address import mozilla.components.concept.storage.UpdatableAddressFields import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.showKeyboard diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/controller/SavedLoginsStorageController.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/controller/SavedLoginsStorageController.kt index 21e308df3..6d86cb978 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/controller/SavedLoginsStorageController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/controller/SavedLoginsStorageController.kt @@ -23,8 +23,8 @@ import mozilla.components.service.sync.logins.SyncableLoginsStorage import org.mozilla.fenix.R import org.mozilla.fenix.settings.logins.LoginsAction import org.mozilla.fenix.settings.logins.LoginsFragmentStore -import org.mozilla.fenix.settings.logins.fragment.EditLoginFragmentDirections import org.mozilla.fenix.settings.logins.fragment.AddLoginFragmentDirections +import org.mozilla.fenix.settings.logins.fragment.EditLoginFragmentDirections import org.mozilla.fenix.settings.logins.mapToSavedLogin /** diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt index 3e091413b..90c33b1ba 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt @@ -19,12 +19,12 @@ import org.mozilla.fenix.databinding.QuicksettingsPermissionsBinding import org.mozilla.fenix.settings.PhoneFeature import org.mozilla.fenix.settings.PhoneFeature.AUTOPLAY import org.mozilla.fenix.settings.PhoneFeature.CAMERA -import org.mozilla.fenix.settings.PhoneFeature.MICROPHONE +import org.mozilla.fenix.settings.PhoneFeature.CROSS_ORIGIN_STORAGE_ACCESS import org.mozilla.fenix.settings.PhoneFeature.LOCATION +import org.mozilla.fenix.settings.PhoneFeature.MEDIA_KEY_SYSTEM_ACCESS +import org.mozilla.fenix.settings.PhoneFeature.MICROPHONE import org.mozilla.fenix.settings.PhoneFeature.NOTIFICATION import org.mozilla.fenix.settings.PhoneFeature.PERSISTENT_STORAGE -import org.mozilla.fenix.settings.PhoneFeature.MEDIA_KEY_SYSTEM_ACCESS -import org.mozilla.fenix.settings.PhoneFeature.CROSS_ORIGIN_STORAGE_ACCESS import org.mozilla.fenix.settings.quicksettings.WebsitePermissionsView.PermissionViewHolder.SpinnerPermission import org.mozilla.fenix.settings.quicksettings.WebsitePermissionsView.PermissionViewHolder.ToggleablePermission import java.util.EnumMap diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index 3659adcc1..c55705e2e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -25,14 +25,14 @@ import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.settings.PhoneFeature +import org.mozilla.fenix.settings.PhoneFeature.AUTOPLAY import org.mozilla.fenix.settings.PhoneFeature.CAMERA +import org.mozilla.fenix.settings.PhoneFeature.CROSS_ORIGIN_STORAGE_ACCESS import org.mozilla.fenix.settings.PhoneFeature.LOCATION +import org.mozilla.fenix.settings.PhoneFeature.MEDIA_KEY_SYSTEM_ACCESS import org.mozilla.fenix.settings.PhoneFeature.MICROPHONE import org.mozilla.fenix.settings.PhoneFeature.NOTIFICATION import org.mozilla.fenix.settings.PhoneFeature.PERSISTENT_STORAGE -import org.mozilla.fenix.settings.PhoneFeature.MEDIA_KEY_SYSTEM_ACCESS -import org.mozilla.fenix.settings.PhoneFeature.AUTOPLAY -import org.mozilla.fenix.settings.PhoneFeature.CROSS_ORIGIN_STORAGE_ACCESS import org.mozilla.fenix.settings.quicksettings.AutoplayValue import org.mozilla.fenix.settings.requirePreference import org.mozilla.fenix.utils.Settings diff --git a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt index 72cd1ff08..f905aac24 100644 --- a/app/src/main/java/org/mozilla/fenix/share/ShareController.kt +++ b/app/src/main/java/org/mozilla/fenix/share/ShareController.kt @@ -20,10 +20,10 @@ import androidx.navigation.NavController import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.sync.Device diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/NavigationInteractor.kt b/app/src/main/java/org/mozilla/fenix/tabstray/NavigationInteractor.kt index b75e64338..51538d9c0 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/NavigationInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/NavigationInteractor.kt @@ -12,7 +12,6 @@ import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.store.BrowserStore -import mozilla.components.browser.storage.sync.Tab as SyncTab import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.service.glean.private.NoExtras @@ -29,6 +28,7 @@ import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.tabstray.ext.getTabSessionState import org.mozilla.fenix.tabstray.ext.isActiveDownload import kotlin.coroutines.CoroutineContext +import mozilla.components.browser.storage.sync.Tab as SyncTab /** * An interactor that helps with navigating to different parts of the app from the tabs tray. diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index e7846bb29..2730893f8 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -63,8 +63,8 @@ import org.mozilla.fenix.tabstray.ext.bookmarkMessage import org.mozilla.fenix.tabstray.ext.collectionMessage import org.mozilla.fenix.tabstray.ext.make import org.mozilla.fenix.tabstray.ext.showWithTheme -import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsIntegration +import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.utils.allowUndo import kotlin.math.max diff --git a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInfoBannerBinding.kt b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInfoBannerBinding.kt index b9325ea6d..5e181c530 100644 --- a/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInfoBannerBinding.kt +++ b/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInfoBannerBinding.kt @@ -8,7 +8,6 @@ import android.content.Context import android.view.View.VISIBLE import android.view.ViewGroup import androidx.annotation.VisibleForTesting -import kotlin.math.max import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect @@ -22,6 +21,7 @@ import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.R import org.mozilla.fenix.browser.infobanner.InfoBanner import org.mozilla.fenix.utils.Settings +import kotlin.math.max @OptIn(ExperimentalCoroutinesApi::class) class TabsTrayInfoBannerBinding( diff --git a/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt b/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt index 83d20509f..839916483 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/ToolbarPopupWindow.kt @@ -14,17 +14,17 @@ import android.widget.PopupWindow import androidx.annotation.VisibleForTesting import androidx.core.view.isVisible import com.google.android.material.snackbar.Snackbar +import mozilla.components.browser.state.selector.findCustomTab import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.store.BrowserStore -import org.mozilla.fenix.R -import org.mozilla.fenix.components.FenixSnackbar -import org.mozilla.fenix.ext.components -import java.lang.ref.WeakReference -import mozilla.components.browser.state.selector.findCustomTab import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.R +import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.databinding.BrowserToolbarPopupWindowBinding +import org.mozilla.fenix.ext.components +import java.lang.ref.WeakReference object ToolbarPopupWindow { fun show( diff --git a/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt b/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt index 2bfb65eb8..583c38a32 100644 --- a/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/IntentReceiverActivityTest.kt @@ -31,8 +31,8 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.components.IntentProcessorType import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.components.IntentProcessorType import org.mozilla.fenix.components.IntentProcessors import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity import org.mozilla.fenix.ext.components diff --git a/app/src/test/java/org/mozilla/fenix/browser/BaseBrowserFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/browser/BaseBrowserFragmentTest.kt index 4d57f25cd..5961d1d88 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/BaseBrowserFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/BaseBrowserFragmentTest.kt @@ -18,9 +18,9 @@ import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.state.createTab import mozilla.components.concept.engine.EngineView +import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.feature.contextmenu.ContextMenuCandidate import mozilla.components.feature.session.behavior.EngineViewBrowserToolbarBehavior -import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.support.test.robolectric.testContext import mozilla.components.ui.widgets.VerticalSwipeRefreshLayout import org.junit.Before diff --git a/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt b/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt index 475da436c..c37a44dbb 100644 --- a/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/AccountAbnormalitiesTest.kt @@ -8,7 +8,6 @@ import io.mockk.Called import io.mockk.every import io.mockk.mockk import io.mockk.verify -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import kotlinx.coroutines.test.runTest import mozilla.components.lib.crash.CrashReporter import mozilla.components.service.fxa.manager.FxaAccountManager @@ -17,8 +16,9 @@ import org.junit.Assert.assertEquals import org.junit.Assert.fail import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.perf.StrictModeManager +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.perf.TestStrictModeManager +import org.mozilla.fenix.perf.StrictModeManager @RunWith(FenixRobolectricTestRunner::class) class AccountAbnormalitiesTest { diff --git a/app/src/test/java/org/mozilla/fenix/components/InflationAwareFeatureTest.kt b/app/src/test/java/org/mozilla/fenix/components/InflationAwareFeatureTest.kt index 77de3fb72..d7779f20d 100644 --- a/app/src/test/java/org/mozilla/fenix/components/InflationAwareFeatureTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/InflationAwareFeatureTest.kt @@ -9,8 +9,8 @@ import android.view.ViewStub import io.mockk.mockk import io.mockk.spyk import io.mockk.verify -import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.LifecycleAwareFeature +import mozilla.components.support.base.feature.UserInteractionHandler import org.junit.Test import java.lang.ref.WeakReference diff --git a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt index 9b5fc4205..ed89e094d 100644 --- a/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/ReviewPromptControllerTest.kt @@ -13,9 +13,9 @@ import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNull import org.junit.Assert.assertTrue -import org.junit.Test import org.junit.Before import org.junit.Rule +import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.ReviewPrompt import org.mozilla.fenix.HomeActivity diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt index 8dde542c8..3a109be5d 100644 --- a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt @@ -6,10 +6,10 @@ package org.mozilla.fenix.components.metrics import io.mockk.MockKAnnotations import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.verify import io.mockk.verifyAll -import io.mockk.impl.annotations.MockK import mozilla.components.feature.autofill.facts.AutofillFacts import mozilla.components.feature.awesomebar.facts.AwesomeBarFacts import mozilla.components.feature.awesomebar.provider.BookmarksStorageSuggestionProvider diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarCFRPresenterTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarCFRPresenterTest.kt index fd39aed40..75efe6a31 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarCFRPresenterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarCFRPresenterTest.kt @@ -26,6 +26,7 @@ import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.support.test.ext.joinBlocking import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule +import mozilla.telemetry.glean.testing.GleanTestRule import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull @@ -33,13 +34,12 @@ import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test -import org.mozilla.fenix.R -import org.mozilla.fenix.compose.cfr.CFRPopup -import org.mozilla.fenix.utils.Settings -import mozilla.telemetry.glean.testing.GleanTestRule import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.TrackingProtection +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.cfr.CFRPopup import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class BrowserToolbarCFRPresenterTest { diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarViewTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarViewTest.kt index b60b023d5..8ad2f6854 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarViewTest.kt @@ -6,20 +6,19 @@ package org.mozilla.fenix.components.toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import io.mockk.confirmVerified - import io.mockk.every import io.mockk.mockk import io.mockk.spyk import io.mockk.verify -import mozilla.components.support.test.robolectric.testContext -import org.junit.Test -import org.junit.runner.RunWith import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.behavior.BrowserToolbarBehavior import mozilla.components.lib.publicsuffixlist.PublicSuffixList +import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings diff --git a/app/src/test/java/org/mozilla/fenix/crashes/CrashReporterControllerTest.kt b/app/src/test/java/org/mozilla/fenix/crashes/CrashReporterControllerTest.kt index b0b0fb5e8..9b250a21b 100644 --- a/app/src/test/java/org/mozilla/fenix/crashes/CrashReporterControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/crashes/CrashReporterControllerTest.kt @@ -18,7 +18,6 @@ import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.components.appstate.AppState - import org.mozilla.fenix.utils.Settings class CrashReporterControllerTest { diff --git a/app/src/test/java/org/mozilla/fenix/ext/AtomicIntegerTest.kt b/app/src/test/java/org/mozilla/fenix/ext/AtomicIntegerTest.kt index 042211bcc..fc30d9a51 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/AtomicIntegerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/AtomicIntegerTest.kt @@ -4,10 +4,10 @@ package org.mozilla.fenix.ext -import org.junit.Assert.assertEquals import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.junit.Assert.assertEquals import org.junit.Test import java.util.concurrent.atomic.AtomicInteger diff --git a/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt index be093006f..5801bcb6e 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt @@ -5,9 +5,8 @@ package org.mozilla.fenix.ext import mozilla.components.browser.state.state.content.DownloadState -import org.junit.Test - import org.junit.Assert.assertEquals +import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.library.downloads.DownloadItem diff --git a/app/src/test/java/org/mozilla/fenix/ext/ImageButtonTest.kt b/app/src/test/java/org/mozilla/fenix/ext/ImageButtonTest.kt index 71ee9605e..d29f27f9d 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/ImageButtonTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/ImageButtonTest.kt @@ -5,14 +5,14 @@ package org.mozilla.fenix.ext import android.view.View +import android.widget.ImageButton import mozilla.components.support.test.robolectric.testContext -import org.junit.Test +import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue -import org.junit.Assert.assertEquals +import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import android.widget.ImageButton @RunWith(FenixRobolectricTestRunner::class) class ImageButtonTest { diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 7a70c9191..cfd43fd8c 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -51,8 +51,8 @@ import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.HomeScreen import org.mozilla.fenix.GleanMetrics.Pings -import org.mozilla.fenix.GleanMetrics.RecentTabs import org.mozilla.fenix.GleanMetrics.RecentBookmarks +import org.mozilla.fenix.GleanMetrics.RecentTabs import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R diff --git a/app/src/test/java/org/mozilla/fenix/home/PrivateBrowsingButtonViewTest.kt b/app/src/test/java/org/mozilla/fenix/home/PrivateBrowsingButtonViewTest.kt index 431b0c77e..34e0fd0f8 100644 --- a/app/src/test/java/org/mozilla/fenix/home/PrivateBrowsingButtonViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/PrivateBrowsingButtonViewTest.kt @@ -11,9 +11,9 @@ import io.mockk.verify import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test +import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager -import org.mozilla.fenix.R class PrivateBrowsingButtonViewTest { diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingToolbarPositionPickerViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingToolbarPositionPickerViewHolderTest.kt index 612f6e3be..4613000a1 100644 --- a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingToolbarPositionPickerViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingToolbarPositionPickerViewHolderTest.kt @@ -18,9 +18,9 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Onboarding -import org.mozilla.fenix.ext.components import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.databinding.OnboardingToolbarPositionPickerBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt index 14acf5929..80fd47b1c 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt @@ -9,8 +9,8 @@ import io.mockk.spyk import io.mockk.verifyOrder import mozilla.components.concept.storage.BookmarkNode import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt index 9ee32319f..58790ee73 100644 --- a/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/history/HistoryInteractorTest.kt @@ -15,8 +15,8 @@ import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.GleanMetrics.History as GleanHistory import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.GleanMetrics.History as GleanHistory @RunWith(FenixRobolectricTestRunner::class) // For GleanTestRule class HistoryInteractorTest { diff --git a/app/src/test/java/org/mozilla/fenix/library/recentlyclosed/DefaultRecentlyClosedControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/recentlyclosed/DefaultRecentlyClosedControllerTest.kt index 5511fd441..57caa895d 100644 --- a/app/src/test/java/org/mozilla/fenix/library/recentlyclosed/DefaultRecentlyClosedControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/recentlyclosed/DefaultRecentlyClosedControllerTest.kt @@ -6,13 +6,13 @@ package org.mozilla.fenix.library.recentlyclosed import androidx.navigation.NavController import androidx.navigation.NavOptions -import io.mockk.mockk +import io.mockk.Runs import io.mockk.coEvery -import io.mockk.every -import io.mockk.verify import io.mockk.coVerify +import io.mockk.every import io.mockk.just -import io.mockk.Runs +import io.mockk.mockk +import io.mockk.verify import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.test.runCurrent diff --git a/app/src/test/java/org/mozilla/fenix/settings/DropDownListPreferenceTest.kt b/app/src/test/java/org/mozilla/fenix/settings/DropDownListPreferenceTest.kt index 4f6ba52fe..44892cd37 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/DropDownListPreferenceTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/DropDownListPreferenceTest.kt @@ -3,11 +3,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.settings +import androidx.preference.ListPreference import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals - -import androidx.preference.ListPreference import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt index 773278804..6545d11d0 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt @@ -22,9 +22,9 @@ import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.CreditCardNetworkType import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/AutoplayValueTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/AutoplayValueTest.kt index 47f37643b..e76b72e80 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/AutoplayValueTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/AutoplayValueTest.kt @@ -11,12 +11,12 @@ import io.mockk.mockk import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.permission.SitePermissions.AutoplayStatus import mozilla.components.feature.sitepermissions.SitePermissionsRules -import mozilla.components.feature.sitepermissions.SitePermissionsRules.AutoplayAction import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action +import mozilla.components.feature.sitepermissions.SitePermissionsRules.AutoplayAction import mozilla.components.support.test.robolectric.testContext -import org.junit.Assert.assertTrue -import org.junit.Assert.assertFalse import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt index 50c3c7226..48f5b4a39 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt @@ -8,15 +8,15 @@ import android.widget.FrameLayout import android.widget.TextView import androidx.appcompat.widget.AppCompatSpinner import androidx.core.view.isVisible -import io.mockk.every -import io.mockk.spyk import io.mockk.MockKAnnotations -import io.mockk.verify +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.spyk +import io.mockk.verify +import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertFalse import junit.framework.TestCase.assertTrue -import junit.framework.TestCase.assertEquals import mozilla.components.support.test.robolectric.testContext import org.junit.Before import org.junit.Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragmentTest.kt index b927594de..a87c09e40 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManageExceptionsPhoneFeatureFragmentTest.kt @@ -8,21 +8,21 @@ import android.view.LayoutInflater import android.view.View import android.widget.RadioButton import androidx.core.view.isVisible +import io.mockk.MockKAnnotations import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.spyk import io.mockk.verify -import io.mockk.MockKAnnotations -import io.mockk.impl.annotations.MockK import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.permission.SitePermissions.AutoplayStatus import mozilla.components.feature.sitepermissions.SitePermissionsRules -import mozilla.components.feature.sitepermissions.SitePermissionsRules.AutoplayAction import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action +import mozilla.components.feature.sitepermissions.SitePermissionsRules.AutoplayAction import mozilla.components.support.test.robolectric.testContext -import org.junit.Assert.assertTrue -import org.junit.Assert.assertFalse import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsWifiIntegrationTest.kt b/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsWifiIntegrationTest.kt index f19ad72cd..976b6caff 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsWifiIntegrationTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsWifiIntegrationTest.kt @@ -5,8 +5,8 @@ package org.mozilla.fenix.settings.sitepermissions import io.mockk.every -import io.mockk.verify import io.mockk.mockk +import io.mockk.verify import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ALLOWED import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.BLOCKED import org.junit.Before diff --git a/app/src/test/java/org/mozilla/fenix/share/listadapters/AccountDevicesShareAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/share/listadapters/AccountDevicesShareAdapterTest.kt index a82dfe69e..010192c42 100644 --- a/app/src/test/java/org/mozilla/fenix/share/listadapters/AccountDevicesShareAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/listadapters/AccountDevicesShareAdapterTest.kt @@ -15,9 +15,9 @@ import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.share.ShareInteractor import org.mozilla.fenix.share.viewholders.AccountDeviceViewHolder -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @RunWith(FenixRobolectricTestRunner::class) class AccountDevicesShareAdapterTest { diff --git a/app/src/test/java/org/mozilla/fenix/share/listadapters/AppShareAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/share/listadapters/AppShareAdapterTest.kt index 65c25da4c..be765b1bc 100644 --- a/app/src/test/java/org/mozilla/fenix/share/listadapters/AppShareAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/share/listadapters/AppShareAdapterTest.kt @@ -16,9 +16,9 @@ import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.share.ShareInteractor import org.mozilla.fenix.share.viewholders.AppViewHolder -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @RunWith(FenixRobolectricTestRunner::class) class AppShareAdapterTest { diff --git a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt index d5e0fd48c..4df194611 100644 --- a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt @@ -9,10 +9,10 @@ import android.widget.FrameLayout import androidx.appcompat.view.ContextThemeWrapper import io.mockk.MockKAnnotations import io.mockk.every -import io.mockk.verify -import io.mockk.spyk -import io.mockk.mockk import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import io.mockk.spyk +import io.mockk.verify import mozilla.components.browser.icons.BrowserIcons import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertFalse diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt index 2bb0d49e8..eae89f88d 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/TabsTrayFragmentTest.kt @@ -35,9 +35,9 @@ import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.robolectric.testContext import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse -import org.junit.Assert.assertSame import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull +import org.junit.Assert.assertSame import org.junit.Before import org.junit.Rule import org.junit.Test diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolderTest.kt index 8d8cfb46d..7b0739579 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/browser/AbstractBrowserTabViewHolderTest.kt @@ -13,25 +13,25 @@ import io.mockk.verify import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.MediaSessionState import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.base.images.ImageLoader -import mozilla.components.support.test.robolectric.testContext -import org.junit.Test -import org.junit.runner.RunWith -import org.mozilla.fenix.R -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import org.mozilla.fenix.selection.SelectionHolder -import org.mozilla.fenix.tabstray.TabsTrayStore -import mozilla.components.browser.state.state.createTab import mozilla.components.concept.engine.mediasession.MediaSession import mozilla.components.lib.publicsuffixlist.PublicSuffixList +import mozilla.components.support.test.robolectric.testContext import mozilla.telemetry.glean.testing.GleanTestRule import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith import org.mozilla.fenix.GleanMetrics.Tab +import org.mozilla.fenix.R import org.mozilla.fenix.ext.components +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.selection.SelectionHolder +import org.mozilla.fenix.tabstray.TabsTrayStore @RunWith(FenixRobolectricTestRunner::class) class AbstractBrowserTabViewHolderTest { diff --git a/app/src/test/java/org/mozilla/fenix/tabstray/browser/BrowserTabsAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/tabstray/browser/BrowserTabsAdapterTest.kt index 08828d571..2ae860877 100644 --- a/app/src/test/java/org/mozilla/fenix/tabstray/browser/BrowserTabsAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabstray/browser/BrowserTabsAdapterTest.kt @@ -10,18 +10,18 @@ import io.mockk.mockk import io.mockk.spyk import io.mockk.verify import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.tabstray.TabsAdapter.Companion.PAYLOAD_DONT_HIGHLIGHT_SELECTED_ITEM import mozilla.components.browser.tabstray.TabsAdapter.Companion.PAYLOAD_HIGHLIGHT_SELECTED_ITEM import mozilla.components.support.test.robolectric.testContext import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.databinding.TabTrayItemBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.selection.SelectionHolder import org.mozilla.fenix.tabstray.TabsTrayStore -import mozilla.components.browser.state.state.createTab -import mozilla.components.browser.state.store.BrowserStore -import org.mozilla.fenix.ext.components @RunWith(FenixRobolectricTestRunner::class) class BrowserTabsAdapterTest { diff --git a/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackerBucketsTest.kt b/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackerBucketsTest.kt index 95b3eec14..916f84fa7 100644 --- a/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackerBucketsTest.kt +++ b/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackerBucketsTest.kt @@ -4,10 +4,10 @@ package org.mozilla.fenix.trackingprotection -import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.TrackingCategory.SCRIPTS_AND_SUB_RESOURCES import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.TrackingCategory.CRYPTOMINING import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.TrackingCategory.FINGERPRINTING import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL +import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.TrackingCategory.SCRIPTS_AND_SUB_RESOURCES import mozilla.components.concept.engine.content.blocking.TrackerLog import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue diff --git a/app/src/test/java/org/mozilla/fenix/utils/BrowsersCacheTest.kt b/app/src/test/java/org/mozilla/fenix/utils/BrowsersCacheTest.kt index 3c7946c69..2691ac356 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/BrowsersCacheTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/BrowsersCacheTest.kt @@ -10,7 +10,6 @@ import android.content.pm.ActivityInfo import android.content.pm.PackageInfo import android.content.pm.ResolveInfo import android.net.Uri -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.Browsers import org.junit.Assert.assertEquals @@ -18,6 +17,7 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.robolectric.Shadows.shadowOf @RunWith(FenixRobolectricTestRunner::class) diff --git a/app/src/test/java/org/mozilla/fenix/wifi/WifiConnectionMonitorTest.kt b/app/src/test/java/org/mozilla/fenix/wifi/WifiConnectionMonitorTest.kt index 3c67a3e08..7ac567d4b 100644 --- a/app/src/test/java/org/mozilla/fenix/wifi/WifiConnectionMonitorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/wifi/WifiConnectionMonitorTest.kt @@ -10,9 +10,9 @@ import io.mockk.mockk import io.mockk.spyk import io.mockk.verify import mozilla.components.support.test.robolectric.testContext -import org.junit.Assert.assertTrue import org.junit.Assert.assertFalse import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/ApkSizeTask.kt b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/ApkSizeTask.kt index 409bdf62f..7086625df 100644 --- a/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/ApkSizeTask.kt +++ b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/ApkSizeTask.kt @@ -11,7 +11,6 @@ import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import java.io.File -import java.io.IOException import java.nio.file.Files import java.nio.file.Paths diff --git a/docs/architectureexample/ContactsController.kt b/docs/architectureexample/ContactsController.kt index cfa4d691e..e9274ce73 100644 --- a/docs/architectureexample/ContactsController.kt +++ b/docs/architectureexample/ContactsController.kt @@ -6,7 +6,7 @@ // /docs/architecture-overview.md class ContactsController( private val store: ContactsStore, - private val navController: NavController + private val navController: NavController, ) { fun contactRenamed(contactId: Int, newName: String) { @@ -17,7 +17,7 @@ class ContactsController( // This is how we pass arguments between fragments using Google's navigation library. // See https://developer.android.com/guide/navigation/navigation-getting-started val directions = ContactsFragment.actionContactsFragmentToChatFragment( - contactId = contactId + contactId = contactId, ) navController.nav(R.id.contactFragment, directions) } diff --git a/docs/architectureexample/ContactsInteractor.kt b/docs/architectureexample/ContactsInteractor.kt index 6f1493a55..02bc65c94 100644 --- a/docs/architectureexample/ContactsInteractor.kt +++ b/docs/architectureexample/ContactsInteractor.kt @@ -6,7 +6,7 @@ // /docs/architecture-overview.md class ContactsInteractor( private val contactsController: ContactsController, - private val themeController: ThemeController + private val themeController: ThemeController, ) { fun onThemeSelected(theme: Theme) { diff --git a/docs/architectureexample/ContactsStore.kt b/docs/architectureexample/ContactsStore.kt index 807ab8fca..7231d7b05 100644 --- a/docs/architectureexample/ContactsStore.kt +++ b/docs/architectureexample/ContactsStore.kt @@ -5,7 +5,7 @@ // This is example code for the 'Simplified Example' section of // /docs/architecture-overview.md class ContactsStore( - private val initialState: ContactsState + private val initialState: ContactsState, ) : Store>(initialState, ::reducer) sealed class ContactsAction { @@ -15,13 +15,13 @@ sealed class ContactsAction { data class ContactsState( val contacts: List, - val theme: Theme + val theme: Theme, ) data class Contact( val name: String, val id: Int, - val imageUrl: Uri + val imageUrl: Uri, ) enum class Theme { diff --git a/docs/architectureexample/ContactsView.kt b/docs/architectureexample/ContactsView.kt index a3af84372..a6a7dc872 100644 --- a/docs/architectureexample/ContactsView.kt +++ b/docs/architectureexample/ContactsView.kt @@ -6,7 +6,7 @@ // /docs/architecture-overview.md class ContactsView( private val container: ViewGroup, - private val interactor: ContactsInteractor + private val interactor: ContactsInteractor, ) { val view: View = LayoutInflater.from(container.context) diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt index 261a92591..c2955fb9c 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/CustomRulesetProvider.kt @@ -8,8 +8,8 @@ import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.RuleSetProvider import org.mozilla.fenix.detektrules.perf.MozillaBannedPropertyAccess -import org.mozilla.fenix.detektrules.perf.MozillaStrictModeSuppression import org.mozilla.fenix.detektrules.perf.MozillaRunBlockingCheck +import org.mozilla.fenix.detektrules.perf.MozillaStrictModeSuppression import org.mozilla.fenix.detektrules.perf.MozillaUseLazyMonitored class CustomRulesetProvider : RuleSetProvider { @@ -23,6 +23,6 @@ class CustomRulesetProvider : RuleSetProvider { MozillaCorrectUnitTestRunner(config), MozillaRunBlockingCheck(config), MozillaUseLazyMonitored(config), - ) + ), ) } diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaCorrectUnitTestRunner.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaCorrectUnitTestRunner.kt index 25834076b..89735ae87 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaCorrectUnitTestRunner.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaCorrectUnitTestRunner.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry private val BANNED_TEST_RUNNERS = setOf( // When updating this list, also update the violation message. "AndroidJUnit4", - "RobolectricTestRunner" + "RobolectricTestRunner", ) // There is a change to how we output violations in a different PR so the formatting for message @@ -48,13 +48,13 @@ class MozillaCorrectUnitTestRunner(config: Config) : Rule(config) { MozillaCorrectUnitTestRunner::class.simpleName!!, Severity.Defect, "Verifies we're using the correct Robolectric unit test runner", - Debt.FIVE_MINS + Debt.FIVE_MINS, ) override val filters: PathFilters? get() = PathFilters.of( includes = listOf("**/test/**"), // unit tests only. - excludes = emptyList() + excludes = emptyList(), ) override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) { diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccess.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccess.kt index f8b2055e8..dcd467cf4 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccess.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccess.kt @@ -18,7 +18,7 @@ class MozillaBannedPropertyAccess(config: Config = Config.empty) : Rule(config) "MozillaBannedPropertyAccess", Severity.Defect, DESCR, - Debt.FIVE_MINS + Debt.FIVE_MINS, ) private val banned by lazy { @@ -43,7 +43,7 @@ class MozillaBannedPropertyAccess(config: Config = Config.empty) : Rule(config) CodeSmell( issue, Entity.from(expression), - "Using $possiblyBannedPropertyAccess is not allowed because accessing property $it is against Mozilla policy. See 'mozilla-detekt-rules' stanza in 'config/detekt.yml' for more information.\n" + "Using $possiblyBannedPropertyAccess is not allowed because accessing property $it is against Mozilla policy. See 'mozilla-detekt-rules' stanza in 'config/detekt.yml' for more information.\n", ) }.forEach { report(it) } } diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaRunBlockingCheck.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaRunBlockingCheck.kt index 4b2ffffa9..8ff3f7bb5 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaRunBlockingCheck.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaRunBlockingCheck.kt @@ -8,7 +8,7 @@ import io.gitlab.arturbosch.detekt.api.* import org.jetbrains.kotlin.psi.* private const val VIOLATION_MSG = "Please use `org.mozilla.fenix.perf.runBlockingImplement` instead" + - "because it allows us to monitor the code for performance regressions." + "because it allows us to monitor the code for performance regressions." /** * A check to prevent us from working around mechanisms we implemented in @@ -21,8 +21,8 @@ class MozillaRunBlockingCheck(config: Config) : Rule(config) { "MozillaRunBlockingCheck", Severity.Performance, "Prevents us from working around mechanisms we implemented to count how many " + - "runBlocking are used", - Debt.TWENTY_MINS + "runBlocking are used", + Debt.TWENTY_MINS, ) override fun visitImportDirective(importDirective: KtImportDirective) { diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaStrictModeSuppression.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaStrictModeSuppression.kt index a10d678c1..cc07bcde7 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaStrictModeSuppression.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaStrictModeSuppression.kt @@ -25,7 +25,7 @@ class MozillaStrictModeSuppression(config: Config) : Rule(config) { "MozillaStrictModeSuppression", Severity.Performance, "Prevents us from working around mechanisms we implemented to prevent suppressing StrictMode", - Debt.TEN_MINS + Debt.TEN_MINS, ) override fun visitImportDirective(importDirective: KtImportDirective) { @@ -55,9 +55,10 @@ class MozillaStrictModeSuppression(config: Config) : Rule(config) { if (receiver == "StrictMode") { val violationMsg = when (calledMethod) { "setThreadPolicy" -> VIOLATION_MSG - "setVmPolicy" -> "NOT YET IMPLEMENTED: please consult the perf team about implementing" + - "`StrictModeManager.resetAfter`: we want to understand the performance implications " + - "of suppressing setVmPolicy before allowing it." + "setVmPolicy" -> + "NOT YET IMPLEMENTED: please consult the perf team about implementing" + + "`StrictModeManager.resetAfter`: we want to understand the performance implications " + + "of suppressing setVmPolicy before allowing it." else -> null } diff --git a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt index e700a6388..9239ac2d2 100644 --- a/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt +++ b/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitored.kt @@ -31,12 +31,12 @@ open class MozillaUseLazyMonitored(config: Config) : Rule(config) { this::class.java.simpleName, Severity.Performance, "Prevents use of lazy in component groups files where lazyMonitored should be used instead", - Debt.FIVE_MINS + Debt.FIVE_MINS, ) override val filters = PathFilters.of( includes = COMPONENT_GROUP_FILES.map { "**$it" }, - excludes = emptyList() + excludes = emptyList(), ) override fun visitPropertyDelegate(delegate: KtPropertyDelegate) { @@ -79,7 +79,7 @@ open class MozillaUseLazyMonitored(config: Config) : Rule(config) { "PerformanceComponent", "Push", "Services", - "UseCases" + "UseCases", ).map { "app/src/main/java/org/mozilla/fenix/components/$it.kt" } } } diff --git a/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccessTest.kt b/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccessTest.kt index daa96a8a1..fde95cb59 100644 --- a/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccessTest.kt +++ b/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaBannedPropertyAccessTest.kt @@ -27,14 +27,13 @@ internal class MozillaBannedPropertyAccessTest { @BeforeEach fun setup() { config = yamlConfig("/config.yml") - } @Test internal fun `non compliant property access should warn`() { val findings = MozillaBannedPropertyAccess(config).lint( - NONCOMPLIANT_ACCESS.trimIndent() + NONCOMPLIANT_ACCESS.trimIndent(), ) assertEquals(1, findings.size) assertEquals(DESCR, findings[0].issue.description) @@ -46,7 +45,7 @@ internal class MozillaBannedPropertyAccessTest { internal fun testCompliantWhen(source: String) { val findings = MozillaBannedPropertyAccess(config).lint( - source + source, ) assertTrue(findings.isEmpty()) } @@ -55,7 +54,7 @@ internal class MozillaBannedPropertyAccessTest { @JvmStatic fun compliantProvider(): Stream = Stream.of( - arguments(COMPLIANT_ACCESS, "Safe property access") + arguments(COMPLIANT_ACCESS, "Safe property access"), ) } } diff --git a/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitoredTest.kt b/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitoredTest.kt index 8027403d3..2ed6fb68a 100644 --- a/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitoredTest.kt +++ b/mozilla-detekt-rules/src/test/java/org/mozilla/fenix/detektrules/perf/MozillaUseLazyMonitoredTest.kt @@ -57,21 +57,27 @@ internal class MozillaUseLazyMonitoredTest { assertNoFindings(text) } - @ParameterizedTest @ValueSource(strings = [ - "val example by lazy { 4 }", - "val example by lazy { 4 }", - "val example\nby\nlazy\n{\n4\n}" - ]) + @ParameterizedTest + @ValueSource( + strings = [ + "val example by lazy { 4 }", + "val example by lazy { 4 }", + "val example\nby\nlazy\n{\n4\n}", + ], + ) fun `GIVEN a snippet with by lazy THEN there is a finding`(innerText: String) { val text = getCodeInClass(innerText) assertOneFinding(text) } - @ParameterizedTest @ValueSource(strings = [ - "val example = lazy(::exampleFun)", - "val example = lazy ( ::exampleFun)", - "val example\n=\nlazy\n(\n::exampleFun\n)" - ]) + @ParameterizedTest + @ValueSource( + strings = [ + "val example = lazy(::exampleFun)", + "val example = lazy ( ::exampleFun)", + "val example\n=\nlazy\n(\n::exampleFun\n)", + ], + ) fun `GIVEN a snippet with = lazy THEN there is a finding`(innerText: String) { val text = getCodeInClass(innerText) assertOneFinding(text) diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/AndroidSrcXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/AndroidSrcXmlDetector.kt index 9b9b8eb39..3becda845 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/AndroidSrcXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/AndroidSrcXmlDetector.kt @@ -42,8 +42,8 @@ class AndroidSrcXmlDetector : ResourceXmlDetector() { severity = Severity.ERROR, implementation = Implementation( AndroidSrcXmlDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) } @@ -62,7 +62,7 @@ class AndroidSrcXmlDetector : ResourceXmlDetector() { FULLY_QUALIFIED_APP_COMPAT_IMAGE_BUTTON, FULLY_QUALIFIED_APP_COMPAT_VIEW_CLASS, APP_COMPAT_IMAGE_BUTTON, - APP_COMPAT_IMAGE_VIEW + APP_COMPAT_IMAGE_VIEW, ) } @@ -74,7 +74,7 @@ class AndroidSrcXmlDetector : ResourceXmlDetector() { issue = ISSUE_XML_SRC_USAGE, scope = node, location = context.getLocation(node), - message = ERROR_MESSAGE + message = ERROR_MESSAGE, ) } } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt index 7c05b8bfd..3a1a2006d 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ButtonStyleXmlDetector.kt @@ -32,8 +32,8 @@ class ButtonStyleXmlDetector : ResourceXmlDetector() { severity = Severity.ERROR, implementation = Implementation( ButtonStyleXmlDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) } @@ -47,7 +47,7 @@ class ButtonStyleXmlDetector : ResourceXmlDetector() { return setOf( SdkConstants.FQCN_BUTTON, SdkConstants.MATERIAL_BUTTON, - SdkConstants.BUTTON + SdkConstants.BUTTON, ) } @@ -58,7 +58,7 @@ class ButtonStyleXmlDetector : ResourceXmlDetector() { issue = ISSUE_XML_STYLE, scope = element, location = context.getElementLocation(element), - message = ERROR_MESSAGE + message = ERROR_MESSAGE, ) } } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ContextCompatDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ContextCompatDetector.kt index 481276c0d..6ffdac6d5 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ContextCompatDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ContextCompatDetector.kt @@ -16,7 +16,7 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { private val Implementation = Implementation( ContextCompatDetector::class.java, - Scope.JAVA_FILE_SCOPE + Scope.JAVA_FILE_SCOPE, ) val ISSUE_GET_DRAWABLE_CALL = Issue.create( @@ -25,7 +25,7 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { explanation = "Using this method can lead to crashes in older Android versions as newer features might not be available", category = Category.CORRECTNESS, severity = Severity.ERROR, - implementation = Implementation + implementation = Implementation, ) val ISSUE_GET_COLOR_STATE_LIST_CALL = Issue.create( @@ -34,18 +34,18 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { explanation = "Using this method can lead to crashes in older Android versions as newer features might not be available", category = Category.CORRECTNESS, severity = Severity.ERROR, - implementation = Implementation + implementation = Implementation, ) val ISSUES = listOf( ISSUE_GET_DRAWABLE_CALL, - ISSUE_GET_COLOR_STATE_LIST_CALL + ISSUE_GET_COLOR_STATE_LIST_CALL, ) } override fun getApplicableMethodNames(): List? = listOf( "getDrawable", - "getColorStateList" + "getColorStateList", ) override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) { @@ -65,7 +65,7 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { ISSUE_GET_DRAWABLE_CALL, context.getLocation(node), "This call can lead to crashes, replace with AppCompatResources.getDrawable", - replaceUnsafeGetDrawableQuickFix(node) + replaceUnsafeGetDrawableQuickFix(node), ) private fun reportGetColorStateListCall(context: JavaContext, node: UCallExpression) = @@ -73,7 +73,7 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { ISSUE_GET_COLOR_STATE_LIST_CALL, context.getLocation(node), "This call can lead to crashes, replace with AppCompatResources.getColorStateList", - replaceUnsafeGetColorStateListCallQuickFix(node) + replaceUnsafeGetColorStateListCallQuickFix(node), ) private fun replaceUnsafeGetDrawableQuickFix(node: UCallExpression): LintFix { @@ -99,5 +99,4 @@ class ContextCompatDetector : Detector(), SourceCodeScanner { .with(newText) .build() } - -} \ No newline at end of file +} diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ImageViewAndroidTintXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ImageViewAndroidTintXmlDetector.kt index 6f4e74536..4fdf0ec2f 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ImageViewAndroidTintXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/ImageViewAndroidTintXmlDetector.kt @@ -43,8 +43,8 @@ class ImageViewAndroidTintXmlDetector : ResourceXmlDetector() { severity = Severity.ERROR, implementation = Implementation( ImageViewAndroidTintXmlDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) } @@ -63,7 +63,7 @@ class ImageViewAndroidTintXmlDetector : ResourceXmlDetector() { FULLY_QUALIFIED_APP_COMPAT_IMAGE_BUTTON, FULLY_QUALIFIED_APP_COMPAT_VIEW_CLASS, APP_COMPAT_IMAGE_BUTTON, - APP_COMPAT_IMAGE_VIEW + APP_COMPAT_IMAGE_VIEW, ) } @@ -75,7 +75,7 @@ class ImageViewAndroidTintXmlDetector : ResourceXmlDetector() { issue = ISSUE_XML_SRC_USAGE, scope = node, location = context.getLocation(node), - message = ERROR_MESSAGE + message = ERROR_MESSAGE, ) } } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseCommentChecker.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseCommentChecker.kt index b3511396b..efc4b938d 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseCommentChecker.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseCommentChecker.kt @@ -42,21 +42,21 @@ class LicenseCommentChecker(private val context: JavaContext) : UElementHandler( LicenseDetector.ISSUE_MISSING_LICENSE, context.getLocation(node.sourcePsi.firstChild), "The file must start with a comment containing the license", - addLicenseQuickFix() + addLicenseQuickFix(), ) private fun reportInvalidLicenseFormat(comment: UComment) = context.report( LicenseDetector.ISSUE_INVALID_LICENSE_FORMAT, context.getLocation(comment), "The license comment doesn't have the appropriate format", - replaceCommentWithValidLicenseFix(comment) + replaceCommentWithValidLicenseFix(comment), ) private fun reportMissingLeadingNewLineCharacter(licenseComment: UComment) = context.report( LicenseDetector.ISSUE_INVALID_LICENSE_FORMAT, context.getRangeLocation(licenseComment, licenseComment.text.lastIndex, 1), "The license comment must be followed by a newline character", - addLeadingNewLineQuickFix(licenseComment) + addLeadingNewLineQuickFix(licenseComment), ) private fun addLicenseQuickFix() = LintFix.create() @@ -81,4 +81,4 @@ class LicenseCommentChecker(private val context: JavaContext) : UElementHandler( .with(ValidLicenseForKotlinFiles + "\n") .autoFix() .build() -} \ No newline at end of file +} diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseDetector.kt index 1b6a7cfe3..81c6b6552 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LicenseDetector.kt @@ -15,17 +15,17 @@ class LicenseDetector : Detector(), SourceCodeScanner { private val Implementation = Implementation( LicenseDetector::class.java, - Scope.JAVA_FILE_SCOPE + Scope.JAVA_FILE_SCOPE, ) val ISSUE_MISSING_LICENSE = Issue.create( id = "MissingLicense", briefDescription = "File doesn't start with the license comment", explanation = "Every file must start with the license comment:\n" + - LicenseCommentChecker.ValidLicenseForKotlinFiles, + LicenseCommentChecker.ValidLicenseForKotlinFiles, category = Category.CORRECTNESS, severity = Severity.WARNING, - implementation = Implementation + implementation = Implementation, ) val ISSUE_INVALID_LICENSE_FORMAT = Issue.create( @@ -34,7 +34,7 @@ class LicenseDetector : Detector(), SourceCodeScanner { explanation = "The license must be:\n${LicenseCommentChecker.ValidLicenseForKotlinFiles}", category = Category.CORRECTNESS, severity = Severity.WARNING, - implementation = Implementation + implementation = Implementation, ) } @@ -42,5 +42,4 @@ class LicenseDetector : Detector(), SourceCodeScanner { override fun createUastHandler(context: JavaContext): UElementHandler? = LicenseCommentChecker(context) - } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt index a659a8fd0..7fab85371 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/LintIssueRegistry.kt @@ -21,10 +21,10 @@ class LintIssueRegistry : IssueRegistry() { TextViewAndroidSrcXmlDetector.ISSUE_XML_SRC_USAGE, ImageViewAndroidTintXmlDetector.ISSUE_XML_SRC_USAGE, LicenseDetector.ISSUE_MISSING_LICENSE, - LicenseDetector.ISSUE_INVALID_LICENSE_FORMAT + LicenseDetector.ISSUE_INVALID_LICENSE_FORMAT, ) + ConstraintLayoutPerfDetector.ISSUES + ContextCompatDetector.ISSUES override val vendor: Vendor = Vendor( vendorName = "Mozilla", - identifier = "mozilla-fenix" + identifier = "mozilla-fenix", ) } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt index f6411fe2b..0ec8d690c 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt @@ -40,8 +40,8 @@ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { severity = Severity.ERROR, implementation = Implementation( TextViewAndroidSrcXmlDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) } @@ -54,7 +54,7 @@ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { override fun getApplicableElements(): Collection? { return setOf( FQCN_TEXT_VIEW, - TEXT_VIEW + TEXT_VIEW, ) } @@ -62,27 +62,27 @@ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { val node = when { element.hasAttributeNS(SCHEMA, ATTR_DRAWABLE_BOTTOM) -> element.getAttributeNodeNS( SCHEMA, - ATTR_DRAWABLE_BOTTOM + ATTR_DRAWABLE_BOTTOM, ) element.hasAttributeNS(SCHEMA, ATTR_DRAWABLE_END) -> element.getAttributeNodeNS( SCHEMA, - ATTR_DRAWABLE_END + ATTR_DRAWABLE_END, ) element.hasAttributeNS(SCHEMA, ATTR_DRAWABLE_LEFT) -> element.getAttributeNodeNS( SCHEMA, - ATTR_DRAWABLE_LEFT + ATTR_DRAWABLE_LEFT, ) element.hasAttributeNS( SCHEMA, - ATTR_DRAWABLE_RIGHT + ATTR_DRAWABLE_RIGHT, ) -> element.getAttributeNodeNS(SCHEMA, ATTR_DRAWABLE_RIGHT) element.hasAttributeNS( SCHEMA, - ATTR_DRAWABLE_START + ATTR_DRAWABLE_START, ) -> element.getAttributeNodeNS(SCHEMA, ATTR_DRAWABLE_START) element.hasAttributeNS(SCHEMA, ATTR_DRAWABLE_TOP) -> element.getAttributeNodeNS( SCHEMA, - ATTR_DRAWABLE_TOP + ATTR_DRAWABLE_TOP, ) else -> null } ?: return @@ -91,7 +91,7 @@ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { issue = ISSUE_XML_SRC_USAGE, scope = node, location = context.getLocation(node), - message = ERROR_MESSAGE + message = ERROR_MESSAGE, ) } } diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/perf/ConstraintLayoutPerfDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/perf/ConstraintLayoutPerfDetector.kt index 00cdcc5a1..d7e08b57a 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/perf/ConstraintLayoutPerfDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/perf/ConstraintLayoutPerfDetector.kt @@ -19,7 +19,7 @@ private val FRAMEWORK_ELEMENTS = setOf( "androidx.constraintlayout.widget.ConstraintLayout", // Android framework views that extend ConstraintLayout - "androidx.constraintlayout.motion.widget.MotionLayout" + "androidx.constraintlayout.motion.widget.MotionLayout", ) private val FRAMEWORK_ELEMENTS_BULLETED_LIST = FRAMEWORK_ELEMENTS.map { "- `$it`" }.joinToString("\n") @@ -43,7 +43,7 @@ private val CUSTOM_VIEW_ELEMENTS = setOf( "$AC_PREFIX.feature.findinpage.view.FindInPageBar", "$AC_PREFIX.feature.prompts.login.LoginSelectBar", "$AC_PREFIX.ui.widgets.WidgetSiteItemView", - "$AC_PREFIX.browser.toolbar.display.DisplayToolbarView" + "$AC_PREFIX.browser.toolbar.display.DisplayToolbarView", ) private val CUSTOM_VIEW_ELEMENTS_BULLETED_LIST = CUSTOM_VIEW_ELEMENTS.map { "- `$it`" }.joinToString("\n") @@ -116,8 +116,8 @@ private val FRAMEWORK_ISSUE = Issue.create( severity = Severity.ERROR, implementation = Implementation( ConstraintLayoutPerfDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) /** @@ -133,8 +133,8 @@ private val CUSTOM_VIEW_ISSUE = Issue.create( severity = Severity.WARNING, implementation = Implementation( ConstraintLayoutPerfDetector::class.java, - Scope.RESOURCE_FILE_SCOPE - ) + Scope.RESOURCE_FILE_SCOPE, + ), ) /** @@ -152,7 +152,7 @@ class ConstraintLayoutPerfDetector : ResourceXmlDetector() { companion object { val ISSUES = listOf( FRAMEWORK_ISSUE, - CUSTOM_VIEW_ISSUE + CUSTOM_VIEW_ISSUE, ) } From 61b7815e08994e2185ddb9225515ee11e5f7bd11 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Fri, 4 Nov 2022 01:42:32 +0100 Subject: [PATCH 310/407] Import l10n. (#27701) --- app/src/main/res/values-es-rAR/strings.xml | 65 +++++++------ app/src/main/res/values-hr/strings.xml | 107 ++++++++++++++++++++- app/src/main/res/values-is/strings.xml | 64 ++++++------ app/src/main/res/values-iw/strings.xml | 64 ++++++------ app/src/main/res/values-ko/strings.xml | 65 +++++++------ 5 files changed, 241 insertions(+), 124 deletions(-) diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index f86d87cd2..d735a4fc7 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -15,6 +15,12 @@ Deshabilitar la navegación privada Buscar o ingresar la dirección + + Buscar en historial + + Buscar en marcadores + + Buscar pestañas Ingresar términos de búsqueda @@ -131,13 +137,6 @@ Botón para mostrar todas las pestañas recientes - - La búsqueda de \"%1$s\" - - - %d sitios Ver todas las pestañas sincronizadas @@ -262,6 +261,9 @@ Configuración de búsqueda + + Esta vez buscá: + ¿Qué hay de nuevo en %1$s? @@ -468,8 +470,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitados recientemente - Pocket + Pocket + + Historias que te hacen reflexionar + + Artículos impulsados por %s Historias patrocinadas @@ -492,12 +498,6 @@ No se pudo cambiar el fondo de pantalla Conocer más - - Cambiar el fondo de pantalla tocando el logotipo de la página de inicio de Firefox - - - Logotipo de Firefox - cambiar el fondo de pantalla, botón %s clásico @@ -661,6 +661,17 @@ Cerrar + + ¿Abrir %d pestañas? + + Abrir tantas pestañas puede ralentizar a %s mientras se cargan las páginas. ¿Estás seguro de que querés continuar? + + Abrir pestañas + + Cancelar + %d sitio @@ -690,10 +701,6 @@ Lista Cuadrícula - - Buscar en grupos - - Agrupar sitios relacionados Cerrar pestañas @@ -850,18 +857,6 @@ Aquí no hay historial - - Sincronizados de otros dispositivos - - Desde otros dispositivos - - - Iniciá la sesión para ver el historial sincronizado desde tus otros dispositivos. - - Iniciar la sesión - - O creá una cuenta de Firefox para comenzar a sincronizar]]> - Descargas eliminadas @@ -912,6 +907,10 @@ Abrir en una nueva pestaña Abrir en una pestaña privada + + Abrir todo en pestañas nuevas + + Abrir todo en pestañas privadas Eliminar @@ -1094,6 +1093,8 @@ Compartir Guardar como PDF + + No se pudo generar el PDF Enviar al dispositivo @@ -1962,7 +1963,9 @@ Descubrir más - Desarrollado por Pocket. + Desarrollado por Pocket. + + Impulsado por %s. Parte de la familia de Firefox. %s diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 94136c355..c3694ef0c 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -128,6 +128,8 @@ Pogledaj sve sinkronizirane kartice Sinkronizirani uređaj + + Ukloni Ukloni @@ -263,6 +265,13 @@ Tvoja personalizirana Firefoxova početna stranica sada ti olakšava da nastaviš pretraživati. Pronađi svoje nedavne kartice, zabilješke i rezultate pretraživanja. + + Prijavi se + + Preskoči + + Zatvori + Otvori novu %1$s karticu @@ -432,6 +441,11 @@ Prikaži + + Pokušaj ponovo + + Saznaj više + Dodatak nije podržan @@ -987,6 +1001,8 @@ Dijeli + + Spremi kao PDF Pošalji na uređaj @@ -1001,7 +1017,9 @@ Prijavi se za sinkronizaciju Prijavi se za sinkronizaciju - + + Sinkroniziraj i spremi podatke + Pošalji na sve uređaje Ponovo se poveži za sinkronizaciju @@ -1164,6 +1182,8 @@ Sinkroniziraj Firefox između uređaja Registriraj se + + Prijavi se Sinkronizacija je uključena @@ -1477,6 +1497,11 @@ Izbornik sortiranja prijava + + + Automatsko ispunjavanje + + Adrese Kreditne kartice @@ -1493,6 +1518,11 @@ Upravljaj spremljenim karticama + + Dodaj adresu + + Upravljaj adresama + Dodaj karticu @@ -1511,6 +1541,8 @@ Izbriši karticu Izbriši karticu + + Izbriši Spremi @@ -1542,6 +1574,52 @@ Otključ za korištenje spremljenih podataka o kreditnim karticama + + Dodaj adresu + + Uredi adresu + + Upravljaj adresama + + Ime + + Srednje ime + + Prezime + + Ulica + + Grad + + Država + + Pokrajina + + Poštanski broj + + Zemlja ili regija + + Telefon + + + E-mail adresa + + Spremi + + Odustani + + Izbriši adresu + + Stvano želiš izbrisati ovu adresu? + + Izbriši + + Odustani + + Spremi adresu + + Izbriši adresu + Dodaj tražilicu @@ -1611,6 +1689,10 @@ Bez izuzetih web-stranica Sigurno želiš izbrisati ovu zabilješku? + + Dodaj u prečace + + Ukloni iz prečaca Potvrđuje: %1$s @@ -1622,6 +1704,8 @@ Sigurno izbrisati ovu prijavu? Izbriši + + Odustani Opcije prijave @@ -1682,7 +1766,9 @@ Prečaci Naziv - + + Ime prečaca + U redu Odustani @@ -1700,6 +1786,11 @@ Zatvori sve neaktivne kartice + + Rasklopi neaktivne kartice + + Sklopi neaktivne kartice + Automatski zatvoriti nakon jednog mjeseca? @@ -1740,4 +1831,16 @@ Saznaj više + + Sponzorirano + + + Idi u postavke + Firefox prijedlozi + + + + sklopi + + rasklopi diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 94c44a6ce..2bf6588d3 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -14,6 +14,12 @@ Afvirkja huliðsvöfrun Leitaðu eða sláðu inn vistfang + + Leita í ferli + + Leita í bókamerkjum + + Leita í flipum Settu inn leitarorð @@ -128,12 +134,6 @@ Birta allt Sýna hnapp fyrir alla nýlega flipa - - Leitin þín að \"%1$s\" - - %d vefsvæði Sjá alla samstillta flipa @@ -256,6 +256,9 @@ Leitarstillingar + + Leita núna að: + Hvað er nýtt í %1$s @@ -460,8 +463,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nýlega heimsótt - Pocket + Pocket + + Umhugsunarverðar sögur + + Greinar knúnar með %s Kostaðar sögur @@ -484,12 +491,6 @@ Gat ekki skipt um bakgrunnsmynd Kanna nánar - - Skiptu um bakgrunn með því að smella á táknmynd Firefox-heimasíðunnar - - - Firefox merki - breyta bakgrunni, hnappur Klassískt %s @@ -648,6 +649,17 @@ Loka + + Opna %d flipa? + + Að opna þetta marga flipa gæti hægt á %s á meðan síðurnar eru að hlaðast inn. Ertu viss um að þú viljir halda áfram? + + Opna flipa + + Hætta við + %d vefsvæði @@ -677,10 +689,6 @@ Listi Reitir - - Leita að hópum - - Hópa tengd vefsvæði saman Loka flipum @@ -830,18 +838,6 @@ Ekkert ferli hér - - Samstillt frá öðrum tækjum - - Frá öðrum tækjum - - - Skráðu þig inn til að skoða samstilltan feril frá öðrum tækjum. - - Skrá inn - - Eða búðu til Firefox-reikning til að hefja samstillingu]]> - Sóttar skrár fjarlægðar @@ -889,6 +885,10 @@ Opna nýjan flipa Opna flipa í huliðsstillingu + + Opna allt í nýjum flipum + + Opna allt í huliðsflipum Eyða @@ -1068,6 +1068,8 @@ Deila Vista sem PDF + + Tekst ekki að útbúa PDF Senda til tækis @@ -1927,7 +1929,9 @@ Uppgötva meira - Keyrt með Pocket. + Keyrt með Pocket. + + Keyrt með %s. Hluti af Firefox-fjölskyldunni. %s diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 8d72d206e..d53d17b6f 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -14,6 +14,12 @@ השבתת גלישה פרטית חיפוש או הכנסת כתובת + + חיפוש בהיסטוריה + + חיפוש בסימניות + + חיפוש לשוניות נא להקליד מונחים לחיפוש @@ -130,13 +136,6 @@ כפתור להצגת כל הלשוניות האחרונות - - החיפוש שלך עבור ״%1$s״ - - - %d אתרים הצגת כל הלשוניות המסונכרנות @@ -257,6 +256,9 @@ הגדרות חיפוש + + הפעם לחפש את: + מה חדש ב־%1$s @@ -464,8 +466,12 @@ a section where users see a list of tabs that they have visited in the past few days --> נצפו לאחרונה - Pocket + Pocket + + סיפורים מעוררי מחשבה + + מאמרים המופעלים על־ידי %s סיפורים ממומנים @@ -485,12 +491,6 @@ לנסות שוב מידע נוסף - - החלפת הרקע על־ידי נגיעה בלוגו דף הבית של Firefox - - - הלוגו של Firefox - החלפת תמונת הרקע, כפתור ‏%s קלאסי @@ -637,6 +637,17 @@ סגירה + + לפתוח %d לשוניות? + + פתיחת כמות גדולה כזאת של לשוניות עשויה להאט את %s בזמן שהדפים נטענים. האם ברצונך להמשיך? + + פתיחת לשוניות + + ביטול + אתר אחד @@ -667,8 +678,6 @@ רשימה רשת - - קיבוץ אתרים קשורים סגירת לשוניות @@ -821,19 +830,6 @@ אין היסטוריה כאן - - סונכרן ממכשירים אחרים - - ממכשירים אחרים - - - יש להיכנס כדי לצפות בהיסטוריה המסונכרנת משאר מהמכשירים שלך. - - - כניסה - - או יצירת חשבון Firefox כדי להתחיל לסנכרן]]> - ההורדות הוסרו @@ -883,6 +879,10 @@ פתיחה בלשונית חדשה פתיחה בלשונית פרטית + + פתיחת הכל בלשוניות חדשות + + פתיחת הכל בלשוניות פרטיות מחיקה @@ -1064,6 +1064,8 @@ שיתוף שמירה כ־PDF + + לא ניתן ליצור PDF שליחה למכשיר @@ -1926,7 +1928,9 @@ לגלות עוד - מופעל באמצעות Pocket + מופעל באמצעות Pocket + + מופעל על־ידי %s. חלק ממשפחת Firefox. %s diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index da35c756a..841e04607 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -17,6 +17,12 @@ 검색어 또는 주소 입력 + + 기록 검색 + + 북마크 검색 + + 탭 검색 검색어 입력 @@ -135,13 +141,6 @@ 모든 최근 탭 표시 버튼 - - \"%1$s\"에 대한 검색 - - - %d개 사이트 동기화된 탭 모두 보기 @@ -265,6 +264,9 @@ 검색 설정 + + 이번만 검색: + %1$s의 새 기능 @@ -470,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> 최근에 방문함 - 포켓 + 포켓 + + 생각하게 하는 이야기 + + %s 제공 글 스폰서 소식 @@ -495,12 +501,6 @@ 배경 화면을 변경할 수 없습니다 더 알아보기 - - Firefox 홈페이지 로고를 눌러 배경 화면 변경 - - - Firefox 로고 - 배경 화면 변경, 버튼 클래식 %s @@ -659,6 +659,17 @@ 닫기 + + 탭 %d개를 여시겠습니까? + + 이렇게 많은 탭을 열면 페이지가 로드되는 동안 %s가 느려질 수도 있습니다. 계속하시겠습니까? + + 탭 열기 + + 취소 + %d개 사이트 @@ -689,10 +700,6 @@ 목록 그리드 - - 그룹 검색 - - 관련된 사이트를 서로 그룹화 탭 닫기 @@ -847,18 +854,6 @@ 기록 없음 - - 다른 기기에서 동기화됨 - - 다른 기기에서 - - - 다른 기기에서 동기화된 기록을 보려면 로그인 하세요. - - 로그인 - - 또는 동기화를 시작하려면 Firefox 계정을 만드세요]]> - 다운로드 삭제됨 @@ -910,6 +905,10 @@ 새 탭에서 열기 사생활 보호 탭에서 열기 + + 모두 새 탭에서 열기 + + 모두 사생활 보호 탭에서 열기 삭제 @@ -1105,6 +1104,8 @@ 공유 PDF로 저장 + + PDF를 생성할 수 없음 기기로 보내기 @@ -1984,7 +1985,9 @@ 더 발견하기 - 포켓 제공 + 포켓 제공 + + %s 제공. Firefox 제품군의 일부입니다. %s From f10634e593aad4562be35d18322f6bf25cba5e6b Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Thu, 3 Nov 2022 10:22:04 +0200 Subject: [PATCH 311/407] For #27252 - Update a11y services label for private browsing myths button --- .../viewholders/PrivateBrowsingDescriptionViewHolder.kt | 2 +- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt index 028a85c7b..a85f18584 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/PrivateBrowsingDescriptionViewHolder.kt @@ -95,7 +95,7 @@ fun PrivateBrowsingDescription( .clickable( interactionSource = interactionSource, indication = null, - onClickLabel = stringResource(R.string.link_text_view_type_announcement), + onClickLabel = stringResource(R.string.a11y_action_label_read_article), onClick = onLearnMoreClick, ), ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4d67edc1..6efcc8e40 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1890,4 +1890,6 @@ expand open link to learn more about this collection + + read the article From 5410be0e8c110e61165aa09c283d463c75290ff6 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Fri, 4 Nov 2022 01:29:01 -0400 Subject: [PATCH 312/407] For #27667 - Update the commit sha in .git-blame-ignore-revs --- .git-blame-ignore-revs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index f0554c1d2..22eeead02 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,5 +1,5 @@ # .git-blame-ignore-revs # For #27667 - Remove import-ordering from the list of disabled ktlint rules (#27680) -463fcd53b8db5a43b0be7bf1a4c4bbe8f2a163e0 +9654b4dfb122b54b04369fe80a2f9c95811478e8 # For #26844: Fix ktlint issues and remove them from baseline. (#26901) ffcef5ff2e3f78b6972dd16551f3f653b7035ccc From 03602239bd47f6eebcb7bc649a5c83030b275f09 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Thu, 3 Nov 2022 11:26:50 +0200 Subject: [PATCH 313/407] For #26710 fix flaky deleteCookiesTest UI test --- .../java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt index 2e82e68ee..4e3e897be 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsPrivacyTest.kt @@ -613,9 +613,13 @@ class SettingsPrivacyTest { @SmokeTest @Test fun deleteCookiesTest() { + val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val cookiesTestPage = getStorageTestAsset(mockWebServer, "storage_write.html").url + // Browsing a generic page to allow GV to load on a fresh run navigationToolbar { + }.enterURLAndEnterToBrowser(genericPage.url) { + }.openNavigationToolbar { }.enterURLAndEnterToBrowser(cookiesTestPage) { verifyPageContent("No cookies set") clickSetCookiesButton() From 56cd0e90228a94c85882c89e22d36d815d8a020b Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 4 Nov 2022 19:02:13 +0000 Subject: [PATCH 314/407] Update to Android-Components 108.0.20221104182737. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index a90b11735..604d6edc2 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221103143443" + const val VERSION = "108.0.20221104182737" } From dae5265c4007b7aa6a0ad601f22a5fba3ffebe02 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sat, 5 Nov 2022 01:38:51 +0100 Subject: [PATCH 315/407] Import l10n. (#27717) --- app/src/main/res/values-be/strings.xml | 36 +++++++- app/src/main/res/values-br/strings.xml | 95 +++++++++++++++------- app/src/main/res/values-de/strings.xml | 65 ++++++++------- app/src/main/res/values-el/strings.xml | 53 +++++------- app/src/main/res/values-es-rMX/strings.xml | 65 ++++++++------- app/src/main/res/values-fi/strings.xml | 66 +++++++-------- app/src/main/res/values-hu/strings.xml | 65 ++++++++------- app/src/main/res/values-ia/strings.xml | 36 +++++++- app/src/main/res/values-it/strings.xml | 36 +++++++- app/src/main/res/values-ja/strings.xml | 36 +++++++- app/src/main/res/values-kab/strings.xml | 33 +++++++- app/src/main/res/values-kmr/strings.xml | 29 ++++++- app/src/main/res/values-nl/strings.xml | 65 ++++++++------- app/src/main/res/values-pt-rBR/strings.xml | 65 ++++++++------- app/src/main/res/values-pt-rPT/strings.xml | 36 +++++++- app/src/main/res/values-ru/strings.xml | 64 ++++++++------- app/src/main/res/values-sat/strings.xml | 37 ++++++++- app/src/main/res/values-si/strings.xml | 36 +++++++- app/src/main/res/values-sk/strings.xml | 65 ++++++++------- app/src/main/res/values-sl/strings.xml | 23 +++++- app/src/main/res/values-sv-rSE/strings.xml | 62 +++++++------- app/src/main/res/values-tg/strings.xml | 66 ++++++++------- app/src/main/res/values-uk/strings.xml | 65 ++++++++------- app/src/main/res/values-vi/strings.xml | 65 ++++++++------- app/src/main/res/values-zh-rCN/strings.xml | 51 +++++------- app/src/main/res/values-zh-rTW/strings.xml | 66 +++++++-------- 26 files changed, 865 insertions(+), 516 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index c6a7c7e22..59aaaad8a 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -16,6 +16,12 @@ Увядзіце запыт або адрас + + Гісторыя пошуку + + Шукаць у закладках + + Шукаць карткі Увядзіце пошукавыя запыты @@ -249,6 +255,9 @@ Налады пошуку + + Гэтым разам шукаць: + Што новага ў %1$s @@ -452,8 +461,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Нядаўна наведаныя - Pocket + Pocket + + Гісторыі, якія прымушаюць задумацца + + Артыкулы ад %s Артыкулы ад спонсараў @@ -636,6 +649,17 @@ Закрыць + + Адкрыць %d картак? + + Адкрыццё такой колькасці ўкладак можа запаволіць %s падчас загрузкі старонак. Вы сапраўды хочаце гэта зрабіць? + + Адкрыць карткі + + Скасаваць + %d сайт @@ -867,6 +891,10 @@ Адкрыць у новай картцы Адкрыць у прыватнай картцы + + Адкрыць усё ў новых картках + + Адкрыць усё ў прыватных картках Выдаліць @@ -1048,6 +1076,8 @@ Падзяліцца Захаваць як PDF + + Немагчыма стварыць PDF Даслаць на прыладу @@ -1933,7 +1963,9 @@ Даведайцеся больш - Працуе на Pocket. + Працуе на Pocket. + + Пры падтрымцы %s. Частка сямейства Firefox. %s diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index e124f178d..3d8b037a8 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -14,6 +14,12 @@ Diweredekaat ar Merdeiñ Prevez Klask pe chomlecʼh + + Klask er roll istor + + Klask er sinedoù + + Klask en ivinelloù Skrivit gerioù ar c’hlask @@ -40,6 +46,8 @@ Sinedoù nevez + + Enrollet nevez ’zo Diskouez an holl sinedoù enrollet @@ -73,6 +81,15 @@ Argas + + Argas + + + + Hor c’heweriuster prevezded araoketañ betek-hen a lak an heulierien a-gostez. + + Gouzout hiroc’h a-zivout ar gwarez toupinoù hollek + Ezhomm a zo haeziñ ar c’hamera. Kit e Arventennoù Android, stokit war an aotreoù ha stokit war aotren. @@ -118,17 +135,13 @@ Diskouez an holl afelloù ivinelloù nevez - - Ho klask evit \"%1$s\" - - Lec’hiennoù %d Gwelout an holl ivinelloù goubredet Trevnad goubredet + + Dilemel Dilemel @@ -264,6 +277,31 @@ Gant ho pajenn Firefox personelaet eo aesoc’h da adstagañ lec’h m’ho peus paouezet. Klaskit e-touez hoc’h ivinelloù nevez, sinedoù ha disoc’hoù enklask. + + Kejit gant ho pajenn degemer personelaet. Ivinelloù nevez, sinedoù ha disoc’hoù enklask a vo diskouezet amañ. + + Donemat war un internet dizalc’h + + Donemat war un internet personeloc’h + + Muioc’h a livioù, muioc’h a brevezded. An hevelep youl da lakaat an dud a-raok ar gounidoù. + + Tremenit deus ar pellgomz d’an urzhiataer hezoug hag ar c’hontrefed + + Cheñch skrammoù a zo aesoc’h c’hoazh bremañ + + Adkemerit an traoù e lec’h m’ho poa laosket anezho war un trevnad all, dre ho pajenn degemer. + + Kregiñ ganti + + Kennaskañ + + Tremen + + Goubredet eo hoc’h ivinelloù! Tapit an traoù en-dro lec’h m’ho peus laosket anezho e lec’h all. + + Serriñ + Digeriñ en un ivinell %1$s nevez @@ -419,8 +457,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Gweladennet nevez ’zo - Pocket + Pocket + + Boued spered + + Pennadoù kinniget gant %s Istorioù paeroniet @@ -435,11 +477,17 @@ Drekleur hizivaet! Gwelout - - Kemmit an drekleur en ur stekiñ ouzh arlun pajenn degemer Firefox - - Arlun Firefox - kemmañ an drekleur, afell + + + N’haller ket pellgargañ an drekleur + + Klask en-dro + + N’haller ket kemmañ an drekleur + + Gouzout hiroc’h + + %s klasel @@ -611,10 +659,6 @@ Roll Grid - - Klask er strolladoù - - Strollañ al lec’hiennoù heñvel Serriñ an ivinelloù @@ -764,16 +808,6 @@ Roll istor ebet amañ - - Goubredet gant trevnadoù all - - Diwar trevnadoù all - - Kennaskañ - - - Pe grouit ur gont Firefox evit kregiñ gant ar c’houbredañ]]> - Pellgargadurioù dilammet @@ -1010,10 +1044,10 @@ Eilet er golver - Kennaskañ evit goubredañ + Kennaskañ evit goubredañ Kennaskañ ouzh Sync - + Kas dʼan holl drevnadoù Adkennaskañ da Sync @@ -1807,7 +1841,7 @@ Dizoloiñ muioc’h - Galloudekaet gant Pocket. + Galloudekaet gant Pocket. Ezel eus familh Firefox. %s @@ -1821,4 +1855,5 @@ Mont d’an arventennoù Firefox a ginnig - + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3d61b66d9..3df805b3e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,6 +17,12 @@ Suche oder Adresse + + Chronik durchsuchen + + Lesezeichen durchsuchen + + Tabs durchsuchen Suchbegriffe eingeben @@ -134,13 +140,6 @@ Schaltfläche „Alle zuletzt geöffneten Tabs“ anzeigen - - Ihre Suche nach \"%1$s\" - - - %d Websites Alle synchronisierten Tabs anzeigen @@ -264,6 +263,9 @@ Sucheinstellungen + + Dieses Mal suchen: + Was ist neu in %1$s @@ -469,8 +471,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Kürzlich besucht - Pocket + Pocket + + Geschichten, die zum Nachdenken anregen + + Artikel unterstützt von %s Gesponserte Geschichten @@ -493,12 +499,6 @@ Hintergrundbild konnte nicht geändert werden Weitere Informationen - - Hintergrundbild durch Tippen auf das Logo der Firefox-Startseite ändern - - - Firefox-Logo – Hintergrundbild ändern, Schaltfläche %s klassisch @@ -658,6 +658,17 @@ Schließen + + %d Tabs öffnen? + + Das Öffnen so vieler Tabs könnte %s verlangsamen, während die Seiten geladen werden. Sind Sie sicher, dass Sie fortfahren möchten? + + Tabs öffnen + + Abbrechen + %d Website @@ -688,10 +699,6 @@ Liste Raster - - Gruppen durchsuchen - - Zusammengehörige Websites gruppieren Tabs schließen @@ -846,18 +853,6 @@ Keine Chronik vorhanden - - Von anderen Geräten synchronisiert - - Von anderen Geräten - - - Melden Sie sich an, um die von Ihren anderen Geräten synchronisierte Chronik anzuzeigen. - - Anmelden - - Oder erstellen Sie ein Firefox-Konto, um mit der Synchronisation zu beginnen]]> - Downloads entfernt @@ -909,6 +904,10 @@ In neuem Tab öffnen In privatem Tab öffnen + + Alle in neuen Tabs öffnen + + Alle in privaten Tabs öffnen Löschen @@ -1102,6 +1101,8 @@ Teilen Als PDF speichern + + PDF kann nicht generiert werden An Gerät senden @@ -1969,7 +1970,9 @@ Mehr entdecken - Bereitgestellt von Pocket + Bereitgestellt von Pocket + + Unterstützt durch %s. Teil der Firefox-Familie. %s diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 3cddb5fa9..7311fe5c6 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -17,6 +17,12 @@ Αναζήτηση ή εισαγωγή διεύθυνσης + + Αναζήτηση ιστορικού + + Αναζήτηση σελιδοδεικτών + + Αναζήτηση καρτελών Εισαγωγή όρων αναζήτησης @@ -136,13 +142,6 @@ Κουμπί «Εμφάνιση όλων των πρόσφατων καρτελών» - - Η αναζήτησή σας για «%1$s» - - - %d ιστότοποι Προβολή όλων των συγχρονισμένων καρτελών @@ -470,7 +469,7 @@ a section where users see a list of tabs that they have visited in the past few days --> Πρόσφατες επισκέψεις - Pocket + Pocket Χορηγούμενα άρθρα @@ -495,12 +494,6 @@ Δεν ήταν δυνατή η αλλαγή ταπετσαρίας Μάθετε περισσότερα - - Αλλαγή ταπετσαρίας από το λογότυπο του Firefox στην αρχική σελίδα - - - Λογότυπο Firefox - κουμπί αλλαγής ταπετσαρίας Κλασικό %s @@ -657,6 +650,14 @@ Κλείσιμο + + Άνοιγμα %d καρτελών; + + Άνοιγμα καρτελών + + Ακύρωση + %d ιστότοπος @@ -687,10 +688,6 @@ Λίστα Πλέγμα - - Αναζήτηση ομάδων - - Ομαδοποίηση σχετικών ιστοτόπων Κλείσιμο καρτελών @@ -843,18 +840,6 @@ Δεν υπάρχει ιστορικό - - Συγχρονισμένα από άλλες συσκευές - - Από άλλες συσκευές - - - Συνδεθείτε για να δείτε το ιστορικό από τις άλλες συσκευές σας. - - Σύνδεση - - Ή δημιουργήστε έναν λογαριασμό Firefox για να ξεκινήσει ο συγχρονισμός]]> - Οι λήψεις διαγράφηκαν @@ -905,6 +890,10 @@ Άνοιγμα σε νέα καρτέλα Άνοιγμα σε ιδιωτική καρτέλα + + Άνοιγμα όλων σε νέες καρτέλες + + Άνοιγμα όλων σε ιδιωτικές καρτέλες Διαγραφή @@ -1084,6 +1073,8 @@ Κοινή χρήση Αποθήκευση ως PDF + + Δεν είναι δυνατή η δημιουργία PDF Αποστολή σε συσκευή @@ -1957,7 +1948,7 @@ Ανακαλύψτε περισσότερα - Με την υποστήριξη του Pocket. + Με την υποστήριξη του Pocket. Μέρος της οικογένειας του Firefox. %s diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index ef748ddb0..ee5e92c70 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -14,6 +14,12 @@ Deshabilitar navegación privada Buscar o ingresar dirección + + Buscar el historial + + Buscar marcadores + + Buscar pestañas Ingresa los términos de búsqueda @@ -128,13 +134,6 @@ Mostrar el botón de todas las pestañas recientes - - Tu búsqueda de \"%1$s\" - - - %d sitios Ver todas las pestañas sincronizadas @@ -257,6 +256,9 @@ Ajustes de búsqueda + + Busca esta vez: + Qué hay de nuevo en %1$s @@ -463,8 +465,12 @@ Visitados recientemente - Pocket + Pocket + + Historias que invitan a la reflexión + + Artículos desarrollados por %s Historias patrocinadas @@ -489,12 +495,6 @@ No se pudo cambiar el fondo de pantalla Saber más - - Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox - - - Logotipo de Firefox - cambiar el fondo de pantalla, botón Clásico %s @@ -651,6 +651,17 @@ Cerrar + + ¿Abrir %d pestañas? + + Abrir varias pestañas puede ralentizar a %s mientras se cargan las páginas. ¿Estás seguro de que deseas continuar? + + Abrir pestañas + + Cancelar + %d sitio @@ -680,10 +691,6 @@ Lista Cuadrícula - - Buscar en grupos - - Agrupar sitios relacionados Cerrar pestañas @@ -834,18 +841,6 @@ No hay ningún historial - - Sincronizado desde otros dispositivos - - Desde otros dispositivos - - - Inicia sesión para ver el historial sincronizado desde tus otros dispositivos. - - Iniciar sesión - - O crea una cuenta de Firefox para comenzar a sincronizar]]> - Descargas removidas @@ -895,6 +890,10 @@ Abrir en una nueva pestaña Abrir en una pestaña privada + + Abrir todo en pestañas nuevas + + Abrir todo en pestañas privadas Eliminar @@ -1074,6 +1073,8 @@ Compartir Guardar como PDF + + No se puede generar PDF Enviar a dispositivo @@ -1935,7 +1936,9 @@ Descubrir más - Desarrollado por Pocket. + Desarrollado por Pocket. + + Impulsado por %s. Parte de la familia Firefox. %s diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 024d45957..c8d4e01db 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -16,6 +16,12 @@ Poista yksityinen selaus käytöstä Hae tai kirjoita osoite + + Etsi historiasta + + Etsi kirjanmerkeistä + + Etsi välilehdistä Kirjoita hakuehdot @@ -132,13 +138,6 @@ Näytä kaikki viimeisimmät välilehdet -painike - - Hakusi ehdoilla \"%1$s\" - - - %d sivustoa Näytä kaikki synkronoidut välilehdet @@ -263,6 +262,9 @@ Hakuasetukset + + Tällä kertaa hae: + Mitä uutta %1$s sisältää @@ -469,8 +471,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Äskettäin vierailtu - Pocket + Pocket + + Ajatuksia herättäviä tarinoita + + Artikkelit tarjoaa %s Sponsoroidut tarinat @@ -494,12 +500,6 @@ Taustakuvaa ei voitu vaihtaa Lue lisää - - Vaihda taustakuvaa napauttamalla Firefoxin etusivun logoa - - - Firefox-logo - vaihda taustakuva, painike Klassinen %s @@ -658,6 +658,17 @@ Sulje + + Avataanko %d välilehteä? + + Näin monen välilehden avaaminen voi hidastaa %sia sivujen latautuessa. Haluatko varmasti jatkaa? + + Avaa välilehdet + + Peruuta + %d sivusto @@ -687,10 +698,6 @@ Lista Ruudukko - - Hakuryhmät - - Ryhmitä toisiinsa liittyvät sivustot yhteen Sulje välilehdet @@ -845,19 +852,6 @@ Ei historiaa täällä - - Synkronoitu muilta laitteilta - - Muilta laitteilta - - - Kirjaudu sisään, jotta voit katsella historiaa synkronoituna muista laitteistasi. - - Kirjaudu sisään - - - Tai luo Firefox-tili aloittaaksesi synkronoinnin]]> - Lataukset poistettu @@ -907,6 +901,10 @@ Avaa uudessa välilehdessä Avaa yksityisessä välilehdessä + + Avaa kaikki uusissa välilehdissä + + Avaa kaikki yksityisissä välilehdissä Poista @@ -1088,6 +1086,8 @@ Jaa Tallenna PDF-muodossa + + PDF:n luominen ei onnistu Lähetä laitteeseen @@ -1955,7 +1955,9 @@ Löydä lisää - Taustavoimana Pocket. + Taustavoimana Pocket. + + Mahdollistajana %s. Osa Firefox-perhettä. %s diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 53ee1770a..aff280735 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -15,6 +15,12 @@ Privát böngészés letiltása Keressen, vagy adjon meg címet + + Keresés előzményei + + Könyvjelzők keresése + + Lapok keresése Adja meg a keresési kifejezéseket @@ -130,13 +136,6 @@ Öösszes legutóbbi lap megjelenítése gomb - - Az Ön keresése erre: „%1$s” - - - %d webhely Összes szinkronizált lap megtekintése @@ -260,6 +259,9 @@ Keresési beállítások + + Ezúttal keresés erre: + A %s újdonságai @@ -465,8 +467,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nemrég felkeresett - Pocket + Pocket + + Elgondolkodtató történetek + + A cikkek forrása: %s Szponzorált történetek @@ -490,12 +496,6 @@ Nem sikerült megváltoztatni a háttérképet További tudnivalók - - A háttérkép módosításához koppintson a Firefox kezdőlap logójára - - - Firefox logó – háttérkép megváltoztatása, gomb Klasszikus %s @@ -655,6 +655,17 @@ Bezárás + + Megnyit %d lapot? + + Ennyi lap megnyitása lelassíthatja a %s programot, miközben a lapok betöltődnek. Biztos, hogy folytatja? + + Nyitott lapok + + Mégse + %d webhely @@ -684,10 +695,6 @@ Lista Rács - - Keresési csoportok - - Kapcsolódó webhelyek csoportosítása Lapok bezárása @@ -840,18 +847,6 @@ Nincsenek előzmények - - Másik eszközről szinkronizálva - - Más eszközről - - - Jelentkezzen be a más eszközeiről származó előzményeinek megjelenítéséhez. - - Bejelentkezés - - Vagy hozzon létre egy Firefox-fiókot a szinkronizálás megkezdéséhez]]> - Letöltések eltávolítva @@ -901,6 +896,10 @@ Megnyitás új lapon Megnyitás privát lapon + + Összes megnyitása új lapon + + Összes megnyitása privát lapon Törlés @@ -1081,6 +1080,8 @@ Megosztás Mentés PDF-ként + + A PDF nem állítható elő Küldés eszközre @@ -1948,7 +1949,9 @@ Folytassa a felfedezést - A motorháztető alatt: Pocket. + A motorháztető alatt: Pocket. + + A motorháztető alatt: %s. A Firefox család tagja. %s diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 2bdd4111d..d4c0cd304 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -17,6 +17,12 @@ Disactivar le navigation private. Insere un adresse o face un recerca + + Cercar in le chronologia + + Cercar in le marcapaginas + + Cercar in schedas Inserer terminos pro le recerca @@ -253,6 +259,9 @@ Parametros de recerca + + Iste vice cercar: + Lo que es nove in %1$s @@ -460,8 +469,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitate recentemente - Pocket + Pocket + + Historias que face pensar + + Articulos supportate per %s Articulos sponsorisate @@ -657,6 +670,17 @@ Clauder + + Aperir %d schedas? + + Aperir tante schedas pote relentar %s durante que le paginas es cargate. Desira tu vermente continuar? + + Aperir schedas + + Cancellar + %d sito @@ -894,6 +918,10 @@ Aperir in scheda private + + Aperir totos in nove schedas + + Aperir totos in nove schedas private Deler @@ -1078,6 +1106,8 @@ Salvar como PDF + + Impossibile generar file PDF Inviar a un apparato @@ -1957,7 +1987,9 @@ Discoperi plus - Potentiate per Pocket + Potentiate per Pocket + + Potentiate per %s. Parte del familia de Firefox. %s diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5cb43615e..fb9f3837a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -17,6 +17,12 @@ Cerca o scrivi un indirizzo + + Cerca nella cronologia + + Cerca nei segnalibri + + Cerca nelle schede Immetti i termini di ricerca @@ -254,6 +260,9 @@ Impostazioni ricerca + + Questa volta cerca: + Novità in %1$s @@ -464,8 +473,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitati di recente - Pocket + Pocket + + Storie che fanno riflettere + + Articoli selezionati da %s Storie sponsorizzate @@ -649,6 +662,17 @@ Chiudi + + Aprire %d schede? + + L’apertura di così tante schede potrebbe rallentare %s durante il caricamento delle pagine. Procedere comunque? + + Apri schede + + Annulla + %d sito @@ -884,6 +908,10 @@ Apri in una nuova scheda Apri in scheda anonima + + Apri tutti in nuove schede + + Apri tutti in schede anonime Elimina @@ -1075,6 +1103,8 @@ Condividi Salva come PDF + + Impossibile generare il PDF Invia a dispositivo @@ -1949,7 +1979,9 @@ Scopri altre storie - Sviluppato con tecnologia Pocket + Sviluppato con tecnologia Pocket + + Con tecnologia %s. Parte della famiglia Firefox. %s diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index bc0024804..3900b5289 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -17,6 +17,12 @@ 検索語またはアドレスを入力 + + 履歴を検索 + + ブックマークを検索 + + タブを検索 検索語を入力 @@ -258,6 +264,9 @@ 検索設定 + + 今回の検索: + %1$s の新機能 @@ -463,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> 最近訪れたサイト - Pocket + Pocket + + 示唆に富むストーリー + + %s が提供する記事 広告ストーリー @@ -645,6 +658,17 @@ 閉じる + + %d 個のタブを開きますか? + + この操作で多くのタブを開くと、ページの読み込み中に %s が遅くなる可能性があります。続行してもよろしいですか? + + タブを開く + + キャンセル + %d サイト @@ -877,6 +901,10 @@ 新しいタブで開く プライベートタブで開く + + すべてを新しいタブで開く + + すべてをプライベートタブで開く 削除 @@ -1060,6 +1088,8 @@ 共有 PDF として保存 + + PDF を生成できません 端末へ送信 @@ -1930,7 +1960,9 @@ より詳しく - Powered by Pocket. + Powered by Pocket. + + %s による提供です。 Firefox ファミリーの一員です。 %s diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 5a674f1d7..0b33ba247 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -15,6 +15,12 @@ Nadi neɣ sekcem tansa + + Nadi deg uzray + + Nadi ticraḍ n yisebtar + + Nadi deg waccaren Sekcem awalen n unadi @@ -254,6 +260,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Nadi ismenyifen + + Tura nadi wagi: + D acu i d maynut deg %1$s @@ -461,8 +470,12 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara a section where users see a list of tabs that they have visited in the past few days --> Yemmẓer melmi kan - Pocket + Pocket + + Tiqsiḍin i ijebbden lwelha + + Imagraden yellan ddaw leɛnaya n %s Tiqṣidin yettwarefden @@ -646,6 +659,14 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Mdel + + Ldi %d waccaren? + + Ldi accaren + + Sefsex + %d n usmel @@ -879,6 +900,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ldi-t deg yiccer amaynut Ldi deg iccer uslig + + Ldi kullec deg waccaren imaynuten + + Ldi kullec deg waccaren usligen Kkes @@ -1059,6 +1084,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Bḍu Kles d PDF + + D awezɣi ad yettusirew PDF Azen ɣer yibenk @@ -1926,7 +1953,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Issin ugar - Sɣur Pocket. + Sɣur Pocket. + + Ddaw leɛnaya n %s. D aḥric seg twacult Firefox. %s diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 4930d6bbb..76261ec29 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -15,6 +15,12 @@ Gerîna veşartî bigire Lêgerîn an jî navnîşan + + Raboriya lêgerînê + + Di bijareyan de bigere + + Di hilpekînan de bigere Peyvên lêgerînê binivîse @@ -254,6 +260,9 @@ Eyarên lêgerînê + + Lêgerîna niha: + Tiştên nû yên %1$s`ê @@ -457,7 +466,7 @@ a section where users see a list of tabs that they have visited in the past few days --> Seredanên dawî - Pocket + Pocket Nûçeyên sponsorkirî @@ -642,6 +651,14 @@ Bigire + + %d hilpekînan veke? + + Hilpekînên vekirî + + Betal bike + %d malper @@ -871,6 +888,10 @@ Di hilpekîna nû de veke Di hilpekîna veşartî de veke + + Gişî di hilpekînên nû de veke + + Gişî di hilpekînên veşartî de veke Jê bibe @@ -1050,6 +1071,8 @@ Parve bike Wekî PDF qeyd bike + + PDF nayê çêkirin Bişîne cîhazê @@ -1907,7 +1930,9 @@ Zêdetir keşf bike - Bi piştgiriya Pocketê. + Bi piştgiriya Pocketê. + + Bihêzkirin ji aliyê %sê. Beşeke ji malbata Firefoxê. %s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a07683500..f3e540555 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -17,6 +17,12 @@ Voer zoekterm of adres in + + Geschiedenis doorzoeken + + Bladwijzers doorzoeken + + Tabbladen doorzoeken Voer zoektermen in @@ -135,13 +141,6 @@ Knop Alle recente tabbladen tonen - - Uw zoekopdracht naar ‘%1$s’ - - - %d websites Alle gesynchroniseerde tabbladen bekijken @@ -265,6 +264,9 @@ Zoekinstellingen + + Deze keer zoeken in: + Wat is er nieuw in %1$s @@ -470,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Onlangs bezocht - Pocket + Pocket + + Verhalen die tot nadenken stemmen + + Artikelen mogelijk gemaakt door %s Gesponsorde verhalen @@ -495,12 +501,6 @@ Kan achtergrond niet wijzigen Meer info - - Uw achtergrond wijzigen door op het Firefox-startpaginalogo te tikken - - - Firefox-logo – de achtergrond, de knop wijzigen Klassieke %s @@ -658,6 +658,17 @@ Sluiten + + %d tabbladen openen? + + Als u zoveel tabbladen opent, kan dit %s vertragen tijdens het laden van de pagina’s. Weet u zeker dat u wilt doorgaan? + + Tabbladen openen + + Annuleren + %d website @@ -688,10 +699,6 @@ Lijst Raster - - Groepen zoeken - - Gerelateerde websites groeperen Tabbladen sluiten @@ -844,18 +851,6 @@ Geen geschiedenis hier - - Gesynchroniseerd vanaf andere apparaten - - Vanaf andere apparaten - - - Meld u aan om van uw andere apparaten gesynchroniseerde geschiedenis te bekijken. - - Aanmelden - - Of maak een Firefox-account om te beginnen met synchroniseren]]> - Downloads verwijderd @@ -905,6 +900,10 @@ Openen in nieuw tabblad Openen in privétabblad + + Alles in nieuwe tabbladen openen + + Alles in privétabbladen openen Verwijderen @@ -1084,6 +1083,8 @@ Delen Opslaan als PDF + + Kan PDF niet aanmaken Verzenden naar apparaat @@ -1946,7 +1947,9 @@ Meer ontdekken - Mogelijk gemaakt door Pocket. + Mogelijk gemaakt door Pocket. + + Mogelijk gemaakt door %s. Onderdeel van de Firefox-familie. %s diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cc5ce5c29..5e9debe3f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -14,6 +14,12 @@ Desativar navegação privativa Pesquise ou digite um endereço + + Pesquisar no histórico + + Pesquisar nos favoritos + + Pesquisar nas abas Digite termos de pesquisa @@ -130,13 +136,6 @@ Botão de exibir todas as abas recentes - - Sua pesquisa de \"%1$s\" - - - %d sites Ver todas as abas sincronizadas @@ -259,6 +258,9 @@ Configurações da pesquisa + + Desta vez pesquisar: + Novidades no %1$s @@ -464,8 +466,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitado recentemente - Pocket + Pocket + + Histórias que instigam o pensamento + + Artigos sugeridos pelo %s Histórias patrocinadas @@ -490,12 +496,6 @@ Não foi possível mudar o fundo de tela Saiba mais - - Mudar o fundo de tela tocando no logotipo do Firefox na tela inicial - - - Logotipo do Firefox - mudar fundo de tela, botão %s clássico @@ -651,6 +651,17 @@ Fechar + + Abrir %d abas? + + Abrir tantas abas pode deixar o %s lento enquanto as páginas são carregadas. Tem certeza que quer continuar? + + Abrir abas + + Cancelar + %d site @@ -680,10 +691,6 @@ Lista Grade - - Grupos de pesquisa - - Agrupar sites relacionados Fechar abas @@ -836,18 +843,6 @@ Nenhum histórico aqui - - Sincronizado de outros dispositivos - - De outros dispositivos - - - Entre para ver o histórico sincronizado de seus outros dispositivos. - - Entrar - - Ou crie uma conta Firefox para começar a sincronizar]]> - Downloads removidos @@ -897,6 +892,10 @@ Abrir em nova aba Abrir em aba privativa + + Abrir tudo em novas abas + + Abrir tudo em abas privativas Excluir @@ -1077,6 +1076,8 @@ Compartilhar Salvar como PDF + + Não foi possível gerar PDF Enviar para dispositivo @@ -1945,7 +1946,9 @@ Descubra mais - Proporcionado pelo Pocket. + Proporcionado pelo Pocket. + + Com tecnologia %s. Parte da família Firefox. %s diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d8c22a7d5..fece67a26 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -15,6 +15,12 @@ Desativar navegação privada Pesquise ou insira o endereço + + Pesquisar histórico + + Pesquisar marcadores + + Pesquisar separadores Introduza os termos de pesquisa @@ -252,6 +258,9 @@ Definições de pesquisa + + Pesquisa neste momento: + Novidades do %s @@ -455,8 +464,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visualizados recentemente - Pocket + Pocket + + Histórias que fazem pensar + + Artigos suportados pelo %s Histórias patrocinadas @@ -638,6 +651,17 @@ Fechar + + Abrir %d separadores? + + Abrir tantos separadores poderá desacelerar o %s enquanto as páginas estiverem a carregar. Tem a certeza de que quer continuar? + + Abrir separadores + + Cancelar + %d site @@ -866,6 +890,10 @@ Abrir num separador novo Abrir num separador privado novo + + Abrir todos em novos separadores + + Abrir todos em separadores privados Eliminar @@ -1045,6 +1073,8 @@ Partilhar Guardar como PDF + + Não foi possível gerar o PDF Enviar para o dispositivo @@ -1911,7 +1941,9 @@ Descobrir mais - Com tecnologia do Pocket. + Com tecnologia do Pocket. + + Suportado por %s. Membro da família Firefox. %s diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9351de8a8..f33fcac10 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,6 +17,12 @@ Введите запрос или адрес + + Поиск в журнале + + Поиск в закладках + + Поиск во вкладках Введите поисковые запросы @@ -135,13 +141,6 @@ Кнопка показа всех недавних вкладок - - Ваш поиск \"%1$s\" - - - Сайтов: %d Все облачные вкладки @@ -267,6 +266,9 @@ Настройки поиска + + В этот раз искать: + Что нового в %1$s @@ -473,8 +475,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Недавно посещённые - Pocket + Pocket + + Истории, наводящие на размышления + + Статьи от %s Статьи спонсоров @@ -497,11 +503,6 @@ Не удалось сменить обои Подробнее - - Меняйте обои, коснувшись логотипа домашней страницы Firefox - - Логотип Firefox - сменить обои, кнопка Классический %s @@ -659,6 +660,17 @@ Закрыть + + Открыть %d вкладок? + + Открытие такого количества вкладок может замедлить работу %s на время, требуемое для загрузки этих страниц. Вы действительно хотите это сделать? + + Открыть вкладки + + Отмена + %d сайт @@ -689,10 +701,6 @@ Списком Сеткой - - Поисковые группы - - Группировать связанные сайты Закрывать вкладки @@ -844,18 +852,6 @@ История отсутствует - - Синхронизировано с других устройств - - С других устройств - - - Войдите, чтобы увидеть историю с других ваших устройств. - - Войти - - Или создайте учётную запись Firefox, чтобы начать синхронизацию]]> - Загрузки удалены @@ -907,6 +903,10 @@ Открыть в новой вкладке Открыть в приватной вкладке + + Открыть все в новых вкладках + + Открыть все в приватных вкладках Удалить @@ -1098,6 +1098,8 @@ Поделиться Сохранить как PDF + + Не удалось сгенерировать PDF Отправить на устройство @@ -1962,7 +1964,9 @@ Узнайте больше - С использованием Pocket. + С использованием Pocket. + + При поддержке %s. Является частью семейства Firefox. %s diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 29a5980c3..90ef7b32e 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -14,6 +14,12 @@ ᱯᱨᱟᱭᱣᱮᱴ ᱵᱽᱨᱟᱣᱡᱤᱝ ᱵᱟᱝ ᱦᱩᱭ ᱦᱚᱪᱚᱜ ᱢᱮ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨ ᱵᱟᱝ ᱴᱷᱤᱠᱬᱟᱹ ᱟᱫᱮᱨ ᱢᱮ + + ᱱᱟᱜᱟᱢ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + + ᱴᱮᱵᱽ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱥᱮᱸᱫᱽᱨᱟ ᱚᱞ ᱠᱚ ᱟᱫᱮᱨ ᱢᱮ @@ -253,6 +259,9 @@ ᱥᱮᱸᱫᱽᱨᱟ ᱥᱟᱡᱟᱣ ᱠᱚ + + ᱱᱤᱭᱟᱹ ᱚᱠᱛᱚ ᱥᱮᱸᱫᱽᱨᱟ : + %1$s ᱨᱮ ᱪᱮᱫ ᱱᱟᱶᱟ ᱢᱮᱱᱟ-ᱟ @@ -454,8 +463,12 @@ a section where users see a list of tabs that they have visited in the past few days --> ᱱᱤᱛᱚᱜᱟᱜ ᱦᱤᱨᱤᱭᱟᱜ - ᱯᱚᱠᱮᱴ + ᱯᱚᱠᱮᱴ + + ᱢᱚᱱᱮᱼᱜᱷᱟᱱᱴᱟ ᱠᱟᱹᱦᱱᱤᱠᱚ + + %s ᱫᱟᱨᱟᱭ ᱛᱮ ᱫᱟᱲᱮ ᱮᱢ ᱠᱟᱱ ᱚᱱᱚᱞᱠᱚ ᱜᱟᱲᱚ ᱠᱟᱱ ᱠᱟᱹᱦᱱᱤ ᱠᱚ @@ -638,6 +651,18 @@ ᱵᱚᱸᱫᱚᱭ ᱢᱮ + + %d ᱴᱮᱵᱽᱠᱚ ᱠᱷᱩᱞᱟᱹᱭᱟᱢ ᱥᱮ ? + + + ᱥᱟᱦᱴᱟᱠᱚ ᱞᱟᱫᱮ ᱡᱷᱚᱛᱜ ᱟᱹᱰᱤᱜᱟᱱ ᱴᱮᱵᱽ ᱠᱚ ᱠᱷᱩᱞᱟᱹ ᱞᱮᱠᱷᱟᱱ %s ᱵᱟᱹᱭᱚᱜᱼᱟ ᱾ ᱟᱡ ᱥᱟᱹᱨᱤᱛᱮ ᱞᱟᱦᱟ ᱥᱮᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ ? + + ᱴᱮᱵᱽ ᱠᱚ ᱡᱷᱤᱡᱽ ᱢᱮ + + ᱵᱟᱹᱰᱨᱟᱹ + %d ᱥᱟᱭᱤᱴ @@ -869,6 +894,10 @@ ᱱᱟᱶᱟ ᱴᱮᱵᱽ ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵᱽ ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ + + ᱱᱟᱶᱟ ᱴᱮᱵᱽ ᱨᱮ ᱡᱷᱚᱛᱚ ᱡᱷᱤᱡᱽ ᱢᱮ + + ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵ ᱨᱮ ᱡᱷᱚᱛᱚ ᱡᱷᱤᱡᱽ ᱢᱮ ᱢᱮᱴᱟᱣ ᱢᱮ @@ -1048,6 +1077,8 @@ PDF ᱞᱮᱠᱷᱟ ᱥᱟᱺᱪᱟᱣ ᱢᱮ + + PDF ᱛᱮᱭᱟᱨ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱠᱩᱞ ᱢᱮ @@ -1910,7 +1941,9 @@ ᱟᱨᱦᱚᱸ ᱯᱟᱱᱛᱮ ᱧᱟᱢ ᱢᱮ - ᱜᱚᱲᱚᱤᱭᱟᱹ Pocket + ᱜᱚᱲᱚᱤᱭᱟᱹ Pocket + + %1$s ᱫᱟᱨᱟᱭ ᱛᱮ ᱫᱟᱲᱮ ᱮᱢ ᱾ Firefox ᱜᱷᱟᱨᱚᱧᱡᱽ ᱨᱤᱱᱤᱡ ᱦᱟᱹᱴᱤᱧ ᱾ %s diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 835f5731a..6f0632617 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -15,6 +15,12 @@ පෞද්. පිරික්සීම අබල කරන්න සොයන්න හෝ ලිපිනය යොදන්න + + ඉතිහාසය සොයන්න + + පොත්යොමු සොයන්න + + පටිති සොයන්න සෙවුම් පද යොදන්න @@ -242,6 +248,9 @@ සෙවුම් සැකසුම් + + මෙවර සෙවීම: + %1$s හි අළුත් දෑ @@ -445,7 +454,11 @@ a section where users see a list of tabs that they have visited in the past few days --> මෑතදී ගොඩවැදුණු - පොකට් + පොකට් + + සිතුවිලි අවුස්සන කතා + + %s මගින් ලිපි බලගැන්වේ අනුග්‍රහය ලද කතා @@ -626,6 +639,17 @@ වසන්න + + පටිති %d ක් අරින්නද? + + පටිති බොහොමයක් විවෘත කිරීමෙන් පිටු පූරණය අතරතුර %s මන්දගාමී වීමට හැකිය. ඉදිරියට යාමට වුවමනා ද? + + පටිති අරින්න + + අවලංගු + අඩවි %d @@ -856,6 +880,10 @@ නව පටිත්තක අරින්න පෞද්. පටිත්තක අරින්න + + සියල්ල නව පටිතිවල අරින්න + + සියල්ල පෞද්. පටිතිවල අරින්න මකන්න @@ -1030,6 +1058,8 @@ බෙදාගන්න පීඩීඑෆ් ලෙස සුරකින්න + + පීඩීඑෆ් උත්පාදනය කිරීමට නොහැකිය උපාංගයට යවන්න @@ -1875,7 +1905,9 @@ තව සොයා ගන්න - පොකට් මගින් බලගැන්වේ. + පොකට් මගින් බලගැන්වේ. + + %s මගින් බලගැන්වේ. ෆයර්ෆොක්ස් පවුලේ කොටසකි. %s diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1ef6f9cf6..9e13b4bf8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,6 +15,12 @@ Zakázať súkromné prehliadanie Hľadať + + Hľadať v histórii + + Hľadať v záložkách + + Hľadať v kartách Zadajte hľadaný výraz @@ -130,13 +136,6 @@ Tlačidlo Zobraziť všetky nedávne karty - - Vaše hľadanie výrazu \"%1$s\" - - - Stránky: %d Zobraziť všetky synchronizované karty @@ -261,6 +260,9 @@ Hľadať v nastaveniach + + Tentokrát hľadať: + Novinky v aplikácii %1$s @@ -470,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nedávno navštívené - Pocket + Pocket + + Príbehy na zamyslenie + + Články zo služby %s Sponzorované príbehy @@ -494,12 +500,6 @@ Tapetu sa nepodarilo zmeniť Ďalšie informácie - - Tapetu domovskej stránky zmeniť ťuknutím na logo Firefoxu - - - Logo Firefoxu - zmena tapety, tlačidlo Klasický %s @@ -658,6 +658,17 @@ Zavrieť + + Otvoriť %d kariet? + + Otvorenie tohto množstva kariet môže spomaliť %s počas ich načítavania. Naozaj chcete pokračovať? + + Otvoriť karty + + Zrušiť + %d stránka @@ -687,10 +698,6 @@ Zoznam Mriežka - - Hľadať v skupinách - - Zoskupovať súvisiace stránky Zavrieť karty @@ -842,18 +849,6 @@ Nemáte žiadnu históriu prehliadania - - Synchronizované z iných zariadení - - Z iných zariadení - - - Ak chcete zobraziť históriu synchronizovanú z vašich ostatných zariadení, prihláste sa. - - Prihlásiť sa - - Alebo si vytvorte účet Firefox a spustite synchronizáciu]]> - Stiahnuté súbory boli odstránené @@ -903,6 +898,10 @@ Otvoriť na novej karte Otvoriť na súkromnej karte + + Otvoriť všetky na nových kartách + + Otvoriť všetky na súkromných kartách Odstrániť @@ -1083,6 +1082,8 @@ Zdieľať Uložiť ako PDF + + Nedá sa vygenerovať PDF Odoslať do zariadenia @@ -1942,7 +1943,9 @@ Objavte ďalšie - Službu poskytuje Pocket + Službu poskytuje Pocket + + Vďaka službe %s. Súčasť rodiny Firefoxu. %s diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index fb6baf12b..745c6a5ea 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -15,6 +15,10 @@ Iskanje ali naslov strani + + Zgodovina iskanja + + Iskanje po zaznamkih Vnesite iskalni niz @@ -459,8 +463,10 @@ a section where users see a list of tabs that they have visited in the past few days --> Nedavno obiskano - Pocket + Pocket + + Zgodbe, ki spodbujajo k razmisleku Sponzorirane zgodbe @@ -644,6 +650,11 @@ Zapri + + Odpri zavihke + + Prekliči + %d spletno mesto @@ -876,6 +887,10 @@ Odpri v novem zavihku Odpri v zasebnem zavihku + + Odpri vse v novih zavihkih + + Odpri vse v zasebnih zavihkih Izbriši @@ -1057,6 +1072,8 @@ Deli Shrani kot PDF + + Datoteke PDF ni mogoče ustvariti Pošlji na napravo @@ -1926,7 +1943,9 @@ Odkrijte več - Omogoča Pocket + Omogoča Pocket + + Omogoča %s. Del družine Firefox. %s diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index e604db7bb..15075c6b1 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -15,6 +15,12 @@ Inaktivera privat surfning Sök eller ange adress + + Sökhistorik + + Sök bokmärken + + Sök flikar Ange söktermer @@ -132,13 +138,6 @@ Visa knappen alla senaste flikar - - Du sökte efter \"%1$s\" - - - %d webbplatser Se alla synkroniserade flikar @@ -469,8 +468,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nyligen besökta - Pocket + Pocket + + Tankeväckande berättelser + + Artiklar tillhandahålls av %s Sponsrade berättelser @@ -494,12 +497,6 @@ Det gick inte att ändra bakgrundsbild Läs mer - - Ändra bakgrundsbild genom att trycka på Firefox startsidas logotyp - - - Firefox logotyp - knapp för att ändra bakgrundsbild Klassisk %s @@ -658,6 +655,17 @@ Stäng + + Öppna %d flikar? + + Att öppna så många flikar kan sakta ner %s medan sidorna laddas. Är du säker på att du vill fortsätta? + + Öppna flikar + + Avbryt + %d webbplats @@ -688,10 +696,6 @@ Lista Rutnät - - Sökgrupper - - Gruppera relaterade webbplatser tillsammans Stäng flikar @@ -844,18 +848,6 @@ Ingen historik här - - Synkroniserad från andra enheter - - Från andra enheter - - - Logga in för att se historik synkroniserad från dina andra enheter. - - Logga in - - Eller skapa ett Firefox-konto för att börja synkronisera]]> - Nedladdningar har tagits bort @@ -905,6 +897,10 @@ Öppna i ny flik Öppna i privat flik + + Öppna alla i nya flikar + + Öppna alla i privata flikar Ta bort @@ -1084,6 +1080,8 @@ Dela Spara som PDF + + Det går inte att generera PDF Skicka till enhet @@ -1950,7 +1948,9 @@ Upptäck mer - Tillhandahålls av Pocket + Tillhandahålls av Pocket + + Tillhandahålls av %s. Del av Firefox-familjen. %s diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 171a9971e..abcbf60cd 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -14,6 +14,12 @@ Ғайрифаъол кардани тамошокунии хусусӣ Нишониеро ҷустуҷӯ кунед ё ворид намоед + + Ҷустуҷӯ дар таърих + + Ҷустуҷӯ дар хатбаракҳо + + Ҷустуҷӯ дар варақаҳо Вожаҳои ҷустуҷӯиро ворид намоед @@ -132,13 +138,6 @@ Нишон додани тугмаи ҳамаи хатбаракҳои охирин - - Ҷустуҷӯи шумо барои \"%1$s\" - - - %d сомона Дидани ҳамаи варақаҳои ҳамоҳангшуда @@ -260,6 +259,9 @@ Танзимоти ҷустуҷӯ + + Ҷустуҷӯи ин дафъа: + Дар %1$s чӣ нав аст @@ -462,8 +464,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Дидашудаи охирин - Pocket + Pocket + + Ҳикояҳои андешаангез + + Мақолаҳои таъминшуда аз ҷониби «%s» Мақолаҳои сарпарастӣ @@ -486,12 +492,6 @@ Тасвири замина иваз карда нашуд Маълумоти бештар - - Тасвири заминаро бо зеркунии тамғаи саҳифаи асосии «Firefox» иваз намоед - - - Тамғаи «Firefox» - иваз кардани тасвири замина, тугма Классикӣ - %s @@ -650,6 +650,18 @@ Пӯшидан + + %d варақаро мекушоед? + + + Кушодани варақаҳои барзиёд метавонад кори «%s»-ро суст кунад, ҳангоме ки саҳифаҳо бор мешаванд. Шумо мутмаин ҳастед, ки мехоҳед идома диҳед? + + Кушодани равақаҳо + + Бекор кардан + %d сомона @@ -680,10 +692,6 @@ Рӯйхат Тӯр - - Гурӯҳҳои ҷустуҷӯ - - Сомонаҳои марбутро гурӯҳбандӣ кунед Пӯшидани варақаҳо @@ -834,18 +842,6 @@ Ягон таърих нест - - Аз дастгоҳҳои дигар ҳамоҳанг карда шуд - - Аз дастгоҳҳои дигар - - - Барои дидани таърихи ҳамоҳангшуда аз дастгоҳҳои дигари худ ворид шавед. - - Ворид шудан - - Ё барои оғози ҳамоҳангсозӣ, ҳисоби Firefox-ро эҷод кунед]]> - Боргириҳо тоза шуданд @@ -896,6 +892,10 @@ Кушодан дар варақаи нав Кушодан дар варақаи хусусӣ + + Ҳамаро дар варақаҳои нав кушодан + + Ҳамаро дар варақаҳои хусусӣ кушодан Нест кардан @@ -1077,6 +1077,8 @@ Мубодила кардан Нигоҳ доштан ҳамчун PDF + + Файли PDF эҷод карда нашуд Фиристодан ба дастгоҳ @@ -1941,7 +1943,9 @@ Бештар омӯзед - Дар асоси Pocket кор мекунад. + Дар асоси Pocket кор мекунад. + + Аз ҷониби «%s» таъмин карда шудааст. Қисми оилаи Firefox.%s diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 204d56131..ac92cfbda 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -14,6 +14,12 @@ Вимкнути приватний перегляд Введіть запит чи адресу + + Шукати в історії + + Шукати в закладках + + Шукати у вкладках Введіть пошукові терміни @@ -129,13 +135,6 @@ Кнопка показу всіх останніх вкладок - - Результати пошуку \"%1$s\" - - - Сайтів: %d Переглянути всі синхронізовані вкладки @@ -260,6 +259,9 @@ Налаштування пошуку + + Шукати: + Що нового у %1$s @@ -467,8 +469,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Недавно відвідані - Pocket + Pocket + + Розповіді, що спонукають замислитися + + Пропоновані статті від %s Матеріали від спонсорів @@ -492,12 +498,6 @@ Не вдалося змінити шпалери Докладніше - - Змінювати шпалери торканням логотипу домівки Firefox - - - Логотип Firefox - змінити шпалери, кнопка Класичні %s @@ -656,6 +656,17 @@ Закрити + + Відкрити %d вкладок? + + Відкриття такої кількості вкладок може сповільнити %s поки вони завантажуватимуться. Ви дійсно хочете продовжити? + + Відкрити вкладки + + Скасувати + %d сайт @@ -685,10 +696,6 @@ Списком Сіткою - - Пошук груп - - Групуйте пов’язані сайти разом Закривати вкладки @@ -841,18 +848,6 @@ Історія відсутня - - Синхронізовано з інших пристроїв - - З інших пристроїв - - - Увійдіть, щоб переглядати історію, синхронізовану з інших ваших пристроїв. - - Увійти - - Або створіть обліковий запис Firefox, щоб розпочати синхронізацію]]> - Завантаження вилучено @@ -902,6 +897,10 @@ Відкрити у новій вкладці Відкрити у приватній вкладці + + Відкрити всі у нових вкладках + + Відкрити всі у приватних вкладках Видалити @@ -1082,6 +1081,8 @@ Поділитися Зберегти як PDF + + Неможливо створити PDF Надіслати на пристрій @@ -1948,7 +1949,9 @@ Знайти більше - Надано Pocket. + Надано Pocket. + + Від %s. Частина родини Firefox. %s diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index f63c60758..088d99317 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -15,6 +15,12 @@ Tắt duyệt web riêng tư Tìm kiếm hoặc nhập địa chỉ + + Tìm kiếm lịch sử + + Tìm kiếm dấu trang + + Tìm kiếm thẻ Nhập từ tìm kiếm @@ -130,13 +136,6 @@ Hiển thị nút tất cả các thẻ gần đây - - Tìm kiếm của bạn cho \"%1$s\" - - - %d trang web Xem các thẻ đã đồng bộ hóa @@ -257,6 +256,9 @@ Cài đặt tìm kiếm + + Lần này tìm kiếm: + Có gì mới trong %1$s @@ -460,8 +462,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Đã xem gần đây - Pocket + Pocket + + Những câu chuyện kích động tư tưởng + + Các bài báo được cung cấp bởi %s Câu chuyện được tài trợ @@ -484,12 +490,6 @@ Không thể thay đổi hình nền Tìm hiểu thêm - - Thay đổi hình nền bằng cách nhấn vào biểu trưng trang chủ của Firefox - - - Logo Firefox - thay đổi hình nền, nút %s cổ điển @@ -646,6 +646,17 @@ Đóng + + Mở %d thẻ? + + Việc mở nhiều thẻ này có thể làm chậm %s trong khi các trang đang tải. Bạn có chắc chắn muốn tiếp tục không? + + Mở các thẻ + + Hủy bỏ + %d trang web @@ -675,10 +686,6 @@ Danh sách Lưới - - Tìm kiếm nhóm - - Nhóm các trang web liên quan lại với nhau Đóng thẻ @@ -829,18 +836,6 @@ Không có lịch sử ở đây - - Được đồng bộ hóa từ thiết bị khác - - Từ các thiết bị khác - - - Đăng nhập để xem lịch sử được đồng bộ hóa từ các thiết bị khác của bạn. - - Đăng nhập - - Hoặc tạo tài khoản Firefox để bắt đầu đồng bộ hóa]]> - Đã xóa tải xuống @@ -890,6 +885,10 @@ Mở trong thẻ mới Mở trong thẻ riêng tư + + Mở tất cả trong các thẻ mới + + Mở tất cả trong các thẻ riêng tư Xóa @@ -1069,6 +1068,8 @@ Chia sẻ Lưu dưới dạng PDF + + Không thể tạo PDF Gửi đến thiết bị @@ -1923,7 +1924,9 @@ Khám phá thêm nữa - Được cung cấp bởi Pocket. + Được cung cấp bởi Pocket. + + Được cung cấp bởi %s. Một phần của gia đình Firefox. %s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4d4e1dec1..0d88761e9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -18,6 +18,12 @@ 搜索或输入网址 + + 搜索历史记录 + + 搜索书签 + + 搜索标签页 输入搜索词 @@ -133,13 +139,6 @@ 显示所有近期标签页按钮 - - “%1$s”的搜索结果 - - - %d 个网站 查看所有同步的标签页 @@ -266,6 +265,9 @@ 搜索设置 + + 这次搜索: + %1$s 新版变化 @@ -473,8 +475,10 @@ a section where users see a list of tabs that they have visited in the past few days --> 最近访问 - Pocket + Pocket + + 精选文章 赞助内容 @@ -499,12 +503,6 @@ 无法更换壁纸 详细了解 - - 点按 Firefox 主页徽标以更换壁纸 - - - Firefox 徽标 - 也是更换壁纸的按钮 %s 经典 @@ -667,6 +665,11 @@ 关闭 + + 打开标签页 + + 取消 + %d 个网站 @@ -696,10 +699,6 @@ 列表 网格 - - 搜索分组 - - 将有关联的网站分组归并 关闭标签页 @@ -854,18 +853,6 @@ 无历史记录 - - 同步自其他设备 - - 来自其他设备 - - - 登录以查看同步自您其他设备的历史记录。 - - 登录 - - 或创建 Firefox 账户进行同步]]> - 下载记录已清除 @@ -1111,6 +1098,8 @@ 分享 保存为 PDF + + 无法生成 PDF 发送到设备 @@ -1981,7 +1970,7 @@ 探索更多 - 由 Pocket 提供 + 由 Pocket 提供 Firefox 系列产品。%s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ad2092156..308988749 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -18,6 +18,12 @@ 搜尋或輸入網址 + + 搜尋紀錄 + + 搜尋書籤 + + 搜尋分頁 輸入搜尋詞彙 @@ -131,13 +137,6 @@ 顯示所有近期分頁按鈕 - - 「%1$s」的搜尋結果 - - - %d 個網站 檢視所有同步的分頁 @@ -262,6 +261,9 @@ 搜尋設定 + + 這次搜尋: + %1$s 有什麼新鮮事 @@ -468,8 +470,12 @@ a section where users see a list of tabs that they have visited in the past few days --> 最近造訪 - Pocket + Pocket + + 發人深省的文章 + + 由 %s 提供的文章 贊助內容 @@ -493,12 +499,6 @@ 無法變更背景圖 了解更多 - - 點擊 Firefox 首頁的圖示即可更改背景圖 - - - Firefox 圖示,點擊此圖示變更背景圖 經典 %s @@ -657,6 +657,17 @@ 關閉 + + 要一次開啟 %d 個分頁嗎? + + 一次開啟這麼多分頁會使 %s 於載入頁面時變得很慢。您確定要繼續嗎? + + 開啟分頁 + + 取消 + %d 個網站 @@ -687,10 +698,6 @@ 清單 格線 - - 搜尋分頁群組 - - 將相關的網站放在一起 自動關閉分頁 @@ -844,19 +851,6 @@ 沒有紀錄 - - 從其他裝置同步過來 - - - 來自其他裝置 - - - 登入以檢視您其他裝置中的瀏覽紀錄。 - - 登入 - - 或註冊 Firefox 帳號進行同步]]> - 已移除下載紀錄 @@ -908,6 +902,10 @@ 用新分頁開啟 用新隱私分頁開啟 + + 用新分頁開啟全部 + + 用隱私保護分頁開啟全部 刪除 @@ -1099,6 +1097,8 @@ 分享 儲存為 PDF + + 無法產生 PDF 傳送到裝置 @@ -1968,7 +1968,9 @@ 探索更多 - Powered by Pocket + Powered by Pocket + + 由 %s 提供。 Firefox 系列產品。%s From 8a38f84bd087ac0e9ac82fa31ae113c112250f16 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 5 Nov 2022 15:02:08 +0000 Subject: [PATCH 316/407] Update to Android-Components 108.0.20221105143131. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 604d6edc2..5fc24ad38 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221104182737" + const val VERSION = "108.0.20221105143131" } From 61dc36be9f3bae2aea71f30fb8e7fac1be929714 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Sun, 6 Nov 2022 01:40:30 +0100 Subject: [PATCH 317/407] Import l10n. (#27727) --- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-co/strings.xml | 64 +++++++++-------- app/src/main/res/values-hr/strings.xml | 9 ++- app/src/main/res/values-ka/strings.xml | 36 +++++++++- app/src/main/res/values-kab/strings.xml | 3 + app/src/main/res/values-kk/strings.xml | 65 +++++++++-------- app/src/main/res/values-nb-rNO/strings.xml | 65 +++++++++-------- app/src/main/res/values-nn-rNO/strings.xml | 36 +++++++++- app/src/main/res/values-oc/strings.xml | 36 +++++++++- app/src/main/res/values-pl/strings.xml | 82 +++++++++++++--------- app/src/main/res/values-su/strings.xml | 64 +++++++++-------- app/src/main/res/values-tr/strings.xml | 64 ++++++++--------- app/src/main/res/values-zh-rCN/strings.xml | 14 ++++ 13 files changed, 345 insertions(+), 195 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 59aaaad8a..b4f00a140 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -654,7 +654,7 @@ Адкрыць %d картак? - Адкрыццё такой колькасці ўкладак можа запаволіць %s падчас загрузкі старонак. Вы сапраўды хочаце гэта зрабіць? + Адкрыццё такой колькасці картак можа запаволіць %s падчас загрузкі старонак. Вы сапраўды хочаце гэта зрабіць? Адкрыць карткі diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index c9086800e..c4cdf7cd5 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -15,6 +15,12 @@ Disattivà a navigazione privata Ricerca o indirizzu + + Ricercà in a cronolugia + + Ricercà in l’indette + + Ricercà in l’unghjette Stampittate i termini à ricercà @@ -133,13 +139,6 @@ Buttone per affissà tutte l’indette recente - - A vostra ricerca di « %1$s » - - - %d siti Vede tutte l’unghjette sincrunizate @@ -260,6 +259,9 @@ Preferenze di ricerca + + Ricercà sta volta : + Ciò chì hè novu in %1$s @@ -468,8 +470,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitati pocu fà - Pocket + Pocket + + Storie chì facenu riflette + + Articuli selezziunati da %s Articuli finanziati @@ -493,11 +499,6 @@ Impussibule di cambià u sfondulu di screnu Sapene di più - - Cambià u sfondulu di screnu picchichjendu u logo di a pagina d’accolta - - Logo Firefox - cambià u sfondulu di screnu, buttone %s classicu @@ -657,6 +658,17 @@ Chjode + + Apre %d unghjette ? + + L’apertura di tante unghjette pò rallentà %s durante u caricamentu di e pagine. Vulete veramente cuntinuà ? + + Apre l’unghjette + + Abbandunà + %d situ @@ -687,10 +699,6 @@ Lista Quadrittere - - Gruppi di ricerca - - Raggruppà i siti assuciati Chjode l’unghjette @@ -842,18 +850,6 @@ Alcuna cronolugia - - Sincrunizati nant’à d’altri apparechji - - Da d’altri apparechji - - - Cunnittitevi per affissà a cronolugia sincrunizata da i vostri altri apparechji. - - Cunnettesi - - O creà un contu Firefox per lancià a sincrunizazione]]> - Scaricamenti cacciati @@ -903,6 +899,10 @@ Apre in una nova unghjetta Apre in un’unghjetta privata + + Tuttu apre in unghjette nove + + Tuttu apre in unghjette private Squassà @@ -1085,6 +1085,8 @@ Sparte Arregistrà cum’è PDF + + Impussibule d’ingenerà un PDF Mandà à l’apparechju @@ -1949,7 +1951,9 @@ Scoprene di più - Funziuneghja grazia à Pocket. + Funziuneghja grazia à Pocket. + + Funziuneghja grazia à %s. Parte di a famiglia Firefox. %s diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index c3694ef0c..7fc017d31 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -424,7 +424,7 @@ a section where users see a list of tabs that they have visited in the past few days --> Nedavno posjećeno - Pocket + Pocket Sponzorirane priče @@ -588,6 +588,11 @@ Zatvori + + Otvori kartice + + Odustani + %d stranica @@ -1825,7 +1830,7 @@ Otkrij više - Pokreće Pocket. + Pokreće Pocket. Dio Firefoxove obitelji. %s diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 4129268d1..9ea828b72 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -14,6 +14,12 @@ პირადი თვალიერების გამორთვა მოძებნეთ ან შეიყვანეთ მისამართი + + ძიების ისტორია + + სანიშნების ძიება + + ჩანართების ძიება შეიყვანეთ საძიებო ფრაზა @@ -245,6 +251,9 @@ ძიების პარამეტრები + + ამჯერად გამოიყენეთ: + რა სიახლეებითაა %1$s @@ -451,8 +460,12 @@ a section where users see a list of tabs that they have visited in the past few days --> ბოლოს ნანახი - Pocket + Pocket + + მეტად დამაფიქრებელი ამბები + + სტატიებს გთავაზობთ %s დაფინანსებული ამბები @@ -633,6 +646,17 @@ დახურვა + + გაიხსნას %d ჩანართი? + + ბევრი ჩანართის გახსნამ შესაძლოა შეანელოს %s გვერდების ჩატვირთვისას. ნამდვილად გსურთ, განაგრძოთ? + + ჩანართების გახსნა + + გაუქმება + %d საიტი @@ -862,6 +886,10 @@ პირად ჩანართში გახსნა + + ყველას ახალ ჩანართებში გახსნა + + ყველას პირად ჩანართებში გახსნა წაშლა @@ -1041,6 +1069,8 @@ გაზიარება შენახვა PDF-სახით + + ვერ ხერხდება PDF-ის შექმნა მოწყობილობაზე გაგზავნა @@ -1907,7 +1937,9 @@ აღმოაჩინეთ მეტი - უზრუნველყოფს Pocket. + უზრუნველყოფს Pocket. + + უზრუნველყოფს %s. Firefox ოჯახის ნაწილი. %s diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 0b33ba247..9770acbe5 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -662,6 +662,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ldi %d waccaren? + + Tawaledyawt n wannect-a n waccaren yessaẓay %s mi ara d-ttalin yisebtar. D tidet tebɣiḍ ad tkemmleḍ? Ldi accaren diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index e7a10d853..e6d41c2e9 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -15,6 +15,12 @@ Іздеу немесе адресті енгізу + + Тарихтан іздеу + + Бетбелгілерден іздеу + + Беттерден іздеу Іздеу жолын енгізіңіз @@ -128,13 +134,6 @@ Барлық соңғы беттерді көрсету батырмасы - - \"%1$s\" бойынша іздеуіңіз - - - %d сайт Барлық синхрондалған беттерді қарау @@ -255,6 +254,9 @@ Іздеу баптаулары + + Бұл жолы іздеу: + %1$s ішінде не жаңалық @@ -457,8 +459,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Жуырда қаралған - Pocket + Pocket + + Ойландыратын әңгімелер + + %s ұсынған мақалалар Демеушілер мақалалары @@ -481,12 +487,6 @@ Тұсқағазды өзгерту мүмкін болмады Көбірек білу - - Firefox басты бетінің логотипін түрту арқылы тұсқағазды өзгертіңіз - - - Firefox логотипі - тұсқағазды, батырманы өзгерту Классикалық %s @@ -641,6 +641,17 @@ Жабу + + %d бетті ашу керек пе? + + Осыншама көп бетті ашу ол беттер жүктелгенше %s жұмысын баяулатуы мүмкін. Осыны растайсыз ба? + + Беттерді ашу + + Бас тарту + %d сайт @@ -670,10 +681,6 @@ Тізім Тор - - Іздеу топтары - - Байланысқан сайттарды біріктіру Беттерді жабу @@ -824,18 +831,6 @@ Осында тарих жоқ - - Басқа құрылғыдан синхрондалған - - Басқа құрылғылардан - - - Басқа құрылғыларыңыздан синхрондалған тарихты көру үшін жүйеге кіріңіз. - - Кіру - - Немесе синхрондауды бастау үшін Firefox тіркелгісін жасаңыз]]> - Жүктемелер өшірілді @@ -885,6 +880,10 @@ Жаңа бетте ашу Жекелік бетте ашу + + Барлығын жаңа беттерде ашу + + Барлығын жаңа жекелік беттерде ашу Өшіру @@ -1064,6 +1063,8 @@ Бөлісу PDF ретінде сақтау + + PDF жасау мүмкін емес Құрылғыға жіберу @@ -1928,7 +1929,9 @@ Көбірек шолу - Pocket негізінде. + Pocket негізінде. + + %s негізінде. Firefox отбасының бөлігі. %s diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 9aee186b0..653f87fd6 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -14,6 +14,12 @@ Slå av privat nettlesing Søk eller skriv inn adresse + + Søke i historikk + + Søk i bokmerker + + Søk i faner Skriv inn søketekst @@ -132,13 +138,6 @@ Vis alle nylige faner-knappen - - Du søkte etter «%1$s» - - - %d nettsteder Se alle synkroniserte faner @@ -261,6 +260,9 @@ Søkeinnstillinger + + Søk denne gangen: + Hva er nytt i %s @@ -465,8 +467,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nylig besøkt - Pocket + Pocket + + Tankevekkende artikler + + Artikler drevet av %s Sponsede historier @@ -489,12 +495,6 @@ Kunne ikke endre bakgrunnsbildet Les mer - - Endre bakgrunnsbilde ved å trykke på Firefox-logoen på startsiden - - - Firefox-logo - endre bakgrunn, knapp Klassisk %s @@ -654,6 +654,17 @@ Lukk + + Åpne %d faner? + + Å åpne så mange faner kan redusere hastigheten på %s mens sidene lastes. Er du sikker på at du vil fortsette? + + Åpne faner + + Avbryt + %d nettsted @@ -683,10 +694,6 @@ Liste Rutenett - - Søk i grupper - - Grupper relaterte nettsteder sammen Lukk faner @@ -837,18 +844,6 @@ Ingen historikk her - - Synkronisert fra andre enheter - - Fra andre enheter - - - Logg på for å se historikken synkronisert fra de andre enhetene dine. - - Logg inn - - Eller opprett en Firefox-konto for å begynne å synkronisere]]> - Nedlastinger fjernet @@ -898,6 +893,10 @@ Åpne i ny fane Åpne i privat fane + + Åpne alle i nye faner + + Åpne alle i private faner Slett @@ -1080,6 +1079,8 @@ Del Lagre som PDF + + Klarte ikke å generere PDF Send til enhet @@ -1954,7 +1955,9 @@ Oppdag mer - Drevet av Pocket. + Drevet av Pocket. + + Drevet av %1$s. Del av Firefox-familien. %s diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 5dc23a5f1..f1c3c0668 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -17,6 +17,12 @@ Søk eller skriv inn ei adresse + + Søkjehistorikk + + Søk i bokmerke + + Søk i faner Skriv inn søkjetekst @@ -254,6 +260,9 @@ Søkjeinnstillingar + + Søk denne gongen: + Kva er nytt i %1$s @@ -461,8 +470,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Nyleg besøkte - Pocket + Pocket + + Tankevekkjande artiklar + + Artiklar levert av %s Sponsa historier @@ -644,6 +657,17 @@ Lat att + + Opne %d faner? + + Å opne så mange faner kan seinke %s medan sidene vert lasta. Er du sikker på at du vil halde fram? + + Opne faner + + Avbryt + %d nettstad @@ -876,6 +900,10 @@ Opne i ny fane Opne i privat fane + + Opne alle i nye faner + + Opne alle i private faner Slett @@ -1057,6 +1085,8 @@ Del Lagre som PDF + + Klarte ikkje å generere PDF Send til eining @@ -1931,7 +1961,9 @@ Oppdag meir - Levert av Pocket. + Levert av Pocket. + + Driven av %s. Del av Firefox-familien. %s diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index a6a61d8ba..876727007 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -15,6 +15,12 @@ Recèrca o adreça + + Cercar dins l’istoric + + Cercar dins los marcapaginas + + Cercar pels onglets Picatz un tèrme de recèrca @@ -251,6 +257,9 @@ Paramètres de recèrca + + Aqueste còp cercar : + Qué de nòu dins %1$s @@ -458,8 +467,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitats fa res - Pocket + Pocket + + Articles suggerits + + Articles provesits per %s Istòrias pairinejadas @@ -644,6 +657,17 @@ Tampar + + Dobrir %d onglets ? + + Dobrir tan d’onglets pòt alentir %s pendent que las paginas se cargaràn. Volètz vertadièrament contunhar ? + + Dobrir los onglets + + Anullar + %d site @@ -878,6 +902,10 @@ Dobrir dins un onglet novèl Dobrir en navigacion privada + + Tot dobrir dins d’onglets novèls + + Tot dobrir dins l’onglets privats Suprimir @@ -1061,6 +1089,8 @@ Partejar Enregistrar en PDF + + Generacion PDF impossibla Enviar al periferic @@ -1939,7 +1969,9 @@ Ne descobrir mai - Propulsat per Pocket. + Propulsat per Pocket. + + Fonciona gràcia a %s. Membre de la familha Firefox. %s diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 594b5b6cd..d400aa8e5 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -15,6 +15,12 @@ Wyjdź z trybu prywatnego Wpisz adres lub szukaj + + Szukaj w historii + + Szukaj w zakładkach + + Szukaj w kartach Szukaj @@ -130,13 +136,6 @@ Przycisk wyświetlania wszystkich ostatnich kart - - Wyszukiwanie „%1$s” - - - Witryny: %d Wszystkie karty z innych urządzeń @@ -260,6 +259,9 @@ Ustawienia wyszukiwania + + Tym razem szukaj: + Co nowego w przeglądarce %1$s @@ -304,6 +306,9 @@ Twoje karty są synchronizowane! Kontynuuj w tym samym miejscu, co na drugim urządzeniu. + + Zamknij + Otwórz nową kartę w przeglądarce %1$s @@ -461,8 +466,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Ostatnio odwiedzone - Pocket + Pocket + + Artykuły skłaniające do myślenia + + Artykuły dostarczane przez %s Sponsorowane artykuły @@ -485,12 +494,6 @@ Nie udało się zmienić tapety Więcej informacji - - Zmień tapetę, stukając logo na stronie startowej Firefoksa - - - Logo Firefoksa — zmień tapetę, przycisk Klasyczny %s @@ -648,6 +651,17 @@ Zamknij + + Otworzyć wiele kart (%d)? + + Otwarcie tak wielu kart jednocześnie może spowodować spowolnienie pracy przeglądarki %s na czas wczytywania stron. Czy na pewno kontynuować? + + Otwórz karty + + Anuluj + Witryny: %d @@ -678,10 +692,6 @@ Lista Siatka - - Grupy wyszukiwań - - Grupuje powiązane witryny Zamykaj karty @@ -834,18 +844,6 @@ Nie ma jeszcze historii - - Z innych urządzeń - - Z innych urządzeń - - - Zaloguj się, aby wyświetlić historię zsynchronizowaną z innych urządzeń. - - Zaloguj się - - Lub utwórz konto Firefoksa, aby rozpocząć synchronizację]]> - Wyczyszczono listę @@ -895,6 +893,10 @@ Otwórz w nowej karcie Otwórz w prywatnej karcie + + Otwórz wszystkie w nowych kartach + + Otwórz wszystkie w prywatnych kartach Usuń @@ -1072,6 +1074,10 @@ Udostępnij + + Zapisz jako PDF + + Utworzenie pliku PDF się nie powiodło Wyślij na urządzenie @@ -1083,9 +1089,11 @@ Skopiowano do schowka - Zaloguj się do synchronizacji + Zaloguj się do synchronizacji Zaloguj się do synchronizacji + + Synchronizuj i zachowuj dane Wyślij na wszystkie urządzenia @@ -1932,7 +1940,9 @@ Odkryj więcej - Dostarczane przez Pocket. + Dostarczane przez Pocket. + + Dostarczane przez %s. Część rodziny Firefoksa. %s @@ -1946,4 +1956,12 @@ Przejdź do ustawień Podpowiedzi Firefoksa + + + + zwinąć + + rozwinąć + + otworzyć odnośnik z informacjami o tej kolekcji diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 0b81fe1b4..7ed5859a0 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -16,6 +16,12 @@ Paluruh atawa asupkeun alamat + + Paluruh jujutan + + Paluruh markah + + Paluruh tab Asupkeun istilah pamaluruhan @@ -128,13 +134,6 @@ Témbongkeun sakabéh tombol tab anyar - - Sungsian anjeun ngeunaan \"%1$s\" - - - %d loka Tingali tab anu singkron @@ -258,6 +257,9 @@ Setélan pamaluruhan + + Ayeuna paluruh: + Nu anyar di %1$s @@ -464,8 +466,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Anyar dianjangan - Saku + Saku + + Carita pikiraneun + + Artikel dijalankeun ku %s Carita anu disponsoran @@ -489,11 +495,6 @@ Teu bisa ngarobah latar Leuwih teleb - - Ganti latar ku cara noél logo tepas Firefox - - Logo Firefox - ganti latar, tombol %s klasik @@ -656,6 +657,17 @@ Tutup + + Buka %d tab? + + Muka loba tab kieu bisa matak meyeted ka %s nalika kaca-kacana dimuat. Rék diteruskeun baé? + + Buka tab + + Bolay + %d loka @@ -685,10 +697,6 @@ Béréndélan Grid - - Sungsi grup - - Gorombolkeun loka anu patali Tutup tab @@ -838,18 +846,6 @@ Teu aya jujutan di dieu - - Disingkronkeun ti séjén alat - - Ti séjén alat - - - Asup pikeun nénjo jujutan anu disingkronkeun tina parangkat anjeun nu séjén. - - Asup - - Atawa jieun akun Firefox pikeun mitembeyan nyingkronkeun]]> - Undeuran Disingkahkeun @@ -899,6 +895,10 @@ Buka dina tab anyar Buka dina tab nyamuni + + Buka kabéh dina tab anyar + + Buka kabéh dina tab nyamuni Pupus @@ -1080,6 +1080,8 @@ Bagikeun Simpen salaku PDF + + Teu bisa nyieun PDF Kirim ka parangkat @@ -1950,7 +1952,9 @@ Panggihan nu lianna - Ditanagaan ku Pocket. + Ditanagaan ku Pocket. + + Dijalankeun ku %s. Bagéan ti kulawarga Firefox. %s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c50979c74..db6b5254c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -15,6 +15,12 @@ Gizli gezintiyi kapat Arama yap veya adres yaz + + Geçmişte ara + + Yer imlerinde ara + + Sekmelerde ara Aranacak terimleri yazın @@ -130,13 +136,6 @@ Son sekmeleri göster düğmesi - - \"%1$s\" aramanız - - - %d site Tüm eşitlenmiş sekmeleri gör @@ -464,8 +463,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Son bakılanlar - Pocket + Pocket + + Merak uyandıran makaleler + + Makaleler %s tarafından derlenmektedir Sponsorlu haberler @@ -488,12 +491,6 @@ Duvar kâğıdı değiştirilemedi Daha fazla bilgi alın - - Giriş sayfasındaki Firefox logosuna dokunarak duvar kâğıdını değiştirin - - - Firefox logosu - duvar kağıdını değiştir, düğme Klasik %s @@ -651,6 +648,18 @@ Kapat + + %d sekme açılsın mı? + + Bu kadar çok sekme açmak, sayfalar yüklenirken %s tarayıcısını yavaşlatabilir. Devam etmek istediğinize emin misiniz? + + Sekmeleri aç + + + Vazgeç + %d site @@ -680,10 +689,6 @@ Liste Izgara - - Arama grupları - - İlgili siteleri gruplandırın Sekmeleri kapat @@ -836,19 +841,6 @@ Geçmiş yok - - Diğer cihazlarla eşitlendi - - Diğer cihazlardan - - - Diğer cihazlarınızdan eşitlenen geçmişi görmek için giriş yapın. - - Giriş yap - - - Veya eşitlemeye başlamak için Firefox hesabı açın]]> - İndirmeler kaldırıldı @@ -898,6 +890,10 @@ Yeni sekmede aç Gizli sekmede aç + + Tümünü yeni sekmelerde aç + + Tümünü gizli sekmelerde aç Sil @@ -1077,6 +1073,8 @@ Paylaş PDF olarak kaydet + + PDF oluşturulamadı Cihaza gönder @@ -1937,7 +1935,9 @@ Daha fazlasını keşfedin - Pocket desteğiyle. + Pocket desteğiyle. + + %s desteğiyle. Firefox ailesinden. %s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0d88761e9..160e8b9d8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -479,6 +479,8 @@ 精选文章 + + 由 %s 提供的文章 赞助内容 @@ -665,6 +667,12 @@ 关闭 + + 要打开这 %d 个标签页吗? + + 一并载入太多页面可能会减慢 %s 的运行。您确定要一并打开吗? 打开标签页 @@ -904,6 +912,10 @@ 新建标签页打开 新建隐私标签页打开 + + 新建标签页全部打开 + + 新建隐私标签页全部打开 删除 @@ -1971,6 +1983,8 @@ 探索更多 由 Pocket 提供 + + 由 %s 提供。 Firefox 系列产品。%s From c9bebbc4f95edd4c26e7c690a45eece738065535 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 6 Nov 2022 14:46:37 +0000 Subject: [PATCH 318/407] Update to Android-Components 108.0.20221106143258. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5fc24ad38..430a4cbd7 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221105143131" + const val VERSION = "108.0.20221106143258" } From 3b85861a0cb1caa7c5e7598c5b2060e11ffb8863 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 7 Nov 2022 01:32:22 +0100 Subject: [PATCH 319/407] Import l10n. (#27736) --- app/src/main/res/values-en-rGB/strings.xml | 65 +++++++++++----------- app/src/main/res/values-es-rES/strings.xml | 64 +++++++++++---------- app/src/main/res/values-fy-rNL/strings.xml | 65 +++++++++++----------- app/src/main/res/values-in/strings.xml | 64 +++++++++++---------- app/src/main/res/values-lo/strings.xml | 62 +++++++++++---------- app/src/main/res/values-pa-rIN/strings.xml | 37 +++++++++++- app/src/main/res/values-rm/strings.xml | 36 +++++++++++- app/src/main/res/values-sl/strings.xml | 17 ++++++ app/src/main/res/values-sv-rSE/strings.xml | 3 + app/src/main/res/values-tr/strings.xml | 3 + 10 files changed, 262 insertions(+), 154 deletions(-) diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 0b9a8ecb1..b290d74fe 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -14,6 +14,12 @@ Disable private browsing Search or enter address + + Search history + + Search bookmarks + + Search tabs Enter search terms @@ -129,13 +135,6 @@ Show all recent tabs button - - Your search for \"%1$s\" - - - %d sites See all synchronised tabs @@ -256,6 +255,9 @@ Search settings + + This time search: + What’s new in %1$s @@ -460,8 +462,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Recently visited - Pocket + Pocket + + Thought-provoking stories + + Articles powered by %s Sponsored stories @@ -484,12 +490,6 @@ Couldn’t change wallpaper Learn more - - Change wallpaper by tapping Firefox homepage logo - - - Firefox logo - change the wallpaper, button Classic %s @@ -645,6 +645,17 @@ Close + + Open %d tabs? + + Opening this many tabs may slow down %s while the pages are loading. Are you sure you want to continue? + + Open tabs + + Cancel + %d site @@ -674,10 +685,6 @@ List Grid - - Search groups - - Group related sites together Close tabs @@ -830,18 +837,6 @@ No history here - - Synchronised from other devices - - From other devices - - - Sign in to see history synchronised from your other devices. - - Sign in - - Or create a Firefox account to start synchronising]]> - Downloads Removed @@ -891,6 +886,10 @@ Open in new tab Open in private tab + + Open all in new tabs + + Open all in private tabs Delete @@ -1070,6 +1069,8 @@ Share Save as PDF + + Unable to generate PDF Send to device @@ -1924,7 +1925,9 @@ Discover more - Powered by Pocket + Powered by Pocket + + Powered by %s. Part of the Firefox family. %s diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index e6fc24b1e..1d121e546 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -17,6 +17,12 @@ Buscar o escribir dirección + + Buscar en el historial + + Buscar marcadores + + Buscar pestañas Introducir términos de búsqueda @@ -134,13 +140,6 @@ Mostrar el botón de todas las pestañas recientes - - Tu búsqueda por \"%1$s\" - - - %d sitios Ver todas las pestañas sincronizadas @@ -264,6 +263,9 @@ Configuración de búsquedas + + Buscar esta vez: + Novedades de %1$s @@ -470,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitados recientemente - Pocket + Pocket + + Historias que te hacen reflexionar + + Artículos impulsados por %s Historias patrocinadas @@ -494,11 +500,6 @@ No se ha podido cambiar el fondo de pantalla Saber más - - Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox - - Logotipo de Firefox - cambiar el fondo de pantalla, botón %s clásico @@ -658,6 +659,17 @@ Cerrar + + ¿Abrir %d pestañas? + + Abrir tantas pestañas puede ralentizar %s mientras se cargan las páginas. ¿Estás seguro de que quieres continuar? + + Abrir pestañas + + Cancelar + %d sitio @@ -687,10 +699,6 @@ Lista Cuadrícula - - Buscar en grupos - - Agrupar sitios relacionados Cerrar pestañas @@ -843,18 +851,6 @@ No hay ningún historial - - Sincronizado desde otros dispositivos - - Desde otros dispositivos - - - Inicia sesión para ver una lista de pestañas de tus otros dispositivos. - - Iniciar sesión - - O crea una cuenta de Firefox para empezar a sincronizar]]> - Descargas eliminadas @@ -906,6 +902,10 @@ Abrir en una nueva pestaña Abrir en una pestaña privada + + Abrir todo en pestañas nuevas + + Abrir todo en pestañas privadas Eliminar @@ -1097,6 +1097,8 @@ Compartir Guardar como PDF + + No se puede generar PDF Enviar a dispositivo @@ -1972,7 +1974,9 @@ Descubrir más - Desarrollado por Pocket. + Desarrollado por Pocket. + + Impulsado por %s. Parte de la familia Firefox. %s diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index c2e3574ef..296dd9918 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -14,6 +14,12 @@ Priveenavigaasje útskeakelje Fier sykterm of adres yn + + Skiednis trochsykje + + Blêdwizers trochsykje + + Ljepblêden trochsykje Fier syktermen yn @@ -131,13 +137,6 @@ Knop Alle resinte ljepblêden toane - - Jo sykopdracht nei ‘%1$s’ - - - %d websites Alle syngronisearre ljepblêden besjen @@ -260,6 +259,9 @@ Sykynstellingen + + Diskear sykje yn: + Wat is der nij yn %1$s @@ -464,8 +466,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Koartlyn besocht - Pocket + Pocket + + Ferhalen dy’t ta neitinken stimme + + Artikelen mooglik makke troch %s Sponsore ferhalen @@ -488,12 +494,6 @@ Kin eftergrûn net wizigje Mear ynfo - - Wizigje jo eftergrûn troch op it Firefox-startsidelogo te tikken - - - Firefox-logo – de eftergrûn, de knop wizigje Klassike %s @@ -649,6 +649,17 @@ Slute + + %d ljepblêden iepenje? + + As jo safolle ljepblêden iepenje, kin dit %s fertrage wylst it laden fan de siden. Binne jo wis dat jo trochgean wolle? + + Ljepblêden iepenje + + Annulearje + %d website @@ -678,10 +689,6 @@ List Roaster - - Groepen sykje - - Relatearre websites groepearje Ljepblêden slute @@ -831,18 +838,6 @@ Gjin skiednis hjir - - Syngronisearre fan oare apparaten ôf - - Fan oare apparaten ôf - - - Meld jo oan om fan jo oare apparaten syngronisearre skiednis te besjen. - - Oanmelde - - Of meitsje in Firefox-account om te begjinnen mei syngronisaasje]]> - Downloads fuortsmiten @@ -892,6 +887,10 @@ Iepenje yn nij ljepblêd Iepenje yn priveeljepblêd + + Alles yn nije ljepblêden iepenje + + Alles yn proveeljepblêden iepenje Fuortsmite @@ -1070,6 +1069,8 @@ Diele Bewarje as PDF + + Kin PDF net oanmeitsje Ferstjoere nei apparaat @@ -1935,7 +1936,9 @@ Mear ûntdekke - Mooglik makke troch Pocket. + Mooglik makke troch Pocket. + + Mooglik makke troch %s. Underdiel fan de Firefox-famylje. %s diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f5b7da4de..b507338a8 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -16,6 +16,12 @@ Cari atau masukkan alamat + + Riwayat pencarian + + Cari markah + + Cari tab Masukkan istilah pencarian @@ -131,13 +137,6 @@ Tampilkan tombol semua tab terbaru - - Pencarian Anda untuk \"%1$s\" - - - %d situs Lihat semua tab tersinkron @@ -262,6 +261,9 @@ Setelan pencarian + + Pencarian kali ini: + Yang baru di %1$s @@ -469,8 +471,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Baru dikunjungi - Pocket + Pocket + + Cerita yang menggugah pikiran + + Artikel diberdayakan oleh %s Konten bersponsor @@ -493,11 +499,6 @@ Tidak dapat mengubah wallpaper Pelajari lebih lanjut - - Ubah wallpaper dengan mengetuk logo beranda Firefox - - Logo Firefox - ubah wallpaper, tombol %s Klasik @@ -656,6 +657,17 @@ Tutup + + Buka %d tab? + + Membuka banyak tab seperti ini dapat memperlambat %s saat laman sedang dimuat. Yakin ingin melanjutkan? + + Tab terbuka + + Batal + %d situs @@ -685,10 +697,6 @@ Daftar Grid - - Cari grup - - Kelompokkan situs terkait bersama-sama Tutup tab @@ -840,18 +848,6 @@ Tidak ada riwayat di sini - - Disinkronkan dari perangkat lain - - Dari perangkat lainnya - - - Masuk untuk melihat riwayat yang disinkronkan dari perangkat Anda yang lain. - - Masuk - - Atau buat Firefox Account untuk memulai sinkronisasi]]> - Unduhan Dihapus @@ -902,6 +898,10 @@ Buka di tab baru Buka di tab pribadi + + Buka semua di tab baru + + Buka semua di tab pribadi Hapus @@ -1083,6 +1083,8 @@ Bagikan Simpan sebagai PDF + + Gagal membuat PDF Kirim ke peranti @@ -1942,7 +1944,9 @@ Temukan lebih banyak - Diberdayakan oleh Pocket. + Diberdayakan oleh Pocket. + + Diberdayakan oleh %s. Bagian dari keluarga Firefox. %s diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 1c742446b..ec7c39cc3 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -14,6 +14,12 @@ ປຶດນຳໃຊ້ການທ່ອງເວັບແບບສ່ວນຕົວ ຄົ້ນຫາ ຫລື ປ້ອນທີ່ຢູ່ໃສ່ + + ປະຫວັດການຊອກຫາ + + ຊອກຫາບຸກມາກ + + ຄົ້ນຫາແທັບ ປ້ອນຄຳທີ່ຕ້ອງການຄົ້ນຫາ @@ -128,12 +134,6 @@ ສະແດງປຸ່ມແທັບຫລ້າສຸດທັງຫມົດ - - ການຄົ້ນຫາຂອງທ່ານສຳລັບ \"%1$s\" - - %d ເວັບໄຊທ ເບິງແທັບທີ່ sync ທັງຫມົດ @@ -255,6 +255,9 @@ ການຕັ້ງຄ່າການຄົ້ນຫາ + + ເວລານີ້ຄົ້ນຫາ: + ສິ່ງໃໝ່ໆໃນ %1$s @@ -462,8 +465,12 @@ a section where users see a list of tabs that they have visited in the past few days --> ຫາກໍ່ເຂົ້າໄປເບິງມື້ກີ້ນີ້ - Pocket + Pocket + + ເລື່ອງທີ່ກະຕຸ້ນຄວາມຄິດ + + ບົດຄວາມທີ່ຂັບເຄື່ອນໂດຍ %s ເລື່ອງລາວທີ່ໄດ້ຮັບການສະຫນັບສະຫນູນ @@ -488,12 +495,7 @@ ບໍ່ສາມາດປ່ຽນຮູບພື້ນຫຼັງໄດ້ ຮຽນຮູ້ເພີ່ມເຕີມ - - ປ່ຽນຮູບວໍເປເປີໂດຍການແຕະໃສ່ໂລໂກ້ຂອງໜ້າຫຼັກຂອງ Firefox - - ໂລໂກ້ Firefox - ປ່ຽນຮູບວໍເປເປີ, ປຸ່ມ ຄລາດສິກ %s @@ -656,6 +658,17 @@ ປິດ + + ເປີດ %d ແຖບບໍ? + + ການເປີດຫຼາຍແຖບນີ້ອາດຈະຊ້າລົງ %s ໃນຂະນະທີ່ຫນ້າເວັບກໍາລັງໂຫລດ. ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການສືບຕໍ່? + + ເປີດແທັບ + + ຍົກເລີກ + %d ເວັບໄຊທ @@ -685,10 +698,6 @@ ລາຍການ ເສັ້ນຕາຕະລາງ - - ກຸ່ມຄົ້ນຫາ - - ຈັດກຸ່ມເວັບໄຊທີກ່ຽວຂ້ອງກັນ ປິດແທັບ @@ -843,17 +852,6 @@ ບໍ່ມີປະຫວັດການໃຊ້ງານຢູ່ນີ້ - - ຊິງຄ໌ຈາກອຸປະກອນອື່ນ - - ຈາກອຸປະກອນອື່ນ - - ເຂົ້າສູ່ລະບົບເພື່ອເບິ່ງປະຫວັດການຊິງຄ໌ຈາກອຸປະກອນອື່ນຂອງທ່ານ. - - ເຂົ້າສູ່ລະບົບ - - ຫຼືສ້າງບັນຊີ Firefox ເພື່ອເລີ່ມຕົ້ນການຊິງຄ໌]]> - ລຶບການດາວໂຫລດແລ້ວ @@ -902,6 +900,10 @@ ເປີດໃນແທັບໃຫມ່ ເປີດໃນແທັບສ່ວນຕົວ + + ເປີດທັງໝົດໃນແຖບໃໝ່ + + ເປີດທັງໝົດໃນແຖບສ່ວນຕົວ ລຶບ @@ -1083,6 +1085,8 @@ ແບ່ງປັນ ບັກທຶກເປັນ PDF + + ບໍ່ສາມາດສ້າງ PDF ໄດ້ ສົ່ງໄປຫາອຸປະກອນ @@ -1965,7 +1969,9 @@ ຄົ້ນຫາເພີ່ມເຕີມ - ຂັບເຄື່ອນໂດຍ Pocket. + ຂັບເຄື່ອນໂດຍ Pocket. + + ຂັບເຄື່ອນໂດຍ %s. ສ່ວນຫນຶ່ງຂອງຄອບຄົວ Firefox. %s diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 595e229c0..8475ecdc1 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -16,6 +16,12 @@ ਨਿੱਜੀ ਬਰਾਊਜ਼ ਕਰਨਾ ਅਸਮਰੱਥ ਕਰੋ ਖੋਜੋ ਜਾਂ ਸਿਰਨਾਵਾਂ ਦਿਓ + + ਅਤੀਤ ਖੋਜੋ + + ਬੁੱਕਮਾਰਕ ਖੋਜੋ + + ਟੈਬਾਂ ਖੋਜੋ ਖੋਜ ਸ਼ਬਦ ਭਰੋ @@ -258,6 +264,9 @@ ਖੋਜ ਸੈਟਿੰਗਾਂ + + ਇਹ ਸਮਾਂ ਖੋਜ: + %1$s ਵਿੱਚ ਨਵਾਂ ਕੀ ਹੈ @@ -464,8 +473,12 @@ a section where users see a list of tabs that they have visited in the past few days --> ਤਾਜ਼ਾ ਖੋਲ੍ਹੇ ਗਏ - Pocket + Pocket + + ਸੋਚਣ ਲਈ ਮਜ਼ਬੂਰ ਕਰਨ ਵਾਲੇ ਲੇਖ + + %s ਵਲੋਂ ਤਿਆਰ ਕੀਤੇ ਲੇਖ ਸਪਾਂਸਰ ਕੀਤੀਆਂ ਕਹਾਣੀਆਂ @@ -649,6 +662,18 @@ ਬੰਦ ਕਰੋ + + %d ਟੈਬਾਂ ਖੋਲ੍ਹਣੀਆਂ ਹਨ? + + + ਐਨੀਆਂ ਸਾਰੀਆਂ ਟੈਬਾਂ ਖੋਲ੍ਹਣ ਨਾਲ %s ਸਫ਼ੇ ਲੋਡ ਹੋਣ ਦੌਰਾਨ ਹੌਲੀ ਹੋ ਸਕਦਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਖੋਲ੍ਹਣੀਆਂ ਚਾਹੁੰਦੇ ਹੋ? + + ਟੈਬਾਂ ਖੋਲ੍ਹੋ + + ਰੱਦ ਕਰੋ + %d ਸਾਈਟ @@ -879,6 +904,10 @@ ਨਵੀਂ ਟੈਬ ‘ਚ ਖੋਲ੍ਹੋ ਨਿੱਜੀ ਟੈਬ ‘ਚ ਖੋਲ੍ਹੋ + + ਸਭ ਨੂੰ ਨਵੀਆਂ ਟੈਬਾਂ ਵਿੱਚ ਖੋਲ੍ਹੋ + + ਸਭ ਨੂੰ ਨਿੱਜੀ ਟੈਬਾਂ ਵਿੱਚ ਖੋਲ੍ਹੋ ਹਟਾਓ @@ -1059,6 +1088,8 @@ ਸਾਂਝਾ ਕਰੋ PDF ਵਜੋਂ ਸੰਭਾਲੋ + + PDF ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ ਡਿਵਾਈਸ ‘ਤੇ ਭੇਜੋ @@ -1923,7 +1954,9 @@ ਹੋਰ ਲੱਭੋ - Pocket ਵਲੋਂ ਇਖ਼ਤਿਆਰ + Pocket ਵਲੋਂ ਇਖ਼ਤਿਆਰ + + %s ਦੀ ਸਹਾਇਤਾ ਨਾਲ Firefox ਪਰਿਵਾਰ ਦਾ ਹਿੱਸਾ। %s diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index e3ff691f8..23730d837 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -14,6 +14,12 @@ Deactivar il modus privat Tschertgar u endatar in\'adressa + + Tschertgar en la cronologia + + Tschertgar en ils segnapaginas + + Tschertgar en ils tabs Endatar ils terms da tschertga @@ -247,6 +253,9 @@ Parameters da tschertga + + Tschertgar questa giada: + Las novaziuns en %1$s @@ -450,8 +459,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visità dacurt - Pocket + Pocket + + Istorgias che dattan da pensar + + Artitgels da %s Artitgels sponsurads @@ -630,6 +643,17 @@ Serrar + + Avrir %d tabs? + + Cun avrir tants tabs vegn %s eventualmain ralentà durant che las paginas vegnan chargiadas. Vuls ti propi cuntinuar? + + Avrir ils tabs + + Interrumper + %d website @@ -856,6 +880,10 @@ Avrir en in nov tab Avrir en in tab privat + + Avrir tuts en novs tabs + + Avrir tuts en tabs privats Stizzar @@ -1034,6 +1062,8 @@ Cundivider Memorisar sco PDF + + Impussibel da generar il PDF Trametter a l\'apparat @@ -1909,7 +1939,9 @@ Scuvrir dapli - Cun tecnologia da Pocket. + Cun tecnologia da Pocket. + + Cun agid da %s. Part da la paletta da products Firefox. %s diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 745c6a5ea..4b39bebe5 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -19,6 +19,8 @@ Zgodovina iskanja Iskanje po zaznamkih + + Išči po zavihkih Vnesite iskalni niz @@ -256,6 +258,9 @@ Nastavitve iskanja + + Tokrat išči: + Kaj je novega v %1$su @@ -467,6 +472,8 @@ Zgodbe, ki spodbujajo k razmisleku + + Članke zagotavlja %s Sponzorirane zgodbe @@ -650,6 +657,12 @@ Zapri + + Odprem več zavihkov (%d)? + + Odpiranje tako velikega števila zavihkov lahko upočasni %s med nalaganjem strani. Ali ste prepričani, da želite nadaljevati? Odpri zavihke @@ -1262,6 +1275,8 @@ Nadaljujte, kjer ste končali Prinesite zaznamke, zgodovino in gesla v %1$s na tej napravi. + + Sinhronizirajte zavihke in gesla med napravami za brezhibno preklapljanje med zasloni. Prijava @@ -1274,6 +1289,8 @@ Privzeta zaščita zasebnosti %1$s samodejno prepreči, da bi vas podjetja skrivaj spremljala po spletu. + + Vključuje popolno zaščito pred piškotki, ki sledilcem onemogoča, da bi vas s pomočjo piškotkov zalezovali po spletnih mestih. Običajno (privzeto) diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 15075c6b1..4c1cf741d 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -262,6 +262,9 @@ Sökinställningar + + Denna sökning: + Vad är nytt i %1$s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index db6b5254c..0ca3906cc 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -258,6 +258,9 @@ Arama ayarları + + Bununla ara: + %1$s tarayıcınızdaki yenilikler From c2dbba996ae0e4ec6fabc5cd724a0d1fed3e131d Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 7 Nov 2022 14:47:41 +0000 Subject: [PATCH 320/407] Update to Android-Components 108.0.20221107143052. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 430a4cbd7..a55bd58e9 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221106143258" + const val VERSION = "108.0.20221107143052" } From bfc385ffce64d5d780ae01bbdc4d7fc9a70a4143 Mon Sep 17 00:00:00 2001 From: Gregory Mierzwinski Date: Fri, 4 Nov 2022 08:26:25 -0400 Subject: [PATCH 321/407] Bug 1793823 - Disable perf tests running on P2. --- taskcluster/ci/browsertime/kind.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/taskcluster/ci/browsertime/kind.yml b/taskcluster/ci/browsertime/kind.yml index 13b05183c..3789a0463 100644 --- a/taskcluster/ci/browsertime/kind.yml +++ b/taskcluster/ci/browsertime/kind.yml @@ -17,7 +17,6 @@ only-for-build-types: only-for-abis: - armeabi-v7a - - arm64-v8a task-defaults: attributes: @@ -43,12 +42,10 @@ task-defaults: tier: 2 platform: by-abi: - arm64-v8a: android-hw-p2-8-0-android-aarch64-shippable-qr/opt armeabi-v7a: android-hw-a51-11-0-aarch64-shippable-qr/opt worker-type: by-abi: armeabi-v7a: t-bitbar-gw-perf-a51 - arm64-v8a: t-bitbar-gw-perf-p2 worker: max-run-time: 3600 env: From ac64ec9efffcf15ff0019a59f8e6a7b18fab5f70 Mon Sep 17 00:00:00 2001 From: mozilla-l10n-automation-bot <54512241+mozilla-l10n-automation-bot@users.noreply.github.com> Date: Mon, 7 Nov 2022 18:55:55 +0100 Subject: [PATCH 322/407] Import l10n. (#27741) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/src/main/res/values-da/strings.xml | 65 +++++++++++---------- app/src/main/res/values-eo/strings.xml | 80 ++++++++++++++++---------- app/src/main/res/values-es/strings.xml | 64 +++++++++++---------- 3 files changed, 118 insertions(+), 91 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 7e04a7a2f..dd44c635d 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -14,6 +14,12 @@ Deaktiver privat browsing Søg eller indtast adresse + + Søg i historik + + Søg i bogmærker + + Søg i faneblade Indtast søgestrenge @@ -130,13 +136,6 @@ Knap til visning af alle seneste faneblade - - Din søgning efter \"%1$s\" - - - %d websteder Vis alle synkroniserede faneblade @@ -257,6 +256,9 @@ Søgeindstillinger + + Søg denne gang med: + Nyheder i %1$s @@ -459,8 +461,12 @@ Besøgt for nylig - Pocket + Pocket + + Tankevækkende historier + + Artikler leveret af %s Sponsorerede historier @@ -483,12 +489,6 @@ Kunne ikke ændre baggrund Læs mere - - Skift baggrund ved at trykke på Firefox-logoet på startsiden - - - Firefox-logo - skift baggrund, knap Klassisk %s @@ -645,6 +645,17 @@ Luk + + Åbn %d faneblade? + + Åbning af så mange faneblade kan gøre %s langsommere, mens siderne indlæses. Er du sikker på, at du vil fortsætte? + + Åbn faneblade + + Annuller + %d websted @@ -674,10 +685,6 @@ Liste Gitter - - Søgegrupper - - Gruppér relaterede websteder Luk faneblade @@ -827,18 +834,6 @@ Ingen historik - - Synkroniseret fra andre enheder - - Fra andre enheder - - - Log ind for at se historik synkroniseret fra dine andre enheder. - - Log ind - - Eller opret en Firefox-konto for at starte synkroniseringen]]> - Filhentninger fjernet @@ -888,6 +883,10 @@ Åbn i nyt faneblad Åbn i privat faneblad + + Åbn alle i nye faneblade + + Åbn alle i private faneblade Slet @@ -1066,6 +1065,8 @@ Del Gem som PDF + + Kan ikke generere PDF-fil Send til enhed @@ -1921,7 +1922,9 @@ Opdag mere - Leveret af Pocket. + Leveret af Pocket. + + Leveret af %s. En del af Firefox-familien. %s diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index f1a5ba73c..88c00d59d 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -15,6 +15,12 @@ Malaktivigi privatan retumon Serĉo aŭ adreso + + Serĉi en historio + + Serĉi legosignojn + + Serĉi langetojn Tajpu serĉan tekston @@ -128,12 +134,6 @@ Butono por montri ĉiujn lastajn langetojn - - Via serĉo de \"%1$s\" - - %d retejoj Montri ĉiujn spegulitajn langetojn @@ -254,6 +254,9 @@ Agordoj de serĉo + + Ĉi foje serĉi: + Novaĵoj en %1$s @@ -299,6 +302,9 @@ Viaj langetoj estas spegulataj! Daŭrigu kie vi haltis en via alia aparato. + + Fermi + Malfermi novan langeton de %1$s @@ -455,7 +461,11 @@ a section where users see a list of tabs that they have visited in the past few days --> Ĵusaj retpaĝoj - Pocket + Pocket + + Pensigaj artikoloj + + Artikoloj sugestitaj de %s Patronitaj artikoloj @@ -479,11 +489,6 @@ Ne eblis ŝanĝi ekranfonon Pli da informo - - Ŝanĝi ekranfonon per tuŝeto de la emblemo de Firefox en la eka paĝo - - Emblemo de Firefox – ŝanĝi ekranfonon, butono Klasika %s @@ -642,6 +647,17 @@ Fermi + + Ĉu malfermi %d langetojn? + + Malfermi tiom da langetoj povas malrapidigi %s, dum la paĝoj ŝargiĝas. Ĉu vi certe volas daŭrigi? + + Malfermi langetojn + + Nuligi + %d retejo @@ -672,10 +688,6 @@ Listo Krado - - Grupoj de serĉoj - - Grupigi rilatitajn retejojn Fermi langetojn @@ -828,18 +840,6 @@ Neniu historio estas ĉi tie - - Spegulita de aliaj aparatoj - - El aliaj aparatoj - - - Komencu seancon por vidi la spegulitan historion el viaj aliaj aparatoj. - - Komenci seancon - - Aŭ kreu konton de Firefox por komenci speguli]]> - Elŝutoj forigitaj @@ -890,6 +890,10 @@ Malfermi en nova langeto Malfermi en privata langeto + + Malfermi ĉiujn en novaj langetoj + + Malfermi ĉiujn en privataj langetoj Forigi @@ -1070,6 +1074,10 @@ "Share" button. Opens the share menu when pressed. --> Dividi + + Konservi kiel PDF + + Ne eblas krei dosieron PDF Sendi al aparato @@ -1081,9 +1089,11 @@ Kopiita al la tondujo - Komenci seancon por speguli + Komenci seancon por speguli Komenci seancon en Speguli + + Speguli kaj konservi datumojn Sendi al ĉiuj aparatoj @@ -1937,7 +1947,9 @@ Malkovri pli da aferoj - Pelata de Pocket. + Pelata de Pocket. + + Kun teknologio de %s. Parto de la familio de Firefox. %s @@ -1951,4 +1963,12 @@ Iri al agordoj Sugestoj de Firefox + + + + faldi + + malfaldi + + malfermi ligilon por havi pli da informo pri tiu ĉi kolekto diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e6fc24b1e..1d121e546 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,6 +17,12 @@ Buscar o escribir dirección + + Buscar en el historial + + Buscar marcadores + + Buscar pestañas Introducir términos de búsqueda @@ -134,13 +140,6 @@ Mostrar el botón de todas las pestañas recientes - - Tu búsqueda por \"%1$s\" - - - %d sitios Ver todas las pestañas sincronizadas @@ -264,6 +263,9 @@ Configuración de búsquedas + + Buscar esta vez: + Novedades de %1$s @@ -470,8 +472,12 @@ a section where users see a list of tabs that they have visited in the past few days --> Visitados recientemente - Pocket + Pocket + + Historias que te hacen reflexionar + + Artículos impulsados por %s Historias patrocinadas @@ -494,11 +500,6 @@ No se ha podido cambiar el fondo de pantalla Saber más - - Cambia el fondo de pantalla tocando el logotipo de la página de inicio de Firefox - - Logotipo de Firefox - cambiar el fondo de pantalla, botón %s clásico @@ -658,6 +659,17 @@ Cerrar + + ¿Abrir %d pestañas? + + Abrir tantas pestañas puede ralentizar %s mientras se cargan las páginas. ¿Estás seguro de que quieres continuar? + + Abrir pestañas + + Cancelar + %d sitio @@ -687,10 +699,6 @@ Lista Cuadrícula - - Buscar en grupos - - Agrupar sitios relacionados Cerrar pestañas @@ -843,18 +851,6 @@ No hay ningún historial - - Sincronizado desde otros dispositivos - - Desde otros dispositivos - - - Inicia sesión para ver una lista de pestañas de tus otros dispositivos. - - Iniciar sesión - - O crea una cuenta de Firefox para empezar a sincronizar]]> - Descargas eliminadas @@ -906,6 +902,10 @@ Abrir en una nueva pestaña Abrir en una pestaña privada + + Abrir todo en pestañas nuevas + + Abrir todo en pestañas privadas Eliminar @@ -1097,6 +1097,8 @@ Compartir Guardar como PDF + + No se puede generar PDF Enviar a dispositivo @@ -1972,7 +1974,9 @@ Descubrir más - Desarrollado por Pocket. + Desarrollado por Pocket. + + Impulsado por %s. Parte de la familia Firefox. %s From 3c0aaa75c0348ddbc5e783a43a0633b4cee57a5a Mon Sep 17 00:00:00 2001 From: Alexander Gramiak Date: Sun, 23 Oct 2022 00:12:09 -0600 Subject: [PATCH 323/407] For #27511: Remove duplicate padding update code This padding update is already performed in FenixSnackbar.make when isDisplayedWithBrowserToolbar is true, and that variable has no other side-effects, so simply use that code. --- .../main/java/org/mozilla/fenix/utils/Undo.kt | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Undo.kt b/app/src/main/java/org/mozilla/fenix/utils/Undo.kt index cb6fb9b1b..e06f61714 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Undo.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Undo.kt @@ -6,13 +6,10 @@ package org.mozilla.fenix.utils import android.content.Context import android.view.View -import androidx.appcompat.widget.ContentFrameLayout -import androidx.core.view.updatePadding import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.ext.settings import java.util.concurrent.atomic.AtomicBoolean @@ -66,7 +63,7 @@ fun CoroutineScope.allowUndo( .make( view = view, duration = FenixSnackbar.LENGTH_INDEFINITE, - isDisplayedWithBrowserToolbar = false, + isDisplayedWithBrowserToolbar = paddedForBottomToolbar, ) .setText(message) .setAnchorView(anchorView) @@ -81,27 +78,6 @@ fun CoroutineScope.allowUndo( snackbar.view.elevation = it } - val shouldUseBottomToolbar = view.context.settings().shouldUseBottomToolbar - val toolbarHeight = view.resources.getDimensionPixelSize(R.dimen.browser_toolbar_height) - val dynamicToolbarEnabled = view.context.settings().isDynamicToolbarEnabled - - snackbar.view.updatePadding( - bottom = if ( - paddedForBottomToolbar && - shouldUseBottomToolbar && - // If the view passed in is a ContentFrameLayout, it does not matter - // if the user has a dynamicBottomToolbar or not, as the Android system - // can't intelligently position the snackbar on the upper most view. - // Ideally we should not pass ContentFrameLayout in, but it's the only - // way to display snackbars through a fragment transition. - (view is ContentFrameLayout || !dynamicToolbarEnabled) - ) { - toolbarHeight - } else { - 0 - }, - ) - snackbar.show() // Wait a bit, and if user didn't request cancellation, proceed with From 9524ab48457765f0a833a3d89fdb0a6e6c59b369 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 7 Nov 2022 19:31:43 +0000 Subject: [PATCH 324/407] Update to Android-Components 108.0.20221107190113. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index a55bd58e9..24431987e 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "108.0.20221107143052" + const val VERSION = "108.0.20221107190113" } From 82fb016098c0af93357c1dfecf08db9c0a7adf04 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Fri, 4 Nov 2022 13:49:32 -0700 Subject: [PATCH 325/407] Revert "For #26606 - Add backplating to Top Sites --- app/src/main/res/layout/top_site_item.xml | 113 ++++++++++------------ app/src/main/res/values/dimens.xml | 8 +- app/src/main/res/values/styles.xml | 13 +-- 3 files changed, 59 insertions(+), 75 deletions(-) diff --git a/app/src/main/res/layout/top_site_item.xml b/app/src/main/res/layout/top_site_item.xml index f29343ed7..fef83a745 100644 --- a/app/src/main/res/layout/top_site_item.xml +++ b/app/src/main/res/layout/top_site_item.xml @@ -2,76 +2,65 @@ - + android:id="@+id/favicon_card" + style="@style/TopSite.FaviconCard" + android:importantForAccessibility="noHideDescendants" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> - - - - - - - - - - + + - + - + -
+ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d0f0286df..31d9741df 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -167,16 +167,14 @@ 48dp - 4dp 12dp - 2dp + 6dp 36dp 0dp 4dp - 84dp - 72dp - 8dp + 60dp + 12dp 6dp 8dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 256f99ce9..10786bec0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -674,14 +674,11 @@ 0.001 - From c59b0845a0ff6c7663f58a7c51460a871cf681f0 Mon Sep 17 00:00:00 2001 From: Noah Bond Date: Mon, 7 Nov 2022 13:57:01 -0800 Subject: [PATCH 326/407] For #27746 - Move top sites text outside of backplating --- .../java/org/mozilla/fenix/ui/TopSitesTest.kt | 6 +++++ .../home/topsites/TopSiteItemViewHolder.kt | 24 ++++++++++++++++++- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt index e0c94db21..67561676f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt @@ -9,6 +9,7 @@ import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -235,6 +236,7 @@ class TopSitesTest { @SmokeTest @Test + @Ignore("Design was reverted: https://github.com/mozilla-mobile/fenix/issues/27714") fun verifySponsoredShortcutsListTest() { homeScreen { var sponsoredShortcutTitle = getSponsoredShortcutTitle(2) @@ -253,6 +255,7 @@ class TopSitesTest { } @Test + @Ignore("Design was reverted: https://github.com/mozilla-mobile/fenix/issues/27714") fun openSponsoredShortcutTest() { var sponsoredShortcutTitle = "" @@ -264,6 +267,7 @@ class TopSitesTest { } @Test + @Ignore("Design was reverted: https://github.com/mozilla-mobile/fenix/issues/27714") fun openSponsoredShortcutInPrivateBrowsingTest() { var sponsoredShortcutTitle = "" @@ -276,6 +280,7 @@ class TopSitesTest { } @Test + @Ignore("Design was reverted: https://github.com/mozilla-mobile/fenix/issues/27714") fun verifySponsoredShortcutsSponsorsAndPrivacyOptionTest() { var sponsoredShortcutTitle = "" @@ -288,6 +293,7 @@ class TopSitesTest { } @Test + @Ignore("Design was reverted: https://github.com/mozilla-mobile/fenix/issues/27714") fun verifySponsoredShortcutsSettingsOptionTest() { var sponsoredShortcutTitle = "" diff --git a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt index d9c4cfe9e..2176cd000 100644 --- a/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt @@ -5,13 +5,17 @@ package org.mozilla.fenix.home.topsites import android.annotation.SuppressLint +import android.content.res.ColorStateList import android.view.MotionEvent import android.view.View import android.widget.PopupWindow import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import androidx.core.widget.TextViewCompat import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.Dispatchers.IO @@ -21,6 +25,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.feature.top.sites.TopSite import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged import org.mozilla.fenix.GleanMetrics.Pings import org.mozilla.fenix.GleanMetrics.TopSites @@ -92,7 +97,24 @@ class TopSiteItemViewHolder( } } - binding.topSiteCard.setCardBackgroundColor(backgroundColor) + binding.faviconCard.setCardBackgroundColor(backgroundColor) + + val textColor = currentState.currentWallpaper.textColor + if (textColor != null) { + val color = Color(textColor).toArgb() + val colorList = ColorStateList.valueOf(color) + binding.topSiteTitle.setTextColor(color) + binding.topSiteSubtitle.setTextColor(color) + TextViewCompat.setCompoundDrawableTintList(binding.topSiteTitle, colorList) + } else { + binding.topSiteTitle.setTextColor( + view.context.getColorFromAttr(R.attr.textPrimary), + ) + binding.topSiteSubtitle.setTextColor( + view.context.getColorFromAttr(R.attr.textSecondary), + ) + TextViewCompat.setCompoundDrawableTintList(binding.topSiteTitle, null) + } } } } diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 31d9741df..4d59261aa 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -174,6 +174,7 @@ 4dp 60dp + 4dp 12dp 6dp 8dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 10786bec0..fe7e269c9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -677,6 +677,7 @@