1
0
Fork 0

For #11479: Record open tabs count in metrics ping (#12024)

master
Sawyer Blatz 2020-06-26 17:15:43 -07:00 committed by GitHub
parent c6415ce18f
commit 8a08cb941e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 70 additions and 3 deletions

View File

@ -689,6 +689,38 @@ metrics:
notification_emails: notification_emails:
- fenix-core@mozilla.com - fenix-core@mozilla.com
expires: "2020-09-01" expires: "2020-09-01"
tabs_open_count:
type: counter
lifetime: application
description: |
A counter that indicates how many NORMAL tabs a user has open. This
value will only be set if the user has at least *one* open tab. If they
have 0, this ping will not get sent, resulting in a null value. To
disambiguate between a failed `tabs_open_count` ping and 0 open tabs,
please see `has_open_tabs`.
send_in_pings:
- metrics
bugs:
- https://github.com/mozilla-mobile/fenix/issues/11479
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12024
notification_emails:
- fenix-core@mozilla.com
expires: "2020-09-01"
has_open_tabs:
type: boolean
lifetime: application
description: |
A boolean that indicates if the user has any open NORMAL tabs.
send_in_pings:
- metrics
bugs:
- https://github.com/mozilla-mobile/fenix/issues/11479
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12024
notification_emails:
- fenix-core@mozilla.com
expires: "2020-09-01"
preferences: preferences:
show_search_suggestions: show_search_suggestions:

View File

