Skip to content

Commit 7e203db

Browse files
Merge pull request #19586 from wordpress-mobile/task/19447-analytics
Jetpack Focus: Add analytics tracking for the Jetpack fullscreen overlay
2 parents 7d701b2 + 0cfe977 commit 7e203db

File tree

9 files changed

+133
-62
lines changed

9 files changed

+133
-62
lines changed

WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,10 @@ import Foundation
407407
case jetpackPoweredBadgeTapped
408408
case jetpackPoweredBannerTapped
409409
case jetpackPoweredBottomSheetButtonTapped
410+
case jetpackFullscreenOverlayDisplayed
411+
case jetpackFullscreenOverlayLinkTapped
412+
case jetpackFullscreenOverlayButtonTapped
413+
case jetpackFullscreenOverlayDismissed
410414

411415
/// A String that represents the event
412416
var value: String {
@@ -1102,6 +1106,14 @@ import Foundation
11021106
return "jetpack_powered_banner_tapped"
11031107
case .jetpackPoweredBottomSheetButtonTapped:
11041108
return "jetpack_powered_bottom_sheet_button_tapped"
1109+
case .jetpackFullscreenOverlayDisplayed:
1110+
return "remove_feature_overlay_displayed"
1111+
case .jetpackFullscreenOverlayLinkTapped:
1112+
return "remove_feature_overlay_link_tapped"
1113+
case .jetpackFullscreenOverlayButtonTapped:
1114+
return "remove_feature_overlay_button_tapped"
1115+
case .jetpackFullscreenOverlayDismissed:
1116+
return "remove_feature_overlay_dismissed"
11051117
} // END OF SWITCH
11061118
}
11071119

