1
0
Fork 0

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

master
blallo 2020-03-29 00:00:52 +00:00
commit 20de2044c1
51 changed files with 865 additions and 205 deletions

View File

@ -0,0 +1,59 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ui
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer
import org.junit.Rule
import org.junit.Before
import org.junit.After
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.ui.robots.homeScreen
/**
* Tests for verifying the advanced section in Settings
*
*/
class SettingsAdvancedTest {
/* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping.
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
private lateinit var mockWebServer: MockWebServer
@get:Rule
val activityIntentTestRule = HomeActivityIntentTestRule()
@Before
fun setUp() {
mockWebServer = MockWebServer().apply {
setDispatcher(AndroidAssetDispatcher())
start()
}
}
@After
fun tearDown() {
mockWebServer.shutdown()
}
@Test
// Walks through settings menu and sub-menus to ensure all items are present
fun settingsAboutItemsTest() {
// ADVANCED
homeScreen {
}.openThreeDotMenu {
}.openSettings {
// ADVANCED
verifyAdvancedHeading()
verifyAddons()
verifyRemoteDebug()
verifyLeakCanaryButton()
}
}
}

View File

@ -49,7 +49,6 @@ class SettingsDeveloperToolsTest {
homeScreen { homeScreen {
}.openThreeDotMenu { }.openThreeDotMenu {
}.openSettings { }.openSettings {
verifyDeveloperToolsHeading()
verifyRemoteDebug() verifyRemoteDebug()
} }
} }

View File

@ -111,7 +111,6 @@ class SettingsPrivacyTest {
verifyDeleteBrowsingDataButton() verifyDeleteBrowsingDataButton()
verifyDeleteBrowsingDataOnQuitButton() verifyDeleteBrowsingDataOnQuitButton()
verifyDataCollectionButton() verifyDataCollectionButton()
verifyLeakCanaryButton()
} }
} }

View File

@ -64,9 +64,9 @@ class SettingsRobot {
fun verifyLeakCanaryButton() = assertLeakCanaryButton() fun verifyLeakCanaryButton() = assertLeakCanaryButton()
fun verifySettingsView() = assertSettingsView() fun verifySettingsView() = assertSettingsView()
// DEVELOPER TOOLS SECTION // ADVANCED SECTION
fun verifyDeveloperToolsHeading() = assertDeveloperToolsHeading() fun verifyAdvancedHeading() = assertAdvancedHeading()
fun verifyAddons() = assertAddons()
fun verifyRemoteDebug() = assertRemoteDebug() fun verifyRemoteDebug() = assertRemoteDebug()
// ABOUT SECTION // ABOUT SECTION
@ -174,7 +174,7 @@ private fun assertSettingsView() {
// verify that we are in the correct library view // verify that we are in the correct library view
assertGeneralHeading() assertGeneralHeading()
assertPrivacyHeading() assertPrivacyHeading()
assertDeveloperToolsHeading() assertAdvancedHeading()
assertAboutHeading() assertAboutHeading()
} }
@ -255,13 +255,22 @@ private fun assertDeleteBrowsingDataOnQuitButton() {
private fun assertDataCollectionButton() = onView(withText("Data collection")) private fun assertDataCollectionButton() = onView(withText("Data collection"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertLeakCanaryButton() = onView(withText("LeakCanary")) private fun assertLeakCanaryButton() {
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) scrollToElementByText("LeakCanary")
onView(withText("LeakCanary"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
// DEVELOPER TOOLS SECTION // ADVANCED SECTION
private fun assertDeveloperToolsHeading() { private fun assertAdvancedHeading() {
scrollToElementByText("Developer tools") scrollToElementByText("Advanced")
onView(withText("Developer tools")) onView(withText("Advanced"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
private fun assertAddons() {
scrollToElementByText("Add-ons")
onView(withText("Add-ons"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
} }

View File

@ -86,6 +86,7 @@ import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
/** /**
@ -119,6 +120,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>() private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>()
private val swipeRefreshFeature = ViewBoundFeatureWrapper<SwipeRefreshFeature>() private val swipeRefreshFeature = ViewBoundFeatureWrapper<SwipeRefreshFeature>()
private val webchannelIntegration = ViewBoundFeatureWrapper<FxaWebChannelFeature>() private val webchannelIntegration = ViewBoundFeatureWrapper<FxaWebChannelFeature>()
private val sitePermissionWifiIntegration = ViewBoundFeatureWrapper<SitePermissionsWifiIntegration>()
var customTabSessionId: String? = null var customTabSessionId: String? = null
@ -392,6 +394,15 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
view = view view = view
) )
sitePermissionWifiIntegration.set(
feature = SitePermissionsWifiIntegration(
settings = context.settings(),
wifiConnectionMonitor = context.components.wifiConnectionMonitor
),
owner = this,
view = view
)
context.settings().setSitePermissionSettingListener(viewLifecycleOwner) { context.settings().setSitePermissionSettingListener(viewLifecycleOwner) {
// If the user connects to WIFI while on the BrowserFragment, this will update the // If the user connects to WIFI while on the BrowserFragment, this will update the
// SitePermissionsRules (specifically autoplay) accordingly // SitePermissionsRules (specifically autoplay) accordingly
@ -536,6 +547,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
requireComponents.core.sessionManager.register(this, this, autoPause = true) requireComponents.core.sessionManager.register(this, this, autoPause = true)
sitePermissionWifiIntegration.get()?.maybeAddWifiConnectedListener()
} }
@CallSuper @CallSuper

View File

@ -19,11 +19,9 @@ import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.migration.state.MigrationStore import mozilla.components.support.migration.state.MigrationStore
import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.test.Mockable import org.mozilla.fenix.test.Mockable
import org.mozilla.fenix.utils.ClipboardHandler import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.wifi.WifiConnectionMonitor import org.mozilla.fenix.wifi.WifiConnectionMonitor
import org.mozilla.fenix.wifi.WifiIntegration
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
private const val DAY_IN_MINUTES = 24 * 60L private const val DAY_IN_MINUTES = 24 * 60L
@ -110,12 +108,5 @@ class Components(private val context: Context) {
val migrationStore by lazy { MigrationStore() } val migrationStore by lazy { MigrationStore() }
val performance by lazy { PerformanceComponent() } val performance by lazy { PerformanceComponent() }
val push by lazy { Push(context, analytics.crashReporter) } val push by lazy { Push(context, analytics.crashReporter) }
val wifiIntegration by lazy { val wifiConnectionMonitor by lazy { WifiConnectionMonitor(context as Application) }
WifiIntegration(
settings = context.settings(),
wifiConnectionMonitor = WifiConnectionMonitor(
context as Application
)
)
}
} }

View File

@ -7,6 +7,7 @@ import android.content.Context
import mozilla.components.service.fxa.ServerConfig import mozilla.components.service.fxa.ServerConfig
import mozilla.components.service.fxa.ServerConfig.Server import mozilla.components.service.fxa.ServerConfig.Server
import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.ext.settings
/** /**
* Utility to configure Firefox Account servers. * Utility to configure Firefox Account servers.
@ -24,6 +25,11 @@ object FxaServer {
} }
fun config(context: Context): ServerConfig { fun config(context: Context): ServerConfig {
return ServerConfig(Server.RELEASE, CLIENT_ID, redirectUrl(context)) val serverOverride = context.settings().overrideFxAServer
val tokenServerOverride = context.settings().overrideSyncTokenServer.ifEmpty { null }
if (serverOverride.isEmpty()) {
return ServerConfig(Server.RELEASE, CLIENT_ID, redirectUrl(context), tokenServerOverride)
}
return ServerConfig(serverOverride, CLIENT_ID, redirectUrl(context), tokenServerOverride)
} }
} }

View File

@ -22,12 +22,12 @@ import org.mozilla.fenix.home.OnboardingState
import org.mozilla.fenix.home.Tab import org.mozilla.fenix.home.Tab
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageWithActionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageWithActionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.SaveTabGroupViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.SaveTabGroupViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TabHeaderViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TabViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingAutomaticSignInViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingAutomaticSignInViewHolder
@ -172,7 +172,7 @@ class SessionControlAdapter(
NoContentMessageWithActionViewHolder.LAYOUT_ID -> NoContentMessageWithActionViewHolder(view) NoContentMessageWithActionViewHolder.LAYOUT_ID -> NoContentMessageWithActionViewHolder(view)
CollectionHeaderViewHolder.LAYOUT_ID -> CollectionHeaderViewHolder(view) CollectionHeaderViewHolder.LAYOUT_ID -> CollectionHeaderViewHolder(view)
CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, interactor) CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, interactor)
TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, interactor) TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, interactor, differentLastItem = true)
OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view) OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view)
OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view) OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view)
OnboardingAutomaticSignInViewHolder.LAYOUT_ID -> OnboardingAutomaticSignInViewHolder(view) OnboardingAutomaticSignInViewHolder.LAYOUT_ID -> OnboardingAutomaticSignInViewHolder(view)

View File

@ -50,7 +50,7 @@ class SwipeToDeleteCallback(
icon?.setTint(recyclerView.context.getColorFromAttr(R.attr.destructive)) icon?.setTint(recyclerView.context.getColorFromAttr(R.attr.destructive))
val backgroundDrawable = when { val backgroundDrawable = when {
viewHolder is TabInCollectionViewHolder && viewHolder.isLastTab -> { viewHolder is TabInCollectionViewHolder && viewHolder.isLastItem -> {
R.drawable.tab_in_collection_last_swipe_background R.drawable.tab_in_collection_last_swipe_background
} }
viewHolder is TabInCollectionViewHolder -> { viewHolder is TabInCollectionViewHolder -> {

View File

@ -17,7 +17,6 @@ import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollection
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.description
import org.mozilla.fenix.ext.getIconColor import org.mozilla.fenix.ext.getIconColor
import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor
@ -77,17 +76,18 @@ class CollectionViewHolder(
private fun updateCollectionUI() { private fun updateCollectionUI() {
view.collection_title.text = collection.title view.collection_title.text = collection.title
view.collection_description.text = collection.description(view.context)
val layoutParams = view.layoutParams as ViewGroup.MarginLayoutParams val layoutParams = view.layoutParams as ViewGroup.MarginLayoutParams
view.isActivated = expanded view.isActivated = expanded
if (expanded) { if (expanded) {
layoutParams.bottomMargin = 0 layoutParams.bottomMargin = 0
collection_title.setPadding(0, 0, 0, EXPANDED_PADDING) collection_title.setPadding(0, 0, 0, EXPANDED_PADDING)
view.collection_description.visibility = View.GONE view.collection_share_button.visibility = View.VISIBLE
view.collection_overflow_button.visibility = View.VISIBLE
} else { } else {
layoutParams.bottomMargin = COLLAPSED_MARGIN layoutParams.bottomMargin = COLLAPSED_MARGIN
view.collection_description.visibility = View.VISIBLE view.collection_share_button.visibility = View.GONE
view.collection_overflow_button.visibility = View.GONE
} }
view.collection_icon.colorFilter = createBlendModeColorFilterCompat( view.collection_icon.colorFilter = createBlendModeColorFilterCompat(

View File

@ -10,7 +10,10 @@ import android.view.ViewOutlineProvider
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.extensions.LayoutContainer import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.tab_in_collection.* import kotlinx.android.synthetic.main.list_element.list_element_title
import kotlinx.android.synthetic.main.list_element.list_item_action_button
import kotlinx.android.synthetic.main.list_element.list_item_favicon
import kotlinx.android.synthetic.main.list_element.list_item_url
import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.util.dpToFloat import mozilla.components.support.ktx.android.util.dpToFloat
@ -25,6 +28,7 @@ import mozilla.components.feature.tab.collections.Tab as ComponentTab
class TabInCollectionViewHolder( class TabInCollectionViewHolder(
val view: View, val view: View,
val interactor: CollectionInteractor, val interactor: CollectionInteractor,
private val differentLastItem: Boolean = false,
override val containerView: View? = view override val containerView: View? = view
) : RecyclerView.ViewHolder(view), LayoutContainer { ) : RecyclerView.ViewHolder(view), LayoutContainer {
@ -32,11 +36,11 @@ class TabInCollectionViewHolder(
private set private set
lateinit var tab: ComponentTab lateinit var tab: ComponentTab
private set private set
var isLastTab = false var isLastItem = false
init { init {
collection_tab_icon.clipToOutline = true list_item_favicon.clipToOutline = true
collection_tab_icon.outlineProvider = object : ViewOutlineProvider() { list_item_favicon.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline?) { override fun getOutline(view: View, outline: Outline?) {
outline?.setRoundRect( outline?.setRoundRect(
0, 0,
@ -52,8 +56,8 @@ class TabInCollectionViewHolder(
interactor.onCollectionOpenTabClicked(tab) interactor.onCollectionOpenTabClicked(tab)
} }
collection_tab_close_button.increaseTapArea(buttonIncreaseDps) list_item_action_button.increaseTapArea(buttonIncreaseDps)
collection_tab_close_button.setOnClickListener { list_item_action_button.setOnClickListener {
interactor.onCollectionRemoveTab(collection, tab) interactor.onCollectionRemoveTab(collection, tab)
} }
} }
@ -61,28 +65,26 @@ class TabInCollectionViewHolder(
fun bindSession(collection: TabCollection, tab: ComponentTab, isLastTab: Boolean) { fun bindSession(collection: TabCollection, tab: ComponentTab, isLastTab: Boolean) {
this.collection = collection this.collection = collection
this.tab = tab this.tab = tab
this.isLastTab = isLastTab this.isLastItem = isLastTab
updateTabUI() updateTabUI()
} }
private fun updateTabUI() { private fun updateTabUI() {
collection_tab_hostname.text = tab.url.toShortUrl(view.context.components.publicSuffixList) list_item_url.text = tab.url.toShortUrl(view.context.components.publicSuffixList)
collection_tab_title.text = tab.title list_element_title.text = tab.title
collection_tab_icon.context.components.core.icons.loadIntoView(collection_tab_icon, tab.url) list_item_favicon.context.components.core.icons.loadIntoView(list_item_favicon, tab.url)
// If I'm the last one... // If last item and we want to change UI for it
if (isLastTab) { if (isLastItem && differentLastItem) {
view.background = AppCompatResources.getDrawable(view.context, R.drawable.rounded_bottom_corners) view.background = AppCompatResources.getDrawable(view.context, R.drawable.rounded_bottom_corners)
divider_line.visibility = View.GONE
} else { } else {
view.setBackgroundColor(view.context.getColorFromAttr(R.attr.above)) view.setBackgroundColor(view.context.getColorFromAttr(R.attr.above))
divider_line.visibility = View.VISIBLE
} }
} }
companion object { companion object {
const val buttonIncreaseDps = 12 const val buttonIncreaseDps = 12
const val LAYOUT_ID = R.layout.tab_in_collection const val LAYOUT_ID = R.layout.list_element
} }
} }

View File

@ -27,6 +27,7 @@ import kotlinx.android.synthetic.main.search_suggestions_onboarding.view.*
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.concept.storage.HistoryStorage import mozilla.components.concept.storage.HistoryStorage
import mozilla.components.feature.qr.QrFeature import mozilla.components.feature.qr.QrFeature
import mozilla.components.feature.qr.QrFragment
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 mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
@ -278,6 +279,31 @@ class SearchFragment : Fragment(), UserInteractionHandler {
permissionDidUpdate = false permissionDidUpdate = false
hideToolbar() hideToolbar()
if (!isQrFragmentVisible()) {
refocusUrlView()
}
}
/**
* Refocus URL editText. Needed after the user brings back the app
* into the foreground.
* See https://github.com/mozilla-mobile/fenix/issues/6290
**/
private fun refocusUrlView() {
val urlView = toolbarView.view
.findViewById<InlineAutocompleteEditText>(R.id.mozac_browser_toolbar_edit_url_view)
if (!urlView.hasFocus()) {
urlView.requestFocus()
}
}
/**
* Check to see if QrFragment exists & is visible.
* */
private fun isQrFragmentVisible(): Boolean {
val foundQrFragment = parentFragmentManager.fragments.firstOrNull { it is QrFragment }
return foundQrFragment != null && foundQrFragment.isVisible
} }
override fun onPause() { override fun onPause() {

View File

@ -10,6 +10,8 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import android.os.Handler
import android.widget.Toast
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
import androidx.navigation.findNavController import androidx.navigation.findNavController
@ -45,6 +47,7 @@ import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.settings.account.AccountAuthErrorPreference import org.mozilla.fenix.settings.account.AccountAuthErrorPreference
import org.mozilla.fenix.settings.account.AccountPreference import org.mozilla.fenix.settings.account.AccountPreference
import kotlin.system.exitProcess
@Suppress("LargeClass", "TooManyFunctions") @Suppress("LargeClass", "TooManyFunctions")
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : PreferenceFragmentCompat() {
@ -300,6 +303,29 @@ class SettingsFragment : PreferenceFragmentCompat() {
requireComponents.core.engine.settings.remoteDebuggingEnabled = newValue requireComponents.core.engine.settings.remoteDebuggingEnabled = newValue
true true
} }
val preferenceFxAOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_fxa_server))
val preferenceSyncOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_sync_tokenserver))
val syncFxAOverrideUpdater = object : StringSharedPreferenceUpdater() {
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
return super.onPreferenceChange(preference, newValue).also {
updateFxASyncOverrideMenu()
Toast.makeText(
context,
getString(R.string.toast_override_fxa_sync_server_done),
Toast.LENGTH_LONG
).show()
Handler().postDelayed({
exitProcess(0)
}, FXA_SYNC_OVERRIDE_EXIT_DELAY)
}
}
}
preferenceFxAOverride?.onPreferenceChangeListener = syncFxAOverrideUpdater
preferenceSyncOverride?.onPreferenceChangeListener = syncFxAOverrideUpdater
} }
private fun navigateFromSettings(directions: NavDirections) { private fun navigateFromSettings(directions: NavDirections) {
@ -343,6 +369,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
val accountManager = requireComponents.backgroundServices.accountManager val accountManager = requireComponents.backgroundServices.accountManager
val account = accountManager.authenticatedAccount() val account = accountManager.authenticatedAccount()
updateFxASyncOverrideMenu()
// Signed-in, no problems. // Signed-in, no problems.
if (account != null && !accountManager.accountNeedsReauth()) { if (account != null && !accountManager.accountNeedsReauth()) {
preferenceSignIn?.isVisible = false preferenceSignIn?.isVisible = false
@ -388,7 +416,31 @@ class SettingsFragment : PreferenceFragmentCompat() {
} }
} }
private fun updateFxASyncOverrideMenu() {
val preferenceFxAOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_fxa_server))
val preferenceSyncOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_sync_tokenserver))
val settings = requireContext().settings()
val show = settings.overrideFxAServer.isNotEmpty() ||
settings.overrideSyncTokenServer.isNotEmpty() ||
settings.showSecretDebugMenuThisSession
// Only enable changes to these prefs when the user isn't connected to an account.
val enabled = requireComponents.backgroundServices.accountManager.authenticatedAccount() == null
preferenceFxAOverride?.apply {
isVisible = show
isEnabled = enabled
summary = settings.overrideFxAServer.ifEmpty { null }
}
preferenceSyncOverride?.apply {
isVisible = show
isEnabled = enabled
summary = settings.overrideSyncTokenServer.ifEmpty { null }
}
}
companion object { companion object {
private const val SCROLL_INDICATOR_DELAY = 10L private const val SCROLL_INDICATOR_DELAY = 10L
private const val FXA_SYNC_OVERRIDE_EXIT_DELAY = 2000L
} }
} }

