Skip to content

Commit

Permalink
Bugfix FXIOS-10508 ⁃ [Menu] [Telemetry] - Missing sub-menu events (#2…
Browse files Browse the repository at this point in the history
…3046)

* FXIOS-10508 #23040 ⁃ [Menu redesign] [Telemetry] - Missing sub-menu events

* Changed data_reviews url

* Fixed SwitchToDesktop/SwitchToMobile option event
  • Loading branch information
dicarobinho authored Nov 13, 2024
1 parent cca5743 commit 2a12d3b
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,9 @@ struct MainMenuConfigurationUtility: Equatable, FeatureFlaggable {
MainMenuAction(
windowUUID: uuid,
actionType: MainMenuActionType.tapToggleUserAgent,
telemetryInfo: TelemetryInfo(isHomepage: tabInfo.isHomepage)
telemetryInfo: TelemetryInfo(isHomepage: tabInfo.isHomepage,
isDefaultUserAgentDesktop: tabInfo.isDefaultUserAgentDesktop,
hasChangedUserAgent: tabInfo.hasChangedUserAgent)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,21 @@ import Foundation
import Glean

struct MainMenuTelemetry {
func optionTapped(with isHomepage: Bool, and option: String) {
func mainMenuOptionTapped(with isHomepage: Bool, and option: String) {
let extra = GleanMetrics.AppMenu.MainMenuOptionSelectedExtra(isHomepage: isHomepage, option: option)
GleanMetrics.AppMenu.mainMenuOptionSelected.record(extra)
}

func saveSubmenuOptionTapped(with isHomepage: Bool, and option: String) {
let extra = GleanMetrics.AppMenu.SaveMenuOptionSelectedExtra(isHomepage: isHomepage, option: option)
GleanMetrics.AppMenu.saveMenuOptionSelected.record(extra)
}

func toolsSubmenuOptionTapped(with isHomepage: Bool, and option: String) {
let extra = GleanMetrics.AppMenu.ToolsMenuOptionSelectedExtra(isHomepage: isHomepage, option: option)
GleanMetrics.AppMenu.toolsMenuOptionSelected.record(extra)
}

func closeButtonTapped(isHomepage: Bool) {
let extra = GleanMetrics.AppMenu.CloseButtonExtra(isHomepage: isHomepage)
GleanMetrics.AppMenu.closeButton.record(extra)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,31 +57,31 @@ final class MainMenuMiddleware {
case MainMenuActionType.tapNavigateToDestination:
guard let destination = action.navigationDestination?.destination else { return }
self.handleTelemetryFor(for: destination,
currentTabInfo: action.currentTabInfo,
isHomepage: isHomepage,
and: action.navigationDestination?.url)
case MainMenuActionType.tapShowDetailsView:
if action.detailsViewToShow == .tools {
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.tools)
self.telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.tools)
} else if action.detailsViewToShow == .save {
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.save)
self.telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.save)
}
case MainMenuActionType.tapToggleUserAgent:
guard let defaultIsDesktop = action.currentTabInfo?.isDefaultUserAgentDesktop,
let hasChangedUserAgent = action.currentTabInfo?.hasChangedUserAgent
guard let defaultIsDesktop = action.telemetryInfo?.isDefaultUserAgentDesktop,
let hasChangedUserAgent = action.telemetryInfo?.hasChangedUserAgent
else { return }
if defaultIsDesktop {
let option = hasChangedUserAgent ? TelemetryAction.switchToDesktopSite : TelemetryAction.switchToMobileSite
self.telemetry.optionTapped(with: isHomepage, and: option)
self.telemetry.mainMenuOptionTapped(with: isHomepage, and: option)
} else {
let option = hasChangedUserAgent ? TelemetryAction.switchToMobileSite : TelemetryAction.switchToDesktopSite
self.telemetry.optionTapped(with: isHomepage, and: option)
self.telemetry.mainMenuOptionTapped(with: isHomepage, and: option)
}
case MainMenuActionType.tapCloseMenu:
self.telemetry.closeButtonTapped(isHomepage: isHomepage)
case GeneralBrowserActionType.showReaderMode:
guard let isActionOn = action.telemetryInfo?.isActionOn else { return }
let option = isActionOn ? TelemetryAction.readerViewTurnOn : TelemetryAction.readerViewTurnOff
self.telemetry.optionTapped(with: false, and: option)
self.telemetry.toolsSubmenuOptionTapped(with: false, and: option)
case MainMenuActionType.viewDidLoad:
if let accountData = self.getAccountData() {
if let iconURL = accountData.iconURL {
Expand All @@ -107,27 +107,32 @@ final class MainMenuMiddleware {
case MainMenuActionType.menuDismissed:
self.telemetry.menuDismissed(isHomepage: isHomepage)
case MainMenuDetailsActionType.tapZoom:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.zoom)
self.telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.zoom)
case MainMenuDetailsActionType.tapReportBrokenSite:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.reportBrokenSite)
self.telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.reportBrokenSite)
case MainMenuDetailsActionType.tapAddToBookmarks:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.bookmarkThisPage)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.bookmarkThisPage)
case MainMenuDetailsActionType.tapEditBookmark:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.editBookmark)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.editBookmark)
case MainMenuDetailsActionType.tapAddToShortcuts:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.addToShortcuts)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.addToShortcuts)
case MainMenuDetailsActionType.tapRemoveFromShortcuts:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.removeFromShortcuts)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.removeFromShortcuts)
case MainMenuDetailsActionType.tapAddToReadingList:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.saveToReadingList)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.saveToReadingList)
case MainMenuDetailsActionType.tapRemoveFromReadingList:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.removeFromReadingList)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.removeFromReadingList)
case MainMenuDetailsActionType.tapToggleNightMode:
guard let isActionOn = action.telemetryInfo?.isActionOn else { return }
let option = isActionOn ? TelemetryAction.nightModeTurnOn : TelemetryAction.nightModeTurnOff
self.telemetry.optionTapped(with: isHomepage, and: option)
self.telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: option)
case MainMenuDetailsActionType.tapBackToMainMenu:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.back)
guard let submenuType = action.telemetryInfo?.submenuType else { return }
if submenuType == .save {
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.back)
} else {
self.telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.back)
}
case MainMenuDetailsActionType.tapDismissView:
self.telemetry.closeButtonTapped(isHomepage: isHomepage)
default: break
Expand Down Expand Up @@ -174,42 +179,41 @@ final class MainMenuMiddleware {
}

