For #27782: add first URI load growth data

This commit is contained in:
MatthewTighe 2022-11-09 13:36:53 -08:00 committed by mergify[bot]
parent 5947344dd2
commit 3c9ba2bbaa
8 changed files with 68 additions and 4 deletions

View File

@ -230,7 +230,7 @@ class Core(
RecentlyClosedMiddleware(recentlyClosedTabsStorage, RECENTLY_CLOSED_MAX),
DownloadMiddleware(context, DownloadService::class.java),
ReaderViewMiddleware(),
TelemetryMiddleware(context.settings()),
TelemetryMiddleware(context.settings(), metrics),
ThumbnailsMiddleware(thumbnailStorage),
UndoMiddleware(context.getUndoDelay()),
RegionMiddleware(context, locationService),

View File

@ -26,5 +26,10 @@ sealed class Event {
* Event recording the first time Firefox has been resumed in a 24 hour period.
*/
object FirstAppOpenForDay : GrowthData("41hl22")
/**
* Event recording the first time a URI is loaded in Firefox in a 24 hour period.
*/
object FirstUriLoadForDay : GrowthData("ja86ek")
}
}

View File

@ -46,6 +46,9 @@ internal class DefaultMetricsStorage(
Event.GrowthData.FirstAppOpenForDay -> {
settings.resumeGrowthLastSent.hasBeenMoreThanDaySince()
}
Event.GrowthData.FirstUriLoadForDay -> {
settings.uriLoadGrowthLastSent.hasBeenMoreThanDaySince()
}
}
}
@ -57,6 +60,9 @@ internal class DefaultMetricsStorage(
Event.GrowthData.FirstAppOpenForDay -> {
settings.resumeGrowthLastSent = System.currentTimeMillis()
}
Event.GrowthData.FirstUriLoadForDay -> {
settings.uriLoadGrowthLastSent = System.currentTimeMillis()
}
}
}

View File

@ -15,13 +15,14 @@ import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.EngineState
import mozilla.components.browser.state.state.SessionState
import mozilla.components.feature.search.telemetry.ads.AdsTelemetry
import mozilla.components.lib.state.Middleware
import mozilla.components.lib.state.MiddlewareContext
import mozilla.components.support.base.android.Clock
import mozilla.components.support.base.log.logger.Logger
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.Metrics
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics
@ -29,10 +30,11 @@ import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics
* [Middleware] to record telemetry in response to [BrowserAction]s.
*
* @property settings reference to the application [Settings].
* @property adsTelemetry reference to [AdsTelemetry] use to record search telemetry.
* @property metrics [MetricController] to pass events that have been mapped from actions
*/
class TelemetryMiddleware(
private val settings: Settings,
private val metrics: MetricController,
) : Middleware<BrowserState, BrowserAction> {
private val logger = Logger("TelemetryMiddleware")
@ -58,6 +60,9 @@ class TelemetryMiddleware(
val tab = context.state.findTabOrCustomTab(action.tabId)
onEngineSessionKilled(context.state, tab)
}
is EngineAction.LoadUrlAction -> {
metrics.track(Event.GrowthData.FirstUriLoadForDay)
}
else -> {
// no-op
}

View File

@ -1423,4 +1423,9 @@ class Settings(private val appContext: Context) : PreferencesHolder {
key = appContext.getPreferenceKey(R.string.pref_key_growth_resume_last_sent),
default = 0,
)
var uriLoadGrowthLastSent by longPreference(
key = appContext.getPreferenceKey(R.string.pref_key_growth_uri_load_last_sent),
default = 0,
)
}

View File

@ -311,4 +311,5 @@
<!-- Growth Data -->
<string name="pref_key_growth_set_as_default" translatable="false">pref_key_growth_set_as_default</string>
<string name="pref_key_growth_resume_last_sent" translatable="false">pref_key_growth_last_resumed</string>
<string name="pref_key_growth_uri_load_last_sent" translatable="false">pref_key_growth_uri_load_last_sent</string>
</resources>

View File

@ -116,4 +116,35 @@ class DefaultMetricsStorageTest {
assertTrue(updateSlot.captured > 0)
}
@Test
fun `GIVEN that it has been less than 24 hours since uri load sent WHEN checked for sending THEN will not be sent`() = runTest(dispatcher) {
val currentTime = System.currentTimeMillis()
every { settings.uriLoadGrowthLastSent } returns currentTime
val result = storage.shouldTrack(Event.GrowthData.FirstUriLoadForDay)
assertFalse(result)
}
@Test
fun `GIVEN that it has been more than 24 hours since uri load sent WHEN checked for sending THEN will be sent`() = runTest(dispatcher) {
val currentTime = System.currentTimeMillis()
every { settings.uriLoadGrowthLastSent } returns currentTime - 1000 * 60 * 60 * 24 * 2
val result = storage.shouldTrack(Event.GrowthData.FirstUriLoadForDay)
assertTrue(result)
}
@Test
fun `WHEN uri load updated THEN settings updated accordingly`() = runTest(dispatcher) {
val updateSlot = slot<Long>()
every { settings.uriLoadGrowthLastSent } returns 0
every { settings.uriLoadGrowthLastSent = capture(updateSlot) } returns Unit
storage.updateSentState(Event.GrowthData.FirstUriLoadForDay)
assertTrue(updateSlot.captured > 0)
}
}

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.telemetry
import androidx.test.core.app.ApplicationProvider
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.state.action.ContentAction
import mozilla.components.browser.state.action.EngineAction
import mozilla.components.browser.state.action.TabListAction
@ -32,6 +33,8 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.Events
import org.mozilla.fenix.GleanMetrics.Metrics
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.GleanMetrics.EngineTab as EngineMetrics
@ -50,13 +53,14 @@ class TelemetryMiddlewareTest {
val gleanRule = GleanTestRule(ApplicationProvider.getApplicationContext())
private val clock = FakeClock()
private val metrics: MetricController = mockk()
@Before
fun setUp() {
Clock.delegate = clock
settings = Settings(testContext)
telemetryMiddleware = TelemetryMiddleware(settings)
telemetryMiddleware = TelemetryMiddleware(settings, metrics)
store = BrowserStore(
middleware = listOf(telemetryMiddleware) + EngineMiddleware.create(engine = mockk()),
initialState = BrowserState(),
@ -348,6 +352,13 @@ class TelemetryMiddlewareTest {
assertNull(EngineMetrics.killForegroundAge.testGetValue())
assertEquals(600_000_000, EngineMetrics.killBackgroundAge.testGetValue()!!.sum)
}
@Test
fun `WHEN uri loaded to engine THEN matching event is sent to metrics`() {
store.dispatch(EngineAction.LoadUrlAction("", "")).joinBlocking()
verify { metrics.track(Event.GrowthData.FirstUriLoadForDay) }
}
}
internal class FakeClock : Clock.Delegate {