View File

@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
@ -20,6 +21,7 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.lib.Do import org.mozilla.fenix.lib.Do
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.about.AboutItemType.LICENSING_INFO import org.mozilla.fenix.settings.about.AboutItemType.LICENSING_INFO
@ -36,6 +38,8 @@ import org.mozilla.geckoview.BuildConfig as GeckoViewBuildConfig
class AboutFragment : Fragment(), AboutPageListener { class AboutFragment : Fragment(), AboutPageListener {
private lateinit var appName: String private lateinit var appName: String
private val aboutPageAdapter: AboutPageAdapter = AboutPageAdapter(this) private val aboutPageAdapter: AboutPageAdapter = AboutPageAdapter(this)
private var secretDebugMenuClicks = 0
private var lastDebugMenuToast: Toast? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -49,6 +53,11 @@ class AboutFragment : Fragment(), AboutPageListener {
return rootView return rootView
} }
override fun onResume() {
super.onResume()
secretDebugMenuClicks = 0
}
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -63,8 +72,36 @@ class AboutFragment : Fragment(), AboutPageListener {
) )
} }
// 5 taps on the logo activate the "secret" debug menu.
wordmark.setOnClickListener {
// Because the user will mostly likely tap the logo in rapid succession,
// we ensure only 1 toast is shown at any given time.
lastDebugMenuToast?.let { toast -> toast.cancel() }
secretDebugMenuClicks += 1
when (secretDebugMenuClicks) {
in 2 until SECRET_DEBUG_MENU_CLICKS -> {
val clicksLeft = SECRET_DEBUG_MENU_CLICKS - secretDebugMenuClicks
val toast = Toast.makeText(
context,
getString(R.string.about_debug_menu_toast_progress, clicksLeft),
Toast.LENGTH_SHORT
)
toast.show()
lastDebugMenuToast = toast
}
SECRET_DEBUG_MENU_CLICKS -> {
Toast.makeText(
context,
getString(R.string.about_debug_menu_toast_done),
Toast.LENGTH_LONG
).show()
requireContext().settings().showSecretDebugMenuThisSession = true
}
}
}
populateAboutHeader() populateAboutHeader()
aboutPageAdapter.updateData(populateAboutList()) aboutPageAdapter.submitList(populateAboutList())
} }
private fun populateAboutHeader() { private fun populateAboutHeader() {
@ -183,5 +220,7 @@ class AboutFragment : Fragment(), AboutPageListener {
companion object { companion object {
private const val ABOUT_LICENSE_URL = "about:license" private const val ABOUT_LICENSE_URL = "about:license"
// Number of clicks on the app logo to enable the "secret" debug menu.
private const val SECRET_DEBUG_MENU_CLICKS = 5
} }
} }

View File

@ -6,33 +6,33 @@ package org.mozilla.fenix.settings.about
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.VisibleForTesting import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.ListAdapter
import org.mozilla.fenix.settings.about.viewholders.AboutItemViewHolder import org.mozilla.fenix.settings.about.viewholders.AboutItemViewHolder
class AboutPageAdapter(private val listener: AboutPageListener) : RecyclerView.Adapter<AboutItemViewHolder>() { class AboutPageAdapter(private val listener: AboutPageListener) :
ListAdapter<AboutPageItem, AboutItemViewHolder>(DiffCallback) {
@VisibleForTesting
var aboutList: List<AboutPageItem>? = null
fun updateData(items: List<AboutPageItem>) {
this.aboutList = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AboutItemViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AboutItemViewHolder {
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)
.inflate(AboutItemViewHolder.LAYOUT_ID, parent, false) .inflate(AboutItemViewHolder.LAYOUT_ID, parent, false)
return AboutItemViewHolder(view, listener) return AboutItemViewHolder(view, listener)
} }
override fun getItemCount(): Int = aboutList?.size ?: 0
override fun onBindViewHolder(holder: AboutItemViewHolder, position: Int) { override fun onBindViewHolder(holder: AboutItemViewHolder, position: Int) {
(aboutList?.get(position) as AboutPageItem.Item).also { holder.bind(getItem(position) as AboutPageItem.Item)
holder.bind(it) }
}
private object DiffCallback : DiffUtil.ItemCallback<AboutPageItem>() {
override fun areItemsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) =
oldItem === newItem
override fun areContentsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) =
when (oldItem) {
is AboutPageItem.Item ->
newItem is AboutPageItem.Item && oldItem.title == newItem.title
}
} }
} }

View File

