From 9d9ff959b53674476d0a90766ddbf9a57ede7aa4 Mon Sep 17 00:00:00 2001 From: Emily Kager Date: Wed, 18 Sep 2019 12:59:30 -0700 Subject: [PATCH] For #5312 - Add Telemetry for Tracking Protection --- app/metrics.yaml | 71 +++++++++++++++++++ .../fenix/browser/BaseBrowserFragment.kt | 3 + .../components/metrics/GleanMetricsService.kt | 21 +++++- .../fenix/components/metrics/Metrics.kt | 12 ++++ .../fenix/exceptions/ExceptionDomains.kt | 5 +- .../fenix/settings/SettingsFragment.kt | 1 + .../settings/TrackingProtectionFragment.kt | 27 ++++++- .../TrackingProtectionPanelDialogFragment.kt | 3 + .../TrackingProtectionPanelView.kt | 3 + docs/metrics.md | 6 ++ 10 files changed, 148 insertions(+), 4 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index 666325d1f..5b82b2ecd 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -1288,6 +1288,77 @@ private_browsing_mode: - fenix-core@mozilla.com expires: "2020-03-01" +tracking_protection: + exception_added: + type: event + description: > + A user added a tracking protection exception through the TP toggle in the panel. + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + panel_settings: + type: event + description: > + A user opened tracking protection settings from the panel. + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + etp_shield: + type: event + description: > + A user pressed the tracking protection shield icon in toolbar. + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + etp_tracker_list: + type: event + description: > + A user pressed into a list of categorized trackers in tracking protection panel. + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + etp_settings: + type: event + description: > + A user opened tracking protection settings through settings. + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + etp_setting_changed: + type: event + description: > + A user added a tracking protection exception through the TP toggle in the panel. + extra_keys: + etp_setting: + description: "The new setting for ETP: strict, standard" + bugs: + - 5312 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" + private_browsing_shortcut: create_shortcut: type: event diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 79c736f31..06a777ab6 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -59,6 +59,7 @@ import org.mozilla.fenix.collections.CreateCollectionViewModel import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.FindInPageIntegration import org.mozilla.fenix.components.StoreProvider +import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.toolbar.BrowserFragmentState import org.mozilla.fenix.components.toolbar.BrowserFragmentStore import org.mozilla.fenix.components.toolbar.BrowserToolbarController @@ -70,6 +71,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarIntegration import org.mozilla.fenix.downloads.DownloadService import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.enterToImmersiveMode +import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings import org.mozilla.fenix.isInExperiment @@ -214,6 +216,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs } browserToolbarView.view.setOnTrackingProtectionClickedListener { + context.metrics.track(Event.TrackingProtectionIconPressed) showTrackingProtectionPanel() } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index ddcfaf29a..170eac6ab 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -37,6 +37,7 @@ import org.mozilla.fenix.GleanMetrics.SearchWidget import org.mozilla.fenix.GleanMetrics.SyncAccount import org.mozilla.fenix.GleanMetrics.SyncAuth import org.mozilla.fenix.GleanMetrics.Tab +import org.mozilla.fenix.GleanMetrics.TrackingProtection import org.mozilla.fenix.ext.components private class EventWrapper>( @@ -377,7 +378,25 @@ private val Event.wrapper: EventWrapper<*>? is Event.TabMediaPause -> EventWrapper( { Tab.mediaPause.record(it) } ) - + is Event.TrackingProtectionTrackerList -> EventWrapper( + { TrackingProtection.etpTrackerList.record(it) } + ) + is Event.TrackingProtectionIconPressed -> EventWrapper( + { TrackingProtection.etpShield.record(it) } + ) + is Event.TrackingProtectionSettingsPanel -> EventWrapper( + { TrackingProtection.panelSettings.record(it) } + ) + is Event.TrackingProtectionSettings -> EventWrapper( + { TrackingProtection.etpSettings.record(it) } + ) + is Event.TrackingProtectionException -> EventWrapper( + { TrackingProtection.exceptionAdded.record(it) } + ) + is Event.TrackingProtectionSettingChanged -> EventWrapper( + { TrackingProtection.etpSettingChanged.record(it) }, + { TrackingProtection.etpSettingChangedKeys.valueOf(it) } + ) // Don't record other events in Glean: is Event.AddBookmark -> null is Event.OpenedBookmark -> null diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt index 50eab0bb1..f16c0e636 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt @@ -20,6 +20,7 @@ import org.mozilla.fenix.GleanMetrics.ErrorPage import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.Library import org.mozilla.fenix.GleanMetrics.SearchShortcuts +import org.mozilla.fenix.GleanMetrics.TrackingProtection import org.mozilla.fenix.R import java.util.Locale @@ -115,6 +116,11 @@ sealed class Event { object PrivateBrowsingStaticShortcutPrivateTab : Event() object TabMediaPlay : Event() object TabMediaPause : Event() + object TrackingProtectionTrackerList : Event() + object TrackingProtectionIconPressed : Event() + object TrackingProtectionSettingsPanel : Event() + object TrackingProtectionSettings : Event() + object TrackingProtectionException : Event() // Interaction events with extras @@ -138,6 +144,12 @@ sealed class Event { } } + data class TrackingProtectionSettingChanged(val setting: Setting) : Event() { + enum class Setting { STRICT, STANDARD } + override val extras: Map? + get() = hashMapOf(TrackingProtection.etpSettingChangedKeys.etpSetting to setting.name) + } + data class OpenedApp(val source: Source) : Event() { enum class Source { APP_ICON, LINK, CUSTOM_TAB } override val extras: Map? diff --git a/app/src/main/java/org/mozilla/fenix/exceptions/ExceptionDomains.kt b/app/src/main/java/org/mozilla/fenix/exceptions/ExceptionDomains.kt index 828bc2c03..ac544b425 100644 --- a/app/src/main/java/org/mozilla/fenix/exceptions/ExceptionDomains.kt +++ b/app/src/main/java/org/mozilla/fenix/exceptions/ExceptionDomains.kt @@ -8,11 +8,13 @@ import android.content.Context import android.content.SharedPreferences import mozilla.components.support.ktx.android.content.PreferencesHolder import mozilla.components.support.ktx.android.content.stringPreference +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.metrics /** * Contains functionality to manage custom domains for allow-list. */ -class ExceptionDomains(context: Context) : PreferencesHolder { +class ExceptionDomains(val context: Context) : PreferencesHolder { override val preferences: SharedPreferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE) @@ -70,6 +72,7 @@ class ExceptionDomains(context: Context) : PreferencesHolder { if (domain in load()) { remove(listOf(domain)) } else { + context.metrics.track(Event.TrackingProtectionException) add(domain) } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 5a7737033..b9e3813c9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -160,6 +160,7 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { navigateToSearchEngineSettings() } resources.getString(pref_key_tracking_protection_settings) -> { + requireContext().metrics.track(Event.TrackingProtectionSettings) navigateToTrackingProtectionSettings() } resources.getString(pref_key_site_permissions) -> { diff --git a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt index 45a57ad1a..769be8707 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt @@ -14,8 +14,10 @@ import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey +import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.settings @@ -60,7 +62,7 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { } bindStrict() - bindRecommended() + bindStandard() setupRadioGroups() val trackingProtectionLearnMore = @@ -88,7 +90,18 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { private fun bindStrict() { val keyStrict = getString(R.string.pref_key_tracking_protection_strict) radioStrict = requireNotNull(findPreference(keyStrict)) + radioStrict.onPreferenceChangeListener = SharedPreferenceUpdater() radioStrict.isVisible = FeatureFlags.etpCategories + radioStrict.onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + context?.metrics?.track( + Event.TrackingProtectionSettingChanged( + Event.TrackingProtectionSettingChanged.Setting.STRICT + ) + ) + return super.onPreferenceChange(preference, newValue) + } + } radioStrict.onInfoClickListener { nav( R.id.trackingProtectionFragment, @@ -101,10 +114,20 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { } } - private fun bindRecommended() { + private fun bindStandard() { val keyStandard = getString(R.string.pref_key_tracking_protection_standard) radioStandard = requireNotNull(findPreference(keyStandard)) radioStandard.isVisible = FeatureFlags.etpCategories + radioStandard.onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + context?.metrics?.track( + Event.TrackingProtectionSettingChanged( + Event.TrackingProtectionSettingChanged.Setting.STANDARD + ) + ) + return super.onPreferenceChange(preference, newValue) + } + } radioStandard.onInfoClickListener { nav( R.id.trackingProtectionFragment, diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelDialogFragment.kt index bb08cf581..3343632a7 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelDialogFragment.kt @@ -29,8 +29,10 @@ import mozilla.components.support.base.feature.BackHandler import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.StoreProvider +import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.exceptions.ExceptionDomains import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.tryGetHostFromUrl @@ -145,6 +147,7 @@ class TrackingProtectionPanelDialogFragment : AppCompatDialogFragment(), BackHan } private fun openTrackingProtectionSettings() { + requireContext().metrics.track(Event.TrackingProtectionSettingsPanel) nav( R.id.trackingProtectionPanelDialogFragment, TrackingProtectionPanelDialogFragmentDirections diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt index 7780c91f6..5b190b574 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt @@ -16,6 +16,8 @@ import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.url import kotlinx.android.synthetic.main.switch_with_description.view.* import mozilla.components.support.ktx.android.net.hostWithoutCommonPrefixes import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CROSS_SITE_TRACKING_COOKIES import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CRYPTOMINERS import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.FINGERPRINTERS @@ -133,6 +135,7 @@ class TrackingProtectionPanelView( override fun onClick(v: View) { val category = getCategory(v) ?: return + v.context.metrics.track(Event.TrackingProtectionTrackerList) interactor.openDetails(category, categoryBlocked = !isLoaded(v)) } diff --git a/docs/metrics.md b/docs/metrics.md index e40bca1b5..c3b72ac06 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -140,6 +140,12 @@ The following metrics are added to the ping: | sync_auth.sign_up |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User registered a new Firefox Account, and was signed into it |[1](https://github.com/mozilla-mobile/fenix/pull/4931#issuecomment-529740300)||2020-03-01 | | tab.media_pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the pause icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266)||2020-03-01 | | tab.media_play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the play icon on a tab from the home screen |[1](https://github.com/mozilla-mobile/fenix/pull/5266)||2020-03-01 | +| tracking_protection.etp_setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a tracking protection exception through the TP toggle in the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)|
  • etp_setting: The new setting for ETP: strict, standard
|2020-03-01 | +| tracking_protection.etp_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings through settings. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-03-01 | +| tracking_protection.etp_shield |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the tracking protection shield icon in toolbar. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-03-01 | +| tracking_protection.etp_tracker_list |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed into a list of categorized trackers in tracking protection panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-03-01 | +| tracking_protection.exception_added |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a tracking protection exception through the TP toggle in the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-03-01 | +| tracking_protection.panel_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user opened tracking protection settings from the panel. |[1](https://github.com/mozilla-mobile/fenix/pull/5414#issuecomment-532847188)||2020-03-01 | ## metrics This is a built-in ping that is assembled out of the box by the Glean SDK.