From 35dc7b49a93189ba4a2e6d1b3d5bb53616d11f85 Mon Sep 17 00:00:00 2001 From: harvey186 Date: Sun, 24 Dec 2023 13:35:20 +0100 Subject: [PATCH] Name and icon changes _ v121 --- android-components | 2 +- app/build.gradle | 21 +- .../fenix/addons/AddonsManagementFragment.kt | 39 +++- .../org/mozilla/fenix/home/HomeFragment.kt | 2 +- .../fenix/search/awesomebar/AwesomeBarView.kt | 215 +++++++++++------- .../mozilla/fenix/settings/SupportUtils.kt | 1 - app/src/main/res/values/static_strings.xml | 20 ++ app/src/main/res/values/strings.xml | 183 ++++++--------- 8 files changed, 278 insertions(+), 205 deletions(-) diff --git a/android-components b/android-components index 89ae956b..055d9328 160000 --- a/android-components +++ b/android-components @@ -1 +1 @@ -Subproject commit 89ae956b10d2bfee7dc7832ae41ae349f25ef5b9 +Subproject commit 055d93282f6522a149835370b63f9f35663f0a39 diff --git a/app/build.gradle b/app/build.gradle index 3c56f7f7..6bddd76f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,7 +32,7 @@ android { defaultConfig { applicationId "com.leos" - minSdk = 26 + minSdkVersion config.minSdkVersion compileSdk config.compileSdkVersion targetSdkVersion config.targetSdkVersion versionCode 1 @@ -171,8 +171,8 @@ android { "deepLinkScheme": deepLinkSchemeValue, ]) // Use custom default allowed addon list - buildConfigField "String", "AMO_COLLECTION_USER", "\"16201230\"" - buildConfigField "String", "AMO_COLLECTION_NAME", "\"What-I-want-on-Fenix\"" + buildConfigField "String", "AMO_COLLECTION_USER", "\"18187371\"" + buildConfigField "String", "AMO_COLLECTION_NAME", "\"Iceraven_Addon_Collection\"" resValue "bool", "IS_DEBUG", "true" matchingFallbacks = ['debug'] } @@ -186,8 +186,8 @@ android { "deepLinkScheme": deepLinkSchemeValue, ]) // Use custom default allowed addon list - buildConfigField "String", "AMO_COLLECTION_USER", "\"16201230\"" - buildConfigField "String", "AMO_COLLECTION_NAME", "\"What-I-want-on-Fenix\"" + buildConfigField "String", "AMO_COLLECTION_USER", "\"18187371\"" + buildConfigField "String", "AMO_COLLECTION_NAME", "\"Iceraven_Addon_Collection\"" } benchmark releaseTemplate >> { initWith buildTypes.nightly @@ -248,6 +248,15 @@ android { } 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 { // Because we have runtime language selection we will keep all strings and languages // in the base APKs. @@ -547,7 +556,7 @@ dependencies { implementation ComponentsDependencies.androidx_coordinatorlayout implementation FenixDependencies.google_accompanist_drawablepainter - implementation ComponentsDependencies.thirdparty_sentry_latest + implementation ComponentsDependencies.thirdparty_sentry implementation project(':compose-awesomebar') implementation project(':compose-cfr') diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index 1ffee940..ebdb566b 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -4,7 +4,9 @@ package org.mozilla.fenix.addons +import android.app.Activity import android.content.Context +import android.content.Intent import android.graphics.Typeface import android.graphics.fonts.FontStyle.FONT_WEIGHT_MEDIUM import android.os.Build @@ -13,8 +15,11 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import android.view.inputmethod.EditorInfo 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.appcompat.app.AlertDialog import androidx.appcompat.widget.SearchView @@ -32,10 +37,10 @@ import kotlinx.coroutines.launch import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.AddonManager 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.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.BuildConfig import org.mozilla.fenix.HomeActivity @@ -64,7 +69,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) private var addons: List = emptyList() private var adapter: AddonsManagerAdapter? = null - + private var addonImportFilePicker: ActivityResultLauncher? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { logger.info("View created for AddonsManagementFragment") super.onViewCreated(view, savedInstanceState) @@ -76,6 +81,26 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) 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, ) } + private fun installFromFile() { + val intent = Intent() + .setType("application/x-xpinstall") + .setAction(Intent.ACTION_GET_CONTENT) + addonImportFilePicker!!.launch(intent) + } private fun showAlertDialog() { val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext()) builder diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 95e924b8..f5d23049 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -249,7 +249,7 @@ class HomeFragment : Fragment() { val currentWallpaperName = requireContext().settings().currentWallpaperName applyWallpaper(wallpaperName = currentWallpaperName, orientationChange = false) - components.appStore.dispatch(AppAction.ModeChange(Mode.fromBrowsingMode(browsingModeManager.mode))) + components.appStore.dispatch(AppAction.ModeChange(browsingModeManager.mode)) lifecycleScope.launch(IO) { if (requireContext().settings().showPocketRecommendationsFeature) { diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt index b36e7028..c48cfadf 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.search.awesomebar import android.content.Context import android.graphics.drawable.Drawable +import android.net.Uri import androidx.annotation.VisibleForTesting import androidx.appcompat.content.res.AppCompatResources 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.tabs.TabsUseCases 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.R 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_SHORTCUT_SUGGESTION_LIMIT import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.containsQueryParameters import org.mozilla.fenix.ext.settings import org.mozilla.fenix.search.SearchEngineSource import org.mozilla.fenix.search.SearchFragmentState @@ -253,7 +258,7 @@ class AwesomeBarView( } } - @Suppress("ComplexMethod") + @Suppress("ComplexMethod", "LongMethod") @VisibleForTesting internal fun getProvidersToAdd( state: SearchProviderState, @@ -278,25 +283,31 @@ class AwesomeBarView( } if (state.showAllHistorySuggestions) { - if (activity.settings().historyMetadataUIFeature) { - providersToAdd.add(defaultCombinedHistoryProvider) - } else { - providersToAdd.add(defaultHistoryStorageProvider) - } + providersToAdd.add( + getHistoryProvider( + filter = getFilterToExcludeSponsoredResults(state), + ), + ) } if (state.showHistorySuggestionsForCurrentEngine) { - getHistoryProvidersForSearchEngine(state.searchEngineSource)?.let { - providersToAdd.add(it) + getFilterForCurrentEngineResults(state)?.let { + providersToAdd.add(getHistoryProvider(it)) } } if (state.showAllBookmarkSuggestions) { - providersToAdd.add(getBookmarksProvider(state.searchEngineSource)) + providersToAdd.add( + getBookmarksProvider( + filter = getFilterToExcludeSponsoredResults(state), + ), + ) } if (state.showBookmarksSuggestionsForCurrentEngine) { - providersToAdd.add(getBookmarksProvider(state.searchEngineSource, true)) + getFilterForCurrentEngineResults(state)?.let { + providersToAdd.add(getBookmarksProvider(it)) + } } if (state.showSearchSuggestions) { @@ -304,19 +315,28 @@ class AwesomeBarView( } if (state.showAllSyncedTabsSuggestions) { - providersToAdd.add(getSyncedTabsProvider(state.searchEngineSource)) + providersToAdd.add( + getSyncedTabsProvider( + filter = getFilterToExcludeSponsoredResults(state), + ), + ) } if (state.showSyncedTabsSuggestionsForCurrentEngine) { - providersToAdd.add(getSyncedTabsProvider(state.searchEngineSource, true)) + getFilterForCurrentEngineResults(state)?.let { + providersToAdd.add(getSyncedTabsProvider(it)) + } } 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) { - providersToAdd.add(getLocalTabsProvider(state.searchEngineSource, true)) + getFilterForCurrentEngineResults(state)?.let { + providersToAdd.add(getLocalTabsProvider(it)) + } } if (state.showSponsoredSuggestions || state.showNonSponsoredSuggestions) { @@ -338,44 +358,48 @@ class AwesomeBarView( } /** - * Get a new history suggestion provider that will return suggestions only from the current - * search engine's host. - * Used only for when unified search is active. + * Get a history suggestion provider configured for this [AwesomeBarView]. * - * @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 - * 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 - internal fun getHistoryProvidersForSearchEngine( - searchEngineSource: SearchEngineSource, - ): AwesomeBar.SuggestionProvider? { - val searchEngineUriFilter = searchEngineSource.searchEngine?.resultsUrl ?: return null - + internal fun getHistoryProvider( + filter: SearchResultFilter? = null, + ): AwesomeBar.SuggestionProvider { return if (activity.settings().historyMetadataUIFeature) { - CombinedHistorySuggestionProvider( - historyStorage = components.core.historyStorage, - historyMetadataStorage = components.core.historyStorage, - loadUrlUseCase = loadUrlUseCase, - icons = components.core.icons, - engine = engineForSpeculativeConnects, - maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, - showEditSuggestion = false, - suggestionsHeader = activity.getString(R.string.firefox_suggest_header), - resultsUriFilter = searchEngineUriFilter, - ) + if (filter != null) { + CombinedHistorySuggestionProvider( + historyStorage = components.core.historyStorage, + historyMetadataStorage = components.core.historyStorage, + loadUrlUseCase = loadUrlUseCase, + icons = components.core.icons, + engine = engineForSpeculativeConnects, + maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, + showEditSuggestion = false, + suggestionsHeader = activity.getString(R.string.firefox_suggest_header), + resultsUriFilter = filter::shouldIncludeUri, + ) + } else { + defaultCombinedHistoryProvider + } } else { - HistoryStorageSuggestionProvider( - historyStorage = components.core.historyStorage, - loadUrlUseCase = loadUrlUseCase, - icons = components.core.icons, - engine = engineForSpeculativeConnects, - maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, - showEditSuggestion = false, - suggestionsHeader = activity.getString(R.string.firefox_suggest_header), - resultsUriFilter = searchEngineUriFilter, - ) + if (filter != null) { + HistoryStorageSuggestionProvider( + historyStorage = components.core.historyStorage, + loadUrlUseCase = loadUrlUseCase, + icons = components.core.icons, + engine = engineForSpeculativeConnects, + maxNumberOfSuggestions = METADATA_SUGGESTION_LIMIT, + showEditSuggestion = false, + suggestionsHeader = activity.getString(R.string.firefox_suggest_header), + 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 filterByCurrentEngine Whether to apply a filter to the constructed provider such that - * it will return bookmarks only for the current search engine. + * @param filter Optional filter to limit the returned synced tab suggestions. * * @return [SyncedTabsStorageSuggestionProvider] providing suggestions for the [AwesomeBar]. */ @VisibleForTesting internal fun getSyncedTabsProvider( - searchEngineSource: SearchEngineSource, - filterByCurrentEngine: Boolean = false, + filter: SearchResultFilter? = null, ): SyncedTabsStorageSuggestionProvider { - val searchEngineHostFilter = when (filterByCurrentEngine) { - true -> searchEngineSource.searchEngine?.resultsUrl?.host - false -> null - } - return SyncedTabsStorageSuggestionProvider( components.backgroundServices.syncedTabsStorage, loadUrlUseCase, @@ -483,29 +499,21 @@ class AwesomeBarView( getDrawable(activity, R.drawable.ic_search_results_device_tablet), ), 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 filterByCurrentEngine Whether to apply a filter to the constructed provider such that - * it will return bookmarks only for the current search engine. + * @param filter Optional filter to limit the returned local tab suggestions. * * @return [SessionSuggestionProvider] providing suggestions for the [AwesomeBar]. */ @VisibleForTesting internal fun getLocalTabsProvider( - searchEngineSource: SearchEngineSource, - filterByCurrentEngine: Boolean = false, + filter: SearchResultFilter? = null, ): SessionSuggestionProvider { - val searchEngineUriFilter = when (filterByCurrentEngine) { - true -> searchEngineSource.searchEngine?.resultsUrl - false -> null - } - return SessionSuggestionProvider( activity.resources, components.core.store, @@ -514,29 +522,21 @@ class AwesomeBarView( getDrawable(activity, R.drawable.ic_search_results_tab), excludeSelectedSession = !fromHomeFragment, 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 filterByCurrentEngine Whether to apply a filter to the constructed provider such that - * it will return bookmarks only for the current search engine. + * @param filter Optional filter to limit the returned bookmark suggestions. * * @return [BookmarksStorageSuggestionProvider] providing suggestions for the [AwesomeBar]. */ @VisibleForTesting internal fun getBookmarksProvider( - searchEngineSource: SearchEngineSource, - filterByCurrentEngine: Boolean = false, + filter: SearchResultFilter? = null, ): BookmarksStorageSuggestionProvider { - val searchEngineHostFilter = when (filterByCurrentEngine) { - true -> searchEngineSource.searchEngine?.resultsUrl - false -> null - } - return BookmarksStorageSuggestionProvider( bookmarksStorage = components.core.bookmarksStorage, loadUrlUseCase = loadUrlUseCase, @@ -545,10 +545,28 @@ class AwesomeBarView( engine = engineForSpeculativeConnects, showEditSuggestion = false, 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( val showSearchShortcuts: Boolean, val showSearchTermHistory: Boolean, @@ -566,6 +584,41 @@ class AwesomeBarView( 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 { // Maximum number of suggestions returned. const val METADATA_SUGGESTION_LIMIT = 3 diff --git a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt index 247b6bcb..db276dcf 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -56,7 +56,6 @@ object SupportUtils { SMARTBLOCK("smartblock-enhanced-tracking-protection"), SPONSOR_PRIVACY("sponsor-privacy"), HTTPS_ONLY_MODE("https-only-mode-firefox-android"), - COOKIE_BANNER("cookie-banner-reduction-firefox-android"), UNSIGNED_ADDONS("unsigned-addons"), REVIEW_QUALITY_CHECK("review_checker_mobile"), FX_SUGGEST("search-suggestions-firefox"), diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index d88dc7a9..f1aa39a1 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -122,4 +122,24 @@ Translate to Not now Translate + + Translation Options + Always offer to translate + Always translate %1$s + Never translate %1$s + Never translate this site + Translation settings + About translations in %1$s + + Translations + Translation preferences + Offer to translate when possible + Always download languages in data saving mode + Automatic translation + Never translate these sites + Download languages + + In progress + Translating in Progress + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 33bdc43b..08d75977 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -199,6 +199,8 @@ Library Desktop site + + Open in regular tab Add to Home screen @@ -252,7 +254,7 @@ Scan - Search engine + Search engine Search engine settings @@ -301,7 +303,7 @@ - Notifications help you do more with LeOSium + Notifications help you do more with %s Sync your tabs between devices, manage downloads, get tips about making the most of %s’s privacy protection, and more. @@ -346,13 +348,13 @@ Notifications help you do more with LeOSium - Notifications help you stay safer with LeOSium + Notifications help you stay safer with Firefox Send tabs between devices, manage downloads, and get tips on getting the most out of LeOSium. - Securely send tabs between your devices and discover other privacy features in LeOSium. + Securely send tabs between your devices and discover other privacy features in Firefox. Turn on notifications @@ -439,15 +441,19 @@ HTTPS-Only Mode - Cookie banner reduction + Cookie banner reduction + + Cookie Banner Blocker + + Cookie Banner Blocker in private browsing - Reduce cookie banners + Reduce cookie banners - Off + Off - On + On - %1$s automatically tries to reject cookie requests on cookie banners. + %1$s automatically tries to reject cookie requests on cookie banners. Off for this site @@ -465,45 +471,57 @@ Site currently not supported - Turn on Cookie banner reduction for %1$s? + Turn on Cookie banner reduction for %1$s? + + Turn on Cookie Banner Blocker for %1$s? - Turn off Cookie banner reduction for %1$s? + Turn off Cookie banner reduction for %1$s? + + Turn off Cookie Banner Blocker for %1$s? %1$s can’t automatically reject cookie requests on this site. You can send a request to support this site in the future. - %1$s will clear this site’s cookies and refresh the page. Clearing all cookies may sign you out or empty shopping carts. + %1$s will clear this site’s cookies and refresh the page. Clearing all cookies may sign you out or empty shopping carts. + + Turn off and %1$s will clear cookies and reload this site. This may sign you out or empty shopping carts. - %1$s tries to automatically reject all cookie requests on supported sites. + %1$s tries to automatically reject all cookie requests on supported sites. + + Turn on and %1$s will try to automatically refuse all cookie banners on this site. - Allow %1$s to reject cookie banners? + Allow %1$s to reject cookie banners? - %1$s can automatically reject many cookie banner requests. + %1$s can automatically reject many cookie banner requests. - Not Now + Not Now - You’ll see fewer cookie requests + You’ll see fewer cookie requests - Allow + Allow + + %1$s just refused cookies for you + + Less distractions, less cookies tracking you on this site. Automatically attempts to connect to sites using HTTPS encryption protocol for increased security. - + Off - + On in all tabs - + On in private tabs - Learn more - + Learn more + Enable in all tabs - + Enable only in private tabs - + Secure site not available - + Most likely, the website simply does not support HTTPS. - + However, it’s 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. Accessibility @@ -649,16 +667,10 @@ Learn more Classic %s - - Limited Edition Artist series - - The new Independent Voices collection. %s The Independent Voices collection. %s - - The new Independent Voices collection. The Independent Voices collection. @@ -672,7 +684,7 @@ New add-ons now available - Check out 100+ new extensions that let you make LeOSium your own. + Check out 100+ new extensions that let you make Firefox your own. Explore add-ons @@ -738,7 +750,7 @@ Received tabs - Notifications for tabs received from other LeOSium devices. + Notifications for tabs received from other Firefox devices. Tab Received @@ -1302,10 +1314,10 @@ Marketing - LeOSium is fast and private + Firefox is fast and private - Make LeOSium your default browser + Make Firefox your default browser Try private browsing - Please help make LeOSium better by taking a short survey. + Please help make Firefox better by taking a short survey. Take Survey @@ -1360,7 +1372,7 @@ ALLOW DENY - + Web address not valid. OK @@ -1395,14 +1407,11 @@ %d tabs - Browsing history and site data Browsing history %d addresses - - Cookies Cookies and site data @@ -1458,61 +1467,10 @@ Group deleted - - Welcome to a better internet - - A browser built for people, not profits. - - Pick up where you left off - - Sync tabs and passwords across devices for seamless screen-switching. - - Sign in Sync is on - - Privacy protection by default - - %1$s automatically stops companies from secretly following you around the web. - - Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites. - - Standard (default) - - Balanced for privacy and performance. Pages load normally. - - Strict - - Blocks more trackers so pages load faster, but some on-page functionality may break. - - Pick your toolbar placement - - Keep it on the bottom, or move it to the top. - - You control your data - - Firefox gives you control over what you share online and what you share with us. - - Read our privacy notice - - Ready to open up an amazing internet? - - Start browsing - - Choose your theme - - Save some battery and your eyesight with dark mode. - - Automatic - - Adapts to your device settings - - Dark theme - - Light theme - Tabs sent! @@ -1524,7 +1482,7 @@ Scan the code - http://firefox.com/pair]]> + https://firefox.com/pair]]> Ready to scan @@ -1930,7 +1888,7 @@ URL to use for search - Replace query with “%s”. Example:\nhttp://leosearch.ddns.net/search?q=%s + Replace query with “%s”. Example:\nhttps://www.google.com/search?q=%s Custom search engine details @@ -1938,9 +1896,7 @@ Search suggestion API URL - Replace query with “%s”. Example:\nhttp://suggestqueries.google.com/complete/search?client=firefox&q=%s - - Replace query with “%s”. Example:\nhttp://suggestqueries.google.com/complete/search?client=firefox&q=%s + Replace query with “%s”. Example:\nhttps://suggestqueries.google.com/complete/search?client=firefox&q=%s Save @@ -2029,10 +1985,10 @@ Speak now A login with that username already exists - - http://www.example.com - - Web address must contain "http://" or "http://" + + https://www.example.com + + Web address must contain "https://" or "http://" Valid hostname required @@ -2273,10 +2229,8 @@ Learn more By selecting “Yes, try it” you agree to %1$s by Mozilla’s %2$s and %3$s. - - By selecting “Yes, try it” you agree to %1$s’s %2$s and %3$s. - By selecting \"Yes, try it\" you agree to the following from %1$s: + By selecting “Yes, try it” you agree to the following from %1$s: privacy policy @@ -2323,8 +2277,12 @@ collapse + + collapsed expand + + expanded open link to learn more about this collection @@ -2352,13 +2310,16 @@ Suspend tabs to avoid being killed for memory If enabled, tabs will be suspended and page state lost when the system is low on memory - DNS over HTTPS - On - Off - DNS over HTTPS mode - 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 you’re about to access. - Custom + + Show most visited websites + DNS over HTTPS + On + Off + DNS over HTTPS mode + 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 you’re about to access. + Custom Delete addons metadata cache file + Install addon from file Are you sure to delete addons metadata cache file? OK Cancel