From a06b04ec6db1e5ebe60114fb56c3d8dd279bbc9c Mon Sep 17 00:00:00 2001 From: Noah Bond <87384386+MozillaNoah@users.noreply.github.com> Date: Tue, 2 Nov 2021 16:08:30 -0700 Subject: [PATCH] MR2 Telemetry: Recent tabs section probe (#22166) * For #22107 - Added probe to track if the Recent tabs / jump back in section is visible * For #22107 - Fixed lint errors * For #22107 - added data review number to metric * For #22166 - fixed expiration date Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- app/metrics.yaml | 14 ++++++++++ .../mozilla/fenix/components/metrics/Event.kt | 2 ++ .../components/metrics/GleanMetricsService.kt | 8 ++++++ .../org/mozilla/fenix/home/HomeFragment.kt | 2 +- .../SessionControlController.kt | 13 +++++++++ .../SessionControlInteractor.kt | 12 +++++++++ .../home/sessioncontrol/SessionControlView.kt | 4 ++- .../DefaultSessionControlControllerTest.kt | 27 +++++++++++++++++++ .../home/SessionControlInteractorTest.kt | 9 +++++++ 9 files changed, 89 insertions(+), 2 deletions(-) diff --git a/app/metrics.yaml b/app/metrics.yaml index 8aa64243e3..32176e7054 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -5828,6 +5828,20 @@ recent_tabs: notification_emails: - android-probes@mozilla.com expires: "2022-06-23" + section_visible: + type: boolean + description: | + An indication of whether the recent tabs / + Jump Back In section is visible on the homepage. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/22107 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/22166 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: "2022-11-01" recent_bookmarks: shown: diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt index 7d9848c7ca..6bf30a46bd 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt @@ -268,6 +268,8 @@ sealed class Event { object ShowAllRecentTabs : Event() object OpenRecentTab : Event() object OpenInProgressMediaTab : Event() + object RecentTabsSectionIsVisible : Event() + object RecentTabsSectionIsNotVisible : Event() // Recent bookmarks object BookmarkClicked : Event() 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 387fd2a1a6..d0426ac89d 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 @@ -799,6 +799,14 @@ private val Event.wrapper: EventWrapper<*>? { RecentTabs.showAllClicked.record(it) } ) + is Event.RecentTabsSectionIsVisible -> EventWrapper( + { RecentTabs.sectionVisible.set(true) } + ) + + is Event.RecentTabsSectionIsNotVisible -> EventWrapper( + { RecentTabs.sectionVisible.set(false) } + ) + is Event.BookmarkClicked -> EventWrapper( { RecentBookmarks.bookmarkClicked.add() } ) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f998c55b5e..171cbbda0c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -434,7 +434,7 @@ class HomeFragment : Fragment() { sessionControlView?.update(homeFragmentStore.state) binding.root.consumeFrom(homeFragmentStore, viewLifecycleOwner) { - sessionControlView?.update(it) + sessionControlView?.update(it, shouldReportMetrics = true) } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 3f0051f792..e86f47217f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -46,6 +46,7 @@ import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.home.HomeFragmentAction import org.mozilla.fenix.home.HomeFragmentDirections +import org.mozilla.fenix.home.HomeFragmentState import org.mozilla.fenix.home.HomeFragmentStore import org.mozilla.fenix.home.Mode import org.mozilla.fenix.settings.SupportUtils @@ -188,6 +189,11 @@ interface SessionControlController { * @see [OnboardingInteractor.showOnboardingDialog] */ fun handleShowOnboardingDialog() + + /** + * @see [SessionControlInteractor.reportSessionMetrics] + */ + fun handleReportSessionMetrics(state: HomeFragmentState) } @Suppress("TooManyFunctions", "LargeClass") @@ -596,4 +602,11 @@ class DefaultSessionControlController( } } } + + override fun handleReportSessionMetrics(state: HomeFragmentState) { + metrics.track( + if (state.recentTabs.isEmpty()) Event.RecentTabsSectionIsNotVisible + else Event.RecentTabsSectionIsVisible + ) + } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt index 291341cb2a..d8844b405a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt @@ -14,6 +14,7 @@ import org.mozilla.fenix.components.tips.Tip import org.mozilla.fenix.historymetadata.HistoryMetadataGroup import org.mozilla.fenix.historymetadata.controller.HistoryMetadataController import org.mozilla.fenix.historymetadata.interactor.HistoryMetadataInteractor +import org.mozilla.fenix.home.HomeFragmentState import org.mozilla.fenix.home.recentbookmarks.controller.RecentBookmarksController import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor import org.mozilla.fenix.home.recenttabs.controller.RecentTabController @@ -36,6 +37,13 @@ interface TabSessionInteractor { * Called when a user clicks on the Private Mode button on the homescreen. */ fun onPrivateModeButtonClicked(newMode: BrowsingMode, userHasBeenOnboarded: Boolean) + + /** + * Called when there is an update to the session state and updated metrics need to be reported + * + * * @param state The state the homepage from which to report desired metrics. + */ + fun reportSessionMetrics(state: HomeFragmentState) } /** @@ -410,4 +418,8 @@ class SessionControlInteractor( override fun onDiscoverMoreClicked(link: String) { pocketStoriesController.handleDiscoverMoreClicked(link) } + + override fun reportSessionMetrics(state: HomeFragmentState) { + controller.handleReportSessionMetrics(state) + } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index 5768118482..95a0d007d1 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -215,11 +215,13 @@ class SessionControlView( } } - fun update(state: HomeFragmentState) { + fun update(state: HomeFragmentState, shouldReportMetrics: Boolean = false) { if (state.shouldShowHomeOnboardingDialog(view.context.settings())) { interactor.showOnboardingDialog() } + if (shouldReportMetrics) interactor.reportSessionMetrics(state) + val stateAdapterList = state.toAdapterList() if (homeScreenViewModel.shouldScrollToTopSites) { sessionControlAdapter.submitList(stateAdapterList) { diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index bad1f61243..751c8cd82d 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -55,6 +55,7 @@ import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.tips.Tip import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.utils.Settings @@ -107,6 +108,7 @@ class DefaultSessionControlControllerTest { ) private lateinit var store: BrowserStore + private val homeFragmentState: HomeFragmentState = mockk(relaxed = true) @Before fun setup() { @@ -816,6 +818,31 @@ class DefaultSessionControlControllerTest { } } + @Test + fun `WHEN handleReportSessionMetrics is called AND there are zero recent tabs THEN report Event#RecentTabsSectionIsNotVisible`() { + every { homeFragmentState.recentTabs } returns emptyList() + createController().handleReportSessionMetrics(homeFragmentState) + verify(exactly = 0) { + metrics.track(Event.RecentTabsSectionIsVisible) + } + verify { + metrics.track(Event.RecentTabsSectionIsNotVisible) + } + } + + @Test + fun `WHEN handleReportSessionMetrics is called AND there is at least one recent tab THEN report Event#RecentTabsSectionIsVisible`() { + val recentTab: RecentTab = mockk(relaxed = true) + every { homeFragmentState.recentTabs } returns listOf(recentTab) + createController().handleReportSessionMetrics(homeFragmentState) + verify(exactly = 0) { + metrics.track(Event.RecentTabsSectionIsNotVisible) + } + verify { + metrics.track(Event.RecentTabsSectionIsVisible) + } + } + private fun createController( hideOnboarding: () -> Unit = { }, registerCollectionStorageObserver: () -> Unit = { }, diff --git a/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt index 90963c953d..9924615587 100644 --- a/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.home +import io.mockk.every import io.mockk.mockk import io.mockk.verify import mozilla.components.concept.storage.BookmarkNode @@ -259,4 +260,12 @@ class SessionControlInteractorTest { verify { pocketStoriesController.handleLearnMoreClicked(link) } } + + @Test + fun reportSessionMetrics() { + val homeFragmentState: HomeFragmentState = mockk(relaxed = true) + every { homeFragmentState.recentBookmarks } returns emptyList() + interactor.reportSessionMetrics(homeFragmentState) + verify { controller.handleReportSessionMetrics(homeFragmentState) } + } }