Skip to content

Commit 252c086

Browse files
committed
Bug 2043333 - Add telemetry for stories in stories screen. r=gl
1 parent 198d60d commit 252c086

9 files changed

Lines changed: 63 additions & 14 deletions

File tree

mobile/android/fenix/app/metrics.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9658,6 +9658,12 @@ pocket:
96589658
type: event
96599659
description: |
96609660
The Pocket recommended stories are shown on the home screen.
9661+
extra_keys:
9662+
source:
9663+
type: string
9664+
description: |
9665+
Where the stories impression was recorded.
9666+
One of "homepage" or "stories_screen".
96619667
bugs:
96629668
- https://github.com/mozilla-mobile/fenix/issues/21593
96639669
data_reviews:

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/fake/FakeHomepagePreview.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import org.mozilla.fenix.home.collections.CollectionsState
3535
import org.mozilla.fenix.home.interactor.HomepageInteractor
3636
import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory
3737
import org.mozilla.fenix.home.pocket.PocketState
38+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
3839
import org.mozilla.fenix.home.pocket.interactor.PocketStoriesInteractor
3940
import org.mozilla.fenix.home.privatebrowsing.interactor.PrivateBrowsingInteractor
4041
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab
@@ -140,7 +141,10 @@ internal object FakeHomepagePreview {
140141
storyPosition: Triple<Int, Int, Int>,
141142
) { /* no op */ }
142143

143-
override fun onStoriesShown(storiesShown: List<PocketStory>) { /* no op */ }
144+
override fun onStoriesShown(
145+
storiesShown: List<PocketStory>,
146+
source: StoriesImpressionSource,
147+
) { /* no op */ }
144148

145149
override fun onCategoryClicked(categoryClicked: PocketRecommendedStoriesCategory) { /* no op */ }
146150

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/pocket/controller/PocketStoriesController.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ import java.lang.ref.WeakReference
3232

3333
private const val POCKET_CATEGORIES_SELECTED_AT_A_TIME_COUNT = 8
3434

