diff options
Diffstat (limited to 'libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java')
-rw-r--r-- | libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java | 589 |
1 files changed, 589 insertions, 0 deletions
diff --git a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java new file mode 100644 index 000000000..76c181b9b --- /dev/null +++ b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerNosara.java @@ -0,0 +1,589 @@ +package org.wordpress.android.analytics; + +import android.content.Context; + +import com.automattic.android.tracks.TracksClient; + +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.util.AppLog; + +import java.util.HashMap; +import java.util.Map; + +public class AnalyticsTrackerNosara extends Tracker { + + private static final String JETPACK_USER = "jetpack_user"; + private static final String NUMBER_OF_BLOGS = "number_of_blogs"; + private static final String TRACKS_ANON_ID = "nosara_tracks_anon_id"; + + private static final String EVENTS_PREFIX = "wpandroid_"; + + private TracksClient mNosaraClient; + + public AnalyticsTrackerNosara(Context context) throws IllegalArgumentException { + super(context); + mNosaraClient = TracksClient.getClient(context); + } + + String getAnonIdPrefKey() { + return TRACKS_ANON_ID; + } + + @Override + public void track(AnalyticsTracker.Stat stat) { + track(stat, null); + } + + @Override + public void track(AnalyticsTracker.Stat stat, Map<String, ?> properties) { + if (mNosaraClient == null) { + return; + } + + String eventName = getEventNameForStat(stat); + if (eventName == null) { + AppLog.w(AppLog.T.STATS, "There is NO match for the event " + stat.name() + "stat"); + return; + } + + Map<String, Object> predefinedEventProperties = new HashMap<String, Object>(); + switch (stat) { + case EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY: + predefinedEventProperties.put("via", "local_library"); + break; + case EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY: + predefinedEventProperties.put("via", "media_library"); + break; + case EDITOR_ADDED_VIDEO_VIA_LOCAL_LIBRARY: + predefinedEventProperties.put("via", "local_library"); + break; + case EDITOR_ADDED_VIDEO_VIA_WP_MEDIA_LIBRARY: + predefinedEventProperties.put("via", "media_library"); + break; + case EDITOR_TAPPED_BLOCKQUOTE: + predefinedEventProperties.put("button", "blockquote"); + break; + case EDITOR_TAPPED_BOLD: + predefinedEventProperties.put("button", "bold"); + break; + case EDITOR_TAPPED_IMAGE: + predefinedEventProperties.put("button", "image"); + break; + case EDITOR_TAPPED_ITALIC: + predefinedEventProperties.put("button", "italic"); + break; + case EDITOR_TAPPED_LINK: + predefinedEventProperties.put("button", "link"); + break; + case EDITOR_TAPPED_MORE: + predefinedEventProperties.put("button", "more"); + break; + case EDITOR_TAPPED_STRIKETHROUGH: + predefinedEventProperties.put("button", "strikethrough"); + break; + case EDITOR_TAPPED_UNDERLINE: + predefinedEventProperties.put("button", "underline"); + break; + case EDITOR_TAPPED_HTML: + predefinedEventProperties.put("button", "html"); + break; + case EDITOR_TAPPED_ORDERED_LIST: + predefinedEventProperties.put("button", "ordered_list"); + break; + case EDITOR_TAPPED_UNLINK: + predefinedEventProperties.put("button", "unlink"); + break; + case EDITOR_TAPPED_UNORDERED_LIST: + predefinedEventProperties.put("button", "unordered_list"); + break; + case OPENED_POSTS: + predefinedEventProperties.put("menu_item", "posts"); + break; + case OPENED_PAGES: + predefinedEventProperties.put("menu_item", "pages"); + break; + case OPENED_COMMENTS: + predefinedEventProperties.put("menu_item", "comments"); + break; + case OPENED_VIEW_SITE: + predefinedEventProperties.put("menu_item", "view_site"); + break; + case OPENED_VIEW_ADMIN: + predefinedEventProperties.put("menu_item", "view_admin"); + break; + case OPENED_MEDIA_LIBRARY: + predefinedEventProperties.put("menu_item", "media_library"); + break; + case OPENED_BLOG_SETTINGS: + predefinedEventProperties.put("menu_item", "site_settings"); + break; + case STATS_PERIOD_DAYS_ACCESSED: + predefinedEventProperties.put("period", "days"); + break; + case STATS_PERIOD_WEEKS_ACCESSED: + predefinedEventProperties.put("period", "weeks"); + break; + case STATS_PERIOD_MONTHS_ACCESSED: + predefinedEventProperties.put("period", "months"); + break; + case STATS_PERIOD_YEARS_ACCESSED: + predefinedEventProperties.put("period", "years"); + break; + } + + final String user; + final TracksClient.NosaraUserType userType; + if (getWordPressComUserName() != null) { + user = getWordPressComUserName(); + userType = TracksClient.NosaraUserType.WPCOM; + } else { + // This is just a security checks since the anonID is already available here. + // refresh metadata is called on login/logout/startup and it loads/generates the anonId when necessary. + if (getAnonID() == null) { + user = generateNewAnonID(); + } else { + user = getAnonID(); + } + userType = TracksClient.NosaraUserType.ANON; + } + + + // create the merged JSON Object of properties + // Properties defined by the user have precedence over the default ones pre-defined at "event level" + final JSONObject propertiesToJSON; + if (properties != null && properties.size() > 0) { + propertiesToJSON = new JSONObject(properties); + for (String key : predefinedEventProperties.keySet()) { + try { + if (propertiesToJSON.has(key)) { + AppLog.w(AppLog.T.STATS, "The user has defined a property named: '" + key + "' that will override" + + "the same property pre-defined at event level. This may generate unexpected behavior!!"); + AppLog.w(AppLog.T.STATS, "User value: " + propertiesToJSON.get(key).toString() + " - pre-defined value: " + + predefinedEventProperties.get(key).toString()); + } else { + propertiesToJSON.put(key, predefinedEventProperties.get(key)); + } + } catch (JSONException e) { + AppLog.e(AppLog.T.STATS, "Error while merging user-defined properties with pre-defined properties", e); + } + } + } else{ + propertiesToJSON = new JSONObject(predefinedEventProperties); + } + + if (propertiesToJSON.length() > 0) { + mNosaraClient.track(EVENTS_PREFIX + eventName, propertiesToJSON, user, userType); + } else { + mNosaraClient.track(EVENTS_PREFIX + eventName, user, userType); + } + } + + + + @Override + public void endSession() { + this.flush(); + } + + @Override + public void flush() { + if (mNosaraClient == null) { + return; + } + mNosaraClient.flush(); + } + + @Override + public void refreshMetadata(AnalyticsMetadata metadata) { + if (mNosaraClient == null) { + return; + } + + try { + JSONObject properties = new JSONObject(); + properties.put(JETPACK_USER, metadata.isJetpackUser()); + properties.put(NUMBER_OF_BLOGS, metadata.getNumBlogs()); + mNosaraClient.registerUserProperties(properties); + } catch (JSONException e) { + AppLog.e(AppLog.T.UTILS, e); + } + + if (metadata.isUserConnected() && metadata.isWordPressComUser()) { + setWordPressComUserName(metadata.getUsername()); + // Re-unify the user + if (getAnonID() != null) { + mNosaraClient.trackAliasUser(getWordPressComUserName(), getAnonID(), TracksClient.NosaraUserType.WPCOM); + clearAnonID(); + } + } else { + // Not wpcom connected. Check if anonID is already present + setWordPressComUserName(null); + if (getAnonID() == null) { + generateNewAnonID(); + } + } + + + } + + + @Override + public void clearAllData() { + super.clearAllData(); + if (mNosaraClient == null) { + return; + } + mNosaraClient.clearUserProperties(); + } + + @Override + public void registerPushNotificationToken(String regId) { + return; + } + + public static String getEventNameForStat(AnalyticsTracker.Stat stat) { + switch (stat) { + case APPLICATION_OPENED: + return "application_opened"; + case APPLICATION_CLOSED: + return "application_closed"; + case APPLICATION_INSTALLED: + return "application_installed"; + case APPLICATION_UPGRADED: + return "application_upgraded"; + case READER_ACCESSED: + return "reader_accessed"; + case READER_ARTICLE_COMMENTED_ON: + return "reader_article_commented_on"; + case READER_ARTICLE_LIKED: + return "reader_article_liked"; + case READER_ARTICLE_OPENED: + return "reader_article_opened"; + case READER_ARTICLE_UNLIKED: + return "reader_article_unliked"; + case READER_BLOG_BLOCKED: + return "reader_blog_blocked"; + case READER_BLOG_FOLLOWED: + return "reader_site_followed"; + case READER_BLOG_PREVIEWED: + return "reader_blog_previewed"; + case READER_BLOG_UNFOLLOWED: + return "reader_site_unfollowed"; + case READER_DISCOVER_VIEWED: + return "reader_discover_viewed"; + case READER_INFINITE_SCROLL: + return "reader_infinite_scroll_performed"; + case READER_LIST_FOLLOWED: + return "reader_list_followed"; + case READER_LIST_LOADED: + return "reader_list_loaded"; + case READER_LIST_PREVIEWED: + return "reader_list_previewed"; + case READER_LIST_UNFOLLOWED: + return "reader_list_unfollowed"; + case READER_TAG_FOLLOWED: + return "reader_reader_tag_followed"; + case READER_TAG_LOADED: + return "reader_tag_loaded"; + case READER_TAG_PREVIEWED: + return "reader_tag_previewed"; + case READER_SEARCH_LOADED: + return "reader_search_loaded"; + case READER_SEARCH_PERFORMED: + return "reader_search_performed"; + case READER_SEARCH_RESULT_TAPPED: + return "reader_searchcard_clicked"; + case READER_TAG_UNFOLLOWED: + return "reader_reader_tag_unfollowed"; + case READER_RELATED_POST_CLICKED: + return "reader_related_post_clicked"; + case EDITOR_CREATED_POST: + return "editor_post_created"; + case EDITOR_SAVED_DRAFT: + return "editor_draft_saved"; + case EDITOR_DISCARDED_CHANGES: + return "editor_discarded_changes"; + case EDITOR_EDITED_IMAGE: + return "editor_image_edited"; + case EDITOR_ENABLED_NEW_VERSION: + return "editor_enabled_new_version"; + case EDITOR_TOGGLED_OFF: + return "editor_toggled_off"; + case EDITOR_TOGGLED_ON: + return "editor_toggled_on"; + case EDITOR_UPLOAD_MEDIA_FAILED: + return "editor_upload_media_failed"; + case EDITOR_UPLOAD_MEDIA_RETRIED: + return "editor_upload_media_retried"; + case EDITOR_CLOSED: + return "editor_closed"; + case EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY: + return "editor_photo_added"; + case EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY: + return "editor_photo_added"; + case EDITOR_ADDED_VIDEO_VIA_LOCAL_LIBRARY: + return "editor_video_added"; + case EDITOR_ADDED_VIDEO_VIA_WP_MEDIA_LIBRARY: + return "editor_video_added"; + case EDITOR_PUBLISHED_POST: + return "editor_post_published"; + case EDITOR_UPDATED_POST: + return "editor_post_updated"; + case EDITOR_SCHEDULED_POST: + return "editor_post_scheduled"; + case EDITOR_TAPPED_BLOCKQUOTE: + return "editor_button_tapped"; + case EDITOR_TAPPED_BOLD: + return "editor_button_tapped"; + case EDITOR_TAPPED_IMAGE: + return "editor_button_tapped"; + case EDITOR_TAPPED_ITALIC: + return "editor_button_tapped"; + case EDITOR_TAPPED_LINK: + return "editor_button_tapped"; + case EDITOR_TAPPED_MORE: + return "editor_button_tapped"; + case EDITOR_TAPPED_STRIKETHROUGH: + return "editor_button_tapped"; + case EDITOR_TAPPED_UNDERLINE: + return "editor_button_tapped"; + case EDITOR_TAPPED_HTML: + return "editor_button_tapped"; + case EDITOR_TAPPED_ORDERED_LIST: + return "editor_button_tapped"; + case EDITOR_TAPPED_UNLINK: + return "editor_button_tapped"; + case EDITOR_TAPPED_UNORDERED_LIST: + return "editor_button_tapped"; + case NOTIFICATIONS_ACCESSED: + return "notifications_accessed"; + case NOTIFICATIONS_OPENED_NOTIFICATION_DETAILS: + return "notifications_notification_details_opened"; + case NOTIFICATION_APPROVED: + return "notifications_approved"; + case NOTIFICATION_UNAPPROVED: + return "notifications_unapproved"; + case NOTIFICATION_REPLIED_TO: + return "notifications_replied_to"; + case NOTIFICATION_TRASHED: + return "notifications_trashed"; + case NOTIFICATION_FLAGGED_AS_SPAM: + return "notifications_flagged_as_spam"; + case NOTIFICATION_LIKED: + return "notifications_comment_liked"; + case NOTIFICATION_UNLIKED: + return "notifications_comment_unliked"; + case OPENED_POSTS: + return "site_menu_opened"; + case OPENED_PAGES: + return "site_menu_opened"; + case OPENED_COMMENTS: + return "site_menu_opened"; + case OPENED_VIEW_SITE: + return "site_menu_opened"; + case OPENED_VIEW_ADMIN: + return "site_menu_opened"; + case OPENED_MEDIA_LIBRARY: + return "site_menu_opened"; + case OPENED_BLOG_SETTINGS: + return "site_menu_opened"; + case OPENED_ACCOUNT_SETTINGS: + return "account_settings_opened"; + case OPENED_APP_SETTINGS: + return "app_settings_opened"; + case OPENED_MY_PROFILE: + return "my_profile_opened"; + case OPENED_PEOPLE_MANAGEMENT: + return "people_management_list_opened"; + case OPENED_PERSON: + return "people_management_details_opened"; + case CREATED_ACCOUNT: + return "account_created"; + case CREATED_SITE: + return "site_created"; + case SHARED_ITEM: + return "item_shared"; + case ADDED_SELF_HOSTED_SITE: + return "self_hosted_blog_added"; + case SIGNED_IN: + return "signed_in"; + case SIGNED_INTO_JETPACK: + return "signed_into_jetpack"; + case ACCOUNT_LOGOUT: + return "account_logout"; + case PERFORMED_JETPACK_SIGN_IN_FROM_STATS_SCREEN: + return "stats_screen_signed_into_jetpack"; + case STATS_ACCESSED: + return "stats_accessed"; + case STATS_INSIGHTS_ACCESSED: + return "stats_insights_accessed"; + case STATS_PERIOD_DAYS_ACCESSED: + return "stats_period_accessed"; + case STATS_PERIOD_WEEKS_ACCESSED: + return "stats_period_accessed"; + case STATS_PERIOD_MONTHS_ACCESSED: + return "stats_period_accessed"; + case STATS_PERIOD_YEARS_ACCESSED: + return "stats_period_accessed"; + case STATS_VIEW_ALL_ACCESSED: + return "stats_view_all_accessed"; + case STATS_SINGLE_POST_ACCESSED: + return "stats_single_post_accessed"; + case STATS_TAPPED_BAR_CHART: + return "stats_bar_chart_tapped"; + case STATS_SCROLLED_TO_BOTTOM: + return "stats_scrolled_to_bottom"; + case STATS_SELECTED_INSTALL_JETPACK: + return "stats_install_jetpack_selected"; + case STATS_SELECTED_CONNECT_JETPACK: + return "stats_connect_jetpack_selected"; + case STATS_WIDGET_ADDED: + return "stats_widget_added"; + case STATS_WIDGET_REMOVED: + return "stats_widget_removed"; + case STATS_WIDGET_TAPPED: + return "stats_widget_tapped"; + case PUSH_NOTIFICATION_RECEIVED: + return "push_notification_received"; + case PUSH_NOTIFICATION_TAPPED: + return "push_notification_alert_tapped"; + case SUPPORT_OPENED_HELPSHIFT_SCREEN: + return "support_helpshift_screen_opened"; + case SUPPORT_SENT_REPLY_TO_SUPPORT_MESSAGE: + return "support_reply_to_support_message_sent"; + case LOGIN_MAGIC_LINK_EXITED: + return "login_magic_link_exited"; + case LOGIN_MAGIC_LINK_FAILED: + return "login_magic_link_failed"; + case LOGIN_MAGIC_LINK_OPENED: + return "login_magic_link_opened"; + case LOGIN_MAGIC_LINK_REQUESTED: + return "login_magic_link_requested"; + case LOGIN_MAGIC_LINK_SUCCEEDED: + return "login_magic_link_succeeded"; + case LOGIN_FAILED: + return "login_failed_to_login"; + case LOGIN_FAILED_TO_GUESS_XMLRPC: + return "login_failed_to_guess_xmlrpc"; + case LOGIN_INSERTED_INVALID_URL: + return "login_inserted_invalid_url"; + case LOGIN_AUTOFILL_CREDENTIALS_FILLED: + return "login_autofill_credentials_filled"; + case LOGIN_AUTOFILL_CREDENTIALS_UPDATED: + return "login_autofill_credentials_updated"; + case PERSON_REMOVED: + return "people_management_person_removed"; + case PERSON_UPDATED: + return "people_management_person_updated"; + case PUSH_AUTHENTICATION_APPROVED: + return "push_authentication_approved"; + case PUSH_AUTHENTICATION_EXPIRED: + return "push_authentication_expired"; + case PUSH_AUTHENTICATION_FAILED: + return "push_authentication_failed"; + case PUSH_AUTHENTICATION_IGNORED: + return "push_authentication_ignored"; + case NOTIFICATION_SETTINGS_LIST_OPENED: + return "notification_settings_list_opened"; + case NOTIFICATION_SETTINGS_STREAMS_OPENED: + return "notification_settings_streams_opened"; + case NOTIFICATION_SETTINGS_DETAILS_OPENED: + return "notification_settings_details_opened"; + case ME_ACCESSED: + return "me_tab_accessed"; + case ME_GRAVATAR_TAPPED: + return "me_gravatar_tapped"; + case ME_GRAVATAR_TOOLTIP_TAPPED: + return "me_gravatar_tooltip_tapped"; + case ME_GRAVATAR_PERMISSIONS_INTERRUPTED: + return "me_gravatar_permissions_interrupted"; + case ME_GRAVATAR_PERMISSIONS_DENIED: + return "me_gravatar_permissions_denied"; + case ME_GRAVATAR_PERMISSIONS_ACCEPTED: + return "me_gravatar_permissions_accepted"; + case ME_GRAVATAR_SHOT_NEW: + return "me_gravatar_shot_new"; + case ME_GRAVATAR_GALLERY_PICKED: + return "me_gravatar_gallery_picked"; + case ME_GRAVATAR_CROPPED: + return "me_gravatar_cropped"; + case ME_GRAVATAR_UPLOADED: + return "me_gravatar_uploaded"; + case ME_GRAVATAR_UPLOAD_UNSUCCESSFUL: + return "me_gravatar_upload_unsuccessful"; + case ME_GRAVATAR_UPLOAD_EXCEPTION: + return "me_gravatar_upload_exception"; + case MY_SITE_ACCESSED: + return "my_site_tab_accessed"; + case THEMES_ACCESSED_THEMES_BROWSER: + return "themes_theme_browser_accessed"; + case THEMES_ACCESSED_SEARCH: + return "themes_search_accessed"; + case THEMES_CHANGED_THEME: + return "themes_theme_changed"; + case THEMES_PREVIEWED_SITE: + return "themes_theme_for_site_previewed"; + case THEMES_DEMO_ACCESSED: + return "themes_demo_accessed"; + case THEMES_CUSTOMIZE_ACCESSED: + return "themes_customize_accessed"; + case THEMES_SUPPORT_ACCESSED: + return "themes_support_accessed"; + case THEMES_DETAILS_ACCESSED: + return "themes_details_accessed"; + case ACCOUNT_SETTINGS_LANGUAGE_CHANGED: + return "account_settings_language_changed"; + case SITE_SETTINGS_ACCESSED: + return "site_settings_accessed"; + case SITE_SETTINGS_ACCESSED_MORE_SETTINGS: + return "site_settings_more_settings_accessed"; + case SITE_SETTINGS_ADDED_LIST_ITEM: + return "site_settings_added_list_item"; + case SITE_SETTINGS_DELETED_LIST_ITEMS: + return "site_settings_deleted_list_items"; + case SITE_SETTINGS_HINT_TOAST_SHOWN: + return "site_settings_hint_toast_shown"; + case SITE_SETTINGS_LEARN_MORE_CLICKED: + return "site_settings_learn_more_clicked"; + case SITE_SETTINGS_LEARN_MORE_LOADED: + return "site_settings_learn_more_loaded"; + case SITE_SETTINGS_SAVED_REMOTELY: + return "site_settings_saved_remotely"; + case SITE_SETTINGS_START_OVER_ACCESSED: + return "site_settings_start_over_accessed"; + case SITE_SETTINGS_START_OVER_CONTACT_SUPPORT_CLICKED: + return "site_settings_start_over_contact_support_clicked"; + case SITE_SETTINGS_EXPORT_SITE_ACCESSED: + return "site_settings_export_site_accessed"; + case SITE_SETTINGS_EXPORT_SITE_REQUESTED: + return "site_settings_export_site_requested"; + case SITE_SETTINGS_EXPORT_SITE_RESPONSE_OK: + return "site_settings_export_site_response_ok"; + case SITE_SETTINGS_EXPORT_SITE_RESPONSE_ERROR: + return "site_settings_export_site_response_error"; + case SITE_SETTINGS_DELETE_SITE_ACCESSED: + return "site_settings_delete_site_accessed"; + case SITE_SETTINGS_DELETE_SITE_PURCHASES_REQUESTED: + return "site_settings_delete_site_purchases_requested"; + case SITE_SETTINGS_DELETE_SITE_PURCHASES_SHOWN: + return "site_settings_delete_site_purchases_shown"; + case SITE_SETTINGS_DELETE_SITE_PURCHASES_SHOW_CLICKED: + return "site_settings_delete_site_purchases_show_clicked"; + case SITE_SETTINGS_DELETE_SITE_REQUESTED: + return "site_settings_delete_site_requested"; + case SITE_SETTINGS_DELETE_SITE_RESPONSE_OK: + return "site_settings_delete_site_response_ok"; + case SITE_SETTINGS_DELETE_SITE_RESPONSE_ERROR: + return "site_settings_delete_site_response_error"; + case ABTEST_START: + return "abtest_start"; + case TRAIN_TRACKS_RENDER: + return "traintracks_render"; + case TRAIN_TRACKS_INTERACT: + return "traintracks_interact"; + default: + return null; + } + } +} |