@ -12,9 +12,12 @@ import mozilla.components.browser.session.SessionManager
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
import org.mozilla.fenix.utils.Settings
class UriOpenedObserver( class UriOpenedObserver(
private val settings: Settings,
private val owner: LifecycleOwner, private val owner: LifecycleOwner,
private val sessionManager: SessionManager, private val sessionManager: SessionManager,
metrics: MetricController, metrics: MetricController,
@ -22,6 +25,7 @@ class UriOpenedObserver(
) : SessionManager.Observer { ) : SessionManager.Observer {
constructor(activity: FragmentActivity) : this( constructor(activity: FragmentActivity) : this(
activity.applicationContext.settings(),
activity, activity,
activity.components.core.sessionManager, activity.components.core.sessionManager,
activity.metrics, activity.metrics,
@ -41,20 +45,24 @@ class UriOpenedObserver(
} }
override fun onAllSessionsRemoved() { override fun onAllSessionsRemoved() {
settings.setOpenTabsCount(sessionManager.sessions.filter { !it.private }.size)
sessionManager.sessions.forEach { sessionManager.sessions.forEach {
it.unregister(singleSessionObserver) it.unregister(singleSessionObserver)
} }
} }
override fun onSessionAdded(session: Session) { override fun onSessionAdded(session: Session) {
settings.setOpenTabsCount(sessionManager.sessions.filter { !it.private }.size)
session.register(singleSessionObserver, owner) session.register(singleSessionObserver, owner)
} }
override fun onSessionRemoved(session: Session) { override fun onSessionRemoved(session: Session) {
settings.setOpenTabsCount(sessionManager.sessions.filter { !it.private }.size)
session.unregister(singleSessionObserver) session.unregister(singleSessionObserver)
} }
override fun onSessionsRestored() { override fun onSessionsRestored() {
settings.setOpenTabsCount(sessionManager.sessions.filter { !it.private }.size)
sessionManager.sessions.forEach { sessionManager.sessions.forEach {
it.register(singleSessionObserver, owner) it.register(singleSessionObserver, owner)
} }

View File

@ -697,6 +697,12 @@ class GleanMetricsService(private val context: Context) : MetricsService {
searchWidgetInstalled.set(context.settings().searchWidgetInstalled) searchWidgetInstalled.set(context.settings().searchWidgetInstalled)
val openTabsCount = context.settings().openTabsCount
hasOpenTabs.set(openTabsCount > 0)
if (openTabsCount > 0) {
tabsOpenCount.add(openTabsCount)
}
val topSitesSize = context.settings().topSitesSize val topSitesSize = context.settings().topSitesSize
hasTopSites.set(topSitesSize > 0) hasTopSites.set(topSitesSize > 0)
if (topSitesSize > 0) { if (topSitesSize > 0) {

View File

@ -775,6 +775,19 @@ class Settings private constructor(
default = 0 default = 0
) )
fun setOpenTabsCount(count: Int) {
preferences.edit().putInt(
appContext.getPreferenceKey(R.string.pref_key_open_tabs_count),
count
).apply()
}
val openTabsCount: Int
get() = preferences.getInt(
appContext.getPreferenceKey(R.string.pref_key_open_tabs_count),
0
)
private var savedLoginsSortingStrategyString by stringPreference( private var savedLoginsSortingStrategyString by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_saved_logins_sorting_strategy), appContext.getPreferenceKey(R.string.pref_key_saved_logins_sorting_strategy),
default = SavedLoginsFragment.SORTING_STRATEGY_ALPHABETICALLY default = SavedLoginsFragment.SORTING_STRATEGY_ALPHABETICALLY

View File

@ -177,6 +177,8 @@
<string name="pref_key_debug_settings" translatable="false">pref_key_debug_settings</string> <string name="pref_key_debug_settings" translatable="false">pref_key_debug_settings</string>
<string name="pref_key_open_tabs_count" translatable="false">pref_key_open_tabs_count</string>
<string name="pref_key_search_count" translatable="false">pref_key_search_count</string> <string name="pref_key_search_count" translatable="false">pref_key_search_count</string>
<string name="pref_key_search_widget_cfr_display_count" translatable="false">pref_key_search_widget_cfr_display_count</string> <string name="pref_key_search_widget_cfr_display_count" translatable="false">pref_key_search_widget_cfr_display_count</string>
<string name="pref_key_search_widget_cfr_dismiss_count" translatable="false">pref_key_search_widget_cfr_dismiss_count</string> <string name="pref_key_search_widget_cfr_dismiss_count" translatable="false">pref_key_search_widget_cfr_dismiss_count</string>

View File

@ -16,9 +16,11 @@ import org.junit.Test
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
import org.mozilla.fenix.utils.Settings
class TelemetrySessionObserverTest { class TelemetrySessionObserverTest {
private val settings: Settings = mockk(relaxed = true)
private val owner: LifecycleOwner = mockk(relaxed = true) private val owner: LifecycleOwner = mockk(relaxed = true)
private val sessionManager: SessionManager = mockk(relaxed = true) private val sessionManager: SessionManager = mockk(relaxed = true)
private val metrics: MetricController = mockk(relaxed = true) private val metrics: MetricController = mockk(relaxed = true)
@ -29,7 +31,7 @@ class TelemetrySessionObserverTest {
@Before @Before
fun setup() { fun setup() {
singleSessionObserver = singleSessionObserver =
UriOpenedObserver(owner, sessionManager, metrics, ads).singleSessionObserver UriOpenedObserver(settings, owner, sessionManager, metrics, ads).singleSessionObserver
} }
@Test @Test

View File

@ -11,11 +11,13 @@ import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
import org.mozilla.fenix.utils.Settings
class UriOpenedObserverTest { class UriOpenedObserverTest {
private val settings: Settings = mockk(relaxed = true)
private val owner: LifecycleOwner = mockk(relaxed = true) private val owner: LifecycleOwner = mockk(relaxed = true)
private val sessionManager: SessionManager = mockk(relaxed = true) private val sessionManager: SessionManager = mockk(relaxed = true)
private val metrics: MetricController = mockk() private val metrics: MetricController = mockk()
@ -24,7 +26,7 @@ class UriOpenedObserverTest {
@Before @Before
fun setup() { fun setup() {
observer = UriOpenedObserver(owner, sessionManager, metrics, ads) observer = UriOpenedObserver(settings, owner, sessionManager, metrics, ads)
} }
@Test @Test

File diff suppressed because one or more lines are too long