35+
/**
36+
* The surface where a Pocket stories impression was recorded. Used as the `source` extra on the
37+
* `pocket.home_recs_shown` Glean event.
38+
*/
39+
enum class StoriesImpressionSource(val sourceName: String) {
40+
HOMEPAGE("homepage"),
41+
STORIES_SCREEN("stories_screen"),
42+
}
43+
3544
/**
3645
* Contract for how all user interactions with the Pocket stories feature are to be handled.
3746
*/
@@ -49,8 +58,9 @@ interface PocketStoriesController {
4958
* Callback to decide what should happen as an effect of a new list of stories being shown.
5059
*
5160
* @param storiesShown the new list of [PocketStory]es shown to the user.
61+
* @param source the surface where the stories were shown.
5262
*/
53-
fun handleStoriesShown(storiesShown: List<PocketStory>)
63+
fun handleStoriesShown(storiesShown: List<PocketStory>, source: StoriesImpressionSource)
5464

5565
/**
5666
* Callback allowing to handle a specific [PocketRecommendedStoriesCategory] being clicked by the user.
@@ -138,7 +148,10 @@ internal class DefaultPocketStoriesController(
138148
}
139149
}
140150

141-
override fun handleStoriesShown(storiesShown: List<PocketStory>) {
151+
override fun handleStoriesShown(
152+
storiesShown: List<PocketStory>,
153+
source: StoriesImpressionSource,
154+
) {
142155
// Only report here the impressions for recommended stories.
143156
// Sponsored stories use a different API for more accurate tracking.
144157
appStore.dispatch(
@@ -149,7 +162,9 @@ internal class DefaultPocketStoriesController(
149162
),
150163
)
151164

152-
Pocket.homeRecsShown.record(NoExtras())
165+
Pocket.homeRecsShown.record(
166+
Pocket.HomeRecsShownExtra(source = source.sourceName),
167+
)
153168
}
154169

155170
override fun handleCategoryClick(categoryClicked: PocketRecommendedStoriesCategory) {

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/pocket/interactor/PocketStoriesInteractor.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import mozilla.components.service.pocket.PocketStory
88
import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory
99
import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory
1010
import org.mozilla.fenix.home.pocket.controller.PocketStoriesController
11+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
1112

1213
/**
1314
* Contract for all possible user interactions with the Pocket recommended stories feature.
@@ -26,8 +27,9 @@ interface PocketStoriesInteractor {
2627
* Callback for then new stories are shown to the user.
2728
*
2829
* @param storiesShown The new list of [PocketRecommendedStory]es shown to the user.
30+
* @param source the surface where the stories were shown.
2931
*/
30-
fun onStoriesShown(storiesShown: List<PocketStory>)
32+
fun onStoriesShown(storiesShown: List<PocketStory>, source: StoriesImpressionSource)
3133

3234
/**
3335
* Callback for when the user clicks a specific category.
@@ -66,8 +68,8 @@ class DefaultPocketStoriesInteractor(
6668
controller.handleStoryShown(storyShown, storyPosition)
6769
}
6870

69-
override fun onStoriesShown(storiesShown: List<PocketStory>) {
70-
controller.handleStoriesShown(storiesShown)
71+
override fun onStoriesShown(storiesShown: List<PocketStory>, source: StoriesImpressionSource) {
72+
controller.handleStoriesShown(storiesShown, source)
7173
}
7274

7375
override fun onCategoryClicked(categoryClicked: PocketRecommendedStoriesCategory) {

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/pocket/ui/PocketSection.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.mozilla.fenix.R
2222
import org.mozilla.fenix.compose.home.HomeSectionHeader
2323
import org.mozilla.fenix.home.fake.FakeHomepagePreview
2424
import org.mozilla.fenix.home.pocket.PocketState
25+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
2526
import org.mozilla.fenix.home.pocket.interactor.PocketStoriesInteractor
2627
import org.mozilla.fenix.theme.FirefoxTheme
2728
import org.mozilla.fenix.wallpapers.WallpaperState
@@ -45,7 +46,10 @@ fun PocketSection(
4546
// We should report back when a certain story is actually being displayed.
4647
// Cannot do it reliably so for now we'll just mass report everything as being displayed.
4748
state.stories.let {
48-
interactor.onStoriesShown(storiesShown = it)
49+
interactor.onStoriesShown(
50+
storiesShown = it,
51+
source = StoriesImpressionSource.HOMEPAGE,
52+
)
4953
}
5054
}
5155

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/pocket/ui/StoriesScreen.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import mozilla.components.compose.base.utils.BackInvokedHandler
3434
import org.mozilla.fenix.R
3535
import org.mozilla.fenix.components.appstate.recommendations.ContentRecommendationsState
3636
import org.mozilla.fenix.home.fake.FakeHomepagePreview
37+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
3738
import org.mozilla.fenix.home.pocket.interactor.PocketStoriesInteractor
3839
import org.mozilla.fenix.home.ui.LeftChevronPillButton
3940
import org.mozilla.fenix.theme.FirefoxTheme
@@ -54,6 +55,15 @@ fun StoriesScreen(
5455
interactor.onDiscoverMoreScreenViewed()
5556
}
5657

58+
// We should report back when a certain story is actually being displayed.
59+
// Cannot do it reliably so for now we'll just mass report everything as being displayed.
60+
LaunchedEffect(state.pocketStories) {
61+
interactor.onStoriesShown(
62+
storiesShown = state.pocketStories,
63+
source = StoriesImpressionSource.STORIES_SCREEN,
64+
)
65+
}
66+
5767
BackInvokedHandler {
5868
onNavigationIconClick()
5969
}

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.mozilla.fenix.home.logo.LogoController
1919
import org.mozilla.fenix.home.logo.TrackingProtectionController
2020
import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory
2121
import org.mozilla.fenix.home.pocket.controller.PocketStoriesController
22+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
2223
import org.mozilla.fenix.home.privatebrowsing.controller.PrivateBrowsingController
2324
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab
2425
import org.mozilla.fenix.home.recentsyncedtabs.controller.RecentSyncedTabController
@@ -381,8 +382,8 @@ class SessionControlInteractor(
381382
pocketStoriesController.handleStoryShown(storyShown, storyPosition)
382383
}
383384

384-
override fun onStoriesShown(storiesShown: List<PocketStory>) {
385-
pocketStoriesController.handleStoriesShown(storiesShown)
385+
override fun onStoriesShown(storiesShown: List<PocketStory>, source: StoriesImpressionSource) {
386+
pocketStoriesController.handleStoriesShown(storiesShown, source)
386387
}
387388

388389
override fun onCategoryClicked(categoryClicked: PocketRecommendedStoriesCategory) {

mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.mozilla.fenix.home.logo.LogoController
2121
import org.mozilla.fenix.home.logo.TrackingProtectionController
2222
import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory
2323
import org.mozilla.fenix.home.pocket.controller.PocketStoriesController
24+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
2425
import org.mozilla.fenix.home.privatebrowsing.controller.PrivateBrowsingController
2526
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab
2627
import org.mozilla.fenix.home.recentsyncedtabs.controller.RecentSyncedTabController
@@ -245,9 +246,11 @@ class SessionControlInteractorTest {
245246
fun `GIVEN a PocketStoriesInteractor WHEN stories are shown THEN handle it in a PocketStoriesController`() {
246247
val shownStories: List<PocketStory> = emptyList()
247248

248-
interactor.onStoriesShown(shownStories)
249+
interactor.onStoriesShown(shownStories, StoriesImpressionSource.HOMEPAGE)
249250

250-
verify { pocketStoriesController.handleStoriesShown(shownStories) }
251+
verify {
252+
pocketStoriesController.handleStoriesShown(shownStories, StoriesImpressionSource.HOMEPAGE)
253+
}
251254
}
252255

253256
@Test

mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/pocket/DefaultPocketStoriesControllerTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import org.mozilla.fenix.helpers.FenixGleanTestRule
4141
import org.mozilla.fenix.home.HomeFragmentDirections
4242
import org.mozilla.fenix.home.mars.MARSUseCases
4343
import org.mozilla.fenix.home.pocket.controller.DefaultPocketStoriesController
44+
import org.mozilla.fenix.home.pocket.controller.StoriesImpressionSource
4445
import org.mozilla.fenix.utils.Settings
4546
import org.mozilla.fenix.utils.Stories.markAsOpenedFromHomeScreen
4647
import org.mozilla.fenix.utils.Stories.markAsOpenedFromStoriesScreen
@@ -282,7 +283,7 @@ class DefaultPocketStoriesControllerTest {
282283

283284
assertNull(Pocket.homeRecsShown.testGetValue())
284285

285-
controller.handleStoriesShown(storiesShown)
286+
controller.handleStoriesShown(storiesShown, StoriesImpressionSource.HOMEPAGE)
286287

287288
verify {
288289
store.dispatch(
@@ -297,7 +298,10 @@ class DefaultPocketStoriesControllerTest {
297298

298299
assertNotNull(Pocket.homeRecsShown.testGetValue())
299300
assertEquals(1, Pocket.homeRecsShown.testGetValue()!!.size)
300-
assertNull(Pocket.homeRecsShown.testGetValue()!!.single().extra)
301+
assertEquals(
302+
"homepage",
303+
Pocket.homeRecsShown.testGetValue()!!.single().extra?.get("source"),
304+
)
301305
}
302306

303307
@Test

0 commit comments

Comments
 (0)