diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt index d21115f0db9d..2b148999fa43 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt @@ -21,6 +21,7 @@ import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.GleanMetrics.AdjustAttribution import org.mozilla.fenix.GleanMetrics.Pings +import org.mozilla.fenix.distributions.DistributionAdjustStartupStrategy import org.mozilla.fenix.ext.components import org.mozilla.fenix.utils.Settings @@ -64,8 +65,14 @@ class AdjustMetricsService( // If we skipped the marketing consent screen, enable COPPA compliance to prevent // personal identifiers from being shared with Adjust. - if (distributionIdManager.shouldSkipMarketingConsentScreen()) { - config.enableCoppaCompliance() + when (distributionIdManager.getDistributionAdjustStartupStrategy()) { + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA -> + config.enableCoppaCompliance() + + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_PLAY_STORE_KIDS -> + config.enablePlayStoreKidsCompliance() + + else -> {} } if (!alreadyKnown(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 index b565abfd78cd..59ed1ddb5bd1 100644 --- 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 @@ -9,6 +9,7 @@ import android.os.Build import androidx.annotation.VisibleForTesting import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.utils.ext.PackageManagerWrapper +import org.mozilla.fenix.Config import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.Partnerships import org.mozilla.fenix.components.metrics.MetricController @@ -117,16 +118,42 @@ class DistributionIdManager( * @return true if the marketing consent screen can be skipped during onboarding */ suspend fun shouldSkipMarketingConsentScreen(): Boolean { + val adjustStartupStrategy = getDistributionAdjustStartupStrategy() + + return when (adjustStartupStrategy) { + DistributionAdjustStartupStrategy.NONE, + DistributionAdjustStartupStrategy.SHOW_CONSENT_SCREEN, + -> false + + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_PLAY_STORE_KIDS, + -> true + } + } + + /** + * Get the Adjust startup strategy for the current distribution. + * + * @return the Adjust startup strategy. + */ + suspend fun getDistributionAdjustStartupStrategy(): DistributionAdjustStartupStrategy { val id = Distribution.fromId(getDistributionId()) return when (id) { - Distribution.DEFAULT -> false - Distribution.VIVO_001 -> true - Distribution.DT_001 -> true - Distribution.DT_002 -> true - Distribution.DT_003 -> true - Distribution.AURA_001 -> false - Distribution.XIAOMI_001 -> true + Distribution.DEFAULT -> DistributionAdjustStartupStrategy.NONE + + Distribution.VIVO_001, + Distribution.DT_001, + Distribution.DT_002, + Distribution.DT_003, + Distribution.XIAOMI_001, + -> DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA + + Distribution.AURA_001 -> if (Config.channel.isNightlyOrDebug) { + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_PLAY_STORE_KIDS + } else { + DistributionAdjustStartupStrategy.SHOW_CONSENT_SCREEN + } } } @@ -199,6 +226,25 @@ class DistributionIdManager( } } +/** + * This enum represents how / when adjust starts up for distributions. + */ +enum class DistributionAdjustStartupStrategy { + NONE, + + // Show the adjust data collection consent screen during onboarding and start + // adjust after the user has consented. + SHOW_CONSENT_SCREEN, + + // Start adjust immediately but enabled COPPA mode in adjust. COPPA mode will prevent + // adjust from collecting personal identifiers and sharing data with third parties. + IMMEDIATE_WITH_COPPA, + + // Start adjust immediately but enable Play Store Kids mode in adjust. This mode will prevent + // adjust from collecting personal identifiers. + IMMEDIATE_WITH_PLAY_STORE_KIDS, +} + /** * Checks for a file in the device that indicates if the app was preinstalled on a vivo device */ 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 index d6266f04fca5..ba8a927ed50f 100644 --- 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 @@ -102,12 +102,8 @@ internal class MarketingAttributionServiceTest { distributionIdManager.setDistribution(DistributionIdManager.Distribution.XIAOMI_001) assertFalse(MarketingAttributionService.shouldShowMarketingOnboarding(null, distributionIdManager)) - } - @Test - fun `GIVEN a partnership distribution WHEN we should not skip the marketing screen THEN we do not skip it`() = - runBlocking { distributionIdManager.setDistribution(DistributionIdManager.Distribution.AURA_001) - assertTrue(MarketingAttributionService.shouldShowMarketingOnboarding(null, distributionIdManager)) + assertFalse(MarketingAttributionService.shouldShowMarketingOnboarding(null, distributionIdManager)) } } 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 index 6c7282eab896..8767bd48bbf6 100644 --- 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 @@ -280,12 +280,66 @@ class DistributionIdManagerTest { assertEquals(true, subject.shouldSkipMarketingConsentScreen()) subject.setDistribution(DistributionIdManager.Distribution.AURA_001) - assertEquals(false, subject.shouldSkipMarketingConsentScreen()) + assertEquals(true, subject.shouldSkipMarketingConsentScreen()) subject.setDistribution(DistributionIdManager.Distribution.XIAOMI_001) assertEquals(true, subject.shouldSkipMarketingConsentScreen()) } + @Test + fun `WHEN checking the distribution startup strategy THEN the correct strategy is returned`() = + runBlocking { + val subject = DistributionIdManager( + packageManager = testContext.packageManagerWrapper, + testBrowserStoreProvider, + distributionProviderChecker = testDistributionProviderChecker, + distributionSettings = testDistributionSettings, + metricController = FakeMetricController(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.DEFAULT) + assertEquals( + DistributionAdjustStartupStrategy.NONE, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.VIVO_001) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.DT_001) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.DT_002) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.DT_003) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.AURA_001) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_PLAY_STORE_KIDS, + subject.getDistributionAdjustStartupStrategy(), + ) + + subject.setDistribution(DistributionIdManager.Distribution.XIAOMI_001) + assertEquals( + DistributionAdjustStartupStrategy.IMMEDIATE_WITH_COPPA, + subject.getDistributionAdjustStartupStrategy(), + ) + } + @Test fun `WHEN the provider is aura THEN the proper distribution ID is returned`() = runBlocking {