Name and icon changes _ v121

v121
harvey186 2023-12-24 13:35:20 +01:00
parent e664137195
commit 35dc7b49a9
8 changed files with 278 additions and 205 deletions

@ -1 +1 @@
Subproject commit 89ae956b10d2bfee7dc7832ae41ae349f25ef5b9 Subproject commit 055d93282f6522a149835370b63f9f35663f0a39

View File

@ -32,7 +32,7 @@ android {
defaultConfig { defaultConfig {
applicationId "com.leos" applicationId "com.leos"
minSdk = 26 minSdkVersion config.minSdkVersion
compileSdk config.compileSdkVersion compileSdk config.compileSdkVersion
targetSdkVersion config.targetSdkVersion targetSdkVersion config.targetSdkVersion
versionCode 1 versionCode 1
@ -171,8 +171,8 @@ android {
"deepLinkScheme": deepLinkSchemeValue, "deepLinkScheme": deepLinkSchemeValue,
]) ])
// Use custom default allowed addon list // Use custom default allowed addon list
buildConfigField "String", "AMO_COLLECTION_USER", "\"16201230\"" buildConfigField "String", "AMO_COLLECTION_USER", "\"18187371\""
buildConfigField "String", "AMO_COLLECTION_NAME", "\"What-I-want-on-Fenix\"" buildConfigField "String", "AMO_COLLECTION_NAME", "\"Iceraven_Addon_Collection\""
resValue "bool", "IS_DEBUG", "true" resValue "bool", "IS_DEBUG", "true"
matchingFallbacks = ['debug'] matchingFallbacks = ['debug']
} }
@ -186,8 +186,8 @@ android {
"deepLinkScheme": deepLinkSchemeValue, "deepLinkScheme": deepLinkSchemeValue,
]) ])
// Use custom default allowed addon list // Use custom default allowed addon list
buildConfigField "String", "AMO_COLLECTION_USER", "\"16201230\"" buildConfigField "String", "AMO_COLLECTION_USER", "\"18187371\""
buildConfigField "String", "AMO_COLLECTION_NAME", "\"What-I-want-on-Fenix\"" buildConfigField "String", "AMO_COLLECTION_NAME", "\"Iceraven_Addon_Collection\""
} }
benchmark releaseTemplate >> { benchmark releaseTemplate >> {
initWith buildTypes.nightly initWith buildTypes.nightly
@ -248,6 +248,15 @@ android {
} }
bundle { bundle {
// Profiler issues require us to temporarily package native code compressed to
// match the previous APK packaging.
// https://bugzilla.mozilla.org/show_bug.cgi?id=1865634
packagingOptions {
jniLibs {
it.useLegacyPackaging = true
}
}
language { language {
// Because we have runtime language selection we will keep all strings and languages // Because we have runtime language selection we will keep all strings and languages
// in the base APKs. // in the base APKs.
@ -547,7 +556,7 @@ dependencies {
implementation ComponentsDependencies.androidx_coordinatorlayout implementation ComponentsDependencies.androidx_coordinatorlayout
implementation FenixDependencies.google_accompanist_drawablepainter implementation FenixDependencies.google_accompanist_drawablepainter
implementation ComponentsDependencies.thirdparty_sentry_latest implementation ComponentsDependencies.thirdparty_sentry
implementation project(':compose-awesomebar') implementation project(':compose-awesomebar')
implementation project(':compose-cfr') implementation project(':compose-cfr')

View File

@ -4,7 +4,9 @@
package org.mozilla.fenix.addons package org.mozilla.fenix.addons
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.fonts.FontStyle.FONT_WEIGHT_MEDIUM import android.graphics.fonts.FontStyle.FONT_WEIGHT_MEDIUM
import android.os.Build import android.os.Build
@ -13,8 +15,11 @@ import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import android.view.inputmethod.EditorInfo
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
@ -32,10 +37,10 @@ import kotlinx.coroutines.launch
import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.AddonManager
import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.AddonManagerException
import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.android.view.hideKeyboard
import mozilla.components.feature.addons.ui.AddonsManagerAdapter import mozilla.components.feature.addons.ui.AddonsManagerAdapter
import mozilla.components.feature.addons.ui.AddonsManagerAdapterDelegate import mozilla.components.feature.addons.ui.AddonsManagerAdapterDelegate
import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
@ -64,7 +69,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
private var addons: List<Addon> = emptyList() private var addons: List<Addon> = emptyList()
private var adapter: AddonsManagerAdapter? = null private var adapter: AddonsManagerAdapter? = null
private var addonImportFilePicker: ActivityResultLauncher<Intent>? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
logger.info("View created for AddonsManagementFragment") logger.info("View created for AddonsManagementFragment")
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -76,6 +81,26 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
adapter?.updateAddon(it) adapter?.updateAddon(it)
} }
} }
addonImportFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
result: ActivityResult ->
if(result.resultCode == Activity.RESULT_OK) {
result.data?.data?.let{uri ->
requireComponents.intentProcessors.addonInstallIntentProcessor.fromUri(uri)?.let{tmp ->
val ext = requireComponents.intentProcessors.addonInstallIntentProcessor.parseExtension(tmp)
requireComponents.intentProcessors.addonInstallIntentProcessor.installExtension(
ext[0], ext[1],
onSuccess = {
val ao = Addon.newFromWebExtension(it)
runIfFragmentIsAttached {
adapter?.updateAddon(ao)
binding?.addonProgressOverlay?.overlayCardView?.visibility = View.GONE
}
}
)
}
}
}
}
} }
@ -123,7 +148,13 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
viewLifecycleOwner, Lifecycle.State.RESUMED, viewLifecycleOwner, Lifecycle.State.RESUMED,
) )
} }
private fun installFromFile() {
val intent = Intent()
.setType("application/x-xpinstall")
.setAction(Intent.ACTION_GET_CONTENT)
addonImportFilePicker!!.launch(intent)
}
private fun showAlertDialog() { private fun showAlertDialog() {
val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext()) val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext())
builder builder

View File

