Skip to content

Commit

Permalink
For mozilla-mobile#21623 - Pocket recommended stories telemetry (mozi…
Browse files Browse the repository at this point in the history
…lla-mobile#22156)

(cherry picked from commit 507801e)

Co-authored-by: Mugurell <Mugurell@users.noreply.github.com>
  • Loading branch information
mergify[bot] and Mugurell committed Oct 26, 2021
1 parent 78b4e75 commit badfa48
Show file tree
Hide file tree
Showing 11 changed files with 414 additions and 69 deletions.
85 changes: 85 additions & 0 deletions app/metrics.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3775,6 +3775,91 @@ pocket:
notification_emails:
- android-probes@mozilla.com
expires: "2022-02-01"
home_recs_shown:
type: event
description: |
The Pocket recommended stories are shown on the home screen.
bugs:
- https://github.com/mozilla-mobile/fenix/issues/21593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/21625#issuecomment-936745506
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: "2022-10-01"
home_recs_story_clicked:
type: event
description: |
User tapped a Pocket recommended story to be opened.
extra_keys:
times_shown:
description: |
How many times was this story shown, including current.
position:
description: |
Position of the clicked story in the list shown.
Uses the [row x column] matrix notation.
bugs:
- https://github.com/mozilla-mobile/fenix/issues/21593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/21625#issuecomment-936745506
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: "2022-10-01"
home_recs_category_clicked:
type: event
description: |
User tapped a Pocket stories category to filter stories.
extra_keys:
category_name:
description: |
Pocket set topic name representing the just clicked category.
selected_total:
description: |
How many categories were selected before this being tapped.
new_state:
description: |
Category's new state after being tapped.
Possible values: [selected], [deselected].
bugs:
- https://github.com/mozilla-mobile/fenix/issues/21593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/21625#issuecomment-936745506
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: "2022-10-01"
home_recs_discover_clicked:
type: event
description: |
User tapped the "Discover more" tile to open a new tab
for more Pocket stories.
bugs:
- https://github.com/mozilla-mobile/fenix/issues/21593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/21625#issuecomment-936745506
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: "2022-10-01"
home_recs_learn_more_clicked:
type: event
description: |
User tapped "Learn more" to open a new tab for Pocket.
bugs:
- https://github.com/mozilla-mobile/fenix/issues/21593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/21625#issuecomment-936745506
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: "2022-10-01"

