Bug 1883968 - Translations Interaction Telemetry

This patch adds:
* `translations_action` probe
    * Extras:
        * main_flow_toolbar - Interaction with toolbar button
        * main_flow_browser - Interaction with browser menu button
        * page_settings - Interaction with page settings
        * global_settings - Interaction with global settings
        * global_lang_settings - Interaction with language settings
        * global_site_settings - Interaction with site settings
        * downloads - Interaction with downloads
fenix/125.0
ohall-m 2 months ago committed by mergify[bot]
parent b260a91210
commit 0450b126f1

@ -854,6 +854,29 @@ events:
notification_emails:
- android-probes@mozilla.com
expires: never
translations_action:
type: event
description: |
An area inside the translations feature was tapped.
The name of the translations area that the user tapped is stored in extras with the
key `item`.
extra_keys:
item:
description: |
A string containing the name of the item the user tapped. These items
include:
main_flow_toolbar, main_flow_browser, page_settings, global_settings,
global_lang_settings, global_site_settings, downloads
type: string
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1883968
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1883968#c6
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
splash_screen:
first_launch_extended:

@ -230,6 +230,7 @@ class DefaultBrowserToolbarController(
}
override fun handleTranslationsButtonClick() {
Events.translationsAction.record(Events.TranslationsActionExtra("main_flow_toolbar"))
val directions =
BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment(
sessionId = currentSession?.id,

@ -408,6 +408,7 @@ class DefaultBrowserToolbarMenuController(
}
ToolbarMenu.Item.Translate -> {
Events.translationsAction.record(Events.TranslationsActionExtra("main_flow_browser"))
val directions =
BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment(
sessionId = currentSession?.id,

@ -29,7 +29,6 @@ import org.mozilla.fenix.compose.Divider
import org.mozilla.fenix.compose.SwitchWithLabel
import org.mozilla.fenix.compose.annotation.LightDarkPreview
import org.mozilla.fenix.compose.list.TextListItem
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.theme.FirefoxTheme
import java.util.Locale
@ -37,6 +36,7 @@ import java.util.Locale
* Firefox Translation options bottom sheet dialog.
*
* @param translationOptionsList A list of [TranslationSwitchItem]s to display.
* @param showGlobalSettings Whether to show to global settings entry point or not.
* @param onBackClicked Invoked when the user clicks on the back button.
* @param onTranslationSettingsClicked Invoked when the user clicks on the "Translation Settings" button.
* @param aboutTranslationClicked Invoked when the user clicks on the "About Translation" button.
@ -44,6 +44,7 @@ import java.util.Locale
@Composable
fun TranslationOptionsDialog(
translationOptionsList: List<TranslationSwitchItem>,
showGlobalSettings: Boolean,
onBackClicked: () -> Unit,
onTranslationSettingsClicked: () -> Unit,
aboutTranslationClicked: () -> Unit,
@ -66,7 +67,7 @@ fun TranslationOptionsDialog(
)
}
if (FxNimbus.features.translations.value().globalSettingsEnabled) {
if (showGlobalSettings) {
item {
TextListItem(
label = stringResource(id = R.string.translation_option_bottom_sheet_translation_settings),
@ -215,6 +216,7 @@ private fun TranslationSettingsPreview() {
FirefoxTheme {
TranslationOptionsDialog(
translationOptionsList = getTranslationOptionsList(),
showGlobalSettings = true,
onBackClicked = {},
onTranslationSettingsClicked = {},
aboutTranslationClicked = {},

@ -22,13 +22,15 @@ import org.mozilla.fenix.compose.Divider
import org.mozilla.fenix.compose.SwitchWithLabel
import org.mozilla.fenix.compose.annotation.LightDarkPreview
import org.mozilla.fenix.compose.list.TextListItem
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.theme.FirefoxTheme
/**
* Translation Settings Fragment.
*
* @param translationSwitchList list of [TranslationSwitchItem]s to display.
* @param showAutomaticTranslations Show the entry point for the user to change automatic language settings.
* @param showNeverTranslate Show the entry point for the user to change never translate settings.
* @param showDownloads Show the entry point for the user to manage language models.
* @param onAutomaticTranslationClicked Invoked when the user clicks on the "Automatic Translation" button.
* @param onNeverTranslationClicked Invoked when the user clicks on the "Never Translation" button.
* @param onDownloadLanguageClicked Invoked when the user clicks on the "Download Language" button.
@ -37,6 +39,9 @@ import org.mozilla.fenix.theme.FirefoxTheme
@Composable
fun TranslationSettings(
translationSwitchList: List<TranslationSwitchItem>,
showAutomaticTranslations: Boolean,
showNeverTranslate: Boolean,
showDownloads: Boolean,
onAutomaticTranslationClicked: () -> Unit,
onNeverTranslationClicked: () -> Unit,
onDownloadLanguageClicked: () -> Unit,
@ -81,7 +86,7 @@ fun TranslationSettings(
)
}
if (FxNimbus.features.translations.value().globalLangSettingsEnabled) {
if (showAutomaticTranslations) {
item {
TextListItem(
label = stringResource(id = R.string.translation_settings_automatic_translation),
@ -93,7 +98,7 @@ fun TranslationSettings(
}
}
if (FxNimbus.features.translations.value().globalSiteSettingsEnabled) {
if (showNeverTranslate) {
item {
TextListItem(
label = stringResource(
@ -107,7 +112,7 @@ fun TranslationSettings(
}
}
if (FxNimbus.features.translations.value().downloadsEnabled) {
if (showDownloads) {
item {
TextListItem(
label = stringResource(
@ -161,6 +166,9 @@ private fun TranslationSettingsPreview() {
FirefoxTheme {
TranslationSettings(
translationSwitchList = getTranslationSettingsSwitchList(),
showAutomaticTranslations = true,
showNeverTranslate = true,
showDownloads = true,
onAutomaticTranslationClicked = {},
onDownloadLanguageClicked = {},
onNeverTranslationClicked = {},

@ -24,10 +24,12 @@ import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.translate.TranslationPageSettingOperation
import mozilla.components.lib.state.ext.observeAsComposableState
import mozilla.components.support.base.feature.UserInteractionHandler
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.theme.FirefoxTheme
/**
@ -51,19 +53,25 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler {
FirefoxTheme {
TranslationSettings(
translationSwitchList = getTranslationSwitchItemList(),
showAutomaticTranslations = FxNimbus.features.translations.value().globalLangSettingsEnabled,
showNeverTranslate = FxNimbus.features.translations.value().globalSiteSettingsEnabled,
showDownloads = FxNimbus.features.translations.value().downloadsEnabled,
onAutomaticTranslationClicked = {
Events.translationsAction.record(Events.TranslationsActionExtra("global_lang_settings"))
findNavController().navigate(
TranslationSettingsFragmentDirections
.actionTranslationSettingsFragmentToAutomaticTranslationPreferenceFragment(),
)
},
onNeverTranslationClicked = {
Events.translationsAction.record(Events.TranslationsActionExtra("global_site_settings"))
findNavController().navigate(
TranslationSettingsFragmentDirections
.actionTranslationSettingsFragmentToNeverTranslateSitePreferenceFragment(),
)
},
onDownloadLanguageClicked = {
Events.translationsAction.record(Events.TranslationsActionExtra("downloads"))
findNavController().navigate(
TranslationSettingsFragmentDirections
.actionTranslationSettingsFragmentToDownloadLanguagesPreferenceFragment(),

@ -31,7 +31,6 @@ import androidx.compose.ui.unit.dp
import mozilla.components.concept.engine.translate.Language
import mozilla.components.concept.engine.translate.TranslationPageSettings
import org.mozilla.fenix.R
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.theme.FirefoxTheme
private const val BOTTOM_SHEET_HANDLE_WIDTH_PERCENT = 0.1f
@ -136,6 +135,7 @@ internal fun TranslationsOptionsAnimation(
internal fun TranslationsDialog(
translationsDialogState: TranslationsDialogState,
learnMoreUrl: String,
showPageSettings: Boolean,
showFirstTime: Boolean = false,
onSettingClicked: () -> Unit,
onLearnMoreClicked: () -> Unit,
@ -144,10 +144,10 @@ internal fun TranslationsDialog(
onFromSelected: (Language) -> Unit,
onToSelected: (Language) -> Unit,
) {
FxNimbus.features.translations.recordExposure()
TranslationsDialogBottomSheet(
translationsDialogState = translationsDialogState,
learnMoreUrl = learnMoreUrl,
showPageSettings = showPageSettings,
showFirstTimeFlow = showFirstTime,
onSettingClicked = onSettingClicked,
onLearnMoreClicked = onLearnMoreClicked,
@ -161,6 +161,7 @@ internal fun TranslationsDialog(
@Composable
internal fun TranslationsOptionsDialog(
context: Context,
showGlobalSettings: Boolean,
translationPageSettings: TranslationPageSettings? = null,
initialFrom: Language? = null,
onStateChange: (TranslationSettingsOption, Boolean) -> Unit,
@ -169,6 +170,7 @@ internal fun TranslationsOptionsDialog(
aboutTranslationClicked: () -> Unit,
) {
TranslationOptionsDialog(
showGlobalSettings = showGlobalSettings,
translationOptionsList = getTranslationSwitchItemList(
translationPageSettings = translationPageSettings,
initialFrom = initialFrom,

@ -57,7 +57,6 @@ import org.mozilla.fenix.compose.annotation.LightDarkPreview
import org.mozilla.fenix.compose.button.PrimaryButton
import org.mozilla.fenix.compose.button.TertiaryButton
import org.mozilla.fenix.compose.button.TextButton
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.shopping.ui.ReviewQualityCheckInfoCard
import org.mozilla.fenix.shopping.ui.ReviewQualityCheckInfoType
import org.mozilla.fenix.theme.FirefoxTheme
@ -70,6 +69,7 @@ private val ICON_SIZE = 24.dp
*
* @param translationsDialogState The current state of the Translations bottom sheet dialog.
* @param learnMoreUrl The learn more link for translations website.
* @param showPageSettings Whether the entry point to page settings should be shown or not.
* @param showFirstTimeFlow Whether translations first flow should be shown.
* @param onSettingClicked Invoked when the user clicks on the settings button.
* @param onLearnMoreClicked Invoked when the user clicks on the "Learn More" button.
@ -83,6 +83,7 @@ private val ICON_SIZE = 24.dp
fun TranslationsDialogBottomSheet(
translationsDialogState: TranslationsDialogState,
learnMoreUrl: String,
showPageSettings: Boolean,
showFirstTimeFlow: Boolean = false,
onSettingClicked: () -> Unit,
onLearnMoreClicked: () -> Unit,
@ -110,6 +111,7 @@ fun TranslationsDialogBottomSheet(
showFirstTime = showFirstTimeFlow,
)
},
showPageSettings = showPageSettings,
onSettingClicked = onSettingClicked,
)
@ -434,6 +436,7 @@ private fun TranslationsDialogContentInLandscapeMode(
@Composable
private fun TranslationsDialogHeader(
title: String,
showPageSettings: Boolean,
onSettingClicked: () -> Unit,
) {
Row(
@ -450,7 +453,7 @@ private fun TranslationsDialogHeader(
Spacer(modifier = Modifier.width(4.dp))
if (FxNimbus.features.translations.value().pageSettingsEnabled) {
if (showPageSettings) {
IconButton(
onClick = { onSettingClicked() },
modifier = Modifier.size(24.dp),
@ -744,6 +747,7 @@ private fun TranslationsDialogBottomSheetPreview() {
fromLanguages = getTranslateFromLanguageList(),
),
learnMoreUrl = "",
showPageSettings = true,
showFirstTimeFlow = true,
onSettingClicked = {},
onLearnMoreClicked = {},

@ -35,11 +35,13 @@ import mozilla.components.concept.engine.translate.TranslationError
import mozilla.components.lib.state.ext.observeAsComposableState
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.theme.FirefoxTheme
import org.mozilla.fenix.translations.preferences.downloadlanguages.DownloadLanguageFileDialog
@ -142,10 +144,13 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
}
},
) {
FxNimbus.features.translations.recordExposure()
TranslationsDialogContent(
learnMoreUrl = learnMoreUrl,
showPageSettings = FxNimbus.features.translations.value().pageSettingsEnabled,
translationsDialogState = translationsDialogState,
) {
Events.translationsAction.record(Events.TranslationsActionExtra("page_settings"))
translationsVisibility = false
}
}
@ -168,6 +173,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
) {
TranslationsOptionsDialogContent(
learnMoreUrl = learnMoreUrl,
showGlobalSettings = FxNimbus.features.translations.value().globalSettingsEnabled,
initialFrom = translationsDialogState?.initialFrom,
) {
translationsVisibility = true
@ -217,6 +223,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
@Composable
private fun TranslationsDialogContent(
learnMoreUrl: String,
showPageSettings: Boolean,
translationsDialogState: TranslationsDialogState? = null,
onSettingClicked: () -> Unit,
) {
@ -234,6 +241,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
TranslationsDialog(
translationsDialogState = translationsDialogState,
learnMoreUrl = learnMoreUrl,
showPageSettings = showPageSettings,
showFirstTime = requireContext().settings().showFirstTimeTranslation,
onSettingClicked = onSettingClicked,
onLearnMoreClicked = { openBrowserAndLoad(learnMoreUrl) },
@ -316,6 +324,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
@Composable
private fun TranslationsOptionsDialogContent(
learnMoreUrl: String,
showGlobalSettings: Boolean,
initialFrom: Language? = null,
onBackClicked: () -> Unit,
) {
@ -327,6 +336,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
TranslationsOptionsDialog(
context = requireContext(),
translationPageSettings = pageSettingsState,
showGlobalSettings = showGlobalSettings,
initialFrom = initialFrom,
onStateChange = { type, checked ->
translationsDialogStore.dispatch(
@ -338,6 +348,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() {
},
onBackClicked = onBackClicked,
onTranslationSettingsClicked = {
Events.translationsAction.record(Events.TranslationsActionExtra("global_settings"))
findNavController().navigate(
TranslationsDialogFragmentDirections
.actionTranslationsDialogFragmentToTranslationSettingsFragment(

@ -446,6 +446,7 @@ class DefaultBrowserToolbarControllerTest {
verify(exactly = 0) { mockSettings.reviewQualityCheckCfrDisplayTimeInMillis = any() }
}
@Test
fun handleTranslationsButtonClick() {
val controller = createController()
controller.handleTranslationsButtonClick()
@ -457,6 +458,9 @@ class DefaultBrowserToolbarControllerTest {
),
)
}
val telemetry = Events.translationsAction.testGetValue()?.firstOrNull()
assertEquals("main_flow_toolbar", telemetry?.extra?.get("item"))
}
private fun createController(

@ -824,7 +824,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
@Test
fun `WHEN the Translations menu item is pressed THEN navigate to translations flow`() =
fun `WHEN the Translations menu item is pressed THEN navigate to translations flow AND post telemetry`() =
runTest {
val item = ToolbarMenu.Item.Translate
@ -841,6 +841,9 @@ class DefaultBrowserToolbarMenuControllerTest {
),
)
}
val telemetry = Events.translationsAction.testGetValue()?.firstOrNull()
assertEquals("main_flow_browser", telemetry?.extra?.get("item"))
}
private fun createController(

Loading…
Cancel
Save