@ -65,6 +65,7 @@ class SavedLoginsFragment : Fragment() {
savedLoginsStore = StoreProvider.get(this) { savedLoginsStore = StoreProvider.get(this) {
SavedLoginsFragmentStore( SavedLoginsFragmentStore(
SavedLoginsFragmentState( SavedLoginsFragmentState(
isLoading = true,
items = listOf(), items = listOf(),
filteredItems = listOf() filteredItems = listOf()
) )

View File

@ -48,6 +48,7 @@ sealed class SavedLoginsFragmentAction : Action {
* @property items Filtered (or not) list of logins to display * @property items Filtered (or not) list of logins to display
*/ */
data class SavedLoginsFragmentState( data class SavedLoginsFragmentState(
val isLoading: Boolean = false,
val items: List<SavedLoginsItem>, val items: List<SavedLoginsItem>,
val filteredItems: List<SavedLoginsItem> val filteredItems: List<SavedLoginsItem>
) : State ) : State
@ -61,14 +62,19 @@ private fun savedLoginsStateReducer(
): SavedLoginsFragmentState { ): SavedLoginsFragmentState {
return when (action) { return when (action) {
is SavedLoginsFragmentAction.UpdateLogins -> state.copy( is SavedLoginsFragmentAction.UpdateLogins -> state.copy(
isLoading = false,
items = action.list, items = action.list,
filteredItems = action.list filteredItems = action.list
) )
is SavedLoginsFragmentAction.FilterLogins -> { is SavedLoginsFragmentAction.FilterLogins -> {
if (action.newText.isNullOrBlank()) { if (action.newText.isNullOrBlank()) {
state.copy(filteredItems = state.items) state.copy(
isLoading = false,
filteredItems = state.items)
} else { } else {
state.copy(filteredItems = state.items.filter { it.url.contains(action.newText) }) state.copy(
isLoading = false,
filteredItems = state.items.filter { it.url.contains(action.newText) })
} }
} }
} }

View File

@ -14,6 +14,7 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.extensions.LayoutContainer import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.component_saved_logins.view.* import kotlinx.android.synthetic.main.component_saved_logins.view.*
import kotlinx.android.synthetic.main.component_saved_logins.view.progress_bar
import org.mozilla.fenix.R import org.mozilla.fenix.R
/** /**
@ -69,8 +70,13 @@ class SavedLoginsView(
} }
fun update(state: SavedLoginsFragmentState) { fun update(state: SavedLoginsFragmentState) {
view.saved_logins_list.isVisible = state.items.isNotEmpty() if (state.isLoading) {
view.saved_passwords_empty_view.isVisible = state.items.isEmpty() view.progress_bar.isVisible = true
} else {
view.progress_bar.isVisible = false
view.saved_logins_list.isVisible = state.items.isNotEmpty()
view.saved_passwords_empty_view.isVisible = state.items.isEmpty()
}
loginsAdapter.submitList(state.filteredItems) loginsAdapter.submitList(state.filteredItems)
} }
} }

View File

@ -4,7 +4,6 @@
package org.mozilla.fenix.settings.sitepermissions package org.mozilla.fenix.settings.sitepermissions
import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri import android.net.Uri
@ -30,7 +29,6 @@ import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.AL
import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ASK_TO_ALLOW import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ASK_TO_ALLOW
import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.BLOCKED import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.BLOCKED
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.settings.PhoneFeature import org.mozilla.fenix.settings.PhoneFeature
@ -122,7 +120,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
// TODO replace with AUTOPLAY_ALLOW_ON_WIFI when // TODO replace with AUTOPLAY_ALLOW_ON_WIFI when
// https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug // https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug
// makes ALLOW_ALL behave as ALLOW_ON_WIFI // makes ALLOW_ALL behave as ALLOW_ON_WIFI
saveActionInSettings(it.context, AUTOPLAY_ALLOW_ALL) saveActionInSettings(AUTOPLAY_ALLOW_ALL)
} }
// TODO replace with AUTOPLAY_ALLOW_ON_WIFI when // TODO replace with AUTOPLAY_ALLOW_ON_WIFI when
// https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug // https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug
@ -144,7 +142,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
visibility = View.VISIBLE visibility = View.VISIBLE
text = getString(R.string.preference_option_autoplay_block_audio2) text = getString(R.string.preference_option_autoplay_block_audio2)
setOnClickListener { setOnClickListener {
saveActionInSettings(it.context, AUTOPLAY_BLOCK_AUDIBLE) saveActionInSettings(AUTOPLAY_BLOCK_AUDIBLE)
} }
restoreState(AUTOPLAY_BLOCK_AUDIBLE) restoreState(AUTOPLAY_BLOCK_AUDIBLE)
} else { } else {
@ -162,7 +160,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
getString(R.string.phone_feature_recommended) getString(R.string.phone_feature_recommended)
) )
setOnClickListener { setOnClickListener {
saveActionInSettings(it.context, AUTOPLAY_BLOCK_ALL) saveActionInSettings(AUTOPLAY_BLOCK_ALL)
} }
restoreState(AUTOPLAY_BLOCK_ALL) restoreState(AUTOPLAY_BLOCK_ALL)
} else { } else {
@ -195,19 +193,18 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
* See [Settings.setAutoplayUserSetting] kdoc for an explanation of why this cannot follow the * See [Settings.setAutoplayUserSetting] kdoc for an explanation of why this cannot follow the
* same code path as other permissions. * same code path as other permissions.
*/ */
private fun saveActionInSettings(context: Context, autoplaySetting: Int) { private fun saveActionInSettings(autoplaySetting: Int) {
settings.setAutoplayUserSetting(autoplaySetting) settings.setAutoplayUserSetting(autoplaySetting)
val (audible, inaudible) = when (autoplaySetting) { val (audible, inaudible) = when (autoplaySetting) {
AUTOPLAY_ALLOW_ALL -> ALLOWED to ALLOWED AUTOPLAY_ALLOW_ALL,
AUTOPLAY_ALLOW_ON_WIFI -> { AUTOPLAY_ALLOW_ON_WIFI -> {
context.components.wifiIntegration.addWifiConnectedListener() settings.setAutoplayUserSetting(AUTOPLAY_ALLOW_ON_WIFI)
return return
} }
AUTOPLAY_BLOCK_AUDIBLE -> BLOCKED to ALLOWED AUTOPLAY_BLOCK_AUDIBLE -> BLOCKED to ALLOWED
AUTOPLAY_BLOCK_ALL -> BLOCKED to BLOCKED AUTOPLAY_BLOCK_ALL -> BLOCKED to BLOCKED
else -> return else -> return
} }
context.components.wifiIntegration.removeWifiConnectedListener()
settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_AUDIBLE, audible) settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_AUDIBLE, audible)
settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_INAUDIBLE, inaudible) settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_INAUDIBLE, inaudible)
} }

View File

@ -187,6 +187,8 @@ class Settings private constructor(
(trackingProtectionOnboardingCount < trackingProtectionOnboardingMaximumCount && (trackingProtectionOnboardingCount < trackingProtectionOnboardingMaximumCount &&
!trackingProtectionOnboardingShownThisSession) !trackingProtectionOnboardingShownThisSession)
var showSecretDebugMenuThisSession = false
val shouldShowSecurityPinWarningSync: Boolean val shouldShowSecurityPinWarningSync: Boolean
get() = loginsSecureWarningSyncCount < showLoginsSecureWarningSyncMaxCount get() = loginsSecureWarningSyncCount < showLoginsSecureWarningSyncMaxCount
@ -597,4 +599,14 @@ class Settings private constructor(
appContext.getPreferenceKey(R.string.pref_key_open_links_in_external_app), appContext.getPreferenceKey(R.string.pref_key_open_links_in_external_app),
default = false default = false
) )
var overrideFxAServer by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_override_fxa_server),
default = ""
)
var overrideSyncTokenServer by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_override_sync_tokenserver),
default = ""
)
} }

View File