private func handleTelemetryFor(for navigationDestination: MainMenuNavigationDestination,
currentTabInfo: MainMenuTabInfo?,
isHomepage: Bool,
and urlToVisit: URL?) {
let isHomepage = currentTabInfo?.isHomepage ?? false
switch navigationDestination {
case .newTab:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.newTab)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.newTab)
case .newPrivateTab:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.newPrivateTab)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.newPrivateTab)
case .findInPage:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.findInPage)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.findInPage)
case .bookmarks:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.bookmarks)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.bookmarks)
case .history:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.history)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.history)
case .downloads:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.downloads)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.downloads)
case .passwords:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.passwords)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.passwords)
case .settings:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.settings)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.settings)
case .customizeHomepage:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.customizeHomepage)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.customizeHomepage)
case .goToURL:
if urlToVisit == SupportUtils.URLForGetHelp {
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.getHelp)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.getHelp)
} else if urlToVisit == SupportUtils.URLForWhatsNew {
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.newInFirefox)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.newInFirefox)
}
case .shareSheet:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.share)
telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.share)
case .syncSignIn:
telemetry.optionTapped(with: isHomepage, and: TelemetryAction.signInAccount)
telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.signInAccount)
case .editBookmark:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.editBookmark)
self.telemetry.saveSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.editBookmark)
case .zoom:
self.telemetry.optionTapped(with: isHomepage, and: TelemetryAction.zoom)
self.telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.zoom)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,20 @@ struct AccountData: Equatable {
struct TelemetryInfo: Equatable {
let isHomepage: Bool
let isActionOn: Bool?

init(isHomepage: Bool, isActionOn: Bool? = nil) {
let submenuType: MainMenuDetailsViewType?
let isDefaultUserAgentDesktop: Bool?
let hasChangedUserAgent: Bool?

init(isHomepage: Bool,
isActionOn: Bool? = nil,
submenuType: MainMenuDetailsViewType? = nil,
isDefaultUserAgentDesktop: Bool? = nil,
hasChangedUserAgent: Bool? = nil) {
self.isHomepage = isHomepage
self.isActionOn = isActionOn
self.submenuType = submenuType
self.isDefaultUserAgentDesktop = isDefaultUserAgentDesktop
self.hasChangedUserAgent = hasChangedUserAgent
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ class MainMenuDetailsViewController: UIViewController,
MainMenuAction(
windowUUID: self.windowUUID,
actionType: MainMenuDetailsActionType.tapBackToMainMenu,
telemetryInfo: TelemetryInfo(isHomepage: submenuState.isHomepage ?? false)
telemetryInfo: TelemetryInfo(isHomepage: submenuState.isHomepage ?? false,
submenuType: submenuState.submenuType)
)
)
}
Expand Down
40 changes: 40 additions & 0 deletions firefox-ios/Client/metrics.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,46 @@ app_menu:
notification_emails:
- [email protected]
expires: "2025-06-01"
save_menu_option_selected:
type: event
description: |
Record event when user has tapped on a save sub menu option.
extra_keys:
option:
type: string
description: |
The option type selected on the save sub menu.
is_homepage:
type: boolean
description: |
Indicate if is homepage when select an option.
bugs:
- https://github.com/mozilla-mobile/firefox-ios/issues/23040
data_reviews:
- https://github.com/mozilla-mobile/firefox-ios/pull/23046
notification_emails:
- [email protected]
expires: "2025-06-01"
tools_menu_option_selected:
type: event
description: |
Record event when user has tapped on a tools sub menu option.
extra_keys:
option:
type: string
description: |
The option type selected on the tools sub menu.
is_homepage:
type: boolean
description: |
Indicate if is homepage when select an option.
bugs:
- https://github.com/mozilla-mobile/firefox-ios/issues/23040
data_reviews:
- https://github.com/mozilla-mobile/firefox-ios/pull/23046
notification_emails:
- [email protected]
expires: "2025-06-01"
close_button:
type: event
description: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,33 @@ final class MainMenuTelemetryTests: XCTestCase {
subject = MainMenuTelemetry()
}

func testRecordMainMenuWhenOptionTappedThenGleanIsCalled() throws {
subject?.optionTapped(with: true, and: "test_option")
func testRecordMainMenuWhenMainMenuOptionTappedThenGleanIsCalled() throws {
subject?.mainMenuOptionTapped(with: true, and: "test_option")
testEventMetricRecordingSuccess(metric: GleanMetrics.AppMenu.mainMenuOptionSelected)

let resultValue = try XCTUnwrap(GleanMetrics.AppMenu.mainMenuOptionSelected.testGetValue())
XCTAssertEqual(resultValue[0].extra?[optionKey], "test_option")
XCTAssertEqual(resultValue[0].extra?[isHomepageKey], "true")
}

func testRecordMainMenuWhenSaveSubmenuOptionTappedThenGleanIsCalled() throws {
subject?.saveSubmenuOptionTapped(with: true, and: "test_option")
testEventMetricRecordingSuccess(metric: GleanMetrics.AppMenu.saveMenuOptionSelected)

let resultValue = try XCTUnwrap(GleanMetrics.AppMenu.saveMenuOptionSelected.testGetValue())
XCTAssertEqual(resultValue[0].extra?[optionKey], "test_option")
XCTAssertEqual(resultValue[0].extra?[isHomepageKey], "true")
}

func testRecordMainMenuWhenToolsSubmenuOptionTappedThenGleanIsCalled() throws {
subject?.toolsSubmenuOptionTapped(with: true, and: "test_option")
testEventMetricRecordingSuccess(metric: GleanMetrics.AppMenu.toolsMenuOptionSelected)

let resultValue = try XCTUnwrap(GleanMetrics.AppMenu.toolsMenuOptionSelected.testGetValue())
XCTAssertEqual(resultValue[0].extra?[optionKey], "test_option")
XCTAssertEqual(resultValue[0].extra?[isHomepageKey], "true")
}

func testRecordMainMenuWhenCloseButtonTappedThenGleanIsCalled() throws {
subject?.closeButtonTapped(isHomepage: true)
testEventMetricRecordingSuccess(metric: GleanMetrics.AppMenu.closeButton)
Expand Down

0 comments on commit 2a12d3b

Please sign in to comment.