diff --git a/README.md b/README.md index e551ba383..3ac60cb6d 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,21 @@ because we find ourselves in a constant need to prioritize certain issues/PRs over others. If you think your issue/PR is very important, try to popularize it by getting other users to comment and share their point of view. +## I want to file an issue! + +Great! We encourage you to participate in this open source project. We love Pull Requests, Bug Reports, ideas, (security) code reviews or any other kind of positive contribution. + +To make it easier to triage, we have these issue requirements: + +* Please do your best to search for duplicate issues before filing a new issue so we can keep our issue board clean. +* Every issue should have **exactly** one bug/feature request described in it. Please do not file meta feedback list tickets as it is difficult to parse them and address their individual points. +* Feature Requests are better when they’re open-ended instead of demanding a specific solution -ie “I want an easier way to do X” instead of “add Y” +* Issues are not the place to go off topic or debate. If you have questions, please join the [#fenix:mozilla.org channel](https://chat.mozilla.org/#/room/#fenix:mozilla.org). +* Please always remember our [Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) +* Please do not tag specific team members to try to get your issue looked at faster. We have a triage process that will tag and label issues correctly in due time. If you think an issue is very severe, you can ask about it in Matrix. + +Please keep in mind that even though a feature you have in mind may seem like a small ask, as a small team, we have to prioritize our planned work and every new feature adds complexity and maintenance and may take up design, research, marketing, product, and engineering time. We appreciate everyone’s passion but we will not be able to incorporate every feature request or even fix every bug. That being said, just because we haven't replied, doesn't mean we don't care about the issue, please be patient with our response times as we're very busy. + ## Getting Involved Before you attempt to make a contribution please read the [Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/). diff --git a/app/build.gradle b/app/build.gradle index 37fffdca6..4d96ac73b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ import org.mozilla.fenix.gradle.tasks.LintUnitTestRunner import static org.gradle.api.tasks.testing.TestResult.ResultType android { - compileSdkVersion 28 + compileSdkVersion Config.compileSdkVersion defaultConfig { applicationId "org.mozilla" minSdkVersion Config.minSdkVersion 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 9b7af551e..2ae01aa50 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -9,7 +9,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build -import android.preference.PreferenceManager +import androidx.preference.PreferenceManager import androidx.test.espresso.Espresso.onView import androidx.test.espresso.ViewAction import androidx.test.espresso.action.CoordinatesProvider diff --git a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/SyncIntegrationTest.kt b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/SyncIntegrationTest.kt index 24235ac46..283a46e05 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/syncintegration/SyncIntegrationTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/syncintegration/SyncIntegrationTest.kt @@ -6,35 +6,32 @@ package org.mozilla.fenix.syncintegration import android.os.SystemClock.sleep import android.widget.EditText - import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText - -import org.junit.Rule -import org.junit.Test -import org.mozilla.fenix.helpers.HomeActivityTestRule - import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiSelector -import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import okhttp3.mockwebserver.MockWebServer import org.hamcrest.Matchers.allOf import org.junit.After import org.junit.Before +import org.junit.Rule +import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.ext.toUri import org.mozilla.fenix.helpers.ext.waitNotNull -import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.accountSettings -import org.mozilla.fenix.ui.robots.settingsSubMenuLoginsAndPassword -import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.settingsSubMenuLoginsAndPassword @Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") class SyncIntegrationTest { @@ -185,7 +182,7 @@ class SyncIntegrationTest { .className(EditText::class.java)) emailInput.waitForExists(TestAssetHelper.waitingTime) - val emailAddress = javaClass.classLoader.getResource("email.txt").readText() + val emailAddress = javaClass.classLoader!!.getResource("email.txt").readText() emailInput.setText(emailAddress) } @@ -199,7 +196,7 @@ class SyncIntegrationTest { .instance(0) .className(EditText::class.java)) - val passwordValue = javaClass.classLoader.getResource("password.txt").readText() + val passwordValue = javaClass.classLoader!!.getResource("password.txt").readText() passwordInput.setText(passwordValue) } 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 9fc35148f..225cf62a6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/DownloadTest.kt @@ -55,6 +55,7 @@ class DownloadTest { } } + @Suppress("Deprecation") @After fun tearDown() { mockWebServer.shutdown() 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 d75a58608..9265b1b8c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.ui +import androidx.core.net.toUri import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer @@ -62,4 +63,158 @@ class SmokeTest { } } } + + @Test + fun verifyPageMainMenuItemsListInPortraitNormalModeTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + // Add this to check openInApp and youtube is a default app available in every Android emulator/device + val youtubeUrl = "www.youtube.com" + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + }.openThreeDotMenu { + verifyThreeDotMainMenuItems() + verifySaveCollection() + }.clickAddOnsReportSiteIssue { + verifyUrl("webcompat.com/issues/new") + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openHistory { + verifyTestPageUrl(defaultWebPage.url) + }.goBackToBrowser { + }.openThreeDotMenu { + }.openBookmarks { + verifyBookmarksMenuView() + verifyEmptyBookmarksList() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openSyncedTabs { + verifyNavigationToolBarHeader() + verifySyncedTabsStatus() + }.goBack { + }.openThreeDotMenu { + }.openSettings { + verifySettingsView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openFindInPage { + verifyFindInPageSearchBarItems() + }.closeFindInPage { + }.openThreeDotMenu { + }.addToFirefoxHome { + verifySnackBarText("Added to top sites!") + }.openTabDrawer { + }.openHomeScreen { + verifyExistingTopSitesTabs(defaultWebPage.title) + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openAddToHomeScreen { + verifyShortcutNameField(defaultWebPage.title) + clickAddShortcutButton() + clickAddAutomaticallyButton() + }.openHomeScreenShortcut(defaultWebPage.title) { + }.openThreeDotMenu { + }.openSaveToCollection { + verifyCollectionNameTextField() + }.goBackToBrowser { + }.openThreeDotMenu { + }.bookmarkPage { + verifySnackBarText("Bookmark saved!") + }.openThreeDotMenu { + }.sharePage { + verifyShareAppsLayout() + }.closeShareDialogReturnToPage { + }.openThreeDotMenu { + }.refreshPage { + verifyUrl(defaultWebPage.url.toString()) + }.openTabDrawer { + closeTabViaXButton(defaultWebPage.title) + }.openHomeScreen { + navigationToolbar { + }.enterURLAndEnterToBrowser(youtubeUrl.toUri()) { + verifyBlueDot() + }.openThreeDotMenu { + verifyOpenInAppButton() + } + } + } + + @Test + fun verifyPageMainMenuItemsListInPortraitPrivateModeTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + // Add this to check openInApp and also youtube is a default app available in every Android emulator/device + val youtubeUrl = "www.youtube.com" + + homeScreen { + togglePrivateBrowsingModeOnOff() + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + }.openThreeDotMenu { + verifyThreeDotMainMenuItems() + }.clickAddOnsReportSiteIssue { + verifyUrl("webcompat.com/issues/new") + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openHistory { + verifyEmptyHistoryView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openBookmarks { + verifyBookmarksMenuView() + verifyEmptyBookmarksList() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openSyncedTabs { + verifyNavigationToolBarHeader() + verifySyncedTabsStatus() + }.goBack { + }.openThreeDotMenu { + }.openSettings { + verifySettingsView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openFindInPage { + verifyFindInPageSearchBarItems() + }.closeFindInPage { + }.openThreeDotMenu { + }.addToFirefoxHome { + verifySnackBarText("Added to top sites!") + }.openTabDrawer { + }.openHomeScreen { + togglePrivateBrowsingModeOnOff() + verifyExistingTopSitesTabs(defaultWebPage.title) + togglePrivateBrowsingModeOnOff() + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openAddToHomeScreen { + verifyShortcutNameField(defaultWebPage.title) + clickAddShortcutButton() + clickAddAutomaticallyButton() + }.openHomeScreenShortcut(defaultWebPage.title) { + }.openThreeDotMenu { + }.bookmarkPage { + verifySnackBarText("Bookmark saved!") + }.openThreeDotMenu { + }.sharePage { + verifyShareAppsLayout() + }.closeShareDialogReturnToPage { + }.openThreeDotMenu { + }.refreshPage { + verifyUrl(defaultWebPage.url.toString()) + }.openTabDrawer { + closeTabViaXButton(defaultWebPage.title) + }.openHomeScreen { + navigationToolbar { + }.enterURLAndEnterToBrowser(youtubeUrl.toUri()) { + verifyBlueDot() + }.openThreeDotMenu { + verifyOpenInAppButton() + } + } + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt index 14c0ffaf7..bfb6b1ce9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt @@ -8,14 +8,19 @@ import android.os.Build import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.clearText import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 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.By.textContains import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until +import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.anyOf +import org.junit.Assert import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.click @@ -26,6 +31,8 @@ import org.mozilla.fenix.helpers.ext.waitNotNull */ class AddToHomeScreenRobot { + fun verifyShortcutIcon() = assertShortcutIcon() + fun addShortcutName(title: String) { mDevice.waitNotNull(Until.findObject(By.text("Add to Home screen")), waitingTime) shortcutNameField() @@ -33,6 +40,8 @@ class AddToHomeScreenRobot { .perform(typeText(title)) } + fun verifyShortcutNameField(expectedText: String) = assertShortcutNameField(expectedText) + fun clickAddShortcutButton() = addButton().click() fun clickAddAutomaticallyButton() { @@ -77,7 +86,21 @@ fun addToHomeScreen(interact: AddToHomeScreenRobot.() -> Unit): AddToHomeScreenR private fun shortcutNameField() = onView(withId(R.id.shortcut_text)) +private fun assertShortcutNameField(expectedText: String) { + onView(allOf(withId(R.id.shortcut_text), + withText(expectedText))) + .check(matches(isCompletelyDisplayed())) +} + private fun addButton() = onView(anyOf(withText("ADD"))) private fun addAutomaticallyButton() = mDevice.findObject(UiSelector().textContains("add automatically")) + +private fun assertShortcutIcon() { + mDevice.wait( + Until.findObject(text("Firefox Preview")), + waitingTime + ) + Assert.assertTrue(mDevice.hasObject(By.text("Firefox Preview"))) +} 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 0255f7c0a..3a37b6978 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 @@ -132,6 +132,8 @@ class BookmarksRobot { addFolderButton().click() } + fun clickdeleteBookmarkButton() = deleteBookmarkButton().click() + fun addNewFolderName(name: String) { addFolderTitleField() .click() @@ -188,6 +190,23 @@ class BookmarksRobot { return Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + closeButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun confirmBookmarkFolderDeletionAndGoBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + onView(withText(R.string.delete_browsing_data_prompt_allow)) + .inRoot(RootMatchers.isDialog()) + .check(matches(isDisplayed())) + .click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openThreeDotMenu(interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition { mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu"))) threeDotMenu().click() @@ -248,6 +267,8 @@ private fun addFolderTitleField() = onView(withId(R.id.bookmarkNameEdit)) private fun saveFolderButton() = onView(withId(R.id.confirm_add_folder_button)) +private fun deleteBookmarkButton() = onView(withId(R.id.delete_bookmark_button)) + private fun threeDotMenu(bookmarkUrl: Uri) = onView( allOf( withId(R.id.overflow_menu), 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 5ec323f8a..02d1d4e67 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 @@ -157,6 +157,8 @@ class BrowserRobot { fun verifyMenuButton() = assertMenuButton() + fun verifyBlueDot() = assertBlueDot() + fun verifyNavURLBarItems() { verifyEnhancedTrackingOptions() pressBack() @@ -448,3 +450,10 @@ private fun mediaPlayerPlayButton() = .clazz("android.widget.Button") .textContains("Play") ) + +private fun assertBlueDot() { + onView(withId(R.id.notification_dot)) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun addOnsReportSiteIssue() = onView(withText("Report Site Issue")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt index ea53de5a1..9472a20a3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt @@ -29,10 +29,18 @@ class FindInPageRobot { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!! + fun verifyFindInPageQuery() = assertFindInPageQuery()!! fun verifyFindInPageNextButton() = assertFindInPageNextButton()!! fun verifyFindInPagePrevButton() = assertFindInPagePrevButton()!! fun verifyFindInPageCloseButton() = assertFindInPageCloseButton()!! + fun verifyFindInPageSearchBarItems() { + verifyFindInPageQuery() + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + } + fun enterFindInPageQuery(expectedText: String) { mDevice.waitNotNull(Until.findObject(By.res("org.mozilla.fenix.debug:id/find_in_page_query_text")), waitingTime) findInPageQuery().perform(clearText()) @@ -73,6 +81,9 @@ private fun findInPageNextButton() = onView(withId(R.id.find_in_page_next_btn)) private fun findInPagePrevButton() = onView(withId(R.id.find_in_page_prev_btn)) private fun findInPageCloseButton() = onView(withId(R.id.find_in_page_close_btn)) +private fun assertFindInPageQuery() = findInPageQuery() + .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertFindInPageNextButton() = findInPageNextButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt index 5ca48ee5a..792ad6e6e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt @@ -90,6 +90,13 @@ class HistoryRobot { return Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + closeButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openThreeDotMenu(interact: ThreeDotMenuHistoryItemRobot.() -> Unit): ThreeDotMenuHistoryItemRobot.Transition { 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 e12c5242f..483ad546f 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 @@ -5,6 +5,7 @@ package org.mozilla.fenix.ui.robots import android.net.Uri +import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -14,12 +15,14 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withChild 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.helpers.TestAssetHelper /* * Implementation of Robot Pattern for the multiple selection toolbar of History and Bookmarks menus. @@ -38,6 +41,8 @@ class LibrarySubMenusMultipleSelectionToolbarRobot { fun verifyShareOverlay() = assertShareOverlay() + fun verifyShareAppsLayout() = assertShareAppsLayout() + fun verifyShareTabFavicon() = assertShareTabFavicon() fun verifyShareTabTitle() = assertShareTabTitle() @@ -71,6 +76,12 @@ class LibrarySubMenusMultipleSelectionToolbarRobot { } class Transition { + fun closeShareDialogReturnToPage(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun closeToolbarReturnToHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { closeToolbarButton().click() @@ -158,6 +169,15 @@ private fun assertShareBookmarksButton() = private fun assertShareOverlay() = onView(withId(R.id.shareWrapper)).check(matches(isDisplayed())) +private fun assertShareAppsLayout() = { + val sendToDeviceTitle = mDevice.findObject( + UiSelector() + .instance(0) + .className(TextView::class.java) + ) + sendToDeviceTitle.waitForExists(TestAssetHelper.waitingTime) +} + private fun assertShareTabTitle() = onView(withId(R.id.share_tab_title)).check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt index 2087f7c62..18b413c3c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt @@ -96,6 +96,13 @@ class SettingsRobot { return HomeScreenRobot.Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + goBackButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openAboutFirefoxPreview(interact: SettingsSubMenuAboutRobot.() -> Unit): SettingsSubMenuAboutRobot.Transition { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt index 511d2631b..d7d7ce3d6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt @@ -34,8 +34,8 @@ import java.text.SimpleDateFormat import java.time.LocalDateTime import java.time.format.DateTimeFormatterBuilder import java.time.temporal.ChronoField -import java.util.Date import java.util.Calendar +import java.util.Date /** * Implementation of Robot Pattern for the settings search sub menu. @@ -250,7 +250,9 @@ class BuildDateAssertion { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) { val simpleDateFormat = SimpleDateFormat(DATE_PATTERN) val date = simpleDateFormat.parse(dateText) - if (!date.isWithinRangeOf(hours)) throw AssertionError("The build date is not within Range.") + if (date == null || !date.isWithinRangeOf(hours)) { + throw AssertionError("The build date is not within Range.") + } } else { val textviewDate = getLocalDateTimeFromString(dateText) val buildConfigDate = getLocalDateTimeFromString(BuildConfig.BUILD_DATE) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt new file mode 100644 index 000000000..facf6ebb0 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt @@ -0,0 +1,52 @@ +/* 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.robots + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withResourceName +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.espresso.matcher.ViewMatchers.Visibility +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import org.hamcrest.CoreMatchers.allOf +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.click + +/** + * Implementation of Robot Pattern for Synced Tabs sub menu. + */ +class SyncedTabsRobot { + + fun verifyNavigationToolBarHeader() = assertNavigationToolBarHeader() + + fun verifySyncedTabsStatus() = assertSyncedTabsStatus() + + class Transition { + val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!! + + fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + goBackButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + } +} + +private fun goBackButton() = + onView(allOf(withContentDescription("Navigate up"))) + +private fun assertNavigationToolBarHeader() { + onView(withText(R.string.synced_tabs)) + .check((matches(withEffectiveVisibility(Visibility.VISIBLE)))) +} + +private fun assertSyncedTabsStatus() { + onView(withResourceName("sync_tabs_status")) + .check((matches(withEffectiveVisibility(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 3f1a44b6f..c1a207379 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 @@ -9,6 +9,7 @@ package org.mozilla.fenix.ui.robots import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.action.ViewActions @@ -44,8 +45,10 @@ import org.mozilla.fenix.share.ShareFragment */ class ThreeDotMenuMainRobot { fun verifySettingsButton() = assertSettingsButton() + fun verifyAddOnsButton() = assertAddOnsButton() fun verifyHistoryButton() = assertHistoryButton() fun verifyBookmarksButton() = assertBookmarksButton() + fun verifySyncedTabsButton() = assertSyncedTabsButton() fun verifyHelpButton() = assertHelpButton() fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists() fun verifyForwardButton() = assertForwardButton() @@ -106,12 +109,40 @@ class ThreeDotMenuMainRobot { fun verifyShareALinkTitle() = assertShareALinkTitle() fun verifyWhatsNewButton() = assertWhatsNewButton() fun verifyAddFirefoxHome() = assertAddToFirefoxHome() + fun verifyAddToMobileHome() = assertAddToMobileHome() + fun verifyDesktopSite() = assertDesktopSite() + fun verifyOpenInAppButton() = assertOpenInAppButton() + + fun verifyThreeDotMainMenuItems() { + verifyAddOnsButton() + verifyHistoryButton() + verifyBookmarksButton() + verifySyncedTabsButton() + verifySettingsButton() + verifyFindInPageButton() + verifyAddFirefoxHome() + verifyAddToMobileHome() + verifyDesktopSite() + verifyAddBookmarkButton() + verifyShareButton() + verifyForwardButton() + verifyRefreshButton() + } class Transition { private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + fun clickAddOnsReportSiteIssue(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + addOnsButton().click() + addOnsReportSiteIssueButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openSettings(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) onView(allOf(withResourceName("text"), withText(R.string.browser_menu_settings))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(isCompletelyDisplayed())) @@ -121,7 +152,17 @@ class ThreeDotMenuMainRobot { return SettingsRobot.Transition() } + fun openSyncedTabs(interact: SyncedTabsRobot.() -> Unit): SyncedTabsRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) + mDevice.waitNotNull(Until.findObject(By.text("Synced tabs")), waitingTime) + syncedTabsButton().click() + + SyncedTabsRobot().interact() + return SyncedTabsRobot.Transition() + } + fun openBookmarks(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) bookmarksButton().click() @@ -130,6 +171,7 @@ class ThreeDotMenuMainRobot { } fun openHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("History")), waitingTime) historyButton().click() @@ -137,6 +179,23 @@ class ThreeDotMenuMainRobot { return HistoryRobot.Transition() } + fun bookmarkPage(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.desc("Bookmark")), waitingTime) + addBookmarkButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun sharePage(interact: LibrarySubMenusMultipleSelectionToolbarRobot.() -> Unit): LibrarySubMenusMultipleSelectionToolbarRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.desc("Share")), waitingTime) + shareButton().click() + pressBack() + + LibrarySubMenusMultipleSelectionToolbarRobot().interact() + return LibrarySubMenusMultipleSelectionToolbarRobot.Transition() + } + fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) helpButton().click() @@ -163,6 +222,13 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + mDevice.pressBack() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun close(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { // Close three dot mDevice.pressBack() @@ -196,6 +262,7 @@ class ThreeDotMenuMainRobot { } fun openFindInPage(interact: FindInPageRobot.() -> Unit): FindInPageRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Find in page")), waitingTime) findInPageButton().click() @@ -274,6 +341,13 @@ class ThreeDotMenuMainRobot { HomeScreenRobot().interact() return HomeScreenRobot.Transition() } + + fun openSaveToCollection(interact: ThreeDotMenuMainRobot.() -> Unit): ThreeDotMenuMainRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.text("Save to collection")), waitingTime) + saveCollectionButton().click() + ThreeDotMenuMainRobot().interact() + return ThreeDotMenuMainRobot.Transition() + } } } @@ -286,6 +360,11 @@ private fun assertSettingsButton() = settingsButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(isCompletelyDisplayed())) +private fun addOnsButton() = onView(allOf(withText("Add-ons"))) +private fun assertAddOnsButton() = addOnsButton() + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun addOnsReportSiteIssueButton() = onView(allOf(withText("Report Site Issue…"))) + private fun historyButton() = onView(allOf(withText(R.string.library_history))) private fun assertHistoryButton() = historyButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) @@ -294,6 +373,10 @@ private fun bookmarksButton() = onView(allOf(withText(R.string.library_bookmarks private fun assertBookmarksButton() = bookmarksButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun syncedTabsButton() = onView(allOf(withText(R.string.library_synced_tabs))) +private fun assertSyncedTabsButton() = syncedTabsButton() + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + private fun helpButton() = onView(allOf(withText(R.string.browser_menu_help))) private fun assertHelpButton() = helpButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) @@ -399,3 +482,36 @@ private fun assertAddToFirefoxHome() { ) ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } + +private fun addToMobileHomeButton() = + onView(allOf(withText(R.string.browser_menu_add_to_homescreen))) +private fun assertAddToMobileHome() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_add_to_homescreen)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun desktopSiteButton() = + onView(allOf(withText(R.string.browser_menu_desktop_site))) +private fun assertDesktopSite() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_desktop_site)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun openInAppButton() = + onView(allOf(withText(R.string.browser_menu_open_app_link))) +private fun assertOpenInAppButton() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_open_app_link)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} 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 94af3423f..254740e31 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -211,6 +211,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate ), sessionManager = requireComponents.core.sessionManager, + sessionFeature = sessionFeature, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, engineView = engineView, swipeRefresh = swipeRefresh, diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 2016ef63a..c0ae508b4 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -221,21 +221,37 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val collectionStorageObserver = object : TabCollectionStorage.Observer { override fun onCollectionCreated(title: String, sessions: List) { - showTabSavedToCollectionSnackbar() + showTabSavedToCollectionSnackbar(sessions.size, true) } override fun onTabsAdded(tabCollection: TabCollection, sessions: List) { - showTabSavedToCollectionSnackbar() + showTabSavedToCollectionSnackbar(sessions.size) } - private fun showTabSavedToCollectionSnackbar() { + private fun showTabSavedToCollectionSnackbar(tabSize: Int, isNewCollection: Boolean = false) { view?.let { view -> + val messageStringRes = when { + isNewCollection -> { + R.string.create_collection_tabs_saved_new_collection + } + tabSize > 1 -> { + R.string.create_collection_tabs_saved + } + else -> { + R.string.create_collection_tab_saved + } + } FenixSnackbar.make( view = view, duration = Snackbar.LENGTH_SHORT, isDisplayedWithBrowserToolbar = true ) - .setText(view.context.getString(R.string.create_collection_tab_saved)) + .setText(view.context.getString(messageStringRes)) + .setAction(requireContext().getString(R.string.create_collection_view)) { + findNavController().navigate( + BrowserFragmentDirections.actionGlobalHome(focusOnAddressBar = false) + ) + } .show() } } 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 0e32b8316..41795a446 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 @@ -19,6 +19,8 @@ import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.prompt.ShareData +import mozilla.components.feature.session.SessionFeature +import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.kotlin.isUrl import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.NavGraphDirections @@ -61,6 +63,7 @@ class DefaultBrowserToolbarController( private val activity: HomeActivity, private val navController: NavController, private val readerModeController: ReaderModeController, + private val sessionFeature: ViewBoundFeatureWrapper, private val sessionManager: SessionManager, private val findInPageLauncher: () -> Unit, private val engineView: EngineView, @@ -260,8 +263,10 @@ class DefaultBrowserToolbarController( } } ToolbarMenu.Item.OpenInFenix -> { - // Release the session from this view so that it can immediately be rendered by a different view - engineView.release() + // Stop the SessionFeature from updating the EngineView and let it release the session + // from the EngineView so that it can immediately be rendered by a different view once + // we switch to the actual browser. + sessionFeature.get()?.release() // Strip the CustomTabConfig to turn this Session into a regular tab and then select it customTabSession!!.customTabConfig = null 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 410b126cf..63dcd716e 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 @@ -6,9 +6,7 @@ package org.mozilla.fenix.library.bookmarks import android.content.ClipData import android.content.ClipboardManager -import android.content.Context import android.content.res.Resources -import androidx.core.content.getSystemService import androidx.navigation.NavController import androidx.navigation.NavDirections import kotlinx.coroutines.CoroutineScope @@ -51,8 +49,9 @@ interface BookmarkController { @SuppressWarnings("TooManyFunctions") class DefaultBookmarkController( - private val context: Context, + private val activity: HomeActivity, private val navController: NavController, + private val clipboardManager: ClipboardManager?, private val scope: CoroutineScope, private val store: BookmarkFragmentStore, private val sharedViewModel: BookmarksSharedViewModel, @@ -63,8 +62,7 @@ class DefaultBookmarkController( private val invokePendingDeletion: () -> Unit ) : BookmarkController { - private val activity: HomeActivity = context as HomeActivity - private val resources: Resources = context.resources + private val resources: Resources = activity.resources override fun handleBookmarkChanged(item: BookmarkNode) { sharedViewModel.selectedFolder = item @@ -115,7 +113,7 @@ class DefaultBookmarkController( override fun handleCopyUrl(item: BookmarkNode) { val urlClipData = ClipData.newPlainText(item.url, item.url) - context.getSystemService()?.primaryClip = urlClipData + clipboardManager?.setPrimaryClip(urlClipData) showSnackbar(resources.getString(R.string.url_copied)) } @@ -143,14 +141,14 @@ class DefaultBookmarkController( scope.launch { store.dispatch(BookmarkFragmentAction.StartSync) invokePendingDeletion() - context.components.backgroundServices.accountManager.syncNowAsync(SyncReason.User).await() + activity.components.backgroundServices.accountManager.syncNowAsync(SyncReason.User).await() // The current bookmark node we are viewing may be made invalid after syncing so we // check if the current node is valid and if it isn't we find the nearest valid ancestor // and open it val validAncestorGuid = store.state.guidBackstack.findLast { guid -> - context.bookmarkStorage.getBookmark(guid) != null + activity.bookmarkStorage.getBookmark(guid) != null } ?: BookmarkRoot.Mobile.id - val node = context.bookmarkStorage.getBookmark(validAncestorGuid)!! + val node = activity.bookmarkStorage.getBookmark(validAncestorGuid)!! handleBookmarkExpand(node) store.dispatch(BookmarkFragmentAction.FinishSync) } @@ -160,12 +158,12 @@ class DefaultBookmarkController( invokePendingDeletion.invoke() scope.launch { val parentGuid = store.state.guidBackstack.findLast { guid -> - store.state.tree?.guid != guid && context.bookmarkStorage.getBookmark(guid) != null + store.state.tree?.guid != guid && activity.bookmarkStorage.getBookmark(guid) != null } if (parentGuid == null) { navController.popBackStack() } else { - val parent = context.bookmarkStorage.getBookmark(parentGuid)!! + val parent = activity.bookmarkStorage.getBookmark(parentGuid)!! handleBookmarkExpand(parent) } } 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 decb6bef8..51d8e12de 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 @@ -13,6 +13,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog +import androidx.core.content.getSystemService import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider @@ -37,6 +38,7 @@ import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.UserInteractionHandler +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.NavHostActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar @@ -85,8 +87,9 @@ class BookmarkFragment : LibraryPageFragment(), UserInteractionHan _bookmarkInteractor = BookmarkFragmentInteractor( bookmarksController = DefaultBookmarkController( - context = requireContext(), + activity = requireActivity() as HomeActivity, navController = findNavController(), + clipboardManager = requireContext().getSystemService(), scope = viewLifecycleOwner.lifecycleScope, store = bookmarkStore, sharedViewModel = sharedViewModel, diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryController.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryController.kt index 867c37bd6..2bd32c705 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryController.kt @@ -81,7 +81,7 @@ class DefaultHistoryController( override fun handleCopyUrl(item: HistoryItem) { val urlClipData = ClipData.newPlainText(item.url, item.url) - clipboardManager.primaryClip = urlClipData + clipboardManager.setPrimaryClip(urlClipData) with(snackbar) { setText(resources.getString(R.string.url_copied)) show() diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAuthFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAuthFragment.kt index ac9e33e24..d0831e62b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAuthFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/SavedLoginsAuthFragment.kt @@ -18,6 +18,7 @@ import androidx.appcompat.app.AlertDialog import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.Preference @@ -270,8 +271,9 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat(), AccountObserver { } } + @Suppress("Deprecation") private fun showPinVerification() { - val manager = activity?.getSystemService(KEYGUARD_SERVICE) as KeyguardManager + val manager = activity?.getSystemService()!! val intent = manager.createConfirmDeviceCredentialIntent( getString(R.string.logins_biometric_prompt_message_pin), getString(R.string.logins_biometric_prompt_message) diff --git a/app/src/main/java/org/mozilla/fenix/utils/ClipboardHandler.kt b/app/src/main/java/org/mozilla/fenix/utils/ClipboardHandler.kt index 5ff3321ce..3d3ebf6fe 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/ClipboardHandler.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/ClipboardHandler.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.utils import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import androidx.core.content.getSystemService import mozilla.components.support.utils.WebURLFinder private const val MIME_TYPE_TEXT_PLAIN = "text/plain" @@ -16,7 +17,7 @@ private const val MIME_TYPE_TEXT_HTML = "text/html" * A clipboard utility class that allows copying and pasting links/text to & from the clipboard */ class ClipboardHandler(context: Context) { - private val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + private val clipboard = context.getSystemService()!! var text: String? get() { @@ -29,7 +30,7 @@ class ClipboardHandler(context: Context) { return null } set(value) { - clipboard.primaryClip = ClipData.newPlainText("Text", value) + clipboard.setPrimaryClip(ClipData.newPlainText("Text", value)) } val url: String? diff --git a/app/src/main/java/org/mozilla/fenix/whatsnew/WhatsNewStorage.kt b/app/src/main/java/org/mozilla/fenix/whatsnew/WhatsNewStorage.kt index 8dea8acbf..2c8182230 100644 --- a/app/src/main/java/org/mozilla/fenix/whatsnew/WhatsNewStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/whatsnew/WhatsNewStorage.kt @@ -6,7 +6,7 @@ package org.mozilla.fenix.whatsnew import android.content.Context import android.content.SharedPreferences -import android.preference.PreferenceManager +import androidx.preference.PreferenceManager import java.util.concurrent.TimeUnit // This file is a modified port from Focus Android diff --git a/app/src/main/res/layout/fragment_tracking_protection_blocking.xml b/app/src/main/res/layout/fragment_tracking_protection_blocking.xml index cf63025bb..a746c009f 100644 --- a/app/src/main/res/layout/fragment_tracking_protection_blocking.xml +++ b/app/src/main/res/layout/fragment_tracking_protection_blocking.xml @@ -17,7 +17,7 @@ android:fontFamily="@font/metropolis_bold" android:layout_width="wrap_content" android:layout_height="@dimen/tracking_protection_item_height" - android:layout_marginStart="16dp" + android:layout_marginStart="72dp" android:layout_marginEnd="16dp" android:paddingStart="0dp" android:paddingEnd="0dp" diff --git a/app/src/main/res/layout/tracking_protection_category.xml b/app/src/main/res/layout/tracking_protection_category.xml index 293d43c76..560295834 100644 --- a/app/src/main/res/layout/tracking_protection_category.xml +++ b/app/src/main/res/layout/tracking_protection_category.xml @@ -27,7 +27,7 @@ android:id="@+id/trackingProtectionCategoryTitle" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/library_item_icon_margin_horizontal" + android:layout_marginStart="32dp" android:layout_marginTop="12dp" android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal" android:clickable="false" @@ -44,7 +44,7 @@ android:id="@+id/trackingProtectionCategoryItemDescription" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/library_item_icon_margin_horizontal" + android:layout_marginStart="32dp" android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal" android:layout_marginBottom="18dp" android:clickable="false" diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index b28f8b5d3..97698b01e 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -217,6 +217,10 @@ Поверително разглеждане Отваряне препратките в поверителен раздел + + Снимки на екрана в поверителен режим + + Добавяне на икона за поверителен режим Достъпност @@ -233,6 +237,8 @@ Синхронизирайте отметки, пароли и други с вашия Firefox Account Firefox Account + + Свържете повторно, за да бъде възобновено синхронизирането Език @@ -251,6 +257,8 @@ Показване на предложения Показване на гласово търсене + + Показване в поверителен режим Показване на предложения от буфера @@ -285,6 +293,14 @@ Името не може да е празно. Синхронизиране… + + Грешка при синхронизиране. Последен успех: %s + + Грешка при синхронизиране. Последно синхронизиране: никога + + Последно синхронизиране: %s + + Последно синхронизиране: никога @@ -320,6 +336,9 @@ Научете повече + + Изключено глобално, посетете Настройки, за да го включите. + Телеметрия @@ -335,9 +354,14 @@ Услуга за местоположение на Mozilla + + Здравен доклад за %s + Включване на Sync + + Сканирайте кода за сдвояване в настолен Firefox Вход @@ -349,6 +373,8 @@ firefox.com/pair]]> + + Отваряне на камерата Отказ @@ -364,6 +390,104 @@ Тъмна + + Зададена от приложението за пестене на батерия + + Следва темата на устройството + + + + Сесии + + Снимки на екрана + + Изтегляния + + Отметки + + Настолни отметки + + Меню с отметки + + Лента с отметки + + Други отметки + + История + + Синхронизирани раздели + + Списък за четене + + Търсене + + Настройки + + Меню на елемент от историята + + Затваряне + + + + Отворени раздели + + Поверителни сесии + + Поверителни раздели + + Добавяне на раздел + + Отваря поверителен раздел + + Поверителен + + Отворени раздели + + Добавяне в списък + + Споделяне на всички раздели + + Затваряне на всички раздели + + Нов раздел + + Начален екран + + Превключване режима на раздела + + Премахване на раздела от спъсъка + + Затваряне на раздел + + Затваряне на раздел %s + + Отваряне на меню Раздели + + Затваряне на всички раздели + + Споделяне на раздели + + Запазване на раздели в списък + + Меню Раздели + + Споделяне на раздел + + Изтриване + + Запазване + + Споделяне + + Заглавна пиктограма на текущото меню на сесия + + + Списък с бързи настройки + + + Меню Списъци Избиране на всички @@ -375,10 +499,50 @@ Запазване + + Споделяне + Разрешете %1$s да отвори %2$s + + Запознайте се с %s + + Вижте какво е новото + + Имате въпроси относно новия дизайн на %s? Искате ли да разберете какви са промените? + + Получете отговори тук + + Извлечете максимума от %s + + + Автоматична поверителност + + Настройките за поверителност и сигурност спират проследяващ и злонамерен код, както и компании, които ви преследват. + + Стандартна (по подразбиране) + + Спира малко проследявания. Страниците зареждат нормално. + + Строга (препоръчителна) + + Строга + + Спира повече проследявания, реклами и изскачащи прозорци. Страниците зареждат по-бързо, но може да не работят. + + Затваряне + + + + Изберете тема + Преглеждайте без да бъдете следени @@ -388,11 +552,23 @@ Научете повече + + Връщане назад + Научете повече за Sync. Научете повече + + Меню за сортиране на регистрации + + + Добавяне + + Запазване + Научете повече diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index a4798cfc3..cfe89dbe2 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -28,6 +28,7 @@ Nalazite se u privatnoj sesiji + Uobičajeni mitovi o privatnom surfanju Obriši sesiju @@ -210,6 +211,8 @@ Dozvoli screenshote u privatnom surfanju Dodaj prečicu za privatno surfanje + + Pristupačnost Zaseban Firefox Account server @@ -230,6 +233,8 @@ Sinhronizujte zabilješke, historiju i više od toga s vašim Firefox računom Firefox račun + + Ponovo se povežite za nastavak sinhronizacije Jezik @@ -358,6 +363,8 @@ Skenirajte kod za uparivanje u desktop Firefoxu Prijava + + Prijavite se radi ponovnog povezivanja Ukloni račun @@ -439,18 +446,24 @@ Novi tab Početni + + Promijeni režim taba Ukloni tab iz kolekcije Zatvori tab Zatvori tab %s + + Meni otvorenih tabova Zatvori sve tabove Podijeli tabove Spasi tabove u kolekciju + + Meni tabova Podijeli tab @@ -804,8 +817,6 @@ Obriši podatke surfanja pri izlazu - - Historija surfanja Ugasi diff --git a/app/src/main/res/values-lij/strings.xml b/app/src/main/res/values-lij/strings.xml index cc1f2c480..c67f455c3 100644 --- a/app/src/main/res/values-lij/strings.xml +++ b/app/src/main/res/values-lij/strings.xml @@ -14,9 +14,39 @@ Scrivi ò çerca indirisso + + I feuggi averti saian mostræ chi. + + I feuggi privæ saian mostræ chi. + + Averto 1 feuggio. Tocca chi pe cangiâ feuggio. + + Averti %1$s feuggi. Tocca chi pe cangiâ feuggio. + + + %1$s o l\'é svilupou da Mozilla. + + + + Ti ê inte \'na sescion privâ + + %1$s scancella a teu cronologia de navegaçion e de riçerche quande seri i feuggi e i barcoin de navegaçion privâ. Sciben che questo o no ti fa deventâ anònimo co-i sciti o co-o fornitô de Internet, o l\'agiutta in ògni mòddo a mantegnî privòu da-i atri utenti de sto computer cöse ti fæ in linea. + Miti comuin in sciâ navegaçion privâ + + Scancella sescion + + + + Azonzi \'n scorsaieu pe arvî i feuggi privæ da-a pagina prinçipâ. + + Azonzi scorsaieu No graçie + + + Acedi a Firefox ciù spedio. Azonzi un widget a-a pagina prinçipâ. Azonzi widget @@ -47,6 +77,8 @@ Cangia segnalibbro Conponenti azonti + + Nisciun conponente azonto Agiutto @@ -69,6 +101,8 @@ Feuggio privou Neuvo feuggio + + Sarva inta coleçion Condividdi @@ -91,6 +125,10 @@ Aparensa + + No riescio a conette. No conoscio o schema URL. + Seleçionn-a lengoa @@ -106,12 +144,22 @@ Scanscionn-a Scorsaiéu + + Inpostaçioin motô de riçerca Çerca con + + Oua çerca con: + + Còpia colegamento da aponti Permetti No permette + + Permette i conseggi de riçerca inte sescioin privæ? + + Tutto quello che scrivi inta bara di indirissi de %s saiâ condivizo co-o motô de riçerca predefinio. Atre informaçioin @@ -129,4 +177,1088 @@ Generale - + + Generale + + Informaçioin + + Motô de riçerca predefinio + + Çerca + + Bara di indirissi + + Agiutto + + Vota in sce Google Play + + Manda comento + + Informaçioin in sce %1$s + + I teu diriti + + Poule segrete + + Carte de poffo e indirissi + + Rendi navegatô predefinio + + Avansæ + + Privacy + + Privacy e seguessa + + Permisso do scito + + Navegaçion privâ + + Arvi colegamenti in feuggio privou + + + Permetti e föto do schermo inta navegaçion privâ + + Azonzi scorsaieu navegaçion privâ + + Acesibilitæ + + Server personalizou pe-o conto Firefox + + Server personalizou pe Sync + + O server pe-o conto Firefox/Sync cangiou. L\'aplicaçion a saiâ serâ pe aplicâ i cangiamenti… + + Conto + + Intra + + Bara di atressi + + Tema + + Personalizza + + Scincronizza segnalibbri, poule segrete e atro co-o teu conto Firefox. + + Conto Firefox + + Conetite torna pe repigiâ a scioncronizaçion + + Lengoa + + Condivixon dæti + + Arecugeita dæti + + Informativa da privacy + + Strumenti do svilupatô + + Debug remòtto via USB + + Mostra scorsaieu de riçerca + + Mostra conseggi de riçerca + + Çerca co-a voxe + + Mostra in sescioin privæ + + Mostra conseggi da aponti + + Çerca inta stöia de navegaçion + + Çerca inti segnalibbri + + Detalli do conto + + Arvi colegamenti inte app + + Conponenti azonti + + + + Scincronizza oua + + Çerni cöse scincronizâ + + Stöia + + Segnalibbri + + Acessi + + Feuggi averti + + Sciòrti + + Nomme dispoxitivo + + O nomme do dispoxitivo o no peu ese veuo. + + Scincronizaçion… + + Scincronizaçion falia. Urtima anæta ben: %s + + Scincronizaçion falia. Urtima anæta ben: mai + + Urtima scincronizaçion: %s + + Urtima scincronizaçion: mai + + %1$s de %2$s %3$s + + + + Feuggi reçevui + + Notifiche pe-i feuggi reçevue da atri dispoxitivi Firefox. + + Feuggio reçevuo + + Feuggi reçevui + + Feuggio da %s + + + + Proteçion anti-traciamento + + Proteçion anti-traciamento + + Blòcca o contegnuo e script che tracian a teu navegaçion + + Eceçioin + + A proteçion anti-traciamento a l\'é asmortâ pe sti sciti + + Açendi pe tutti i sciti + + Atre informaçioin + + + Asmòrta a livello globale, arvi e inpostaçion pe ativala. + + + Telemetria + + Dæti tecnichi e statistiche d\'uzo + + Dæti de marketing + + Esperimenti + + + Permetti a Mozilla de instalâ e arecheugge dæti pe-e fonçioin sperimentali + + Segnalaçion di cianti + + Serviçio de localizaçion de Mozilla + + Report de salue de %s + + + + Açendi Sync + + + Scançionn-a o còdice de asociaçion in Firefox desktop + + Intra + + Acedi pe conetite torna + + Scancella conto + + + + firefox.com/pair]]> + + Arvi fòtocamera + + Anulla + + + + In çimma + + In fondo + + + + Ciæo + + Scuo + + + Inpostou da risparmio bateria + + Deuvia o tema do dispoxitivo + + + + Sescioin + + Föto do schermo + + Descaregamenti + + Segnalibbri + + Segnalibbri do pc + + Menû di segnalibbri + + Bara di Segnalibbri + + + Atri segnalibbri + + Stöia + + Feuggi scincronizæ + + Lista letua + + Çerca + + Inpostaçioin + + Menû stöia + + Særa + + + + Feuggi averti + + Sescion privâ + + Feuggi privæ + + Azonzi feuggio + + Azonzi feuggio privou + + Privou + + Feuggi averti + + Sarva in coleçion + + Condividdi tutti i feuggi + + + Særa tutti i feuggi + + Neuvo feuggio + + Vanni a-a pagina prinçipâ + + Ativa/dizativa o mòddo feuggio + + Scancella feuggio da-a coleçion + + Særa feuggio + + Særa feuggio %s + + Menû feuggi averti + + Særa tutti i feuggi + + Condividdi feuggi + + Sarva feuggi in coleçion + + Menû feuggio + + Condividdi feuggio + + Scancella + + Sarva + + Condividdi + + Inmagine sescion corente + + Sarva in coleçion + + Scancella coleçion + + Cangia nomme da coleçion + + Arvi Feuggi + + Scancella + + %1$s (mòddo navegaçion privâ) + + + + Scancella stöia + + T\'ê seguo de scancelâ a stöia? + + Stöia scancelâ + + %1$s scancelou + + Scancella + + Còpia + + Condividdi + + Arvi in neuvo feuggio + + Arvi in feuggio privou + + Scancella + + %1$d seleçionæ + + Scancella %1$d ògetti + + Urtime 24 oe + + Urtimi 7 giorni + + Urtimi 30 giorni + + Ciù vegio + + No gh\'é stöia + + + + Me spiaxe. %1$s o no peu caregâ sta pagina. + + Preuva a repigiâ ò særa sto feuggio chi sotta + + Manda a segnalaçion do cianto a Mozilla + + Særa feuggio + + Repiggia feuggio + + + Inpostaçioin da sescion + + + Condividdi sescion + + + + Menû segnalibbri + + Cangia segnalibbro + + Seleçionn-a cartella + + T\'ê seguo de voei scancelâ sta cartella? + + %1$s scancelou + + Azonzi cartella + + Segnalibbro creou. + + Segnalibbro sarvou! + + CANGIA + + Cangia + + Seleçionn-a + + Còpia + + Condividdi + + Arvi in neuvo feuggio + + Arvi in feuggio privou + + Scancella + + Sarva + + %1$d seleçionæ + + Cangia segnalibbro + + Cangia cartella + + Intra pe vedde i seganlibbri scincronizæ + + INDIRISSO + + + CARTELLA + + NOMME + + Azonzi cartella + + Seleçionn-a cartella + + Ti devi mette \'n titolo + + Indirisso grammo + + Nisciun segnalibbro chi + + Scancelou %1$s + + Segnalibbri scancelæ + + ANULLA + + + + Permissi + + Vanni a-a Inpostaçioin + + Feuggio inpostaçioin leste + + Consegiou + + Gestisci permissi sciti + + Scancella permissi + + Scancella permisso + + Scancella permissi pe tutti i sciti + + Riproduçion aotomatica + + Fòtocamera + + Micròfono + + Poxiçion + + Notifica + + Domanda o consenso + + Blocòu + + Permisso + + Blocou da Android + + Eceçioin + + Açeizo + + Asmòrtou + + Permetti aodio e video + + Blòcca solo l\'aodio + + Blòcca aodio e video + + Açeizo + + Asmòrtou + + + + Coleçioin + + Menû coleçion + + Ragruppa i teu interessi + + Seleçionn-a feuggi + + Seleçionn-a coleçion + + Nomme coleçion + + Azonzi neuva coleçion + + Seleçionn-a tutto + + Deseleçionn-a tutto + + Seleçionn-a feuggi da sarvâ + + %d feuggi seleçionæ + + %d feuggio seleçionou + + Feuggi sarvæ! + + Feuggio sarvou! + + Særa + + Sarva + + Fanni vedde + + + Coleçion %d + + + + Manda e condividdi + + Condividdi + + Condividdi + + Condividdi Colegamento + + Manda a-o dispoxitivo + + Tutte e açioin + + Deuviæ de fresco + + Acedi a Sync + + Manda a tutti i dispoxitivi + + Conetti torna a Sync + + Feua linia + + Conetti atro dispoxitivo + + Ò capio! + + No pòsso condividde con sta app + + Manda a-o dispoxitivo + + Nisciun dispoxitivo conesso + + Informaçioin in sciâ spediçion di feuggi… + + Conetti \'n atro dispoxitivo… + + + + Sescion de navegaçion privâ + + Scancella feuggi privæ + + Særa feuggi privæ + + Arvi + + Scancella e arvi + + Fæto da + + Coleçion scancelâ + + Coleçion rinominâ + + Feuggio scancelou + + Feuggi scancelæ + + Feuggio serou + + Feuggi seræ + + Azonto a-i megio sciti! + + Feuggio privou serou + + Feuggi privou seræ + + Feuggi privæ scancelæ + + ANULLA + + Scito scancelâ + + Anulla + + Conferma + + Permette a %1$s de arvî %2$s + + PERMETTI + + NO PERMETTE + + + T\'ê seguo de voei scancelâ %1$s? + + Scancella + + Anulla + + Intra into mòddo a tutto schermo + + Indirisso copiou + + Aomenta ò riduxi a dimenscion do testo di sciti web + + Dimenscion carateri + + + Dimescionamento di carateri aotomatico + + + Scancella dæti navegaçion + + Feuggi averti + + %d feuggi + + Stöia da navagaçion e dæti di sciti + + %d indirissi + + Stöia + + %d pagine + + Cookie + + Ti saiæ sconesso da-a magiô parte di sciti + + Inmagini e schedai sarvæ inta cache + + Libera spaçio de archiviaçion + + Permissi do scito + + Scancella dæti navegaçion + + + Scancella dæti navegaçion quande sciòrto + + Sciòrti + + + Questo o scanceliâ tutti i dæti de navegaçion + + %s o scanceliâ i dæti de navegaçion seleçionæ. + + Anulla + + Scancella + + + Dæti de navegaçion scancelæ + + Scancella dæti navegaçion… + + + Descarega Firefox pe Android Beta + + + Firefox Nightly o s\'é mesciou + + + Piggite o neuvo Nightly + + + + Benvegnuo in %s! + + Ti ghe l\'æ za \'n conto? + + Descòvri %s + + Descòvri cöse gh\'é de neuvo + + Treuva chi e risposte + + Piggia o mascimo da %s. + + Sì, famme intrâ + + Intro… + + Acedi a Firefox + + Resta disconesso + + Sincronizaçion ativa + + No riescio a acede + + Privacy aotomatica + + Normale (predefinio) + + + Restritivo (consegiou) + + Restritivo + + Piggia poxiçion + + Navega in mòddo privou + + Arvi inpostaçioin + + A teu privacy + + Lezzi a nòstra informativa in sciâ privacy + + Særa + + + Iniçia a navegâ + + + + Çerni o teu tema + + Aotomatico + + Tema scuo + + Tema ciæo + + + Feuggi mandæ! + + Feuggio mandou! + + No son ariesciou a mandâ + + PREUVA TORNA + + Scançionn-a o còdice + + Pronto pe-a scançion + + Acedi co-a fòtocamera + + Acedi con l’email + + Disconnetti + + Anulla + + + + Preferense proteçion + + Proteçion anti-traciamento avansâ + + Navega sensa ese ascorio + + Atre informaçioin + + Normale (predefinio) + + Restritivo + + Personalizou + + + Cookie + + Tutti i cookie (quarche scito o no fonçioniâ ben) + + Contegnui che tracian + + Inte tutti i feuggi + + Solo in feuggi privæ + + Solo in feuggi personalizæ + + Cryptominer + + Fingerprinter + Blocæ + + Permisso + + Traciatoî di social media + + Limita a capaçitæ di social network de traciâ e teu ativitæ in sciâ ræ. + + Cookie che tracian inter-scito + + Cryptominer + + Fingerprinter + + Contegnui che tracian + + E proteçioin en ative pe sto scito + + E proteçioin no en ative pe sto scito + + Vanni inderæ + + I teu diriti + + + Libraie a sorgente averto che deuviemmo + + Novitæ in %s + + %s | Libraie OSS + + + Sopòrto + + Cianti + + + Informativa da privacy + + I teu diriti + + Informaçion de licensa + + Libraie che deuviemmo + + Menû debug: %1$d click aretou/æ pe ativâ + Menû debug ativou + + + 1 feuggio + + %d feuggi + + + + Còpia + + Incòlla & Vanni + + Incòlla + + URL copiou in sci aponti + + + Azonzi a-a Pagina prinçipâ + + Anulla + + Azonzi + + Vanni a-o scito + + Nomme scorsaieu + + + Acessi e poule segrete + + Sarva acessi e poule segrete + + Domanda primma de sarvâ + + No sarvâ mai + + Conpilaçion aotomatica + + Scincronizza i acessi + + Açeizo + + Asmòrtou + + Conetti torna + + Acedi a Sync + + Acessi sarvæ + + Ciù informaçioin in sce Sync. + + Eceçioin + + Çerca inti acessi + + Alfabetico + + Deuviæ de fresco + + Scito + + Nomme utente + + Poula segreta + + Scrivi torna o PIN + + Atre informaçioin + + + Sarva + + No sarvâ + + Poula segreta copiâ in sci aponti + + Nomme utente copiou in sci aponti + + Scito copiou in sci aponti + + Còpia poula segreta + + Còpia nomme utente + + Còpia scito + + Mostra poula segreta + + Ascondi poula segreta + + Dòppo + + Inpòsta oua + + Sblòcca o teu dispoxitivo + + Zoon inti tutti i sciti + + Nomme (A-Z) + + Urtimo deuviou + + + Azonzi + + Sarva + + Cangia + + Scancella + + + Atro + + Nomme + + Stringa de riçerca da deuviâ + + Atre informaçioin + + + Colegamento pe atre informaçioin + + + %s creou + + %s sarvou + + %s scancelou + + + Agiornamento de %s… + + Xeua %s + + Poule segrete + + + Pe permetilo: + + 1. Arvi e inpostaçioin de Android + + Permissi (ò in italian Autorizzazioni)]]> + + %1$s in sce Permetti (ò consenti in italian)]]> + + + Conescion segua + + Conescion no segua + + Nisciunn-a eceçion pe-i sciti + + I megio articoli + + T\'ê seguo de voei scancelâ sto segnalibbro? + + Azonto a-i megio sciti! + + Verificou da: %1$s + + Scancella + + Cangia + + T\'ê seguo de voei scancelâ st\'acesso? + + Scancella + + Inpostaçioin acessi + + Sarva i cangiamenti a-i acessi + + Ignòra cangiamenti + + Cangia + + Me serve a paròlla segreta + + Çerca co-a voxe + + Parla oua + + + + + + Conetti un conto Firefox. + + Conetti atro dispoxitivo. + + Pe piaxei intra torna + + Pe piaxei ativa a scincroniaçion di feuggi. + + No ti gh\'æ feuggi averti in Firefox inti atri dispoxitivi. + + Amia \'na lista de tutti i feuggi da-i atri dispoxitivi. + + Acedi a Sync + + + + T\'ê seguo arivou a-o limite mascimo pe-i megio sciti + + Pe azonze \'n neuvo megio scito scacelline un. Sciacca a longo sorvia o scito e seleçionn-a scancella. + + Va ben, ò capio + + diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 951bb4c14..124de4657 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -13,8 +13,6 @@ Desactivar la navigacion privada. Recèrca o adreça - - Cap d’onglet pas dobèrt Suprimir la session @@ -278,10 +276,22 @@ Suprimir + + + Escafar l’istoric + + Volètz vertadièrament netejar l’istoric ? + + Istoric escafat + + %1$s suprimit Escafar Suprimir + + Suprimir %1$d elements Las darrièras 24 oras @@ -297,6 +307,8 @@ Restablir l’onglet + + Volètz vertadièrament suprimir aqueste dorsièr ? Copiar @@ -313,6 +325,9 @@ URL invalida + + Marcapagina suprimit + Anar als paramètres @@ -347,4 +362,69 @@ Cap de periferic pas connectat + + Onglet suprimit + + Onglets suprimits + + Confirmar + + Volètz vertadièrament suprimir %1$s ? + + Suprimir + + Anullar + + + Onglets dobèrts + + %d onglets + + %d adreças + + Istoric + + %d paginas + + Cookies + + Imatges e fichièrs en cache + + Sortir + + + Anullar + + + Suprimir + + + Anullar + + + Anullar + + + Suprimir + + + %s : supression realizada + + + Volètz vertadièrament suprimir totas las autorizacions per totes los sites ? + + Volètz vertadièrament suprimir totas las autorizacions per aqueste site ? + + Volètz vertadièrament suprimir aquesta autorizacion per aqueste site ? + + Sètz segur que volètz suprimir aqueste marcapagina ? + + Suprimir + + Sètz segur que volètz suprimir aqueste identificant ? + + Suprimir + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 03ad51953..5fe5d7087 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -41,7 +41,7 @@ - Adiciona um atalho na tela inicial para abrir abas privativas. + Adicione um atalho na tela inicial para abrir abas privativas. Adicionar atalho @@ -221,7 +221,7 @@ Navegação privativa - Abrir links em uma aba privativa + Abrir links em abas privativas Permitir capturas de tela na navegação privativa @@ -700,7 +700,7 @@ Menu de coleções - Colete o que é importante para você + Colecione o que é importante para você Agrupe pesquisas, sites e abas semelhantes para acesso rápido mais tarde. diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 078790394..32b3c0885 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -1,6 +1,13 @@ + + %s nyamuni + + %s (Nyamuni) + + + Pilihan séjén Paluruh atawa asupkeun alamat @@ -49,8 +56,6 @@ Simpen kana koléksi - - Laporkeun masalah loka Bagikeun Dijalankeun ku %1$s - + Pidangan baca Buka di aplikasi @@ -105,18 +110,46 @@ Paluruh raramat + + + Setélan + + Dasar + + Umum + + Ngeunaan Mesin pamaluruh baku Paluruh Palang alamat + + Pitulung + + Peunteun dina Google Play + + Béré pangdeudeul + + Ngeunaan %1$s + + Hak Anjeun + + Kecap sandi Jadikeun panyungsi baku + + Terusan Nyungsi nyamuni + + Buka tutumbu di tab nyamuni Tambahan tarabas nyungsi nyamuni + + Aksésibilitas Serper Firefox Account biasa @@ -146,12 +179,30 @@ Setélan akun + + Émbohan + Singkronkeun ayeuna + + Pilih nu rék disingkronkeun + + Jujutan Markah + + Asup log + + Buka tab + + Kaluar + + Ngaran parangkat + + Nyingkronkeun… + Kilung Palacakan pikeun ieu loka ayeuna pareum @@ -329,8 +380,6 @@ Otomatis mupus data nyungsi nalika anjeun milih tombol "Kaluar" ti menu utama Otomatis mupus data nyungsi nalika anjeun milih \"Kaluar\" ti menu utama - - Jujutan nyungsi Kaluar @@ -372,6 +421,9 @@ Bolay + + + Setélan Kilung Lenyepan diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 54ae7dbec..7b5cf3da7 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -1,5 +1,9 @@ + + கமுக்க %s + + %s (கமுக்க) கூடுதல் தேர்வுகள் @@ -14,23 +18,52 @@ உங்கள் திறந்த கீற்றுகள் இங்கே காண்பிக்கப்படும். + + உங்களின் ககுக்க கீற்றுகள் இங்கே காண்பிக்கப்படும். + + + 1 கீற்றைத் திற. கீற்றுகளிடையே மாறத் தட்டவும். + + திறந்த %1$s கீற்றுகள். கீற்றுகளிடையே மாறத் தட்டவும். + + + %1$s மொசில்லாவால் தயாரிக்கப்படுகிறது. + நீங்கள் ஒரு தனிப்பட்ட அமர்வில் இருக்கிறீர்கள் + + நீங்கள் பயன்பாட்டை விட்டு வெளியேறும்போது அல்லது அனைத்து கமுக் உலாவல் தாவல்களை மூடும்போது உங்கள் தேடல் மற்றும் உலாவல் வரலாற்றை %1$s துடைக்கிறது. இது வலைத்தளங்களுக்கோ அல்லது இணைய சேவை வழங்குனர்களுக்கோ தெரியாதபோது, இந்தக் கணினியைப் பயன்படுத்தும் மற்றவர்களிடமிருந்தும் இயங்கலையில் உங்களைக் கமுக்கமா வைத்திருப்பதையும் எளிதாக்குகிறது. + கமுக்க உலாவல் பற்றிய பொதுவான தொன்மங்கள் அமர்வை நீக்கு + + + உங்கள் முகப்புத் திரையிலிருந்து கமுக்க தாவல்களைத் திறக்கக் குறுக்குவழியைச் சேர்க்கவும். குறுக்குவழியைச் சேர்க்கவும் பரவாயில்லை நன்றி + + + பயர்பாக்சை வேகமாக அடைய. உங்கள் முகப்புத் திரையில் ஒரு சட்டகத்தைச் சேர். + + சட்டகத்தைச் சேர்க்கவும் + + இப்போதில்லை + புதிய கீற்று புதிய தனிப்பயன் கீற்று + + சிறந்த தளங்கள் + திறந்த கீற்றுகள் @@ -46,14 +79,26 @@ புத்தகக்குறி புத்தகக்குறியை திருத்து + + துணை நிரல்கள் + + இங்கே துணை நிரல்கள் இல்லை உதவி + + புதியவை என்ன அமைப்புகள் + + நூலகம் + + மேசைக்கணினி தளம் முகப்பு திரையில் சேர் நிறுவுக + + ஒத்திசைவு கீற்றுகள் பக்கத்தில் தேடு @@ -61,6 +106,8 @@ புதிய கீற்று + + திரட்டில் சேமி பகிர் @@ -76,9 +123,27 @@ %1$s மூலம் இயக்கப்படுகிறது வாசகர் பார்வை + + வாசிப்பு தோற்றத்தை மூடு + + செயலியில் திற தோற்றம் + + இணைக்க முடியவில்லை. அடையாளம் காண முடியாத URL திட்டம். + + + + தேர்ந்தெடுக்கப்பட்ட மொழி + + தேடல் + + சாதன மொழியைப் பின்பற்று + + மொழியைத் தேடவும் + வருடு @@ -87,9 +152,21 @@ தேடுபொறி அமைப்புகள் + + இதனுடன் தேடு: + + இந்த நேரத்தில், இதனுடன் தேடுங்கள்: + + ஒட்டுபலகையிலிருந்து இணைப்பை நிரப்புக அனுமதி + + அனுமதிக்காதே + + கமுக் அமர்வுகளில் தேடல் பரிந்துரைகளை அனுமதிக்கவா? + + நீங்கள் முகவரி பட்டையில் உள்ளிடும் அனைத்தையும் %s உங்கள் இயல்புநிலை தேடுபொறியுடன் பகிர்ந்து கொள்ளும். மேலும் அறிய @@ -99,11 +176,16 @@ இணையத்தில் தேடு + + குரலைத் தேடு + அமைவுகள் அடிப்படை + + பொது அறிமுகம் @@ -114,6 +196,8 @@ முகவரி பட்டை உதவி + + கூகுள் கடையில் மதிப்பிடுக கருத்து தெரிவிக்க கடன் அட்டைகள் மற்றும் முகவரிகள் + + இயல்புநிலை உலாவியாக அமைக்கவும் மேம்பட்டவை தனியுரிமை + + தனியுரிமை மற்றும் பாதுகாப்பு தள அனுமதிகள் + + கமுக்க உலாவல் இணைப்பைக் கமுக்க கீற்றில் திறக்க + + கமுக்க உலாவலியில் திரைப்பிடிப்பை அனுமதி கமுக்க உலாவல் குறுக்குவழியைச் சேர்க்கவும் அணுகுத்திறன் + + தனிப்பயன் பயர்பாக்சு கணக்குச் சேவையகம் + + தனிப்பயன் ஒத்திசைவு சேவையகம் + + பயர்பாக்சு கணக்கு/ஒத்திசைவு சேவையகம் மாற்றப்பட்டது. மாற்றங்களைச் செயல்படுத் செயலியிலிருந் வெளியேறுகிற… கணக்கு @@ -148,6 +246,10 @@ கருவிப்பட்டி கருப்பொருள் + + தனிப்பயனாக்கு + + உங்கள் பயர்பாக்சு கணக்குடன் புத்தகக்குறிகள், கடவுச்சொற்கள், மற்றும் பலவற்றை ஒத்திசைக்கத் தொடங்குங்கள். பயர்பாக்சு கணக்கு @@ -169,6 +271,8 @@ தேடல் பரிந்துரைகளைக் காட்டு + + குரல் தேடலைக் காட்டு கமுக்க அமர்வுகளில் காட்டு @@ -180,6 +284,12 @@ கணக்கு அமைப்புகள் + + இணைப்புகளைத் செயலியில் திறக்கவும் + + + துணை நிரல்கள் + இப்போது ஒத்திசை @@ -191,6 +301,8 @@ புத்தகக்குறிகள் புகுபதிகைகள் + + திறந்த கீற்றுகள் விடுபதிகை @@ -208,6 +320,11 @@ கடைசி ஒத்திசைவு: இல்லை + + %2$s %3$s இல் %1$s + பெறப்பட்ட கீற்றுகள் @@ -219,28 +336,57 @@ கீற்றுகள் பெறப்பட்டன + + %s இலிருந்து கீற்று + தடமறியல் பாதுகாப்பு தடமறியல் பாதுகாப்பு + + உங்களை இயங்கலையில் பின்தொடரும் உள்ளடக்கம் மற்றும் நிரல்களைத் தடு விதிவிலக்குகள் + + இத்தளங்களில் தடமறியல் பாதுகாப்பு முடக்கப்பட்டுள்ளது எல்லா தளங்களுக்கும் இயக்கு + + தேர்ந்த தளங்களுக்கான தடமறி பாதுகாப்பை முடக்க விதிவிலக்குகள் உங்களை அனுமதிக்கின்றன. மேலும் அறிய + + மொத்தமாக அணைக்கப்பட்டது, அதை இயக்க அமைப்புகளுக்குச் செல்லவும். + + + தொலைத்தகவல் + + பயனளவு மற்றும் தொழில்நுட்ப தரவு + + %1$s உலாவியைச் சிறந்ததாக்க உங்களுடைய உலாவிப் பற்றிய செயல்திறன், பயனளவு, வன்பொருள் மற்றும் தனிப்பயனாக்க தரவுகளை மொசில்லாவுடன் பகிர்கிறது + + சந்தைப்படுத்தல் தரவு + + நீங்கள் %1$s உலாவில் பயன்படுத்தும் அம்சங்களைப் பற்றிய தரவை, எங்களின் கைப்பேசிக்கான சந்தைப்படுத்தல் விற்பனையாளரான லீன்ப்ளமுடன் பகிர்ந்து கொள்கிறது. சோதனைகள் + + சோதனை அம்சங்களுக்காக மொசில்லாவை நிறுவித் தகவலைத் திரட்ட அனுமதி செயலிழப்பு அறிக்கையாளர் மொசில்லா புவியிடச்சேவை + + %s நிலவர அறிக்கை + ஒத்திசைவை இயக்கு + + மேசைத்தள பயர்பாக்சில் பிணைவதற்குறிய குறியீட்டை வருடிச் சேர்க்கவும் புகுபதிகை @@ -248,6 +394,9 @@ கணக்கை அகற்று + + + firefox.com/pair தளத்தில் குறியீட்டை வருடிச் சேர்]]> படக்கருவியைத் திற @@ -288,6 +437,8 @@ பிற புத்தகக்குறிகள் வரலாறு + + ஒத்திசைத் கீற்றுகள் வாசிப்புப் பட்டியல் @@ -308,6 +459,26 @@ கமுக்கக் கீற்றுகள் கீற்றைச் சேர் + + கமுக்க கீற்றைச் சேர் + + கமுக்க + + திறந்த கீற்றுகள் + + திரட்டில் சேமி + + கீற்றுகளைப் பகிர் + + எல்லாக் கீற்றுகளையும் மூடு + + புதிய கீற்று + + முகப்பிற்கு செல் + + கீற்று முறையை நிலைமாற்று + + திரட்டிலிருந்து கீற்றை நீக்கு கீற்றை மூடு @@ -318,6 +489,8 @@ எல்லாக் கீற்றுகளையும் மூடு கீற்றுகளைப் பகிர் + + கீற்றுகளை சேகரிப்பில் சேமிக்கவும் கீற்றுப் பட்டி @@ -328,6 +501,8 @@ சேமி பகிர் + + தற்போதைய அமர்வுப் படம் திரட்டில் சேமி @@ -337,4 +512,909 @@ கீற்றுகளைத் திற - + + நீக்கு + + %1$s (கமுக் பயன்முறை) + + + + வரலாற்றை அழி + + கண்டிப்பாக உங்கள் வரலாற்றை அழிக்க விரும்புகிறீர்களா? + + வரலாறு அழிக்கப்பட்டது + + %1$s அழிக்கப்பட்டது + + துடை + + நகலெடு + + பகிர் + + புதிய கீற்றில் திற + + கமுக்க கீ்ற்றில் திறக்கவும் + + அழி + + %1$d தேர்ந்த + + %1$d உருப்படிகளை அழி + + கடந்த 24 மணிநேரம் + + கடந்த 7 நாட்கள் + + கடந்த 30 நாட்கள் + + பழையவை + + வரலாறு ஏதுமில்லை + + + + மன்னிக்கவும். %1$s பக்கத்தை ஏற்ற முடியாது. + + கீழேயுள்ள இத்தாவலை மீட்டெடுக்க (அ) மூடச் செய்யலாம். + + + செயலிழப்பு அறிக்கையை மொசில்லாவுக்கு அனுப்பு + + கீற்றை மூடு + + கீற்றுகளை மீளமை + + + அமர்வு விருப்பங்கள் + + + அமர்வைப் பகிர் + + + + புத்தகக்குறி பட்டி + + புத்தகக்குறியை தொகு + + அடைவைத் தேர் + + நீங்கள் இக்கோப்புறையை நீக்குவதில் உறுதியாக இருக்கிறீர்களா? + + %1$s அழிக்கப்பட்டது + + கோப்புறையைச் சேர் + + புத்தகக்குறி சேர்க்கப்பட்டது + + புத்தகக்குறி சேமிக்கப்பட்டது + + தொகு + + தொகு + + தேர்வு செய் + + நகலெடு + + பகிர் + + புதிய கீற்றில் திற + + கமுக்க கீ்ற்றில் திற + + அழி + + சேமி + + %1$d தேர்ந்தது + + புத்தகக்குறியை தொகு + + + அடைவைத் தொகு + + + ஒத்திசைத் புத்தகக்குறிகளை காண உள்நுழைக + + உரளி + + அடைவு + + பெயர் + + அடைவைச் சேர் + + அடைவைத் தேர் + + ஒரு தலைப்பு வேண்டும் + + முறையற்ற முகவரி + + புத்தகக்குறிகள் இல்லை + + %1$s அழிக்கப்பட்டது + + புத்தகக்குறி அழிக்கப்பட்டது + + செயல்தவிர் + + + + அனுமதிகள் + + அமைவுகளுக்கு செல் + + விரைவான அமைவுகள் தாள் + + பரிந்துரைக்கப்பட்டது + + தள அனுமதிகளை நிர்வகிக்கவும் + + அனுமதிகளை துடை + + அனுமதியை துடை + + எல்லா தளங்களிலும் அனுமதிகளை துடைக்கவும் + + தானியக்கம் + + படக்கருவி + + ஒலிவாங்கி + + இருப்பிடம் + + அறிவிப்பு + + அனுமதிக்க கேள் + + தடுக்கப்பட்டது + + அனுமதித்தவை + + ஆண்ட்ராய்டால் தடுக்கப்பட்டது + + விதிவிலக்குகள் + + இயக்கு + + அணை + + + ஒலி மற்றும் காணொளியை அனுமதி + + கைப்பேசி பிணையத்தில் மட்டும் ஒலி மற்றும் காணொளியைத் தடு + + வை-பை இணையத்தில் ஒலி மற்றும் காணொளியை இயக்கு + + ஒலியை மட்டும் த + + ஒலி மற்றும் காணொளியை த + + இயக்கு + + முடக்கு + + + + தொகுப்புகள் + + சேகரிப்பு பட்டி + + உங்களுக்கு முக்கியமான விடையங்களைச் சேகரிக்கவும் + + விரைவான அணுகலுக்காக ஒத்த தேடல்கள், தளங்கள் மற்றும் கீற்றுகளை ஒன்றிணைக்கவும். + + கீற்றுகளைத் தேர் + + சேகரிப்பை தேர் + + சேகரிப்பை பெயரிடு + + புதிய தொகுப்பைச் சேர் + + அனைத்தையும் தேர் + + தேர்வனைத்தையும் நீக்கு + + + சேமிக்க கீற்றுகளைத் தேர் + + கீற்றுகள் தேர்ந்தன + + %d கீற்று தேர்ந்தது + + கீற்றுகள் சேமிக்கப்பட்டன! + + கீற்று சேமிக்கப்பட்ட! + + மூடு + + சேமி + + பார் + + + %d சேகரிப்பு + + + + அனுப்பு மற்றும் பகிர் + + பகிர் + + பகிர் + + தொடுப்பைப் பகிர் + + சாதனத்திற்கு அனுப்பு + + + + சமீபத்தில் பாவித்தவை + + ஒத்திசைக்க உள்நுழை + + அ.சாதனங்களுக்கும் அனுப்பு + + ஒத்திசைவுக்கு மீண்டும் இணை + + முடங்கலை + + மற்றொரு சாதனத்தை இணை + + ஒரு கீற்றை அனுப்ப, குறைந்தது ஒரு சாதனத்திலாவது பயர்பாக்சில் உள்நுழைக. + + புரிந்தது + + இச்செயலியுடன் பகிர முடியாது + + சாதனத்திற்கு அனுப்பு + + சாதனங்கள் இல்லை + + கீற்றுகளை அனுப்புவது பற்றி அறிக… + + மற்றொரு சாதனத்தை இணை… + + + + கமுக்க உலாவல் அமர்வு + + கமுக்க கீற்றுகளை அழி + + கமுக்க கீற்றுகளை மூடு + + திற + + நீக்கித் திற + + மூலம் இயக்கப்படுகிறது + + சேகரிப்பு அழிக்கப்பட்டது + + + சேகரிப்பு மறுபெயரிடப்பட்டது + + கீற்று அழிக்கப்பட்டது + + கீற்றுகள் அழிக்கப்பட்டன + + கீற்று மூடப்பட்டது + + கீற்றுகள் மூடப்பட்டன + + சிறந்த தளங்களில் சேர்க்கப்பட்டன! + + கமுக்க கீற்று மூடப்பட்டது + + கமுக்க கீற்றுகள் மூடப்பட்டன + + கமுக்க கீற்றுகள் அழிக்கப்பட்டன + + செயல்தவிர் + + பக்கம் நீக்கப்பட்டது + + செயல்தவிர் + + உறுதிசெய் + + %2$s திறக்க %1$s செயலியை அனுமதி + + அனுமதி + + மறு + + %1$s அழிக்க விரும்புகிறீர்களா? + + அழி + + ரத்து + + முழு திரை பயன்முறையில் நுழைகிறது + + தொடுப்பு நகலெடுக்கப்பட்டது + + இது மாதிரி உரை. இந்த அமைவைக் கொண்டு உரையின் அளவை அதிகரிக்கும்போதும் அல்லது குறைக்கும்போதும் எவ்வாறு தோன்றும் என்பதைக் காண்பிக்க உள்ளது. + + + வலைத்தளங்களில் உரையைப் பெரிதாக அல்லது சிறியதாக மாற்று + + எழுத்துரு அளவு + + + தானியிக்க எழுத்துரு அளவு + + எழுத்துரு அளவு உங்கள் ஆண்டராய்டு அமைவுகளுடன் பொருந்தும். எழுத்துரு அளவை நிர்வகிக்க இங்கே முடக்கு. + + + உலாவி வரலாற்றை அழி + + கீற்றுகளைத் திற + + %d கீற்றைகள் + + உலாவல் வரலாறு மற்றும் தள தரவு + + + %d முகவரிகள் + + வரலாறு + + %d பக்கங்கள் + + நினைவிகள் + + பெரும்பாலான தளங்களிலிருந்து வெளியேறுவீர்கள் + + தற்காலிக படங்கள் மற்றும் கோப்புகள் + + சேமிப்பிடத்தை விடுவிக்கிறது + + தள அனுமதிகள் + + உலாவி வரலாற்றை அழி + + வெளியேறும்போது உலாவல் தரவை அழி + + பிரதான பட்டியிலிருந்து "விலகு" என்பதைத் தேரும்போது உலாவல் தரவைத் தானாக நீக்குகிறது + + பிரதான பட்டியிலிருந்து \"விலகு\" என்பதைத் தேரும்போது உலாவல் தரவைத் தானாக நீக்குகிறது + + விலகு + + + இது உங்கள் உலாவல் தரவு அனைத்தையும் அழிக்கும். + + தேர்ந்தெடுக்கப்பட்ட உலாவல் தரவை %s செயலி நீக்கும். + + ரத்து + + அழி + + உலாவல் தரவு அழிக்கப்பட்டது + + உலாவி வரலாற்றை அழிக்கிறது… + + + + முன்னோட்ட பயர்பாக்சு இப்போது இராக்கால பயர்பாக்சு + + + + %s செயலிக்கு வருக! + + ஏற்கனவே கணக்கு வைத்திருக்கிறீர்களா? + + %s செயலியை அறிந்துக்கொள்ளுங்கள் + + புதிய வரவுகள் + + மறுவடிவமைக்கப்பட்ட %s பற்றி கேள்விகள் உள்ளனவா? மாற்றங்களை அறிய விரும்புகிறீர்களா? + + பதில்களை இங்கு பெறுங்கள் + + %s இலிருந்து ஆக அதிகமானதைப் பெறுங்கள். + + ஆம், புகுபதி + + புகுபதிகிறது… + + விடுபதிந்தே இரு + + ஒத்திசைவு இயக்கத்தில் + + புகுபதிகை தோல்வி + + தானியங்கு தனியுரிமை + + + தனியுரிமை மற்றும் பாதுகாப்பு அமைவுகள் உங்களைப் பின்தொடரும் தடமறிவான்கள், தீம்பொருள், நிறுவனங்களைத் தடுக்கிறது. + + நிலையான (இயல்புநிலை) + + குறைந்த தடமறிவான்களைத் தடுக்கிறது. பக்கங்கள் சாதாரணமாக ஏற்றப்படும். + + கண்டிப்பான (பரிந்துரைத்தது) + + கண்டிப்பான + + கூடுதல் தடமறிவான்கள், விளம்பரங்கள், துள்ளல்களைத் தடுக்கிறது. பக்கங்கள் வேகமாக ஏற்றப்படும், ஆனால் சில செயல்பாடுகள் வேலை செய்யாமல் போகலாம். + + ஒரு நிலையை எடுங்கள் + + + கீழ் கருவிப்பட்டையுடன் ஒரு-கை உலாவலை முயற்சியுங்கள் அல்லது அதை மேல்புறம் நகர்த்துங்கள். + + கமுக்கமாக உலாவுங்கள் + + கமுக்கக் கீற்றை ஒருமுறை திறக்க: %s சின்னத்தைத் தட்டுங்கள். + + ஒவ்வொரு முறையும் கமுக்கக் கீற்றுகளைத் திறக்க: உங்கள் கமுக்க உலாவல் அமைவுகளைப் புதுப்பியுங்கள். + + அமைவுகளைத் திற + + உங்கள் தனியுரிமை + + நீங்கள் பகிர்பவற்றின் மீதான கட்டுப்பாட்டை உங்களுக்கு வழங்க %s ஐ வடிவமைத்துள்ளோம் + இயங்கலையிலும் எங்களுடனும். + + எங்கள் தனியுரிமை அறிவிக்கையைப் படிக்க + + மூடு + + + உலாவத் தொடங்குக + + + + உங்கள் கருப்பொருளைத் தேர்க + + கருமை முறையைச் செயற்படுத்தி மின்கலனையும் உங்கள் விழியொளியையும் சேமியுங்கள். + + தானியக்கம் + + உங்கள் சாதன அமைவுகளுக்கு தகவமைக்கும் + + கருமை + + வெளிர் + + + கீற்றுகள் அனுப்பப்பட்டன! + + கீற்று அனுப்பப்பட்டது! + + அனுப்ப முடியவில்லை + + மறுமுயற்சி + + குறியீட்டை வருடு + + + வருடத் தயார் + + உங்கள் படக்கருவியால் புகுபதிக + + பதிலாக மின்னஞ்சல் பயன்படுத்துக + + %s உங்கள் கணக்குடன் ஒத்திசைவை நிறுத்தும், ஆனால் இச்சாதனத்திலுள்ள உங்கள் உலாவல் தரவை அழிக்காது. + + இணைப்பைநீக்கு + + இரத்துசெய் + + இயல்நிலை கோப்புறைகளைத் திருத்த முடியாது + + + + பாதுகாப்பு அமைவுகள் + + மேம்படுத்தப்பட்ட தடமறியல் பாதுகாப்பு + + பின்தொடரப்படாமல் உலாவுக + + உங்கள் தரவை உங்களிடமே வைத்திருங்கள். இயங்கலையில் உங்களைப் பின்தொடரும் மிகப்பொதுவான தடமறிவான்களிடமிருந்து %s உங்களைப் பாதுகாக்கிறது. + + மேலும் அறிய + + நிலையான (இயல்புநிலை) + + குறைந்த தடமறிவான்களைத் தடுக்கிறது. பக்கங்கள் சாதாரணமாக ஏற்றப்படும். + + நிலையான தடமறியல் பாதுகாப்பால் தடுக்கப்படுபவை + + கண்டிப்பான + + கூடுதல் தடமறிவான்கள், விளம்பரங்கள், துள்ளல்களைத் தடுக்கிறது. பக்கங்கள் வேகமாக ஏற்றப்படும், ஆனால் சில செயல்பாடுகள் வேலை செய்யாமல் போகலாம். + + கண்டிப்பான தடமறியல் பாதுகாப்பால் தடுக்கப்படுபவை + + தனிப்பயன் + + எந்தெந்த தடமறிவான்களையும் சிறுநிரல்களையும் தடுக்க வேண்டுமெனத் தேர்வுசெய்க. + + தனிப்பயன் தடமறியல் பாதுகாப்பால் தடுக்கப்படுபவை + + + நினைவிகள் + + பிற தள மற்றும் சமூக ஊடக கண்காணிப்பாளர்கள் + + பார்வையிடாத தளங்களிலிருந்து நினைவிகள் + + அனைத்து மூன்றாம் தரப்பு நினைவிகளும் (வலைத்தளங்களை உடைக்கக்கூடும்) + + + அனைத்து நினைவிகளும் (வலைத்தளங்களை உடைக்கக்கூடும்) + + உள்ளடக்கத்தைக் கண்காணித்தல் + + அனைத்து கீற்றுகளிலும் + + கமுக்க கீ்ற்றுகளில் மட்டும் + + தனிப்பயன் கீற்றுகளில் மட்டுமே + + + இரகசியபரிவர்த்தனையாளர்கள் + + கைரேகையாளர்கள் + தடுக்கப்பட்டவை + + அனுமதித்தவை + + சமூக பின்தொடரிகள் + + இணையத்தில் உங்களின் உலாவல் செயல்பாட்டைக் கண்காணிக்க சமூக பிணையங்களின் திறனைக் கட்டுப்படுத்துகிறது. + + பிற தள பின்தொடரி நினைவீகள் + + பல தளங்களில் உங்கள் உலாவல் தரவைத் தொகுக்க விளம்பர பிணையங்கள் மற்றும் பகுப்பாய்வு நிறுவனங்கள் பாவிக்கும் நினைவிகளைத் தடுக்கிறது. + + இரகசியபரிவர்த்தனையாளர்கள் + + மின்னியல் நாணயத்தை அறுவடைச் செய்யவல்ல தீங்கிழைக்கும் மென்பொருள் உங்கள் சாதனத்தை அணுகுவதிலிருந்து தடுக்கிறது. + + கைரேகையர்கள் + + + உங்கள் சாதனத்தைப் பற்றிய தனித்தனியாக அடையாளம் காணக்கூடிய கண்காணிப்பு நோக்கங்களுக்காகப் பயன்படுத்தக்கூடிய தரவு சேகரிப்பை நிறுத்துகிறது. + + உள்ளடக்கப் பின்தொடரல் + + பின்தொடரி குறியீட்டைக் கொண்ட விளம்பரங்கள், காணொளிகள் மற்றும் பிற உள்ளடக்கங்களை ஏற்றுவதிலிருந்து நிறுத்துகிறது. வலைத்தள செயல்பாட்டைப் பாதிக்கலாம். + + + கவசம் எப்போதும் ஊதா நிறமாக இருக்கிறது, ஒரு தளத்தில் பின்தொடரிகளை %s தடுத்த. மேலும் தகவலுக்குத் தட்டவும். + + இத்தளத்திற்கான பாதுகாப்புகள் இயக்கத்தில் உள்ளன + + இத்தளத்திற்கான பாதுகாப்புகள் முடக்கப்பட்டுள்ளன + + இத்தளத்திற்கு மேம்பட்ட தடமறி பாதுகாப்பு முடக்கப்பட்டுள்ளது. + + மீண்டும் செல்லவும் + + உங்கள் உரிமைகள் + + நாம் பயன்படுத்தும் திறந்த மூல மென்பொருகள் + + %s பக்கத்தில் புதியது என்ன + + %s |OSS நூலகங்கள் + + + ஆதரவு + + செயலிழப்புகள் + + தனியுரிமை அறிவுப்பு + + உங்கள் உரிமையை அறியவும் + + உரிம தகவல் + + நாம் பயன்படுத்தும் நூலகங்கள் + + பிழைத்திருத்த பட்டி: இயக்க %1$d இடது சொடுக்கவும் + பிழைத்திருத்த பட்டி இயக்கப்பட்டது + + + 1 கீற்று + + %d கீற்றுகள் + + + + நகலெடு + + ஒட்டிச் செல் + + ஒட்டு + + + URL ஒட்டுப்பலகையில் நகலெடுத்தது + + + முகப்பு திரையில் சேர் + + ரத்து + + சேர் + + தளத்திற்குத் தொடர் + + குறுக்குவழி பெயர் + + + விரைவான அணுகலுக்கும் மற்றும் செயலி போன்ற அனுபவத்துடனும் விரைவாக உலாவ நீங்கள் இந்த வலைப்பக்கத்தை உங்கள் முகப்பு திரையில் எளிதில் சேர்க்கலாம். + + + புகுபதிகைககளும் கடவுச்சொற்களும் + + புகுபதிகைகளியையும் கடவுச்சொற்களையும் சேமிக்கவும் + + சேமிக்கச் சொல்லுங்கள் + + எப்போதும் சேமிக்காதே + + தானாகநிரப்பு + + உள்நுழைவுகளை ஒத்திசைக்கவும் + + இயக்கு + + முடக்கு + + மீண்டும் இணை + + ஒத்திசைக்க உள்நுழை + + சேமிக்கப்பட்ட புகுபதிகைகள் + + நீங்கள் சேமித்த அல்லது %s உடன் ஒத்திசைக்கும் உள்நுழைவுகள் இங்கே காண்பிக்கப்படும். + + ஒத்திசைவு பற்றி மேலும் அறிய + + விதிவிலக்குகள் + + + சேமிக்கப்படாத உள்நுழைவுகள் மற்றும் கடவுச்சொற்கள் இங்கே காண்பிக்கப்படும். + + இந்த தளங்களுக்கு உள்நுழைவுகள் மற்றும் கடவுச்சொற்கள் சேமிக்கப்படாது. + + புகுபதிகைகளைத் தேடு + + அகரவரிசையின்படி + + சமீபத்தில் பாவித்தவை + + தளம் + + பயனர்பெயர் + + கடவுச்சொல் + + உங்கள் குறியீடை மீண்டும் உள்ளிடவும் + + நீங்கள் சேமித்த உள்நுழைவுகளைக் காண திறக்கவும் + + இத்தளத்துடனான இணைப்பு பாதுகாப்பற்றது. இங்கு உள்ளிட்ட உள்நுழைவுகளைச் சமரசம் செய்ய முடியும். + + மேலும் அறிய + + + உள்நுழைவைச் %s சேமிக்க வேண்டுமா? + + சேமி + + சேமிக்க வேண்டாம் + + கடவுச்சொல் ஒட்டுப்பலகைக்கு நகலெடுக்கப்பட்டது + + பயனர் ஒட்டுப்பலகைக்கு நகலெடுக்கப்பட்டது + + தளம் ஒட்டுப்பலகைக்கு நகலெடுக்கப்பட்டது + + கடவுச்சொல்லை நகலெடு + + பயனர் பெயரை நகலெடு + + தளத்தை நகலெடு + + கடவுச்சொல்லை காட்டு + + கடவுச்சொல்லை மறை + + நீங்கள் சேமித்த உள்நுழைவுகளைக் காண திறக்கவும் + + உங்கள் உள்நுழைவுகளையும் கடவுச்சொற்களையும் பாதுகாக்கவும் + + + உங்கள் சாதனம் பிறரிடம் இருக்கும்போது சேமித்த புகுபதிகைகளையும் கடவுச்சொற்களையும் அணுகுவதிலிருந்து பாதுகாக்க சாதனப் பூட்டு வடிவம், பின், அல்லது கடவுச்சொல்லை அமையுங்கள். + + பிறகு + + இப்போதே அமை + + உங்கள் சாதனத்தைத் திறக்க + + எல்லாத் தளங்களிலும் பெரிதாக்கம் + + இச்சைகையைத் தடுக்கும் தளங்களில் கூட நுள்ளிப் பெரிதாக்குவதை அனுமதிக்க செயற்படுத்துங்கள். + + பெயர் (A-Z) + + கடைசி பயன்பாடு + + புகுபதிகைகள் வரிசைப்படுத்தல் பட்டி + + + தேடுபொறியைச் சேர் + + தேடுபொறியைத் திருத்து + + சேர் + + சேமி + + திருத்து + + நீக்கு + + + மற்றவை + + பெயர் + + பயன்படுத்த வேண்டிய தேடல் தொடர் + + வினவலை “%s” ஆக மாற்றுக. எ.கா:\nhttps://www.google.com/search?q=%s + + மேலும் அறிய + + தனிப்பயன் தேடுபொறி விவரங்கள் + + மேலும் அறிய தொடுப்பு + + + தேடுபொறி பெயரை உள்ளிடுக + + “%s” பெயருடன் தேடுபொறி ஏற்கனவே உள்ளது. + + ஒரு தேடல் தொடரை உள்ளிடுக + + தேடல் தொடர் எ.கா வடிவத்தை ஒத்துள்ளதா எனப் பாருங்கள் + + “%s” உடன் இணைப்பதில் பிழை + + %s உருவாக்கப்பட்டது + + %s சேமிக்கப்பட்டது + + %s நீக்கப்பட்டது + + + புத்தம் புதிய %s க்கு வருக + + இயங்கலையில் சிறப்பாகச் செயல்பட உங்களுக்கு உதவும் மேம்பட்ட செயல்திறன், அம்சங்களுடன் முற்றிலும் மறுவடிவமைக்கப்பட்ட உலாவி உங்களுக்காகக் காத்திருக்கிறது.\n\n நாங்கள் %s புதுப்பிக்கும் வரை காத்திருங்கள் + + %s புதுப்பிக்கிறது… + + %s தொடங்குக + + பெயர்வு முடிந்தது + + கடவுச்சொற்கள் + + + அனுமதிக்க: + + 1. ஆண்ட்ராய்டு அமைவுகளுக்குச் செல்க + + அனுமதிகளைத் தட்டுக]]> + + %1$s ஐ இயக்கத்திற்கு மாற்றுக]]> + + + பாதுகாப்பான இணைப்பு + + பாதுகாப்பற்ற இணைப்பு + + + அனைத்து தளங்களிலும் எல்லா அனுமதிகளையும் நீக்க விரும்புகிறீர்களா? + + இந்தத் தளத்திற்கான எல்லா அனுமதிகளையும் நீக்க விரும்புகிறீர்களா? + + இந்தத் தளத்திற்கான இந்த அனுமதியை நீக்க விரும்புகிறீர்களா? + + தள விதிவிலக்குகள் இல்லை + + முதன்மை கட்டுரைகள் + + இந்தப் புத்தகக்குறியை அழிக்க விரும்புகிறீர்களா? + + முதன்மைத் தளங்களில் சேர் + + சரிபார்த்தது: %1$s + + நீக்கு + + திருத்து + + இந்தப் புகுபதிகையை நீக்க விரும்புகிறீர்களா? + + நீக்கு + + புகுபதிகை விருப்பங்கள் + + திருத்தக்கூடிய உரை களம் புகுபதிகைக்கான வலை முகவரிக்கானது. + + திருத்தக்கூடிய உரை களம் புகுபதிகைக்கான பயனர் பெயருக்கானது. + + திருத்தக்கூடிய உரை களம் புகுபதிகைக்கான கடவுச்சொல்லுக்கானது. + + புகுபதிகையில் மாற்றங்களைச் சேமி. + + மாற்றங்களைக் கைவிடு + + திருத்து + + கடவுச்சொல் தேவை + + குரல் தேடல் + + இப்போது பேசுக + + அந்தப் பயனர்பெயருடன் ஒரு புகுபதிகை ஏற்கனவே உள்ளது + + + மற்றொரு சாதனத்தை இணைக்க. + + + மறு-அங்கீகரியுங்கள். + + கீற்று ஒத்திசைவைச் செயற்படுத்துங்கள். + + உங்கள் மற்ற கருவிகளிலிருந்து கீற்றுகளின் பட்டியலைப் பார்க்க. + + ஒத்திசைக்க புகுபதிக + + + + முதன்மை தள வரம்பை அடைந்தது + + புதிய முதன்மை தளத்தைச் சேர்க்க, ஒன்றை அகற்றுங்கள். தளத்தை நெடுநேரம் அழுத்தி அகற்று என்பதைத் தேர்ந்தெடுங்கள். + + சரி, புரிந்தது + + diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index c9a0dcfd3..d0af1657b 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -15,6 +15,9 @@ మీ అంతరంగిక ట్యాబులు ఇక్కడ కనిపిస్తాయి. + + ఫరవాలేదు వద్దు + ఇప్పుడు కాదు @@ -29,14 +32,26 @@ తెరిచివున్న ట్యాబులు వెనుకకు + + పొడగింతలు + + పొడగింతలేమీ లేవు సహాయం కొత్తవి ఏమిటి అమరికలు + + గ్రంథాలయం + + డెస్క్‌టాప్ సైటు + + ముంగిలి తెరకు చేర్చు స్థాపించు + + సింకైన ట్యాబులు కొత్త ట్యాబు @@ -133,6 +148,9 @@ ప్రయోగాలు + + ఖాతాను తొలగించు + రద్దుచేయి @@ -173,6 +191,8 @@ అంతరంగికం తెరిచివున్న ట్యాబులు + + అన్ని ట్యాబులను పంచుకో ట్యాబులన్నీ మూసివేయి @@ -182,6 +202,8 @@ ట్యాబును మూసివేయి %s ట్యాబును మూసివేయి + + తెరిచివున్న ట్యాబుల మెనూ ట్యాబులన్నీ మూసివేయి @@ -204,6 +226,10 @@ is a digit showing the number of items you have selected --> %1$d అంశాలను తొలగించు + + గత 24 గంటలు + + గత 7 రోజులు గత 30 రోజులు @@ -214,6 +240,11 @@ ట్యాబును మూసివేయి + + సెషను ఎంపికలు + + + సంచయం చేర్చు తొలగించు @@ -227,14 +258,37 @@ అనుమతులు + + అమరికలకు వెళ్లు + + కెమెరా + + మైక్రోఫోను స్థానం మినహాయింపులు + + ఆడియోను మాత్రమే నిరోధించు + + ఆడియో, వీడియోలను నిరోధించు + సేకరణలు + + అన్నిటినీ ఎంచుకో + + %d ట్యాబులు ఎంచుకున్నారు + + %d ట్యాబు ఎంచుకున్నారు + + ట్యాబులు భద్రమయ్యాయి! + + ట్యాబు భద్రమయింది! మూసివేయి @@ -243,18 +297,100 @@ చూడండి + + సేకరణ %d + + + పరికరానికి పంపించు + + అన్ని చర్యలు + + ఇటీవల వాడినవి + + పరికరాలన్నిటికీ పంపించు + + ఆఫ్‌లైన్ + + మరొక పరికరాన్ని అనుసంధానించు + + అర్థమైంది + + ఈ అనువర్తనంతో పంచుకోలేము + + పరికరానికి పంపించు + + పరికరాలేమీ అనుసంధానం కాలేదు + + ట్యాబులు పంపడం గురించి తెలుసుకోండి… + + మరొక పరికరాన్ని అనుసంధానించు… + + + + అంతరంగిక విహరణ సెషను + + అంతరంగిక ట్యాబులను తొలగించు + + అంతరంగిక ట్యాబులను మూసివేయి తెరువు + + తొలగించి, తెరువు + + దీనితో శక్తిమంతం + + సేకరణ తొలగించబడింది + + సేకరణ పేరు మార్చబడింది + + ట్యాబు తొలగించబడింది + + ట్యాబులు తొలగించబడ్డాయి + + ట్యాబు మూసివేయబడింది + + ట్యాబులు మూసివేయబడ్డాయి + + మేటి సైట్లకు చేర్చబడింది! + + అంతరంగిక ట్యాబు మూసివేయబడింది + + అంతరంగిక ట్యాబులు మూసివేయబడ్డాయి + + అంతరంగిక ట్యాబులు తొలగించబడ్డాయి + + చర్య రద్దుచేయి + + సైటు తీసివేయబడింది + + చర్య రద్దుచేయి + + నిర్ధారించు + + %2$s తెరవడానికి %1$s‌ను అనుమతించు అనుమతించు + + తిరస్కరించు + + మీరు నిజంగానే %1$s‌ను తొలగించాలనుకుంటున్నారా? తొలగించు రద్దుచేయి + + నిండు తెర రీతిలోకి వెళ్తున్నారు + + URL కాపీ అయ్యింది + + వెబ్‌సైట్లలో వచనాన్ని పెద్దదిగా లేదా చిన్నదిగా చేయండి ఫాంటు పరిమాణం + + విహరణ డేటాను తొలగించు తెరిచివున్న ట్యాబులు @@ -271,12 +407,18 @@ కుకీలు + + సైటు అనుమతులు + రద్దుచేయి తొలగించు + + కొత్త నైట్లీని పొందండి + @@ -287,9 +429,44 @@ కొత్తవేమిటో చూడండి ఇక్కడ సమాధానాలు పొందండి + + Firefox లోనికి ప్రవేశించండి + + ప్రామాణికం (అప్రమేయం) + + తక్కువ ట్రాకర్లను నిరోధిస్తుంది. పేజీలు మామూలుగానే తెరుచుకుంటాయి. + + కఠినం (సిఫార్సు చేయబడింది) + + కఠినం + + అమరికలను తెరువు + + మీ అంతరంగికత మూసివేయి + + + మీ అలంకారాన్ని ఎంచుకోండి + + + మీ పరికర అమరికలకు తగ్గట్టు మారుతుంది + + + ట్యాబులు పంపబడ్డాయి! + + ట్యాబు పంపబడింది! + + పంపించలేకపోయాం + + మళ్లీ ప్రయత్నించు + + కోడును స్కాను చేయండి + + మీ కెమెరాతో ప్రవేశించండి + + లేదా ఈమెయిలు వాడండి రద్దుచేయి diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f4c1fb584..e00860230 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -818,7 +818,7 @@ Вкладки закрито - Додано до найпопулярніших сайтів! + Додано до популярних сайтів! Приватну вкладку закрито @@ -1400,7 +1400,7 @@ Ви впевнені, що хочете видалити цю закладку? - Додати до найпопулярніших сайтів + Додати до популярних сайтів Засвідчено: %1$s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 5b6a42ab9..6f7d7c1e6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -940,9 +940,7 @@ Firefox Nightly 已接手原 Firefox Preview 功能 - Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n - -若想要有較穩定的使用體驗,請下載我們的 Beta 測試版。 + Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n若想要有較穩定的使用體驗,請下載我們的 Beta 測試版。 下載 Firefox for Android Beta 測試版 diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index 998a84232..462c8dd3e 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -33,9 +33,11 @@ import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineView import mozilla.components.feature.search.SearchUseCases +import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tabs.TabsUseCases +import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.After import org.junit.Assert.assertEquals @@ -93,6 +95,8 @@ class DefaultBrowserToolbarControllerTest { @RelaxedMockK private lateinit var tabCollectionStorage: TabCollectionStorage @RelaxedMockK private lateinit var topSiteStorage: TopSiteStorage @RelaxedMockK private lateinit var readerModeController: ReaderModeController + @RelaxedMockK private lateinit var sessionFeatureWrapper: ViewBoundFeatureWrapper + @RelaxedMockK private lateinit var sessionFeature: SessionFeature private val store: BrowserStore = BrowserStore(initialState = BrowserState( listOf( createTab("https://www.mozilla.org", id = "reader-inactive-tab"), @@ -124,6 +128,7 @@ class DefaultBrowserToolbarControllerTest { every { activity.components.core.sessionManager } returns sessionManager every { activity.components.core.store } returns store every { sessionManager.selectedSession } returns currentSession + every { sessionFeatureWrapper.get() } returns sessionFeature val onComplete = slot<() -> Unit>() every { browserAnimator.captureEngineViewAndDrawStatically(capture(onComplete)) } answers { onComplete.captured.invoke() } @@ -469,7 +474,7 @@ class DefaultBrowserToolbarControllerTest { controller.handleToolbarItemInteraction(item) - verify { engineView.release() } + verify { sessionFeature.release() } verify { currentSession.customTabConfig = null } verify { sessionManager.select(currentSession) } verify { activity.startActivity(openInFenixIntent) } @@ -571,6 +576,7 @@ class DefaultBrowserToolbarControllerTest { bookmarkTapped = bookmarkTapped, readerModeController = readerModeController, sessionManager = sessionManager, + sessionFeature = sessionFeatureWrapper, onTabCounterClicked = onTabCounterClicked, onCloseTab = onCloseTab ).apply { diff --git a/app/src/test/java/org/mozilla/fenix/ext/DrawableTest.kt b/app/src/test/java/org/mozilla/fenix/ext/DrawableTest.kt index 9eaa43849..960435c2e 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/DrawableTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/DrawableTest.kt @@ -37,7 +37,7 @@ class DrawableTest { override fun draw(canvas: Canvas) {} override fun setAlpha(alpha: Int) {} - override fun setColorFilter(cf: ColorFilter) {} + override fun setColorFilter(cf: ColorFilter?) {} override fun onBoundsChange(bounds: Rect) { boundsChanged = true super.onBoundsChange(bounds) 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 bc2c29e44..df484d0cb 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 @@ -7,7 +7,6 @@ package org.mozilla.fenix.library.bookmarks import android.content.ClipData import android.content.ClipboardManager import android.content.Context -import androidx.core.content.getSystemService import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.NavDirections @@ -18,7 +17,6 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk -import io.mockk.mockkStatic import io.mockk.runs import io.mockk.slot import io.mockk.spyk @@ -42,7 +40,7 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.bookmarkStorage import org.mozilla.fenix.ext.components -@SuppressWarnings("TooManyFunctions", "LargeClass") +@Suppress("TooManyFunctions", "LargeClass") @ExperimentalCoroutinesApi class BookmarkControllerTest { @@ -51,6 +49,7 @@ class BookmarkControllerTest { private val bookmarkStore = spyk(BookmarkFragmentStore(BookmarkFragmentState(null))) private val context: Context = mockk(relaxed = true) private val scope = TestCoroutineScope() + private val clipboardManager: ClipboardManager = mockk(relaxUnitFun = true) private val navController: NavController = mockk(relaxed = true) private val sharedViewModel: BookmarksSharedViewModel = mockk() private val loadBookmarkNode: suspend (String) -> BookmarkNode? = mockk(relaxed = true) @@ -90,13 +89,6 @@ class BookmarkControllerTest { @Before fun setup() { - // needed for mocking 'getSystemService()' - mockkStatic( - "androidx.core.content.ContextCompat", - "android.content.ClipData", - "org.mozilla.fenix.ext.ContextKt" - ) - every { homeActivity.components.services } returns services every { navController.currentDestination } returns NavDestination("").apply { id = R.id.bookmarkFragment @@ -105,8 +97,9 @@ class BookmarkControllerTest { every { sharedViewModel.selectedFolder = any() } just runs controller = DefaultBookmarkController( - context = homeActivity, + activity = homeActivity, navController = navController, + clipboardManager = clipboardManager, scope = scope, store = bookmarkStore, sharedViewModel = sharedViewModel, @@ -247,10 +240,7 @@ class BookmarkControllerTest { @Test fun `handleCopyUrl should copy bookmark url to clipboard and show a toast`() { - val clipboardManager: ClipboardManager = mockk(relaxed = true) val urlCopiedMessage = context.getString(R.string.url_copied) - every { any().getSystemService() } returns clipboardManager - every { ClipData.newPlainText(any(), any()) } returns mockk(relaxed = true) controller.handleCopyUrl(item) diff --git a/app/src/test/java/org/mozilla/fenix/library/history/HistoryControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/history/HistoryControllerTest.kt index 028ccfd2a..b3004e257 100644 --- a/app/src/test/java/org/mozilla/fenix/library/history/HistoryControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/history/HistoryControllerTest.kt @@ -178,7 +178,7 @@ class HistoryControllerTest { controller.handleCopyUrl(historyItem) verify { - clipboardManager.primaryClip = capture(clipdata) + clipboardManager.setPrimaryClip(capture(clipdata)) snackbar.show() } assertEquals(1, clipdata.captured.itemCount) diff --git a/app/src/test/java/org/mozilla/fenix/utils/ClipboardHandlerTest.kt b/app/src/test/java/org/mozilla/fenix/utils/ClipboardHandlerTest.kt index c422e73be..c4eacde88 100644 --- a/app/src/test/java/org/mozilla/fenix/utils/ClipboardHandlerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/utils/ClipboardHandlerTest.kt @@ -7,12 +7,12 @@ package org.mozilla.fenix.utils import android.content.ClipData import android.content.ClipboardManager import android.content.Context -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner 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.helpers.FenixRobolectricTestRunner @RunWith(FenixRobolectricTestRunner::class) class ClipboardHandlerTest { @@ -32,7 +32,7 @@ class ClipboardHandlerTest { fun getText() { assertEquals(null, clipboardHandler.text) - clipboard.primaryClip = ClipData.newPlainText("Text", clipboardText) + clipboard.setPrimaryClip(ClipData.newPlainText("Text", clipboardText)) assertEquals(clipboardText, clipboardHandler.text) } @@ -48,7 +48,7 @@ class ClipboardHandlerTest { fun getUrl() { assertEquals(null, clipboardHandler.url) - clipboard.primaryClip = ClipData.newPlainText("Text", clipboardUrl) + clipboard.setPrimaryClip(ClipData.newPlainText("Text", clipboardUrl)) assertEquals(clipboardUrl, clipboardHandler.url) } @@ -56,7 +56,7 @@ class ClipboardHandlerTest { fun getUrlfromTextUrlMIME() { assertEquals(null, clipboardHandler.url) - clipboard.primaryClip = ClipData.newHtmlText("Html", clipboardUrl, clipboardUrl) + clipboard.setPrimaryClip(ClipData.newHtmlText("Html", clipboardUrl, clipboardUrl)) assertEquals(clipboardUrl, clipboardHandler.url) } } diff --git a/app/src/test/java/org/mozilla/fenix/widget/VoiceSearchActivityTest.kt b/app/src/test/java/org/mozilla/fenix/widget/VoiceSearchActivityTest.kt index 8327f869e..6ba449f6b 100644 --- a/app/src/test/java/org/mozilla/fenix/widget/VoiceSearchActivityTest.kt +++ b/app/src/test/java/org/mozilla/fenix/widget/VoiceSearchActivityTest.kt @@ -23,11 +23,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD import org.mozilla.fenix.IntentReceiverActivity +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.PREVIOUS_INTENT import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE import org.robolectric.Robolectric -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.robolectric.Shadows import org.robolectric.android.controller.ActivityController import org.robolectric.shadows.ShadowActivity @@ -96,7 +96,7 @@ class VoiceSearchActivityTest { controller.create(savedInstanceState) controller.saveInstanceState(outState) - assertEquals(previousIntent, outState.getParcelable(PREVIOUS_INTENT) as Intent) + assertEquals(previousIntent, outState.getParcelable(PREVIOUS_INTENT)) } @Test diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 08a220aee..670302c5a 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 = "50.0.20200708130551" + const val VERSION = "50.0.20200709130100" } diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index e60c69faa..b3f6ff907 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -13,9 +13,9 @@ import java.util.Locale object Config { // Synchronized build configuration for all modules - const val compileSdkVersion = 28 + const val compileSdkVersion = 29 const val minSdkVersion = 21 - const val targetSdkVersion = 28 + const val targetSdkVersion = 29 @JvmStatic private fun generateDebugVersionName(): String {