@ -249,7 +249,7 @@ class HomeFragment : Fragment() {
val currentWallpaperName = requireContext().settings().currentWallpaperName val currentWallpaperName = requireContext().settings().currentWallpaperName
applyWallpaper(wallpaperName = currentWallpaperName, orientationChange = false) applyWallpaper(wallpaperName = currentWallpaperName, orientationChange = false)
components.appStore.dispatch(AppAction.ModeChange(Mode.fromBrowsingMode(browsingModeManager.mode))) components.appStore.dispatch(AppAction.ModeChange(browsingModeManager.mode))
lifecycleScope.launch(IO) { lifecycleScope.launch(IO) {
if (requireContext().settings().showPocketRecommendationsFeature) { if (requireContext().settings().showPocketRecommendationsFeature) {

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.search.awesomebar
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat
@ -32,6 +33,9 @@ import mozilla.components.feature.syncedtabs.DeviceIndicators
import mozilla.components.feature.syncedtabs.SyncedTabsStorageSuggestionProvider import mozilla.components.feature.syncedtabs.SyncedTabsStorageSuggestionProvider
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.net.sameHostWithoutMobileSubdomainAs
import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl
import mozilla.components.support.ktx.kotlin.urlContainsQueryParameters
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingMode
@ -39,6 +43,7 @@ import org.mozilla.fenix.components.Components
import org.mozilla.fenix.components.Core.Companion.METADATA_HISTORY_SUGGESTION_LIMIT import org.mozilla.fenix.components.Core.Companion.METADATA_HISTORY_SUGGESTION_LIMIT
import org.mozilla.fenix.components.Core.Companion.METADATA_SHORTCUT_SUGGESTION_LIMIT import org.mozilla.fenix.components.Core.Companion.METADATA_SHORTCUT_SUGGESTION_LIMIT
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.containsQueryParameters
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.search.SearchEngineSource import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchFragmentState import org.mozilla.fenix.search.SearchFragmentState
@ -253,7 +258,7 @@ class AwesomeBarView(
} }
} }
@Suppress("ComplexMethod") @Suppress("ComplexMethod", "LongMethod")
@VisibleForTesting @VisibleForTesting
internal fun getProvidersToAdd( internal fun getProvidersToAdd(
state: SearchProviderState, state: SearchProviderState,
@ -278,25 +283,31 @@ class AwesomeBarView(
} }
if (state.showAllHistorySuggestions) { if (state.showAllHistorySuggestions) {
if (activity.settings().historyMetadataUIFeature) { providersToAdd.add(
providersToAdd.add(defaultCombinedHistoryProvider) getHistoryProvider(
} else { filter = getFilterToExcludeSponsoredResults(state),
providersToAdd.add(defaultHistoryStorageProvider) ),
} )
} }
if (state.showHistorySuggestionsForCurrentEngine) { if (state.showHistorySuggestionsForCurrentEngine) {
getHistoryProvidersForSearchEngine(state.searchEngineSource)?.let { getFilterForCurrentEngineResults(state)?.let {
providersToAdd.add(it) providersToAdd.add(getHistoryProvider(it))
} }
} }
if (state.showAllBookmarkSuggestions) { if (state.showAllBookmarkSuggestions) {
providersToAdd.add(getBookmarksProvider(state.searchEngineSource)) providersToAdd.add(
getBookmarksProvider(
filter = getFilterToExcludeSponsoredResults(state),
),
)
} }
if (state.showBookmarksSuggestionsForCurrentEngine) { if (state.showBookmarksSuggestionsForCurrentEngine) {
providersToAdd.add(getBookmarksProvider(state.searchEngineSource, true)) getFilterForCurrentEngineResults(state)?.let {
providersToAdd.add(getBookmarksProvider(it))
}
} }
if (state.showSearchSuggestions) { if (state.showSearchSuggestions) {
@ -304,19 +315,28 @@ class AwesomeBarView(
} }
if (state.showAllSyncedTabsSuggestions) { if (state.showAllSyncedTabsSuggestions) {
providersToAdd.add(getSyncedTabsProvider(state.searchEngineSource)) providersToAdd.add(
getSyncedTabsProvider(
filter = getFilterToExcludeSponsoredResults(state),
),
)
} }
if (state.showSyncedTabsSuggestionsForCurrentEngine) { if (state.showSyncedTabsSuggestionsForCurrentEngine) {
providersToAdd.add(getSyncedTabsProvider(state.searchEngineSource, true)) getFilterForCurrentEngineResults(state)?.let {
providersToAdd.add(getSyncedTabsProvider(it))
}
} }
if (activity.browsingModeManager.mode == BrowsingMode.Normal && state.showAllSessionSuggestions) { if (activity.browsingModeManager.mode == BrowsingMode.Normal && state.showAllSessionSuggestions) {
providersToAdd.add(getLocalTabsProvider(state.searchEngineSource)) // Unlike other providers, we don't exclude sponsored suggestions for open tabs.
providersToAdd.add(getLocalTabsProvider())
} }
if (activity.browsingModeManager.mode == BrowsingMode.Normal && state.showSessionSuggestionsForCurrentEngine) { if (activity.browsingModeManager.mode == BrowsingMode.Normal && state.showSessionSuggestionsForCurrentEngine) {
providersToAdd.add(getLocalTabsProvider(state.searchEngineSource, true)) getFilterForCurrentEngineResults(state)?.let {
providersToAdd.add(getLocalTabsProvider(it))
}
} }
if (state.showSponsoredSuggestions || state.showNonSponsoredSuggestions) { if (state.showSponsoredSuggestions || state.showNonSponsoredSuggestions) {
@ -338,22 +358,19 @@ class AwesomeBarView(
} }
/** /**
* Get a new history suggestion provider that will return suggestions only from the current * Get a history suggestion provider configured for this [AwesomeBarView].
* search engine's host.
* Used only for when unified search is active.
* *
* @param searchEngineSource Search engine wrapper also informing about the selection type. * @param filter Optional filter to limit the returned history suggestions.
* *
* @return A [CombinedHistorySuggestionProvider] or [HistoryStorageSuggestionProvider] depending * @return A [CombinedHistorySuggestionProvider] or [HistoryStorageSuggestionProvider] depending
* on if the history metadata feature is enabled or `null` if the current engine's host is unknown. * on if the history metadata feature is enabled.
*/ */
@VisibleForTesting @VisibleForTesting
internal fun getHistoryProvidersForSearchEngine( internal fun getHistoryProvider(
searchEngineSource: SearchEngineSource, filter: SearchResultFilter? = null,
): AwesomeBar.SuggestionProvider? { ): AwesomeBar.SuggestionProvider {
val searchEngineUriFilter = searchEngineSource.searchEngine?.resultsUrl ?: return null
return if (activity.settings().historyMetadataUIFeature) { return if (activity.settings().historyMetadataUIFeature) {
if (filter != null) {
CombinedHistorySuggestionProvider( CombinedHistorySuggestionProvider(
historyStorage = components.core.historyStorage, historyStorage = components.core.historyStorage,
historyMetadataStorage = components.core.historyStorage, historyMetadataStorage = components.core.historyStorage,
@ -363,9 +380,13 @@ class AwesomeBarView(
maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT,
showEditSuggestion = false, showEditSuggestion = false,
suggestionsHeader = activity.getString(R.string.firefox_suggest_header), suggestionsHeader = activity.getString(R.string.firefox_suggest_header),
resultsUriFilter = searchEngineUriFilter, resultsUriFilter = filter::shouldIncludeUri,
) )
} else { } else {
defaultCombinedHistoryProvider
}
} else {
if (filter != null) {
HistoryStorageSuggestionProvider( HistoryStorageSuggestionProvider(
historyStorage = components.core.historyStorage, historyStorage = components.core.historyStorage,
loadUrlUseCase = loadUrlUseCase, loadUrlUseCase = loadUrlUseCase,
@ -374,8 +395,11 @@ class AwesomeBarView(
maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT,
showEditSuggestion = false, showEditSuggestion = false,
suggestionsHeader = activity.getString(R.string.firefox_suggest_header), suggestionsHeader = activity.getString(R.string.firefox_suggest_header),
resultsUriFilter = searchEngineUriFilter, resultsUriFilter = filter::shouldIncludeUri,
) )
} else {
defaultHistoryStorageProvider
}
} }
} }
@ -455,24 +479,16 @@ class AwesomeBarView(
} }
/** /**
* Get a synced tabs provider automatically configured to filter or not results from just the current search engine. * Get a synced tabs provider configured for this [AwesomeBarView].
* *
* @param searchEngineSource Search engine wrapper also informing about the selection type. * @param filter Optional filter to limit the returned synced tab suggestions.
* @param filterByCurrentEngine Whether to apply a filter to the constructed provider such that
* it will return bookmarks only for the current search engine.
* *
* @return [SyncedTabsStorageSuggestionProvider] providing suggestions for the [AwesomeBar]. * @return [SyncedTabsStorageSuggestionProvider] providing suggestions for the [AwesomeBar].
*/ */
@VisibleForTesting @VisibleForTesting
internal fun getSyncedTabsProvider( internal fun getSyncedTabsProvider(
searchEngineSource: SearchEngineSource, filter: SearchResultFilter? = null,
filterByCurrentEngine: Boolean = false,
): SyncedTabsStorageSuggestionProvider { ): SyncedTabsStorageSuggestionProvider {
val searchEngineHostFilter = when (filterByCurrentEngine) {
true -> searchEngineSource.searchEngine?.resultsUrl?.host
false -> null
}
return SyncedTabsStorageSuggestionProvider( return SyncedTabsStorageSuggestionProvider(
components.backgroundServices.syncedTabsStorage, components.backgroundServices.syncedTabsStorage,
loadUrlUseCase, loadUrlUseCase,
@ -483,29 +499,21 @@ class AwesomeBarView(
getDrawable(activity, R.drawable.ic_search_results_device_tablet), getDrawable(activity, R.drawable.ic_search_results_device_tablet),
), ),
suggestionsHeader = activity.getString(R.string.firefox_suggest_header), suggestionsHeader = activity.getString(R.string.firefox_suggest_header),
resultsHostFilter = searchEngineHostFilter, resultsUrlFilter = filter?.let { it::shouldIncludeUrl },
) )
} }
/** /**
* Get a local tabs provider automatically configured to filter or not results from just the current search engine. * Get a local tabs provider configured for this [AwesomeBarView].
* *
* @param searchEngineSource Search engine wrapper also informing about the selection type. * @param filter Optional filter to limit the returned local tab suggestions.
* @param filterByCurrentEngine Whether to apply a filter to the constructed provider such that
* it will return bookmarks only for the current search engine.
* *
* @return [SessionSuggestionProvider] providing suggestions for the [AwesomeBar]. * @return [SessionSuggestionProvider] providing suggestions for the [AwesomeBar].
*/ */
@VisibleForTesting @VisibleForTesting
internal fun getLocalTabsProvider( internal fun getLocalTabsProvider(
searchEngineSource: SearchEngineSource, filter: SearchResultFilter? = null,
filterByCurrentEngine: Boolean = false,
): SessionSuggestionProvider { ): SessionSuggestionProvider {
val searchEngineUriFilter = when (filterByCurrentEngine) {
true -> searchEngineSource.searchEngine?.resultsUrl
false -> null
}
return SessionSuggestionProvider( return SessionSuggestionProvider(
activity.resources, activity.resources,
components.core.store, components.core.store,
@ -514,29 +522,21 @@ class AwesomeBarView(
getDrawable(activity, R.drawable.ic_search_results_tab), getDrawable(activity, R.drawable.ic_search_results_tab),
excludeSelectedSession = !fromHomeFragment, excludeSelectedSession = !fromHomeFragment,
suggestionsHeader = activity.getString(R.string.firefox_suggest_header), suggestionsHeader = activity.getString(R.string.firefox_suggest_header),
resultsUriFilter = searchEngineUriFilter, resultsUriFilter = filter?.let { it::shouldIncludeUri },
) )
} }
/** /**
* Get a bookmarks provider automatically configured to filter or not results from just the current search engine. * Get a bookmarks provider configured for this [AwesomeBarView].
* *
* @param searchEngineSource Search engine wrapper also informing about the selection type. * @param filter Optional filter to limit the returned bookmark suggestions.
* @param filterByCurrentEngine Whether to apply a filter to the constructed provider such that
* it will return bookmarks only for the current search engine.
* *
* @return [BookmarksStorageSuggestionProvider] providing suggestions for the [AwesomeBar]. * @return [BookmarksStorageSuggestionProvider] providing suggestions for the [AwesomeBar].
*/ */
@VisibleForTesting @VisibleForTesting
internal fun getBookmarksProvider( internal fun getBookmarksProvider(
searchEngineSource: SearchEngineSource, filter: SearchResultFilter? = null,
filterByCurrentEngine: Boolean = false,
): BookmarksStorageSuggestionProvider { ): BookmarksStorageSuggestionProvider {
val searchEngineHostFilter = when (filterByCurrentEngine) {
true -> searchEngineSource.searchEngine?.resultsUrl
false -> null
}
return BookmarksStorageSuggestionProvider( return BookmarksStorageSuggestionProvider(
bookmarksStorage = components.core.bookmarksStorage, bookmarksStorage = components.core.bookmarksStorage,
loadUrlUseCase = loadUrlUseCase, loadUrlUseCase = loadUrlUseCase,
@ -545,10 +545,28 @@ class AwesomeBarView(
engine = engineForSpeculativeConnects, engine = engineForSpeculativeConnects,
showEditSuggestion = false, showEditSuggestion = false,
suggestionsHeader = activity.getString(R.string.firefox_suggest_header), suggestionsHeader = activity.getString(R.string.firefox_suggest_header),
resultsUriFilter = searchEngineHostFilter, resultsUriFilter = filter?.let { it::shouldIncludeUri },
) )
} }
/**
* Returns a [SearchResultFilter] that only includes results for the current search engine.
*/
internal fun getFilterForCurrentEngineResults(state: SearchProviderState): SearchResultFilter? =
state.searchEngineSource.searchEngine?.resultsUrl?.let {
SearchResultFilter.CurrentEngine(it)
}
/**
* Returns a [SearchResultFilter] that excludes sponsored results.
*/
internal fun getFilterToExcludeSponsoredResults(state: SearchProviderState): SearchResultFilter? =
if (state.showSponsoredSuggestions) {
SearchResultFilter.ExcludeSponsored(activity.settings().frecencyFilterQuery)
} else {
null
}
data class SearchProviderState( data class SearchProviderState(
val showSearchShortcuts: Boolean, val showSearchShortcuts: Boolean,
val showSearchTermHistory: Boolean, val showSearchTermHistory: Boolean,
@ -566,6 +584,41 @@ class AwesomeBarView(
val searchEngineSource: SearchEngineSource, val searchEngineSource: SearchEngineSource,
) )
/**
* Filters to limit the suggestions returned from a suggestion provider.
*/
sealed interface SearchResultFilter {
/**
* A filter for the currently selected search engine. This filter only includes suggestions
* whose URLs have the same host as [resultsUri].
*/
data class CurrentEngine(val resultsUri: Uri) : SearchResultFilter
/**
* A filter that excludes sponsored suggestions, whose URLs contain the given
* [queryParameter].
*/
data class ExcludeSponsored(val queryParameter: String) : SearchResultFilter
/**
* Returns `true` if the suggestion with the given [uri] should be included in the
* suggestions returned from the provider.
*/
fun shouldIncludeUri(uri: Uri): Boolean = when (this) {
is CurrentEngine -> this.resultsUri.sameHostWithoutMobileSubdomainAs(uri)
is ExcludeSponsored -> !uri.containsQueryParameters(queryParameter)
}
/**
* Returns `true` if the suggestion with the given [url] string should be included in the
* suggestions returned from the provider.
*/
fun shouldIncludeUrl(url: String): Boolean = when (this) {
is CurrentEngine -> resultsUri.host == url.tryGetHostFromUrl()
is ExcludeSponsored -> !url.urlContainsQueryParameters(queryParameter)
}
}
companion object { companion object {
// Maximum number of suggestions returned. // Maximum number of suggestions returned.
const val METADATA_SUGGESTION_LIMIT = 3 const val METADATA_SUGGESTION_LIMIT = 3

View File

@ -56,7 +56,6 @@ object SupportUtils {
SMARTBLOCK("smartblock-enhanced-tracking-protection"), SMARTBLOCK("smartblock-enhanced-tracking-protection"),
SPONSOR_PRIVACY("sponsor-privacy"), SPONSOR_PRIVACY("sponsor-privacy"),
HTTPS_ONLY_MODE("https-only-mode-firefox-android"), HTTPS_ONLY_MODE("https-only-mode-firefox-android"),
COOKIE_BANNER("cookie-banner-reduction-firefox-android"),
UNSIGNED_ADDONS("unsigned-addons"), UNSIGNED_ADDONS("unsigned-addons"),
REVIEW_QUALITY_CHECK("review_checker_mobile"), REVIEW_QUALITY_CHECK("review_checker_mobile"),
FX_SUGGEST("search-suggestions-firefox"), FX_SUGGEST("search-suggestions-firefox"),

View File

@ -122,4 +122,24 @@
<string name="translations_bottom_sheet_translate_to">Translate to</string> <string name="translations_bottom_sheet_translate_to">Translate to</string>
<string name="translations_bottom_sheet_negative_button">Not now</string> <string name="translations_bottom_sheet_negative_button">Not now</string>
<string name="translations_bottom_sheet_positive_button">Translate</string> <string name="translations_bottom_sheet_positive_button">Translate</string>
<string name="translation_option_bottom_sheet_title">Translation Options</string>
<string name="translation_option_bottom_sheet_always_translate">Always offer to translate</string>
<string name="translation_option_bottom_sheet_always_translate_in_language">Always translate %1$s</string>
<string name="translation_option_bottom_sheet_never_translate_in_language">Never translate %1$s</string>
<string name="translation_option_bottom_sheet_never_translate_site">Never translate this site</string>
<string name="translation_option_bottom_sheet_translation_settings">Translation settings</string>
<string name="translation_option_bottom_sheet_about_translations">About translations in %1$s</string>
<string name="translation_settings_toolbar_title">Translations</string>
<string name="translation_settings_translation_preference">Translation preferences</string>
<string name="translation_settings_offer_to_translate">Offer to translate when possible</string>
<string name="translation_settings_always_download">Always download languages in data saving mode</string>
<string name="translation_settings_automatic_translation">Automatic translation</string>
<string name="translation_settings_automatic_never_translate_sites">Never translate these sites</string>
<string name="translation_settings_download_language">Download languages</string>
<string name="translations_bottom_sheet_translating_in_progress">In progress</string>
<string name="translations_bottom_sheet_translating_in_progress_content_description">Translating in Progress</string>
</resources> </resources>

View File

@ -199,6 +199,8 @@
<string name="browser_menu_library">Library</string> <string name="browser_menu_library">Library</string>
<!-- Browser menu toggle that requests a desktop site --> <!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Desktop site</string> <string name="browser_menu_desktop_site">Desktop site</string>
<!-- Browser menu button that reopens a private tab as a regular tab -->
<string name="browser_menu_open_in_regular_tab">Open in regular tab</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">Add to Home screen</string> <string name="browser_menu_add_to_homescreen">Add to Home screen</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. -->
@ -252,7 +254,7 @@
<!-- Button in the search view that lets a user search by scanning a QR code --> <!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Scan</string> <string name="search_scan_button">Scan</string>
<!-- Button in the search view that lets a user change their search engine --> <!-- Button in the search view that lets a user change their search engine -->
<string name="search_engine_button">Search engine</string> <string name="search_engine_button" moz:RemovedIn="121" tools:ignore="UnusedResources">Search engine</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings --> <!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Search engine settings</string> <string name="search_shortcuts_engine_settings">Search engine settings</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard --> <!-- Button in the search view that lets a user navigate to the site in their clipboard -->
@ -301,7 +303,7 @@
<!-- Notification pre-permission dialog --> <!-- Notification pre-permission dialog -->
<!-- Enable notification pre permission dialog title <!-- Enable notification pre permission dialog title
The first parameter is the name of the app defined in app_name (for example: Fenix) --> The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="onboarding_home_enable_notifications_title">Notifications help you do more with LeOSium</string> <string name="onboarding_home_enable_notifications_title">Notifications help you do more with %s</string>
<!-- Enable notification pre permission dialog description with rationale <!-- Enable notification pre permission dialog description with rationale
The first parameter is the name of the app defined in app_name (for example: Fenix) --> The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="onboarding_home_enable_notifications_description">Sync your tabs between devices, manage downloads, get tips about making the most of %ss privacy protection, and more.</string> <string name="onboarding_home_enable_notifications_description">Sync your tabs between devices, manage downloads, get tips about making the most of %ss privacy protection, and more.</string>
@ -346,13 +348,13 @@
<string name="juno_onboarding_enable_notifications_title_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Notifications help you do more with LeOSium</string> <string name="juno_onboarding_enable_notifications_title_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Notifications help you do more with LeOSium</string>
<!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. <!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "LeOSium" should NOT be translated --> Note: The word "LeOSium" should NOT be translated -->
<string name="juno_onboarding_enable_notifications_title_nimbus_2">Notifications help you stay safer with LeOSium</string> <string name="juno_onboarding_enable_notifications_title_nimbus_2">Notifications help you stay safer with Firefox</string>
<!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. <!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "Firefox" should NOT be translated --> Note: The word "Firefox" should NOT be translated -->
<string name="juno_onboarding_enable_notifications_description_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Send tabs between devices, manage downloads, and get tips on getting the most out of LeOSium.</string> <string name="juno_onboarding_enable_notifications_description_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Send tabs between devices, manage downloads, and get tips on getting the most out of LeOSium.</string>
<!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. <!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "Firefox" should NOT be translated --> Note: The word "Firefox" should NOT be translated -->
<string name="juno_onboarding_enable_notifications_description_nimbus_2">Securely send tabs between your devices and discover other privacy features in LeOSium.</string> <string name="juno_onboarding_enable_notifications_description_nimbus_2">Securely send tabs between your devices and discover other privacy features in Firefox.</string>
<!-- Text for the button to request notification permission on the device --> <!-- Text for the button to request notification permission on the device -->
<string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Turn on notifications</string> <string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Turn on notifications</string>
<!-- Text for the button dismiss the screen and move on with the flow --> <!-- Text for the button dismiss the screen and move on with the flow -->
@ -439,15 +441,19 @@
<string name="preferences_https_only_title">HTTPS-Only Mode</string> <string name="preferences_https_only_title">HTTPS-Only Mode</string>
<!-- Preference for removing cookie/consent banners from sites automatically. See reduce_cookie_banner_summary for additional context. --> <!-- Preference for removing cookie/consent banners from sites automatically. See reduce_cookie_banner_summary for additional context. -->
<string name="preferences_cookie_banner_reduction">Cookie banner reduction</string> <string name="preferences_cookie_banner_reduction" moz:RemovedIn="121" tools:ignore="UnusedResources">Cookie banner reduction</string>
<!-- Label for cookie banner section in quick settings panel. -->
<string name="cookie_banner_blocker">Cookie Banner Blocker</string>
<!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. -->
<string name="preferences_cookie_banner_reduction_private_mode">Cookie Banner Blocker in private browsing</string>
<!-- Preference for rejecting or removing as many cookie/consent banners as possible on sites. See reduce_cookie_banner_summary for additional context. --> <!-- Preference for rejecting or removing as many cookie/consent banners as possible on sites. See reduce_cookie_banner_summary for additional context. -->
<string name="reduce_cookie_banner_option">Reduce cookie banners</string> <string name="reduce_cookie_banner_option" moz:RemovedIn="121" tools:ignore="UnusedResources">Reduce cookie banners</string>
<!-- Summary of cookie banner handling preference if the setting disabled is set to off --> <!-- Summary of cookie banner handling preference if the setting disabled is set to off -->
<string name="reduce_cookie_banner_option_off">Off</string> <string name="reduce_cookie_banner_option_off" moz:RemovedIn="121" tools:ignore="UnusedResources">Off</string>
<!-- Summary of cookie banner handling preference if the setting enabled is set to on --> <!-- Summary of cookie banner handling preference if the setting enabled is set to on -->
<string name="reduce_cookie_banner_option_on">On</string> <string name="reduce_cookie_banner_option_on" moz:RemovedIn="121" tools:ignore="UnusedResources">On</string>
<!-- Summary for the preference for rejecting all cookies whenever possible. The first parameter is the application name --> <!-- Summary for the preference for rejecting all cookies whenever possible. The first parameter is the application name -->
<string name="reduce_cookie_banner_summary_1">%1$s automatically tries to reject cookie requests on cookie banners.</string> <string name="reduce_cookie_banner_summary_1" moz:RemovedIn="121" tools:ignore="UnusedResources">%1$s automatically tries to reject cookie requests on cookie banners.</string>
<!-- Text for indicating cookie banner handling is off this site, this is shown as part of the protections panel with the tracking protection toggle --> <!-- Text for indicating cookie banner handling is off this site, this is shown as part of the protections panel with the tracking protection toggle -->
<string name="reduce_cookie_banner_off_for_site">Off for this site</string> <string name="reduce_cookie_banner_off_for_site">Off for this site</string>
<!-- Text for cancel button indicating that cookie banner reduction is not supported for the current site, this is shown as part of the cookie banner details view. --> <!-- Text for cancel button indicating that cookie banner reduction is not supported for the current site, this is shown as part of the cookie banner details view. -->
@ -465,45 +471,57 @@
<!-- Text for indicating cookie banner handling is currently not supported for this site, this is shown as part of the protections panel with the tracking protection toggle --> <!-- Text for indicating cookie banner handling is currently not supported for this site, this is shown as part of the protections panel with the tracking protection toggle -->
<string name="reduce_cookie_banner_unsupported_site">Site currently not supported</string> <string name="reduce_cookie_banner_unsupported_site">Site currently not supported</string>
<!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> <!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site-->
<string name="reduce_cookie_banner_details_panel_title_on_for_site">Turn on Cookie banner reduction for %1$s?</string> <string name="reduce_cookie_banner_details_panel_title_on_for_site" moz:RemovedIn="121" tools:ignore="UnusedResources">Turn on Cookie banner reduction for %1$s?</string>
<!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site-->
<string name="reduce_cookie_banner_details_panel_title_on_for_site_1">Turn on Cookie Banner Blocker for %1$s?</string>
<!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> <!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site-->
<string name="reduce_cookie_banner_details_panel_title_off_for_site">Turn off Cookie banner reduction for %1$s?</string> <string name="reduce_cookie_banner_details_panel_title_off_for_site" moz:RemovedIn="121" tools:ignore="UnusedResources">Turn off Cookie banner reduction for %1$s?</string>
<!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site-->
<string name="reduce_cookie_banner_details_panel_title_off_for_site_1">Turn off Cookie Banner Blocker for %1$s?</string>
<!-- Title text for a detail explanation indicating cookie banner reducer didn't work for the current site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name--> <!-- Title text for a detail explanation indicating cookie banner reducer didn't work for the current site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name-->
<string name="reduce_cookie_banner_details_panel_title_unsupported_site_request_2">%1$s cant automatically reject cookie requests on this site. You can send a request to support this site in the future.</string> <string name="reduce_cookie_banner_details_panel_title_unsupported_site_request_2">%1$s cant automatically reject cookie requests on this site. You can send a request to support this site in the future.</string>
<!-- Long text for a detail explanation indicating what will happen if cookie banner handling is off for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is off for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name -->
<string name="reduce_cookie_banner_details_panel_description_off_for_site">%1$s will clear this sites cookies and refresh the page. Clearing all cookies may sign you out or empty shopping carts.</string> <string name="reduce_cookie_banner_details_panel_description_off_for_site" moz:RemovedIn="121" tools:ignore="UnusedResources">%1$s will clear this sites cookies and refresh the page. Clearing all cookies may sign you out or empty shopping carts.</string>
<!-- Long text for a detail explanation indicating what will happen if cookie banner handling is off for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name -->
<string name="reduce_cookie_banner_details_panel_description_off_for_site_1">Turn off and %1$s will clear cookies and reload this site. This may sign you out or empty shopping carts.</string>
<!-- Long text for a detail explanation indicating what will happen if cookie banner handling is on for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is on for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name -->
<string name="reduce_cookie_banner_details_panel_description_on_for_site_2">%1$s tries to automatically reject all cookie requests on supported sites.</string> <string name="reduce_cookie_banner_details_panel_description_on_for_site_2" moz:RemovedIn="121" tools:ignore="UnusedResources">%1$s tries to automatically reject all cookie requests on supported sites.</string>
<!-- Long text for a detail explanation indicating what will happen if cookie banner handling is on for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name -->
<string name="reduce_cookie_banner_details_panel_description_on_for_site_3" >Turn on and %1$s will try to automatically refuse all cookie banners on this site.</string>
<!-- Title text for the cookie banner re-engagement dialog. The first parameter is the application name. --> <!-- Title text for the cookie banner re-engagement dialog. The first parameter is the application name. -->
<string name="reduce_cookie_banner_dialog_title">Allow %1$s to reject cookie banners?</string> <string name="reduce_cookie_banner_dialog_title" moz:RemovedIn="121" tools:ignore="UnusedResources">Allow %1$s to reject cookie banners?</string>
<!-- Body text for the cookie banner re-engagement dialog use. The first parameter is the application name. --> <!-- Body text for the cookie banner re-engagement dialog use. The first parameter is the application name. -->
<string name="reduce_cookie_banner_dialog_body">%1$s can automatically reject many cookie banner requests.</string> <string name="reduce_cookie_banner_dialog_body" moz:RemovedIn="121" tools:ignore="UnusedResources">%1$s can automatically reject many cookie banner requests.</string>
<!-- Remind me later text button for the onboarding dialog --> <!-- Remind me later text button for the onboarding dialog -->
<string name="reduce_cookie_banner_dialog_not_now_button">Not Now</string> <string name="reduce_cookie_banner_dialog_not_now_button" moz:RemovedIn="121" tools:ignore="UnusedResources">Not Now</string>
<!-- Snack text for the cookie banner dialog, after user hit the dismiss banner button --> <!-- Snack text for the cookie banner dialog, after user hit the dismiss banner button -->
<string name="reduce_cookie_banner_dialog_snackbar_text">Youll see fewer cookie requests</string> <string name="reduce_cookie_banner_dialog_snackbar_text" moz:RemovedIn="121" tools:ignore="UnusedResources">Youll see fewer cookie requests</string>
<!-- Change setting text button, for the cookie banner re-engagement dialog --> <!-- Change setting text button, for the cookie banner re-engagement dialog -->
<string name="reduce_cookie_banner_dialog_change_setting_button">Allow</string> <string name="reduce_cookie_banner_dialog_change_setting_button" moz:RemovedIn="121" tools:ignore="UnusedResources">Allow</string>
<!--Title for the cookie banner re-engagement CFR, the placeholder is replaced with app name -->
<string name="cookie_banner_cfr_title">%1$s just refused cookies for you</string>
<!--Message for the cookie banner re-engagement CFR -->
<string name="cookie_banner_cfr_message">Less distractions, less cookies tracking you on this site.</string>
<!-- Description of the preference to enable "HTTPS-Only" mode. --> <!-- Description of the preference to enable "HTTPS-Only" mode. -->
<string name="preferences_https_only_summary">Automatically attempts to connect to sites using HTTPS encryption protocol for increased security.</string> <string name="preferences_https_only_summary">Automatically attempts to connect to sites using HTTPS encryption protocol for increased security.</string>
<!-- Summary of http only preference if http only is set to off --> <!-- Summary of https only preference if https only is set to off -->
<string name="preferences_https_only_off">Off</string> <string name="preferences_https_only_off">Off</string>
<!-- Summary of http only preference if http only is set to on in all tabs --> <!-- Summary of https only preference if https only is set to on in all tabs -->
<string name="preferences_https_only_on_all">On in all tabs</string> <string name="preferences_https_only_on_all">On in all tabs</string>
<!-- Summary of http only preference if http only is set to on in private tabs only --> <!-- Summary of https only preference if https only is set to on in private tabs only -->
<string name="preferences_https_only_on_private">On in private tabs</string> <string name="preferences_https_only_on_private">On in private tabs</string>
<!-- Text displayed that links to website containing documentation about "HTTPS-Only" mode --> <!-- Text displayed that links to website containing documentation about "HTTPS-Only" mode -->
<string name="preferences_https_only_learn_more">Learn more</string> <string name="preferences_http_only_learn_more">Learn more</string>
<!-- Option for the http only setting --> <!-- Option for the https only setting -->
<string name="preferences_https_only_in_all_tabs">Enable in all tabs</string> <string name="preferences_https_only_in_all_tabs">Enable in all tabs</string>
<!-- Option for the http only setting --> <!-- Option for the https only setting -->
<string name="preferences_https_only_in_private_tabs">Enable only in private tabs</string> <string name="preferences_https_only_in_private_tabs">Enable only in private tabs</string>
<!-- Title shown in the error page for when trying to access a http website while http only mode is enabled. --> <!-- Title shown in the error page for when trying to access a http website while https only mode is enabled. -->
<string name="errorpage_httpsonly_title">Secure site not available</string> <string name="errorpage_httpsonly_title">Secure site not available</string>
<!-- Message shown in the error page for when trying to access a http website while http only mode is enabled. The message has two paragraphs. This is the first. --> <!-- Message shown in the error page for when trying to access a http website while https only mode is enabled. The message has two paragraphs. This is the first. -->
<string name="errorpage_httpsonly_message_title">Most likely, the website simply does not support HTTPS.</string> <string name="errorpage_httpsonly_message_title">Most likely, the website simply does not support HTTPS.</string>
<!-- Message shown in the error page for when trying to access a http website while http only mode is enabled. The message has two paragraphs. This is the second. --> <!-- Message shown in the error page for when trying to access a http website while https only mode is enabled. The message has two paragraphs. This is the second. -->
<string name="errorpage_httpsonly_message_summary">However, its also possible that an attacker is involved. If you continue to the website, you should not enter any sensitive info. If you continue, HTTPS-Only mode will be turned off temporarily for the site.</string> <string name="errorpage_httpsonly_message_summary">However, its also possible that an attacker is involved. If you continue to the website, you should not enter any sensitive info. If you continue, HTTPS-Only mode will be turned off temporarily for the site.</string>
<!-- Preference for accessibility --> <!-- Preference for accessibility -->
<string name="preferences_accessibility">Accessibility</string> <string name="preferences_accessibility">Accessibility</string>
@ -649,16 +667,10 @@
<string name="wallpaper_learn_more">Learn more</string> <string name="wallpaper_learn_more">Learn more</string>
<!-- Text for classic wallpapers title. The first parameter is the Firefox name. --> <!-- Text for classic wallpapers title. The first parameter is the Firefox name. -->
<string name="wallpaper_classic_title">Classic %s</string> <string name="wallpaper_classic_title">Classic %s</string>
<!-- Text for limited edition wallpapers title. -->
<string name="wallpaper_limited_edition_title" moz:RemovedIn="118" tools:ignore="UnusedResources">Limited Edition</string>
<!-- Text for artist series wallpapers title. "Artist series" represents a collection of artist collaborated wallpapers. --> <!-- Text for artist series wallpapers title. "Artist series" represents a collection of artist collaborated wallpapers. -->
<string name="wallpaper_artist_series_title">Artist series</string> <string name="wallpaper_artist_series_title">Artist series</string>
<!-- Description text for the limited edition wallpapers with learn more link. The first parameter is the learn more string defined in wallpaper_learn_more-->
<string name="wallpaper_limited_edition_description_with_learn_more" moz:RemovedIn="118" tools:ignore="UnusedResources">The new Independent Voices collection. %s</string>
<!-- Description text for the artist series wallpapers with learn more link. The first parameter is the learn more string defined in wallpaper_learn_more. "Independent voices" is the name of the wallpaper collection --> <!-- Description text for the artist series wallpapers with learn more link. The first parameter is the learn more string defined in wallpaper_learn_more. "Independent voices" is the name of the wallpaper collection -->
<string name="wallpaper_artist_series_description_with_learn_more">The Independent Voices collection. %s</string> <string name="wallpaper_artist_series_description_with_learn_more">The Independent Voices collection. %s</string>
<!-- Description text for the limited edition wallpapers. -->
<string name="wallpaper_limited_edition_description" moz:RemovedIn="118" tools:ignore="UnusedResources">The new Independent Voices collection.</string>
<!-- Description text for the artist series wallpapers. "Independent voices" is the name of the wallpaper collection --> <!-- Description text for the artist series wallpapers. "Independent voices" is the name of the wallpaper collection -->
<string name="wallpaper_artist_series_description">The Independent Voices collection.</string> <string name="wallpaper_artist_series_description">The Independent Voices collection.</string>
<!-- Wallpaper onboarding dialog header text. --> <!-- Wallpaper onboarding dialog header text. -->
@ -672,7 +684,7 @@
<!-- Title of the Nimbus message for add-ons general availability--> <!-- Title of the Nimbus message for add-ons general availability-->
<string name="addon_ga_message_title" tools:ignore="UnusedResources">New add-ons now available</string> <string name="addon_ga_message_title" tools:ignore="UnusedResources">New add-ons now available</string>
<!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here-->
<string name="addon_ga_message_body" tools:ignore="UnusedResources">Check out 100+ new extensions that let you make LeOSium your own.</string> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Check out 100+ new extensions that let you make Firefox your own.</string>
<!-- Button text of the Nimbus message for add-ons general availability. --> <!-- Button text of the Nimbus message for add-ons general availability. -->
<string name="addon_ga_message_button" tools:ignore="UnusedResources">Explore add-ons</string> <string name="addon_ga_message_button" tools:ignore="UnusedResources">Explore add-ons</string>
@ -738,7 +750,7 @@
<!-- 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">Received tabs</string> <string name="fxa_received_tab_channel_name">Received tabs</string>
<!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app --> <!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_description">Notifications for tabs received from other LeOSium devices.</string> <string name="fxa_received_tab_channel_description">Notifications for tabs received from other Firefox devices.</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">Tab Received</string> <string name="fxa_tab_received_notification_name">Tab Received</string>
<!-- %s is the device name --> <!-- %s is the device name -->
@ -1302,10 +1314,10 @@
<string name="notification_marketing_channel_name">Marketing</string> <string name="notification_marketing_channel_name">Marketing</string>
<!-- Title shown in the notification that pops up to remind the user to set fenix as default browser. <!-- Title shown in the notification that pops up to remind the user to set fenix as default browser.
The app name is in the text, due to limitations with localizing Nimbus experiments --> The app name is in the text, due to limitations with localizing Nimbus experiments -->
<string name="nimbus_notification_default_browser_title" tools:ignore="UnusedResources">LeOSium is fast and private</string> <string name="nimbus_notification_default_browser_title" tools:ignore="UnusedResources">Firefox is fast and private</string>
<!-- Text shown in the notification that pops up to remind the user to set fenix as default browser. <!-- Text shown in the notification that pops up to remind the user to set fenix as default browser.
The app name is in the text, due to limitations with localizing Nimbus experiments --> The app name is in the text, due to limitations with localizing Nimbus experiments -->
<string name="nimbus_notification_default_browser_text" tools:ignore="UnusedResources">Make LeOSium your default browser</string> <string name="nimbus_notification_default_browser_text" tools:ignore="UnusedResources">Make Firefox your default browser</string>
<!-- Title shown in the notification that pops up to re-engage the user --> <!-- Title shown in the notification that pops up to re-engage the user -->
<string name="notification_re_engagement_title">Try private browsing</string> <string name="notification_re_engagement_title">Try private browsing</string>
<!-- Text shown in the notification that pops up to re-engage the user. <!-- Text shown in the notification that pops up to re-engage the user.
@ -1324,7 +1336,7 @@
<!-- Survey --> <!-- Survey -->
<!-- Text shown in the fullscreen message that pops up to ask user to take a short survey. <!-- Text shown in the fullscreen message that pops up to ask user to take a short survey.
The app name is in the text, due to limitations with localizing Nimbus experiments --> The app name is in the text, due to limitations with localizing Nimbus experiments -->
<string name="nimbus_survey_message_text">Please help make LeOSium better by taking a short survey.</string> <string name="nimbus_survey_message_text">Please help make Firefox better by taking a short survey.</string>
<!-- Preference for taking the short survey. --> <!-- Preference for taking the short survey. -->
<string name="preferences_take_survey">Take Survey</string> <string name="preferences_take_survey">Take Survey</string>
<!-- Preference for not taking the short survey. --> <!-- Preference for not taking the short survey. -->
@ -1360,7 +1372,7 @@
<string name="qr_scanner_dialog_positive">ALLOW</string> <string name="qr_scanner_dialog_positive">ALLOW</string>
<!-- QR code scanner prompt dialog positive option to deny navigation to scanned link --> <!-- QR code scanner prompt dialog positive option to deny navigation to scanned link -->
<string name="qr_scanner_dialog_negative">DENY</string> <string name="qr_scanner_dialog_negative">DENY</string>
<!-- QR code scanner prompt dialog error message shown when a hostname does not contain http or http. --> <!-- QR code scanner prompt dialog error message shown when a hostname does not contain http or https. -->
<string name="qr_scanner_dialog_invalid">Web address not valid.</string> <string name="qr_scanner_dialog_invalid">Web address not valid.</string>
<!-- QR code scanner prompt dialog positive option when there is an error --> <!-- QR code scanner prompt dialog positive option when there is an error -->
<string name="qr_scanner_dialog_invalid_ok">OK</string> <string name="qr_scanner_dialog_invalid_ok">OK</string>
@ -1395,14 +1407,11 @@
<!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs --> <!-- Subtitle for the tabs item in Delete browsing data, parameter will be replaced with the number of open tabs -->
<string name="preferences_delete_browsing_data_tabs_subtitle">%d tabs</string> <string name="preferences_delete_browsing_data_tabs_subtitle">%d tabs</string>
<!-- Title for the data and history items in Delete browsing data --> <!-- Title for the data and history items in Delete browsing data -->
<string name="preferences_delete_browsing_data_browsing_data_title" moz:removedIn="118" tools:ignore="UnusedResources">Browsing history and site data</string>
<!-- Title for the history item in Delete browsing data --> <!-- Title for the history item in Delete browsing data -->
<string name="preferences_delete_browsing_data_browsing_history_title">Browsing history</string> <string name="preferences_delete_browsing_data_browsing_history_title">Browsing history</string>
<!-- Subtitle for the data and history items in delete browsing data, parameter will be replaced with the <!-- Subtitle for the data and history items in delete browsing data, parameter will be replaced with the
number of history items the user has --> number of history items the user has -->
<string name="preferences_delete_browsing_data_browsing_data_subtitle">%d addresses</string> <string name="preferences_delete_browsing_data_browsing_data_subtitle">%d addresses</string>
<!-- Title for the cookies item in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies" moz:removedIn="118" tools:ignore="UnusedResources">Cookies</string>
<!-- Title for the cookies and site data items in Delete browsing data --> <!-- Title for the cookies and site data items in Delete browsing data -->
<string name="preferences_delete_browsing_data_cookies_and_site_data">Cookies and site data</string> <string name="preferences_delete_browsing_data_cookies_and_site_data">Cookies and site data</string>
<!-- Subtitle for the cookies item in Delete browsing data --> <!-- Subtitle for the cookies item in Delete browsing data -->
@ -1458,61 +1467,10 @@
<string name="delete_history_group_snackbar">Group deleted</string> <string name="delete_history_group_snackbar">Group deleted</string>
<!-- Onboarding --> <!-- Onboarding -->
<!-- Text for onboarding welcome header. -->
<string name="onboarding_header_2" moz:RemovedIn="118" tools:ignore="UnusedResources">Welcome to a better internet</string>
<!-- Text for the onboarding welcome message. -->
<string name="onboarding_message" moz:RemovedIn="118" tools:ignore="UnusedResources">A browser built for people, not profits.</string>
<!-- Text for the Firefox account onboarding sign in card header. -->
<string name="onboarding_account_sign_in_header" moz:RemovedIn="118" tools:ignore="UnusedResources">Pick up where you left off</string>
<!-- Text for the button to learn more about signing in to your Firefox account. -->
<string name="onboarding_manual_sign_in_description" moz:RemovedIn="118" tools:ignore="UnusedResources">Sync tabs and passwords across devices for seamless screen-switching.</string>
<!-- Text for the button to manually sign into Firefox account. -->
<string name="onboarding_firefox_account_sign_in" moz:RemovedIn="118" tools:ignore="UnusedResources">Sign in</string>
<!-- text to display in the snackbar once account is signed-in --> <!-- text to display in the snackbar once account is signed-in -->
<string name="onboarding_firefox_account_sync_is_on">Sync is on</string> <string name="onboarding_firefox_account_sync_is_on">Sync is on</string>
<!-- Text for the tracking protection onboarding card header -->
<string name="onboarding_tracking_protection_header" moz:RemovedIn="118" tools:ignore="UnusedResources">Privacy protection by default</string>
<!-- Text for the tracking protection card description. The first parameter is the name of the application.-->
<string name="onboarding_tracking_protection_description_old" moz:RemovedIn="118" tools:ignore="UnusedResources">%1$s automatically stops companies from secretly following you around the web.</string>
<!-- Text for the tracking protection card description. -->
<string name="onboarding_tracking_protection_description" moz:RemovedIn="118" tools:ignore="UnusedResources">Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites.</string>
<!-- text for tracking protection radio button option for standard level of blocking -->
<string name="onboarding_tracking_protection_standard_button_2" moz:RemovedIn="118" tools:ignore="UnusedResources">Standard (default)</string>
<!-- text for standard blocking option button description -->
<string name="onboarding_tracking_protection_standard_button_description_3" moz:RemovedIn="118" tools:ignore="UnusedResources">Balanced for privacy and performance. Pages load normally.</string>
<!-- text for tracking protection radio button option for strict level of blocking -->
<string name="onboarding_tracking_protection_strict_option" moz:RemovedIn="118" tools:ignore="UnusedResources">Strict</string>
<!-- text for strict blocking option button description -->
<string name="onboarding_tracking_protection_strict_button_description_3" moz:RemovedIn="118" tools:ignore="UnusedResources">Blocks more trackers so pages load faster, but some on-page functionality may break.</string>
<!-- text for the toolbar position card header -->
<string name="onboarding_toolbar_placement_header_1" moz:RemovedIn="118" tools:ignore="UnusedResources">Pick your toolbar placement</string>
<!-- Text for the toolbar position card description -->
<string name="onboarding_toolbar_placement_description" moz:RemovedIn="118" tools:ignore="UnusedResources">Keep it on the bottom, or move it to the top.</string>
<!-- Text for the privacy notice onboarding card header -->
<string name="onboarding_privacy_notice_header_1" moz:RemovedIn="118" tools:ignore="UnusedResources">You control your data</string>
<!-- Text for the privacy notice onboarding card description. -->
<string name="onboarding_privacy_notice_description" moz:RemovedIn="118" tools:ignore="UnusedResources">Firefox gives you control over what you share online and what you share with us.</string>
<!-- Text for the button to read the privacy notice -->
<string name="onboarding_privacy_notice_read_button" moz:RemovedIn="118" tools:ignore="UnusedResources">Read our privacy notice</string>
<!-- Text for the conclusion onboarding message -->
<string name="onboarding_conclusion_header" moz:RemovedIn="118" tools:ignore="UnusedResources">Ready to open up an amazing internet?</string>
<!-- text for the button to finish onboarding -->
<string name="onboarding_finish" moz:RemovedIn="118" tools:ignore="UnusedResources">Start browsing</string>
<!-- Onboarding theme --> <!-- Onboarding theme -->
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header" moz:RemovedIn="118" tools:ignore="UnusedResources">Choose your theme</string>
<!-- text for the theme picker onboarding card description -->
<string name="onboarding_theme_picker_description_2" moz:RemovedIn="118" tools:ignore="UnusedResources">Save some battery and your eyesight with dark mode.</string>
<!-- Automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_title" moz:RemovedIn="118" tools:ignore="UnusedResources">Automatic</string>
<!-- Summary of automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_summary" moz:RemovedIn="118" tools:ignore="UnusedResources">Adapts to your device settings</string>
<!-- Theme setting for dark mode -->
<string name="onboarding_theme_dark_title" moz:RemovedIn="118" tools:ignore="UnusedResources">Dark theme</string>
<!-- Theme setting for light mode -->
<string name="onboarding_theme_light_title" moz:RemovedIn="118" tools:ignore="UnusedResources">Light theme</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device --> <!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">Tabs sent!</string> <string name="sync_sent_tabs_snackbar">Tabs sent!</string>
<!-- Text shown in snackbar when one tab has been sent to device --> <!-- Text shown in snackbar when one tab has been sent to device -->
@ -1524,7 +1482,7 @@
<!-- Title of QR Pairing Fragment --> <!-- Title of QR Pairing Fragment -->
<string name="sync_scan_code">Scan the code</string> <string name="sync_scan_code">Scan the code</string>
<!-- Instructions on how to access pairing --> <!-- Instructions on how to access pairing -->
<string name="sign_in_instructions"><![CDATA[On your computer open Firefox and go to <b>http://firefox.com/pair</b>]]></string> <string name="sign_in_instructions"><![CDATA[On your computer open Firefox and go to <b>https://firefox.com/pair</b>]]></string>
<!-- Text shown for sign in pairing when ready --> <!-- Text shown for sign in pairing when ready -->
<string name="sign_in_ready_for_scan">Ready to scan</string> <string name="sign_in_ready_for_scan">Ready to scan</string>
<!-- Text shown for settings option for sign with pairing --> <!-- Text shown for settings option for sign with pairing -->
@ -1930,7 +1888,7 @@
<!-- Placeholder text shown in the Search String TextField before a user enters text --> <!-- Placeholder text shown in the Search String TextField before a user enters text -->
<string name="search_add_custom_engine_search_string_hint_2">URL to use for search</string> <string name="search_add_custom_engine_search_string_hint_2">URL to use for search</string>
<!-- Description text for the Search String TextField. The %s is part of the string --> <!-- Description text for the Search String TextField. The %s is part of the string -->
<string name="search_add_custom_engine_search_string_example" formatted="false">Replace query with “%s”. Example:\nhttp://leosearch.ddns.net/search?q=%s</string> <string name="search_add_custom_engine_search_string_example" formatted="false">Replace query with “%s”. Example:\nhttps://www.google.com/search?q=%s</string>
<!-- Accessibility description for the form in which details about the custom search engine are entered --> <!-- Accessibility description for the form in which details about the custom search engine are entered -->
<string name="search_add_custom_engine_form_description">Custom search engine details</string> <string name="search_add_custom_engine_form_description">Custom search engine details</string>
<!-- Label for the TextField in which user enters custom search engine suggestion URL --> <!-- Label for the TextField in which user enters custom search engine suggestion URL -->
@ -1938,9 +1896,7 @@
<!-- Placeholder text shown in the Search Suggestion String TextField before a user enters text --> <!-- Placeholder text shown in the Search Suggestion String TextField before a user enters text -->
<string name="search_add_custom_engine_suggest_string_hint">Search suggestion API URL</string> <string name="search_add_custom_engine_suggest_string_hint">Search suggestion API URL</string>
<!-- Description text for the Search Suggestion String TextField. The %s is part of the string --> <!-- Description text for the Search Suggestion String TextField. The %s is part of the string -->
<string name="search_add_custom_engine_suggest_string_example" formatted="false" moz:RemovedIn="118" tools:ignore="UnusedResources">Replace query with “%s”. Example:\nhttp://suggestqueries.google.com/complete/search?client=firefox&amp;q=%s</string> <string name="search_add_custom_engine_suggest_string_example_2" formatted="false">Replace query with “%s”. Example:\nhttps://suggestqueries.google.com/complete/search?client=firefox&amp;q=%s</string>
<!-- Description text for the Search Suggestion String TextField. The %s is part of the string -->
<string name="search_add_custom_engine_suggest_string_example_2" formatted="false">Replace query with “%s”. Example:\nhttp://suggestqueries.google.com/complete/search?client=firefox&amp;q=%s</string>
<!-- The text for the "Save" button for saving a custom search engine --> <!-- The text for the "Save" button for saving a custom search engine -->
<string name="search_custom_engine_save_button">Save</string> <string name="search_custom_engine_save_button">Save</string>
@ -2029,10 +1985,10 @@
<string name="voice_search_explainer">Speak now</string> <string name="voice_search_explainer">Speak now</string>
<!-- The error message in edit login view when a duplicate username exists. --> <!-- The error message in edit login view when a duplicate username exists. -->
<string name="saved_login_duplicate">A login with that username already exists</string> <string name="saved_login_duplicate">A login with that username already exists</string>
<!-- This is the hint text that is shown inline on the hostname field of the create new login page. 'http://www.example.com' intentionally hardcoded here --> <!-- This is the hint text that is shown inline on the hostname field of the create new login page. 'https://www.example.com' intentionally hardcoded here -->
<string name="add_login_hostname_hint_text">http://www.example.com</string> <string name="add_login_hostname_hint_text">https://www.example.com</string>
<!-- This is an error message shown below the hostname field of the add login page when a hostname does not contain http or http. --> <!-- This is an error message shown below the hostname field of the add login page when a hostname does not contain http or https. -->
<string name="add_login_hostname_invalid_text_3">Web address must contain "http://" or "http://"</string> <string name="add_login_hostname_invalid_text_3">Web address must contain "https://" or "http://"</string>
<!-- This is an error message shown below the hostname field of the add login page when a hostname is invalid. --> <!-- This is an error message shown below the hostname field of the add login page when a hostname is invalid. -->
<string name="add_login_hostname_invalid_text_2">Valid hostname required</string> <string name="add_login_hostname_invalid_text_2">Valid hostname required</string>
@ -2273,10 +2229,8 @@
<string name="review_quality_check_contextual_onboarding_learn_more_link">Learn more</string> <string name="review_quality_check_contextual_onboarding_learn_more_link">Learn more</string>
<!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. First parameter is the Fakespot product name. Following parameters are for clickable texts defined in review_quality_check_contextual_onboarding_privacy_policy and review_quality_check_contextual_onboarding_terms_use. In the phrase "Fakespot by Mozilla", "by" can be localized. Does not need to stay by. --> <!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. First parameter is the Fakespot product name. Following parameters are for clickable texts defined in review_quality_check_contextual_onboarding_privacy_policy and review_quality_check_contextual_onboarding_terms_use. In the phrase "Fakespot by Mozilla", "by" can be localized. Does not need to stay by. -->
<string name="review_quality_check_contextual_onboarding_caption" moz:RemovedIn="121" tools:ignore="UnusedResources">By selecting “Yes, try it” you agree to %1$s by Mozillas %2$s and %3$s.</string> <string name="review_quality_check_contextual_onboarding_caption" moz:RemovedIn="121" tools:ignore="UnusedResources">By selecting “Yes, try it” you agree to %1$s by Mozillas %2$s and %3$s.</string>
<!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. First parameter is the Fakespot product name. Following parameters are for clickable texts defined in review_quality_check_contextual_onboarding_privacy_policy and review_quality_check_contextual_onboarding_terms_use. -->
<string name="review_quality_check_contextual_onboarding_caption_2" moz:RemovedIn="121" tools:ignore="UnusedResources">By selecting “Yes, try it” you agree to %1$ss %2$s and %3$s.</string>
<!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. Parameter is the Fakespot product name. After the colon, what appears are two links, each on their own line. The first link is to a Privacy policy (review_quality_check_contextual_onboarding_privacy_policy_2). The second link is to Terms of use (review_quality_check_contextual_onboarding_terms_use_2). --> <!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. Parameter is the Fakespot product name. After the colon, what appears are two links, each on their own line. The first link is to a Privacy policy (review_quality_check_contextual_onboarding_privacy_policy_2). The second link is to Terms of use (review_quality_check_contextual_onboarding_terms_use_2). -->
<string name="review_quality_check_contextual_onboarding_caption_3">By selecting \"Yes, try it\" you agree to the following from %1$s:</string> <string name="review_quality_check_contextual_onboarding_caption_2">By selecting “Yes, try it” you agree to the following from %1$s:</string>
<!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy policy. --> <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy policy. -->
<string name="review_quality_check_contextual_onboarding_privacy_policy" moz:RemovedIn="121" tools:ignore="UnusedResources">privacy policy</string> <string name="review_quality_check_contextual_onboarding_privacy_policy" moz:RemovedIn="121" tools:ignore="UnusedResources">privacy policy</string>
<!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy policy. --> <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy policy. -->
@ -2323,8 +2277,12 @@
<!-- Accessibility services actions labels. These will be appended to accessibility actions like "Double tap to.." but not by or applications but by services like Talkback. --> <!-- Accessibility services actions labels. These will be appended to accessibility actions like "Double tap to.." but not by or applications but by services like Talkback. -->
<!-- Action label for elements that can be collapsed if interacting with them. Talkback will append this to say "Double tap to collapse". --> <!-- Action label for elements that can be collapsed if interacting with them. Talkback will append this to say "Double tap to collapse". -->
<string name="a11y_action_label_collapse">collapse</string> <string name="a11y_action_label_collapse">collapse</string>
<!-- Current state for elements that can be collapsed if interacting with them. Talkback will dictate this after a state change. -->
<string name="a11y_state_label_collapsed">collapsed</string>
<!-- Action label for elements that can be expanded if interacting with them. Talkback will append this to say "Double tap to expand". --> <!-- Action label for elements that can be expanded if interacting with them. Talkback will append this to say "Double tap to expand". -->
<string name="a11y_action_label_expand">expand</string> <string name="a11y_action_label_expand">expand</string>
<!-- Current state for elements that can be expanded if interacting with them. Talkback will dictate this after a state change. -->
<string name="a11y_state_label_expanded">expanded</string>
<!-- Action label for links to a website containing documentation about a wallpaper collection. Talkback will append this to say "Double tap to open link to learn more about this collection". --> <!-- Action label for links to a website containing documentation about a wallpaper collection. Talkback will append this to say "Double tap to open link to learn more about this collection". -->
<string name="a11y_action_label_wallpaper_collection_learn_more">open link to learn more about this collection</string> <string name="a11y_action_label_wallpaper_collection_learn_more">open link to learn more about this collection</string>
<!-- Action label for links that point to an article. Talkback will append this to say "Double tap to read the article". --> <!-- Action label for links that point to an article. Talkback will append this to say "Double tap to read the article". -->
@ -2352,13 +2310,16 @@
<string name="preferences_relinquish_memory_title">Suspend tabs to avoid being killed for memory</string> <string name="preferences_relinquish_memory_title">Suspend tabs to avoid being killed for memory</string>
<!-- Description for relinquish memory preference in customization settings --> <!-- Description for relinquish memory preference in customization settings -->
<string name="preferences_relinquish_memory_description">If enabled, tabs will be suspended and page state lost when the system is low on memory</string> <string name="preferences_relinquish_memory_description">If enabled, tabs will be suspended and page state lost when the system is low on memory</string>
<string name="preferences_dns_over_http">DNS over HTTPS</string> <!-- Preference for Top Sites show most recent sites or not -->
<string name="preferences_dns_over_http_on">On</string> <string name="preferences_show_top_recent_sites">Show most visited websites</string>
<string name="preferences_dns_over_http_off">Off</string> <string name="preferences_dns_over_https">DNS over HTTPS</string>
<string name="preferences_dns_over_http_title">DNS over HTTPS mode</string> <string name="preferences_dns_over_https_on">On</string>
<string name="preferences_dns_over_http_summary">Domain Name System (DNS) over HTTPS sends your request for a domain name through an encrypted connection, creating a secure DNS and making it harder for others to see which website youre about to access.</string> <string name="preferences_dns_over_https_off">Off</string>
<string name="preferences_dns_over_http_custom_server">Custom</string> <string name="preferences_dns_over_https_title">DNS over HTTPS mode</string>
<string name="preferences_dns_over_https_summary">Domain Name System (DNS) over HTTPS sends your request for a domain name through an encrypted connection, creating a secure DNS and making it harder for others to see which website youre about to access.</string>
<string name="preferences_dns_over_https_custom_server">Custom</string>
<string name="addons_delete_cache">Delete addons metadata cache file</string> <string name="addons_delete_cache">Delete addons metadata cache file</string>
<string name="addons_sideload">Install addon from file</string>
<string name="confirm_addons_delete_cache">Are you sure to delete addons metadata cache file?</string> <string name="confirm_addons_delete_cache">Are you sure to delete addons metadata cache file?</string>
<string name="confirm_addons_delete_cache_yes">OK</string> <string name="confirm_addons_delete_cache_yes">OK</string>
<string name="confirm_addons_delete_cache_no">Cancel</string> <string name="confirm_addons_delete_cache_no">Cancel</string>