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 import static org.gradle.api.tasks.testing.TestResult.ResultType
android { android {
compileSdkVersion 28 compileSdkVersion Config.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "org.mozilla" applicationId "org.mozilla"
minSdkVersion Config.minSdkVersion minSdkVersion Config.minSdkVersion

View File

@ -9,7 +9,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewAction
import androidx.test.espresso.action.CoordinatesProvider import androidx.test.espresso.action.CoordinatesProvider

View File

@ -6,35 +6,32 @@ package org.mozilla.fenix.syncintegration
import android.os.SystemClock.sleep import android.os.SystemClock.sleep
import android.widget.EditText import android.widget.EditText
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText 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.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until
import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.MockWebServer
import org.hamcrest.Matchers.allOf import org.hamcrest.Matchers.allOf
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.ext.toUri import org.mozilla.fenix.helpers.ext.toUri
import org.mozilla.fenix.helpers.ext.waitNotNull 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.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.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") @Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
class SyncIntegrationTest { class SyncIntegrationTest {
@ -185,7 +182,7 @@ class SyncIntegrationTest {
.className(EditText::class.java)) .className(EditText::class.java))
emailInput.waitForExists(TestAssetHelper.waitingTime) emailInput.waitForExists(TestAssetHelper.waitingTime)
val emailAddress = javaClass.classLoader.getResource("email.txt").readText() val emailAddress = javaClass.classLoader!!.getResource("email.txt").readText()
emailInput.setText(emailAddress) emailInput.setText(emailAddress)
} }
@ -199,7 +196,7 @@ class SyncIntegrationTest {
.instance(0) .instance(0)
.className(EditText::class.java)) .className(EditText::class.java))
val passwordValue = javaClass.classLoader.getResource("password.txt").readText() val passwordValue = javaClass.classLoader!!.getResource("password.txt").readText()
passwordInput.setText(passwordValue) passwordInput.setText(passwordValue)
} }

View File

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

View File