first_session:
campaign:
Expand Down
30 changes: 30 additions & 0 deletions app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.mozilla.fenix.GleanMetrics.ErrorPage
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.Logins
import org.mozilla.fenix.GleanMetrics.Onboarding
import org.mozilla.fenix.GleanMetrics.Pocket
import org.mozilla.fenix.GleanMetrics.ProgressiveWebApp
import org.mozilla.fenix.GleanMetrics.SearchShortcuts
import org.mozilla.fenix.GleanMetrics.TabsTray
Expand Down Expand Up @@ -127,6 +128,35 @@ sealed class Event {
object WhatsNewTapped : 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 FennecToFenixMigrated : Event()
object AddonsOpenInSettings : Event()
object VoiceSearchTapped : Event()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,23 @@ private val Event.wrapper: EventWrapper<*>?
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.DarkThemeSelected -> EventWrapper(
{ AppTheme.darkThemeSelected.record(it) },
{ AppTheme.darkThemeSelectedKeys.valueOf(it) }
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,8 @@ class HomeFragment : Fragment() {
pocketStoriesController = DefaultPocketStoriesController(
homeActivity = activity,
homeStore = homeFragmentStore,
navController = findNavController()
navController = findNavController(),
metrics = requireComponents.analytics.metrics
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,15 +391,23 @@ class SessionControlInteractor(
controller.handleCustomizeHomeTapped()
}

override fun onCategoryClick(categoryClicked: PocketRecommendedStoriesCategory) {
override fun onStoriesShown(storiesShown: List<PocketRecommendedStory>) {
pocketStoriesController.handleStoriesShown(storiesShown)
}

override fun onCategoryClicked(categoryClicked: PocketRecommendedStoriesCategory) {
pocketStoriesController.handleCategoryClick(categoryClicked)
}

override fun onStoriesShown(storiesShown: List<PocketRecommendedStory>) {
pocketStoriesController.handleStoriesShown(storiesShown)
override fun onStoryClicked(storyClicked: PocketRecommendedStory, storyPosition: Pair<Int, Int>) {
pocketStoriesController.handleStoryClicked(storyClicked, storyPosition)
}

override fun onLearnMoreClicked(link: String) {
pocketStoriesController.handleLearnMoreClicked(link)
}

override fun onExternalLinkClicked(link: String) {
pocketStoriesController.handleExternalLinkClick(link)
override fun onDiscoverMoreClicked(link: String) {
pocketStoriesController.handleDiscoverMoreClicked(link)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.Icon
import androidx.compose.material.Text
Expand Down Expand Up @@ -107,14 +107,15 @@ fun PocketStory(
* @param stories The list of [PocketRecommendedStory]ies to be displayed. Expect a list with 8 items.
* @param contentPadding Dimension for padding the content after it has been clipped.
* This space will be used for shadows and also content rendering when the list is scrolled.
* @param onExternalLinkClicked Callback for when the user taps an element which contains an
* external link for where user can go for more recommendations.
* @param onStoryClicked Callback for when the user taps on a recommended story.
* @param onDiscoverMoreClicked Callback for when the user taps an element which contains an
*/
@Composable
fun PocketStories(
@PreviewParameter(PocketStoryProvider::class) stories: List<PocketRecommendedStory>,
contentPadding: Dp,
onExternalLinkClicked: (String) -> Unit
onStoryClicked: (PocketRecommendedStory, Pair<Int, Int>) -> Unit,
onDiscoverMoreClicked: (String) -> Unit
) {
// Show stories in at most 3 rows but on any number of columns depending on the data received.
val maxRowsNo = 3
Expand All @@ -129,20 +130,20 @@ fun PocketStories(
flingBehavior = flingBehavior,
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
items(storiesToShow) { columnItems ->
itemsIndexed(storiesToShow) { columnIndex, columnItems ->
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
columnItems.forEach { story ->
columnItems.forEachIndexed { rowIndex, story ->
if (story == placeholderStory) {
ListItemTabLargePlaceholder(stringResource(R.string.pocket_stories_placeholder_text)) {
onExternalLinkClicked("https://getpocket.com/explore?$POCKET_FEATURE_UTM_KEY_VALUE")
onDiscoverMoreClicked("https://getpocket.com/explore?$POCKET_FEATURE_UTM_KEY_VALUE")
}
} else {
val uri = Uri.parse(story.url)
.buildUpon()
.appendQueryParameter(URI_PARAM_UTM_KEY, POCKET_STORIES_UTM_VALUE)
.build().toString()
PocketStory(story) {
onExternalLinkClicked(uri)
val uri = Uri.parse(story.url)
.buildUpon()
.appendQueryParameter(URI_PARAM_UTM_KEY, POCKET_STORIES_UTM_VALUE)
.build().toString()
onStoryClicked(it.copy(url = uri), rowIndex to columnIndex)
}
}
}
Expand Down Expand Up @@ -184,13 +185,13 @@ fun PocketStoriesCategories(
* Pocket feature section title.
* Shows a default text about Pocket and offers a external link to learn more.
*
* @param onExternalLinkClicked Callback invoked when the user clicks the "Learn more" link.
* @param onLearnMoreClicked Callback invoked when the user clicks the "Learn more" link.
* Contains the full URL for where the user should be navigated to.
* @param modifier [Modifier] to be applied to the layout.
*/
@Composable
fun PoweredByPocketHeader(
onExternalLinkClicked: (String) -> Unit,
onLearnMoreClicked: (String) -> Unit,
modifier: Modifier = Modifier
) {
val color = when (isSystemInDarkTheme()) {
Expand Down Expand Up @@ -231,7 +232,7 @@ fun PoweredByPocketHeader(
)

ClickableSubstringLink(text, color, linkStartIndex, linkEndIndex) {
onExternalLinkClicked("https://www.mozilla.org/en-US/firefox/pocket/?$POCKET_FEATURE_UTM_KEY_VALUE")
onLearnMoreClicked("https://www.mozilla.org/en-US/firefox/pocket/?$POCKET_FEATURE_UTM_KEY_VALUE")
}
}
}
Expand All @@ -247,7 +248,8 @@ private fun PocketStoriesComposablesPreview() {
PocketStories(
stories = getFakePocketStories(8),
contentPadding = 0.dp,
onExternalLinkClicked = { }
onStoryClicked = { _, _ -> },
onDiscoverMoreClicked = { }
)
Spacer(Modifier.height(10.dp))

Expand Down

0 comments on commit badfa48

Please sign in to comment.