From 8928822e99ff09ab45bce8ebab63aead10b7ebde Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Fri, 26 Apr 2019 08:42:20 -0700 Subject: [PATCH] For #975: Adds telemetry for settings toggles (#1896) * For #975: Adds telemetry for settings toggles * For #975: Uses failable constructor --- CHANGELOG.md | 1 + app/metrics.yaml | 20 ++++++++++++++ .../fenix/components/metrics/Metrics.kt | 26 +++++++++++++++++++ .../fenix/settings/SettingsFragment.kt | 13 ++++++++++ 4 files changed, 60 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63da54a03..f04671e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - #1312 - Added a missing edit action for bookmark selections - #974 - Added telemetry for bookmarks - #113 - Added QR code scanner +- #975 - Added telemetry for preference switches ### Changed - #1429 - Updated site permissions ui for MVP diff --git a/app/metrics.yaml b/app/metrics.yaml index c47ea9de8..d79fcbf23 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -580,3 +580,23 @@ custom_tab: notification_emails: - fenix-core@mozilla.com expires: "2020-03-01" + +preferences: + preference_toggled: + type: event + description: > + A user toggled a preference switch in settings + extra_keys: + preference_key: + description: "The preference key for the switch preference the user toggled. We currently track: leakcanary, + make_default_browser, show_search_suggestions, show_visited_sites_bookmarks, remote_debugging, telemetry, + tracking_protection" + enabled: + description: "Whether or not the preference is *now* enabled" + bugs: + - 975 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/1896 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-03-01" \ No newline at end of file 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 30b364fe3..ffcacc46e 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 @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.components.metrics +import android.content.Context import mozilla.components.browser.search.SearchEngine import mozilla.components.support.base.Component import mozilla.components.support.base.facts.Fact @@ -10,6 +11,8 @@ import mozilla.components.support.base.facts.FactProcessor import mozilla.components.support.base.facts.Facts import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.BuildConfig +import org.mozilla.fenix.R +import java.lang.IllegalArgumentException sealed class Event { @@ -72,6 +75,29 @@ sealed class Event { object CustomTabsMenuOpened : Event() object UriOpened : Event() + data class PreferenceToggled(val preferenceKey: String, val enabled: Boolean, val context: Context) : Event() { + private val switchPreferenceTelemetryAllowList = listOf( + context.getString(R.string.pref_key_leakcanary), + context.getString(R.string.pref_key_make_default_browser), + context.getString(R.string.pref_key_show_search_suggestions), + context.getString(R.string.pref_key_show_visited_sites_bookmarks), + context.getString(R.string.pref_key_remote_debugging), + context.getString(R.string.pref_key_telemetry), + context.getString(R.string.pref_key_tracking_protection) + ) + + override val extras: Map? + get() = mapOf( + "preferenceKey" to preferenceKey, + "enabled" to enabled.toString() + ) + + init { + // If the event is not in the allow list, we don't want to track it + if (!switchPreferenceTelemetryAllowList.contains(preferenceKey)) { throw IllegalArgumentException() } + } + } + // Interaction Events data class SearchBarTapped(val source: Source) : Event() { enum class Source { HOME, BROWSER } 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 150764f3f..1d111429f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -48,6 +48,8 @@ import org.mozilla.fenix.R.string.pref_key_account import org.mozilla.fenix.R.string.pref_key_account_category import org.mozilla.fenix.R.string.pref_key_search_engine_settings import org.mozilla.fenix.R.string.pref_key_tracking_protection_settings +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.components import org.mozilla.fenix.utils.ItsNotBrokenSnack @SuppressWarnings("TooManyFunctions") @@ -60,6 +62,17 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse super.onCreate(savedInstanceState) job = Job() updateSignInVisibility() + + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener { sharedPreferences, key -> + try { + context?.let { + it.components.analytics.metrics.track(Event.PreferenceToggled + (key, sharedPreferences.getBoolean(key, false), it)) + } + } catch (e: IllegalArgumentException) { + // The event is not tracked + } + } } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {