For #24701 - Remove Event.wrapper for Pocket related telemetry

pull/543/head
Alexandru2909 2 years ago committed by mergify[bot]
parent 06fba96dfb
commit e558ec279a

@ -5377,9 +5377,11 @@ pocket:
User tapped a Pocket recommended story to be opened.
extra_keys:
times_shown:
type: string
description: |
How many times was this story shown, including current.
position:
type: string
description: |
Position of the clicked story in the list shown.
Uses the [row x column] matrix notation.
@ -5398,12 +5400,15 @@ pocket:
User tapped a Pocket stories category to filter stories.
extra_keys:
category_name:
type: string
description: |
Pocket set topic name representing the just clicked category.
selected_total:
type: string
description: |
How many categories were selected before this being tapped.
new_state:
type: string
description: |
Category's new state after being tapped.
Possible values: [selected], [deselected].

@ -8,7 +8,6 @@ import mozilla.components.browser.state.search.SearchEngine
import org.mozilla.fenix.GleanMetrics.Autoplay
import org.mozilla.fenix.GleanMetrics.ContextMenu
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.GleanMetrics.SearchTerms
import java.util.Locale
@ -22,37 +21,6 @@ sealed class Event {
object AddBookmark : Event()
object HistoryHighlightOpened : Event()
object HistorySearchGroupOpened : Event()
object PocketTopSiteClicked : Event()
object PocketTopSiteRemoved : Event()
object PocketHomeRecsShown : Event()
object PocketHomeRecsDiscoverMoreClicked : Event()
object PocketHomeRecsLearnMoreClicked : Event()
data class PocketHomeRecsStoryClicked(
val timesShown: Long,
val storyPosition: Pair<Int, Int>,
) : Event() {
override val extras: Map<Pocket.homeRecsStoryClickedKeys, String>
get() = mapOf(
Pocket.homeRecsStoryClickedKeys.timesShown to timesShown.toString(),
Pocket.homeRecsStoryClickedKeys.position to "${storyPosition.first}x${storyPosition.second}"
)
}
data class PocketHomeRecsCategoryClicked(
val categoryname: String,
val previousSelectedCategoriesTotal: Int,
val isSelectedNextState: Boolean
) : Event() {
override val extras: Map<Pocket.homeRecsCategoryClickedKeys, String>
get() = mapOf(
Pocket.homeRecsCategoryClickedKeys.categoryName to categoryname,
Pocket.homeRecsCategoryClickedKeys.selectedTotal to previousSelectedCategoriesTotal.toString(),
Pocket.homeRecsCategoryClickedKeys.newState to when (isSelectedNextState) {
true -> "selected"
false -> "deselected"
}
)
}
object SearchWidgetInstalled : Event()
object ProgressiveWebAppOpenFromHomescreenTap : Event()

@ -20,7 +20,6 @@ import org.mozilla.fenix.GleanMetrics.HomeMenu
import org.mozilla.fenix.GleanMetrics.HomeScreen
import org.mozilla.fenix.GleanMetrics.Metrics
import org.mozilla.fenix.GleanMetrics.Pings
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.GleanMetrics.ProgressiveWebApp
import org.mozilla.fenix.GleanMetrics.RecentBookmarks
import org.mozilla.fenix.GleanMetrics.RecentSearches
@ -103,29 +102,6 @@ private val Event.wrapper: EventWrapper<*>?
{ ContextMenu.itemTappedKeys.valueOf(it) }
)
is Event.PocketTopSiteClicked -> EventWrapper<NoExtraKeys>(
{ Pocket.pocketTopSiteClicked.record(it) }
)
is Event.PocketTopSiteRemoved -> EventWrapper<NoExtraKeys>(
{ Pocket.pocketTopSiteRemoved.record(it) }
)
is Event.PocketHomeRecsShown -> EventWrapper<NoExtraKeys>(
{ Pocket.homeRecsShown.record(it) }
)
is Event.PocketHomeRecsLearnMoreClicked -> EventWrapper<NoExtraKeys>(
{ Pocket.homeRecsLearnMoreClicked.record(it) }
)
is Event.PocketHomeRecsDiscoverMoreClicked -> EventWrapper<NoExtraKeys>(
{ Pocket.homeRecsDiscoverClicked.record(it) }
)
is Event.PocketHomeRecsStoryClicked -> EventWrapper(
{ Pocket.homeRecsStoryClicked.record(it) },
{ Pocket.homeRecsStoryClickedKeys.valueOf(it) }
)
is Event.PocketHomeRecsCategoryClicked -> EventWrapper(
{ Pocket.homeRecsCategoryClicked.record(it) },
{ Pocket.homeRecsCategoryClickedKeys.valueOf(it) }
)
is Event.AutoPlaySettingVisited -> EventWrapper<NoExtraKeys>(
{ Autoplay.visitedSetting.record(it) }
)

