diff --git a/app/metrics.yaml b/app/metrics.yaml index 546aeea5a..2e9ac8bc0 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -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: diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index 4bdaec46c..b3a033569 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -230,6 +230,7 @@ class DefaultBrowserToolbarController( } override fun handleTranslationsButtonClick() { + Events.translationsAction.record(Events.TranslationsActionExtra("main_flow_toolbar")) val directions = BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( sessionId = currentSession?.id, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index 8d12d3139..3682042e1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -408,6 +408,7 @@ class DefaultBrowserToolbarMenuController( } ToolbarMenu.Item.Translate -> { + Events.translationsAction.record(Events.TranslationsActionExtra("main_flow_browser")) val directions = BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( sessionId = currentSession?.id, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationOptionsDialog.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationOptionsDialog.kt index b7af5a76b..308e9f489 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationOptionsDialog.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationOptionsDialog.kt @@ -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, + 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 = {}, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt index be57a95a6..501a56b23 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt @@ -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, + 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 = {}, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt index ae2ac1379..1a0ca285e 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt @@ -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(), diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt index fb0a56d06..f61598cfd 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt @@ -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, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt index 54f545b9e..8ce983377 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt @@ -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 = {}, diff --git a/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt index e6bd08d97..a712bf2e8 100644 --- a/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt @@ -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( diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index c98038b6c..482465cf2 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -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( diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt index 8b1cac0f6..7492877a5 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt @@ -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(