@ -5,6 +5,7 @@
package org.mozilla.fenix.wifi package org.mozilla.fenix.wifi
import mozilla.components.feature.sitepermissions.SitePermissionsRules import mozilla.components.feature.sitepermissions.SitePermissionsRules
import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.settings.PhoneFeature import org.mozilla.fenix.settings.PhoneFeature
import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_ALLOW_ON_WIFI import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_ALLOW_ON_WIFI
import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_BLOCK_ALL import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_BLOCK_ALL
@ -14,7 +15,10 @@ import org.mozilla.fenix.utils.Settings
* Handles implementation details of only setting up a WIFI connectivity listener if the current * Handles implementation details of only setting up a WIFI connectivity listener if the current
* user settings require it. * user settings require it.
*/ */
class WifiIntegration(private val settings: Settings, private val wifiConnectionMonitor: WifiConnectionMonitor) { class SitePermissionsWifiIntegration(
private val settings: Settings,
private val wifiConnectionMonitor: WifiConnectionMonitor
) : LifecycleAwareFeature {
/** /**
* Adds listener for autplay setting [AUTOPLAY_ALLOW_ON_WIFI]. Sets all autoplay to allowed when * Adds listener for autplay setting [AUTOPLAY_ALLOW_ON_WIFI]. Sets all autoplay to allowed when
@ -51,7 +55,7 @@ class WifiIntegration(private val settings: Settings, private val wifiConnection
// only works while WIFI is active, so we are not using AUTOPLAY_ALLOW_ON_WIFI (or this class). // only works while WIFI is active, so we are not using AUTOPLAY_ALLOW_ON_WIFI (or this class).
// Once that is fixed, [start] and [maybeAddWifiConnectedListener] will need to be called on // Once that is fixed, [start] and [maybeAddWifiConnectedListener] will need to be called on
// activity startup. // activity startup.
fun start() { wifiConnectionMonitor.start() } override fun start() { wifiConnectionMonitor.start() }
fun stop() { wifiConnectionMonitor.stop() } override fun stop() { wifiConnectionMonitor.stop() }
} }

View File

@ -1,14 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
<!-- 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 - 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/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_collection" android:id="@+id/item_collection"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:background="@drawable/collection_home_list_row_background" android:background="@drawable/collection_home_list_row_background"
android:clickable="true" android:clickable="true"
@ -22,25 +20,26 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="12dp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_tab_collection"
android:tint="@null" android:tint="@null"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_tab_collection" />
<TextView <TextView
android:id="@+id/collection_title" android:id="@+id/collection_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="24dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:ellipsize="end" android:ellipsize="end"
android:gravity="start" android:gravity="start"
android:maxLines="1" android:maxLines="1"
android:minLines="1" android:minLines="1"
android:textAppearance="@style/Header16TextStyle" android:textAppearance="@style/Header14TextStyle"
app:layout_constrainedWidth="true" app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@id/chevron" app:layout_constraintEnd_toStartOf="@id/chevron"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
@ -61,32 +60,18 @@
app:layout_constraintStart_toEndOf="@+id/collection_title" app:layout_constraintStart_toEndOf="@+id/collection_title"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/collection_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:ellipsize="end"
android:maxLines="2"
android:minLines="2"
android:textAppearance="@style/SubtitleTextStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/collection_share_button"
app:layout_constraintStart_toStartOf="@id/collection_title"
app:layout_constraintTop_toBottomOf="@id/collection_title"
tools:text="@tools:sample/lorem/random" />
<ImageButton <ImageButton
android:id="@+id/collection_share_button" android:id="@+id/collection_share_button"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/share_button_content_description" android:contentDescription="@string/share_button_content_description"
app:srcCompat="@drawable/ic_hollow_share" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/collection_icon" app:layout_constraintBottom_toBottomOf="@id/collection_icon"
app:layout_constraintEnd_toStartOf="@id/collection_overflow_button" app:layout_constraintEnd_toStartOf="@id/collection_overflow_button"
app:layout_constraintTop_toTopOf="@id/collection_icon" /> app:layout_constraintTop_toTopOf="@id/collection_icon"
app:srcCompat="@drawable/ic_hollow_share"
tools:visibility="visible" />
<ImageButton <ImageButton
android:id="@+id/collection_overflow_button" android:id="@+id/collection_overflow_button"
@ -94,10 +79,12 @@
android:layout_height="48dp" android:layout_height="48dp"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/collection_menu_button_content_description" android:contentDescription="@string/collection_menu_button_content_description"
app:srcCompat="@drawable/ic_menu" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/collection_icon" app:layout_constraintBottom_toBottomOf="@id/collection_icon"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/collection_icon" /> app:layout_constraintTop_toTopOf="@id/collection_icon"
app:srcCompat="@drawable/ic_menu"
tools:visibility="visible" />
<View <View
android:id="@+id/selected_border" android:id="@+id/selected_border"

View File

@ -8,6 +8,17 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:indeterminate="true"
android:layout_width="match_parent"
android:layout_height="8dp"
android:translationY="-3dp"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/saved_passwords_empty_view" android:id="@+id/saved_passwords_empty_view"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -109,7 +109,6 @@
android:id="@+id/divider_line" android:id="@+id/divider_line"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1.5dp" android:layout_height="1.5dp"
android:layout_marginStart="8dp"
android:background="?neutralFaded" android:background="?neutralFaded"
app:layout_constraintEnd_toEndOf="@id/fill_link_from_clipboard" app:layout_constraintEnd_toEndOf="@id/fill_link_from_clipboard"
app:layout_constraintStart_toStartOf="@id/fill_link_from_clipboard" app:layout_constraintStart_toStartOf="@id/fill_link_from_clipboard"

View File

@ -5,9 +5,9 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/tab_in_collection_item" android:id="@+id/list_item"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="56dp"
android:background="?above" android:background="?above"
android:clickable="true" android:clickable="true"
android:clipToPadding="false" android:clipToPadding="false"
@ -16,49 +16,52 @@
android:foreground="?android:attr/selectableItemBackground"> android:foreground="?android:attr/selectableItemBackground">
<ImageView <ImageView
android:id="@+id/collection_tab_icon" android:id="@+id/list_item_favicon"
android:layout_width="24dp" android:layout_width="40dp"
android:layout_height="24dp" android:layout_height="40dp"
android:layout_marginStart="16dp" android:background="@drawable/rounded_grey_corners_transparent_center"
android:layout_marginTop="23dp" android:padding="8dp"
android:layout_marginBottom="24dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_tab_collection" app:srcCompat="@drawable/ic_tab_collection"
android:tint="@null" android:tint="@null"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toBottomOf="parent"/>
<TextView <TextView
android:id="@+id/collection_tab_hostname" android:id="@+id/list_element_title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="14dp" android:layout_marginStart="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="9dp"
android:layout_marginEnd="74dp" android:layout_marginEnd="74dp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:singleLine="true"
android:minLines="1" android:textAppearance="@style/Body14TextStyle"
android:textAppearance="@style/Header12TextStyle" app:layout_constraintEnd_toStartOf="@id/list_item_action_button"
app:layout_constraintEnd_toStartOf="@id/collection_tab_close_button" app:layout_constraintStart_toEndOf="@id/list_item_favicon"
app:layout_constraintStart_toEndOf="@id/collection_tab_icon" app:layout_constraintBottom_toTopOf="@id/list_item_url"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/collection_tab_title" android:id="@+id/list_item_url"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="12dp" android:layout_marginBottom="12dp"
android:textColor="?secondaryText"
android:textSize="10sp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
android:minLines="2"
android:textAppearance="@style/Body14TextStyle"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/collection_tab_hostname" app:layout_constraintEnd_toEndOf="@id/list_element_title"
app:layout_constraintStart_toStartOf="@id/collection_tab_hostname" app:layout_constraintStart_toStartOf="@id/list_element_title"
app:layout_constraintTop_toBottomOf="@id/collection_tab_hostname" /> app:layout_constraintTop_toBottomOf="@id/list_element_title" />
<ImageButton <ImageButton
android:id="@+id/collection_tab_close_button" android:id="@+id/list_item_action_button"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:alpha="0.8" android:alpha="0.8"
@ -66,14 +69,7 @@
android:contentDescription="@string/close_tab" android:contentDescription="@string/close_tab"
app:srcCompat="@drawable/ic_close" app:srcCompat="@drawable/ic_close"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<View
android:id="@+id/divider_line"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="?neutralFaded"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1069,6 +1069,9 @@
<string name="etp_panel_off">Der Schutz für diese Website ist deaktiviert</string> <string name="etp_panel_off">Der Schutz für diese Website ist deaktiviert</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Verbesserter Schutz vor Aktivitätenverfolgung ist für diese Websites deaktiviert</string> <string name="enhanced_tracking_protection_exceptions">Verbesserter Schutz vor Aktivitätenverfolgung ist für diese Websites deaktiviert</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Rückwärts navigieren</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Ihre Rechte</string> <string name="about_your_rights">Ihre Rechte</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1038,6 +1038,9 @@
<string name="etp_panel_off">Šćit jo znjemóžnjony za toś to sedło</string> <string name="etp_panel_off">Šćit jo znjemóžnjony za toś to sedło</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Pólěpšony slědowański šćit jo znjemóžnjony za toś te sedła</string> <string name="enhanced_tracking_protection_exceptions">Pólěpšony slědowański šćit jo znjemóžnjony za toś te sedła</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Slědk nawigěrowaś</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Waše pšawa</string> <string name="about_your_rights">Waše pšawa</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -107,7 +107,7 @@
<!-- Browser menu button to put the the current page in reader mode --> <!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Reader view</string> <string name="browser_menu_read">Reader view</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">Open in app</string> <string name="browser_menu_open_app_link">Open in App</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 -->
<string name="browser_menu_read_appearance">Appearance</string> <string name="browser_menu_read_appearance">Appearance</string>
@ -1028,6 +1028,9 @@
<string name="etp_panel_off">Protections are OFF for this site</string> <string name="etp_panel_off">Protections are OFF for this site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Enhanced Tracking Protection is off for these websites</string> <string name="enhanced_tracking_protection_exceptions">Enhanced Tracking Protection is off for these websites</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Navigate back</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Your rights</string> <string name="about_your_rights">Your rights</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -106,7 +106,7 @@
<!-- Browser menu button to put the the current page in reader mode --> <!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Reader view</string> <string name="browser_menu_read">Reader view</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">Open in app</string> <string name="browser_menu_open_app_link">Open in App</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 -->
<string name="browser_menu_read_appearance">Appearance</string> <string name="browser_menu_read_appearance">Appearance</string>

View File

@ -1057,6 +1057,9 @@
<string name="etp_panel_off">Las protecciones están OFF para este sitio</string> <string name="etp_panel_off">Las protecciones están OFF para este sitio</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">La protección contra rastreo aumentada está deshabilitada para estos sitios</string> <string name="enhanced_tracking_protection_exceptions">La protección contra rastreo aumentada está deshabilitada para estos sitios</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Ir hacia atrás</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Tus derechos</string> <string name="about_your_rights">Tus derechos</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App name for private browsing mode, only the "Private" portion should be localized. -->
<string name="app_name_private_2">Firefox Preview privado</string>
<!-- App name for private browsing mode, only the "Private" portion should be localized. -->
<string name="app_name_private_3">Firefox Preview (privado)</string>
<!-- Home Fragment -->
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
<string name="content_description_menu">Más opciones</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_private_browsing_button">Habilitar navegación privada</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_disable_private_browsing_button">Deshabilitar navegación privada</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Buscar o ingresar dirección</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">No hay pestañas abiertas</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Las pestañas abiertas aparecerán aquí.</string>
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">Estás en una sesión privada</string>
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_placeholder_description">%1$s limpia tu historial de búsqueda y navegación cuando cierras la aplicación o todas las pestañas privadas. Aunque no te hace anónimo para los sitios web o proveedores de servicios de Internet,
te ayuda a mantener en privado lo que haces en línea frente a cualquier otra persona que use este dispositivo.</string>
<string name="private_browsing_common_myths">Mitos comunes sobre la navegación privada</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Eliminar sesión</string>
<!-- Private mode shortcut "contextual feature recommender" (CFR) -->
<!-- Text for the main message -->
<string name="cfr_message">Agregar un acceso directo para abrir pestañas privadas desde su pantalla de inicio.</string>
<!-- Text for the positive button -->
<string name="cfr_pos_button_text">Agregar acceso directo</string>
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">No, gracias</string>
<!-- Home screen icons - Long press shortcuts -->
<!-- Shortcut action to open new tab -->
<string name="home_screen_shortcut_open_new_tab_2">Nueva pestaña</string>
<!-- Shortcut action to open new private tab -->
<string name="home_screen_shortcut_open_new_private_tab_2">Nueva pestaña privada</string>
<!-- Browser Fragment -->
<!-- Content description (not visible, for screen readers etc.): Navigate to open tabs -->
<string name="browser_tabs_button">Abrir pestañas</string>
<!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">Atrás</string>
<!-- Content description (not visible, for screen readers etc.): Navigate forward (browsing history) -->
<string name="browser_menu_forward">Avanzar</string>
<!-- Content description (not visible, for screen readers etc.): Refresh current website -->
<string name="browser_menu_refresh">Actualizar</string>
<!-- Content description (not visible, for screen readers etc.): Stop loading current website -->
<string name="browser_menu_stop">Detener</string>
<!-- Content description (not visible, for screen readers etc.): Bookmark the current page -->
<string name="browser_menu_bookmark">Marcador</string>
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">Editar marcador</string>
<!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_add_ons">Complementos</string>
<!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">No hay complementos aquí</string>
<!-- Browser menu button that sends a user to help articles -->
<string name="browser_menu_help">Ayuda</string>
<!-- Browser menu button that sends a to a the what's new article -->
<string name="browser_menu_whats_new">Novedades</string>
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">Ajustes</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">Biblioteca</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Sitio de escritorio</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
<string name="browser_menu_add_to_homescreen">Agregar a pantalla de inicio</string>
<!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. -->
<string name="browser_menu_install_on_homescreen">Instalar</string>
<!-- Browser menu button that opens the find in page menu -->
<string name="browser_menu_find_in_page">Encontrar en página</string>
<!-- Browser menu button that creates a private tab -->
<string name="browser_menu_private_tab">Pestaña privada</string>
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">Nueva pestaña</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Guardar en colección</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">Reportar problema con el sitio</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Compartir</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
<string name="menu_share_with">Compartir con…</string>
<!-- Browser menu button shown in custom tabs that opens the current tab in Fenix
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_open_in_fenix">Abrir en %1$s</string>
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by">PATROCINADO POR %1$s</string>
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">Patrocinado por %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Vista de lectura</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Abrir en la aplicación</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
<string name="browser_menu_read_appearance">Apariencia</string>
<!-- Locale Settings Fragment -->
<!-- Content description for tick mark on selected language -->
<string name="a11y_selected_locale_content_description">Seleccionar idioma</string>
<!-- Content description for search icon -->
<string name="a11y_search_icon_content_description">Buscar</string>
<!-- Text for default locale item -->
<string name="default_locale_text">Usar el idioma del dispositivo</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="locale_search_hint">Buscar idioma</string>
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Escanear</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Atajos</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Configuración del buscador</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Buscar con</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Esta vez, buscar con:</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard -->
<string name="awesomebar_clipboard_title">Pegar enlace del portapapeles</string>
<!-- Button in the search suggestions onboarding that allows search suggestions in private sessions -->
<string name="search_suggestions_onboarding_allow_button">Permitir</string>
<!-- Button in the search suggestions onboarding that does not allow search suggestions in private sessions -->
<string name="search_suggestions_onboarding_do_not_allow_button">No compartir</string>
<!-- Search suggestion onboarding hint title text -->
<string name="search_suggestions_onboarding_title">¿Permitir sugerencias de búsqueda en sesiones privadas?</string>
<!-- Search suggestion onboarding hint description text, first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="search_suggestions_onboarding_text">%s compartirá todo lo que escribas en la barra de direcciones con tu buscador predeterminado.</string>
</resources>

View File

@ -1052,6 +1052,9 @@
<string name="etp_panel_off">Suojaukset ovat POIS PÄÄLTÄ tällä sivustolla</string> <string name="etp_panel_off">Suojaukset ovat POIS PÄÄLTÄ tällä sivustolla</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Tehostettu seurannan suojaus ei ole käytössä näillä sivustoilla</string> <string name="enhanced_tracking_protection_exceptions">Tehostettu seurannan suojaus ei ole käytössä näillä sivustoilla</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Siirry taaksepäin</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Oikeutesi</string> <string name="about_your_rights">Oikeutesi</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1071,6 +1071,9 @@
<string name="etp_panel_off">Les protections sont désactivées pour ce site</string> <string name="etp_panel_off">Les protections sont désactivées pour ce site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">La protection renforcée contre le pistage est désactivée pour ces sites web</string> <string name="enhanced_tracking_protection_exceptions">La protection renforcée contre le pistage est désactivée pour ces sites web</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Précédent</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Vos droits</string> <string name="about_your_rights">Vos droits</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1057,6 +1057,9 @@
<string name="etp_panel_off">Umi ñemoã ojepeáma ko tendápe g̃uarã</string> <string name="etp_panel_off">Umi ñemoã ojepeáma ko tendápe g̃uarã</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Ñemoã tapykuehogua oñemboguéma koã tendápe g̃uarã</string> <string name="enhanced_tracking_protection_exceptions">Ñemoã tapykuehogua oñemboguéma koã tendápe g̃uarã</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Eikundaha tapykuévo</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Nde derécho</string> <string name="about_your_rights">Nde derécho</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -71,7 +71,7 @@
<!-- Browser menu button that opens a user's library --> <!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">Biblioteka</string> <string name="browser_menu_library">Biblioteka</string>
<!-- Browser menu toggle that requests a desktop site --> <!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Web-stanica za desktop</string> <string name="browser_menu_desktop_site">Klasični prikaz</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
<string name="browser_menu_add_to_homescreen">Dodaj na početni ekran</string> <string name="browser_menu_add_to_homescreen">Dodaj na početni ekran</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. -->
@ -337,7 +337,7 @@
<!-- Header of the Turn on Sync preference view --> <!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Uključi sinkronizaciju</string> <string name="preferences_sync">Uključi sinkronizaciju</string>
<!-- Preference for pairing --> <!-- Preference for pairing -->
<string name="preferences_sync_pair">Skeniraj kod za uparivanje u desktop Firefoxu</string> <string name="preferences_sync_pair">Skeniraj kôd za uparivanje u Firefoxu za računalo</string>
<!-- Preference for account login --> <!-- Preference for account login -->
<string name="preferences_sync_sign_in">Prijavi se</string> <string name="preferences_sync_sign_in">Prijavi se</string>
<!-- Preference for reconnecting to FxA sync --> <!-- Preference for reconnecting to FxA sync -->
@ -381,7 +381,7 @@
<!-- Option in library to open Bookmarks page --> <!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">Zabilješke</string> <string name="library_bookmarks">Zabilješke</string>
<!-- Option in library to open Desktop Bookmarks root page --> <!-- Option in library to open Desktop Bookmarks root page -->
<string name="library_desktop_bookmarks_root">Desktop zabilješke</string> <string name="library_desktop_bookmarks_root">Zabilješke računala</string>
<!-- Option in library to open Desktop Bookmarks "menu" page --> <!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">Izbornik za zabilješke</string> <string name="library_desktop_bookmarks_menu">Izbornik za zabilješke</string>
<!-- Option in library to open Desktop Bookmarks "toolbar" page --> <!-- Option in library to open Desktop Bookmarks "toolbar" page -->

View File

@ -1039,6 +1039,9 @@
<string name="etp_panel_off">Škit je znjemóžnjeny za tute sydło</string> <string name="etp_panel_off">Škit je znjemóžnjeny za tute sydło</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Polěpšeny slědowanski škit je znjemóžnjeny za tute sydła</string> <string name="enhanced_tracking_protection_exceptions">Polěpšeny slědowanski škit je znjemóžnjeny za tute sydła</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Wróćo nawigować</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Waše prawa</string> <string name="about_your_rights">Waše prawa</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -948,6 +948,9 @@
<string name="etp_panel_off">ההגנות כבויות עבור אתר זה</string> <string name="etp_panel_off">ההגנות כבויות עבור אתר זה</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">הגנת מעקב מתקדמת כבויה עבור האתרים האלו</string> <string name="enhanced_tracking_protection_exceptions">הגנת מעקב מתקדמת כבויה עבור האתרים האלו</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">הזכויות שלך</string> <string name="about_your_rights">הזכויות שלך</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1082,6 +1082,9 @@
<string name="etp_panel_off">이 사이트에서 보호 꺼짐</string> <string name="etp_panel_off">이 사이트에서 보호 꺼짐</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">이 웹 사이트에 대해 향상된 추적 방지 기능이 꺼져 있습니다</string> <string name="enhanced_tracking_protection_exceptions">이 웹 사이트에 대해 향상된 추적 방지 기능이 꺼져 있습니다</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">사용자 권리</string> <string name="about_your_rights">사용자 권리</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -21,6 +21,10 @@
<!-- Private Browsing --> <!-- Private Browsing -->
<!-- Title for private session option --> <!-- Title for private session option -->
<string name="private_browsing_title">आपण खाजगी सत्रात आहात</string> <string name="private_browsing_title">आपण खाजगी सत्रात आहात</string>
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_placeholder_description">आपण अप किंवा सर्व खाजगी टॅब बंद केल्यावर आपला शोध किंवा ब्राऊझिंग इतिहास %1$s मिटवते. यामुळे आपण वापरणाऱ्या साईट किंवा इंटरनेट सेवा देणार्यांपासून आपण होत नाही,
पण आपण ऑनलाईन काय करता हे आपले डिव्हाईस वापरणाऱ्या इतरांपासून खाजगी ठेवण्यास सोपे होते.</string>
<string name="private_browsing_common_myths">खाजगी ब्राउझिंग बद्दल सामान्य समजुती</string> <string name="private_browsing_common_myths">खाजगी ब्राउझिंग बद्दल सामान्य समजुती</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">सत्र हटवा</string> <string name="private_browsing_delete_session">सत्र हटवा</string>
@ -56,7 +60,7 @@
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page --> <!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">वाचनखूण संपादीत करा</string> <string name="browser_menu_edit_bookmark">वाचनखूण संपादीत करा</string>
<!-- Browser menu button that opens the addon manager --> <!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_addon_manager">अ‍ॅड-ऑन व्यवस्थापक</string> <string name="browser_menu_add_ons">ॲड-ऑन</string>
<!-- Text displayed when there are no add-ons to be shown --> <!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">येथे अ‍ॅड-ऑन नाहीत</string> <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 -->
@ -66,7 +70,7 @@
<!-- 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 --> <!-- Browser menu button that opens a user's library -->
<string name="browser_menu_your_library">आपे ग्रंथ</string> <string name="browser_menu_library">लायब्ररी</string>
<!-- Browser menu toggle that requests a desktop site --> <!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">डेस्कटॉप साइट</string> <string name="browser_menu_desktop_site">डेस्कटॉप साइट</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
@ -80,7 +84,7 @@
<!-- 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 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">संग्रहात जतन करा</string> <string name="browser_menu_save_to_collection_2">संग्रहात जतन करा</string>
<!-- Browser menu button that opens a dialog to report issues with the current site --> <!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">साईटची त्रुटी कळवा</string> <string name="browser_menu_report_issue">साईटची त्रुटी कळवा</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 -->
@ -134,6 +138,8 @@
<string name="search_suggestions_onboarding_do_not_allow_button">परवानगी देऊ नका</string> <string name="search_suggestions_onboarding_do_not_allow_button">परवानगी देऊ नका</string>
<!-- Search suggestion onboarding hint title text --> <!-- Search suggestion onboarding hint title text -->
<string name="search_suggestions_onboarding_title">खाजगी सत्रांमध्ये शोध प्रस्तावांना परवानगी द्यायची का?</string> <string name="search_suggestions_onboarding_title">खाजगी सत्रांमध्ये शोध प्रस्तावांना परवानगी द्यायची का?</string>
<!-- Search suggestion onboarding hint description text, first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="search_suggestions_onboarding_text">पत्ता पट्टी मध्ये आपण जे काही टाईप कराल ते सर्व %s आपल्या पूर्वनिर्धारित शोध इंजिन सह शेअर करेल.</string>
<!-- Search suggestion onboarding hint Learn more link text --> <!-- Search suggestion onboarding hint Learn more link text -->
<string name="search_suggestions_onboarding_learn_more_link">अधिक जाणून घ्या</string> <string name="search_suggestions_onboarding_learn_more_link">अधिक जाणून घ्या</string>
@ -187,6 +193,8 @@
<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 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 -->
@ -199,6 +207,8 @@
<string name="preferences_theme">रंगयोजना</string> <string name="preferences_theme">रंगयोजना</string>
<!-- Preference for settings related to visual options --> <!-- Preference for settings related to visual options -->
<string name="preferences_customize">स्वेच्छेनुरूप करा</string> <string name="preferences_customize">स्वेच्छेनुरूप करा</string>
<!-- Preference description for banner about signing in -->
<string name="preferences_sign_in_description">आपल्या Firefox खात्यासह बुकमार्क, इतिहास आणि बरेच काही सिंक करा</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 खाते</string> <string name="preferences_account_default_name">Firefox खाते</string>
<!-- Preference text for account title when there was an error syncing FxA --> <!-- Preference text for account title when there was an error syncing FxA -->
@ -214,6 +224,16 @@
<!-- Preference category for developer tools --> <!-- Preference category for developer tools -->
<string name="developer_tools_category">विकासकांची साधने</string> <string name="developer_tools_category">विकासकांची साधने</string>
<!-- Preference for developers -->
<string name="preferences_remote_debugging">USB द्वारे दूरस्थ डीबगिंग</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">शोध शॉर्टकट दर्शवा</string>
<!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">शोध सूचना दाखवा</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">खाजगी सत्रांमध्ये दर्शवा</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">क्लिपबोर्ड सूचना दर्शवा</string>
<!-- Preference title for switch preference to suggest browsing history when searching --> <!-- Preference title for switch preference to suggest browsing history when searching -->
<string name="preferences_search_browsing_history">ब्राउझिंग इतिहास शोधा</string> <string name="preferences_search_browsing_history">ब्राउझिंग इतिहास शोधा</string>
<!-- Preference title for switch preference to suggest bookmarks when searching --> <!-- Preference title for switch preference to suggest bookmarks when searching -->
@ -228,6 +248,8 @@
<!-- Account Preferences --> <!-- Account Preferences -->
<!-- Preference for triggering sync --> <!-- Preference for triggering sync -->
<string name="preferences_sync_now">आत्ता सिंक करा</string> <string name="preferences_sync_now">आत्ता सिंक करा</string>
<!-- Preference category for sync -->
<string name="preferences_sync_category">काय सिंक करायचे ते निवडा</string>
<!-- Preference for syncing history --> <!-- Preference for syncing history -->
<string name="preferences_sync_history">इतिहास</string> <string name="preferences_sync_history">इतिहास</string>
<!-- Preference for syncing bookmarks --> <!-- Preference for syncing bookmarks -->
@ -239,45 +261,87 @@
<!-- Preference displays and allows changing current FxA device name --> <!-- Preference displays and allows changing current FxA device name -->
<string name="preferences_sync_device_name">डिव्हाईसचे नाव</string> <string name="preferences_sync_device_name">डिव्हाईसचे नाव</string>
<!-- Text shown when user enters empty device name -->
<string name="empty_device_name_error">डिव्हाइसचे नाव रिक्त असू शकत नाही.</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">सिंक करत आहे…</string>
<!-- Label summary indicating that sync failed. The first parameter is the date stamp showing last time it succeeded -->
<string name="sync_failed_summary">सिंक अयशस्वी. शेवटचे यश: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_failed_never_synced_summary">सिंक अयशस्वी. शेवटचे सिंक: कधीच नाही</string>
<!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced -->
<string name="sync_last_synced_summary">शेवटचे सिंक: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_never_synced_summary">शेवटचे सिंक: कधीच नाही</string>
<!-- Text for displaying the default device name.
The first parameter is the application name, the second is the device manufacturer name
and the third is the device model. -->
<string name="default_device_name">%s %s %s वर</string>
<!-- Send Tab --> <!-- Send Tab -->
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app --> <!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_name">प्राप्त टॅब</string> <string name="fxa_received_tab_channel_name">प्राप्त टॅब</string>
<!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_description">इतर Firefox डिव्हाइसमधून प्राप्त केलेल्या टॅबच्या सूचना.</string>
<!-- The body for these is the URL of the tab received --> <!-- The body for these is the URL of the tab received -->
<string name="fxa_tab_received_notification_name">टॅब प्राप्त झाला</string> <string name="fxa_tab_received_notification_name">टॅब प्राप्त झाला</string>
<!-- When multiple tabs have been received --> <!-- When multiple tabs have been received -->
<string name="fxa_tabs_received_notification_name">टॅब प्राप्त झाले</string> <string name="fxa_tabs_received_notification_name">टॅब प्राप्त झाले</string>
<!-- %s is the device name -->
<string name="fxa_tab_received_from_notification_name">%s कडून टॅब</string>
<!-- Advanced Preferences --> <!-- Advanced Preferences -->
<!-- Preference for tracking protection settings --> <!-- Preference for tracking protection settings -->
<string name="preferences_tracking_protection_settings">ट्रॅकिंग संरक्षण</string> <string name="preferences_tracking_protection_settings">ट्रॅकिंग संरक्षण</string>
<!-- Preference switch for tracking protection --> <!-- Preference switch for tracking protection -->
<string name="preferences_tracking_protection">ट्रॅकिंग संरक्षण</string> <string name="preferences_tracking_protection">ट्रॅकिंग संरक्षण</string>
<!-- Preference switch description for tracking protection -->
<string name="preferences_tracking_protection_description">ऑनलाइन ट्रॅक करणारी मजकूर आणि स्क्रिप्ट अवरोधित करा</string>
<!-- Preference for tracking protection exceptions --> <!-- Preference for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions">अपवाद</string> <string name="preferences_tracking_protection_exceptions">अपवाद</string>
<!-- Preference description for tracking protection exceptions --> <!-- Preference description for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions_description">या साइटसाठी ट्रॅकिंग संरक्षण बंद आहे</string> <string name="preferences_tracking_protection_exceptions_description">या साइटसाठी ट्रॅकिंग संरक्षण बंद आहे</string>
<!-- Button in Exceptions Preference to turn on tracking protection for all sites (remove all exceptions) --> <!-- Button in Exceptions Preference to turn on tracking protection for all sites (remove all exceptions) -->
<string name="preferences_tracking_protection_exceptions_turn_on_for_all">सर्व साईट साठी चालू करा</string> <string name="preferences_tracking_protection_exceptions_turn_on_for_all">सर्व साईट साठी चालू करा</string>
<!-- Text displayed when there are no exceptions -->
<string name="exceptions_empty_message_description">अपवाद आपल्याला निवडलेल्या साइटसाठी ट्रॅकिंग संरक्षण अक्षम करू देतात.</string>
<!-- 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 -->
<string name="preference_usage_data">वापर आणि तांत्रिक माहिती</string> <string name="preference_usage_data">वापर आणि तांत्रिक माहिती</string>
<!-- Preference description for usage and technical data collection -->
<string name="preferences_usage_data_description">आम्ही %1$s उत्तमोत्तम बनवण्यासाठी ब्राऊझरची कार्यक्षमता, वापर, हार्डवेअर आणि सानुकूलन माहिती Mozilla सोबत शेअर करते</string>
<!-- Preference switch for marketing data collection --> <!-- Preference switch for marketing data collection -->
<string name="preferences_marketing_data">विपणनाची माहिती</string> <string name="preferences_marketing_data">विपणनाची माहिती</string>
<!-- Preference description for marketing data collection, parameter is the app name (e.g. Firefox) -->
<string name="preferences_marketing_data_description">आपण %1$s मधील कोणती वैशिष्ठ्ये वापरता याची माहिती आमचे मोबाईल मार्केटर Leanplum यांच्यासोबत शेअर करते.</string>
<!-- Title for experiments preferences --> <!-- Title for experiments preferences -->
<string name="preference_experiments">प्रयोग</string> <string name="preference_experiments">प्रयोग</string>
<!-- Summary for experiments preferences --> <!-- Summary for experiments preferences -->
<string name="preference_experiments_summary">Mozilla ला प्रायोगिक वैशिष्ट्ये स्थापित करण्यासाठी आणि माहिती गोळा करण्यासाठी अनुमती देते</string> <string name="preference_experiments_summary">Mozilla ला प्रायोगिक वैशिष्ट्ये स्थापित करण्यासाठी आणि माहिती गोळा करण्यासाठी अनुमती देते</string>
<!-- Preference switch for crash reporter -->
<string name="preferences_crash_reporter">क्रॅश अहवाल देणारा</string>
<!-- 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) --> <!-- 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> <string name="preferences_fenix_health_report">%s आरोग्य अहवाल</string>
<!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view -->
<string name="preferences_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 -->
<string name="preferences_sync_sign_in_to_reconnect">पुन्हा जोडण्यासाठी साइन इन करा</string>
<!-- Preference for removing FxA account --> <!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">खाते काढून टाका</string> <string name="preferences_sync_remove_account">खाते काढून टाका</string>
@ -300,6 +364,8 @@
<string name="preference_light_theme">फिकट</string> <string name="preference_light_theme">फिकट</string>
<!-- 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 --> <!-- Preference for using following device theme -->
<string name="preference_follow_device_theme">डिव्हाइस थीमचे अनुसरण करा</string> <string name="preference_follow_device_theme">डिव्हाइस थीमचे अनुसरण करा</string>
@ -308,10 +374,18 @@
<string name="library_sessions">सत्रे</string> <string name="library_sessions">सत्रे</string>
<!-- Option in Library to open Screenshots page --> <!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">स्क्रीनशॉट</string> <string name="library_screenshots">स्क्रीनशॉट</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">डाउनलोड</string>
<!-- Option in library to open Bookmarks page --> <!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">वाचनखुणा</string> <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 --> <!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">वाचनखुणा मेनू</string> <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 --> <!-- Option in Library to open History page -->
<string name="library_history">इतिहास</string> <string name="library_history">इतिहास</string>
<!-- Option in Library to open Reading List --> <!-- Option in Library to open Reading List -->
@ -320,6 +394,10 @@
<string name="library_search">शोधा</string> <string name="library_search">शोधा</string>
<!-- Library Page Title --> <!-- Library Page Title -->
<string name="library_title">लायब्ररी</string> <string name="library_title">लायब्ररी</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" --> <!-- Content description (not visible, for screen readers etc.): "Close button for library settings" -->
<string name="content_description_close_button">बंद करा</string> <string name="content_description_close_button">बंद करा</string>
@ -341,12 +419,20 @@
<string name="open_tabs_menu">टॅबचा मेनू उघडा</string> <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>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">टॅब शेअर करा</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_collection">संग्रहात जतन करा</string> <string name="tabs_menu_save_to_collection">संग्रहात जतन करा</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 --> <!-- Button in the current session menu. Deletes the session when pressed -->
<string name="current_session_delete">नष्ट करा</string> <string name="current_session_delete">नष्ट करा</string>
<!-- Button in the current session menu. Saves the session when pressed --> <!-- Button in the current session menu. Saves the session when pressed -->
<string name="current_session_save">जतन करा</string> <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 --> <!-- Content description (not visible, for screen readers etc.): Title icon for current session menu -->
<string name="current_session_image">चालू सत्राचे चित्र</string> <string name="current_session_image">चालू सत्राचे चित्र</string>
<!-- Button to save the current set of tabs into a collection --> <!-- Button to save the current set of tabs into a collection -->
@ -390,6 +476,8 @@
<!-- Crashes --> <!-- Crashes -->
<!-- Title text displayed on the tab crash page. This first parameter is the name of the application (For example: Fenix) --> <!-- Title text displayed on the tab crash page. This first parameter is the name of the application (For example: Fenix) -->
<string name="tab_crash_title_2">क्षमस्व. %1$s ते पृष्ठ लोड करू शकत नाही.</string> <string name="tab_crash_title_2">क्षमस्व. %1$s ते पृष्ठ लोड करू शकत नाही.</string>
<!-- Description text displayed on the tab crash page -->
<string name="tab_crash_description">आपण खाली हा टॅब पुनर्संचयित किंवा बंद करण्याचा प्रयत्न करू शकता.</string>
<!-- Send crash report checkbox text on the tab crash page --> <!-- Send crash report checkbox text on the tab crash page -->
<string name="tab_crash_send_report">Mozilla ला क्रॅश अहवाल पाठवा</string> <string name="tab_crash_send_report">Mozilla ला क्रॅश अहवाल पाठवा</string>
<!-- Close tab button text on the tab crash page --> <!-- Close tab button text on the tab crash page -->
@ -400,12 +488,20 @@
<!-- Content Description for session item menu button --> <!-- Content Description for session item menu button -->
<string name="content_description_session_menu">सत्र पर्याय</string> <string name="content_description_session_menu">सत्र पर्याय</string>
<!-- Content Description for session item share button -->
<string name="content_description_session_share">सत्र शेअर करा</string>
<!-- Bookmarks -->
<!-- Content description for bookmarks library menu -->
<string name="bookmark_menu_content_description">वाचनखूणा मेनू</string>
<!-- Screen title for editing bookmarks --> <!-- Screen title for editing bookmarks -->
<string name="bookmark_edit">वाचनखूण संपादीत करा</string> <string name="bookmark_edit">वाचनखूण संपादीत करा</string>
<!-- Screen title for selecting a bookmarks folder --> <!-- Screen title for selecting a bookmarks folder -->
<string name="bookmark_select_folder">फोल्डर निवडा</string> <string name="bookmark_select_folder">फोल्डर निवडा</string>
<!-- Screen title for adding a bookmarks folder --> <!-- Screen title for adding a bookmarks folder -->
<string name="bookmark_add_folder">फोल्डर जोडा</string> <string name="bookmark_add_folder">फोल्डर जोडा</string>
<!-- deprecated: Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_created_snackbar">वाचनखुण बनवली.</string>
<!-- Snackbar title shown after a bookmark has been created. --> <!-- Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_saved_snackbar">वाचनखुण जतन केली!</string> <string name="bookmark_saved_snackbar">वाचनखुण जतन केली!</string>
<!-- Snackbar edit button shown after a bookmark has been created. --> <!-- Snackbar edit button shown after a bookmark has been created. -->
@ -433,6 +529,8 @@
<string name="edit_bookmark_fragment_title">वाचनखूण संपादीत करा</string> <string name="edit_bookmark_fragment_title">वाचनखूण संपादीत करा</string>
<!-- Bookmark folder editing screen title --> <!-- Bookmark folder editing screen title -->
<string name="edit_bookmark_folder_fragment_title">फोल्डर संपादित करा</string> <string name="edit_bookmark_folder_fragment_title">फोल्डर संपादित करा</string>
<!-- Bookmark sign in button message -->
<string name="bookmark_sign_in_button">सिंक केलेल्या वाचनखुणा पाहण्यासाठी साइन इन करा</string>
<!-- Bookmark URL editing field label --> <!-- Bookmark URL editing field label -->
<string name="bookmark_url_label">URL</string> <string name="bookmark_url_label">URL</string>
<!-- Bookmark FOLDER editing field label --> <!-- Bookmark FOLDER editing field label -->
@ -464,6 +562,10 @@
<string name="permissions_header">परवानग्या</string> <string name="permissions_header">परवानग्या</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">सेटिंग मध्ये जा</string> <string name="phone_feature_go_to_settings">सेटिंग मध्ये जा</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>
<!-- Label that indicates that this option it the recommended one --> <!-- Label that indicates that this option it the recommended one -->
<string name="phone_feature_recommended">शिफारसीय</string> <string name="phone_feature_recommended">शिफारसीय</string>
<!-- button that allows editing site permissions settings --> <!-- button that allows editing site permissions settings -->
@ -499,18 +601,8 @@
<!-- Summary of tracking protection preference if tracking protection is set to off --> <!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">बंद</string> <string name="tracking_protection_off">बंद</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked">व्हिडिओ आणि ऑडिओ अवरोधित</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed">व्हिडिओ आणि ऑडिओला परवानगी आहे</string>
<!-- Label that indicates that all video and audio autoplay is allowed --> <!-- Label that indicates that all video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed2">ऑडिओ आणि व्हिडिओला परवानगी द्या</string> <string name="preference_option_autoplay_allowed2">ऑडिओ आणि व्हिडिओला परवानगी द्या</string>
<!-- Label that indicates that video and audio autoplay is only allowed over WIFI -->
<string name="preference_option_autoplay_allowed_wifi_only">केवळ Wi-Fi वर ऑडिओ आणि व्हिडिओला अनुमती द्या</string>
<!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked -->
<string name="preference_option_autoplay_block_audio">ऑडिओ अवरोधित करा</string>
<!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked2">व्हिडिओ आणि ऑडिओ अवरोधित करा</string>
<!-- Summary of delete browsing data on quit preference if it is set to on --> <!-- Summary of delete browsing data on quit preference if it is set to on -->
<string name="delete_browsing_data_quit_on">सुरू</string> <string name="delete_browsing_data_quit_on">सुरू</string>
<!-- Summary of delete browsing data on quit preference if it is set to off --> <!-- Summary of delete browsing data on quit preference if it is set to off -->
@ -606,6 +698,8 @@
<!-- Text shown in snackbar when user closes all private tabs --> <!-- Text shown in snackbar when user closes all private tabs -->
<string name="snackbar_private_tabs_closed">खाजगी टॅब बंद केले</string> <string name="snackbar_private_tabs_closed">खाजगी टॅब बंद केले</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 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 -->
@ -705,4 +799,162 @@
<!-- text for the theme picker onboarding card header --> <!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">आपली थीम निवडा</string> <string name="onboarding_theme_picker_header">आपली थीम निवडा</string>
</resources> <!-- text for the theme picker onboarding card description -->
<string name="onboarding_theme_picker_description1">गडद रंगसंगती वापरून थोडी बॅटरी आणि तुमची दृष्टी वाचवा.</string>
<!-- Automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_title">स्वयंचलित</string>
<!-- Theme setting for dark mode -->
<string name="onboarding_theme_dark_title">गडद रंगसंगती</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 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>
<!-- Instructions on how to access pairing -->
<string name="sign_in_instructions"><![CDATA[आपल्या संगणकावर Firefox उघडा आणि <b>https://firefox.com/pair</b> वर जा]]></string>
<!-- Text shown for sign in pairing when ready -->
<string name="sign_in_ready_for_scan">स्कॅन करण्यास सज्ज</string>
<!-- Text shown for settings option for sign with email -->
<string name="sign_in_with_email">त्याऐवजी ईमेल वापरा</string>
<!-- Option to continue signing out of account shown in confirmation dialog to sign out of account -->
<string name="sign_out_disconnect">जोडणी तोडा</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">रद्द करा</string>
<!-- Enhanced Tracking Protection -->
<!-- Link displayed in enhanced tracking protection panel to access tracking protection settings -->
<string name="etp_settings">संरक्षण सेटिंग</string>
<!-- Preference title for enhanced tracking protection settings -->
<string name="preference_enhanced_tracking_protection">वर्धित ट्रॅकिंग संरक्षण</string>
<!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">पाठलाग करून न घेता ब्राउझ करा</string>
<!-- Text displayed that links to website about enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_learn_more">अधिक जाणा</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard_option">प्रमाणित</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">प्रमाणित (सुचवलेले)</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">काटेकोर</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
<!-- Preference for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies">कुकीज</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_2">भेट न दिलेल्या संकेतस्थळांवरील कुकीज</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_1">सर्व टॅब मध्ये</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_2">फक्त गोपनीय टॅब मध्ये</string>
<string name="enhanced_tracking_protection_blocked">अवरोधित</string>
<!-- Header for categories that are being not being blocked by current Enhanced Tracking Protection settings -->
<string name="enhanced_tracking_protection_allowed">अनुमती दिलेले</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">या संकेतस्थळासाठी संरक्षण चालू आहे</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">आपले हक्क</string>
<!-- About page link text to open what's new link -->
<string name="about_whats_new">%s मध्ये नवीन काय आहे</string>
<!-- About page link text to open support link -->
<string name="about_support">मदत</string>
<!-- About page link text to open privacy notice link -->
<string name="about_privacy_notice">गोपनीयता सूचना</string>
<!-- About page link text to open know your rights link -->
<string name="about_know_your_rights">आपले हक्क जाणा</string>
<!-- About page link text to open licensing information link -->
<string name="about_licensing_information">अनुज्ञप्तीची माहिती</string>
<!-- Browser long press popup menu -->
<!-- Copy the current url -->
<string name="browser_toolbar_long_press_popup_copy">प्रत बनवा</string>
<!-- Paste & go the text in the clipboard. '&amp;' is replaced with the ampersand symbol: & -->
<string name="browser_toolbar_long_press_popup_paste_and_go">चिकटवा व जा</string>
<!-- Paste the text in the clipboard -->
<string name="browser_toolbar_long_press_popup_paste">चिकटवा</string>
<!-- Title text for the Add To Homescreen dialog -->
<string name="add_to_homescreen_title">मुख्य पटलावर जोडा</string>
<!-- Cancel button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_cancel">रद्द करा</string>
<!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">जोडा</string>
<!-- Preference option for asking to save passwords in Fenix -->
<string name="preferences_passwords_save_logins_ask_to_save">जतन करण्याबद्दल विचारा</string>
<!-- Preference option for never saving passwords in Fenix -->
<string name="preferences_passwords_save_logins_never_save">कधीही जतन करू नका</string>
<!-- Preference for autofilling saved logins in Fenix -->
<string name="preferences_passwords_autofill">स्वयंचलितपणे भरा</string>
<!-- Syncing saved logins in Fenix is on -->
<string name="preferences_passwords_sync_logins_on">सुरू</string>
<!-- Syncing saved logins in Fenix is off -->
<string name="preferences_passwords_sync_logins_off">बंद करा</string>
<!-- Syncing saved logins in Fenix needs reconnect to sync -->
<string name="preferences_passwords_sync_logins_reconnect">पुनर्जोडणी करा</string>
<!-- Preference to access list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions">अपवाद</string>
<!-- Option to sort logins list A-Z, alphabetically -->
<string name="preferences_passwords_saved_logins_alphabetically">वर्णक्रमानुसार</string>
<!-- Option to sort logins list by most recently used -->
<string name="preferences_passwords_saved_logins_recently_used">अलीकडे वापरलेले</string>
<!-- The header for the site that a login is for -->
<string name="preferences_passwords_saved_logins_site">संकेतस्थळ</string>
<!-- The header for the username for a login -->
<string name="preferences_passwords_saved_logins_username">वापरकर्तानाव</string>
<!-- The header for the password for a login -->
<string name="preferences_passwords_saved_logins_password">पासवर्ड</string>
<!-- Message displayed in security prompt to reenter a secret pin to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin">पिन पुन्हा प्रविष्ट करा</string>
<!-- Message displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning">ही जोडणी सुरक्षित नाही. येथे प्रविष्ट केलेल्या लॉगिनचा गैरवापर होऊ शकतो.</string>
<!-- Learn more link that will link to a page with more information displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning_learn_more">अधिक जाणा</string>
<!-- Positive confirmation that Fenix should save the new or updated login -->
<string name="logins_doorhanger_save_confirmation">जतन करा</string>
<!-- Negative confirmation that Fenix should not save the new or updated login -->
<string name="logins_doorhanger_save_dont_save">जतन करू नका</string>
<!-- Negative button to ignore warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_later">नंतर</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 menu button to edit a search engine -->
<string name="search_engine_edit">संपादित करा</string>
<!-- Text for the menu button to delete a search engine -->
<string name="search_engine_delete">काढून टाका</string>
<!-- Text for the button to create a custom search engine on the Add search engine screen -->
<string name="search_add_custom_engine_label_other">इतर</string>
<!-- Placeholder text shown in the Search Engine Name TextField before a user enters text -->
<string name="search_add_custom_engine_name_hint">नाव</string>
<!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">अधिक जाणा</string>
<!-- Text on the disabled button while in progress. Placeholder replaced with app name -->
<string name="migration_updating_app_button_text">%s अद्ययावत करत आहोत…</string>
<!-- Text on the enabled button. Placeholder replaced with app name-->
<string name="migration_update_app_button">%s सुरु करा</string>
<!-- Accessibility description text for a completed migration item -->
<string name="migration_icon_description">स्थित्यंतर पूर्ण</string>
<!--Text on list of migrated items (e.g. Settings, History, etc.)-->
<string name="migration_text_passwords">पासवर्ड</string>
<!-- Heading for the instructions to allow a permission -->
<string name="phone_feature_blocked_intro">अनुमती देण्यासाठी:</string>
<!-- Label that indicates a site is using a secure connection -->
<string name="quick_settings_sheet_secure_connection">सुरक्षित जोडणी</string>
<!-- Label that indicates a site is using a insecure connection -->
<string name="quick_settings_sheet_insecure_connection">असुरक्षित जोडणी</string>
<!-- text shown before the issuer name to indicate who its verified by, parameter is the name of
the certificate authority that verified the ticket-->
<string name="certificate_info_verified_by">%1$s : द्वारे सत्यापित</string>
<!-- Login overflow menu delete button -->
<string name="login_menu_delete_button">काढून टाका</string>
<!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">काढून टाका</string>
</resources>

View File

@ -67,7 +67,7 @@
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page --> <!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">ਬੁੱਕਮਾਰਕ ਸੋਧੋ</string> <string name="browser_menu_edit_bookmark">ਬੁੱਕਮਾਰਕ ਸੋਧੋ</string>
<!-- Browser menu button that opens the addon manager --> <!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_addon_manager">ਐਡ-ਆਨ ਮੈਨੇਜਰ</string> <string name="browser_menu_add_ons">ਐਡ-ਆਨ</string>
<!-- Text displayed when there are no add-ons to be shown --> <!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">ਕੋਈ ਐਡ-ਆਨ ਨਹੀਂ ਹੈ</string> <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 -->
@ -77,7 +77,7 @@
<!-- 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 --> <!-- Browser menu button that opens a user's library -->
<string name="browser_menu_your_library">ਤੁਹਾਡੀ ਲਾਇਬਰੇਰੀ</string> <string name="browser_menu_library">ਲਾਇਬਰੇਰੀ</string>
<!-- Browser menu toggle that requests a desktop site --> <!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">ਡੈਸਕਟਾਪ ਸਾਈਟ</string> <string name="browser_menu_desktop_site">ਡੈਸਕਟਾਪ ਸਾਈਟ</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
@ -90,9 +90,9 @@
<string name="browser_menu_private_tab">ਪ੍ਰਾਈਵੇਟ ਟੈਬ</string> <string name="browser_menu_private_tab">ਪ੍ਰਾਈਵੇਟ ਟੈਬ</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 that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection">ਭੰਡਾਰ ‘ਚ ਸੰਭਾਲੋ</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">ਭੰਡਾਰ ‘ਚ ਸੰਭਾਲੋ</string>
<!-- Browser menu button that opens a dialog to report issues with the current site --> <!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">ਸਾਈਟ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ</string> <string name="browser_menu_report_issue">ਸਾਈਟ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ</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 -->
@ -613,19 +613,12 @@
<!-- Summary of tracking protection preference if tracking protection is set to off --> <!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">ਬੰਦ</string> <string name="tracking_protection_off">ਬੰਦ</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked">ਵਿਡੀਓ ਤੇ ਆਡੀਓ ‘ਤੇ ਪਾਬੰਦੀ ਲਾਈ</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed">ਵਿਡੀਓ ਅਤੇ ਆਡੀਓ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</string>
<!-- Label that indicates that all video and audio autoplay is allowed --> <!-- Label that indicates that all video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed2">ਆਡੀਓ ਅਤੇ ਵੀਡਿਓ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string> <string name="preference_option_autoplay_allowed2">ਆਡੀਓ ਅਤੇ ਵੀਡਿਓ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>
<!-- Label that indicates that video and audio autoplay is only allowed over WIFI -->
<string name="preference_option_autoplay_allowed_wifi_only">ਸਿਰਫ਼ Wi-Fi ਉੱਤੇ ਆਡੀਓ ਤੇ ਵੀਡਿਡ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>
<!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked --> <!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked -->
<string name="preference_option_autoplay_block_audio">ਆਡੀਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string> <string name="preference_option_autoplay_block_audio2">ਸਿਰਫ਼ ਆਡੀਓ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<!-- Label that indicates that all video and audio autoplay is blocked --> <!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked2">ਵੀਡਿਓ ਅਤੇ ਆਡੀਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string> <string name="preference_option_autoplay_blocked3">ਆਡੀਓ ਅਤੇ ਵੀਡਿਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<!-- Summary of delete browsing data on quit preference if it is set to on --> <!-- Summary of delete browsing data on quit preference if it is set to on -->
<string name="delete_browsing_data_quit_on">ਚਾਲੂ</string> <string name="delete_browsing_data_quit_on">ਚਾਲੂ</string>
<!-- Summary of delete browsing data on quit preference if it is set to off --> <!-- Summary of delete browsing data on quit preference if it is set to off -->
@ -1054,6 +1047,9 @@
<string name="etp_panel_off">ਇਸ ਸਾਈਟ ਲਈ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string> <string name="etp_panel_off">ਇਸ ਸਾਈਟ ਲਈ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">ਇਹਨਾਂ ਵੈੱਬਸਾਈਟਾਂ ਲਈ ਵਧੇਰੇ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string> <string name="enhanced_tracking_protection_exceptions">ਇਹਨਾਂ ਵੈੱਬਸਾਈਟਾਂ ਲਈ ਵਧੇਰੇ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">ਤੁਹਾਡੇ ਹੱਕ</string> <string name="about_your_rights">ਤੁਹਾਡੇ ਹੱਕ</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1039,6 +1039,9 @@
<string name="etp_panel_off">As proteções estão DESATIVADAS neste site</string> <string name="etp_panel_off">As proteções estão DESATIVADAS neste site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">A proteção aprimorada contra rastreamento está desativada nesses sites</string> <string name="enhanced_tracking_protection_exceptions">A proteção aprimorada contra rastreamento está desativada nesses sites</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Voltar à página anterior</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Seus direitos</string> <string name="about_your_rights">Seus direitos</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1054,6 +1054,9 @@
<string name="etp_panel_off">Skydd är AV för den här webbplatsen</string> <string name="etp_panel_off">Skydd är AV för den här webbplatsen</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Förbättrat spårningsskydd är avstängt för dessa webbplatser</string> <string name="enhanced_tracking_protection_exceptions">Förbättrat spårningsskydd är avstängt för dessa webbplatser</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Navigera bakåt</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Dina rättigheter</string> <string name="about_your_rights">Dina rättigheter</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1032,6 +1032,9 @@
<string name="etp_panel_off">Bu sitede korumalar KAPALI</string> <string name="etp_panel_off">Bu sitede korumalar KAPALI</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Aşağıdaki sitelerde gelişmiş izlenme koruması kapatıldı</string> <string name="enhanced_tracking_protection_exceptions">Aşağıdaki sitelerde gelişmiş izlenme koruması kapatıldı</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Geri git</string>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Haklarınız</string> <string name="about_your_rights">Haklarınız</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1052,6 +1052,9 @@
<string name="etp_panel_off">Захист на цьому сайті вимкнено</string> <string name="etp_panel_off">Захист на цьому сайті вимкнено</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Розширений захист від стеження вимкнено для цих вебсайтів</string> <string name="enhanced_tracking_protection_exceptions">Розширений захист від стеження вимкнено для цих вебсайтів</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">Ваші права</string> <string name="about_your_rights">Ваші права</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1074,6 +1074,9 @@
<string name="etp_panel_off">对此网站已关闭保护</string> <string name="etp_panel_off">对此网站已关闭保护</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">对下列网站已关闭增强型跟踪保护</string> <string name="enhanced_tracking_protection_exceptions">对下列网站已关闭增强型跟踪保护</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">您的权利</string> <string name="about_your_rights">您的权利</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -1068,6 +1068,9 @@
<string name="etp_panel_off">已關閉此網站的追蹤保護</string> <string name="etp_panel_off">已關閉此網站的追蹤保護</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off --> <!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">針對下列網站關閉加強型追蹤保護</string> <string name="enhanced_tracking_protection_exceptions">針對下列網站關閉加強型追蹤保護</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>
<!-- About page Your rights link text --> <!-- About page Your rights link text -->
<string name="about_your_rights">您的權利</string> <string name="about_your_rights">您的權利</string>
<!-- About page link text to open open source licenses screen --> <!-- About page link text to open open source licenses screen -->

View File

@ -38,6 +38,8 @@
<string name="pref_key_account" translatable="false">pref_key_account</string> <string name="pref_key_account" translatable="false">pref_key_account</string>
<string name="pref_key_sign_in" translatable="false">pref_key_sign_in</string> <string name="pref_key_sign_in" translatable="false">pref_key_sign_in</string>
<string name="pref_key_account_auth_error" translatable="false">pref_key_account_auth_error</string> <string name="pref_key_account_auth_error" translatable="false">pref_key_account_auth_error</string>
<string name="pref_key_override_fxa_server" translatable="false">pref_key_override_fxa_server</string>
<string name="pref_key_override_sync_tokenserver" translatable="false">pref_key_override_sync_tokenserver</string>
<string name="pref_key_private_mode" translatable="false">pref_key_private_mode</string> <string name="pref_key_private_mode" translatable="false">pref_key_private_mode</string>
<string name="pref_key_customize" translatable="false">pref_key_customize</string> <string name="pref_key_customize" translatable="false">pref_key_customize</string>
<string name="pref_key_toolbar" translatable="false">pref_key_toolbar</string> <string name="pref_key_toolbar" translatable="false">pref_key_toolbar</string>

View File

@ -202,6 +202,12 @@
<string name="preferences_add_private_browsing_shortcut">Add private browsing shortcut</string> <string name="preferences_add_private_browsing_shortcut">Add private browsing shortcut</string>
<!-- Preference for accessibility --> <!-- Preference for accessibility -->
<string name="preferences_accessibility">Accessibility</string> <string name="preferences_accessibility">Accessibility</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Custom Firefox Account server</string>
<!-- Preference to override the Sync token server -->
<string name="preferences_override_sync_tokenserver">Custom Sync server</string>
<!-- Toast shown after updating the FxA/Sync server override preferences -->
<string name="toast_override_fxa_sync_server_done">Firefox Account/Sync server modified. Quitting the application to apply changes…</string>
<!-- Preference category for account information --> <!-- Preference category for account information -->
<string name="preferences_category_account">Account</string> <string name="preferences_category_account">Account</string>
<!-- Preference shown on banner to sign into account --> <!-- Preference shown on banner to sign into account -->
@ -1062,6 +1068,10 @@
<string name="about_licensing_information">Licensing information</string> <string name="about_licensing_information">Licensing information</string>
<!-- About page link text to open a screen with libraries that are used --> <!-- About page link text to open a screen with libraries that are used -->
<string name="about_other_open_source_libraries">Libraries that we use</string> <string name="about_other_open_source_libraries">Libraries that we use</string>
<!-- Toast shown to the user when they are activating the secret dev menu
The first parameter is number of long clicks left to enable the menu -->
<string name="about_debug_menu_toast_progress">Debug menu: %1$d click(s) left to enable</string>
<string name="about_debug_menu_toast_done">Debug menu enabled</string>
<!-- Content description of the tab counter toolbar button when one tab is open --> <!-- Content description of the tab counter toolbar button when one tab is open -->
<string name="tab_counter_content_description_one_tab">1 tab</string> <string name="tab_counter_content_description_one_tab">1 tab</string>

View File

@ -29,6 +29,20 @@
android:key="@string/pref_key_account_auth_error"/> android:key="@string/pref_key_account_auth_error"/>
</androidx.preference.PreferenceCategory> </androidx.preference.PreferenceCategory>
<androidx.preference.EditTextPreference
android:key="@string/pref_key_override_fxa_server"
android:title="@string/preferences_override_fxa_server"
android:inputType="textUri"
app:iconSpaceReserved="false"
app:isPreferenceVisible="false"/>
<androidx.preference.EditTextPreference
android:key="@string/pref_key_override_sync_tokenserver"
android:title="@string/preferences_override_sync_tokenserver"
android:inputType="textUri"
app:iconSpaceReserved="false"
app:isPreferenceVisible="false"/>
<androidx.preference.PreferenceCategory <androidx.preference.PreferenceCategory
android:title="@string/preferences_category_general" android:title="@string/preferences_category_general"
app:iconSpaceReserved="false"> app:iconSpaceReserved="false">
@ -103,13 +117,6 @@
android:key="@string/pref_key_open_links_in_external_app" android:key="@string/pref_key_open_links_in_external_app"
android:title="@string/preferences_open_links_in_apps" /> android:title="@string/preferences_open_links_in_apps" />
<androidx.preference.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_info"
android:key="@string/pref_key_leakcanary"
android:title="@string/preference_leakcanary"
app:isPreferenceVisible="@bool/IS_DEBUG" />
</androidx.preference.PreferenceCategory> </androidx.preference.PreferenceCategory>
<PreferenceCategory <PreferenceCategory
@ -120,11 +127,14 @@
android:icon="@drawable/mozac_ic_extensions_black" android:icon="@drawable/mozac_ic_extensions_black"
android:key="@string/pref_key_addons" android:key="@string/pref_key_addons"
android:title="@string/preferences_addons" /> android:title="@string/preferences_addons" />
</PreferenceCategory>
<PreferenceCategory <androidx.preference.SwitchPreference
android:title="@string/developer_tools_category" android:defaultValue="false"
app:iconSpaceReserved="false"> android:icon="@drawable/ic_info"
android:key="@string/pref_key_leakcanary"
android:title="@string/preference_leakcanary"
app:isPreferenceVisible="@bool/IS_DEBUG" />
<androidx.preference.SwitchPreference <androidx.preference.SwitchPreference
android:icon="@drawable/ic_energy" android:icon="@drawable/ic_energy"
android:key="@string/pref_key_remote_debugging" android:key="@string/pref_key_remote_debugging"

View File

@ -38,20 +38,6 @@ class AboutPageAdapterTest {
) )
private val listener: AboutPageListener = mockk(relaxed = true) private val listener: AboutPageListener = mockk(relaxed = true)
@Test
fun `updateData should set the new data and call notifyDataSetChanged()`() {
val adapter = spyk(AboutPageAdapter(listener), recordPrivateCalls = true)
every { adapter.notifyDataSetChanged() } just Runs
adapter.updateData(aboutList)
// Wasn't able to test in verify block the 'adapter.aboutList' setter from the updateData method
assertThat(adapter.aboutList).isEqualTo(aboutList)
verify {
adapter.notifyDataSetChanged()
}
}
@Test @Test
fun `getItemCount on a default instantiated Adapter should return 0`() { fun `getItemCount on a default instantiated Adapter should return 0`() {
val adapter = AboutPageAdapter(listener) val adapter = AboutPageAdapter(listener)
@ -63,7 +49,7 @@ class AboutPageAdapterTest {
fun `getItemCount after updateData() call should return the correct list size`() { fun `getItemCount after updateData() call should return the correct list size`() {
val adapter = AboutPageAdapter(listener) val adapter = AboutPageAdapter(listener)
adapter.updateData(aboutList) adapter.submitList(aboutList)
assertThat(adapter.itemCount).isEqualTo(2) assertThat(adapter.itemCount).isEqualTo(2)
} }
@ -93,9 +79,9 @@ class AboutPageAdapterTest {
} returns viewHolder } returns viewHolder
every { viewHolder.bind(any()) } just Runs every { viewHolder.bind(any()) } just Runs
adapter.updateData(aboutList) adapter.submitList(aboutList)
adapter.bindViewHolder(viewHolder, 1) adapter.bindViewHolder(viewHolder, 1)
verify { viewHolder.bind(adapter.aboutList?.get(1) as AboutPageItem.Item) } verify { viewHolder.bind(aboutList[1] as AboutPageItem.Item) }
} }
} }

View File

@ -79,7 +79,7 @@ elif [[ "${device_type}" == "x86-start-test" ]]; then
elif [[ "${device_type}" == "arm-start-test" ]]; then elif [[ "${device_type}" == "arm-start-test" ]]; then
flank_template="${PATH_TEST}/flank-armeabi-v7a-start-test.yml" flank_template="${PATH_TEST}/flank-armeabi-v7a-start-test.yml"
else else
echo "NOT FOUND" echo "FAILURE: flank config file not found!"
exitcode=1 exitcode=1
fi fi
@ -95,7 +95,7 @@ function failure_check() {
echo echo
echo echo
if [[ $exitcode -ne 0 ]]; then if [[ $exitcode -ne 0 ]]; then
echo "ERROR: UI test run failed, please check above URL" echo "FAILURE: UI test run failed, please check above URL"
else else
echo "All UI test(s) have passed!" echo "All UI test(s) have passed!"
fi fi