1
0
Fork 0

Copione merged onto master
continuous-integration/drone/push Build is failing Details

master
blallo 2020-07-10 00:00:46 +02:00
commit 3ab24baa82
45 changed files with 3251 additions and 87 deletions

File diff suppressed because one or more lines are too long

View File

@ -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

View File

@ -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

View File

@ -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)
}

View File

@ -55,6 +55,7 @@ class DownloadTest {
}
}
@Suppress("Deprecation")
@After
fun tearDown() {
mockWebServer.shutdown()

View File

@ -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()
}
}
}
}
}

View File

@ -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")))
}

View File

@ -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),

View File

@ -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"))

View File

@ -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)))

View File

@ -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 {

View File

@ -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()))

View File

@ -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 {

View File

@ -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)

View File

@ -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))))
}

View File

@ -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<RecyclerView.ViewHolder>(
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<RecyclerView.ViewHolder>(
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<RecyclerView.ViewHolder>(
hasDescendant(withText(R.string.browser_menu_open_app_link))
)
).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}

View File

@ -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,

View File

@ -221,21 +221,37 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
private val collectionStorageObserver = object : TabCollectionStorage.Observer {
override fun onCollectionCreated(title: String, sessions: List<Session>) {
showTabSavedToCollectionSnackbar()
showTabSavedToCollectionSnackbar(sessions.size, true)
}
override fun onTabsAdded(tabCollection: TabCollection, sessions: List<Session>) {
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()
}
}

View File

@ -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<SessionFeature>,
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

View File

@ -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<ClipboardManager>()?.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)
}
}

View File

