diff --git a/WordPress/Classes/Services/LoginFacade.m b/WordPress/Classes/Services/LoginFacade.m index 42ac8f5221de..dbd127f97c36 100644 --- a/WordPress/Classes/Services/LoginFacade.m +++ b/WordPress/Classes/Services/LoginFacade.m @@ -81,6 +81,7 @@ - (void)loginToWordPressDotComWithGoogleIDToken:(NSString *)googleIDToken } } failure:^(NSError *error) { [WPAppAnalytics track:WPAnalyticsStatLoginFailed error:error]; + [WPAppAnalytics track:WPAnalyticsStatLoginSocialFailure error:error]; if ([self.delegate respondsToSelector:@selector(displayRemoteError:)]) { [self.delegate displayRemoteError:error]; } diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsTrackerAutomatticTracks.m b/WordPress/Classes/Utility/Analytics/WPAnalyticsTrackerAutomatticTracks.m index c5839aeeacc7..1d0b738fa2a4 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsTrackerAutomatticTracks.m +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsTrackerAutomatticTracks.m @@ -514,6 +514,33 @@ + (TracksEventPair *)eventPairForStat:(WPAnalyticsStat)stat case WPAnalyticsStatLoginForgotPasswordClicked: eventName = @"login_forgot_password_clicked"; break; + case WPAnalyticsStatLoginSocialButtonClick: + eventName = @"login_social_button_click"; + break; + case WPAnalyticsStatLoginSocialButtonFailure: + eventName = @"login_social_button_failure"; + break; + case WPAnalyticsStatLoginSocialConnectSuccess: + eventName = @"login_social_connect_success"; + break; + case WPAnalyticsStatLoginSocialConnectFailure: + eventName = @"login_social_connect_failure"; + break; + case WPAnalyticsStatLoginSocialSuccess: + eventName = @"login_social_login_success"; + break; + case WPAnalyticsStatLoginSocialFailure: + eventName = @"login_social_login_failure"; + break; + case WPAnalyticsStatLoginSocial2faNeeded: + eventName = @"login_social_2fa_needed"; + break; + case WPAnalyticsStatLoginSocialAccountsNeedConnecting: + eventName = @"login_social_accounts_need_connecting"; + break; + case WPAnalyticsStatLoginSocialErrorUnknownUser: + eventName = @"login_social_error_unknown_user"; + break; case WPAnalyticsStatLogout: eventName = @"account_logout"; break; diff --git a/WordPress/Classes/ViewRelated/NUX/Login2FAViewController.swift b/WordPress/Classes/ViewRelated/NUX/Login2FAViewController.swift index 92f0b119f819..0d7ca0a1d840 100644 --- a/WordPress/Classes/ViewRelated/NUX/Login2FAViewController.swift +++ b/WordPress/Classes/ViewRelated/NUX/Login2FAViewController.swift @@ -168,6 +168,7 @@ class Login2FAViewController: LoginViewController, SigninKeyboardResponder { syncWPCom(username, authToken: authToken, requiredMultifactor: true) // Disconnect now that we're done with Google. GIDSignIn.sharedInstance().disconnect() + WPAppAnalytics.track(.loginSocialSuccess) } diff --git a/WordPress/Classes/ViewRelated/NUX/LoginEmailViewController.swift b/WordPress/Classes/ViewRelated/NUX/LoginEmailViewController.swift index 94439db7dba9..b069a9ac342a 100644 --- a/WordPress/Classes/ViewRelated/NUX/LoginEmailViewController.swift +++ b/WordPress/Classes/ViewRelated/NUX/LoginEmailViewController.swift @@ -172,6 +172,8 @@ class LoginEmailViewController: LoginViewController, SigninKeyboardResponder { GIDSignIn.sharedInstance().serverClientID = ApiCredentials.googleLoginServerClientId() GIDSignIn.sharedInstance().signIn() + + WPAppAnalytics.track(.loginSocialButtonClick) } @@ -338,6 +340,7 @@ class LoginEmailViewController: LoginViewController, SigninKeyboardResponder { if (error as NSError).code == WordPressComOAuthError.unknownUser.rawValue { errorTitle = NSLocalizedString("Connected But…", comment: "Title shown when a user logs in with Google but no matching WordPress.com account is found") errorDescription = NSLocalizedString("The Google account \"\(loginFields.username)\" doesn't match any account on WordPress.com", comment: "Description shown when a user logs in with Google but no matching WordPress.com account is found") + WPAppAnalytics.track(.loginSocialErrorUnknownUser) } else { errorTitle = NSLocalizedString("Unable To Connect", comment: "Shown when a user logs in with Google but it subsequently fails to work as login to WordPress.com") errorDescription = error.localizedDescription @@ -441,6 +444,7 @@ extension LoginEmailViewController { syncWPCom(username, authToken: authToken, requiredMultifactor: false) // Disconnect now that we're done with Google. GIDSignIn.sharedInstance().disconnect() + WPAppAnalytics.track(.loginSocialSuccess) } @@ -452,6 +456,7 @@ extension LoginEmailViewController { loginFields.emailAddress = email performSegue(withIdentifier: NUXAbstractViewController.SegueIdentifier.showWPComLogin, sender: self) + WPAppAnalytics.track(.loginSocialAccountsNeedConnecting) } @@ -460,19 +465,23 @@ extension LoginEmailViewController { loginFields.nonceUserID = userID performSegue(withIdentifier: NUXAbstractViewController.SegueIdentifier.show2FA, sender: self) + WPAppAnalytics.track(.loginSocial2faNeeded) } } extension LoginEmailViewController: GIDSignInDelegate { func sign(_ signIn: GIDSignIn?, didSignInFor user: GIDGoogleUser?, withError error: Error?) { - // TODO: finish implementing wpcom login via Google code guard let user = user, - let token = user.authentication.idToken, - let email = user.profile.email else { - // The Google SignIn for may have been canceled. - //TODO: Add analytis - configureViewLoading(false) - return + let token = user.authentication.idToken, + let email = user.profile.email else { + // The Google SignIn for may have been canceled. + if let err = error { + WPAppAnalytics.track(.loginSocialButtonFailure, error: err) + } else { + WPAppAnalytics.track(.loginSocialButtonFailure) + } + configureViewLoading(false) + return } // Store the email address and token. @@ -481,8 +490,6 @@ extension LoginEmailViewController: GIDSignInDelegate { loginFields.meta.socialServiceIDToken = token loginFacade.loginToWordPressDotCom(withGoogleIDToken: token) - - //TODO: Add analytis } } diff --git a/WordPress/Classes/ViewRelated/NUX/LoginViewController.swift b/WordPress/Classes/ViewRelated/NUX/LoginViewController.swift index 19d41e165bb0..6868c99d510e 100644 --- a/WordPress/Classes/ViewRelated/NUX/LoginViewController.swift +++ b/WordPress/Classes/ViewRelated/NUX/LoginViewController.swift @@ -190,9 +190,11 @@ extension LoginViewController: SigninWPComSyncHandler, LoginFacadeDelegate { let accountService = AccountService(managedObjectContext: ContextManager.sharedInstance().mainContext) accountService.connectToSocialService(service, serviceIDToken: token, success: { - // noop + WPAppAnalytics.track(.loginSocialConnectSuccess) + WPAppAnalytics.track(.loginSocialSuccess) }, failure: { error in DDLogError(error.description) + WPAppAnalytics.track(.loginSocialConnectFailure, error: error) // We're opting to let this call fail silently. // Our user has already successfully authenticated and can use the app -- // connecting the social service isn't critical. There's little to diff --git a/WordPressShared/WordPressShared/Core/Analytics/WPAnalytics.h b/WordPressShared/WordPressShared/Core/Analytics/WPAnalytics.h index df23e4426228..0aef7d8538aa 100644 --- a/WordPressShared/WordPressShared/Core/Analytics/WPAnalytics.h +++ b/WordPressShared/WordPressShared/Core/Analytics/WPAnalytics.h @@ -101,6 +101,15 @@ typedef NS_ENUM(NSUInteger, WPAnalyticsStat) { WPAnalyticsStatLoginURLFormViewed, WPAnalyticsStatLoginURLHelpScreenViewed, WPAnalyticsStatLoginUsernamePasswordFormViewed, + WPAnalyticsStatLoginSocialButtonClick, + WPAnalyticsStatLoginSocialButtonFailure, + WPAnalyticsStatLoginSocialConnectSuccess, + WPAnalyticsStatLoginSocialConnectFailure, + WPAnalyticsStatLoginSocialSuccess, + WPAnalyticsStatLoginSocialFailure, + WPAnalyticsStatLoginSocial2faNeeded, + WPAnalyticsStatLoginSocialAccountsNeedConnecting, + WPAnalyticsStatLoginSocialErrorUnknownUser, WPAnalyticsStatLogout, WPAnalyticsStatLowMemoryWarning, WPAnalyticsStatMediaLibraryDeletedItems,