@ -386,7 +386,6 @@ class HomeFragment : Fragment() {
homeActivity = activity,
appStore = components.appStore,
navController = findNavController(),
metrics = requireComponents.analytics.metrics
)
)

@ -6,14 +6,14 @@ package org.mozilla.fenix.home.pocket
import androidx.annotation.VisibleForTesting
import androidx.navigation.NavController
import mozilla.components.service.glean.private.NoExtras
import mozilla.components.service.pocket.PocketRecommendedStory
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
/**
* Contract for how all user interactions with the Pocket recommended stories feature are to be handled.
@ -67,11 +67,10 @@ internal class DefaultPocketStoriesController(
private val homeActivity: HomeActivity,
private val appStore: AppStore,
private val navController: NavController,
private val metrics: MetricController
) : PocketStoriesController {
override fun handleStoriesShown(storiesShown: List<PocketRecommendedStory>) {
appStore.dispatch(AppAction.PocketStoriesShown(storiesShown))
metrics.track(Event.PocketHomeRecsShown)
Pocket.homeRecsShown.record(NoExtras())
}
override fun handleCategoryClick(categoryClicked: PocketRecommendedStoriesCategory) {
@ -80,11 +79,11 @@ internal class DefaultPocketStoriesController(
// First check whether the category is clicked to be deselected.
if (initialCategoriesSelections.map { it.name }.contains(categoryClicked.name)) {
appStore.dispatch(AppAction.DeselectPocketStoriesCategory(categoryClicked.name))
metrics.track(
Event.PocketHomeRecsCategoryClicked(
categoryClicked.name,
initialCategoriesSelections.size,
false
Pocket.homeRecsCategoryClicked.record(
Pocket.HomeRecsCategoryClickedExtra(
categoryName = categoryClicked.name,
newState = "deselected",
selectedTotal = initialCategoriesSelections.size.toString()
)
)
return
@ -105,11 +104,11 @@ internal class DefaultPocketStoriesController(
// Finally update the selection.
appStore.dispatch(AppAction.SelectPocketStoriesCategory(categoryClicked.name))
metrics.track(
Event.PocketHomeRecsCategoryClicked(
categoryClicked.name,
initialCategoriesSelections.size,
true
Pocket.homeRecsCategoryClicked.record(
Pocket.HomeRecsCategoryClickedExtra(
categoryName = categoryClicked.name,
newState = "selected",
selectedTotal = initialCategoriesSelections.size.toString()
)
)
}
@ -120,10 +119,10 @@ internal class DefaultPocketStoriesController(
) {
dismissSearchDialogIfDisplayed()
homeActivity.openToBrowserAndLoad(storyClicked.url, true, BrowserDirection.FromHome)
metrics.track(
Event.PocketHomeRecsStoryClicked(
storyClicked.timesShown.inc(),
storyPosition
Pocket.homeRecsStoryClicked.record(
Pocket.HomeRecsStoryClickedExtra(
position = "${storyPosition.first}x${storyPosition.second}",
timesShown = storyClicked.timesShown.inc().toString()
)
)
}
@ -131,13 +130,13 @@ internal class DefaultPocketStoriesController(
override fun handleLearnMoreClicked(link: String) {
dismissSearchDialogIfDisplayed()
homeActivity.openToBrowserAndLoad(link, true, BrowserDirection.FromHome)
metrics.track(Event.PocketHomeRecsLearnMoreClicked)
Pocket.homeRecsLearnMoreClicked.record(NoExtras())
}
override fun handleDiscoverMoreClicked(link: String) {
dismissSearchDialogIfDisplayed()
homeActivity.openToBrowserAndLoad(link, true, BrowserDirection.FromHome)
metrics.track(Event.PocketHomeRecsDiscoverMoreClicked)
Pocket.homeRecsDiscoverClicked.record(NoExtras())
}
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)

@ -33,6 +33,7 @@ import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.GleanMetrics.Collections
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.Pings
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.GleanMetrics.TopSites
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
@ -376,7 +377,7 @@ class DefaultSessionControlController(
override fun handleRemoveTopSiteClicked(topSite: TopSite) {
TopSites.remove.record(NoExtras())
when (topSite.url) {
SupportUtils.POCKET_TRENDING_URL -> metrics.track(Event.PocketTopSiteRemoved)
SupportUtils.POCKET_TRENDING_URL -> Pocket.pocketTopSiteRemoved.record(NoExtras())
SupportUtils.GOOGLE_URL -> TopSites.googleTopSiteRemoved.record(NoExtras())
SupportUtils.BAIDU_URL -> TopSites.baiduTopSiteRemoved.record(NoExtras())
}
@ -413,7 +414,7 @@ class DefaultSessionControlController(
when (topSite.url) {
SupportUtils.GOOGLE_URL -> TopSites.openGoogleSearchAttribution.record(NoExtras())
SupportUtils.BAIDU_URL -> TopSites.openBaiduSearchAttribution.record(NoExtras())
SupportUtils.POCKET_TRENDING_URL -> metrics.track(Event.PocketTopSiteClicked)
SupportUtils.POCKET_TRENDING_URL -> Pocket.pocketTopSiteClicked.record(NoExtras())
}
val availableEngines = getAvailableSearchEngines()

@ -11,18 +11,29 @@ import io.mockk.spyk
import io.mockk.verify
import io.mockk.verifyOrder
import mozilla.components.service.pocket.PocketRecommendedStory
import mozilla.components.support.test.robolectric.testContext
import mozilla.telemetry.glean.testing.GleanTestRule
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.appstate.AppState
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) // For gleanTestRule
class DefaultPocketStoriesControllerTest {
val metrics: MetricController = mockk(relaxed = true)
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Test
fun `GIVEN a category is selected WHEN that same category is clicked THEN deselect it and record telemetry`() {
@ -37,12 +48,22 @@ class DefaultPocketStoriesControllerTest {
)
)
)
val controller = DefaultPocketStoriesController(mockk(), store, mockk(), metrics)
val controller = DefaultPocketStoriesController(mockk(), store, mockk())
assertFalse(Pocket.homeRecsCategoryClicked.testHasValue())
controller.handleCategoryClick(category2)
verify(exactly = 0) { store.dispatch(AppAction.SelectPocketStoriesCategory(category2.name)) }
verify { store.dispatch(AppAction.DeselectPocketStoriesCategory(category2.name)) }
verify { metrics.track(Event.PocketHomeRecsCategoryClicked(category2.name, 1, false)) }
assertTrue(Pocket.homeRecsCategoryClicked.testHasValue())
val event = Pocket.homeRecsCategoryClicked.testGetValue()
assertEquals(1, event.size)
assertTrue(event.single().extra!!.containsKey("category_name"))
assertEquals(category2.name, event.single().extra!!["category_name"])
assertTrue(event.single().extra!!.containsKey("new_state"))
assertEquals("deselected", event.single().extra!!["new_state"])
assertTrue(event.single().extra!!.containsKey("selected_total"))
assertEquals("1", event.single().extra!!["selected_total"])
}
@Test
@ -65,13 +86,23 @@ class DefaultPocketStoriesControllerTest {
)
)
)
val controller = DefaultPocketStoriesController(mockk(), store, mockk(), metrics)
val controller = DefaultPocketStoriesController(mockk(), store, mockk())
assertFalse(Pocket.homeRecsCategoryClicked.testHasValue())
controller.handleCategoryClick(PocketRecommendedStoriesCategory(newSelectedCategory.name))
verify { store.dispatch(AppAction.DeselectPocketStoriesCategory(oldestSelectedCategory.name)) }
verify { store.dispatch(AppAction.SelectPocketStoriesCategory(newSelectedCategory.name)) }
verify { metrics.track(Event.PocketHomeRecsCategoryClicked(newSelectedCategory.name, 8, true)) }
assertTrue(Pocket.homeRecsCategoryClicked.testHasValue())
val event = Pocket.homeRecsCategoryClicked.testGetValue()
assertEquals(1, event.size)
assertTrue(event.single().extra!!.containsKey("category_name"))
assertEquals(newSelectedCategory.name, event.single().extra!!["category_name"])
assertTrue(event.single().extra!!.containsKey("new_state"))
assertEquals("selected", event.single().extra!!["new_state"])
assertTrue(event.single().extra!!.containsKey("selected_total"))
assertEquals("8", event.single().extra!!["selected_total"])
}
@Test
@ -93,25 +124,37 @@ class DefaultPocketStoriesControllerTest {
)
)
val newSelectedCategoryName = "newSelectedCategory"
val controller = DefaultPocketStoriesController(mockk(), store, mockk(), metrics)
val controller = DefaultPocketStoriesController(mockk(), store, mockk())
controller.handleCategoryClick(PocketRecommendedStoriesCategory(newSelectedCategoryName))
verify(exactly = 0) { store.dispatch(AppAction.DeselectPocketStoriesCategory(oldestSelectedCategory.name)) }
verify { store.dispatch(AppAction.SelectPocketStoriesCategory(newSelectedCategoryName)) }
verify { metrics.track(Event.PocketHomeRecsCategoryClicked(newSelectedCategoryName, 7, true)) }
assertTrue(Pocket.homeRecsCategoryClicked.testHasValue())
val event = Pocket.homeRecsCategoryClicked.testGetValue()
assertEquals(1, event.size)
assertTrue(event.single().extra!!.containsKey("category_name"))
assertEquals(newSelectedCategoryName, event.single().extra!!["category_name"])
assertTrue(event.single().extra!!.containsKey("new_state"))
assertEquals("selected", event.single().extra!!["new_state"])
assertTrue(event.single().extra!!.containsKey("selected_total"))
assertEquals("7", event.single().extra!!["selected_total"])
}
@Test
fun `WHEN new stories are shown THEN update the State and record telemetry`() {
val store = spyk(AppStore())
val controller = DefaultPocketStoriesController(mockk(), store, mockk(), metrics)
val controller = DefaultPocketStoriesController(mockk(), store, mockk())
val storiesShown: List<PocketRecommendedStory> = mockk()
assertFalse(Pocket.homeRecsShown.testHasValue())
controller.handleStoriesShown(storiesShown)
verify { store.dispatch(AppAction.PocketStoriesShown(storiesShown)) }
verify { metrics.track(Event.PocketHomeRecsShown) }
assertTrue(Pocket.homeRecsShown.testHasValue())
assertEquals(1, Pocket.homeRecsShown.testGetValue().size)
assertNull(Pocket.homeRecsShown.testGetValue().single().extra)
}
@Test
@ -126,36 +169,49 @@ class DefaultPocketStoriesControllerTest {
timesShown = 123
)
val homeActivity: HomeActivity = mockk(relaxed = true)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true), metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true))
assertFalse(Pocket.homeRecsStoryClicked.testHasValue())
controller.handleStoryClicked(story, 1 to 2)
verify { homeActivity.openToBrowserAndLoad(story.url, true, BrowserDirection.FromHome) }
metrics.track(Event.PocketHomeRecsStoryClicked(story.timesShown, 1 to 2))
assertTrue(Pocket.homeRecsStoryClicked.testHasValue())
val event = Pocket.homeRecsStoryClicked.testGetValue()
assertEquals(1, event.size)
assertTrue(event.single().extra!!.containsKey("position"))
assertEquals("1x2", event.single().extra!!["position"])
assertTrue(event.single().extra!!.containsKey("times_shown"))
assertEquals(story.timesShown.inc().toString(), event.single().extra!!["times_shown"])
}
@Test
fun `WHEN discover more is clicked then open that using HomeActivity and record telemetry`() {
val link = "http://getpocket.com/explore"
val homeActivity: HomeActivity = mockk(relaxed = true)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true), metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true))
assertFalse(Pocket.homeRecsDiscoverClicked.testHasValue())
controller.handleDiscoverMoreClicked(link)
verify { homeActivity.openToBrowserAndLoad(link, true, BrowserDirection.FromHome) }
metrics.track(Event.PocketHomeRecsDiscoverMoreClicked)
assertTrue(Pocket.homeRecsDiscoverClicked.testHasValue())
assertEquals(1, Pocket.homeRecsDiscoverClicked.testGetValue().size)
assertNull(Pocket.homeRecsDiscoverClicked.testGetValue().single().extra)
}
@Test
fun `WHEN learn more is clicked then open that using HomeActivity and record telemetry`() {
val link = "https://www.mozilla.org/en-US/firefox/pocket/"
val homeActivity: HomeActivity = mockk(relaxed = true)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true), metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), mockk(relaxed = true))
assertFalse(Pocket.homeRecsLearnMoreClicked.testHasValue())
controller.handleLearnMoreClicked(link)
verify { homeActivity.openToBrowserAndLoad(link, true, BrowserDirection.FromHome) }
metrics.track(Event.PocketHomeRecsLearnMoreClicked)
assertTrue(Pocket.homeRecsLearnMoreClicked.testHasValue())
assertNull(Pocket.homeRecsLearnMoreClicked.testGetValue().single().extra)
}
@Test
@ -166,7 +222,7 @@ class DefaultPocketStoriesControllerTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.searchDialogFragment
}
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController, metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController)
controller.handleStoryClicked(story, 1 to 2)
@ -184,7 +240,7 @@ class DefaultPocketStoriesControllerTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.searchDialogFragment
}
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController, metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController)
controller.handleDiscoverMoreClicked(link)
@ -202,7 +258,7 @@ class DefaultPocketStoriesControllerTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.searchDialogFragment
}
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController, metrics)
val controller = DefaultPocketStoriesController(homeActivity, mockk(), navController)
controller.handleLearnMoreClicked(link)
@ -218,7 +274,7 @@ class DefaultPocketStoriesControllerTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.searchDialogFragment
}
val controller = DefaultPocketStoriesController(mockk(), mockk(), navController, mockk())
val controller = DefaultPocketStoriesController(mockk(), mockk(), navController)
controller.dismissSearchDialogIfDisplayed()
@ -228,7 +284,7 @@ class DefaultPocketStoriesControllerTest {
@Test
fun `GIVEN search dialog is not currently focused WHEN dismissSearchDialogIfDisplayed is called THEN do nothing`() {
val navController: NavController = mockk(relaxed = true)
val controller = DefaultPocketStoriesController(mockk(), mockk(), navController, mockk())
val controller = DefaultPocketStoriesController(mockk(), mockk(), navController)
controller.dismissSearchDialogIfDisplayed()

Loading…
Cancel
Save