@ -4,6 +4,7 @@
package org.mozilla.fenix.ui package org.mozilla.fenix.ui
import androidx.core.net.toUri
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer 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.Espresso.onView
import androidx.test.espresso.action.ViewActions.clearText import androidx.test.espresso.action.ViewActions.clearText
import androidx.test.espresso.action.ViewActions.typeText 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.withId
import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.By import androidx.test.uiautomator.By
import androidx.test.uiautomator.By.text
import androidx.test.uiautomator.By.textContains import androidx.test.uiautomator.By.textContains
import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiScrollable
import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.anyOf import org.hamcrest.CoreMatchers.anyOf
import org.junit.Assert
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.click
@ -26,6 +31,8 @@ import org.mozilla.fenix.helpers.ext.waitNotNull
*/ */
class AddToHomeScreenRobot { class AddToHomeScreenRobot {
fun verifyShortcutIcon() = assertShortcutIcon()
fun addShortcutName(title: String) { fun addShortcutName(title: String) {
mDevice.waitNotNull(Until.findObject(By.text("Add to Home screen")), waitingTime) mDevice.waitNotNull(Until.findObject(By.text("Add to Home screen")), waitingTime)
shortcutNameField() shortcutNameField()
@ -33,6 +40,8 @@ class AddToHomeScreenRobot {
.perform(typeText(title)) .perform(typeText(title))
} }
fun verifyShortcutNameField(expectedText: String) = assertShortcutNameField(expectedText)
fun clickAddShortcutButton() = addButton().click() fun clickAddShortcutButton() = addButton().click()
fun clickAddAutomaticallyButton() { fun clickAddAutomaticallyButton() {
@ -77,7 +86,21 @@ fun addToHomeScreen(interact: AddToHomeScreenRobot.() -> Unit): AddToHomeScreenR
private fun shortcutNameField() = onView(withId(R.id.shortcut_text)) 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 addButton() = onView(anyOf(withText("ADD")))
private fun addAutomaticallyButton() = private fun addAutomaticallyButton() =
mDevice.findObject(UiSelector().textContains("add automatically")) 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() addFolderButton().click()
} }
fun clickdeleteBookmarkButton() = deleteBookmarkButton().click()
fun addNewFolderName(name: String) { fun addNewFolderName(name: String) {
addFolderTitleField() addFolderTitleField()
.click() .click()
@ -188,6 +190,23 @@ class BookmarksRobot {
return Transition() 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 { fun openThreeDotMenu(interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition {
mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu"))) mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu")))
threeDotMenu().click() 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 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( private fun threeDotMenu(bookmarkUrl: Uri) = onView(
allOf( allOf(
withId(R.id.overflow_menu), withId(R.id.overflow_menu),

View File

@ -157,6 +157,8 @@ class BrowserRobot {
fun verifyMenuButton() = assertMenuButton() fun verifyMenuButton() = assertMenuButton()
fun verifyBlueDot() = assertBlueDot()
fun verifyNavURLBarItems() { fun verifyNavURLBarItems() {
verifyEnhancedTrackingOptions() verifyEnhancedTrackingOptions()
pressBack() pressBack()
@ -448,3 +450,10 @@ private fun mediaPlayerPlayButton() =
.clazz("android.widget.Button") .clazz("android.widget.Button")
.textContains("Play") .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())!! val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!!
fun verifyFindInPageQuery() = assertFindInPageQuery()!!
fun verifyFindInPageNextButton() = assertFindInPageNextButton()!! fun verifyFindInPageNextButton() = assertFindInPageNextButton()!!
fun verifyFindInPagePrevButton() = assertFindInPagePrevButton()!! fun verifyFindInPagePrevButton() = assertFindInPagePrevButton()!!
fun verifyFindInPageCloseButton() = assertFindInPageCloseButton()!! fun verifyFindInPageCloseButton() = assertFindInPageCloseButton()!!
fun verifyFindInPageSearchBarItems() {
verifyFindInPageQuery()
verifyFindInPageNextButton()
verifyFindInPagePrevButton()
verifyFindInPageCloseButton()
}
fun enterFindInPageQuery(expectedText: String) { fun enterFindInPageQuery(expectedText: String) {
mDevice.waitNotNull(Until.findObject(By.res("org.mozilla.fenix.debug:id/find_in_page_query_text")), waitingTime) mDevice.waitNotNull(Until.findObject(By.res("org.mozilla.fenix.debug:id/find_in_page_query_text")), waitingTime)
findInPageQuery().perform(clearText()) 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 findInPagePrevButton() = onView(withId(R.id.find_in_page_prev_btn))
private fun findInPageCloseButton() = onView(withId(R.id.find_in_page_close_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() private fun assertFindInPageNextButton() = findInPageNextButton()
.check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))

View File

@ -90,6 +90,13 @@ class HistoryRobot {
return Transition() return Transition()
} }
fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
closeButton().click()
BrowserRobot().interact()
return BrowserRobot.Transition()
}
fun openThreeDotMenu(interact: ThreeDotMenuHistoryItemRobot.() -> Unit): fun openThreeDotMenu(interact: ThreeDotMenuHistoryItemRobot.() -> Unit):
ThreeDotMenuHistoryItemRobot.Transition { ThreeDotMenuHistoryItemRobot.Transition {

View File

@ -5,6 +5,7 @@
package org.mozilla.fenix.ui.robots package org.mozilla.fenix.ui.robots
import android.net.Uri import android.net.Uri
import android.widget.TextView
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 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.withParent
import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.uiautomator.By import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Until
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.ext.waitNotNull import org.mozilla.fenix.helpers.ext.waitNotNull
import org.hamcrest.Matchers.allOf 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. * Implementation of Robot Pattern for the multiple selection toolbar of History and Bookmarks menus.
@ -38,6 +41,8 @@ class LibrarySubMenusMultipleSelectionToolbarRobot {
fun verifyShareOverlay() = assertShareOverlay() fun verifyShareOverlay() = assertShareOverlay()
fun verifyShareAppsLayout() = assertShareAppsLayout()
fun verifyShareTabFavicon() = assertShareTabFavicon() fun verifyShareTabFavicon() = assertShareTabFavicon()
fun verifyShareTabTitle() = assertShareTabTitle() fun verifyShareTabTitle() = assertShareTabTitle()
@ -71,6 +76,12 @@ class LibrarySubMenusMultipleSelectionToolbarRobot {
} }
class Transition { class Transition {
fun closeShareDialogReturnToPage(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
BrowserRobot().interact()
return BrowserRobot.Transition()
}
fun closeToolbarReturnToHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { fun closeToolbarReturnToHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition {
closeToolbarButton().click() closeToolbarButton().click()
@ -158,6 +169,15 @@ private fun assertShareBookmarksButton() =
private fun assertShareOverlay() = private fun assertShareOverlay() =
onView(withId(R.id.shareWrapper)).check(matches(isDisplayed())) 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() = private fun assertShareTabTitle() =
onView(withId(R.id.share_tab_title)).check(matches(isDisplayed())) onView(withId(R.id.share_tab_title)).check(matches(isDisplayed()))

View File

@ -96,6 +96,13 @@ class SettingsRobot {
return HomeScreenRobot.Transition() return HomeScreenRobot.Transition()
} }
fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
goBackButton().click()
BrowserRobot().interact()
return BrowserRobot.Transition()
}
fun openAboutFirefoxPreview(interact: SettingsSubMenuAboutRobot.() -> Unit): fun openAboutFirefoxPreview(interact: SettingsSubMenuAboutRobot.() -> Unit):
SettingsSubMenuAboutRobot.Transition { SettingsSubMenuAboutRobot.Transition {

View File

@ -34,8 +34,8 @@ import java.text.SimpleDateFormat
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatterBuilder import java.time.format.DateTimeFormatterBuilder
import java.time.temporal.ChronoField import java.time.temporal.ChronoField
import java.util.Date
import java.util.Calendar import java.util.Calendar
import java.util.Date
/** /**
* Implementation of Robot Pattern for the settings search sub menu. * 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) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
val simpleDateFormat = SimpleDateFormat(DATE_PATTERN) val simpleDateFormat = SimpleDateFormat(DATE_PATTERN)
val date = simpleDateFormat.parse(dateText) 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 { } else {
val textviewDate = getLocalDateTimeFromString(dateText) val textviewDate = getLocalDateTimeFromString(dateText)
val buildConfigDate = getLocalDateTimeFromString(BuildConfig.BUILD_DATE) 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 android.view.View
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.Espresso.pressBack
import androidx.test.espresso.UiController import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewAction
import androidx.test.espresso.action.ViewActions import androidx.test.espresso.action.ViewActions
@ -44,8 +45,10 @@ import org.mozilla.fenix.share.ShareFragment
*/ */
class ThreeDotMenuMainRobot { class ThreeDotMenuMainRobot {
fun verifySettingsButton() = assertSettingsButton() fun verifySettingsButton() = assertSettingsButton()
fun verifyAddOnsButton() = assertAddOnsButton()
fun verifyHistoryButton() = assertHistoryButton() fun verifyHistoryButton() = assertHistoryButton()
fun verifyBookmarksButton() = assertBookmarksButton() fun verifyBookmarksButton() = assertBookmarksButton()
fun verifySyncedTabsButton() = assertSyncedTabsButton()
fun verifyHelpButton() = assertHelpButton() fun verifyHelpButton() = assertHelpButton()
fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists() fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists()
fun verifyForwardButton() = assertForwardButton() fun verifyForwardButton() = assertForwardButton()
@ -106,12 +109,40 @@ class ThreeDotMenuMainRobot {
fun verifyShareALinkTitle() = assertShareALinkTitle() fun verifyShareALinkTitle() = assertShareALinkTitle()
fun verifyWhatsNewButton() = assertWhatsNewButton() fun verifyWhatsNewButton() = assertWhatsNewButton()
fun verifyAddFirefoxHome() = assertAddToFirefoxHome() 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 { class Transition {
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) 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 { 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))) onView(allOf(withResourceName("text"), withText(R.string.browser_menu_settings)))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed())) .check(matches(isCompletelyDisplayed()))
@ -121,7 +152,17 @@ class ThreeDotMenuMainRobot {
return SettingsRobot.Transition() 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 { 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) mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime)
bookmarksButton().click() bookmarksButton().click()
@ -130,6 +171,7 @@ class ThreeDotMenuMainRobot {
} }
fun openHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { 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) mDevice.waitNotNull(Until.findObject(By.text("History")), waitingTime)
historyButton().click() historyButton().click()
@ -137,6 +179,23 @@ class ThreeDotMenuMainRobot {
return HistoryRobot.Transition() 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 { fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime)
helpButton().click() helpButton().click()
@ -163,6 +222,13 @@ class ThreeDotMenuMainRobot {
return BrowserRobot.Transition() return BrowserRobot.Transition()
} }
fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
mDevice.pressBack()
BrowserRobot().interact()
return BrowserRobot.Transition()
}
fun close(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { fun close(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition {
// Close three dot // Close three dot
mDevice.pressBack() mDevice.pressBack()
@ -196,6 +262,7 @@ class ThreeDotMenuMainRobot {
} }
fun openFindInPage(interact: FindInPageRobot.() -> Unit): FindInPageRobot.Transition { 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) mDevice.waitNotNull(Until.findObject(By.text("Find in page")), waitingTime)
findInPageButton().click() findInPageButton().click()
@ -274,6 +341,13 @@ class ThreeDotMenuMainRobot {
HomeScreenRobot().interact() HomeScreenRobot().interact()
return HomeScreenRobot.Transition() 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(withEffectiveVisibility(Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed())) .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 historyButton() = onView(allOf(withText(R.string.library_history)))
private fun assertHistoryButton() = historyButton() private fun assertHistoryButton() = historyButton()
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
@ -294,6 +373,10 @@ private fun bookmarksButton() = onView(allOf(withText(R.string.library_bookmarks
private fun assertBookmarksButton() = bookmarksButton() private fun assertBookmarksButton() = bookmarksButton()
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .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 helpButton() = onView(allOf(withText(R.string.browser_menu_help)))
private fun assertHelpButton() = helpButton() private fun assertHelpButton() = helpButton()
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
@ -399,3 +482,36 @@ private fun assertAddToFirefoxHome() {
) )
).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) ).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 isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate
), ),
sessionManager = requireComponents.core.sessionManager, sessionManager = requireComponents.core.sessionManager,
sessionFeature = sessionFeature,
findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } },
engineView = engineView, engineView = engineView,
swipeRefresh = swipeRefresh, swipeRefresh = swipeRefresh,

View File

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

View File

@ -19,6 +19,8 @@ import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.concept.engine.prompt.ShareData 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 mozilla.components.support.ktx.kotlin.isUrl
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.NavGraphDirections
@ -61,6 +63,7 @@ class DefaultBrowserToolbarController(
private val activity: HomeActivity, private val activity: HomeActivity,
private val navController: NavController, private val navController: NavController,
private val readerModeController: ReaderModeController, private val readerModeController: ReaderModeController,
private val sessionFeature: ViewBoundFeatureWrapper<SessionFeature>,
private val sessionManager: SessionManager, private val sessionManager: SessionManager,
private val findInPageLauncher: () -> Unit, private val findInPageLauncher: () -> Unit,
private val engineView: EngineView, private val engineView: EngineView,
@ -260,8 +263,10 @@ class DefaultBrowserToolbarController(
} }
} }
ToolbarMenu.Item.OpenInFenix -> { ToolbarMenu.Item.OpenInFenix -> {
// Release the session from this view so that it can immediately be rendered by a different view // Stop the SessionFeature from updating the EngineView and let it release the session
engineView.release() // 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 // Strip the CustomTabConfig to turn this Session into a regular tab and then select it
customTabSession!!.customTabConfig = null customTabSession!!.customTabConfig = null

View File

@ -6,9 +6,7 @@ package org.mozilla.fenix.library.bookmarks
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import androidx.core.content.getSystemService
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -51,8 +49,9 @@ interface BookmarkController {
@SuppressWarnings("TooManyFunctions") @SuppressWarnings("TooManyFunctions")
class DefaultBookmarkController( class DefaultBookmarkController(
private val context: Context, private val activity: HomeActivity,
private val navController: NavController, private val navController: NavController,
private val clipboardManager: ClipboardManager?,
private val scope: CoroutineScope, private val scope: CoroutineScope,
private val store: BookmarkFragmentStore, private val store: BookmarkFragmentStore,
private val sharedViewModel: BookmarksSharedViewModel, private val sharedViewModel: BookmarksSharedViewModel,
@ -63,8 +62,7 @@ class DefaultBookmarkController(
private val invokePendingDeletion: () -> Unit private val invokePendingDeletion: () -> Unit
) : BookmarkController { ) : BookmarkController {
private val activity: HomeActivity = context as HomeActivity private val resources: Resources = activity.resources
private val resources: Resources = context.resources
override fun handleBookmarkChanged(item: BookmarkNode) { override fun handleBookmarkChanged(item: BookmarkNode) {
sharedViewModel.selectedFolder = item sharedViewModel.selectedFolder = item
@ -115,7 +113,7 @@ class DefaultBookmarkController(
override fun handleCopyUrl(item: BookmarkNode) { override fun handleCopyUrl(item: BookmarkNode) {
val urlClipData = ClipData.newPlainText(item.url, item.url) val urlClipData = ClipData.newPlainText(item.url, item.url)
context.getSystemService<ClipboardManager>()?.primaryClip = urlClipData clipboardManager?.setPrimaryClip(urlClipData)
showSnackbar(resources.getString(R.string.url_copied)) showSnackbar(resources.getString(R.string.url_copied))
} }
@ -143,14 +141,14 @@ class DefaultBookmarkController(
scope.launch { scope.launch {
store.dispatch(BookmarkFragmentAction.StartSync) store.dispatch(BookmarkFragmentAction.StartSync)
invokePendingDeletion() 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 // 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 // check if the current node is valid and if it isn't we find the nearest valid ancestor
// and open it // and open it
val validAncestorGuid = store.state.guidBackstack.findLast { guid -> val validAncestorGuid = store.state.guidBackstack.findLast { guid ->
context.bookmarkStorage.getBookmark(guid) != null activity.bookmarkStorage.getBookmark(guid) != null
} ?: BookmarkRoot.Mobile.id } ?: BookmarkRoot.Mobile.id
val node = context.bookmarkStorage.getBookmark(validAncestorGuid)!! val node = activity.bookmarkStorage.getBookmark(validAncestorGuid)!!
handleBookmarkExpand(node) handleBookmarkExpand(node)
store.dispatch(BookmarkFragmentAction.FinishSync) store.dispatch(BookmarkFragmentAction.FinishSync)
} }
@ -160,12 +158,12 @@ class DefaultBookmarkController(
invokePendingDeletion.invoke() invokePendingDeletion.invoke()
scope.launch { scope.launch {
val parentGuid = store.state.guidBackstack.findLast { guid -> 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) { if (parentGuid == null) {
navController.popBackStack() navController.popBackStack()
} else { } else {
val parent = context.bookmarkStorage.getBookmark(parentGuid)!! val parent = activity.bookmarkStorage.getBookmark(parentGuid)!!
handleBookmarkExpand(parent) handleBookmarkExpand(parent)
} }
} }

View File

@ -13,6 +13,7 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.content.getSystemService
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@ -37,6 +38,7 @@ import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.concept.storage.BookmarkNodeType
import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavHostActivity import org.mozilla.fenix.NavHostActivity
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.FenixSnackbar
@ -85,8 +87,9 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
_bookmarkInteractor = BookmarkFragmentInteractor( _bookmarkInteractor = BookmarkFragmentInteractor(
bookmarksController = DefaultBookmarkController( bookmarksController = DefaultBookmarkController(
context = requireContext(), activity = requireActivity() as HomeActivity,
navController = findNavController(), navController = findNavController(),
clipboardManager = requireContext().getSystemService(),
scope = viewLifecycleOwner.lifecycleScope, scope = viewLifecycleOwner.lifecycleScope,
store = bookmarkStore, store = bookmarkStore,
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,

View File

@ -81,7 +81,7 @@ class DefaultHistoryController(
override fun handleCopyUrl(item: HistoryItem) { override fun handleCopyUrl(item: HistoryItem) {
val urlClipData = ClipData.newPlainText(item.url, item.url) val urlClipData = ClipData.newPlainText(item.url, item.url)
clipboardManager.primaryClip = urlClipData clipboardManager.setPrimaryClip(urlClipData)
with(snackbar) { with(snackbar) {
setText(resources.getString(R.string.url_copied)) setText(resources.getString(R.string.url_copied))
show() show()

View File

@ -18,6 +18,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.Preference import androidx.preference.Preference
@ -270,8 +271,9 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat(), AccountObserver {
} }
} }
@Suppress("Deprecation")
private fun showPinVerification() { private fun showPinVerification() {
val manager = activity?.getSystemService(KEYGUARD_SERVICE) as KeyguardManager val manager = activity?.getSystemService<KeyguardManager>()!!
val intent = manager.createConfirmDeviceCredentialIntent( val intent = manager.createConfirmDeviceCredentialIntent(
getString(R.string.logins_biometric_prompt_message_pin), getString(R.string.logins_biometric_prompt_message_pin),
getString(R.string.logins_biometric_prompt_message) 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.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import androidx.core.content.getSystemService
import mozilla.components.support.utils.WebURLFinder import mozilla.components.support.utils.WebURLFinder
private const val MIME_TYPE_TEXT_PLAIN = "text/plain" 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 * A clipboard utility class that allows copying and pasting links/text to & from the clipboard
*/ */
class ClipboardHandler(context: Context) { class ClipboardHandler(context: Context) {
private val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager private val clipboard = context.getSystemService<ClipboardManager>()!!
var text: String? var text: String?
get() { get() {
@ -29,7 +30,7 @@ class ClipboardHandler(context: Context) {
return null return null
} }
set(value) { set(value) {
clipboard.primaryClip = ClipData.newPlainText("Text", value) clipboard.setPrimaryClip(ClipData.newPlainText("Text", value))
} }
val url: String? val url: String?

View File

@ -6,7 +6,7 @@ package org.mozilla.fenix.whatsnew
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.preference.PreferenceManager import androidx.preference.PreferenceManager
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
// This file is a modified port from Focus Android // This file is a modified port from Focus Android

View File

@ -17,7 +17,7 @@
android:fontFamily="@font/metropolis_bold" android:fontFamily="@font/metropolis_bold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/tracking_protection_item_height" android:layout_height="@dimen/tracking_protection_item_height"
android:layout_marginStart="16dp" android:layout_marginStart="72dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:paddingStart="0dp" android:paddingStart="0dp"
android:paddingEnd="0dp" android:paddingEnd="0dp"

View File

@ -27,7 +27,7 @@
android:id="@+id/trackingProtectionCategoryTitle" android:id="@+id/trackingProtectionCategoryTitle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal" android:layout_marginStart="32dp"
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal" android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:clickable="false" android:clickable="false"
@ -44,7 +44,7 @@
android:id="@+id/trackingProtectionCategoryItemDescription" android:id="@+id/trackingProtectionCategoryItemDescription"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" 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_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:layout_marginBottom="18dp" android:layout_marginBottom="18dp"
android:clickable="false" android:clickable="false"

View File

@ -217,6 +217,10 @@
<string name="preferences_private_browsing_options">Поверително разглеждане</string> <string name="preferences_private_browsing_options">Поверително разглеждане</string>
<!-- Preference for opening links in a private tab--> <!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">Отваряне препратките в поверителен раздел</string> <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 --> <!-- Preference for accessibility -->
<string name="preferences_accessibility">Достъпност</string> <string name="preferences_accessibility">Достъпност</string>
<!-- Preference category for account information --> <!-- Preference category for account information -->
@ -233,6 +237,8 @@
<string name="preferences_sign_in_description">Синхронизирайте отметки, пароли и други с вашия Firefox Account</string> <string name="preferences_sign_in_description">Синхронизирайте отметки, пароли и други с вашия Firefox Account</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. --> <!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox Account</string> <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 --> <!-- Preference for language -->
<string name="preferences_language">Език</string> <string name="preferences_language">Език</string>
<!-- Preference for data choices --> <!-- Preference for data choices -->
@ -251,6 +257,8 @@
<string name="preferences_show_search_suggestions">Показване на предложения</string> <string name="preferences_show_search_suggestions">Показване на предложения</string>
<!-- Preference title for switch preference to show voice search button --> <!-- Preference title for switch preference to show voice search button -->
<string name="preferences_show_voice_search">Показване на гласово търсене</string> <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 --> <!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">Показване на предложения от буфера</string> <string name="preferences_show_clipboard_suggestions">Показване на предложения от буфера</string>
<!-- Preference title for switch preference to suggest browsing history when searching --> <!-- Preference title for switch preference to suggest browsing history when searching -->
@ -285,6 +293,14 @@
<string name="empty_device_name_error">Името не може да е празно.</string> <string name="empty_device_name_error">Името не може да е празно.</string>
<!-- Label indicating that sync is in progress --> <!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">Синхронизиране…</string> <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. <!-- Text for displaying the default device name.
The first parameter is the application name, the second is the device manufacturer name The first parameter is the application name, the second is the device manufacturer name
and the third is the device model. --> 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 --> <!-- 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> <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 --> <!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">Телеметрия</string> <string name="preferences_telemetry">Телеметрия</string>
<!-- Preference switch for usage and technical data collection --> <!-- Preference switch for usage and technical data collection -->
@ -335,9 +354,14 @@
<!-- Preference switch for Mozilla location service --> <!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Услуга за местоположение на Mozilla</string> <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 --> <!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view --> <!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Включване на Sync</string> <string name="preferences_sync">Включване на Sync</string>
<!-- Preference for pairing -->
<string name="preferences_sync_pair">Сканирайте кода за сдвояване в настолен Firefox</string>
<!-- Preference for account login --> <!-- Preference for account login -->
<string name="preferences_sync_sign_in">Вход</string> <string name="preferences_sync_sign_in">Вход</string>
<!-- Preference for reconnecting to FxA sync --> <!-- Preference for reconnecting to FxA sync -->
@ -349,6 +373,8 @@
<!-- Instructions on how to access pairing --> <!-- Instructions on how to access pairing -->
<string name="pair_instructions_2"><![CDATA[Сканирайте кода на QR, показан на <b>firefox.com/pair</b>]]></string> <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 --> <!-- Button to cancel pairing -->
<string name="pair_cancel">Отказ</string> <string name="pair_cancel">Отказ</string>
@ -364,6 +390,104 @@
<!-- Preference for using dark theme --> <!-- Preference for using dark theme -->
<string name="preference_dark_theme">Тъмна</string> <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 --> <!-- Button to select all tabs in the "select tabs" step of the collection creator -->
<string name="create_collection_select_all">Избиране на всички</string> <string name="create_collection_select_all">Избиране на всички</string>
<!-- Text shown in snackbar when multiple tabs have been saved in a collection --> <!-- 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--> <!-- Button to save currently selected tabs in the "select tabs" step of the collection creator-->
<string name="create_collection_save">Запазване</string> <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 <!-- 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--> 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> <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 --> <!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">Преглеждайте без да бъдете следени</string> <string name="preference_enhanced_tracking_protection_explanation_title">Преглеждайте без да бъдете следени</string>
@ -388,11 +552,23 @@
<!-- Text displayed that links to website about enhanced tracking protection --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Научете повече</string> <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 --> <!-- Preference to access list of saved logins -->
<string name="preferences_passwords_saved_logins_description_empty_learn_more_link">Научете повече за Sync.</string> <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 --> <!-- 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> <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 --> <!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">Научете повече</string> <string name="search_add_custom_engine_learn_more_label">Научете повече</string>
<!-- Accessibility description for the 'Learn more' link --> <!-- Accessibility description for the 'Learn more' link -->

View File

@ -28,6 +28,7 @@
<!-- Private Browsing --> <!-- Private Browsing -->
<!-- Title for private session option --> <!-- Title for private session option -->
<string name="private_browsing_title">Nalazite se u privatnoj sesiji</string> <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 --> <!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Obriši sesiju</string> <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> <string name="preferences_allow_screenshots_in_private_mode">Dozvoli screenshote u privatnom surfanju</string>
<!-- Preference for adding private browsing shortcut --> <!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Dodaj prečicu za privatno surfanje</string> <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 --> <!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Zaseban Firefox Account server</string> <string name="preferences_override_fxa_server">Zaseban Firefox Account server</string>
<!-- Preference to override the Sync token server --> <!-- 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> <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. --> <!-- 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> <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 --> <!-- Preference for language -->
<string name="preferences_language">Jezik</string> <string name="preferences_language">Jezik</string>
<!-- Preference for data choices --> <!-- Preference for data choices -->
@ -358,6 +363,8 @@
<string name="preferences_sync_pair">Skenirajte kod za uparivanje u desktop Firefoxu</string> <string name="preferences_sync_pair">Skenirajte kod za uparivanje u desktop Firefoxu</string>
<!-- Preference for account login --> <!-- Preference for account login -->
<string name="preferences_sync_sign_in">Prijava</string> <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 --> <!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">Ukloni račun</string> <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> <string name="tab_tray_menu_open_new_tab">Novi tab</string>
<!-- Shortcut action to open the home screen --> <!-- Shortcut action to open the home screen -->
<string name="tab_tray_menu_home">Početni</string> <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 --> <!-- 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> <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 --> <!-- Content description (not visible, for screen readers etc.): Close tab button. Closes the current session when pressed -->
<string name="close_tab">Zatvori tab</string> <string name="close_tab">Zatvori tab</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title --> <!-- 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> <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 --> <!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">Zatvori sve tabove</string> <string name="tabs_menu_close_all_tabs">Zatvori sve tabove</string>
<!-- Open tabs menu item to share all tabs --> <!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">Podijeli tabove</string> <string name="tabs_menu_share_tabs">Podijeli tabove</string>
<!-- Open tabs menu item to save tabs to collection --> <!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection1">Spasi tabove u kolekciju</string> <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 --> <!-- Tab menu item to share the tab -->
<string name="tab_share">Podijeli tab</string> <string name="tab_share">Podijeli tab</string>
<!-- Button in the current session menu. Deletes the session when pressed --> <!-- Button in the current session menu. Deletes the session when pressed -->
@ -804,8 +817,6 @@
<!-- Title for the Delete browsing data on quit preference --> <!-- Title for the Delete browsing data on quit preference -->
<string name="preferences_delete_browsing_data_on_quit">Obriši podatke surfanja pri izlazu</string> <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 --> <!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Ugasi</string> <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> <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 --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Recèrca o adreça</string> <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 --> <!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Suprimir la session</string> <string name="private_browsing_delete_session">Suprimir la session</string>
@ -278,10 +276,22 @@
<!-- Text for the menu button to remove a top site --> <!-- Text for the menu button to remove a top site -->
<string name="remove_top_site">Suprimir</string> <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 --> <!-- Text for positive action to delete history in deleting history dialog -->
<string name="history_clear_dialog">Escafar</string> <string name="history_clear_dialog">Escafar</string>
<!-- Text for the button to delete a single history item --> <!-- Text for the button to delete a single history item -->
<string name="history_delete_item">Suprimir</string> <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 --> <!-- Text for the header that groups the history for last 24 hours -->
<string name="history_24_hours">Las darrièras 24 oras</string> <string name="history_24_hours">Las darrièras 24 oras</string>
<!-- Text for the header that groups the history the past 7 days --> <!-- 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 --> <!-- Restore tab button text on the tab crash page -->
<string name="tab_crash_restore">Restablir longlet</string> <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 --> <!-- Bookmark overflow menu copy button -->
<string name="bookmark_menu_copy_button">Copiar</string> <string name="bookmark_menu_copy_button">Copiar</string>
<!-- Bookmark overflow menu share button --> <!-- Bookmark overflow menu share button -->
@ -313,6 +325,9 @@
<!-- Bookmark editing error missing or improper URL --> <!-- Bookmark editing error missing or improper URL -->
<string name="bookmark_invalid_url_error">URL invalida</string> <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 --> <!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">Anar als paramètres</string> <string name="phone_feature_go_to_settings">Anar als paramètres</string>
<!-- Preference for altering the camera access for all websites --> <!-- Preference for altering the camera access for all websites -->
@ -347,4 +362,69 @@
<!-- Text for the warning message on the Add new device screen --> <!-- Text for the warning message on the Add new device screen -->
<string name="sync_add_new_device_message">Cap de periferic pas connectat</string> <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> </resources>

View File

@ -41,7 +41,7 @@
<!-- Private mode shortcut "contextual feature recommendation" (CFR) --> <!-- Private mode shortcut "contextual feature recommendation" (CFR) -->
<!-- Text for the main message --> <!-- 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 --> <!-- Text for the positive button -->
<string name="cfr_pos_button_text">Adicionar atalho</string> <string name="cfr_pos_button_text">Adicionar atalho</string>
<!-- Text for the negative button --> <!-- Text for the negative button -->
@ -221,7 +221,7 @@
<!-- Preference for private browsing options --> <!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Navegação privativa</string> <string name="preferences_private_browsing_options">Navegação privativa</string>
<!-- Preference for opening links in a private tab--> <!-- 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--> <!-- 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> <string name="preferences_allow_screenshots_in_private_mode">Permitir capturas de tela na navegação privativa</string>
<!-- Preference for adding private browsing shortcut --> <!-- Preference for adding private browsing shortcut -->
@ -700,7 +700,7 @@
<!-- Content description (not visible, for screen readers etc.): Opens the collection menu when pressed --> <!-- 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> <string name="collection_menu_button_content_description">Menu de coleções</string>
<!-- No Open Tabs Message Header --> <!-- 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 --> <!-- 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> <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 --> <!-- Title for the "select tabs" step of the collection creator -->

View File

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <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 --> <!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Paluruh atawa asupkeun alamat</string> <string name="search_hint">Paluruh atawa asupkeun alamat</string>
@ -49,8 +56,6 @@
<!-- Browser menu button that saves the current tab to a collection --> <!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Simpen kana koléksi</string> <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 --> <!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Bagikeun</string> <string name="browser_menu_share">Bagikeun</string>
<!-- Browser menu button shown in custom tabs that opens the current tab in Fenix <!-- 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 <!-- 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) --> 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> <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> <string name="browser_menu_read">Pidangan baca</string>
<!-- Browser menu button to open the current page in an external app --> <!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Buka di aplikasi</string> <string name="browser_menu_open_app_link">Buka di aplikasi</string>
@ -105,18 +110,46 @@
<!-- Text preview for larger sized widgets --> <!-- Text preview for larger sized widgets -->
<string name="search_widget_text_long">Paluruh raramat</string> <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 --> <!-- Preference for settings related to changing the default search engine -->
<string name="preferences_default_search_engine">Mesin pamaluruh baku</string> <string name="preferences_default_search_engine">Mesin pamaluruh baku</string>
<!-- Preference for settings related to Search --> <!-- Preference for settings related to Search -->
<string name="preferences_search">Paluruh</string> <string name="preferences_search">Paluruh</string>
<!-- Preference for settings related to Search address bar --> <!-- Preference for settings related to Search address bar -->
<string name="preferences_search_address_bar">Palang alamat</string> <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 --> <!-- Preference for settings related to changing the default browser -->
<string name="preferences_set_as_default_browser">Jadikeun panyungsi baku</string> <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 --> <!-- Preference for private browsing options -->
<string name="preferences_private_browsing_options">Nyungsi nyamuni</string> <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 --> <!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">Tambahan tarabas nyungsi nyamuni</string> <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 --> <!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Serper Firefox Account biasa</string> <string name="preferences_override_fxa_server">Serper Firefox Account biasa</string>
<!-- Preference category for account information --> <!-- Preference category for account information -->
@ -146,12 +179,30 @@
<!-- Preference for account settings --> <!-- Preference for account settings -->
<string name="preferences_account_settings">Setélan akun</string> <string name="preferences_account_settings">Setélan akun</string>
<!-- Preference for add_ons -->
<string name="preferences_addons">Émbohan</string>
<!-- Account Preferences --> <!-- Account Preferences -->
<!-- Preference for triggering sync --> <!-- Preference for triggering sync -->
<string name="preferences_sync_now">Singkronkeun ayeuna</string> <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 --> <!-- Preference for syncing bookmarks -->
<string name="preferences_sync_bookmarks">Markah</string> <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 --> <!-- Preference description for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions_description">Kilung Palacakan pikeun ieu loka ayeuna pareum</string> <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> <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. --> <!-- 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> <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 --> <!-- Action item in menu for the Delete browsing data on quit feature -->
<string name="delete_browsing_data_on_quit_action">Kaluar</string> <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 --> <!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Bolay</string> <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 --> <!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">Lenyepan</string> <string name="preference_enhanced_tracking_protection_explanation_learn_more">Lenyepan</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings --> <!-- 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 --> <!-- No Private Tabs Message Description -->
<string name="no_private_tabs_description">మీ అంతరంగిక ట్యాబులు ఇక్కడ కనిపిస్తాయి.</string> <string name="no_private_tabs_description">మీ అంతరంగిక ట్యాబులు ఇక్కడ కనిపిస్తాయి.</string>
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">ఫరవాలేదు వద్దు</string>
<!-- Text for the negative button --> <!-- Text for the negative button -->
<string name="search_widget_cfr_neg_button_text">ఇప్పుడు కాదు</string> <string name="search_widget_cfr_neg_button_text">ఇప్పుడు కాదు</string>
@ -29,14 +32,26 @@
<string name="browser_tabs_button">తెరిచివున్న ట్యాబులు</string> <string name="browser_tabs_button">తెరిచివున్న ట్యాబులు</string>
<!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) --> <!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">వెనుకకు</string> <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 --> <!-- Browser menu button that sends a user to help articles -->
<string name="browser_menu_help">సహాయం</string> <string name="browser_menu_help">సహాయం</string>
<!-- Browser menu button that sends a to a the what's new article --> <!-- Browser menu button that sends a to a the what's new article -->
<string name="browser_menu_whats_new">కొత్తవి ఏమిటి</string> <string name="browser_menu_whats_new">కొత్తవి ఏమిటి</string>
<!-- Browser menu button that opens the settings menu --> <!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">అమరికలు</string> <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. --> <!-- 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> <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 --> <!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">కొత్త ట్యాబు</string> <string name="browser_menu_new_tab">కొత్త ట్యాబు</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size --> <!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
@ -133,6 +148,9 @@
<!-- Title for experiments preferences --> <!-- Title for experiments preferences -->
<string name="preference_experiments">ప్రయోగాలు</string> <string name="preference_experiments">ప్రయోగాలు</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">ఖాతాను తొలగించు</string>
<!-- Button to cancel pairing --> <!-- Button to cancel pairing -->
<string name="pair_cancel">రద్దుచేయి</string> <string name="pair_cancel">రద్దుచేయి</string>
@ -173,6 +191,8 @@
<string name="tab_drawer_fab_content">అంతరంగికం</string> <string name="tab_drawer_fab_content">అంతరంగికం</string>
<!-- Text shown as the title of the open tab tray --> <!-- Text shown as the title of the open tab tray -->
<string name="tab_tray_title">తెరిచివున్న ట్యాబులు</string> <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 --> <!-- Text shown in the menu for closing all tabs -->
<string name="tab_tray_menu_item_close">ట్యాబులన్నీ మూసివేయి</string> <string name="tab_tray_menu_item_close">ట్యాబులన్నీ మూసివేయి</string>
<!-- Shortcut action to open new tab --> <!-- Shortcut action to open new tab -->
@ -182,6 +202,8 @@
<string name="close_tab">ట్యాబును మూసివేయి</string> <string name="close_tab">ట్యాబును మూసివేయి</string>
<!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title --> <!-- Content description (not visible, for screen readers etc.): Close tab <title> button. First parameter is tab title -->
<string name="close_tab_title">%s ట్యాబును మూసివేయి</string> <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 --> <!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">ట్యాబులన్నీ మూసివేయి</string> <string name="tabs_menu_close_all_tabs">ట్యాబులన్నీ మూసివేయి</string>
<!-- Button in the current session menu. Deletes the session when pressed --> <!-- 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 --> is a digit showing the number of items you have selected -->
<string name="history_delete_some">%1$d అంశాలను తొలగించు</string> <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 --> <!-- Text for the header that groups the history the past 30 days -->
<string name="history_30_days">గత 30 రోజులు</string> <string name="history_30_days">గత 30 రోజులు</string>
<!-- Text for the header that groups the history older than the last month --> <!-- 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 --> <!-- Close tab button text on the tab crash page -->
<string name="tab_crash_close">ట్యాబును మూసివేయి</string> <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 --> <!-- Bookmark overflow menu delete button -->
<string name="bookmark_menu_delete_button">తొలగించు</string> <string name="bookmark_menu_delete_button">తొలగించు</string>
<!--Bookmark overflow menu save button --> <!--Bookmark overflow menu save button -->
@ -227,14 +258,37 @@
<!-- Site permissions preferences header --> <!-- Site permissions preferences header -->
<string name="permissions_header">అనుమతులు</string> <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 --> <!-- Preference for altering the location access for all websites -->
<string name="preference_phone_feature_location">స్థానం</string> <string name="preference_phone_feature_location">స్థానం</string>
<!-- Preference for showing a list of websites that the default configurations won't apply to them --> <!-- Preference for showing a list of websites that the default configurations won't apply to them -->
<string name="preference_exceptions">మినహాయింపులు</string> <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 -->
<!-- Collections header on home fragment --> <!-- Collections header on home fragment -->
<string name="collections_header">సేకరణలు</string> <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 --> <!-- Content description (not visible, for screen readers etc.): button to close the collection creator -->
<string name="create_collection_close">మూసివేయి</string> <string name="create_collection_close">మూసివేయి</string>
@ -243,18 +297,100 @@
<!-- Snackbar action to view the collection the user just created or updated --> <!-- Snackbar action to view the collection the user just created or updated -->
<string name="create_collection_view">చూడండి</string> <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. --> <!-- Notification action to open Fenix and resume the current browsing session. -->
<string name="notification_pbm_action_open">తెరువు</string> <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 --> <!-- QR code scanner prompt dialog positive option to allow navigation to scanned link -->
<string name="qr_scanner_dialog_positive">అనుమతించు</string> <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 --> <!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">తొలగించు</string> <string name="tab_collection_dialog_positive">తొలగించు</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection --> <!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
<string name="tab_collection_dialog_negative">రద్దుచేయి</string> <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 --> <!-- Title for Accessibility Text Size Scaling Preference -->
<string name="preference_accessibility_font_size_title">ఫాంటు పరిమాణం</string> <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 --> <!-- Title for the tabs item in Delete browsing data -->
<string name="preferences_delete_browsing_data_tabs_title_2">తెరిచివున్న ట్యాబులు</string> <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 --> <!-- 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 --> <!-- Title for the cookies item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies">కుకీలు</string> <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 --> <!-- Text for the cancel button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_cancel">రద్దుచేయి</string> <string name="delete_browsing_data_prompt_cancel">రద్దుచేయి</string>
<!-- Text for the allow button for the data deletion dialog --> <!-- Text for the allow button for the data deletion dialog -->
<string name="delete_browsing_data_prompt_allow">తొలగించు</string> <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 --> <!-- Onboarding -->
<!-- Text for onboarding welcome message <!-- Text for onboarding welcome message
The first parameter is the name of the app (e.g. Firefox Preview) --> The first parameter is the name of the app (e.g. Firefox Preview) -->
@ -287,9 +429,44 @@
<string name="onboarding_whats_new_header1">కొత్తవేమిటో చూడండి</string> <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 --> <!-- 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> <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 --> <!-- Content description (not visible, for screen readers etc.): Close onboarding screen -->
<string name="onboarding_close">మూసివేయి</string> <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 --> <!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">రద్దుచేయి</string> <string name="sign_out_cancel">రద్దుచేయి</string>

View File

@ -818,7 +818,7 @@
<!-- Text shown in snackbar when user closes all tabs --> <!-- Text shown in snackbar when user closes all tabs -->
<string name="snackbar_tabs_closed">Вкладки закрито</string> <string name="snackbar_tabs_closed">Вкладки закрито</string>
<!-- Text shown in snackbar when user adds a site to top sites --> <!-- 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 --> <!-- Text shown in snackbar when user closes a private tab -->
<string name="snackbar_private_tab_closed">Приватну вкладку закрито</string> <string name="snackbar_private_tab_closed">Приватну вкладку закрито</string>
<!-- Text shown in snackbar when user closes all private tabs --> <!-- Text shown in snackbar when user closes all private tabs -->
@ -1400,7 +1400,7 @@
<!-- Bookmark deletion confirmation --> <!-- Bookmark deletion confirmation -->
<string name="bookmark_deletion_confirmation">Ви впевнені, що хочете видалити цю закладку?</string> <string name="bookmark_deletion_confirmation">Ви впевнені, що хочете видалити цю закладку?</string>
<!-- Browser menu button that adds a top site to the home fragment --> <!-- 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 <!-- text shown before the issuer name to indicate who its verified by, parameter is the name of
the certificate authority that verified the ticket--> the certificate authority that verified the ticket-->
<string name="certificate_info_verified_by">Засвідчено: %1$s</string> <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 --> <!-- 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> <string name="tip_firefox_preview_moved_header">Firefox Nightly 已接手原 Firefox Preview 功能</string>
<!-- text for firefox preview moving tip description --> <!-- text for firefox preview moving tip description -->
<string name="tip_firefox_preview_moved_description">Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n <string name="tip_firefox_preview_moved_description">Firefox Nightly 每天都會更新,當中包含實驗中的新功能,然而這些新功能可能會較不穩定。\n\n若想要有較穩定的使用體驗請下載我們的 Beta 測試版。</string>
若想要有較穩定的使用體驗,請下載我們的 Beta 測試版。</string>
<!-- text for firefox preview moving tip button. "Firefox for Android Beta" is intentionally hardcoded --> <!-- 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> <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.browser.state.store.BrowserStore
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.search.SearchUseCases
import mozilla.components.feature.session.SessionFeature
import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SessionUseCases
import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@ -93,6 +95,8 @@ class DefaultBrowserToolbarControllerTest {
@RelaxedMockK private lateinit var tabCollectionStorage: TabCollectionStorage @RelaxedMockK private lateinit var tabCollectionStorage: TabCollectionStorage
@RelaxedMockK private lateinit var topSiteStorage: TopSiteStorage @RelaxedMockK private lateinit var topSiteStorage: TopSiteStorage
@RelaxedMockK private lateinit var readerModeController: ReaderModeController @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( private val store: BrowserStore = BrowserStore(initialState = BrowserState(
listOf( listOf(
createTab("https://www.mozilla.org", id = "reader-inactive-tab"), 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.sessionManager } returns sessionManager
every { activity.components.core.store } returns store every { activity.components.core.store } returns store
every { sessionManager.selectedSession } returns currentSession every { sessionManager.selectedSession } returns currentSession
every { sessionFeatureWrapper.get() } returns sessionFeature
val onComplete = slot<() -> Unit>() val onComplete = slot<() -> Unit>()
every { browserAnimator.captureEngineViewAndDrawStatically(capture(onComplete)) } answers { onComplete.captured.invoke() } every { browserAnimator.captureEngineViewAndDrawStatically(capture(onComplete)) } answers { onComplete.captured.invoke() }
@ -469,7 +474,7 @@ class DefaultBrowserToolbarControllerTest {
controller.handleToolbarItemInteraction(item) controller.handleToolbarItemInteraction(item)
verify { engineView.release() } verify { sessionFeature.release() }
verify { currentSession.customTabConfig = null } verify { currentSession.customTabConfig = null }
verify { sessionManager.select(currentSession) } verify { sessionManager.select(currentSession) }
verify { activity.startActivity(openInFenixIntent) } verify { activity.startActivity(openInFenixIntent) }
@ -571,6 +576,7 @@ class DefaultBrowserToolbarControllerTest {
bookmarkTapped = bookmarkTapped, bookmarkTapped = bookmarkTapped,
readerModeController = readerModeController, readerModeController = readerModeController,
sessionManager = sessionManager, sessionManager = sessionManager,
sessionFeature = sessionFeatureWrapper,
onTabCounterClicked = onTabCounterClicked, onTabCounterClicked = onTabCounterClicked,
onCloseTab = onCloseTab onCloseTab = onCloseTab
).apply { ).apply {

View File

@ -37,7 +37,7 @@ class DrawableTest {
override fun draw(canvas: Canvas) {} override fun draw(canvas: Canvas) {}
override fun setAlpha(alpha: Int) {} override fun setAlpha(alpha: Int) {}
override fun setColorFilter(cf: ColorFilter) {} override fun setColorFilter(cf: ColorFilter?) {}
override fun onBoundsChange(bounds: Rect) { override fun onBoundsChange(bounds: Rect) {
boundsChanged = true boundsChanged = true
super.onBoundsChange(bounds) super.onBoundsChange(bounds)

View File

@ -7,7 +7,6 @@ package org.mozilla.fenix.library.bookmarks
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import androidx.core.content.getSystemService
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDestination import androidx.navigation.NavDestination
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
@ -18,7 +17,6 @@ import io.mockk.coVerify
import io.mockk.every import io.mockk.every
import io.mockk.just import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.runs import io.mockk.runs
import io.mockk.slot import io.mockk.slot
import io.mockk.spyk 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.bookmarkStorage
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
@SuppressWarnings("TooManyFunctions", "LargeClass") @Suppress("TooManyFunctions", "LargeClass")
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
class BookmarkControllerTest { class BookmarkControllerTest {
@ -51,6 +49,7 @@ class BookmarkControllerTest {
private val bookmarkStore = spyk(BookmarkFragmentStore(BookmarkFragmentState(null))) private val bookmarkStore = spyk(BookmarkFragmentStore(BookmarkFragmentState(null)))
private val context: Context = mockk(relaxed = true) private val context: Context = mockk(relaxed = true)
private val scope = TestCoroutineScope() private val scope = TestCoroutineScope()
private val clipboardManager: ClipboardManager = mockk(relaxUnitFun = true)
private val navController: NavController = mockk(relaxed = true) private val navController: NavController = mockk(relaxed = true)
private val sharedViewModel: BookmarksSharedViewModel = mockk() private val sharedViewModel: BookmarksSharedViewModel = mockk()
private val loadBookmarkNode: suspend (String) -> BookmarkNode? = mockk(relaxed = true) private val loadBookmarkNode: suspend (String) -> BookmarkNode? = mockk(relaxed = true)
@ -90,13 +89,6 @@ class BookmarkControllerTest {
@Before @Before
fun setup() { 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 { homeActivity.components.services } returns services
every { navController.currentDestination } returns NavDestination("").apply { every { navController.currentDestination } returns NavDestination("").apply {
id = R.id.bookmarkFragment id = R.id.bookmarkFragment
@ -105,8 +97,9 @@ class BookmarkControllerTest {
every { sharedViewModel.selectedFolder = any() } just runs every { sharedViewModel.selectedFolder = any() } just runs
controller = DefaultBookmarkController( controller = DefaultBookmarkController(
context = homeActivity, activity = homeActivity,
navController = navController, navController = navController,
clipboardManager = clipboardManager,
scope = scope, scope = scope,
store = bookmarkStore, store = bookmarkStore,
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,
@ -247,10 +240,7 @@ class BookmarkControllerTest {
@Test @Test
fun `handleCopyUrl should copy bookmark url to clipboard and show a toast`() { 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) 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) controller.handleCopyUrl(item)

View File

@ -178,7 +178,7 @@ class HistoryControllerTest {
controller.handleCopyUrl(historyItem) controller.handleCopyUrl(historyItem)
verify { verify {
clipboardManager.primaryClip = capture(clipdata) clipboardManager.setPrimaryClip(capture(clipdata))
snackbar.show() snackbar.show()
} }
assertEquals(1, clipdata.captured.itemCount) assertEquals(1, clipdata.captured.itemCount)

View File

@ -7,12 +7,12 @@ package org.mozilla.fenix.utils
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class ClipboardHandlerTest { class ClipboardHandlerTest {
@ -32,7 +32,7 @@ class ClipboardHandlerTest {
fun getText() { fun getText() {
assertEquals(null, clipboardHandler.text) assertEquals(null, clipboardHandler.text)
clipboard.primaryClip = ClipData.newPlainText("Text", clipboardText) clipboard.setPrimaryClip(ClipData.newPlainText("Text", clipboardText))
assertEquals(clipboardText, clipboardHandler.text) assertEquals(clipboardText, clipboardHandler.text)
} }
@ -48,7 +48,7 @@ class ClipboardHandlerTest {
fun getUrl() { fun getUrl() {
assertEquals(null, clipboardHandler.url) assertEquals(null, clipboardHandler.url)
clipboard.primaryClip = ClipData.newPlainText("Text", clipboardUrl) clipboard.setPrimaryClip(ClipData.newPlainText("Text", clipboardUrl))
assertEquals(clipboardUrl, clipboardHandler.url) assertEquals(clipboardUrl, clipboardHandler.url)
} }
@ -56,7 +56,7 @@ class ClipboardHandlerTest {
fun getUrlfromTextUrlMIME() { fun getUrlfromTextUrlMIME() {
assertEquals(null, clipboardHandler.url) assertEquals(null, clipboardHandler.url)
clipboard.primaryClip = ClipData.newHtmlText("Html", clipboardUrl, clipboardUrl) clipboard.setPrimaryClip(ClipData.newHtmlText("Html", clipboardUrl, clipboardUrl))
assertEquals(clipboardUrl, clipboardHandler.url) assertEquals(clipboardUrl, clipboardHandler.url)
} }
} }

View File

@ -23,11 +23,11 @@ import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD
import org.mozilla.fenix.IntentReceiverActivity 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.PREVIOUS_INTENT
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE
import org.robolectric.Robolectric import org.robolectric.Robolectric
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.Shadows import org.robolectric.Shadows
import org.robolectric.android.controller.ActivityController import org.robolectric.android.controller.ActivityController
import org.robolectric.shadows.ShadowActivity import org.robolectric.shadows.ShadowActivity
@ -96,7 +96,7 @@ class VoiceSearchActivityTest {
controller.create(savedInstanceState) controller.create(savedInstanceState)
controller.saveInstanceState(outState) controller.saveInstanceState(outState)
assertEquals(previousIntent, outState.getParcelable(PREVIOUS_INTENT) as Intent) assertEquals(previousIntent, outState.getParcelable<Intent>(PREVIOUS_INTENT))
} }
@Test @Test

View File

@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents { 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 { object Config {
// Synchronized build configuration for all modules // Synchronized build configuration for all modules
const val compileSdkVersion = 28 const val compileSdkVersion = 29
const val minSdkVersion = 21 const val minSdkVersion = 21
const val targetSdkVersion = 28 const val targetSdkVersion = 29
@JvmStatic @JvmStatic
private fun generateDebugVersionName(): String { private fun generateDebugVersionName(): String {