package com.kickstarter.libs; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.kickstarter.libs.utils.KoalaUtils; import com.kickstarter.models.Activity; import com.kickstarter.models.Project; import com.kickstarter.models.Update; import com.kickstarter.services.DiscoveryParams; import com.kickstarter.services.apiresponses.PushNotificationEnvelope; import com.kickstarter.ui.data.LoginReason; import java.util.HashMap; import java.util.Map; public final class Koala { private final @NonNull TrackingClientType client; public Koala(final @NonNull TrackingClientType client) { this.client = client; } public @NonNull TrackingClientType client() { return client; } // APPLICATION LIFECYCLE public void trackAppOpen() { client.track("App Open"); } public void trackAppClose() { client.track("App Close"); } public void trackMemoryWarning() { client.track("App Memory Warning"); } public void trackOpenedAppBanner() { client.track("Opened App Banner"); } // ANDROID PAY public void trackShowAndroidPaySheet() { client.track("Android Pay Show Sheet"); } public void trackAndroidPayFinished() { client.track("Android Pay Finished"); } public void trackAndroidPayCanceled() { client.track("Android Pay Canceled"); } // DISCOVERY public void trackDiscovery(final @NonNull DiscoveryParams params, final boolean isOnboardingVisible) { final Map<String, Object> props = KoalaUtils.discoveryParamsProperties(params); props.put("discover_onboarding_is_visible", isOnboardingVisible); client.track("Discover List View", props); } public void trackDiscoveryFilters() { client.track("Discover Switch Modal", new HashMap<String, Object>() { { put("modal_type", "filters"); } }); } public void trackDiscoveryFilterSelected(final @NonNull DiscoveryParams params) { client.track("Discover Modal Selected Filter", KoalaUtils.discoveryParamsProperties(params)); } /** * Tracks a project show event. * @param intentRefTag (nullable) The ref tag present in the activity upon displaying the project. * @param cookieRefTag (nullable) The ref tag extracted from the cookie store upon viewing the project. */ public void trackProjectShow(final @NonNull Project project, final @Nullable RefTag intentRefTag, final @Nullable RefTag cookieRefTag) { final Map<String, Object> properties = KoalaUtils.projectProperties(project); if (intentRefTag != null) { properties.put("ref_tag", intentRefTag.tag()); } if (cookieRefTag != null) { properties.put("referrer_credit", cookieRefTag.tag()); } // Deprecated event client.track(KoalaEvent.PROJECT_PAGE, properties); client.track(KoalaEvent.VIEWED_PROJECT_PAGE, properties); } // PROJECT STAR public void trackProjectStar(final @NonNull Project project) { final Map<String, Object> props = KoalaUtils.projectProperties(project); // Deprecated events client.track(project.isStarred() ? KoalaEvent.PROJECT_STAR : KoalaEvent.PROJECT_UNSTAR, props); client.track(project.isStarred() ? KoalaEvent.STARRED_PROJECT : KoalaEvent.UNSTARRED_PROJECT, props); } // COMMENTS public void trackLoadedOlderComments(final @NonNull Project project, final @Nullable Update update, final @NonNull KoalaContext.Comments context) { final Map<String, Object> props = update == null ? KoalaUtils.projectProperties(project) : KoalaUtils.updateProperties(project, update); props.put("context", context.getTrackingString()); client.track(KoalaEvent.LOADED_OLDER_COMMENTS, props); } /** * @deprecated Use {@link #trackLoadedOlderComments(Project, Update, KoalaContext.Comments)} instead. */ @Deprecated public void trackLoadedOlderProjectComments(final @NonNull Project project) { client.track(KoalaEvent.PROJECT_COMMENT_LOAD_OLDER, KoalaUtils.projectProperties(project)); } public void trackPostedComment(final @NonNull Project project, final @Nullable Update update, final @NonNull KoalaContext.CommentDialog context) { final Map<String, Object> props = update == null ? KoalaUtils.projectProperties(project) : KoalaUtils.updateProperties(project, update); props.put("context", context.getTrackingString()); client.track(KoalaEvent.POSTED_COMMENT, props); } /** * @deprecated Use {@link #trackPostedComment(Project, Update, KoalaContext.CommentDialog)} instead. */ @Deprecated public void trackProjectCommentCreate(final @NonNull Project project) { client.track(KoalaEvent.PROJECT_COMMENT_CREATE, KoalaUtils.projectProperties(project)); } /** * @deprecated Use {@link #trackViewedComments(Project, Update, KoalaContext.Comments)} instead. */ @Deprecated public void trackProjectCommentsView(final @NonNull Project project) { client.track(KoalaEvent.PROJECT_COMMENT_VIEW, KoalaUtils.projectProperties(project)); } public void trackViewedComments(final @NonNull Project project, final @Nullable Update update, final @NonNull KoalaContext.Comments context) { final Map<String, Object> props = update == null ? KoalaUtils.projectProperties(project) : KoalaUtils.updateProperties(project, update); props.put("context", context.getTrackingString()); client.track(KoalaEvent.VIEWED_COMMENTS, props); } // ACTIVITY public void trackActivityView(final int pageCount) { if (pageCount == 0) { client.track(KoalaEvent.ACTIVITY_VIEW); } else { client.track(KoalaEvent.ACTIVITY_LOAD_MORE, new HashMap<String, Object>() { { put("page_count", pageCount); } }); } } // SEARCH public void trackSearchView() { client.track(KoalaEvent.VIEWED_SEARCH); // deprecated client.track(KoalaEvent.DISCOVER_SEARCH_LEGACY); } public void trackSearchResults(final @NonNull String query, final int pageCount) { if (pageCount == 1) { final Map<String, Object> params = new HashMap<String, Object>() { { put("search_term", query); } }; client.track(KoalaEvent.LOADED_SEARCH_RESULTS, params); // deprecated client.track(KoalaEvent.DISCOVER_SEARCH_RESULTS_LEGACY, params); } else { final Map<String, Object> params = new HashMap<String, Object>() { { put("search_term", query); put("page_count", pageCount); } }; client.track(KoalaEvent.LOADED_MORE_SEARCH_RESULTS, params); // deprecated client.track(KoalaEvent.DISCOVER_SEARCH_RESULTS_LOAD_MORE_LEGACY, params); } } public void trackClearedSearchTerm() { client.track(KoalaEvent.CLEARED_SEARCH_TERM); } public void trackActivityTapped(final @NonNull Activity activity) { client.track(KoalaEvent.ACTIVITY_VIEW_ITEM, KoalaUtils.activityProperties(activity)); } // SESSION EVENTS public void trackLoginRegisterTout(final @NonNull LoginReason loginReason) { client.track("Application Login or Signup", new HashMap<String, Object>() { { put("intent", loginReason.trackingString()); } }); } public void trackLoginSuccess() { client.track("Login"); } public void trackLoginError() { client.track("Errored User Login"); } public void trackTwoFactorAuthView() { client.track("Two-factor Authentication Confirm View"); } public void trackTwoFactorResendCode() { client.track("Two-factor Authentication Resend Code"); } public void trackRegisterFormView() { client.track("User Signup"); } public void trackRegisterError() { client.track("Errored User Signup"); } public void trackRegisterSuccess() { client.track("New User"); } public void trackResetPasswordFormView() { client.track("Forgot Password View"); } public void trackResetPasswordSuccess() { client.track("Forgot Password Requested"); } public void trackResetPasswordError() { client.track("Forgot Password Errored"); } public void trackFacebookConfirmation() { client.track("Facebook Confirm"); } public void trackFacebookLoginSuccess() { client.track("Facebook Login"); } public void trackFacebookLoginError() { client.track("Errored Facebook Login"); } public void trackLogout() { client.track("Logout"); } public void trackSignupNewsletterToggle(final boolean sendNewsletters) { client.track("Signup Newsletter Toggle", new HashMap<String, Object>() { { put("send_newsletters", sendNewsletters); } }); } // SETTINGS public void trackContactEmailClicked() { client.track("Contact Email Clicked"); } public void trackNewsletterToggle(final boolean sendNewsletter) { if (sendNewsletter) { client.track("Newsletter Subscribe"); } else { client.track("Newsletter Unsubscribe"); } } public void trackSettingsView() { client.track("Settings View"); } // CHECKOUT public void trackCheckoutNext() { // rewards webview and top nav client.track("Checkout Next"); } public void trackCheckoutCancel() { client.track("Checkout Cancel"); } public void trackCheckoutLoadFailed() { // TODO: set up error props } public void trackCheckoutShowShareSheet() { client.track("Checkout Show Share Sheet"); } public void trackCheckoutCancelShareSheet() { client.track("Checkout Cancel Share Sheet"); } public void trackCheckoutShowFacebookShareView() { client.track("Checkout Show Share", new HashMap<String, Object>() { { put("share_type", "facebook"); } }); } public void trackCheckoutShowTwitterShareView() { client.track("Checkout Show Share", new HashMap<String, Object>() { { put("share_type", "twitter"); } }); } public void trackCheckoutShareFinished() { client.track("Checkout Share Finished"); } public void trackCheckoutFinishJumpToDiscovery() { client.track("Checkout Finished Discover More"); } public void trackCheckoutFinishJumpToProject() { client.track("Checkout Finished Discover Open Project"); } // SHARE public void trackShowProjectShareSheet() { client.track("Project Show Share Sheet"); } public void trackCancelProjectShareSheet() { client.track("Project Cancel Share Sheet"); } public void trackShowProjectFacebookShareView() { client.track("Project Show Share", new HashMap<String, Object>() { { put("share_type", "facebook"); } }); } public void trackShowProjectTwitterShareView() { client.track("Project Show Share", new HashMap<String, Object>() { { put("share_type", "twitter"); } }); } public void trackProjectFacebookShare() { client.track("Project Share", new HashMap<String, Object>() { { put("share_type", "facebook"); } }); } public void trackProjectTwitterShare() { client.track("Project Share", new HashMap<String, Object>() { { put("share_type", "twitter"); } }); } // PROFILE public void trackProfileView() { // deprecated client.track(KoalaEvent.PROFILE_VIEW_MY); client.track(KoalaEvent.VIEWED_PROFILE); } // RATING public void trackAppRatingNow() { client.track("Checkout Finished Alert App Store Rating Rate Now"); } public void trackAppRatingRemindLater() { client.track("Checkout Finished Alert App Store Rating Remind Later"); } public void trackAppRatingNoThanks() { client.track("Checkout Finished Alert App Store Rating No Thanks"); } // VIDEO public void trackVideoStart(final @NonNull Project project) { client.track("Project Video Start", KoalaUtils.projectProperties(project)); } // PROJECT UPDATES public void trackViewedUpdate(final @NonNull Project project, final @NonNull KoalaContext.Update context) { final Map<String, Object> props = KoalaUtils.projectProperties(project); props.put("context", context.getTrackingString()); client.track(KoalaEvent.VIEWED_UPDATE, props); } public void trackViewedUpdates(final @NonNull Project project) { client.track(KoalaEvent.VIEWED_UPDATES, KoalaUtils.projectProperties(project)); } // PUSH NOTIFICATIONS public void trackPushNotification(final @NonNull PushNotificationEnvelope envelope) { final Map<String, Object> properties = new HashMap<String, Object>() { { put("notification_type", "push"); if (envelope.activity() != null) { put("notification_subject", "activity"); put("notification_activity_category", envelope.activity().category()); } } }; client.track("Notification Opened", properties); } // WEBVIEWS public void trackOpenedExternalLink(final @NonNull Project project, final @NonNull KoalaContext.ExternalLink context) { final Map<String, Object> props = KoalaUtils.projectProperties(project); props.put("context", context.getTrackingString()); client.track(KoalaEvent.OPENED_EXTERNAL_LINK, props); } }