@ -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<BookmarkNode>(), UserInteractionHan
_bookmarkInteractor = BookmarkFragmentInteractor(
bookmarksController = DefaultBookmarkController(
context = requireContext(),
activity = requireActivity() as HomeActivity,
navController = findNavController(),
clipboardManager = requireContext().getSystemService(),
scope = viewLifecycleOwner.lifecycleScope,
store = bookmarkStore,
sharedViewModel = sharedViewModel,

View File

@ -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()

View File

@ -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<KeyguardManager>()!!
val intent = manager.createConfirmDeviceCredentialIntent(
getString(R.string.logins_biometric_prompt_message_pin),
getString(R.string.logins_biometric_prompt_message)

View File

@ -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<ClipboardManager>()!!
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?

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -217,6 +217,10 @@
<string name="preferences_private_browsing_options">Поверително разглеждане</string>
<!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Отваряне препратките в поверителен раздел</string>
<!-- Preference for allowing screenshots to be taken while in a private tab-->
<string name="preferences_allow_screenshots_in_private_mode">Снимки на екрана в поверителен режим</string>
<!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Добавяне на икона за поверителен режим</string>
<!-- Preference for accessibility -->
<string name="preferences_accessibility">Достъпност</string>
<!-- Preference category for account information -->
@ -233,6 +237,8 @@
<string name="preferences_sign_in_description">Синхронизирайте отметки, пароли и други с вашия Firefox Account</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox Account</string>
<!-- Preference text for account title when there was an error syncing FxA -->
<string name="preferences_account_sync_error">Свържете повторно, за да бъде възобновено синхронизирането</string>
<!-- Preference for language -->
<string name="preferences_language">Език</string>
<!-- Preference for data choices -->
@ -251,6 +257,8 @@
<string name="preferences_show_search_suggestions">Показване на предложения</string>
<!-- Preference title for switch preference to show voice search button -->
<string name="preferences_show_voice_search">Показване на гласово търсене</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">Показване в поверителен режим</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">Показване на предложения от буфера</string>
<!-- Preference title for switch preference to suggest browsing history when searching -->
@ -285,6 +293,14 @@
<string name="empty_device_name_error">Името не може да е празно.</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">Синхронизиране…</string>
<!-- Label summary indicating that sync failed. The first parameter is the date stamp showing last time it succeeded -->
<string name="sync_failed_summary">Грешка при синхронизиране. Последен успех: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_failed_never_synced_summary">Грешка при синхронизиране. Последно синхронизиране: никога</string>
<!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced -->
<string name="sync_last_synced_summary">Последно синхронизиране: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_never_synced_summary">Последно синхронизиране: никога</string>
<!-- Text for displaying the default device name.
The first parameter is the application name, the second is the device manufacturer name
and the third is the device model. -->
@ -320,6 +336,9 @@
<!-- Text displayed when there are no exceptions, with learn more link that brings users to a tracking protection SUMO page -->
<string name="exceptions_empty_message_learn_more_link">Научете повече</string>
<!-- Description in Quick Settings that tells user tracking protection is off globally for all sites, and links to Settings to turn it on -->
<string name="preferences_tracking_protection_turned_off_globally">Изключено глобално, посетете Настройки, за да го включите.</string>
<!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Телеметрия</string>
<!-- Preference switch for usage and technical data collection -->
@ -335,9 +354,14 @@
<!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Услуга за местоположение на Mozilla</string>
<!-- Preference switch for app health report. The first parameter is the name of the application (For example: Fenix) -->
<string name="preferences_fenix_health_report">Здравен доклад за %s</string>
<!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Включване на Sync</string>
<!-- Preference for pairing -->
<string name="preferences_sync_pair">Сканирайте кода за сдвояване в настолен Firefox</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">Вход</string>
<!-- Preference for reconnecting to FxA sync -->
@ -349,6 +373,8 @@
<!-- Instructions on how to access pairing -->
<string name="pair_instructions_2"><![CDATA[Сканирайте кода на QR, показан на <b>firefox.com/pair</b>]]></string>
<!-- Button to open camera for pairing -->
<string name="pair_open_camera">Отваряне на камерата</string>
<!-- Button to cancel pairing -->
<string name="pair_cancel">Отказ</string>
@ -364,6 +390,104 @@
<!-- Preference for using dark theme -->
<string name="preference_dark_theme">Тъмна</string>
<!-- Preference for using using dark or light theme automatically set by battery -->
<string name="preference_auto_battery_theme">Зададена от приложението за пестене на батерия</string>
<!-- Preference for using following device theme -->
<string name="preference_follow_device_theme">Следва темата на устройството</string>
<!-- Library -->
<!-- Option in Library to open Sessions page -->
<string name="library_sessions">Сесии</string>
<!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">Снимки на екрана</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">Изтегляния</string>
<!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">Отметки</string>
<!-- Option in library to open Desktop Bookmarks root page -->
<string name="library_desktop_bookmarks_root">Настолни отметки</string>
<!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">Меню с отметки</string>
<!-- Option in library to open Desktop Bookmarks "toolbar" page -->
<string name="library_desktop_bookmarks_toolbar">Лента с отметки</string>
<!-- Option in library to open Desktop Bookmarks "unfiled" page -->
<string name="library_desktop_bookmarks_unfiled">Други отметки</string>
<!-- Option in Library to open History page -->
<string name="library_history">История</string>
<!-- Option in Library to open Synced Tabs page -->
<string name="library_synced_tabs">Синхронизирани раздели</string>
<!-- Option in Library to open Reading List -->
<string name="library_reading_list">Списък за четене</string>
<!-- Menu Item Label for Search in Library -->
<string name="library_search">Търсене</string>
<!-- Settings Page Title -->
<string name="settings_title">Настройки</string>
<!-- Content description (not visible, for screen readers etc.): "Menu icon for items on a history item" -->
<string name="content_description_history_menu">Меню на елемент от историята</string>
<!-- Content description (not visible, for screen readers etc.): "Close button for library settings" -->
<string name="content_description_close_button">Затваряне</string>
<!-- Sessions -->
<!-- Title for the list of tabs -->
<string name="tab_header_label">Отворени раздели</string>
<!-- Title for the list of tabs in the current private session -->
<string name="tabs_header_private_title">Поверителни сесии</string>
<!-- Title for the list of tabs in the current private session -->
<string name="tabs_header_private_tabs_title">Поверителни раздели</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_tab">Добавяне на раздел</string>
<!-- Content description (not visible, for screen readers etc.): Add tab button. Adds a news tab when pressed -->
<string name="add_private_tab">Отваря поверителен раздел</string>
<!-- Text for the new tab button to indicate adding a new private tab in the tab -->
<string name="tab_drawer_fab_content">Поверителен</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">Отворени раздели</string>
<!-- Text shown in the menu for saving tabs to a collection -->
<string name="tab_tray_menu_item_save">Добавяне в списък</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">Споделяне на всички раздели</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">Затваряне на всички раздели</string>
<!-- Shortcut action to open new tab -->
<string name="tab_tray_menu_open_new_tab">Нов раздел</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">Начален екран</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">Превключване режима на раздела</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">Премахване на раздела от спъсъка</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">Затваряне на раздел</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
<string name="close_tab_title">Затваряне на раздел %s</string>
<!-- Content description (not visible, for screen readers etc.): Opens the open tabs menu when pressed -->
<string name="open_tabs_menu">Отваряне на меню Раздели</string>
<!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">Затваряне на всички раздели</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Споделяне на раздели</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection1">Запазване на раздели в списък</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Меню Раздели</string>
<!-- Tab menu item to share the tab -->
<string name="tab_share">Споделяне на раздел</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
<string name="current_session_delete">Изтриване</string>
<!-- Button in the current session menu. Saves the session when pressed -->
<string name="current_session_save">Запазване</string>
<!-- Button in the current session menu. Opens the share menu when pressed -->
<string name="current_session_share">Споделяне</string>
<!-- Content description (not visible, for screen readers etc.): Title icon for current session menu -->
<string name="current_session_image">Заглавна пиктограма на текущото меню на сесия</string>
<!-- Content description (not visible, for screen readers etc.): Quick settings sheet
to give users access to site specific information / settings. For example:
Secure settings status and a button to modify site permissions -->
<string name="quick_settings_sheet">Списък с бързи настройки</string>
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Меню Списъци</string>
<!-- Button to select all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_select_all">Избиране на всички</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
@ -375,10 +499,50 @@
<!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Запазване</string>
<!-- Content description (not visible, for screen readers etc.):
"Share" button. Opens the share menu when pressed. -->
<string name="share_button_content_description">Споделяне</string>
<!-- QR code scanner prompt which appears after scanning a code, but before navigating to it
First parameter is the name of the app, second parameter is the URL or text scanned-->
<string name="qr_scanner_confirmation_dialog_message">Разрешете %1$s да отвори %2$s</string>
<!-- text for the Firefox Preview feature section header
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_feature_section_header">Запознайте се с %s</string>
<!-- text for the "What's New" onboarding card header -->
<string name="onboarding_whats_new_header1">Вижте какво е новото</string>
<!-- text for the "what's new" onboarding card description
The first parameter is the short name of the app (e.g. Firefox) -->
<string name="onboarding_whats_new_description">Имате въпроси относно новия дизайн на %s? Искате ли да разберете какви са промените?</string>
<!-- text for underlined clickable link that is part of "what's new" onboarding card description that links to an FAQ -->
<string name="onboarding_whats_new_description_linktext">Получете отговори тук</string>
<!-- text for the firefox account onboarding card header
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_firefox_account_header">Извлечете максимума от %s</string>
<!-- text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header_2">Автоматична поверителност</string>
<!-- text for the tracking protection card description
The first parameter is the name of the app (e.g. Firefox Preview) -->
<string name="onboarding_tracking_protection_description_2">Настройките за поверителност и сигурност спират проследяващ и злонамерен код, както и компании, които ви преследват.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button_2">Стандартна (по подразбиране)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description_2">Спира малко проследявания. Страниците зареждат нормално.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">Строга (препоръчителна)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">Строга</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description_2">Спира повече проследявания, реклами и изскачащи прозорци. Страниците зареждат по-бързо, но може да не работят.</string>
<!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">Затваряне</string>
<!-- Onboarding theme -->
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">Изберете тема</string>
<!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">Преглеждайте без да бъдете следени</string>
@ -388,11 +552,23 @@
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Научете повече</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Връщане назад</string>
<!-- Preference to access list of saved logins -->
<string name="preferences_passwords_saved_logins_description_empty_learn_more_link">Научете повече за Sync.</string>
<!-- Learn more link that will link to a page with more information displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning_learn_more">Научете повече</string>
<!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon -->
<string name="saved_logins_menu_dropdown_chevron_icon_content_description">Меню за сортиране на регистрации</string>
<!-- Content description (not visible, for screen readers etc.): Title for the button to add a search engine in the action bar -->
<string name="search_engine_add_button_content_description">Добавяне</string>
<!-- Content description (not visible, for screen readers etc.): Title for the button to save a search engine in the action bar -->
<string name="search_engine_add_custom_search_engine_edit_button_content_description">Запазване</string>
<!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">Научете повече</string>
<!-- Accessibility description for the 'Learn more' link -->

View File

@ -28,6 +28,7 @@
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">Nalazite se u privatnoj sesiji</string>
<string name="private_browsing_common_myths">Uobičajeni mitovi o privatnom surfanju</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Obriši sesiju</string>
@ -210,6 +211,8 @@
<string name="preferences_allow_screenshots_in_private_mode">Dozvoli screenshote u privatnom surfanju</string>
<!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Dodaj prečicu za privatno surfanje</string>
<!-- Preference for accessibility -->
<string name="preferences_accessibility">Pristupačnost</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Zaseban Firefox Account server</string>
<!-- Preference to override the Sync token server -->
@ -230,6 +233,8 @@
<string name="preferences_sign_in_description">Sinhronizujte zabilješke, historiju i više od toga s vašim Firefox računom</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox račun</string>
<!-- Preference text for account title when there was an error syncing FxA -->
<string name="preferences_account_sync_error">Ponovo se povežite za nastavak sinhronizacije</string>
<!-- Preference for language -->
<string name="preferences_language">Jezik</string>
<!-- Preference for data choices -->
@ -358,6 +363,8 @@
<string name="preferences_sync_pair">Skenirajte kod za uparivanje u desktop Firefoxu</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">Prijava</string>
<!-- Preference for reconnecting to FxA sync -->
<string name="preferences_sync_sign_in_to_reconnect">Prijavite se radi ponovnog povezivanja</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">Ukloni račun</string>
@ -439,18 +446,24 @@
<string name="tab_tray_menu_open_new_tab">Novi tab</string>
<!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">Početni</string>
<!-- Shortcut action to toggle private mode -->
<string name="tab_tray_menu_toggle">Promijeni režim taba</string>
<!-- Content description (not visible, for screen readers etc.): Removes tab from collection button. Removes the selected tab from collection when pressed -->
<string name="remove_tab_from_collection">Ukloni tab iz kolekcije</string>
<!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">Zatvori tab</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
<string name="close_tab_title">Zatvori tab %s</string>
<!-- Content description (not visible, for screen readers etc.): Opens the open tabs menu when pressed -->
<string name="open_tabs_menu">Meni otvorenih tabova</string>
<!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">Zatvori sve tabove</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Podijeli tabove</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection1">Spasi tabove u kolekciju</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">Meni tabova</string>
<!-- Tab menu item to share the tab -->
<string name="tab_share">Podijeli tab</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
@ -804,8 +817,6 @@
<!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Obriši podatke surfanja pri izlazu</string>
<!-- Category for history items to delete on quit in delete browsing data on quit -->
<string name="preferences_delete_browsing_data_on_quit_browsing_history">Historija surfanja</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Ugasi</string>

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,6 @@
<string name="content_description_disable_private_browsing_button">Desactivar la navigacion privada.</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Recèrca o adreça</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">Cap donglet pas dobèrt</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Suprimir la session</string>
@ -278,10 +276,22 @@
<!-- Text for the menu button to remove a top site -->
<string name="remove_top_site">Suprimir</string>
<!-- History -->
<!-- Text for the button to clear all history -->
<string name="history_delete_all">Escafar listoric</string>
<!-- Text for the dialog to confirm clearing all history -->
<string name="history_delete_all_dialog">Volètz vertadièrament netejar listoric ?</string>
<!-- Text for the snackbar to confirm that multiple browsing history items has been deleted -->
<string name="history_delete_multiple_items_snackbar">Istoric escafat</string>
<!-- Text for the snackbar to confirm that a single browsing history item has been deleted. The first parameter is the shortened URL of the deleted history item. -->
<string name="history_delete_single_item_snackbar">%1$s suprimit</string>
<!-- Text for positive action to delete history in deleting history dialog -->
<string name="history_clear_dialog">Escafar</string>
<!-- Text for the button to delete a single history item -->
<string name="history_delete_item">Suprimir</string>
<!-- Text for the button to clear selected history items. The first parameter
is a digit showing the number of items you have selected -->
<string name="history_delete_some">Suprimir %1$d elements</string>
<!-- Text for the header that groups the history for last 24 hours -->
<string name="history_24_hours">Las darrièras 24 oras</string>
<!-- Text for the header that groups the history the past 7 days -->
@ -297,6 +307,8 @@
<!-- Restore tab button text on the tab crash page -->
<string name="tab_crash_restore">Restablir longlet</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete the selected folder -->
<string name="bookmark_delete_folder_confirmation_dialog">Volètz vertadièrament suprimir aqueste dorsièr ?</string>
<!-- Bookmark overflow menu copy button -->
<string name="bookmark_menu_copy_button">Copiar</string>
<!-- Bookmark overflow menu share button -->
@ -313,6 +325,9 @@
<!-- Bookmark editing error missing or improper URL -->
<string name="bookmark_invalid_url_error">URL invalida</string>
<!-- Bookmark snackbar message on deleting multiple bookmarks -->
<string name="bookmark_deletion_multiple_snackbar_message_2">Marcapagina suprimit</string>
<!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">Anar als paramètres</string>
<!-- Preference for altering the camera access for all websites -->
@ -347,4 +362,69 @@
<!-- Text for the warning message on the Add new device screen -->
<string name="sync_add_new_device_message">Cap de periferic pas connectat</string>
<!-- Text shown in snackbar when user deletes a tab -->
<string name="snackbar_tab_deleted">Onglet suprimit</string>
<!-- Text shown in snackbar when user deletes all tabs -->
<string name="snackbar_tabs_deleted">Onglets suprimits</string>
<!-- Text for action to confirm deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_confirm">Confirmar</string>
<!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name -->
<string name="tab_collection_dialog_message">Volètz vertadièrament suprimir %1$s ?</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">Suprimir</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">Anullar</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">Onglets dobèrts</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d onglets</string>
<!-- Subtitle for the data and history items in delete browsing data, parameter will be replaced with the
number of history items the user has -->
<string name="preferences_delete_browsing_data_browsing_data_subtitle">%d adreças</string>
<!-- Title for history items in Delete browsing data -->
<string name="preferences_delete_browsing_data_browsing_history_title">Istoric</string>
<!-- Subtitle for the history items in delete browsing data, parameter will be replaced with the
number of history pages the user has -->
<string name="preferences_delete_browsing_data_browsing_history_subtitle">%d paginas</string>
<!-- Title for the cookies item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies">Cookies</string>
<!-- Title for the cached images and files item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cached_files">Imatges e fichièrs en cache</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Sortir</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">Anullar</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">Suprimir</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Anullar</string>
<!-- Cancel button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_cancel">Anullar</string>
<!-- Text for the menu button to delete a search engine -->
<string name="search_engine_delete">Suprimir</string>
<!-- Text shown when a user successfully deletes a custom search engine -->
<string name="search_delete_search_engine_success_message">%s : supression realizada</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete all the permissions for all sites-->
<string name="confirm_clear_permissions_on_all_sites">Volètz vertadièrament suprimir totas las autorizacions per totes los sites ?</string>
<!-- Confirmation message for a dialog confirming if the user wants to delete all the permissions for a site-->
<string name="confirm_clear_permissions_site">Volètz vertadièrament suprimir totas las autorizacions per aqueste site ?</string>
<!-- Confirmation message for a dialog confirming if the user wants to set default value a permission for a site-->
<string name="confirm_clear_permission_site">Volètz vertadièrament suprimir aquesta autorizacion per aqueste site ?</string>
<!-- Bookmark deletion confirmation -->
<string name="bookmark_deletion_confirmation">Sètz segur que volètz suprimir aqueste marcapagina ?</string>
<!-- Login overflow menu delete button -->
<string name="login_menu_delete_button">Suprimir</string>
<!-- Message in delete confirmation dialog for logins -->
<string name="login_deletion_confirmation">Sètz segur que volètz suprimir aqueste identificant ?</string>
<!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">Suprimir</string>
</resources>

View File

@ -41,7 +41,7 @@
<!-- Private mode shortcut "contextual feature recommendation" (CFR) -->
<!-- Text for the main message -->
<string name="cfr_message">Adiciona um atalho na tela inicial para abrir abas privativas.</string>
<string name="cfr_message">Adicione um atalho na tela inicial para abrir abas privativas.</string>
<!-- Text for the positive button -->
<string name="cfr_pos_button_text">Adicionar atalho</string>
<!-- Text for the negative button -->
@ -221,7 +221,7 @@
<!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Navegação privativa</string>
<!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Abrir links em uma aba privativa</string>
<string name="preferences_open_links_in_a_private_tab">Abrir links em abas privativas</string>
<!-- Preference for allowing screenshots to be taken while in a private tab-->
<string name="preferences_allow_screenshots_in_private_mode">Permitir capturas de tela na navegação privativa</string>
<!-- Preference for adding private browsing shortcut -->
@ -700,7 +700,7 @@
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed -->
<string name="collection_menu_button_content_description">Menu de coleções</string>
<!-- No Open Tabs Message Header -->
<string name="no_collections_header1">Colete o que é importante para você</string>
<string name="no_collections_header1">Colecione o que é importante para você</string>
<!-- Label to describe what collections are to a new user without any collections -->
<string name="no_collections_description1">Agrupe pesquisas, sites e abas semelhantes para acesso rápido mais tarde.</string>
<!-- Title for the "select tabs" step of the collection creator -->

View File

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_5">%s nyamuni</string>
<!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="app_name_private_4">%s (Nyamuni)</string>
<!-- Home Fragment -->
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
<string name="content_description_menu">Pilihan séjén</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Paluruh atawa asupkeun alamat</string>
@ -49,8 +56,6 @@
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Simpen kana koléksi</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">Laporkeun masalah loka</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Bagikeun</string>
<!-- Browser menu button shown in custom tabs that opens the current tab in Fenix
@ -62,7 +67,7 @@
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">Dijalankeun ku %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<!-- Browser menu button to put the current page in reader mode -->
<string name="browser_menu_read">Pidangan baca</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Buka di aplikasi</string>
@ -105,18 +110,46 @@
<!-- Text preview for larger sized widgets -->
<string name="search_widget_text_long">Paluruh raramat</string>
<!-- Preferences -->
<!-- Title for the settings page-->
<string name="settings">Setélan</string>
<!-- Preference category for basic settings -->
<string name="preferences_category_basics">Dasar</string>
<!-- Preference category for general settings -->
<string name="preferences_category_general">Umum</string>
<!-- Preference category for all links about Fenix -->
<string name="preferences_category_about">Ngeunaan</string>
<!-- Preference for settings related to changing the default search engine -->
<string name="preferences_default_search_engine">Mesin pamaluruh baku</string>
<!-- Preference for settings related to Search -->
<string name="preferences_search">Paluruh</string>
<!-- Preference for settings related to Search address bar -->
<string name="preferences_search_address_bar">Palang alamat</string>
<!-- Preference linking to help about Fenix -->
<string name="preferences_help">Pitulung</string>
<!-- Preference link to rating Fenix on the Play Store -->
<string name="preferences_rate">Peunteun dina Google Play</string>
<!-- Preference for giving feedback about Fenix -->
<string name="preferences_feedback">Béré pangdeudeul</string>
<!-- Preference linking to about page for Fenix
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="preferences_about">Ngeunaan %1$s</string>
<!-- Preference linking to the your rights SUMO page -->
<string name="preferences_your_rights">Hak Anjeun</string>
<!-- Preference for settings related to saved passwords -->
<string name="preferences_passwords">Kecap sandi</string>
<!-- Preference for settings related to changing the default browser -->
<string name="preferences_set_as_default_browser">Jadikeun panyungsi baku</string>
<!-- Preference category for advanced settings -->
<string name="preferences_category_advanced">Terusan</string>
<!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Nyungsi nyamuni</string>
<!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Buka tutumbu di tab nyamuni</string>
<!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Tambahan tarabas nyungsi nyamuni</string>
<!-- Preference for accessibility -->
<string name="preferences_accessibility">Aksésibilitas</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Serper Firefox Account biasa</string>
<!-- Preference category for account information -->
@ -146,12 +179,30 @@
<!-- Preference for account settings -->
<string name="preferences_account_settings">Setélan akun</string>
<!-- Preference for add_ons -->
<string name="preferences_addons">Émbohan</string>
<!-- Account Preferences -->
<!-- Preference for triggering sync -->
<string name="preferences_sync_now">Singkronkeun ayeuna</string>
<!-- Preference category for sync -->
<string name="preferences_sync_category">Pilih nu rék disingkronkeun</string>
<!-- Preference for syncing history -->
<string name="preferences_sync_history">Jujutan</string>
<!-- Preference for syncing bookmarks -->
<string name="preferences_sync_bookmarks">Markah</string>
<!-- Preference for syncing logins -->
<string name="preferences_sync_logins">Asup log</string>
<!-- Preference for syncing tabs -->
<string name="preferences_sync_tabs_2">Buka tab</string>
<!-- Preference for signing out -->
<string name="preferences_sign_out">Kaluar</string>
<!-- Preference displays and allows changing current FxA device name -->
<string name="preferences_sync_device_name">Ngaran parangkat</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">Nyingkronkeun…</string>
<!-- Preference description for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions_description">Kilung Palacakan pikeun ieu loka ayeuna pareum</string>
@ -329,8 +380,6 @@
<string name="preference_summary_delete_browsing_data_on_quit">Otomatis mupus data nyungsi nalika anjeun milih tombol &quot;Kaluar&quot; ti menu utama</string>
<!-- Summary for the Delete browsing data on quit preference. "Quit" translation should match delete_browsing_data_on_quit_action translation. -->
<string name="preference_summary_delete_browsing_data_on_quit_2">Otomatis mupus data nyungsi nalika anjeun milih \&quot;Kaluar\&quot; ti menu utama</string>
<!-- Category for history items to delete on quit in delete browsing data on quit -->
<string name="preferences_delete_browsing_data_on_quit_browsing_history">Jujutan nyungsi</string>
<!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Kaluar</string>
@ -372,6 +421,9 @@
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Bolay</string>
<!-- Enhanced Tracking Protection -->
<!-- Link displayed in enhanced tracking protection panel to access tracking protection settings -->
<string name="etp_settings">Setélan Kilung</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Lenyepan</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,9 @@
<!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">మీ అంతరంగిక ట్యాబులు ఇక్కడ కనిపిస్తాయి.</string>
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">ఫరవాలేదు వద్దు</string>
<!-- Text for the negative button -->
<string name="search_widget_cfr_neg_button_text">ఇప్పుడు కాదు</string>
@ -29,14 +32,26 @@
<string name="browser_tabs_button">తెరిచివున్న ట్యాబులు</string>
<!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">వెనుకకు</string>
<!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_add_ons">పొడగింతలు</string>
<!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">పొడగింతలేమీ లేవు</string>
<!-- Browser menu button that sends a user to help articles -->
<string name="browser_menu_help">సహాయం</string>
<!-- Browser menu button that sends a to a the what's new article -->
<string name="browser_menu_whats_new">కొత్తవి ఏమిటి</string>
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">అమరికలు</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">గ్రంథాలయం</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">డెస్క్‌టాప్ సైటు</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
<string name="browser_menu_add_to_homescreen">ముంగిలి తెరకు చేర్చు</string>
<!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. -->
<string name="browser_menu_install_on_homescreen">స్థాపించు</string>
<!-- Menu option on the toolbar that takes you to synced tabs page-->
<string name="synced_tabs">సింకైన ట్యాబులు</string>
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">కొత్త ట్యాబు</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -133,6 +148,9 @@
<!-- Title for experiments preferences -->
<string name="preference_experiments">ప్రయోగాలు</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">ఖాతాను తొలగించు</string>
<!-- Button to cancel pairing -->
<string name="pair_cancel">రద్దుచేయి</string>
@ -173,6 +191,8 @@
<string name="tab_drawer_fab_content">అంతరంగికం</string>
<!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">తెరిచివున్న ట్యాబులు</string>
<!-- Text shown in the menu for sharing all tabs -->
<string name="tab_tray_menu_item_share">అన్ని ట్యాబులను పంచుకో</string>
<!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">ట్యాబులన్నీ మూసివేయి</string>
<!-- Shortcut action to open new tab -->
@ -182,6 +202,8 @@
<string name="close_tab">ట్యాబును మూసివేయి</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
<string name="close_tab_title">%s ట్యాబును మూసివేయి</string>
<!-- Content description (not visible, for screen readers etc.): Opens the open tabs menu when pressed -->
<string name="open_tabs_menu">తెరిచివున్న ట్యాబుల మెనూ</string>
<!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">ట్యాబులన్నీ మూసివేయి</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
@ -204,6 +226,10 @@
is a digit showing the number of items you have selected -->
<string name="history_delete_some">%1$d అంశాలను తొలగించు</string>
<!-- Text for the header that groups the history for last 24 hours -->
<string name="history_24_hours">గత 24 గంటలు</string>
<!-- Text for the header that groups the history the past 7 days -->
<string name="history_7_days">గత 7 రోజులు</string>
<!-- Text for the header that groups the history the past 30 days -->
<string name="history_30_days">గత 30 రోజులు</string>
<!-- Text for the header that groups the history older than the last month -->
@ -214,6 +240,11 @@
<!-- Close tab button text on the tab crash page -->
<string name="tab_crash_close">ట్యాబును మూసివేయి</string>
<!-- Content Description for session item menu button -->
<string name="content_description_session_menu">సెషను ఎంపికలు</string>
<!-- Screen title for adding a bookmarks folder -->
<string name="bookmark_add_folder">సంచయం చేర్చు</string>
<!-- Bookmark overflow menu delete button -->
<string name="bookmark_menu_delete_button">తొలగించు</string>
<!--Bookmark overflow menu save button -->
@ -227,14 +258,37 @@
<!-- Site permissions preferences header -->
<string name="permissions_header">అనుమతులు</string>
<!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">అమరికలకు వెళ్లు</string>
<!-- Preference for altering the camera access for all websites -->
<string name="preference_phone_feature_camera">కెమెరా</string>
<!-- Preference for altering the microphone access for all websites -->
<string name="preference_phone_feature_microphone">మైక్రోఫోను</string>
<!-- Preference for altering the location access for all websites -->
<string name="preference_phone_feature_location">స్థానం</string>
<!-- Preference for showing a list of websites that the default configurations won't apply to them -->
<string name="preference_exceptions">మినహాయింపులు</string>
<!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked -->
<string name="preference_option_autoplay_block_audio2">ఆడియోను మాత్రమే నిరోధించు</string>
<!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked3">ఆడియో, వీడియోలను నిరోధించు</string>
<!-- Collections -->
<!-- Collections header on home fragment -->
<string name="collections_header">సేకరణలు</string>
<!-- Button to select all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_select_all">అన్నిటినీ ఎంచుకో</string>
<!-- Text to show users how many tabs they have selected in the "select tabs" step of the collection creator.
%d is a placeholder for the number of tabs selected. -->
<string name="create_collection_save_to_collection_tabs_selected">%d ట్యాబులు ఎంచుకున్నారు</string>
<!-- Text to show users they have one tab selected in the "select tabs" step of the collection creator.
%d is a placeholder for the number of tabs selected. -->
<string name="create_collection_save_to_collection_tab_selected">%d ట్యాబు ఎంచుకున్నారు</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection -->
<string name="create_collection_tabs_saved">ట్యాబులు భద్రమయ్యాయి!</string>
<!-- Text shown in snackbar when one tab has been saved in a collection -->
<string name="create_collection_tab_saved">ట్యాబు భద్రమయింది!</string>
<!-- Content description (not visible, for screen readers etc.): button to close the collection creator -->
<string name="create_collection_close">మూసివేయి</string>
@ -243,18 +297,100 @@
<!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">చూడండి</string>
<!-- Default name for a new collection in "name new collection" step of the collection creator. %d is a placeholder for the number of collections-->
<string name="create_collection_default_name">సేకరణ %d</string>
<!-- Sub-header in the dialog to share a link to another sync device -->
<string name="share_device_subheader">పరికరానికి పంపించు</string>
<!-- Sub-header in the dialog to share a link to an app from the full list -->
<string name="share_link_all_apps_subheader">అన్ని చర్యలు</string>
<!-- Sub-header in the dialog to share a link to an app from the most-recent sorted list -->
<string name="share_link_recent_apps_subheader">ఇటీవల వాడినవి</string>
<!-- An option from the share dialog to send link to all other sync devices -->
<string name="sync_send_to_all">పరికరాలన్నిటికీ పంపించు</string>
<!-- Text displayed when sync is offline and cannot be accessed -->
<string name="sync_offline">ఆఫ్‌లైన్</string>
<!-- An option to connect additional devices -->
<string name="sync_connect_device">మరొక పరికరాన్ని అనుసంధానించు</string>
<!-- Confirmation dialog button -->
<string name="sync_confirmation_button">అర్థమైంది</string>
<!-- Share error message -->
<string name="share_error_snackbar">ఈ అనువర్తనంతో పంచుకోలేము</string>
<!-- Add new device screen title -->
<string name="sync_add_new_device_title">పరికరానికి పంపించు</string>
<!-- Text for the warning message on the Add new device screen -->
<string name="sync_add_new_device_message">పరికరాలేమీ అనుసంధానం కాలేదు</string>
<!-- Text for the button to learn about sending tabs -->
<string name="sync_add_new_device_learn_button">ట్యాబులు పంపడం గురించి తెలుసుకోండి…</string>
<!-- Text for the button to connect another device -->
<string name="sync_add_new_device_connect_button">మరొక పరికరాన్ని అనుసంధానించు…</string>
<!-- Notifications -->
<!-- The user visible name of the "notification channel" (Android 8+ feature) for the ongoing notification shown while a browsing session is active. -->
<string name="notification_pbm_channel_name">అంతరంగిక విహరణ సెషను</string>
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
<string name="notification_pbm_delete_text">అంతరంగిక ట్యాబులను తొలగించు</string>
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
<string name="notification_pbm_delete_text_2">అంతరంగిక ట్యాబులను మూసివేయి</string>
<!-- Notification action to open Fenix and resume the current browsing session. -->
<string name="notification_pbm_action_open">తెరువు</string>
<!-- Notification action to delete all current private browsing sessions AND switch to Fenix (bring it to the foreground) -->
<string name="notification_pbm_action_delete_and_open">తొలగించి, తెరువు</string>
<!-- Name of the "Powered by Fenix" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="notification_powered_by_channel_name">దీనితో శక్తిమంతం</string>
<!-- Text shown in snackbar when user deletes a collection -->
<string name="snackbar_collection_deleted">సేకరణ తొలగించబడింది</string>
<!-- Text shown in snackbar when user renames a collection -->
<string name="snackbar_collection_renamed">సేకరణ పేరు మార్చబడింది</string>
<!-- Text shown in snackbar when user deletes a tab -->
<string name="snackbar_tab_deleted">ట్యాబు తొలగించబడింది</string>
<!-- Text shown in snackbar when user deletes all tabs -->
<string name="snackbar_tabs_deleted">ట్యాబులు తొలగించబడ్డాయి</string>
<!-- Text shown in snackbar when user closes a tab -->
<string name="snackbar_tab_closed">ట్యాబు మూసివేయబడింది</string>
<!-- Text shown in snackbar when user closes all tabs -->
<string name="snackbar_tabs_closed">ట్యాబులు మూసివేయబడ్డాయి</string>
<!-- Text shown in snackbar when user adds a site to top sites -->
<string name="snackbar_added_to_top_sites">మేటి సైట్లకు చేర్చబడింది!</string>
<!-- Text shown in snackbar when user closes a private tab -->
<string name="snackbar_private_tab_closed">అంతరంగిక ట్యాబు మూసివేయబడింది</string>
<!-- Text shown in snackbar when user closes all private tabs -->
<string name="snackbar_private_tabs_closed">అంతరంగిక ట్యాబులు మూసివేయబడ్డాయి</string>
<!-- Text shown in snackbar when user deletes all private tabs -->
<string name="snackbar_private_tabs_deleted">అంతరంగిక ట్యాబులు తొలగించబడ్డాయి</string>
<!-- Text shown in snackbar to undo deleting a tab, top site or collection -->
<string name="snackbar_deleted_undo">చర్య రద్దుచేయి</string>
<!-- Text shown in snackbar when user removes a top site -->
<string name="snackbar_top_site_removed">సైటు తీసివేయబడింది</string>
<!-- Text for action to undo deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_undo">చర్య రద్దుచేయి</string>
<!-- Text for action to confirm deleting a tab or collection shown in a11y dialog -->
<string name="a11y_dialog_deleted_confirm">నిర్ధారించు</string>
<!-- QR code scanner prompt which appears after scanning a code, but before navigating to it
First parameter is the name of the app, second parameter is the URL or text scanned-->
<string name="qr_scanner_confirmation_dialog_message">%2$s తెరవడానికి %1$sను అనుమతించు</string>
<!-- QR code scanner prompt dialog positive option to allow navigation to scanned link -->
<string name="qr_scanner_dialog_positive">అనుమతించు</string>
<!-- QR code scanner prompt dialog positive option to deny navigation to scanned link -->
<string name="qr_scanner_dialog_negative">తిరస్కరించు</string>
<!-- Tab collection deletion prompt dialog message. Placeholder will be replaced with the collection name -->
<string name="tab_collection_dialog_message">మీరు నిజంగానే %1$sను తొలగించాలనుకుంటున్నారా?</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">తొలగించు</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">రద్దుచేయి</string>
<!-- Text displayed in a notification when the user enters full screen mode -->
<string name="full_screen_notification">నిండు తెర రీతిలోకి వెళ్తున్నారు</string>
<!-- Message for copying the URL via long press on the toolbar -->
<string name="url_copied">URL కాపీ అయ్యింది</string>
<!-- Summary for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_text_size_summary">వెబ్‌సైట్లలో వచనాన్ని పెద్దదిగా లేదా చిన్నదిగా చేయండి</string>
<!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">ఫాంటు పరిమాణం</string>
<!-- Title for the Delete browsing data preference -->
<string name="preferences_delete_browsing_data">విహరణ డేటాను తొలగించు</string>
<!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">తెరిచివున్న ట్యాబులు</string>
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
@ -271,12 +407,18 @@
<!-- Title for the cookies item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies">కుకీలు</string>
<!-- Title for the site permissions item in Delete browsing data -->
<string name="preferences_delete_browsing_data_site_permissions">సైటు అనుమతులు</string>
<!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">రద్దుచేయి</string>
<!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">తొలగించు</string>
<!-- text for firefox preview moving tip button -->
<string name="tip_firefox_preview_moved_button_preview_not_installed">కొత్త నైట్లీని పొందండి</string>
<!-- Onboarding -->
<!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) -->
@ -287,9 +429,44 @@
<string name="onboarding_whats_new_header1">కొత్తవేమిటో చూడండి</string>
<!-- text for underlined clickable link that is part of "what's new" onboarding card description that links to an FAQ -->
<string name="onboarding_whats_new_description_linktext">ఇక్కడ సమాధానాలు పొందండి</string>
<!-- text for the button to manually sign into Firefox account. The word "Firefox" should not be translated -->
<string name="onboarding_firefox_account_sign_in">Firefox లోనికి ప్రవేశించండి</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button_2">ప్రామాణికం (అప్రమేయం)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description_2">తక్కువ ట్రాకర్లను నిరోధిస్తుంది. పేజీలు మామూలుగానే తెరుచుకుంటాయి.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_button">కఠినం (సిఫార్సు చేయబడింది)</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option">కఠినం</string>
<!-- text for the private browsing onbording card button, that launches settings -->
<string name="onboarding_private_browsing_button">అమరికలను తెరువు</string>
<!-- text for the privacy notice onboarding card header -->
<string name="onboarding_privacy_notice_header">మీ అంతరంగికత</string>
<!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">మూసివేయి</string>
<!-- Onboarding theme -->
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">మీ అలంకారాన్ని ఎంచుకోండి</string>
<!-- Summary of automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_summary">మీ పరికర అమరికలకు తగ్గట్టు మారుతుంది</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">ట్యాబులు పంపబడ్డాయి!</string>
<!-- Text shown in snackbar when one tab has been sent to device -->
<string name="sync_sent_tab_snackbar">ట్యాబు పంపబడింది!</string>
<!-- Text shown in snackbar when sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar">పంపించలేకపోయాం</string>
<!-- Text shown in snackbar for the "retry" action that the user has after sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar_action">మళ్లీ ప్రయత్నించు</string>
<!-- Title of QR Pairing Fragment -->
<string name="sync_scan_code">కోడును స్కాను చేయండి</string>
<!-- Text shown for settings option for sign with pairing -->
<string name="sign_in_with_camera">మీ కెమెరాతో ప్రవేశించండి</string>
<!-- Text shown for settings option for sign with email -->
<string name="sign_in_with_email">లేదా ఈమెయిలు వాడండి</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">రద్దుచేయి</string>

View File

@ -818,7 +818,7 @@
<!-- Text shown in snackbar when user closes all tabs -->
<string name="snackbar_tabs_closed">Вкладки закрито</string>
<!-- Text shown in snackbar when user adds a site to top sites -->
<string name="snackbar_added_to_top_sites">Додано до найпопулярніших сайтів!</string>
<string name="snackbar_added_to_top_sites">Додано до популярних сайтів!</string>
<!-- Text shown in snackbar when user closes a private tab -->
<string name="snackbar_private_tab_closed">Приватну вкладку закрито</string>
<!-- Text shown in snackbar when user closes all private tabs -->
@ -1400,7 +1400,7 @@
<!-- Bookmark deletion confirmation -->
<string name="bookmark_deletion_confirmation">Ви впевнені, що хочете видалити цю закладку?</string>
<!-- Browser menu button that adds a top site to the home fragment -->
<string name="browser_menu_add_to_top_sites">Додати до найпопулярніших сайтів</string>
<string name="browser_menu_add_to_top_sites">Додати до популярних сайтів</string>
<!-- text shown before the issuer name to indicate who its verified by, parameter is the name of
the certificate authority that verified the ticket-->
<string name="certificate_info_verified_by">Засвідчено: %1$s</string>

View File

@ -940,9 +940,7 @@
<!-- text for firefox preview moving tip header "Firefox Preview" and "Firefox Nightly" are intentionally hardcoded -->
<string name="tip_firefox_preview_moved_header">Firefox Nightly 已接手原 Firefox Preview 功能</string>
<!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n
若想要有較穩定的使用體驗,請下載我們的 Beta 測試版。</string>
<string name="tip_firefox_preview_moved_description">Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n若想要有較穩定的使用體驗請下載我們的 Beta 測試版。</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded -->
<string name="tip_firefox_preview_moved_button_2">下載 Firefox for Android Beta 測試版</string>

View File

@ -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<SessionFeature>
@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 {

View File

@ -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)

View File

@ -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<ClipboardManager>()'
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<Context>().getSystemService<ClipboardManager>() } returns clipboardManager
every { ClipData.newPlainText(any(), any()) } returns mockk(relaxed = true)
controller.handleCopyUrl(item)

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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<Intent>(PREVIOUS_INTENT))
}
@Test

View File

@ -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"
}

View File

@ -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 {