WordPress/Classes/ViewRelated/Jetpack/Branding/Coordinator/JetpackFeaturesRemovalCoordinator.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Foundation
44
class JetpackFeaturesRemovalCoordinator {
55

66
/// Enum descibing the current phase of the Jetpack features removal
7-
enum GeneralPhase {
7+
enum GeneralPhase: String {
88
case normal
99
case one
1010
case two
@@ -91,17 +91,17 @@ class JetpackFeaturesRemovalCoordinator {
9191
static func presentOverlayIfNeeded(from source: OverlaySource, in viewController: UIViewController) {
9292
let phase = generalPhase()
9393
let frequencyConfig = phase.frequencyConfig
94-
let config = JetpackFullscreenOverlayGeneralConfig(phase: phase, source: source)
94+
let viewModel = JetpackFullscreenOverlayGeneralViewModel(phase: phase, source: source)
9595
let frequencyTracker = JetpackOverlayFrequencyTracker(frequencyConfig: frequencyConfig, source: source)
96-
guard config.shouldShowOverlay, frequencyTracker.shouldShow() else {
96+
guard viewModel.shouldShowOverlay, frequencyTracker.shouldShow() else {
9797
return
9898
}
99-
createAndPresentOverlay(with: config, in: viewController)
99+
createAndPresentOverlay(with: viewModel, in: viewController)
100100
frequencyTracker.track()
101101
}
102102

103-
private static func createAndPresentOverlay(with config: JetpackFullscreenOverlayConfig, in viewController: UIViewController) {
104-
let overlay = JetpackFullscreenOverlayViewController(with: config)
103+
private static func createAndPresentOverlay(with viewModel: JetpackFullscreenOverlayViewModel, in viewController: UIViewController) {
104+
let overlay = JetpackFullscreenOverlayViewController(with: viewModel)
105105
let navigationViewController = UINavigationController(rootViewController: overlay)
106106
navigationViewController.modalPresentationStyle = .formSheet
107107
viewController.present(navigationViewController, animated: true)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import Foundation
2+
import AutomatticTracks
3+
4+
extension JetpackFullscreenOverlayGeneralViewModel {
5+
6+
// MARK: Private Enum Decleration
7+
8+
private enum DismissalType: String {
9+
case close, `continue`
10+
}
11+
12+
// MARK: Static Property Keys
13+
14+
private static let phasePropertyKey = "phase"
15+
private static let sourcePropertyKey = "source"
16+
private static let dismiassalTypePropertyKey = "dismissal_type"
17+
18+
// MARK: Private Computed Property
19+
20+
private var defaultProperties: [String: String] {
21+
return [
22+
Self.phasePropertyKey: phase.rawValue,
23+
Self.sourcePropertyKey: source.rawValue
24+
]
25+
}
26+
27+
// MARK: Analytics Implementation
28+
29+
func trackOverlayDisplayed() {
30+
WPAnalytics.track(.jetpackFullscreenOverlayDisplayed, properties: defaultProperties)
31+
}
32+
33+
func trackLearnMoreTapped() {
34+
WPAnalytics.track(.jetpackFullscreenOverlayLinkTapped, properties: defaultProperties)
35+
}
36+
37+
func trackSwitchButtonTapped() {
38+
WPAnalytics.track(.jetpackFullscreenOverlayButtonTapped, properties: defaultProperties)
39+
}
40+
41+
func trackCloseButtonTapped() {
42+
trackOverlayDismissed(dismissalType: .close)
43+
}
44+
45+
func trackContinueButtonTapped() {
46+
trackOverlayDismissed(dismissalType: .continue)
47+
}
48+
49+
// MARK: Helpers
50+
51+
private func trackOverlayDismissed(dismissalType: DismissalType) {
52+
var properties = defaultProperties
53+
properties[Self.dismiassalTypePropertyKey] = dismissalType.rawValue
54+
WPAnalytics.track(.jetpackFullscreenOverlayDismissed, properties: properties)
55+
}
56+
}

WordPress/Classes/ViewRelated/Jetpack/Branding/Overlay/JetpackFullscreenOverlayGeneralPhaseConfig.swift renamed to WordPress/Classes/ViewRelated/Jetpack/Branding/Fullscreen Overlay/JetpackFullscreenOverlayGeneralViewModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import Foundation
22

3-
/// Dynamic implementation of `JetpackFullscreenOverlayConfig`
3+
/// Dynamic implementation of `JetpackFullscreenOverlayViewModel` based on the general phase
44
/// Should be used for feature-specific and feature-collection overlays.
5-
struct JetpackFullscreenOverlayGeneralConfig: JetpackFullscreenOverlayConfig {
5+
struct JetpackFullscreenOverlayGeneralViewModel: JetpackFullscreenOverlayViewModel {
66

77
let phase: JetpackFeaturesRemovalCoordinator.GeneralPhase
88
let source: JetpackFeaturesRemovalCoordinator.OverlaySource
@@ -161,7 +161,7 @@ struct JetpackFullscreenOverlayGeneralConfig: JetpackFullscreenOverlayConfig {
161161
}
162162
}
163163

164-
private extension JetpackFullscreenOverlayGeneralConfig {
164+
private extension JetpackFullscreenOverlayGeneralViewModel {
165165
enum Constants {
166166
static let statsLogoAnimationLtr = "JetpackStatsLogoAnimation_ltr"
167167
static let statsLogoAnimationRtl = "JetpackStatsLogoAnimation_rtl"

WordPress/Classes/ViewRelated/Jetpack/Branding/Overlay/JetpackFullscreenOverlayViewController.swift renamed to WordPress/Classes/ViewRelated/Jetpack/Branding/Fullscreen Overlay/JetpackFullscreenOverlayViewController.swift

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ class JetpackFullscreenOverlayViewController: UIViewController {
55

66
// MARK: Variables
77

8-
private let config: JetpackFullscreenOverlayConfig
8+
private let viewModel: JetpackFullscreenOverlayViewModel
99

1010
/// Sets the animation based on the language orientation
1111
private var animation: Animation? {
1212
traitCollection.layoutDirection == .leftToRight ?
13-
Animation.named(config.animationLtr) :
14-
Animation.named(config.animationRtl)
13+
Animation.named(viewModel.animationLtr) :
14+
Animation.named(viewModel.animationRtl)
1515
}
1616

1717
// MARK: Lazy Views
@@ -55,8 +55,8 @@ class JetpackFullscreenOverlayViewController: UIViewController {
5555

5656
// MARK: Initializers
5757

58-
init(with config: JetpackFullscreenOverlayConfig) {
59-
self.config = config
58+
init(with viewModel: JetpackFullscreenOverlayViewModel) {
59+
self.viewModel = viewModel
6060
super.init(nibName: nil, bundle: nil)
6161
}
6262

@@ -78,6 +78,7 @@ class JetpackFullscreenOverlayViewController: UIViewController {
7878
setupFonts()
7979
setupButtonInsets()
8080
animationView.play()
81+
viewModel.trackOverlayDisplayed()
8182
}
8283

8384
// MARK: Helpers
@@ -97,7 +98,7 @@ class JetpackFullscreenOverlayViewController: UIViewController {
9798
}
9899

99100
private func addCloseButtonIfNeeded() {
100-
guard config.shouldShowCloseButton else {
101+
guard viewModel.shouldShowCloseButton else {
101102
return
102103
}
103104

@@ -117,13 +118,13 @@ class JetpackFullscreenOverlayViewController: UIViewController {
117118
private func setupContent() {
118119
animationView.animation = animation
119120
setTitle()
120-
subtitleLabel.text = config.subtitle
121-
footnoteLabel.text = config.footnote
122-
switchButton.setTitle(config.switchButtonText, for: .normal)
123-
continueButton.setTitle(config.continueButtonText, for: .normal)
124-
footnoteLabel.isHidden = config.footnoteIsHidden
125-
learnMoreButton.isHidden = config.learnMoreButtonIsHidden
126-
continueButton.isHidden = config.continueButtonIsHidden
121+
subtitleLabel.text = viewModel.subtitle
122+
footnoteLabel.text = viewModel.footnote
123+
switchButton.setTitle(viewModel.switchButtonText, for: .normal)
124+
continueButton.setTitle(viewModel.continueButtonText, for: .normal)
125+
footnoteLabel.isHidden = viewModel.footnoteIsHidden
126+
learnMoreButton.isHidden = viewModel.learnMoreButtonIsHidden
127+
continueButton.isHidden = viewModel.continueButtonIsHidden
127128
setupLearnMoreButton()
128129
}
129130

@@ -136,7 +137,7 @@ class JetpackFullscreenOverlayViewController: UIViewController {
136137
.paragraphStyle: style,
137138
.kern: Metrics.titleKern
138139
]
139-
let attributedString = NSMutableAttributedString(string: config.title)
140+
let attributedString = NSMutableAttributedString(string: viewModel.title)
140141
attributedString.addAttributes(defaultAttributes, range: NSRange(location: 0, length: attributedString.length))
141142
titleLabel.attributedText = attributedString
142143
}
@@ -203,26 +204,30 @@ class JetpackFullscreenOverlayViewController: UIViewController {
203204

204205
@objc private func closeButtonPressed(sender: UIButton) {
205206
dismiss(animated: true, completion: nil)
207+
viewModel.trackCloseButtonTapped()
206208
}
207209

208210

209211
@IBAction func switchButtonPressed(_ sender: Any) {
210212
// TODO: Add here action to redirect to the JP app
213+
viewModel.trackSwitchButtonTapped()
211214
}
212215

213216
@IBAction func continueButtonPressed(_ sender: Any) {
214217
dismiss(animated: true, completion: nil)
218+
viewModel.trackContinueButtonTapped()
215219
}
216220

217221
@IBAction func learnMoreButtonPressed(_ sender: Any) {
218222
guard let url = URL(string: Constants.learnMoreURLString) else {
219223
return
220224
}
221225

222-
let source = "jetpack_overlay_\(config.analyticsSource)"
226+
let source = "jetpack_overlay_\(viewModel.analyticsSource)"
223227
let webViewController = WebViewControllerFactory.controller(url: url, source: source)
224228
let navController = UINavigationController(rootViewController: webViewController)
225229
present(navController, animated: true)
230+
viewModel.trackLearnMoreTapped()
226231
}
227232
}
228233

WordPress/Classes/ViewRelated/Jetpack/Branding/Overlay/JetpackFullscreenOverlayViewController.xib renamed to WordPress/Classes/ViewRelated/Jetpack/Branding/Fullscreen Overlay/JetpackFullscreenOverlayViewController.xib

File renamed without changes.

WordPress/Classes/ViewRelated/Jetpack/Branding/Overlay/JetpackFullscreenOverlayConfig.swift renamed to WordPress/Classes/ViewRelated/Jetpack/Branding/Fullscreen Overlay/JetpackFullscreenOverlayViewModel.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22

33
/// Protocol used to configure `JetpackFullscreenOverlayViewController`
4-
protocol JetpackFullscreenOverlayConfig {
4+
protocol JetpackFullscreenOverlayViewModel {
55
var title: String { get }
66
var subtitle: String { get }
77
var animationLtr: String { get }
@@ -12,9 +12,15 @@ protocol JetpackFullscreenOverlayConfig {
1212
var continueButtonText: String? { get }
1313
var shouldShowCloseButton: Bool { get }
1414
var analyticsSource: String { get }
15+
16+
func trackOverlayDisplayed()
17+
func trackLearnMoreTapped()
18+
func trackSwitchButtonTapped()
19+
func trackCloseButtonTapped()
20+
func trackContinueButtonTapped()
1521
}
1622

17-
extension JetpackFullscreenOverlayConfig {
23+
extension JetpackFullscreenOverlayViewModel {
1824
var learnMoreButtonIsHidden: Bool {
1925
!shouldShowLearnMoreButton
2026
}

WordPress/Classes/ViewRelated/Jetpack/Branding/Overlay/JetpackFullscreenOverlayStaticConfig.swift

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)