blob: 76c181b9b38e6412ea30a406e91462fe5bc91730 [file] [log] [blame]
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;
}
}
}