tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 86c440f1842f068d945df4838e3a2632584600f6
parent 5b07337477c71fe4cb5d5d1cd67a1d36138d488e
Author: John Oberhauser <j.git-global@obez.io>
Date:   Tue, 25 Nov 2025 18:27:34 +0000

Bug 2000661: Removing the legacy distribution provider checker r=android-reviewers,gmalekpour

Differential Revision: https://phabricator.services.mozilla.com/D272907

Diffstat:
Mmobile/android/fenix/app/metrics.yaml | 78------------------------------------------------------------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt | 2--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionIdManager.kt | 39+--------------------------------------
Dmobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionMetricsProvider.kt | 71-----------------------------------------------------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionProviderChecker.kt | 84-------------------------------------------------------------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt | 2--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt | 5-----
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/metrics/MarketingAttributionServiceTest.kt | 6------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/DistributionIdManagerTest.kt | 317-------------------------------------------------------------------------------
Dmobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/LegacyDistributionProviderCheckerTest.kt | 185-------------------------------------------------------------------------------
10 files changed, 1 insertion(+), 788 deletions(-)

diff --git a/mobile/android/fenix/app/metrics.yaml b/mobile/android/fenix/app/metrics.yaml @@ -13039,84 +13039,6 @@ partnerships: notification_emails: - android-probes@mozilla.com expires: never - dt_001_detected: - type: event - description: | - When a dt-001 preinstall is detected using the DefaultDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never - dt_002_detected: - type: event - description: | - When a dt-002 preinstall is detected using the DefaultDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never - dt_003_detected: - type: event - description: | - When a dt-003 preinstall is detected using the DefaultDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never - dt_001_legacy_detected: - type: event - description: | - When a dt-001 preinstall is detected using the LegacyDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never - dt_002_legacy_detected: - type: event - description: | - When a dt-002 preinstall is detected using the LegacyDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never - dt_003_legacy_detected: - type: event - description: | - When a dt-003 preinstall is detected using the LegacyDistributionProviderChecker - data_sensitivity: - - technical - bugs: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1968291 - data_reviews: - - https://phabricator.services.mozilla.com/D252908 - notification_emails: - - android-probes@mozilla.com - expires: never usage: profile_id: diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -48,7 +48,6 @@ import org.mozilla.fenix.distributions.DefaultDistributionBrowserStoreProvider import org.mozilla.fenix.distributions.DefaultDistributionProviderChecker import org.mozilla.fenix.distributions.DefaultDistributionSettings import org.mozilla.fenix.distributions.DistributionIdManager -import org.mozilla.fenix.distributions.LegacyDistributionProviderChecker import org.mozilla.fenix.ext.asRecentTabs import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.filterState @@ -349,7 +348,6 @@ class Components(private val context: Context) { packageManager = context.packageManagerWrapper, browserStoreProvider = DefaultDistributionBrowserStoreProvider(core.store), distributionProviderChecker = DefaultDistributionProviderChecker(context), - legacyDistributionProviderChecker = LegacyDistributionProviderChecker(context), distributionSettings = DefaultDistributionSettings(settings), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionIdManager.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionIdManager.kt @@ -40,7 +40,6 @@ private val logger = Logger(DistributionIdManager::class.simpleName) * @param packageManager device package manager for checking installed packages * @param browserStoreProvider used to update and fetch the stored distribution Id * @param distributionProviderChecker used for checking content providers for a distribution provider - * @param legacyDistributionProviderChecker used for checking content providers for a distribution provider * @param distributionSettings used to persist and retrieve the distribution ID * @param appPreinstalledOnVivoDevice checks if the vivo preinstalled file exists. * @param isDtTelefonicaInstalled checks if the DT telefonica app is installed on the device @@ -50,7 +49,6 @@ class DistributionIdManager( private val packageManager: PackageManagerWrapper, private val browserStoreProvider: DistributionBrowserStoreProvider, private val distributionProviderChecker: DistributionProviderChecker, - private val legacyDistributionProviderChecker: DistributionProviderChecker, private val distributionSettings: DistributionSettings, private val appPreinstalledOnVivoDevice: () -> Boolean = { wasAppPreinstalledOnVivoDevice() }, private val isDtTelefonicaInstalled: () -> Boolean = { isDtTelefonicaInstalled(packageManager) }, @@ -69,9 +67,8 @@ class DistributionIdManager( distribution?.let { return it.id } val provider = distributionProviderChecker.queryProvider() - val providerLegacy = legacyDistributionProviderChecker.queryProvider() - val isProviderDigitalTurbine = isProviderDigitalTurbine(provider) || isProviderDigitalTurbine(providerLegacy) + val isProviderDigitalTurbine = isProviderDigitalTurbine(provider) val savedId = distributionSettings.getDistributionId() @@ -85,45 +82,11 @@ class DistributionIdManager( else -> Distribution.DEFAULT } - recordProviderCheckerEvents( - isProviderDigitalTurbine = isProviderDigitalTurbine(provider), - isLegacyProviderDigitalTurbine = isProviderDigitalTurbine(providerLegacy), - distributionMetricsProvider = DefaultDistributionMetricsProvider(), - ) - setDistribution(distribution) return distribution.id } - @VisibleForTesting - internal fun recordProviderCheckerEvents( - isProviderDigitalTurbine: Boolean, - isLegacyProviderDigitalTurbine: Boolean, - distributionMetricsProvider: DistributionMetricsProvider, - ) { - when { - isProviderDigitalTurbine && isDtTelefonicaInstalled() -> { - distributionMetricsProvider.recordDt001Detected() - } - isLegacyProviderDigitalTurbine && isDtTelefonicaInstalled() -> { - distributionMetricsProvider.recordDt001LegacyDetected() - } - isProviderDigitalTurbine && isDtUsaInstalled() -> { - distributionMetricsProvider.recordDt002Detected() - } - isLegacyProviderDigitalTurbine && isDtUsaInstalled() -> { - distributionMetricsProvider.recordDt002LegacyDetected() - } - isProviderDigitalTurbine -> { - distributionMetricsProvider.recordDt003Detected() - } - isLegacyProviderDigitalTurbine -> { - distributionMetricsProvider.recordDt003LegacyDetected() - } - } - } - /** * Checks the campaign UTM parameters from the google play install referrer response * and updates the distribution ID if necessary diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionMetricsProvider.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionMetricsProvider.kt @@ -1,71 +0,0 @@ -/* 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.distributions - -import org.mozilla.fenix.GleanMetrics.Partnerships - -/** - * A tool for recording metrics that have to do with Distributions - */ -interface DistributionMetricsProvider { - /** - * Record the [Partnerships.dt001Detected] event - */ - fun recordDt001Detected() - - /** - * Record the [Partnerships.dt001LegacyDetected] event - */ - fun recordDt001LegacyDetected() - - /** - * Record the [Partnerships.dt002Detected] event - */ - fun recordDt002Detected() - - /** - * Record the [Partnerships.dt002LegacyDetected] event - */ - fun recordDt002LegacyDetected() - - /** - * Record the [Partnerships.dt003Detected] event - */ - fun recordDt003Detected() - - /** - * Record the [Partnerships.dt003LegacyDetected] event - */ - fun recordDt003LegacyDetected() -} - -/** - * The default implementation of [DistributionMetricsProvider] - */ -class DefaultDistributionMetricsProvider : DistributionMetricsProvider { - override fun recordDt001Detected() { - Partnerships.dt001Detected.record() - } - - override fun recordDt001LegacyDetected() { - Partnerships.dt001LegacyDetected.record() - } - - override fun recordDt002Detected() { - Partnerships.dt002Detected.record() - } - - override fun recordDt002LegacyDetected() { - Partnerships.dt002LegacyDetected.record() - } - - override fun recordDt003Detected() { - Partnerships.dt003Detected.record() - } - - override fun recordDt003LegacyDetected() { - Partnerships.dt003LegacyDetected.record() - } -} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionProviderChecker.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/distributions/DistributionProviderChecker.kt @@ -12,13 +12,8 @@ import mozilla.components.support.base.log.logger.Logger import org.json.JSONException import org.json.JSONObject -private const val FIREFOX_PACKAGE_NAME = "org.mozilla.firefox" -private const val FIREFOX_BETA_PACKAGE_NAME = "org.mozilla.firefox_beta" -private const val FIREFOX_NIGHTLY_PACKAGE_NAME = "org.mozilla.fenix" - private const val ADJUST_CONTENT_PROVIDER_INTENT_ACTION = "com.attribution.REFERRAL_PROVIDER" -private const val PACKAGE_NAME_COLUMN = "package_name" private const val ENCRYPTED_DATA_COLUMN = "encrypted_data" /** @@ -34,85 +29,6 @@ interface DistributionProviderChecker { private val logger = Logger(DistributionProviderChecker::class.simpleName) /** - * Legacy implementation for DistributionProviderChecker - * Keeping this until we know for sure that removing it won't break already existing - * distribution deals. - * - * @param context application context used to get the packageManager and contentResolver - */ -class LegacyDistributionProviderChecker(private val context: Context) : DistributionProviderChecker { - private val classVersion = "Legacy" - - override fun queryProvider(): String? { - logger.info("$classVersion - Starting check...") - val adjustProviderIntent = Intent(ADJUST_CONTENT_PROVIDER_INTENT_ACTION) - val contentProviders = context.packageManager.queryIntentContentProviders(adjustProviderIntent, 0) - val contentResolver = context.contentResolver - - for (resolveInfo in contentProviders) { - val authority = resolveInfo.providerInfo.authority - val uri = "content://$authority/trackers".toUri() - - val projection = arrayOf(PACKAGE_NAME_COLUMN, ENCRYPTED_DATA_COLUMN) - - val contentResolverCursor = contentResolver.query( - uri, - projection, - null, - null, - null, - ) - - contentResolverCursor?.use { cursor -> - cursor.getProvider()?.let { return it } - } - } - - return null - } - - private fun Cursor.getProvider(): String? { - logger.info("$classVersion - Cursor available") - while (moveToNext()) { - logger.info("$classVersion - Checking next cursor...") - val packageNameColumnIndex = getColumnIndex(PACKAGE_NAME_COLUMN) - val dataColumnIndex = getColumnIndex(ENCRYPTED_DATA_COLUMN) - - // Check if columns exist - if (packageNameColumnIndex == -1 || dataColumnIndex == -1) { - logger.info( - "$classVersion - missing columns, " + - "packageName: $packageNameColumnIndex; data: $dataColumnIndex", - ) - break - } - - logger.info("$classVersion - packageName: ${getString(packageNameColumnIndex)}") - - val packageName = getString(packageNameColumnIndex) ?: break - - if (packageName == FIREFOX_PACKAGE_NAME || - packageName == FIREFOX_BETA_PACKAGE_NAME || - packageName == FIREFOX_NIGHTLY_PACKAGE_NAME - ) { - logger.info("$classVersion - data: ${getString(dataColumnIndex)}") - val data = getString(dataColumnIndex) ?: break - try { - val jsonObject = JSONObject(data) - val provider = jsonObject.getString("provider") - logger.info("$classVersion - provider found: $provider") - return provider - } catch (e: JSONException) { - logger.info("$classVersion - JSON expection: $e") - break - } - } - } - return null - } -} - -/** * Default implementation for DistributionProviderChecker * * @param context application context used to get the packageManager and contentResolver diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretDebugSettingsFragment.kt @@ -27,7 +27,6 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.components.metrics.MarketingAttributionService import org.mozilla.fenix.distributions.DefaultDistributionProviderChecker -import org.mozilla.fenix.distributions.LegacyDistributionProviderChecker import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.theme.FirefoxTheme @@ -146,7 +145,6 @@ private fun DebugInfo( Button( onClick = { DefaultDistributionProviderChecker(context).queryProvider() - LegacyDistributionProviderChecker(context).queryProvider() }, ) { Text( diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt @@ -65,10 +65,6 @@ class FenixApplicationTest { override fun queryProvider(): String? = null } - private val testLegacyDistributionProviderChecker = object : DistributionProviderChecker { - override fun queryProvider(): String? = null - } - private val testDistributionSettings = object : DistributionSettings { override fun getDistributionId(): String = "" override fun saveDistributionId(id: String) = Unit @@ -86,7 +82,6 @@ class FenixApplicationTest { packageManager = testContext.packageManagerWrapper, browserStoreProvider = DefaultDistributionBrowserStoreProvider(browserStore), distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/metrics/MarketingAttributionServiceTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/metrics/MarketingAttributionServiceTest.kt @@ -20,7 +20,6 @@ import org.mozilla.fenix.distributions.DistributionSettings internal class MarketingAttributionServiceTest { private var providerValue: String? = null - private var legacyProviderValue: String? = null private var storedId: String? = null private var savedId: String = "" @@ -28,10 +27,6 @@ internal class MarketingAttributionServiceTest { override fun queryProvider(): String? = providerValue } - private val testLegacyDistributionProviderChecker = object : DistributionProviderChecker { - override fun queryProvider(): String? = legacyProviderValue - } - private val testBrowserStoreProvider = object : DistributionBrowserStoreProvider { override fun getDistributionId(): String? = storedId @@ -52,7 +47,6 @@ internal class MarketingAttributionServiceTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, appPreinstalledOnVivoDevice = { true }, ) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/DistributionIdManagerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/DistributionIdManagerTest.kt @@ -4,8 +4,6 @@ package org.mozilla.fenix.distributions -import io.mockk.mockk -import io.mockk.verify import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.utils.ext.packageManagerWrapper import org.junit.After @@ -28,10 +26,6 @@ class DistributionIdManagerTest { override fun queryProvider(): String? = providerValue } - private val testLegacyDistributionProviderChecker = object : DistributionProviderChecker { - override fun queryProvider(): String? = legacyProviderValue - } - private val testBrowserStoreProvider = object : DistributionBrowserStoreProvider { override fun getDistributionId(): String? = storedId @@ -40,8 +34,6 @@ class DistributionIdManagerTest { } } - private val testDistributionMetricsProvider = mockk<DistributionMetricsProvider>(relaxed = true) - private val testDistributionSettings = object : DistributionSettings { override fun getDistributionId(): String = savedId @@ -65,7 +57,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, appPreinstalledOnVivoDevice = { true }, ) @@ -84,7 +75,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, appPreinstalledOnVivoDevice = { true }, ) @@ -100,7 +90,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, appPreinstalledOnVivoDevice = { false }, ) @@ -119,7 +108,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -134,7 +122,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtTelefonicaInstalled = { true }, ) @@ -151,7 +138,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtTelefonicaInstalled = { true }, ) @@ -168,7 +154,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtTelefonicaInstalled = { false }, ) @@ -185,7 +170,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtTelefonicaInstalled = { true }, ) @@ -202,7 +186,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtTelefonicaInstalled = { false }, ) @@ -219,7 +202,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -251,7 +233,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -283,7 +264,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -299,7 +279,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtUsaInstalled = { true }, ) @@ -316,7 +295,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, isDtUsaInstalled = { true }, ) @@ -333,7 +311,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -344,301 +321,11 @@ class DistributionIdManagerTest { } @Test - fun `WHEN the new default provider fails to detect DT telefonica THEN the legacy provider detects it`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - legacyProviderValue = "digital_turbine" - val distributionId = subject.getDistributionId() - - assertEquals("dt-001", distributionId) - } - - @Test - fun `WHEN the new default provider fails to detect DT USA THEN the legacy provider detects it`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtUsaInstalled = { true }, - ) - - legacyProviderValue = "digital_turbine" - val distributionId = subject.getDistributionId() - - assertEquals("dt-002", distributionId) - } - - @Test - fun `WHEN the new default provider fails to detect DT ROW THEN the legacy provider detects it`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - ) - - legacyProviderValue = "digital_turbine" - val distributionId = subject.getDistributionId() - - assertEquals("dt-003", distributionId) - } - - @Test - fun `WHEN DT telefonica is installed AND provider is DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt001Detected() } - } - - @Test - fun `WHEN DT telefonica is installed AND provider is not DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt001LegacyDetected() } - } - - @Test - fun `WHEN DT telefonica is installed AND provider is DT and legacy provider is not DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt001Detected() } - } - - @Test - fun `WHEN DT telefonica is installed AND provider is not DT and legacy provider is not DT THEN the metrics are not sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 0) { testDistributionMetricsProvider.recordDt001Detected() } - verify(exactly = 0) { testDistributionMetricsProvider.recordDt001LegacyDetected() } - } - - @Test - fun `WHEN DT USA is installed AND provider is DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtUsaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt002Detected() } - } - - @Test - fun `WHEN DT USA is installed AND provider is not DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtUsaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt002LegacyDetected() } - } - - @Test - fun `WHEN DT USA is installed AND provider is DT and legacy provider is not DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtUsaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt002Detected() } - } - - @Test - fun `WHEN DT USA is installed AND provider is not DT and legacy provider is not DT THEN the metrics are not sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - isDtTelefonicaInstalled = { true }, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 0) { testDistributionMetricsProvider.recordDt002Detected() } - verify(exactly = 0) { testDistributionMetricsProvider.recordDt002LegacyDetected() } - } - - @Test - fun `WHEN DT ROW is installed AND provider is DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt003Detected() } - } - - @Test - fun `WHEN DT ROW is installed AND provider is not DT and legacy provider is DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = true, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt003LegacyDetected() } - } - - @Test - fun `WHEN DT ROW is installed AND provider is DT and legacy provider is not DT THEN the proper metrics are sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = true, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 1) { testDistributionMetricsProvider.recordDt003Detected() } - } - - @Test - fun `WHEN DT ROW is installed AND provider is not DT and legacy provider is not DT THEN the metrics are not sent`() { - val subject = DistributionIdManager( - packageManager = testContext.packageManagerWrapper, - testBrowserStoreProvider, - distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, - distributionSettings = testDistributionSettings, - ) - - subject.recordProviderCheckerEvents( - isProviderDigitalTurbine = false, - isLegacyProviderDigitalTurbine = false, - distributionMetricsProvider = testDistributionMetricsProvider, - ) - - verify(exactly = 0) { testDistributionMetricsProvider.recordDt003Detected() } - verify(exactly = 0) { testDistributionMetricsProvider.recordDt003LegacyDetected() } - } - - @Test fun `WHEN the play install referrer response has a vivo india campaign THEN the distribution ID is updated`() { val subject = DistributionIdManager( packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -663,7 +350,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -688,7 +374,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -713,7 +398,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) @@ -730,7 +414,6 @@ class DistributionIdManagerTest { packageManager = testContext.packageManagerWrapper, testBrowserStoreProvider, distributionProviderChecker = testDistributionProviderChecker, - legacyDistributionProviderChecker = testLegacyDistributionProviderChecker, distributionSettings = testDistributionSettings, ) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/LegacyDistributionProviderCheckerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/distributions/LegacyDistributionProviderCheckerTest.kt @@ -1,185 +0,0 @@ -/* 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.distributions - -import android.content.ComponentName -import android.content.ContentProvider -import android.content.ContentValues -import android.content.IntentFilter -import android.content.pm.ApplicationInfo -import android.content.pm.ProviderInfo -import android.database.Cursor -import android.database.MatrixCursor -import android.net.Uri -import androidx.core.net.toUri -import mozilla.components.support.test.robolectric.testContext -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.Robolectric -import org.robolectric.RobolectricTestRunner -import org.robolectric.Shadows.shadowOf - -@RunWith(RobolectricTestRunner::class) -class LegacyDistributionProviderCheckerTest { - private val subject = LegacyDistributionProviderChecker(testContext) - - @Test - fun `WHEN a content provider exists THEN the provider name is returned`() { - createFakeContentProviderForAdjust( - packageName = "some.package", - providerName = "myProvider", - ) - - val provider = subject.queryProvider() - - assertEquals("myProvider", provider) - } - - @Test - fun `WHEN a content provider does not exists THEN null is returned`() { - val provider = subject.queryProvider() - - assertEquals(null, provider) - } - - @Test - fun `WHEN a content provider exists but does not have the encrypted_data column THEN null is returned`() { - createFakeContentProviderForAdjust( - packageName = "some.package", - columns = listOf( - Pair("package_name", "org.mozilla.firefox"), - ), - ) - - val provider = subject.queryProvider() - - assertEquals(null, provider) - } - - @Test - fun `WHEN a content provider exists but does not have the package_name column THEN null is returned`() { - createFakeContentProviderForAdjust( - packageName = "some.package", - columns = listOf( - Pair("encrypted_data", "{\"provider\": \"provider\"}"), - ), - ) - - val provider = subject.queryProvider() - - assertEquals(null, provider) - } - - @Test - fun `WHEN the encrypted_data column is not json THEN null is returned`() { - createFakeContentProviderForAdjust( - packageName = "some.package", - columns = listOf( - Pair("package_name", "org.mozilla.firefox"), - Pair("encrypted_data", "not json"), - ), - ) - - val provider = subject.queryProvider() - - assertEquals(null, provider) - } - - @Test - fun `WHEN the encrypted_data column does not have a provider string THEN null is returned`() { - createFakeContentProviderForAdjust( - packageName = "some.package", - columns = listOf( - Pair("package_name", "org.mozilla.firefox"), - Pair("encrypted_data", "{\"test\": \"test\"}"), - ), - ) - - val provider = subject.queryProvider() - - assertEquals(null, provider) - } - - @Suppress("SameParameterValue") - private fun createFakeContentProviderForAdjust( - packageName: String, - providerName: String = "provider", - columns: List<Pair<String, String>> = listOf( - Pair("package_name", "org.mozilla.firefox"), - Pair("encrypted_data", "{\"provider\": \"$providerName\"}"), - ), - ) { - val shadowPackageManager = shadowOf(testContext.packageManager) - - // Register a fake app with a fake content provider - val providerInfo = ProviderInfo().apply { - authority = packageName - name = TestContentProvider::class.qualifiedName - this.packageName = packageName - applicationInfo = ApplicationInfo().apply { - this.packageName = packageName - flags = ApplicationInfo.FLAG_INSTALLED - } - } - shadowPackageManager.addOrUpdateProvider(providerInfo) - - // Insert test data into a fake content provider - val contentProvider = Robolectric.buildContentProvider(TestContentProvider::class.java) - .create(providerInfo) - .get() - val uri = "content://$packageName/trackers".toUri() - val values = ContentValues().apply { - columns.forEach { - put(it.first, it.second) - } - } - contentProvider.insert(uri, values) - - // Make the content provider discoverable via an intent action - shadowPackageManager.addIntentFilterForProvider( - ComponentName(providerInfo.packageName, providerInfo.name), - IntentFilter("com.attribution.REFERRAL_PROVIDER"), - ) - } - - class TestContentProvider : ContentProvider() { - private val database = mutableListOf<ContentValues>() - - override fun onCreate(): Boolean = true - - override fun insert(uri: Uri, values: ContentValues?): Uri { - values?.let { database.add(it) } - return uri - } - - override fun query( - uri: Uri, - projection: Array<String>?, - selection: String?, - selectionArgs: Array<String>?, - sortOrder: String?, - ): Cursor { - val cursor = MatrixCursor(projection ?: arrayOf()) - - for (values in database) { - val row = projection?.map { values.getAsString(it) }?.toTypedArray() ?: emptyArray() - cursor.addRow(row) - } - return cursor - } - - override fun update( - uri: Uri, - values: ContentValues?, - selection: String?, - selectionArgs: Array<String>?, - ): Int = 1 - - override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int = 1 - - override fun getType(uri: Uri): String = "" - } -}