From 46be47ce30287c682cf7f99ad635bda8f5065dd7 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 14:59:17 -0400 Subject: [PATCH 01/19] Added TRAIN_TRACKS_RENDER and TRAIN_TRACKS_INTERACT to AnalyticsTracker --- .../org/wordpress/android/analytics/AnalyticsTracker.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java index 1ea37ac438d6..7608e4bd089f 100644 --- a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java +++ b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java @@ -182,7 +182,9 @@ public enum Stat { SITE_SETTINGS_DELETE_SITE_REQUESTED, SITE_SETTINGS_DELETE_SITE_RESPONSE_OK, SITE_SETTINGS_DELETE_SITE_RESPONSE_ERROR, - ABTEST_START + ABTEST_START, + TRAIN_TRACKS_RENDER, + TRAIN_TRACKS_INTERACT } private static final List TRACKERS = new ArrayList<>(); From 4b24e11609e3f7ddcecd77ff0414a470506016f6 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:08:03 -0400 Subject: [PATCH 02/19] Added AnalyticsRailcar model --- .../android/analytics/AnalyticsRailcar.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java diff --git a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java new file mode 100644 index 000000000000..317f5dabdbed --- /dev/null +++ b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java @@ -0,0 +1,91 @@ +package org.wordpress.android.analytics; + + +public class AnalyticsRailcar { + + private String railcarId; // a unique ID that we use for matching render and interaction events + + private String fetchAlg; // string identifying the algorithm that generated this + private String fetchLang; // the language(s) the algorithm was performed against + private String fetchQuery; // the user entered query + + private int fetchPosition; // The ranked position within the results + + private long blogId; // the blog id for this result + private long postId; // the post id for this result + private long feedId; // the feed id for this result + private long feedItemId; // the feed item id for this result + + public String getRailcarId() { + return railcarId; + } + + public void setRailcarId(String railcarId) { + this.railcarId = railcarId; + } + + public String getFetchAlg() { + return fetchAlg; + } + + public void setFetchAlg(String fetchAlg) { + this.fetchAlg = fetchAlg; + } + + public String getFetchLang() { + return fetchLang; + } + + public void setFetchLang(String fetchLang) { + this.fetchLang = fetchLang; + } + + public String getFetchQuery() { + return fetchQuery; + } + + public void setFetchQuery(String fetchQuery) { + this.fetchQuery = fetchQuery; + } + + public int getFetchPosition() { + return fetchPosition; + } + + public void setFetchPosition(int fetchPosition) { + this.fetchPosition = fetchPosition; + } + + public long getBlogId() { + return blogId; + } + + public void setBlogId(long blogId) { + this.blogId = blogId; + } + + public long getPostId() { + return postId; + } + + public void setPostId(long postId) { + this.postId = postId; + } + + public long getFeedId() { + return feedId; + } + + public void setFeedId(long feedId) { + this.feedId = feedId; + } + + public long getFeedItemId() { + return feedItemId; + } + + public void setFeedItemId(long feedItemId) { + this.feedItemId = feedItemId; + } + +} From 5b5082e3f0d86414f7237bf363c1609076728907 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:11:53 -0400 Subject: [PATCH 03/19] Added TRAIN_TRACKS_RENDER and TRAIN_TRACKS_INTERACT to nosara tracker --- .../wordpress/android/analytics/AnalyticsTrackerNosara.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 index aab9f6f1d33d..246e2c60f28e 100644 --- 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 @@ -570,6 +570,12 @@ public void track(AnalyticsTracker.Stat stat, Map properties) { case ABTEST_START: eventName = "abtest_start"; break; + case TRAIN_TRACKS_RENDER: + eventName = "traintracks_render"; + break; + case TRAIN_TRACKS_INTERACT: + eventName = "traintracks_interact"; + break; default: eventName = null; break; From 5bbf9be56c9679f47d25b47b80c42887ec884c5a Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:13:37 -0400 Subject: [PATCH 04/19] Added TRAIN_TRACKS_RENDER and TRAIN_TRACKS_INTERACT to mixpanel tracker --- .../wordpress/android/analytics/AnalyticsTrackerMixpanel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java index 0dd6dad250d9..2897925aff4c 100644 --- a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java +++ b/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java @@ -1058,6 +1058,10 @@ private AnalyticsTrackerMixpanelInstructionsForStat instructionsForStat( case ABTEST_START: instructions = AnalyticsTrackerMixpanelInstructionsForStat.mixpanelInstructionsForEventName("AB Test - Started"); break; + case TRAIN_TRACKS_RENDER: case TRAIN_TRACKS_INTERACT: + // Do nothing. These events are just for Tracks. + instructions = null; + break; default: instructions = null; break; From 5de054138fe1e9161b18a220c5c237d3fc9a8453 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:39:58 -0400 Subject: [PATCH 05/19] Moved model, added trackWithRailcar --- .../android/models}/AnalyticsRailcar.java | 2 +- .../android/util/AnalyticsUtils.java | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) rename {libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics => WordPress/src/main/java/org/wordpress/android/models}/AnalyticsRailcar.java (98%) diff --git a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java b/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java similarity index 98% rename from libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java rename to WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java index 317f5dabdbed..97094fee01dc 100644 --- a/libs/analytics/WordPressAnalytics/src/main/java/org/wordpress/android/analytics/AnalyticsRailcar.java +++ b/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java @@ -1,4 +1,4 @@ -package org.wordpress.android.analytics; +package org.wordpress.android.models; public class AnalyticsRailcar { diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 9348cdc47828..5ce267dd2739 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -5,10 +5,11 @@ import android.text.Html; import org.wordpress.android.WordPress; +import org.wordpress.android.analytics.AnalyticsMetadata; import org.wordpress.android.analytics.AnalyticsTracker; import org.wordpress.android.analytics.AnalyticsTrackerMixpanel; -import org.wordpress.android.analytics.AnalyticsMetadata; import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.models.AnalyticsRailcar; import org.wordpress.android.models.Blog; import org.wordpress.android.models.ReaderPost; @@ -22,6 +23,16 @@ public class AnalyticsUtils { private static String FEED_ITEM_ID_KEY = "feed_item_id"; private static String IS_JETPACK_KEY = "is_jetpack"; + private static String RAILCAR_ID_KEY = "railcar"; + private static String RAILCAR_FETCH_ALG_KEY = "fetch_alg"; + private static String RAILCAR_FETCH_POSITION_KEY = "fetch_position"; + private static String RAILCAR_FETCH_LANG_KEY = "fetch_lang"; + private static String RAILCAR_FETCH_QUERY_KEY = "fetch_query_key"; + private static String RAILCAR_BLOG_ID_KEY = "rec_blog_id"; + private static String RAILCAR_POST_ID_KEY = "rec_post_id"; + private static String RAILCAR_FEED_ID_KEY = "rec_feed_id"; + private static String RAILCAR_FEED_ITEM_ID_KEY = "rec_feed_item_id"; + /** * Utility method to refresh mixpanel metadata. * @@ -188,4 +199,31 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader properties.put(IS_JETPACK_KEY, post.isJetpack); AnalyticsTracker.track(stat, properties); } + + /** + * Bump Analytics with a TrainTracks railcar + * + * @param stat The Stat to bump + * @param railcar The railcar to track + * + */ + public static void trackWithRailcar(AnalyticsTracker.Stat stat, AnalyticsRailcar railcar) { + if (railcar == null) return; + + Map properties = new HashMap<>(); + + properties.put(RAILCAR_ID_KEY, railcar.getRailcarId()); + + properties.put(RAILCAR_FETCH_ALG_KEY, railcar.getFetchAlg()); + properties.put(RAILCAR_FETCH_POSITION_KEY, railcar.getFetchPosition()); + properties.put(RAILCAR_FETCH_LANG_KEY, railcar.getFetchLang()); + properties.put(RAILCAR_FETCH_QUERY_KEY, railcar.getFetchQuery()); + + properties.put(RAILCAR_BLOG_ID_KEY, railcar.getBlogId()); + properties.put(RAILCAR_POST_ID_KEY, railcar.getPostId()); + properties.put(RAILCAR_FEED_ID_KEY, railcar.getFeedId()); + properties.put(RAILCAR_FEED_ITEM_ID_KEY, railcar.getFeedItemId()); + + AnalyticsTracker.track(stat, properties); + } } From de05d9d19b622c3f1e056b5105e0c2909cd66a60 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:41:58 -0400 Subject: [PATCH 06/19] Changed AnalyticsRailcar to never return null for String getters --- .../org/wordpress/android/models/AnalyticsRailcar.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java b/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java index 97094fee01dc..75439933747d 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java +++ b/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java @@ -1,6 +1,8 @@ package org.wordpress.android.models; +import org.wordpress.android.util.StringUtils; + public class AnalyticsRailcar { private String railcarId; // a unique ID that we use for matching render and interaction events @@ -17,7 +19,7 @@ public class AnalyticsRailcar { private long feedItemId; // the feed item id for this result public String getRailcarId() { - return railcarId; + return StringUtils.notNullStr(railcarId); } public void setRailcarId(String railcarId) { @@ -25,7 +27,7 @@ public void setRailcarId(String railcarId) { } public String getFetchAlg() { - return fetchAlg; + return StringUtils.notNullStr(fetchAlg); } public void setFetchAlg(String fetchAlg) { @@ -33,7 +35,7 @@ public void setFetchAlg(String fetchAlg) { } public String getFetchLang() { - return fetchLang; + return StringUtils.notNullStr(fetchLang); } public void setFetchLang(String fetchLang) { @@ -41,7 +43,7 @@ public void setFetchLang(String fetchLang) { } public String getFetchQuery() { - return fetchQuery; + return StringUtils.notNullStr(fetchQuery); } public void setFetchQuery(String fetchQuery) { From 1aeda0ce46d4779ff74fce82e96d36efd4437435 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 15:49:44 -0400 Subject: [PATCH 07/19] Added railcarJson to ReaderPost model --- .../wordpress/android/models/ReaderPost.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index a0b95e7e6574..850d2ae728fd 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -10,7 +10,6 @@ import org.wordpress.android.ui.reader.utils.ImageSizeMap; import org.wordpress.android.ui.reader.utils.ReaderImageScanner; import org.wordpress.android.ui.reader.utils.ReaderUtils; -import org.wordpress.android.util.AppLog; import org.wordpress.android.util.DateTimeUtils; import org.wordpress.android.util.GravatarUtils; import org.wordpress.android.util.HtmlUtils; @@ -75,6 +74,8 @@ public class ReaderPost { public long xpostPostId; public long xpostBlogId; + private String railcarJson; + public static ReaderPost fromJson(JSONObject json) { if (json == null) { throw new IllegalArgumentException("null json post"); @@ -209,6 +210,12 @@ public static ReaderPost fromJson(JSONObject json) { .getLargestImage(ReaderConstants.MIN_FEATURED_IMAGE_WIDTH); } + // "railcar" data - currently used in search streams, used by TrainTracks + JSONObject jsonRailcar = json.optJSONObject("railcar"); + if (jsonRailcar != null) { + post.setRailcarJson(jsonRailcar.toString()); + } + return post; } @@ -604,6 +611,17 @@ public boolean canLikePost() { return (isWP() || isJetpack) && (!isDiscoverPost()); } + + public String getRailcarJson() { + return StringUtils.notNullStr(railcarJson); + } + public void setRailcarJson(String data) { + this.railcarJson = StringUtils.notNullStr(railcarJson); + } + public boolean hasRailcar() { + return !TextUtils.isEmpty(railcarJson); + } + /**** * the following are transient variables - not stored in the db or returned in the json - whose * sole purpose is to cache commonly-used values for the post that speeds up using them inside From 14a9b02e197271a2ef0acf3397ee2ad363fe3201 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 16:06:34 -0400 Subject: [PATCH 08/19] Added railcar_json to post table --- .../wordpress/android/datasets/ReaderDatabase.java | 3 ++- .../wordpress/android/datasets/ReaderPostTable.java | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java index ef9504c37c7b..9ae4f5521b05 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java @@ -19,7 +19,7 @@ */ public class ReaderDatabase extends SQLiteOpenHelper { protected static final String DB_NAME = "wpreader.db"; - private static final int DB_VERSION = 124; + private static final int DB_VERSION = 125; /* * version history @@ -76,6 +76,7 @@ public class ReaderDatabase extends SQLiteOpenHelper { * 122 - changed tbl_posts primary key to pseudo_id * 123 - changed tbl_posts.published to tbl_posts.date * 124 - returned tbl_posts.published + * 125 - added tbl_posts.railcar_json */ /* diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java index 1cd234f53ea6..af9b068913ed 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java @@ -63,7 +63,8 @@ public class ReaderPostTable { + "attachments_json," // 34 + "discover_json," // 35 + "xpost_post_id," // 36 - + "xpost_blog_id"; // 37 + + "xpost_blog_id," // 37 + + "railcar_json"; // 38 // used when querying multiple rows and skipping tbl_posts.text private static final String COLUMN_NAMES_NO_TEXT = @@ -102,7 +103,8 @@ public class ReaderPostTable { + "tbl_posts.attachments_json," // 33 + "tbl_posts.discover_json," // 34 + "tbl_posts.xpost_post_id," // 35 - + "tbl_posts.xpost_blog_id"; // 36 + + "tbl_posts.xpost_blog_id," // 36 + + "tbl_posts.railcar_json"; // 37 protected static void createTables(SQLiteDatabase db) { db.execSQL("CREATE TABLE tbl_posts (" @@ -143,6 +145,7 @@ protected static void createTables(SQLiteDatabase db) { + " discover_json TEXT," + " xpost_post_id INTEGER DEFAULT 0," + " xpost_blog_id INTEGER DEFAULT 0," + + " railcar_json TEXT," + " PRIMARY KEY (pseudo_id)" + ")"); @@ -642,7 +645,7 @@ public static void addOrUpdatePosts(final ReaderTag tag, ReaderPostList posts) { SQLiteStatement stmtPosts = db.compileStatement( "INSERT OR REPLACE INTO tbl_posts (" + COLUMN_NAMES - + ") VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30,?31,?32,?33,?34,?35,?36,?37)"); + + ") VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30,?31,?32,?33,?34,?35,?36,?37,?38)"); SQLiteStatement stmtTags = db.compileStatement( "INSERT OR REPLACE INTO tbl_post_tags (post_id, blog_id, feed_id, pseudo_id, tag_name, tag_type) VALUES (?1,?2,?3,?4,?5,?6)"); @@ -687,6 +690,7 @@ public static void addOrUpdatePosts(final ReaderTag tag, ReaderPostList posts) { stmtPosts.bindString(35, post.getDiscoverJson()); stmtPosts.bindLong (36, post.xpostPostId); stmtPosts.bindLong (37, post.xpostBlogId); + stmtPosts.bindString(38, post.getRailcarJson()); stmtPosts.execute(); } @@ -907,6 +911,8 @@ private static ReaderPost getPostFromCursor(Cursor c) { post.xpostPostId = c.getLong(c.getColumnIndex("xpost_post_id")); post.xpostBlogId = c.getLong(c.getColumnIndex("xpost_blog_id")); + post.setRailcarJson(c.getString(c.getColumnIndex("railcar_json"))); + return post; } From a1c50c22ad81c49c5aea2730aee97e9e644db8e8 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 16:12:55 -0400 Subject: [PATCH 09/19] Include railcar if it exists when tracking reader post details --- .../android/util/AnalyticsUtils.java | 55 +++++++------------ 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 5ce267dd2739..897738aa5dfb 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -4,16 +4,18 @@ import android.preference.PreferenceManager; import android.text.Html; +import org.json.JSONException; +import org.json.JSONObject; import org.wordpress.android.WordPress; import org.wordpress.android.analytics.AnalyticsMetadata; import org.wordpress.android.analytics.AnalyticsTracker; import org.wordpress.android.analytics.AnalyticsTrackerMixpanel; import org.wordpress.android.models.AccountHelper; -import org.wordpress.android.models.AnalyticsRailcar; import org.wordpress.android.models.Blog; import org.wordpress.android.models.ReaderPost; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; public class AnalyticsUtils { @@ -23,16 +25,6 @@ public class AnalyticsUtils { private static String FEED_ITEM_ID_KEY = "feed_item_id"; private static String IS_JETPACK_KEY = "is_jetpack"; - private static String RAILCAR_ID_KEY = "railcar"; - private static String RAILCAR_FETCH_ALG_KEY = "fetch_alg"; - private static String RAILCAR_FETCH_POSITION_KEY = "fetch_position"; - private static String RAILCAR_FETCH_LANG_KEY = "fetch_lang"; - private static String RAILCAR_FETCH_QUERY_KEY = "fetch_query_key"; - private static String RAILCAR_BLOG_ID_KEY = "rec_blog_id"; - private static String RAILCAR_POST_ID_KEY = "rec_post_id"; - private static String RAILCAR_FEED_ID_KEY = "rec_feed_id"; - private static String RAILCAR_FEED_ITEM_ID_KEY = "rec_feed_item_id"; - /** * Utility method to refresh mixpanel metadata. * @@ -197,33 +189,24 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader properties.put(FEED_ID_KEY, post.feedId); properties.put(FEED_ITEM_ID_KEY, post.feedItemId); properties.put(IS_JETPACK_KEY, post.isJetpack); - AnalyticsTracker.track(stat, properties); - } - - /** - * Bump Analytics with a TrainTracks railcar - * - * @param stat The Stat to bump - * @param railcar The railcar to track - * - */ - public static void trackWithRailcar(AnalyticsTracker.Stat stat, AnalyticsRailcar railcar) { - if (railcar == null) return; - - Map properties = new HashMap<>(); - - properties.put(RAILCAR_ID_KEY, railcar.getRailcarId()); - properties.put(RAILCAR_FETCH_ALG_KEY, railcar.getFetchAlg()); - properties.put(RAILCAR_FETCH_POSITION_KEY, railcar.getFetchPosition()); - properties.put(RAILCAR_FETCH_LANG_KEY, railcar.getFetchLang()); - properties.put(RAILCAR_FETCH_QUERY_KEY, railcar.getFetchQuery()); - - properties.put(RAILCAR_BLOG_ID_KEY, railcar.getBlogId()); - properties.put(RAILCAR_POST_ID_KEY, railcar.getPostId()); - properties.put(RAILCAR_FEED_ID_KEY, railcar.getFeedId()); - properties.put(RAILCAR_FEED_ITEM_ID_KEY, railcar.getFeedItemId()); + // add the TrainTracks railcar if it exists - this simply writes the railcar json + // to the properties using the existing json key names + if (post.hasRailcar()) { + try { + JSONObject jsonRailcar = new JSONObject(post.getRailcarJson()); + Iterator iter = jsonRailcar.keys(); + while (iter.hasNext()) { + String key = iter.next(); + Object value = jsonRailcar.get(key); + properties.put(key, value); + } + } catch (JSONException e) { + AppLog.e(AppLog.T.READER, e); + } + } AnalyticsTracker.track(stat, properties); } + } From 5130313bea6a20dc9da30e60b37058b29b7f20f2 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 16:14:50 -0400 Subject: [PATCH 10/19] Removed AnalyticsRailcar model --- .../android/models/AnalyticsRailcar.java | 93 ------------------- 1 file changed, 93 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java b/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java deleted file mode 100644 index 75439933747d..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/models/AnalyticsRailcar.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.wordpress.android.models; - - -import org.wordpress.android.util.StringUtils; - -public class AnalyticsRailcar { - - private String railcarId; // a unique ID that we use for matching render and interaction events - - private String fetchAlg; // string identifying the algorithm that generated this - private String fetchLang; // the language(s) the algorithm was performed against - private String fetchQuery; // the user entered query - - private int fetchPosition; // The ranked position within the results - - private long blogId; // the blog id for this result - private long postId; // the post id for this result - private long feedId; // the feed id for this result - private long feedItemId; // the feed item id for this result - - public String getRailcarId() { - return StringUtils.notNullStr(railcarId); - } - - public void setRailcarId(String railcarId) { - this.railcarId = railcarId; - } - - public String getFetchAlg() { - return StringUtils.notNullStr(fetchAlg); - } - - public void setFetchAlg(String fetchAlg) { - this.fetchAlg = fetchAlg; - } - - public String getFetchLang() { - return StringUtils.notNullStr(fetchLang); - } - - public void setFetchLang(String fetchLang) { - this.fetchLang = fetchLang; - } - - public String getFetchQuery() { - return StringUtils.notNullStr(fetchQuery); - } - - public void setFetchQuery(String fetchQuery) { - this.fetchQuery = fetchQuery; - } - - public int getFetchPosition() { - return fetchPosition; - } - - public void setFetchPosition(int fetchPosition) { - this.fetchPosition = fetchPosition; - } - - public long getBlogId() { - return blogId; - } - - public void setBlogId(long blogId) { - this.blogId = blogId; - } - - public long getPostId() { - return postId; - } - - public void setPostId(long postId) { - this.postId = postId; - } - - public long getFeedId() { - return feedId; - } - - public void setFeedId(long feedId) { - this.feedId = feedId; - } - - public long getFeedItemId() { - return feedItemId; - } - - public void setFeedItemId(long feedItemId) { - this.feedItemId = feedItemId; - } - -} From 1ceefab14f70bbe71e70e1b0a318e9a80b1b4d08 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 16:20:35 -0400 Subject: [PATCH 11/19] Only track railcar for interact/render events --- .../java/org/wordpress/android/util/AnalyticsUtils.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 897738aa5dfb..0eeb97242e65 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -190,9 +190,10 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader properties.put(FEED_ITEM_ID_KEY, post.feedItemId); properties.put(IS_JETPACK_KEY, post.isJetpack); - // add the TrainTracks railcar if it exists - this simply writes the railcar json - // to the properties using the existing json key names - if (post.hasRailcar()) { + // add the TrainTracks railcar if it exists and this is a train tracks event - this simply + // writes the railcar json to the properties using the existing json key names + if (post.hasRailcar() + && (stat == AnalyticsTracker.Stat.TRAIN_TRACKS_INTERACT || stat == AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER)) { try { JSONObject jsonRailcar = new JSONObject(post.getRailcarJson()); Iterator iter = jsonRailcar.keys(); From 338d70418035aedfcd2487c1fa542fdc61f340a1 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 16:42:50 -0400 Subject: [PATCH 12/19] Track TRAIN_TRACKS_RENDER when a post with a railcar is rendered --- .../wordpress/android/models/ReaderPost.java | 7 +++- .../ui/reader/adapters/ReaderPostAdapter.java | 7 ++++ .../android/util/AnalyticsUtils.java | 41 ++++++++++++------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index 850d2ae728fd..49785cb870e9 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -67,6 +67,9 @@ public class ReaderPost { public boolean isVideoPress; public boolean isJetpack; + // not recorded in the db - used to determine if this post has already been shown in a stream + public boolean isRendered; + private String attachmentsJson; private String discoverJson; private String format; @@ -615,8 +618,8 @@ public boolean canLikePost() { public String getRailcarJson() { return StringUtils.notNullStr(railcarJson); } - public void setRailcarJson(String data) { - this.railcarJson = StringUtils.notNullStr(railcarJson); + public void setRailcarJson(String jsonRailcar) { + this.railcarJson = StringUtils.notNullStr(jsonRailcar); } public boolean hasRailcar() { return !TextUtils.isEmpty(railcarJson); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index f2d10a421443..65855bee6e34 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -456,6 +456,13 @@ public void onClick(View v) { }); checkLoadMore(position); + + // if we haven't already rendered this post and it has a "railcar" attached to it, set it + // as rendered and record the TrainTracks render event + if (!post.isRendered && post.hasRailcar()) { + post.isRendered = true; + AnalyticsUtils.trackWithRailcar(AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER, post.getRailcarJson()); + } } /* diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 0eeb97242e65..dccfe1360224 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -3,6 +3,7 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.Html; +import android.text.TextUtils; import org.json.JSONException; import org.json.JSONObject; @@ -190,21 +191,33 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader properties.put(FEED_ITEM_ID_KEY, post.feedItemId); properties.put(IS_JETPACK_KEY, post.isJetpack); - // add the TrainTracks railcar if it exists and this is a train tracks event - this simply - // writes the railcar json to the properties using the existing json key names - if (post.hasRailcar() - && (stat == AnalyticsTracker.Stat.TRAIN_TRACKS_INTERACT || stat == AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER)) { - try { - JSONObject jsonRailcar = new JSONObject(post.getRailcarJson()); - Iterator iter = jsonRailcar.keys(); - while (iter.hasNext()) { - String key = iter.next(); - Object value = jsonRailcar.get(key); - properties.put(key, value); - } - } catch (JSONException e) { - AppLog.e(AppLog.T.READER, e); + AnalyticsTracker.track(stat, properties); + } + + /** + * Bump Analytics for a railcar - used with the TRAIN_TRACKS_RENDER and TRAIN_TRACKS_INTERACT + * events + * + * @param stat The Stat to bump + * @param post The JSON string of the railcar + * + */ + public static void trackWithRailcar(AnalyticsTracker.Stat stat, String railcarJson) { + if (TextUtils.isEmpty(railcarJson)) return; + + Map properties = new HashMap<>(); + + // this simply writes the railcar json to the properties using the existing json key names + try { + JSONObject jsonRailcar = new JSONObject(railcarJson); + Iterator iter = jsonRailcar.keys(); + while (iter.hasNext()) { + String key = iter.next(); + Object value = jsonRailcar.get(key); + properties.put(key, value); } + } catch (JSONException e) { + AppLog.e(AppLog.T.READER, e); } AnalyticsTracker.track(stat, properties); From dd045b58733e368f1827400b8f64423da1f8d3d7 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 17:02:40 -0400 Subject: [PATCH 13/19] Added trackRailcarInteract(), required changing AnalyticsTrackerNosara to return event name --- .../ui/reader/adapters/ReaderPostAdapter.java | 2 +- .../android/util/AnalyticsUtils.java | 37 +- .../analytics/AnalyticsTrackerNosara.java | 809 ++++++++---------- 3 files changed, 380 insertions(+), 468 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index 65855bee6e34..d28c1051df5a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -461,7 +461,7 @@ public void onClick(View v) { // as rendered and record the TrainTracks render event if (!post.isRendered && post.hasRailcar()) { post.isRendered = true; - AnalyticsUtils.trackWithRailcar(AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER, post.getRailcarJson()); + AnalyticsUtils.trackRailcarRender(post.getRailcarJson()); } } diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index dccfe1360224..155f8ca4acbd 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -2,6 +2,7 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; import android.text.Html; import android.text.TextUtils; @@ -11,6 +12,7 @@ import org.wordpress.android.analytics.AnalyticsMetadata; import org.wordpress.android.analytics.AnalyticsTracker; import org.wordpress.android.analytics.AnalyticsTrackerMixpanel; +import org.wordpress.android.analytics.AnalyticsTrackerNosara; import org.wordpress.android.models.AccountHelper; import org.wordpress.android.models.Blog; import org.wordpress.android.models.ReaderPost; @@ -19,6 +21,9 @@ import java.util.Iterator; import java.util.Map; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.TRAIN_TRACKS_INTERACT; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER; + public class AnalyticsUtils { private static String BLOG_ID_KEY = "blog_id"; private static String POST_ID_KEY = "post_id"; @@ -195,19 +200,37 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader } /** - * Bump Analytics for a railcar - used with the TRAIN_TRACKS_RENDER and TRAIN_TRACKS_INTERACT - * events + * Track when a railcar item has been rendered * - * @param stat The Stat to bump * @param post The JSON string of the railcar * */ - public static void trackWithRailcar(AnalyticsTracker.Stat stat, String railcarJson) { + public static void trackRailcarRender(String railcarJson) { if (TextUtils.isEmpty(railcarJson)) return; - Map properties = new HashMap<>(); + AnalyticsTracker.track(TRAIN_TRACKS_RENDER, railcarJsonToProperties(railcarJson)); + } + + /** + * Track when a railcar item has been interacted with + * + * @param stat The event that caused the interaction + * @param post The JSON string of the railcar + * + */ + public static void trackRailcarInteract(AnalyticsTracker.Stat stat, String railcarJson) { + if (TextUtils.isEmpty(railcarJson)) return; + + Map properties = railcarJsonToProperties(railcarJson); + properties.put("action", AnalyticsTrackerNosara.getEventNameForStat(stat)); + AnalyticsTracker.track(TRAIN_TRACKS_INTERACT, properties); + } - // this simply writes the railcar json to the properties using the existing json key names + /* + * Converts the JSON string of a railcar to a properties list using the existing json key names + */ + private static Map railcarJsonToProperties(@NonNull String railcarJson) { + Map properties = new HashMap<>(); try { JSONObject jsonRailcar = new JSONObject(railcarJson); Iterator iter = jsonRailcar.keys(); @@ -220,7 +243,7 @@ public static void trackWithRailcar(AnalyticsTracker.Stat stat, String railcarJs AppLog.e(AppLog.T.READER, e); } - AnalyticsTracker.track(stat, properties); + return properties; } } 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 index 246e2c60f28e..1d829e35542e 100644 --- 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 @@ -41,549 +41,95 @@ public void track(AnalyticsTracker.Stat stat, Map properties) { return; } - Map predefinedEventProperties = new HashMap(); - String eventName; + String eventName = getEventNameForStat(stat); + if (eventName == null) { + AppLog.w(AppLog.T.STATS, "There is NO match for the event " + stat.name() + "stat"); + return; + } + Map predefinedEventProperties = new HashMap(); switch (stat) { - case APPLICATION_OPENED: - eventName = "application_opened"; - break; - case APPLICATION_CLOSED: - eventName = "application_closed"; - break; - case APPLICATION_INSTALLED: - eventName = "application_installed"; - break; - case APPLICATION_UPGRADED: - eventName = "application_upgraded"; - break; - case READER_ACCESSED: - eventName = "reader_accessed"; - break; - case READER_ARTICLE_COMMENTED_ON: - eventName = "reader_article_commented_on"; - break; - case READER_ARTICLE_LIKED: - eventName = "reader_article_liked"; - break; - case READER_ARTICLE_OPENED: - eventName = "reader_article_opened"; - break; - case READER_ARTICLE_UNLIKED: - eventName = "reader_article_unliked"; - break; - case READER_BLOG_BLOCKED: - eventName = "reader_blog_blocked"; - break; - case READER_BLOG_FOLLOWED: - eventName = "reader_site_followed"; - break; - case READER_BLOG_PREVIEWED: - eventName = "reader_blog_previewed"; - break; - case READER_BLOG_UNFOLLOWED: - eventName = "reader_site_unfollowed"; - break; - case READER_DISCOVER_VIEWED: - eventName = "reader_discover_viewed"; - break; - case READER_INFINITE_SCROLL: - eventName = "reader_infinite_scroll_performed"; - break; - case READER_LIST_FOLLOWED: - eventName = "reader_list_followed"; - break; - case READER_LIST_LOADED: - eventName = "reader_list_loaded"; - break; - case READER_LIST_PREVIEWED: - eventName = "reader_list_previewed"; - break; - case READER_LIST_UNFOLLOWED: - eventName = "reader_list_unfollowed"; - break; - case READER_TAG_FOLLOWED: - eventName = "reader_reader_tag_followed"; - break; - case READER_TAG_LOADED: - eventName = "reader_tag_loaded"; - break; - case READER_TAG_PREVIEWED: - eventName = "reader_tag_previewed"; - break; - case READER_SEARCH_LOADED: - eventName = "reader_search_loaded"; - break; - case READER_SEARCH_PERFORMED: - eventName = "reader_search_performed"; - break; - case READER_SEARCH_RESULT_TAPPED: - eventName = "reader_searchcard_clicked"; - break; - case READER_TAG_UNFOLLOWED: - eventName = "reader_reader_tag_unfollowed"; - break; - case EDITOR_CREATED_POST: - eventName = "editor_post_created"; - break; - case EDITOR_SAVED_DRAFT: - eventName = "editor_draft_saved"; - break; - case EDITOR_DISCARDED_CHANGES: - eventName = "editor_discarded_changes"; - break; - case EDITOR_EDITED_IMAGE: - eventName = "editor_image_edited"; - break; - case EDITOR_ENABLED_NEW_VERSION: - eventName = "editor_enabled_new_version"; - break; - case EDITOR_TOGGLED_OFF: - eventName = "editor_toggled_off"; - break; - case EDITOR_TOGGLED_ON: - eventName = "editor_toggled_on"; - break; - case EDITOR_UPLOAD_MEDIA_FAILED: - eventName = "editor_upload_media_failed"; - break; - case EDITOR_UPLOAD_MEDIA_RETRIED: - eventName = "editor_upload_media_retried"; - break; - case EDITOR_CLOSED: - eventName = "editor_closed"; - break; case EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY: - eventName = "editor_photo_added"; predefinedEventProperties.put("via", "local_library"); break; case EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY: - eventName = "editor_photo_added"; predefinedEventProperties.put("via", "media_library"); break; case EDITOR_ADDED_VIDEO_VIA_LOCAL_LIBRARY: - eventName = "editor_video_added"; predefinedEventProperties.put("via", "local_library"); break; case EDITOR_ADDED_VIDEO_VIA_WP_MEDIA_LIBRARY: - eventName = "editor_video_added"; predefinedEventProperties.put("via", "media_library"); break; - case EDITOR_PUBLISHED_POST: - eventName = "editor_post_published"; - break; - case EDITOR_UPDATED_POST: - eventName = "editor_post_updated"; - break; - case EDITOR_SCHEDULED_POST: - eventName = "editor_post_scheduled"; - break; case EDITOR_TAPPED_BLOCKQUOTE: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "blockquote"); break; case EDITOR_TAPPED_BOLD: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "bold"); break; case EDITOR_TAPPED_IMAGE: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "image"); break; case EDITOR_TAPPED_ITALIC: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "italic"); break; case EDITOR_TAPPED_LINK: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "link"); break; case EDITOR_TAPPED_MORE: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "more"); break; case EDITOR_TAPPED_STRIKETHROUGH: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "strikethrough"); break; case EDITOR_TAPPED_UNDERLINE: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "underline"); break; case EDITOR_TAPPED_HTML: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "html"); break; case EDITOR_TAPPED_ORDERED_LIST: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "ordered_list"); break; case EDITOR_TAPPED_UNLINK: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "unlink"); break; case EDITOR_TAPPED_UNORDERED_LIST: - eventName = "editor_button_tapped"; predefinedEventProperties.put("button", "unordered_list"); break; - case NOTIFICATIONS_ACCESSED: - eventName = "notifications_accessed"; - break; - case NOTIFICATIONS_OPENED_NOTIFICATION_DETAILS: - eventName = "notifications_notification_details_opened"; - break; - case NOTIFICATION_APPROVED: - eventName = "notifications_approved"; - break; - case NOTIFICATION_UNAPPROVED: - eventName = "notifications_unapproved"; - break; - case NOTIFICATION_REPLIED_TO: - eventName = "notifications_replied_to"; - break; - case NOTIFICATION_TRASHED: - eventName = "notifications_trashed"; - break; - case NOTIFICATION_FLAGGED_AS_SPAM: - eventName = "notifications_flagged_as_spam"; - break; - case NOTIFICATION_LIKED: - eventName = "notifications_comment_liked"; - break; - case NOTIFICATION_UNLIKED: - eventName = "notifications_comment_unliked"; - break; case OPENED_POSTS: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "posts"); break; case OPENED_PAGES: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "pages"); break; case OPENED_COMMENTS: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "comments"); break; case OPENED_VIEW_SITE: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "view_site"); break; case OPENED_VIEW_ADMIN: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "view_admin"); break; case OPENED_MEDIA_LIBRARY: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "media_library"); break; case OPENED_BLOG_SETTINGS: - eventName = "site_menu_opened"; predefinedEventProperties.put("menu_item", "site_settings"); break; - case OPENED_ACCOUNT_SETTINGS: - eventName = "account_settings_opened"; - break; - case OPENED_APP_SETTINGS: - eventName = "app_settings_opened"; - break; - case OPENED_MY_PROFILE: - eventName = "my_profile_opened"; - break; - case OPENED_PEOPLE_MANAGEMENT: - eventName = "people_management_list_opened"; - break; - case OPENED_PERSON: - eventName = "people_management_details_opened"; - break; - case CREATED_ACCOUNT: - eventName = "account_created"; - break; - case CREATED_SITE: - eventName = "site_created"; - break; - case SHARED_ITEM: - eventName = "item_shared"; - break; - case ADDED_SELF_HOSTED_SITE: - eventName = "self_hosted_blog_added"; - break; - case SIGNED_IN: - eventName = "signed_in"; - break; - case SIGNED_INTO_JETPACK: - eventName = "signed_into_jetpack"; - break; - case ACCOUNT_LOGOUT: - eventName = "account_logout"; - break; - case PERFORMED_JETPACK_SIGN_IN_FROM_STATS_SCREEN: - eventName = "stats_screen_signed_into_jetpack"; - break; - case STATS_ACCESSED: - eventName = "stats_accessed"; - break; - case STATS_INSIGHTS_ACCESSED: - eventName = "stats_insights_accessed"; - break; case STATS_PERIOD_DAYS_ACCESSED: - eventName = "stats_period_accessed"; predefinedEventProperties.put("period", "days"); break; case STATS_PERIOD_WEEKS_ACCESSED: - eventName = "stats_period_accessed"; predefinedEventProperties.put("period", "weeks"); break; case STATS_PERIOD_MONTHS_ACCESSED: - eventName = "stats_period_accessed"; predefinedEventProperties.put("period", "months"); break; case STATS_PERIOD_YEARS_ACCESSED: - eventName = "stats_period_accessed"; predefinedEventProperties.put("period", "years"); break; - case STATS_VIEW_ALL_ACCESSED: - eventName = "stats_view_all_accessed"; - break; - case STATS_SINGLE_POST_ACCESSED: - eventName = "stats_single_post_accessed"; - break; - case STATS_TAPPED_BAR_CHART: - eventName = "stats_bar_chart_tapped"; - break; - case STATS_SCROLLED_TO_BOTTOM: - eventName = "stats_scrolled_to_bottom"; - break; - case STATS_SELECTED_INSTALL_JETPACK: - eventName = "stats_install_jetpack_selected"; - break; - case STATS_SELECTED_CONNECT_JETPACK: - eventName = "stats_connect_jetpack_selected"; - break; - case STATS_WIDGET_ADDED: - eventName = "stats_widget_added"; - break; - case STATS_WIDGET_REMOVED: - eventName = "stats_widget_removed"; - break; - case STATS_WIDGET_TAPPED: - eventName = "stats_widget_tapped"; - break; - case PUSH_NOTIFICATION_RECEIVED: - eventName = "push_notification_received"; - break; - case PUSH_NOTIFICATION_TAPPED: - eventName = "push_notification_alert_tapped"; - break; - case SUPPORT_OPENED_HELPSHIFT_SCREEN: - eventName = "support_helpshift_screen_opened"; - break; - case SUPPORT_SENT_REPLY_TO_SUPPORT_MESSAGE: - eventName = "support_reply_to_support_message_sent"; - break; - case LOGIN_MAGIC_LINK_EXITED: - eventName = "login_magic_link_exited"; - break; - case LOGIN_MAGIC_LINK_FAILED: - eventName = "login_magic_link_failed"; - break; - case LOGIN_MAGIC_LINK_OPENED: - eventName = "login_magic_link_opened"; - break; - case LOGIN_MAGIC_LINK_REQUESTED: - eventName = "login_magic_link_requested"; - break; - case LOGIN_MAGIC_LINK_SUCCEEDED: - eventName = "login_magic_link_succeeded"; - break; - case LOGIN_FAILED: - eventName = "login_failed_to_login"; - break; - case LOGIN_FAILED_TO_GUESS_XMLRPC: - eventName = "login_failed_to_guess_xmlrpc"; - break; - case LOGIN_INSERTED_INVALID_URL: - eventName = "login_inserted_invalid_url"; - break; - case LOGIN_AUTOFILL_CREDENTIALS_FILLED: - eventName = "login_autofill_credentials_filled"; - break; - case LOGIN_AUTOFILL_CREDENTIALS_UPDATED: - eventName = "login_autofill_credentials_updated"; - break; - case PERSON_REMOVED: - eventName = "people_management_person_removed"; - break; - case PERSON_UPDATED: - eventName = "people_management_person_updated"; - break; - case PUSH_AUTHENTICATION_APPROVED: - eventName = "push_authentication_approved"; - break; - case PUSH_AUTHENTICATION_EXPIRED: - eventName = "push_authentication_expired"; - break; - case PUSH_AUTHENTICATION_FAILED: - eventName = "push_authentication_failed"; - break; - case PUSH_AUTHENTICATION_IGNORED: - eventName = "push_authentication_ignored"; - break; - case NOTIFICATION_SETTINGS_LIST_OPENED: - eventName = "notification_settings_list_opened"; - break; - case NOTIFICATION_SETTINGS_STREAMS_OPENED: - eventName = "notification_settings_streams_opened"; - break; - case NOTIFICATION_SETTINGS_DETAILS_OPENED: - eventName = "notification_settings_details_opened"; - break; - case ME_ACCESSED: - eventName = "me_tab_accessed"; - break; - case ME_GRAVATAR_TAPPED: - eventName = "me_gravatar_tapped"; - break; - case ME_GRAVATAR_TOOLTIP_TAPPED: - eventName = "me_gravatar_tooltip_tapped"; - break; - case ME_GRAVATAR_PERMISSIONS_INTERRUPTED: - eventName = "me_gravatar_permissions_interrupted"; - break; - case ME_GRAVATAR_PERMISSIONS_DENIED: - eventName = "me_gravatar_permissions_denied"; - break; - case ME_GRAVATAR_PERMISSIONS_ACCEPTED: - eventName = "me_gravatar_permissions_accepted"; - break; - case ME_GRAVATAR_SHOT_NEW: - eventName = "me_gravatar_shot_new"; - break; - case ME_GRAVATAR_GALLERY_PICKED: - eventName = "me_gravatar_gallery_picked"; - break; - case ME_GRAVATAR_CROPPED: - eventName = "me_gravatar_cropped"; - break; - case ME_GRAVATAR_UPLOADED: - eventName = "me_gravatar_uploaded"; - break; - case ME_GRAVATAR_UPLOAD_UNSUCCESSFUL: - eventName = "me_gravatar_upload_unsuccessful"; - break; - case ME_GRAVATAR_UPLOAD_EXCEPTION: - eventName = "me_gravatar_upload_exception"; - break; - case MY_SITE_ACCESSED: - eventName = "my_site_tab_accessed"; - break; - case THEMES_ACCESSED_THEMES_BROWSER: - eventName = "themes_theme_browser_accessed"; - break; - case THEMES_ACCESSED_SEARCH: - eventName = "themes_search_accessed"; - break; - case THEMES_CHANGED_THEME: - eventName = "themes_theme_changed"; - break; - case THEMES_PREVIEWED_SITE: - eventName = "themes_theme_for_site_previewed"; - break; - case THEMES_DEMO_ACCESSED: - eventName = "themes_demo_accessed"; - break; - case THEMES_CUSTOMIZE_ACCESSED: - eventName = "themes_customize_accessed"; - break; - case THEMES_SUPPORT_ACCESSED: - eventName = "themes_support_accessed"; - break; - case THEMES_DETAILS_ACCESSED: - eventName = "themes_details_accessed"; - break; - case ACCOUNT_SETTINGS_LANGUAGE_CHANGED: - eventName = "account_settings_language_changed"; - break; - case SITE_SETTINGS_ACCESSED: - eventName = "site_settings_accessed"; - break; - case SITE_SETTINGS_ACCESSED_MORE_SETTINGS: - eventName = "site_settings_more_settings_accessed"; - break; - case SITE_SETTINGS_ADDED_LIST_ITEM: - eventName = "site_settings_added_list_item"; - break; - case SITE_SETTINGS_DELETED_LIST_ITEMS: - eventName = "site_settings_deleted_list_items"; - break; - case SITE_SETTINGS_HINT_TOAST_SHOWN: - eventName = "site_settings_hint_toast_shown"; - break; - case SITE_SETTINGS_LEARN_MORE_CLICKED: - eventName = "site_settings_learn_more_clicked"; - break; - case SITE_SETTINGS_LEARN_MORE_LOADED: - eventName = "site_settings_learn_more_loaded"; - break; - case SITE_SETTINGS_SAVED_REMOTELY: - eventName = "site_settings_saved_remotely"; - break; - case SITE_SETTINGS_START_OVER_ACCESSED: - eventName = "site_settings_start_over_accessed"; - break; - case SITE_SETTINGS_START_OVER_CONTACT_SUPPORT_CLICKED: - eventName = "site_settings_start_over_contact_support_clicked"; - break; - case SITE_SETTINGS_EXPORT_SITE_ACCESSED: - eventName = "site_settings_export_site_accessed"; - break; - case SITE_SETTINGS_EXPORT_SITE_REQUESTED: - eventName = "site_settings_export_site_requested"; - break; - case SITE_SETTINGS_EXPORT_SITE_RESPONSE_OK: - eventName = "site_settings_export_site_response_ok"; - break; - case SITE_SETTINGS_EXPORT_SITE_RESPONSE_ERROR: - eventName = "site_settings_export_site_response_error"; - break; - case SITE_SETTINGS_DELETE_SITE_ACCESSED: - eventName = "site_settings_delete_site_accessed"; - break; - case SITE_SETTINGS_DELETE_SITE_PURCHASES_REQUESTED: - eventName = "site_settings_delete_site_purchases_requested"; - break; - case SITE_SETTINGS_DELETE_SITE_PURCHASES_SHOWN: - eventName = "site_settings_delete_site_purchases_shown"; - break; - case SITE_SETTINGS_DELETE_SITE_PURCHASES_SHOW_CLICKED: - eventName = "site_settings_delete_site_purchases_show_clicked"; - break; - case SITE_SETTINGS_DELETE_SITE_REQUESTED: - eventName = "site_settings_delete_site_requested"; - break; - case SITE_SETTINGS_DELETE_SITE_RESPONSE_OK: - eventName = "site_settings_delete_site_response_ok"; - break; - case SITE_SETTINGS_DELETE_SITE_RESPONSE_ERROR: - eventName = "site_settings_delete_site_response_error"; - break; - case ABTEST_START: - eventName = "abtest_start"; - break; - case TRAIN_TRACKS_RENDER: - eventName = "traintracks_render"; - break; - case TRAIN_TRACKS_INTERACT: - eventName = "traintracks_interact"; - break; - default: - eventName = null; - break; - } - - if (eventName == null) { - AppLog.w(AppLog.T.STATS, "There is NO match for the event " + stat.name() + "stat"); - return; } final String user; @@ -695,4 +241,347 @@ public void clearAllData() { 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 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; + } + } } From 5163039a071b85c39657aa619b33674424dbb49d Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 17:16:55 -0400 Subject: [PATCH 14/19] Call trackRailcarInteract when tracking reader post event --- .../android/util/AnalyticsUtils.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 155f8ca4acbd..2606c857fb7a 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -21,6 +21,10 @@ import java.util.Iterator; import java.util.Map; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.READER_ARTICLE_COMMENTED_ON; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.READER_ARTICLE_LIKED; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.READER_ARTICLE_OPENED; +import static org.wordpress.android.analytics.AnalyticsTracker.Stat.READER_SEARCH_RESULT_TAPPED; import static org.wordpress.android.analytics.AnalyticsTracker.Stat.TRAIN_TRACKS_INTERACT; import static org.wordpress.android.analytics.AnalyticsTracker.Stat.TRAIN_TRACKS_RENDER; @@ -157,6 +161,10 @@ public static void trackWithBlogDetails(AnalyticsTracker.Stat stat, Long blogID) properties.put(BLOG_ID_KEY, blogID); } AnalyticsTracker.track(stat, properties); + + if (canTrackRailcarInteract(stat)) { + + } } /** @@ -197,6 +205,12 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader properties.put(IS_JETPACK_KEY, post.isJetpack); AnalyticsTracker.track(stat, properties); + + // record a railcar interact event if the post has a railcar and this can be tracked + // as an interaction + if (canTrackRailcarInteract(stat) && post.hasRailcar()) { + trackRailcarInteract(stat, post.getRailcarJson()); + } } /** @@ -226,6 +240,17 @@ public static void trackRailcarInteract(AnalyticsTracker.Stat stat, String railc AnalyticsTracker.track(TRAIN_TRACKS_INTERACT, properties); } + /** + * @param stat The event that would cause the interaction + * @return True if the passed stat event can be recorded as a railcar interact event + */ + private static boolean canTrackRailcarInteract(AnalyticsTracker.Stat stat) { + return stat == READER_ARTICLE_LIKED + || stat == READER_ARTICLE_OPENED + || stat == READER_SEARCH_RESULT_TAPPED + || stat == READER_ARTICLE_COMMENTED_ON; + } + /* * Converts the JSON string of a railcar to a properties list using the existing json key names */ From 4a0dfaa44485e68f1ee5e11b35adb28d2fee8981 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 17:19:22 -0400 Subject: [PATCH 15/19] Use trackWithReaderPostDetails when tracking a post being liked/unliked --- .../android/ui/reader/ReaderPostDetailFragment.java | 4 ++-- .../android/ui/reader/adapters/ReaderPostAdapter.java | 6 +++--- .../java/org/wordpress/android/util/AnalyticsUtils.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 2ecfec4bd997..f88c9baaf915 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -353,9 +353,9 @@ private void togglePostLike() { refreshIconCounts(); if (isAskingToLike) { - AnalyticsUtils.trackWithBlogDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, mBlogId); + AnalyticsUtils.trackWithReaderPostDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, mPost); } else { - AnalyticsUtils.trackWithBlogDetails(AnalyticsTracker.Stat.READER_ARTICLE_UNLIKED, mBlogId); + AnalyticsUtils.trackWithReaderPostDetails(AnalyticsTracker.Stat.READER_ARTICLE_UNLIKED, mPost); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index d28c1051df5a..0b16fc7d2dd8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -765,7 +765,7 @@ public void onClick(View v) { /* * triggered when user taps the like button (textView) */ - private void toggleLike(Context context, ReaderPostViewHolder holder,ReaderPost post) { + private void toggleLike(Context context, ReaderPostViewHolder holder, ReaderPost post) { if (post == null || !NetworkUtils.checkConnection(context)) { return; } @@ -780,12 +780,12 @@ private void toggleLike(Context context, ReaderPostViewHolder holder,ReaderPost } if (isAskingToLike) { - AnalyticsUtils.trackWithBlogDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, mCurrentBlogId != 0 ? mCurrentBlogId : null); + AnalyticsUtils.trackWithReaderPostDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, post); // Consider a like to be enough to push a page view - solves a long-standing question // from folks who ask 'why do I have more likes than page views?'. ReaderPostActions.bumpPageViewForPost(post); } else { - AnalyticsUtils.trackWithBlogDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, mCurrentBlogId != 0 ? mCurrentBlogId : null); + AnalyticsUtils.trackWithReaderPostDetails(AnalyticsTracker.Stat.READER_ARTICLE_LIKED, post); } // update post in array and on screen diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 2606c857fb7a..611bcca2dece 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -232,7 +232,7 @@ public static void trackRailcarRender(String railcarJson) { * @param post The JSON string of the railcar * */ - public static void trackRailcarInteract(AnalyticsTracker.Stat stat, String railcarJson) { + private static void trackRailcarInteract(AnalyticsTracker.Stat stat, String railcarJson) { if (TextUtils.isEmpty(railcarJson)) return; Map properties = railcarJsonToProperties(railcarJson); From 2a36994f8dba6d3a45caffbdf14c005e088387f6 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 17:21:54 -0400 Subject: [PATCH 16/19] Use trackWithReaderPostDetails when tracking a search result being tapped --- .../org/wordpress/android/ui/reader/ReaderPostListFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java index f245cd9ec506..69409385eaf2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java @@ -1444,7 +1444,7 @@ public void onPostSelected(ReaderPost post) { post.postId); break; case SEARCH_RESULTS: - AnalyticsTracker.track(AnalyticsTracker.Stat.READER_SEARCH_RESULT_TAPPED); + AnalyticsUtils.trackWithReaderPostDetails(AnalyticsTracker.Stat.READER_SEARCH_RESULT_TAPPED, post); ReaderActivityLauncher.showReaderPostDetail(getActivity(), post.blogId, post.postId); break; } From 86e9551d79ccbbd162654c16116a69a2e435b9d9 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 18:27:51 -0400 Subject: [PATCH 17/19] Removed unused canTrackRailcarInteract from trackWithBlogDetails --- .../main/java/org/wordpress/android/util/AnalyticsUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 611bcca2dece..1d48378caed8 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -161,10 +161,6 @@ public static void trackWithBlogDetails(AnalyticsTracker.Stat stat, Long blogID) properties.put(BLOG_ID_KEY, blogID); } AnalyticsTracker.track(stat, properties); - - if (canTrackRailcarInteract(stat)) { - - } } /** From 27518d3a5e4ba35acff16840e5033c6b55c60cec Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 18:52:29 -0400 Subject: [PATCH 18/19] Use HashSet to store rendered post IDs --- .../org/wordpress/android/models/ReaderPost.java | 3 --- .../ui/reader/adapters/ReaderPostAdapter.java | 13 +++++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index 49785cb870e9..8ce09db51e85 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -67,9 +67,6 @@ public class ReaderPost { public boolean isVideoPress; public boolean isJetpack; - // not recorded in the db - used to determine if this post has already been shown in a stream - public boolean isRendered; - private String attachmentsJson; private String discoverJson; private String format; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java index 0b16fc7d2dd8..090f79fe36d0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java @@ -46,6 +46,8 @@ import org.wordpress.android.util.UrlUtils; import org.wordpress.android.widgets.WPNetworkImageView; +import java.util.HashSet; + public class ReaderPostAdapter extends RecyclerView.Adapter { private ReaderTag mCurrentTag; private long mCurrentBlogId; @@ -64,6 +66,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter mRenderedIds = new HashSet<>(); private ReaderInterfaces.OnPostSelectedListener mPostSelectedListener; private ReaderInterfaces.OnTagSelectedListener mOnTagSelectedListener; @@ -457,10 +460,10 @@ public void onClick(View v) { checkLoadMore(position); - // if we haven't already rendered this post and it has a "railcar" attached to it, set it - // as rendered and record the TrainTracks render event - if (!post.isRendered && post.hasRailcar()) { - post.isRendered = true; + // if we haven't already rendered this post and it has a "railcar" attached to it, add it + // to the rendered list and record the TrainTracks render event + if (post.hasRailcar() && !mRenderedIds.contains(post.getPseudoId())) { + mRenderedIds.add(post.getPseudoId()); AnalyticsUtils.trackRailcarRender(post.getRailcarJson()); } } @@ -611,6 +614,7 @@ private ReaderTypes.ReaderPostListType getPostListType() { public void setCurrentTag(ReaderTag tag) { if (!ReaderTag.isSameTag(tag, mCurrentTag)) { mCurrentTag = tag; + mRenderedIds.clear(); reload(); } } @@ -624,6 +628,7 @@ public void setCurrentBlogAndFeed(long blogId, long feedId) { if (blogId != mCurrentBlogId || feedId != mCurrentFeedId) { mCurrentBlogId = blogId; mCurrentFeedId = feedId; + mRenderedIds.clear(); reload(); } } From e0eeb4263bf1f1af5d78d0ebb6bdbcdc652f8107 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 6 Sep 2016 19:09:47 -0400 Subject: [PATCH 19/19] Renamed "Interact" to "Interaction" --- .../org/wordpress/android/util/AnalyticsUtils.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java index 1d48378caed8..c8dd0867a59b 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java @@ -204,8 +204,8 @@ public static void trackWithReaderPostDetails(AnalyticsTracker.Stat stat, Reader // record a railcar interact event if the post has a railcar and this can be tracked // as an interaction - if (canTrackRailcarInteract(stat) && post.hasRailcar()) { - trackRailcarInteract(stat, post.getRailcarJson()); + if (canTrackRailcarInteraction(stat) && post.hasRailcar()) { + trackRailcarInteraction(stat, post.getRailcarJson()); } } @@ -228,7 +228,7 @@ public static void trackRailcarRender(String railcarJson) { * @param post The JSON string of the railcar * */ - private static void trackRailcarInteract(AnalyticsTracker.Stat stat, String railcarJson) { + private static void trackRailcarInteraction(AnalyticsTracker.Stat stat, String railcarJson) { if (TextUtils.isEmpty(railcarJson)) return; Map properties = railcarJsonToProperties(railcarJson); @@ -238,9 +238,9 @@ private static void trackRailcarInteract(AnalyticsTracker.Stat stat, String rail /** * @param stat The event that would cause the interaction - * @return True if the passed stat event can be recorded as a railcar interact event + * @return True if the passed stat event can be recorded as a railcar interaction */ - private static boolean canTrackRailcarInteract(AnalyticsTracker.Stat stat) { + private static boolean canTrackRailcarInteraction(AnalyticsTracker.Stat stat) { return stat == READER_ARTICLE_LIKED || stat == READER_ARTICLE_OPENED || stat == READER_SEARCH_RESULT_TAPPED