diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt index f6190e6a11..e3de6ecd43 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt @@ -182,11 +182,6 @@ sealed class Event { object ChangedToDefaultBrowser : Event() object DefaultBrowserNotifTapped : Event() - object LoginDialogPromptDisplayed : Event() - object LoginDialogPromptCancelled : Event() - object LoginDialogPromptSave : Event() - object LoginDialogPromptNeverSave : Event() - object ProgressiveWebAppOpenFromHomescreenTap : Event() object ProgressiveWebAppInstallAsShortcut : Event() diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index 72aefbdf17..e78cddabf4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -27,7 +27,6 @@ import org.mozilla.fenix.GleanMetrics.ExperimentsDefaultBrowser import org.mozilla.fenix.GleanMetrics.History import org.mozilla.fenix.GleanMetrics.HomeMenu import org.mozilla.fenix.GleanMetrics.HomeScreen -import org.mozilla.fenix.GleanMetrics.LoginDialog import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.GleanMetrics.MediaNotification import org.mozilla.fenix.GleanMetrics.MediaState @@ -132,18 +131,6 @@ private val Event.wrapper: EventWrapper<*>? BrowserSearch.inContent[label].add(1) } ) - is Event.LoginDialogPromptDisplayed -> EventWrapper( - { LoginDialog.displayed.record(it) } - ) - is Event.LoginDialogPromptCancelled -> EventWrapper( - { LoginDialog.cancelled.record(it) } - ) - is Event.LoginDialogPromptSave -> EventWrapper( - { LoginDialog.saved.record(it) } - ) - is Event.LoginDialogPromptNeverSave -> EventWrapper( - { LoginDialog.neverSave.record(it) } - ) is Event.ContextMenuItemTapped -> EventWrapper( { ContextMenu.itemTapped.record(it) }, { ContextMenu.itemTappedKeys.valueOf(it) } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt index 3380b9cb80..4ea4a98a28 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -26,6 +26,7 @@ import mozilla.components.feature.search.telemetry.ads.AdsTelemetry import mozilla.components.feature.search.telemetry.incontent.InContentTelemetry import mozilla.components.feature.syncedtabs.facts.SyncedTabsFacts import mozilla.components.feature.top.sites.facts.TopSitesFacts +import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.Component import mozilla.components.support.base.facts.Action import mozilla.components.support.base.facts.Fact @@ -34,6 +35,7 @@ import mozilla.components.support.base.facts.Facts import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.webextensions.facts.WebExtensionFacts import org.mozilla.fenix.BuildConfig +import org.mozilla.fenix.GleanMetrics.LoginDialog import org.mozilla.fenix.GleanMetrics.PerfAwesomebar import org.mozilla.fenix.search.awesomebar.ShortcutsSuggestionProvider import org.mozilla.fenix.utils.Settings @@ -93,13 +95,33 @@ internal class ReleaseMetricController( init { Facts.registerProcessor(object : FactProcessor { override fun process(fact: Fact) { - fact.toEvent()?.also { - track(it) - } + fact.process() } }) } + @VisibleForTesting + internal fun Fact.process(): Unit = when (component to item) { + Component.FEATURE_PROMPTS to LoginDialogFacts.Items.DISPLAY -> { + LoginDialog.displayed.record(NoExtras()) + } + Component.FEATURE_PROMPTS to LoginDialogFacts.Items.CANCEL -> { + LoginDialog.cancelled.record(NoExtras()) + } + Component.FEATURE_PROMPTS to LoginDialogFacts.Items.NEVER_SAVE -> { + LoginDialog.neverSave.record(NoExtras()) + } + Component.FEATURE_PROMPTS to LoginDialogFacts.Items.SAVE -> { + LoginDialog.saved.record(NoExtras()) + } + else -> { + this.toEvent()?.also { + track(it) + } + Unit + } + } + override fun start(type: MetricServiceType) { val isEnabled = isTelemetryEnabled(type) val isInitialized = isInitialized(type) @@ -158,10 +180,6 @@ internal class ReleaseMetricController( @Suppress("LongMethod", "MaxLineLength") private fun Fact.toEvent(): Event? = when { - Component.FEATURE_PROMPTS == component && LoginDialogFacts.Items.DISPLAY == item -> Event.LoginDialogPromptDisplayed - Component.FEATURE_PROMPTS == component && LoginDialogFacts.Items.CANCEL == item -> Event.LoginDialogPromptCancelled - Component.FEATURE_PROMPTS == component && LoginDialogFacts.Items.NEVER_SAVE == item -> Event.LoginDialogPromptNeverSave - Component.FEATURE_PROMPTS == component && LoginDialogFacts.Items.SAVE == item -> Event.LoginDialogPromptSave Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_FORM_DETECTED == item -> Event.CreditCardFormDetected Component.FEATURE_PROMPTS == component && CreditCardAutofillDialogFacts.Items.AUTOFILL_CREDIT_CARD_SUCCESS == item -> diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt index 7219cc95d1..0f0615d91e 100644 --- a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt @@ -23,16 +23,22 @@ import mozilla.components.support.base.facts.Fact import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.webextensions.facts.WebExtensionFacts +import mozilla.telemetry.glean.testing.GleanTestRule import org.junit.Assert.assertEquals import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.fenix.GleanMetrics.LoginDialog import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class MetricControllerTest { + @get:Rule + val gleanTestRule = GleanTestRule(testContext) + @MockK(relaxUnitFun = true) private lateinit var dataService1: MetricsService @MockK(relaxUnitFun = true) private lateinit var dataService2: MetricsService @MockK(relaxUnitFun = true) private lateinit var marketingService1: MetricsService @@ -511,10 +517,6 @@ class MetricControllerTest { val controller = ReleaseMetricController(emptyList(), { true }, { true }, mockk()) val simpleMappings = listOf( - Triple(Component.FEATURE_PROMPTS, LoginDialogFacts.Items.DISPLAY, Event.LoginDialogPromptDisplayed), - Triple(Component.FEATURE_PROMPTS, LoginDialogFacts.Items.CANCEL, Event.LoginDialogPromptCancelled), - Triple(Component.FEATURE_PROMPTS, LoginDialogFacts.Items.NEVER_SAVE, Event.LoginDialogPromptNeverSave), - Triple(Component.FEATURE_PROMPTS, LoginDialogFacts.Items.SAVE, Event.LoginDialogPromptSave), // CreditCardAutofillDialogFacts.Items is already tested. Triple(Component.FEATURE_CUSTOMTABS, CustomTabsFacts.Items.CLOSE, Event.CustomTabsClosed), Triple(Component.FEATURE_CUSTOMTABS, CustomTabsFacts.Items.ACTION_BUTTON, Event.CustomTabsActionTapped), @@ -536,6 +538,29 @@ class MetricControllerTest { } } + @Test + fun `WHEN processing a fact with FEATURE_PROMPTS component THEN the right metric is recorded with no extras`() { + val controller = ReleaseMetricController(emptyList(), { true }, { true }, mockk()) + val action = mockk(relaxed = true) + val itemsToEvents = listOf( + LoginDialogFacts.Items.DISPLAY to LoginDialog.displayed, + LoginDialogFacts.Items.CANCEL to LoginDialog.cancelled, + LoginDialogFacts.Items.NEVER_SAVE to LoginDialog.neverSave, + LoginDialogFacts.Items.SAVE to LoginDialog.saved, + ) + + itemsToEvents.forEach { (item, event) -> + val fact = Fact(Component.FEATURE_PROMPTS, action, item) + controller.run { + fact.process() + } + + assertEquals(true, event.testHasValue()) + assertEquals(1, event.testGetValue().size) + assertEquals(null, event.testGetValue().single().extra) + } + } + @Test fun `search term group events should be sent to enabled service`() { val controller = ReleaseMetricController(