Skip to content

Commit c63dc18

Browse files
authored
Merge pull request #336 from woocommerce/issue/open-beta-analytics-mark1
Open beta analytics
2 parents b7d731f + 197455d commit c63dc18

19 files changed

+243
-13
lines changed

WooCommerce/Classes/Analytics/TracksProvider.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,16 @@ public extension TracksProvider {
5252
//
5353
private extension TracksProvider {
5454
func refreshMetadata() {
55+
DDLogInfo("♻️ Refreshing tracks metadata...")
5556
var userProperties = [String: Any]()
56-
userProperties["platform"] = "iOS"
57-
userProperties["accessibility_voice_over_enabled"] = UIAccessibility.isVoiceOverRunning
58-
userProperties["is_rtl_language"] = (UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft)
57+
userProperties[UserProperties.platformKey] = "iOS"
58+
userProperties[UserProperties.voiceOverKey] = UIAccessibility.isVoiceOverRunning
59+
userProperties[UserProperties.rtlKey] = (UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft)
60+
if StoresManager.shared.isAuthenticated {
61+
let site = StoresManager.shared.sessionManager.defaultSite
62+
userProperties[UserProperties.blogIDKey] = site?.siteID
63+
userProperties[UserProperties.wpcomStoreKey] = site?.isWordPressStore
64+
}
5965
tracksService.userProperties.removeAllObjects()
6066
tracksService.userProperties.addEntries(from: userProperties)
6167
}
@@ -69,4 +75,12 @@ private extension TracksProvider {
6975
enum Constants {
7076
static let eventNamePrefix = "woocommerceios"
7177
}
78+
79+
enum UserProperties {
80+
static let platformKey = "platform"
81+
static let voiceOverKey = "accessibility_voice_over_enabled"
82+
static let rtlKey = "is_rtl_language"
83+
static let blogIDKey = "blog_id"
84+
static let wpcomStoreKey = "is_wpcom_store"
85+
}
7286
}

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import WordPressShared
22

33

4-
/// This enum contains all of the events we track in the app.
4+
/// This enum contains all of the events we track in the app. Please reference the "Woo Mobile Events Draft i2"
5+
/// spreadsheet for more details.
56
///
67
public enum WooAnalyticsStat: String {
78

89
// Application Events
910
//
11+
case applicationInstalled = "application_installed"
12+
case applicationUpgraded = "application_upgraded"
1013
case applicationOpened = "application_opened"
1114
case applicationClosed = "application_closed"
1215

@@ -18,8 +21,6 @@ public enum WooAnalyticsStat: String {
1821
case loginFailed = "login_failed_to_login"
1922
case loginAutoFillCredentialsFilled = "login_autofill_credentials_filled"
2023
case loginAutoFillCredentialsUpdated = "login_autofill_credentials_updated"
21-
case loginProloguePaged = "login_prologue_paged"
22-
case loginPrologueViewed = "login_prologue_viewed"
2324
case loginEmailFormViewed = "login_email_form_viewed"
2425
case loginMagicLinkOpenEmailClientViewed = "login_magic_link_open_email_client_viewed"
2526
case loginMagicLinkRequestFormViewed = "login_magic_link_request_form_viewed"
@@ -34,6 +35,12 @@ public enum WooAnalyticsStat: String {
3435
case loginUsernamePasswordFormViewed = "login_username_password_form_viewed"
3536
case loginTwoFactorFormViewed = "login_two_factor_form_viewed"
3637
case loginEpilogueViewed = "login_epilogue_viewed"
38+
case loginEpilogueStoresShown = "login_epilogue_stores_shown"
39+
case loginEpilogueContinueTapped = "login_epilogue_store_picker_continue_tapped"
40+
case loginProloguePaged = "login_prologue_paged"
41+
case loginPrologueViewed = "login_prologue_viewed"
42+
case loginPrologueContinueTapped = "login_prologue_jetpack_login_button_tapped"
43+
case loginPrologueJetpackInstructions = "login_prologue_jetpack_configuration_instructions_link_tapped"
3744
case loginForgotPasswordClicked = "login_forgot_password_clicked"
3845
case loginSocialButtonClick = "login_social_button_click"
3946
case loginSocialButtonFailure = "login_social_button_failure"
@@ -49,6 +56,66 @@ public enum WooAnalyticsStat: String {
4956
case onePasswordSignup = "one_password_signup"
5057
case twoFactorCodeRequested = "two_factor_code_requested"
5158
case twoFactorSentSMS = "two_factor_sent_sms"
59+
60+
// Dashboard View Events
61+
//
62+
case dashboardSelected = "main_tab_dashboard_selected"
63+
case dashboardReselected = "main_tab_dashboard_reselected"
64+
case dashboardPulledToRefresh = "dashboard_pulled_to_refresh"
65+
case dashboardNewOrdersButtonTapped = "dashboard_unfulfilled_orders_button_tapped"
66+
67+
// Dashboard Data/Action Events
68+
//
69+
case dashboardMainStatsDate = "dashboard_main_stats_date"
70+
case dashboardMainStatsLoaded = "dashboard_main_stats_loaded"
71+
case dashboardTopPerformersDate = "dashboard_top_performers_date"
72+
case dashboardTopPerformersLoaded = "dashboard_top_performers_loaded"
73+
case dashboardUnfulfilledOrdersLoaded = "dashboard_unfulfilled_orders_loaded"
74+
75+
// Settings View Events
76+
//
77+
case settingsTapped = "main_menu_settings_tapped"
78+
case settingsContactSupportTapped = "main_menu_contact_support_tapped"
79+
case settingsLogoutTapped = "settings_logout_button_tapped"
80+
case settingsLogoutConfirmation = "settings_logout_confirmation_dialog_result"
81+
82+
// Order View Events
83+
//
84+
case ordersSelected = "main_tab_orders_selected"
85+
case ordersReselected = "main_tab_orders_reselected"
86+
case ordersListPulledToRefresh = "orders_list_pulled_to_refresh"
87+
case ordersListFilterTapped = "orders_list_menu_filter_tapped"
88+
case filterOrdersOptionSelected = "filter_orders_by_status_dialog_option_selected"
89+
case orderDetailAddNoteButtonTapped = "order_detail_add_note_button_tapped"
90+
case orderDetailPulledToRefresh = "order_detail_pulled_to_refresh"
91+
case orderNoteAddButtonTapped = "add_order_note_add_button_tapped"
92+
case orderNoteEmailCustomerToggled = "add_order_note_email_note_to_customer_toggled"
93+
case orderDetailShowBillingTapped = "order_detail_customer_info_show_billing_tapped"
94+
case orderDetailHideBillingTapped = "order_detail_customer_info_hide_billing_tapped"
95+
case orderDetailFulfillButtonTapped = "order_detail_fulfill_order_button_tapped"
96+
case orderDetailCustomerEmailTapped = "order_detail_customer_info_email_menu_email_tapped"
97+
case orderDetailCustomerPhoneMenuTapped = "order_detail_customer_info_phone_menu_tapped"
98+
case orderDetailCustomerPhoneOptionTapped = "order_detail_customer_info_phone_menu_phone_tapped"
99+
case orderDetailCustomerSMSOptionTapped = "order_detail_customer_info_phone_menu_sms_tapped"
100+
case orderDetailProductDetailTapped = "order_detail_product_detail_button_tapped"
101+
case orderFulfillmentCompleteButtonTapped = "order_fulfillment_mark_order_complete_button_tapped"
102+
case orderMarkedCompleteUndoButtonTapped = "snack_order_marked_complete_undo_button_tapped"
103+
104+
// Order Data/Action Events
105+
//
106+
case orderOpen = "order_open"
107+
case orderNotesLoaded = "order_notes_loaded"
108+
case orderNoteAdd = "order_note_add"
109+
case orderNoteAddSuccess = "order_note_add_success"
110+
case orderNoteAddFailed = "order_note_add_failed"
111+
case orderContactAction = "order_contact_action"
112+
case ordersListFilterOrSearch = "orders_list_filter"
113+
case ordersListLoaded = "orders_list_loaded"
114+
115+
// Notification Events
116+
//
117+
case notificationsSelected = "main_tab_notifications_selected"
118+
case notificationsReselected = "main_tab_notifications_reselected"
52119
}
53120

54121
public extension WooAnalyticsStat {

WooCommerce/Classes/AppDelegate.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
7070
// Yosemite Initialization
7171
synchronizeEntitiesIfPossible()
7272

73+
// Upgrade check...
74+
checkForUpgrades()
75+
7376
return true
7477
}
7578

@@ -198,6 +201,24 @@ private extension AppDelegate {
198201
}
199202

200203

204+
private extension AppDelegate {
205+
206+
func checkForUpgrades() {
207+
let currentVersion = UserAgent.bundleShortVersion
208+
let versionOfLastRun = UserDefaults.standard[.versionOfLastRun] as? String
209+
if versionOfLastRun == nil {
210+
// First run after a fresh install
211+
WooAnalytics.shared.track(.applicationInstalled)
212+
} else if versionOfLastRun != currentVersion {
213+
// App was upgraded
214+
WooAnalytics.shared.track(.applicationInstalled, withProperties: ["previous_version": versionOfLastRun ?? String()])
215+
}
216+
217+
UserDefaults.standard[.versionOfLastRun] = currentVersion
218+
}
219+
}
220+
221+
201222
// MARK: - Authentication Methods
202223
//
203224
extension AppDelegate {

WooCommerce/Classes/Authentication/Epilogue/StorePickerViewController.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ private extension StorePickerViewController {
133133

134134
func refreshResults() {
135135
try? resultsController.performFetch()
136+
WooAnalytics.shared.track(.loginEpilogueStoresShown, withProperties: ["num_of_stores": resultsController.numberOfObjects])
136137
state = StorePickerState(sites: resultsController.fetchedObjects)
137138
}
138139

@@ -229,6 +230,11 @@ extension StorePickerViewController {
229230
case .empty:
230231
restartAuthentication()
231232
default:
233+
// We need to call refreshUserData() here because the user selected
234+
// their default store and tracks should to know about it.
235+
WooAnalytics.shared.refreshUserData()
236+
WooAnalytics.shared.track(.loginEpilogueContinueTapped,
237+
withProperties: ["selected_store_id": StoresManager.shared.sessionManager.defaultStoreID ?? String()])
232238
dismiss(animated: true, completion: nil)
233239
}
234240
}

WooCommerce/Classes/Authentication/Prologue/LoginPrologueViewController.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ extension LoginPrologueViewController {
126126
/// Opens SafariViewController at the specified URL.
127127
///
128128
func displaySafariViewController(at url: URL) {
129+
WooAnalytics.shared.track(.loginPrologueJetpackInstructions)
129130
let safariViewController = SafariViewController(url: url)
130131
safariViewController.modalPresentationStyle = .pageSheet
131132
present(safariViewController, animated: true, completion: nil)
@@ -134,6 +135,7 @@ extension LoginPrologueViewController {
134135
/// Proceeds with the Login Flow.
135136
///
136137
@IBAction func loginWasPressed() {
138+
WooAnalytics.shared.track(.loginPrologueContinueTapped)
137139
let loginViewController = AppDelegate.shared.authenticationManager.loginForWordPressDotCom()
138140

139141
navigationController?.pushViewController(loginViewController, animated: true)

WooCommerce/Classes/Extensions/UserDefaults+Woo.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ extension UserDefaults {
1010
case defaultUsername
1111
case defaultStoreID
1212
case defaultAnonymousID
13+
case versionOfLastRun
1314
}
1415
}
1516

WooCommerce/Classes/Tools/UserAgent.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ class UserAgent {
1919

2020
/// Returns the WebKit User Agent
2121
///
22-
private static var webkitUserAgent: String {
22+
static var webkitUserAgent: String {
2323
return UIWebView().stringByEvaluatingJavaScript(from: Constants.loadUserAgentScript) ?? String()
2424
}
2525

2626
/// Returns the Bundle Version ID
2727
///
28-
private static var bundleShortVersion: String {
28+
static var bundleShortVersion: String {
2929
let version = Bundle.main.object(forInfoDictionaryKey: Constants.shortVersionKey) as? String
3030
return version ?? String()
3131
}

WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,12 @@ private extension DashboardViewController {
106106
private extension DashboardViewController {
107107

108108
@objc func settingsTapped() {
109+
WooAnalytics.shared.track(.settingsTapped)
109110
performSegue(withIdentifier: Segues.settingsSegue, sender: nil)
110111
}
111112

112113
@objc func pullToRefresh() {
114+
WooAnalytics.shared.track(.dashboardPulledToRefresh)
113115
applyHideAnimation(for: newOrdersContainerView)
114116
reloadData()
115117
}
@@ -122,8 +124,10 @@ extension DashboardViewController: NewOrdersDelegate {
122124
func didUpdateNewOrdersData(hasNewOrders: Bool) {
123125
if hasNewOrders {
124126
applyUnhideAnimation(for: newOrdersContainerView)
127+
WooAnalytics.shared.track(.dashboardUnfulfilledOrdersLoaded, withProperties: ["has_unfulfilled_orders": "true"])
125128
} else {
126129
applyHideAnimation(for: newOrdersContainerView)
130+
WooAnalytics.shared.track(.dashboardUnfulfilledOrdersLoaded, withProperties: ["has_unfulfilled_orders": "false"])
127131
}
128132
}
129133
}

WooCommerce/Classes/ViewRelated/Dashboard/MyStore/NewOrdersViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ private extension NewOrdersViewController {
9898

9999
@IBAction func buttonTouchUpInside(_ sender: UIButton) {
100100
sender.fadeOutSelectedBackground {
101+
WooAnalytics.shared.track(.dashboardNewOrdersButtonTapped)
101102
MainTabBarController.switchToOrdersTab(filter: .processing)
102103
}
103104
}

WooCommerce/Classes/ViewRelated/Dashboard/MyStore/PeriodDataViewController.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class PeriodDataViewController: UIViewController, IndicatorInfoProvider {
2525
private var lastUpdatedDate: Date?
2626
private var yAxisMinimum: String = Constants.chartYAxisMinimum.friendlyString()
2727
private var yAxisMaximum: String = ""
28+
private var isInitialLoad: Bool = true // Used in trackChangedTabIfNeeded()
2829

2930
public let granularity: StatGranularity
3031
public var orderStats: OrderStats? {
@@ -109,6 +110,7 @@ class PeriodDataViewController: UIViewController, IndicatorInfoProvider {
109110
override func viewDidAppear(_ animated: Bool) {
110111
super.viewDidAppear(animated)
111112
reloadAllFields()
113+
trackChangedTabIfNeeded()
112114
}
113115

114116
override func viewDidDisappear(_ animated: Bool) {
@@ -309,6 +311,16 @@ private extension PeriodDataViewController {
309311
//
310312
private extension PeriodDataViewController {
311313

314+
func trackChangedTabIfNeeded() {
315+
// This is a little bit of a workaround to prevent the "tab tapped" tracks event from firing when launching the app.
316+
if granularity == .day && isInitialLoad {
317+
isInitialLoad = false
318+
return
319+
}
320+
WooAnalytics.shared.track(.dashboardMainStatsDate, withProperties: ["range": granularity.rawValue])
321+
isInitialLoad = false
322+
}
323+
312324
func reloadAllFields() {
313325
reloadOrderFields()
314326
reloadSiteFields()

0 commit comments

Comments
 (0)