From 070bf5ac24d59c9cd070bd6519fc6bb1656af4aa Mon Sep 17 00:00:00 2001 From: Alexandru2909 Date: Tue, 30 Aug 2022 16:53:13 +0300 Subject: [PATCH] For #26706 - Change TopSite.containsQueryParameters as Uri extension function --- .../org/mozilla/fenix/FenixApplication.kt | 8 +++- .../java/org/mozilla/fenix/ext/TopSite.kt | 29 ------------ .../main/java/org/mozilla/fenix/ext/Uri.kt | 34 ++++++++++++++ .../org/mozilla/fenix/home/HomeFragment.kt | 3 +- .../java/org/mozilla/fenix/utils/Settings.kt | 6 +-- .../java/org/mozilla/fenix/ext/TopSiteTest.kt | 41 ----------------- .../java/org/mozilla/fenix/ext/UriTest.kt | 46 +++++++++++++++++++ 7 files changed, 91 insertions(+), 76 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/ext/Uri.kt create mode 100644 app/src/test/java/org/mozilla/fenix/ext/UriTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index cc88c295c..68ae06927 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix import android.annotation.SuppressLint +import android.net.Uri import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.StrictMode @@ -44,7 +45,6 @@ import mozilla.components.service.fxa.manager.SyncEnginesStorage import mozilla.components.service.glean.Glean import mozilla.components.service.glean.config.Configuration import mozilla.components.service.glean.net.ConceptFetchHttpUploader -import mozilla.components.support.rusterrors.initializeRustErrors import mozilla.components.support.base.facts.register import mozilla.components.support.base.log.Log import mozilla.components.support.base.log.logger.Logger @@ -52,6 +52,7 @@ import mozilla.components.support.base.observer.Observable import mozilla.components.support.ktx.android.content.isMainProcess import mozilla.components.support.ktx.android.content.runOnlyInMainProcess import mozilla.components.support.locale.LocaleAwareApplication +import mozilla.components.support.rusterrors.initializeRustErrors import mozilla.components.support.rusthttp.RustHttpConfig import mozilla.components.support.rustlog.RustLog import mozilla.components.support.utils.logElapsedTime @@ -275,7 +276,10 @@ open class FenixApplication : LocaleAwareApplication(), Provider { totalSites = components.settings.topSitesMaxLimit, frecencyConfig = TopSitesFrecencyConfig( FrecencyThresholdOption.SKIP_ONE_TIME_PAGES - ) { !it.containsQueryParameters(components.settings.frecencyFilterQuery) }, + ) { + !Uri.parse(it.url) + .containsQueryParameters(components.settings.frecencyFilterQuery) + }, providerConfig = TopSitesProviderConfig( showProviderTopSites = components.settings.showContileFeature, maxThreshold = TOP_SITES_PROVIDER_MAX_THRESHOLD diff --git a/app/src/main/java/org/mozilla/fenix/ext/TopSite.kt b/app/src/main/java/org/mozilla/fenix/ext/TopSite.kt index f8a22547f..3af6a701f 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/TopSite.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/TopSite.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.ext -import android.net.Uri import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.settings.SupportUtils @@ -36,31 +35,3 @@ fun List.sort(): List { result } } - -/** - * Returns true if the url contains any query parameters specified by the [searchParameters]. - * - * @param searchParameters [String] of the following forms: - * - "" (empty) - Don't search for any params - * - "key" - Search param named "key" with any or no value - * - "key=" - Search param named "key" with no value - * - "key=value" - Search param named "key" with value "value" - */ -fun TopSite.containsQueryParameters(searchParameters: String): Boolean { - if (searchParameters.isBlank()) { - return false - } - val params = searchParameters.split("=") - val uri = Uri.parse(url) - return when (params.size) { - 1 -> { - uri.queryParameterNames.contains(params.first()) && - uri.getQueryParameter(params.first()).isNullOrBlank() - } - 2 -> { - uri.queryParameterNames.contains(params.first()) && - uri.getQueryParameter(params.first()) == params.last() - } - else -> false - } -} diff --git a/app/src/main/java/org/mozilla/fenix/ext/Uri.kt b/app/src/main/java/org/mozilla/fenix/ext/Uri.kt new file mode 100644 index 000000000..677268121 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/Uri.kt @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import android.net.Uri + +/** + * Returns true if the url contains any query parameters specified by the [searchParameters]. + * + * @param searchParameters [String] of the following forms: + * - "" (empty) - Don't search for any params + * - "key" - Search param named "key" with any or no value + * - "key=" - Search param named "key" with no value + * - "key=value" - Search param named "key" with value "value" + */ +fun Uri.containsQueryParameters(searchParameters: String): Boolean { + if (searchParameters.isBlank()) { + return false + } + val params = searchParameters.split("=") + return when (params.size) { + 1 -> { + this.queryParameterNames.contains(params.first()) && + this.getQueryParameter(params.first()).isNullOrBlank() + } + 2 -> { + this.queryParameterNames.contains(params.first()) && + this.getQueryParameter(params.first()) == params.last() + } + else -> false + } +} 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 c44458e18..fba554a6e 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -8,6 +8,7 @@ import android.annotation.SuppressLint import android.content.res.Configuration import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable +import android.net.Uri import android.os.Bundle import android.os.StrictMode import android.view.Gravity @@ -432,7 +433,7 @@ class HomeFragment : Fragment() { totalSites = settings.topSitesMaxLimit, frecencyConfig = TopSitesFrecencyConfig( FrecencyThresholdOption.SKIP_ONE_TIME_PAGES - ) { !it.containsQueryParameters(settings.frecencyFilterQuery) }, + ) { !Uri.parse(it.url).containsQueryParameters(settings.frecencyFilterQuery) }, providerConfig = TopSitesProviderConfig( showProviderTopSites = settings.showContileFeature, maxThreshold = TOP_SITES_PROVIDER_MAX_THRESHOLD, diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 756341c82..7bccdddf4 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -1128,8 +1128,8 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = "" ) /** - * URLs from the user's history that contain this search param will be hidden - * from the top sites. The value is a string with one of the following forms: + * URLs from the user's history that contain this search param will be hidden. + * The value is a string with one of the following forms: * - "" (empty) - Disable this feature * - "key" - Search param named "key" with any or no value * - "key=" - Search param named "key" with no value @@ -1137,7 +1137,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { */ val frecencyFilterQuery by stringPreference( appContext.getPreferenceKey(R.string.pref_key_frecency_filter_query), - default = "mfadid=adm" + default = "mfadid=adm" // Parameter provided by adM ) /** diff --git a/app/src/test/java/org/mozilla/fenix/ext/TopSiteTest.kt b/app/src/test/java/org/mozilla/fenix/ext/TopSiteTest.kt index 375b0c74a..41bc34fa4 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/TopSiteTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/TopSiteTest.kt @@ -6,8 +6,6 @@ package org.mozilla.fenix.ext import mozilla.components.feature.top.sites.TopSite import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @@ -116,43 +114,4 @@ class TopSiteTest { assertEquals(topSites.sort(), expected) } - - @Test - fun `WHEN containsQueryParameters is invoked THEN the result should be true only if the url contains the search parameters`() { - var searchParameters = "" - val querySite = TopSite.Frecent( - id = 1L, - title = "Search", - url = "test.com/?q=value", - createdAt = 0 - ) - val blankQuerySite = TopSite.Frecent( - id = 1L, - title = "BlankSearch", - url = "test.com/?q=", - createdAt = 0 - ) - - assertFalse(defaultGoogleTopSite.containsQueryParameters(searchParameters)) - assertFalse(querySite.containsQueryParameters(searchParameters)) - assertFalse(blankQuerySite.containsQueryParameters(searchParameters)) - - searchParameters = "q" - - assertFalse(defaultGoogleTopSite.containsQueryParameters(searchParameters)) - assertFalse(querySite.containsQueryParameters(searchParameters)) - assertTrue(blankQuerySite.containsQueryParameters(searchParameters)) - - searchParameters = "q=" - - assertFalse(defaultGoogleTopSite.containsQueryParameters(searchParameters)) - assertFalse(querySite.containsQueryParameters(searchParameters)) - assertTrue(blankQuerySite.containsQueryParameters(searchParameters)) - - searchParameters = "q=value" - - assertFalse(defaultGoogleTopSite.containsQueryParameters(searchParameters)) - assertTrue(querySite.containsQueryParameters(searchParameters)) - assertFalse(blankQuerySite.containsQueryParameters(searchParameters)) - } } diff --git a/app/src/test/java/org/mozilla/fenix/ext/UriTest.kt b/app/src/test/java/org/mozilla/fenix/ext/UriTest.kt new file mode 100644 index 000000000..e67f4de14 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/ext/UriTest.kt @@ -0,0 +1,46 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import android.net.Uri +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.settings.SupportUtils + +@RunWith(FenixRobolectricTestRunner::class) +class UriTest { + @Test + fun `WHEN urlContainsQueryParameters is invoked THEN the result should be true only if the url contains the search parameters`() { + var searchParameters = "" + val googleSite = Uri.parse(SupportUtils.GOOGLE_URL) + val querySite = Uri.parse("test.com/?q=value") + val blankQuerySite = Uri.parse("test.com/?q=") + + assertFalse(googleSite.containsQueryParameters(searchParameters)) + assertFalse(querySite.containsQueryParameters(searchParameters)) + assertFalse(blankQuerySite.containsQueryParameters(searchParameters)) + + searchParameters = "q" + + assertFalse(googleSite.containsQueryParameters(searchParameters)) + assertFalse(querySite.containsQueryParameters(searchParameters)) + assertTrue(blankQuerySite.containsQueryParameters(searchParameters)) + + searchParameters = "q=" + + assertFalse(googleSite.containsQueryParameters(searchParameters)) + assertFalse(querySite.containsQueryParameters(searchParameters)) + assertTrue(blankQuerySite.containsQueryParameters(searchParameters)) + + searchParameters = "q=value" + + assertFalse(googleSite.containsQueryParameters(searchParameters)) + assertTrue(querySite.containsQueryParameters(searchParameters)) + assertFalse(blankQuerySite.containsQueryParameters(searchParameters)) + } +}