From 846d618c06e3e05cf72f70d7ed1ec6164fcf9770 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Tue, 15 Dec 2020 11:30:24 -0500 Subject: [PATCH] For #16941 - [Telemetry] Bookmark Counts (#16942) --- app/metrics.yaml | 76 +++++++++++++++++++ .../java/org/mozilla/fenix/HomeActivity.kt | 37 +++++++++ .../components/metrics/GleanMetricsService.kt | 12 +++ .../java/org/mozilla/fenix/utils/Settings.kt | 10 +++ app/src/main/res/values/preference_keys.xml | 3 + docs/metrics.md | 4 + 6 files changed, 142 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index ae64254e30..ad323473d6 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -747,6 +747,82 @@ metrics: notification_emails: - fenix-core@mozilla.com expires: never + mobile_bookmarks_count: + type: counter + lifetime: application + description: | + A counter that indicates how many bookmarks a user has in the mobile + folder. This value will only be set if the user has at least *one* + bookmark. If they have 0, this ping will not get sent, resulting in + a null value. To disambiguate between a failed `mobile_bookmarks_count` + ping and 0 bookmarks, please see `has_mobile_bookmarks`. + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/16941 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16942 + - https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + has_mobile_bookmarks: + type: boolean + lifetime: application + description: | + A boolean that indicates if the user has bookmarks in the mobile folder + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/16941 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16942 + - https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + desktop_bookmarks_count: + type: counter + lifetime: application + description: | + A counter that indicates how many bookmarks a user has in the desktop + folder. This value will only be set if the user has at least *one* + bookmark. If they have 0, this ping will not get sent, resulting in a + null value. To disambiguate between a failed `desktop_bookmarks_count` + ping and 0 bookmarks, please see `has_desktop_bookmarks`. + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/16941 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16942 + - https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" + has_desktop_bookmarks: + type: boolean + lifetime: application + description: | + A boolean that indicates if the user has bookmarks in the desktop folder + send_in_pings: + - metrics + bugs: + - https://github.com/mozilla-mobile/fenix/issues/16941 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16942 + - https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-08-01" top_sites_count: type: counter lifetime: application diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index a5c24db0df..5ca572000e 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -37,12 +37,15 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.search.SearchEngine import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.WebExtensionState import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.EngineView +import mozilla.components.concept.storage.BookmarkNode +import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.feature.contextmenu.DefaultSelectionActionDelegate import mozilla.components.feature.privatemode.notification.PrivateNotificationFeature import mozilla.components.feature.search.BrowserStoreSearchAdapter @@ -82,6 +85,7 @@ import org.mozilla.fenix.home.intent.OpenSpecificTabIntentProcessor import org.mozilla.fenix.home.intent.SpeechProcessingIntentProcessor import org.mozilla.fenix.home.intent.StartSearchIntentProcessor import org.mozilla.fenix.library.bookmarks.BookmarkFragmentDirections +import org.mozilla.fenix.library.bookmarks.DesktopFolders import org.mozilla.fenix.library.history.HistoryFragmentDirections import org.mozilla.fenix.library.recentlyclosed.RecentlyClosedFragmentDirections import org.mozilla.fenix.perf.Performance @@ -340,6 +344,20 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { // https://github.com/mozilla-mobile/android-components/issues/8679 settings().topSitesSize = components.core.topSitesStorage.cachedTopSites.size + lifecycleScope.launch(IO) { + components.core.bookmarksStorage.getTree(BookmarkRoot.Root.id, true)?.let { + val desktopRootNode = DesktopFolders( + applicationContext, + showMobileRoot = false + ).withOptionalDesktopFolders(it) + settings().desktopBookmarksSize = getBookmarkCount(desktopRootNode) + } + + components.core.bookmarksStorage.getTree(BookmarkRoot.Mobile.id, true)?.let { + settings().mobileBookmarksSize = getBookmarkCount(it) + } + } + super.onPause() // Diagnostic breadcrumb for "Display already aquired" crash: @@ -359,6 +377,25 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { BrowsersCache.resetAll() } + private fun getBookmarkCount(node: BookmarkNode): Int { + val children = node.children + return if (children == null) { + 0 + } else { + var count = 0 + + for (child in children) { + if (child.type == BookmarkNodeType.FOLDER) { + count += getBookmarkCount(child) + } else if (child.type == BookmarkNodeType.ITEM) { + count++ + } + } + + count + } + } + override fun onDestroy() { super.onDestroy() 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 e17f1e097e..19c5bd0c0c 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 @@ -789,6 +789,18 @@ class GleanMetricsService( topSitesCount.add(topSitesSize) } + val desktopBookmarksSize = context.settings().desktopBookmarksSize + hasDesktopBookmarks.set(desktopBookmarksSize > 0) + if (desktopBookmarksSize > 0) { + desktopBookmarksCount.add(desktopBookmarksSize) + } + + val mobileBookmarksSize = context.settings().mobileBookmarksSize + hasMobileBookmarks.set(mobileBookmarksSize > 0) + if (mobileBookmarksSize > 0) { + mobileBookmarksCount.add(mobileBookmarksSize) + } + toolbarPosition.set( when (context.settings().toolbarPosition) { ToolbarPosition.BOTTOM -> Event.ToolbarPositionChanged.Position.BOTTOM.name diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 6a27905ded..008f42687e 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -906,6 +906,16 @@ class Settings(private val appContext: Context) : PreferencesHolder { 0 ) + var mobileBookmarksSize by intPreference( + appContext.getPreferenceKey(R.string.pref_key_mobile_bookmarks_size), + 0 + ) + + var desktopBookmarksSize by intPreference( + appContext.getPreferenceKey(R.string.pref_key_desktop_bookmarks_size), + 0 + ) + private var savedLoginsSortingStrategyString by stringPreference( appContext.getPreferenceKey(R.string.pref_key_saved_logins_sorting_strategy), default = SavedLoginsSortingStrategyMenu.Item.AlphabeticallySort.strategyString diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 699e813fcc..b4cb114dfc 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -214,6 +214,9 @@ pref_key_search_count + pref_key_mobile_bookmarks_size + pref_key_desktop_bookmarks_size + pref_key_default_browser pref_key_login_exceptions diff --git a/docs/metrics.md b/docs/metrics.md index 0d89245d85..12b819d195 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -277,10 +277,14 @@ The following metrics are added to the ping: | metrics.close_tab_setting |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string that indicates the setting for tab closing: MANUAL, ONE_DAY, ONE_WEEK, ONE_MONTH |[1](https://github.com/mozilla-mobile/fenix/pull/15811#issuecomment-706402952)||2021-08-01 |2 | | metrics.default_browser |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Is Fenix the default browser? |[1](https://github.com/mozilla-mobile/fenix/pull/1067#issuecomment-474598673), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.default_moz_browser |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The name of the default browser on device if and only if it's a Mozilla owned product |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | +| metrics.desktop_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the desktop folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `desktop_bookmarks_count` ping and 0 bookmarks, please see `has_desktop_bookmarks`. |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | | metrics.distribution_id |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the distribution identifier. This is currently used to identify installs from Mozilla Online. |[1](https://github.com/mozilla-mobile/fenix/issues/16075)||never |1 | +| metrics.has_desktop_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the desktop folder |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | +| metrics.has_mobile_bookmarks |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has bookmarks in the mobile folder |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | | metrics.has_open_tabs |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has any open NORMAL tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/12024), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.has_recent_pwas |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has recently used PWAs. See recently_used_pwa_count for the actual count. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.has_top_sites |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |A boolean that indicates if the user has top sites |[1](https://github.com/mozilla-mobile/fenix/pull/9556), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| metrics.mobile_bookmarks_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many bookmarks a user has in the mobile folder. This value will only be set if the user has at least *one* bookmark. If they have 0, this ping will not get sent, resulting in a null value. To disambiguate between a failed `mobile_bookmarks_count` ping and 0 bookmarks, please see `has_mobile_bookmarks`. |[1](https://github.com/mozilla-mobile/fenix/pull/16942), [2](https://github.com/mozilla-mobile/fenix/pull/16942#issuecomment-742794701)||2021-08-01 |2 | | metrics.mozilla_products |[string_list](https://mozilla.github.io/glean/book/user/metrics/string_list.html) |A list of all the Mozilla products installed on device. We currently scan for: Firefox, Firefox Beta, Firefox Aurora, Firefox Nightly, Firefox Fdroid, Firefox Lite, Reference Browser, Reference Browser Debug, Fenix, Focus, and Lockwise. |[1](https://github.com/mozilla-mobile/fenix/pull/1953/), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 | | metrics.recently_used_pwa_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter that indicates how many PWAs a user has recently used. Threshold for "recency" set in HomeActivity#PWA_RECENTLY_USED_THRESHOLD. Currently we are not told by the OS when a PWA is removed by the user, so we use the "recently used" heuristic to judge how many PWAs are still active, as a proxy for "installed". This value will only be set if the user has at least *one* recently used PWA. If they have 0, this metric will not be sent, resulting in a null value during analysis on the server-side. To disambiguate between a failed `recently_used_pwa_count` metric and 0 recent PWAs, please see `has_recent_pwas`. |[1](https://github.com/mozilla-mobile/fenix/pull/11982#pullrequestreview-437963817), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.search_count |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |The labels for this counter are `.`. If the search engine is bundled with Fenix `search-engine-name` will be the name of the search engine. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be `custom`. `source` will be: `action`, `suggestion`, `widget` or `shortcut` (depending on the source from which the search started). Also added the `other` option for the source but it should never enter on this case. |[1](https://github.com/mozilla-mobile/fenix/pull/1677), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/7310), [4](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 |