aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java
diff options
context:
space:
mode:
authorMario Zorz <mariozorz@gmail.com>2016-09-26 14:47:49 -0300
committerMario Zorz <mariozorz@gmail.com>2016-09-26 14:47:49 -0300
commit31ab9d71018ba7b4663bb8860b8b8ad7ad83cca8 (patch)
treeab83f69440daa0f40a2e290ea03480b302c74d33 /WordPress/src/main/java
parent678a6202126af34960dfd325520781e377906809 (diff)
parent8726084f865537f8e11754b3b4f618ad4b4c5bef (diff)
downloadgradle-perf-android-medium-31ab9d71018ba7b4663bb8860b8b8ad7ad83cca8.tar.gz
solved merge conflicts
Diffstat (limited to 'WordPress/src/main/java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/GCMMessageService.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/AccountTable.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java137
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/AccountModel.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Comment.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Note.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Person.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java73
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Role.java9
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java9
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/comments/CommentAdapter.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/comments/CommentDetailFragment.java84
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/main/MySiteFragment.java13
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerAdapter.java12
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/CommentUserNoteBlock.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java29
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java7
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java21
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderPostService.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderCommentsPostHeaderView.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderThumbnailStrip.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java81
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/DateTimeUtils.java178
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java2
-rw-r--r--WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java2
35 files changed, 350 insertions, 380 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/GCMMessageService.java b/WordPress/src/main/java/org/wordpress/android/GCMMessageService.java
index a816e224a..aaed60b7f 100644
--- a/WordPress/src/main/java/org/wordpress/android/GCMMessageService.java
+++ b/WordPress/src/main/java/org/wordpress/android/GCMMessageService.java
@@ -79,7 +79,7 @@ public class GCMMessageService extends GcmListenerService {
private void synchronizedHandleDefaultPush(String from, @NonNull Bundle data) {
// sActiveNotificationsMap being static, we can't just synchronize the method
- synchronized (sActiveNotificationsMap) {
+ synchronized (GCMMessageService.class) {
handleDefaultPush(from, data);
}
}
@@ -482,7 +482,9 @@ public class GCMMessageService extends GcmListenerService {
String noteType = StringUtils.notNullStr(remainingNote.getString(PUSH_ARG_TYPE));
String noteId = remainingNote.getString(PUSH_ARG_NOTE_ID, "");
- showIndividualNotificationForBuilder(builder, noteType, noteId, sActiveNotificationsMap.keyAt(0));
+ if (!sActiveNotificationsMap.isEmpty()) {
+ showIndividualNotificationForBuilder(builder, noteType, noteId, sActiveNotificationsMap.keyAt(0));
+ }
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/AccountTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/AccountTable.java
index fc4503e52..c66776c36 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/AccountTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/AccountTable.java
@@ -79,7 +79,7 @@ public class AccountTable {
values.put("first_name", account.getFirstName());
values.put("last_name", account.getLastName());
values.put("about_me", account.getAboutMe());
- values.put("date", DateTimeUtils.javaDateToIso8601(account.getDateCreated()));
+ values.put("date", DateTimeUtils.iso8601FromDate(account.getDateCreated()));
values.put("new_email", account.getNewEmail());
values.put("pending_email_change", account.getPendingEmailChange());
values.put("web_address", account.getWebAddress());
@@ -111,7 +111,7 @@ public class AccountTable {
account.setFirstName(c.getString(c.getColumnIndex("first_name")));
account.setLastName(c.getString(c.getColumnIndex("last_name")));
account.setAboutMe(c.getString(c.getColumnIndex("about_me")));
- account.setDateCreated(DateTimeUtils.iso8601ToJavaDate(c.getString(c.getColumnIndex("date"))));
+ account.setDateCreated(DateTimeUtils.dateFromIso8601(c.getString(c.getColumnIndex("date"))));
account.setNewEmail(c.getString(c.getColumnIndex("new_email")));
account.setPendingEmailChange(c.getInt(c.getColumnIndex("pending_email_change")) > 0);
account.setWebAddress(c.getString(c.getColumnIndex("web_address")));
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java
index 3717da76e..591b628c3 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java
@@ -148,7 +148,7 @@ public class ReaderBlogTable {
stmt.bindLong (9, SqlUtils.boolToSql(blogInfo.isJetpack));
stmt.bindLong (10, SqlUtils.boolToSql(blogInfo.isFollowing));
stmt.bindLong (11, blogInfo.numSubscribers);
- stmt.bindString(12, DateTimeUtils.javaDateToIso8601(new Date()));
+ stmt.bindString(12, DateTimeUtils.iso8601FromDate(new Date()));
stmt.execute();
} finally {
SqlUtils.closeStatement(stmt);
@@ -371,7 +371,7 @@ public class ReaderBlogTable {
return NEVER_UPDATED;
}
- Date dtUpdated = DateTimeUtils.iso8601ToJavaDate(updated);
+ Date dtUpdated = DateTimeUtils.dateFromIso8601(updated);
if (dtUpdated == null) {
return 0;
}
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 5983fe3f1..9ae4f5521 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 @@ import java.io.OutputStream;
*/
public class ReaderDatabase extends SQLiteOpenHelper {
protected static final String DB_NAME = "wpreader.db";
- private static final int DB_VERSION = 122;
+ private static final int DB_VERSION = 125;
/*
* version history
@@ -74,6 +74,9 @@ public class ReaderDatabase extends SQLiteOpenHelper {
* 120 - added "format" to tbl_posts
* 121 - removed word_count from tbl_posts
* 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 47142693f..af9b06891 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java
@@ -47,22 +47,24 @@ public class ReaderPostTable {
+ "featured_video," // 18
+ "post_avatar," // 19
+ "sort_index," // 20
- + "published," // 21
- + "num_replies," // 22
- + "num_likes," // 23
- + "is_liked," // 24
- + "is_followed," // 25
- + "is_comments_open," // 26
- + "is_external," // 27
- + "is_private," // 28
- + "is_videopress," // 29
- + "is_jetpack," // 30
- + "primary_tag," // 31
- + "secondary_tag," // 32
- + "attachments_json," // 33
- + "discover_json," // 34
- + "xpost_post_id," // 35
- + "xpost_blog_id"; // 36
+ + "date," // 21
+ + "published," // 22
+ + "num_replies," // 23
+ + "num_likes," // 24
+ + "is_liked," // 25
+ + "is_followed," // 26
+ + "is_comments_open," // 27
+ + "is_external," // 28
+ + "is_private," // 29
+ + "is_videopress," // 30
+ + "is_jetpack," // 31
+ + "primary_tag," // 32
+ + "secondary_tag," // 33
+ + "attachments_json," // 34
+ + "discover_json," // 35
+ + "xpost_post_id," // 36
+ + "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 =
@@ -85,22 +87,24 @@ public class ReaderPostTable {
+ "tbl_posts.short_url," // 17
+ "tbl_posts.post_avatar," // 18
+ "tbl_posts.sort_index," // 19
- + "tbl_posts.published," // 20
- + "tbl_posts.num_replies," // 21
- + "tbl_posts.num_likes," // 22
- + "tbl_posts.is_liked," // 23
- + "tbl_posts.is_followed," // 24
- + "tbl_posts.is_comments_open," // 25
- + "tbl_posts.is_external," // 26
- + "tbl_posts.is_private," // 27
- + "tbl_posts.is_videopress," // 28
- + "tbl_posts.is_jetpack," // 29
- + "tbl_posts.primary_tag," // 30
- + "tbl_posts.secondary_tag," // 31
- + "tbl_posts.attachments_json," // 32
- + "tbl_posts.discover_json," // 33
- + "tbl_posts.xpost_post_id," // 34
- + "tbl_posts.xpost_blog_id"; // 35
+ + "tbl_posts.date," // 20
+ + "tbl_posts.published," // 21
+ + "tbl_posts.num_replies," // 22
+ + "tbl_posts.num_likes," // 23
+ + "tbl_posts.is_liked," // 24
+ + "tbl_posts.is_followed," // 25
+ + "tbl_posts.is_comments_open," // 26
+ + "tbl_posts.is_external," // 27
+ + "tbl_posts.is_private," // 28
+ + "tbl_posts.is_videopress," // 29
+ + "tbl_posts.is_jetpack," // 30
+ + "tbl_posts.primary_tag," // 31
+ + "tbl_posts.secondary_tag," // 32
+ + "tbl_posts.attachments_json," // 33
+ + "tbl_posts.discover_json," // 34
+ + "tbl_posts.xpost_post_id," // 35
+ + "tbl_posts.xpost_blog_id," // 36
+ + "tbl_posts.railcar_json"; // 37
protected static void createTables(SQLiteDatabase db) {
db.execSQL("CREATE TABLE tbl_posts ("
@@ -124,6 +128,7 @@ public class ReaderPostTable {
+ " featured_video TEXT,"
+ " post_avatar TEXT,"
+ " sort_index REAL DEFAULT 0,"
+ + " date TEXT,"
+ " published TEXT,"
+ " num_replies INTEGER DEFAULT 0,"
+ " num_likes INTEGER DEFAULT 0,"
@@ -140,6 +145,7 @@ public class ReaderPostTable {
+ " discover_json TEXT,"
+ " xpost_post_id INTEGER DEFAULT 0,"
+ " xpost_blog_id INTEGER DEFAULT 0,"
+ + " railcar_json TEXT,"
+ " PRIMARY KEY (pseudo_id)"
+ ")");
@@ -445,35 +451,35 @@ public class ReaderPostTable {
}
/*
- * returns the iso8601 published date of the oldest post with the passed tag
+ * returns the iso8601 date of the oldest post with the passed tag
*/
- public static String getOldestPubDateWithTag(final ReaderTag tag) {
+ public static String getOldestDateWithTag(final ReaderTag tag) {
if (tag == null) {
return "";
}
- String sql = "SELECT tbl_posts.published FROM tbl_posts, tbl_post_tags"
+ String sql = "SELECT tbl_posts.date FROM tbl_posts, tbl_post_tags"
+ " WHERE tbl_posts.pseudo_id = tbl_post_tags.pseudo_id"
+ " AND tbl_post_tags.tag_name=? AND tbl_post_tags.tag_type=?"
- + " ORDER BY published LIMIT 1";
+ + " ORDER BY date LIMIT 1";
String[] args = {tag.getTagSlug(), Integer.toString(tag.tagType.toInt())};
return SqlUtils.stringForQuery(ReaderDatabase.getReadableDb(), sql, args);
}
/*
- * returns the iso8601 published date of the oldest post in the passed blog
+ * returns the iso8601 date of the oldest post in the passed blog
*/
- public static String getOldestPubDateInBlog(long blogId) {
- String sql = "SELECT published FROM tbl_posts"
+ public static String getOldestDateInBlog(long blogId) {
+ String sql = "SELECT date FROM tbl_posts"
+ " WHERE blog_id = ?"
- + " ORDER BY published LIMIT 1";
+ + " ORDER BY date LIMIT 1";
return SqlUtils.stringForQuery(ReaderDatabase.getReadableDb(), sql, new String[]{Long.toString(blogId)});
}
- public static String getOldestPubDateInFeed(long feedId) {
- String sql = "SELECT published FROM tbl_posts"
+ public static String getOldestDateInFeed(long feedId) {
+ String sql = "SELECT date FROM tbl_posts"
+ " WHERE feed_id = ?"
- + " ORDER BY published LIMIT 1";
+ + " ORDER BY date LIMIT 1";
return SqlUtils.stringForQuery(ReaderDatabase.getReadableDb(), sql, new String[]{Long.toString(feedId)});
}
@@ -522,13 +528,13 @@ public class ReaderPostTable {
ReaderDatabase.getWritableDb().execSQL(sql, args);
}
- public static String getGapMarkerPubDateForTag(ReaderTag tag) {
+ public static String getGapMarkerDateForTag(ReaderTag tag) {
ReaderBlogIdPostId ids = getGapMarkerIdsForTag(tag);
if (ids == null) {
return null;
}
String[] args = {Long.toString(ids.getBlogId()), Long.toString(ids.getPostId())};
- String sql = "SELECT published FROM tbl_posts WHERE blog_id=? AND post_id=?";
+ String sql = "SELECT date FROM tbl_posts WHERE blog_id=? AND post_id=?";
return SqlUtils.stringForQuery(ReaderDatabase.getReadableDb(), sql, args);
}
@@ -639,7 +645,7 @@ public class ReaderPostTable {
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)");
+ + ") 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)");
@@ -667,22 +673,24 @@ public class ReaderPostTable {
stmtPosts.bindString(18, post.getFeaturedVideo());
stmtPosts.bindString(19, post.getPostAvatar());
stmtPosts.bindDouble(20, post.sortIndex);
- stmtPosts.bindString(21, post.getPublished());
- stmtPosts.bindLong (22, post.numReplies);
- stmtPosts.bindLong (23, post.numLikes);
- stmtPosts.bindLong (24, SqlUtils.boolToSql(post.isLikedByCurrentUser));
- stmtPosts.bindLong (25, SqlUtils.boolToSql(post.isFollowedByCurrentUser));
- stmtPosts.bindLong (26, SqlUtils.boolToSql(post.isCommentsOpen));
- stmtPosts.bindLong (27, SqlUtils.boolToSql(post.isExternal));
- stmtPosts.bindLong (28, SqlUtils.boolToSql(post.isPrivate));
- stmtPosts.bindLong (29, SqlUtils.boolToSql(post.isVideoPress));
- stmtPosts.bindLong (30, SqlUtils.boolToSql(post.isJetpack));
- stmtPosts.bindString(31, post.getPrimaryTag());
- stmtPosts.bindString(32, post.getSecondaryTag());
- stmtPosts.bindString(33, post.getAttachmentsJson());
- stmtPosts.bindString(34, post.getDiscoverJson());
- stmtPosts.bindLong (35, post.xpostPostId);
- stmtPosts.bindLong (36, post.xpostBlogId);
+ stmtPosts.bindString(21, post.getDate());
+ stmtPosts.bindString(22, post.getPubDate());
+ stmtPosts.bindLong (23, post.numReplies);
+ stmtPosts.bindLong (24, post.numLikes);
+ stmtPosts.bindLong (25, SqlUtils.boolToSql(post.isLikedByCurrentUser));
+ stmtPosts.bindLong (26, SqlUtils.boolToSql(post.isFollowedByCurrentUser));
+ stmtPosts.bindLong (27, SqlUtils.boolToSql(post.isCommentsOpen));
+ stmtPosts.bindLong (28, SqlUtils.boolToSql(post.isExternal));
+ stmtPosts.bindLong (29, SqlUtils.boolToSql(post.isPrivate));
+ stmtPosts.bindLong (30, SqlUtils.boolToSql(post.isVideoPress));
+ stmtPosts.bindLong (31, SqlUtils.boolToSql(post.isJetpack));
+ stmtPosts.bindString(32, post.getPrimaryTag());
+ stmtPosts.bindString(33, post.getSecondaryTag());
+ stmtPosts.bindString(34, post.getAttachmentsJson());
+ stmtPosts.bindString(35, post.getDiscoverJson());
+ stmtPosts.bindLong (36, post.xpostPostId);
+ stmtPosts.bindLong (37, post.xpostBlogId);
+ stmtPosts.bindString(38, post.getRailcarJson());
stmtPosts.execute();
}
@@ -880,7 +888,8 @@ public class ReaderPostTable {
post.setPostAvatar(c.getString(c.getColumnIndex("post_avatar")));
post.sortIndex = c.getDouble(c.getColumnIndex("sort_index"));
- post.setPublished(c.getString(c.getColumnIndex("published")));
+ post.setDate(c.getString(c.getColumnIndex("date")));
+ post.setPubDate(c.getString(c.getColumnIndex("published")));
post.numReplies = c.getInt(c.getColumnIndex("num_replies"));
post.numLikes = c.getInt(c.getColumnIndex("num_likes"));
@@ -902,6 +911,8 @@ public class ReaderPostTable {
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;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java
index 9b527d3b6..77c54cf98 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java
@@ -35,7 +35,7 @@ public class ReaderSearchTable {
* adds the passed query string, updating the usage date
*/
public static void addOrUpdateQueryString(@NonNull String query) {
- String date = DateTimeUtils.javaDateToIso8601(new Date());
+ String date = DateTimeUtils.iso8601FromDate(new Date());
SQLiteStatement stmt = ReaderDatabase.getWritableDb().compileStatement(
"INSERT OR REPLACE INTO tbl_search_suggestions (query_string, date_used) VALUES (?1,?2)");
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java
index 864627715..b9f962c42 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java
@@ -277,7 +277,7 @@ public class ReaderTagTable {
return;
}
- String date = DateTimeUtils.javaDateToIso8601(new Date());
+ String date = DateTimeUtils.iso8601FromDate(new Date());
String sql = "UPDATE tbl_tags SET date_updated=?1 WHERE tag_slug=?2 AND tag_type=?3";
SQLiteStatement stmt = ReaderDatabase.getWritableDb().compileStatement(sql);
try {
@@ -312,7 +312,7 @@ public class ReaderTagTable {
return NEVER_UPDATED;
}
- Date dtUpdated = DateTimeUtils.iso8601ToJavaDate(updated);
+ Date dtUpdated = DateTimeUtils.dateFromIso8601(updated);
if (dtUpdated == null) {
return 0;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/AccountModel.java b/WordPress/src/main/java/org/wordpress/android/models/AccountModel.java
index f4d328c1b..93f3400ef 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/AccountModel.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/AccountModel.java
@@ -64,7 +64,7 @@ public class AccountModel {
mVisibleSiteCount = json.optInt("visible_site_count");
mEmail = json.optString("email");
- Date date = DateTimeUtils.iso8601ToJavaDate(json.optString("date"));
+ Date date = DateTimeUtils.dateFromIso8601(json.optString("date"));
if (date != null) {
mDateCreated = date;
} else {
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Comment.java b/WordPress/src/main/java/org/wordpress/android/models/Comment.java
index e737b842e..7ec244b53 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Comment.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Comment.java
@@ -179,7 +179,7 @@ public class Comment {
private transient java.util.Date dtPublished;
public java.util.Date getDatePublished() {
if (dtPublished == null)
- dtPublished = DateTimeUtils.iso8601ToJavaDate(published);
+ dtPublished = DateTimeUtils.dateFromIso8601(published);
return dtPublished;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Note.java b/WordPress/src/main/java/org/wordpress/android/models/Note.java
index f983dc891..7dc1a463b 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Note.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Note.java
@@ -303,7 +303,7 @@ public class Note extends Syncable {
* Get the timestamp provided by the API for the note
*/
public long getTimestamp() {
- return DateTimeUtils.iso8601ToTimestamp(queryJSON("timestamp", ""));
+ return DateTimeUtils.timestampFromIso8601(queryJSON("timestamp", ""));
}
public JSONArray getBody() {
@@ -417,7 +417,7 @@ public class Note extends Syncable {
getPostId(),
getCommentId(),
getCommentAuthorName(),
- DateTimeUtils.timestampToIso8601Str(getTimestamp()),
+ DateTimeUtils.iso8601FromTimestamp(getTimestamp()),
getCommentText(),
CommentStatus.toString(getCommentStatus()),
"", // post title is unavailable in note model
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Person.java b/WordPress/src/main/java/org/wordpress/android/models/Person.java
index 96fae4be8..f5c841bb4 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Person.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Person.java
@@ -160,7 +160,7 @@ public class Person {
private transient java.util.Date dtSubscribed;
public java.util.Date getDateSubscribed() {
if (dtSubscribed == null)
- dtSubscribed = DateTimeUtils.iso8601ToJavaDate(subscribed);
+ dtSubscribed = DateTimeUtils.dateFromIso8601(subscribed);
return dtSubscribed;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java b/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java
index 28a8d0890..b9ddd7e26 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java
@@ -164,7 +164,7 @@ public class PostsListPost {
if (getStatusEnum() == PostStatus.SCHEDULED) {
return DateUtils.formatDateTime(WordPress.getContext(), dateCreatedGmt, DateUtils.FORMAT_ABBREV_ALL);
} else {
- return DateTimeUtils.javaDateToTimeSpan(new Date(dateCreatedGmt));
+ return DateTimeUtils.javaDateToTimeSpan(new Date(dateCreatedGmt), WordPress.getContext());
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
index 139a72389..f0d92cf08 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
@@ -49,7 +49,7 @@ public class ReaderComment {
comment.text = HtmlUtils.stripScript(JSONUtils.getString(json, "content"));
comment.published = JSONUtils.getString(json, "date");
- comment.timestamp = DateTimeUtils.iso8601ToTimestamp(comment.published);
+ comment.timestamp = DateTimeUtils.timestampFromIso8601(comment.published);
JSONObject jsonPost = json.optJSONObject("post");
if (jsonPost != null) {
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 b33d1ab2b..ee96aaa5f 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java
@@ -39,8 +39,17 @@ public class ReaderPost {
private String primaryTag; // most popular tag on this post based on usage in blog
private String secondaryTag; // second most popular tag on this post based on usage in blog
+ /*
+ * the "date" field is a generic date which depends on the stream the post is from:
+ * - for tagged posts, this is the date the post was tagged
+ * - for liked posts, this is the date the post was liked
+ * - for other posts, this is the date the post was published
+ * this date is used when requesting older posts from the backend, and is also used
+ * to generate the sortIndex below (which determines how posts are sorted for display)
+ */
+ private String date;
+ private String pubDate;
public double sortIndex;
- private String published;
private String url;
private String shortUrl;
@@ -65,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");
@@ -114,17 +125,21 @@ public class ReaderPost {
post.featuredImage = JSONUtils.getString(json, "featured_image");
post.blogName = JSONUtils.getStringDecoded(json, "site_name");
- post.published = JSONUtils.getString(json, "date");
+ post.pubDate = JSONUtils.getString(json, "date");
- // sort index determines how posts are sorted - this is a liked date for liked
- // posts, and published date for all others
+ // a post's date is the liked date for liked posts, tagged date for tag streams, and
+ // published date for all others
if (json.has("date_liked")) {
- String likeDate = JSONUtils.getString(json, "date_liked");
- post.sortIndex = DateTimeUtils.iso8601ToTimestamp(likeDate);
+ post.date = JSONUtils.getString(json, "date_liked");
+ } else if (json.has("tagged_on")) {
+ post.date = JSONUtils.getString(json, "tagged_on");
} else {
- post.sortIndex = DateTimeUtils.iso8601ToTimestamp(post.published);
+ post.date = post.pubDate;
}
+ // sort index determines how posts are sorted, which is based on the date retrieved above
+ post.sortIndex = DateTimeUtils.timestampFromIso8601(post.date);
+
// if the post is untitled, make up a title from the excerpt
if (!post.hasTitle() && post.hasExcerpt()) {
post.title = extractTitle(post.excerpt, 50);
@@ -195,6 +210,12 @@ public class ReaderPost {
.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;
}
@@ -424,11 +445,18 @@ public class ReaderPost {
this.pseudoId = StringUtils.notNullStr(pseudoId);
}
- public String getPublished() {
- return StringUtils.notNullStr(published);
+ public String getDate() {
+ return StringUtils.notNullStr(date);
+ }
+ public void setDate(String dateStr) {
+ this.date = StringUtils.notNullStr(dateStr);
+ }
+
+ public String getPubDate() {
+ return StringUtils.notNullStr(pubDate);
}
- public void setPublished(String published) {
- this.published = StringUtils.notNullStr(published);
+ public void setPubDate(String published) {
+ this.pubDate = StringUtils.notNullStr(published);
}
public String getPrimaryTag() {
@@ -583,6 +611,17 @@ public class ReaderPost {
return (isWP() || isJetpack) && (!isDiscoverPost());
}
+
+ public String getRailcarJson() {
+ return StringUtils.notNullStr(railcarJson);
+ }
+ public void setRailcarJson(String jsonRailcar) {
+ this.railcarJson = StringUtils.notNullStr(jsonRailcar);
+ }
+ 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
@@ -633,14 +672,14 @@ public class ReaderPost {
}
/*
- * converts iso8601 published date to an actual java date
+ * converts iso8601 pubDate to a java date for display - this is the date that appears on posts
*/
- private transient java.util.Date dtPublished;
- public java.util.Date getDatePublished() {
- if (dtPublished == null) {
- dtPublished = DateTimeUtils.iso8601ToJavaDate(published);
+ private transient java.util.Date dtDisplay;
+ public java.util.Date getDisplayDate() {
+ if (dtDisplay == null) {
+ dtDisplay = DateTimeUtils.dateFromIso8601(this.pubDate);
}
- return dtPublished;
+ return dtDisplay;
}
/*
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Role.java b/WordPress/src/main/java/org/wordpress/android/models/Role.java
index a13449b0c..4266ba561 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Role.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Role.java
@@ -4,6 +4,8 @@ import android.support.annotation.StringRes;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.CrashlyticsUtils;
public enum Role {
ADMIN(R.string.role_admin),
@@ -38,7 +40,12 @@ public enum Role {
case "viewer":
return VIEWER;
}
- throw new IllegalArgumentException("All roles must be handled");
+ Exception e = new IllegalArgumentException("All roles must be handled: " + role);
+ CrashlyticsUtils.logException(e, CrashlyticsUtils.ExceptionType.SPECIFIC, AppLog.T.PEOPLE);
+
+ // All roles should have been handled, but in case an edge case occurs,
+ // using "Contributor" role is the safest option
+ return CONTRIBUTOR;
}
@Override
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
index 47dd8d809..584a0b12e 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
@@ -114,7 +114,7 @@ public class SignInFragment extends AbstractFragment implements TextWatcher {
protected WPTextView mJetpackAuthLabel;
protected ImageView mInfoButton;
protected ImageView mInfoButtonSecondary;
-
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -312,12 +312,15 @@ public class SignInFragment extends AbstractFragment implements TextWatcher {
}
public boolean canAutofillUsernameAndPassword() {
- return EditTextUtils.getText(mUsernameEditText).isEmpty() && EditTextUtils.getText(mPasswordEditText).isEmpty();
+ return EditTextUtils.getText(mUsernameEditText).isEmpty()
+ && EditTextUtils.getText(mPasswordEditText).isEmpty()
+ && mUsernameEditText != null
+ && mPasswordEditText != null;
}
public void onCredentialRetrieved(Credential credential) {
AppLog.d(T.NUX, "Retrieved username from SmartLock: " + credential.getId());
- if (canAutofillUsernameAndPassword()) {
+ if (isAdded() && canAutofillUsernameAndPassword()) {
track(Stat.LOGIN_AUTOFILL_CREDENTIALS_FILLED, null);
mUsernameEditText.setText(credential.getId());
mPasswordEditText.setText(credential.getPassword());
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentAdapter.java
index 0dca048ec..d5e5bd6fb 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentAdapter.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentAdapter.java
@@ -169,7 +169,7 @@ class CommentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
holder.txtTitle.setText(Html.fromHtml(comment.getFormattedTitle()));
holder.txtComment.setText(comment.getUnescapedCommentTextWithDrawables());
- holder.txtDate.setText(DateTimeUtils.javaDateToTimeSpan(comment.getDatePublished()));
+ holder.txtDate.setText(DateTimeUtils.javaDateToTimeSpan(comment.getDatePublished(), mContext));
// status is only shown for comments that haven't been approved
final boolean showStatus;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentDetailFragment.java
index 4c4688a59..401c06635 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentDetailFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentDetailFragment.java
@@ -28,6 +28,7 @@ import com.android.volley.VolleyError;
import com.simperium.client.BucketObjectMissingException;
import com.wordpress.rest.RestRequest;
+import org.apache.commons.lang.StringEscapeUtils;
import org.json.JSONObject;
import org.wordpress.android.Constants;
import org.wordpress.android.R;
@@ -84,36 +85,31 @@ import de.greenrobot.event.EventBus;
* prior to this there were separate comment detail screens for each list
*/
public class CommentDetailFragment extends Fragment implements NotificationFragment {
+ private static final String KEY_LOCAL_BLOG_ID = "local_blog_id";
+ private static final String KEY_COMMENT_ID = "comment_id";
+ private static final String KEY_NOTE_ID = "note_id";
private int mLocalBlogId;
private int mRemoteBlogId;
-
private Comment mComment;
private Note mNote;
-
private SuggestionAdapter mSuggestionAdapter;
private SuggestionServiceConnectionManager mSuggestionServiceConnectionManager;
-
private TextView mTxtStatus;
private TextView mTxtContent;
private View mSubmitReplyBtn;
private SuggestionAutoCompleteText mEditReply;
private ViewGroup mLayoutReply;
private ViewGroup mLayoutButtons;
-
private View mBtnLikeComment;
private ImageView mBtnLikeIcon;
private TextView mBtnLikeTextView;
-
private View mBtnModerateComment;
private ImageView mBtnModerateIcon;
private TextView mBtnModerateTextView;
-
private TextView mBtnSpamComment;
private TextView mBtnTrashComment;
-
private String mRestoredReplyText;
private String mRestoredNoteId;
-
private boolean mIsUsersBlog = false;
private boolean mShouldFocusReplyField;
private boolean mShouldLikeInstantly;
@@ -124,20 +120,12 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
* the comment with the content in the note. See showComment()
*/
private boolean mShouldRequestCommentFromNote = false;
-
private boolean mIsSubmittingReply = false;
-
private NotificationsDetailListFragment mNotificationsDetailListFragment;
-
private OnCommentChangeListener mOnCommentChangeListener;
private OnPostClickListener mOnPostClickListener;
private OnCommentActionListener mOnCommentActionListener;
private OnNoteCommentActionListener mOnNoteCommentActionListener;
-
- private static final String KEY_LOCAL_BLOG_ID = "local_blog_id";
- private static final String KEY_COMMENT_ID = "comment_id";
- private static final String KEY_NOTE_ID = "note_id";
-
/*
* these determine which actions (moderation, replying, marking as spam) to enable
* for this comment - all actions are enabled when opened from the comment list, only
@@ -240,11 +228,11 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
mLayoutButtons = (ViewGroup) inflater.inflate(R.layout.comment_action_footer, null, false);
mBtnLikeComment = mLayoutButtons.findViewById(R.id.btn_like);
- mBtnLikeIcon = (ImageView)mLayoutButtons.findViewById(R.id.btn_like_icon);
- mBtnLikeTextView = (TextView)mLayoutButtons.findViewById(R.id.btn_like_text);
+ mBtnLikeIcon = (ImageView) mLayoutButtons.findViewById(R.id.btn_like_icon);
+ mBtnLikeTextView = (TextView) mLayoutButtons.findViewById(R.id.btn_like_text);
mBtnModerateComment = mLayoutButtons.findViewById(R.id.btn_moderate);
- mBtnModerateIcon = (ImageView)mLayoutButtons.findViewById(R.id.btn_moderate_icon);
- mBtnModerateTextView = (TextView)mLayoutButtons.findViewById(R.id.btn_moderate_text);
+ mBtnModerateIcon = (ImageView) mLayoutButtons.findViewById(R.id.btn_moderate_icon);
+ mBtnModerateTextView = (TextView) mLayoutButtons.findViewById(R.id.btn_moderate_text);
mBtnSpamComment = (TextView) mLayoutButtons.findViewById(R.id.text_btn_spam);
mBtnTrashComment = (TextView) mLayoutButtons.findViewById(R.id.image_trash_comment);
@@ -533,6 +521,10 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
return mRemoteBlogId;
}
+ private void setRemoteBlogId(int remoteBlogId) {
+ mRemoteBlogId = remoteBlogId;
+ }
+
/*
* reload the current comment from the local database
*/
@@ -612,7 +604,7 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
final TextView txtDate = (TextView) getView().findViewById(R.id.text_date);
txtName.setText(mComment.hasAuthorName() ? HtmlUtils.fastUnescapeHtml(mComment.getAuthorName()) : getString(R.string.anonymous));
- txtDate.setText(DateTimeUtils.javaDateToTimeSpan(mComment.getDatePublished()));
+ txtDate.setText(DateTimeUtils.javaDateToTimeSpan(mComment.getDatePublished(), WordPress.getContext()));
int maxImageSz = getResources().getDimensionPixelSize(R.dimen.reader_comment_max_image_size);
CommentUtils.displayHtmlComment(mTxtContent, mComment.getCommentText(), maxImageSz);
@@ -732,25 +724,25 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
if (!postExists) {
AppLog.d(T.COMMENTS, "comment detail > retrieving post");
ReaderPostActions.requestPost(blogId, postId, new ReaderActions.OnRequestListener() {
- @Override
- public void onSuccess() {
- if (!isAdded()) return;
-
- // update title if it wasn't set above
- if (!hasTitle) {
- String postTitle = ReaderPostTable.getPostTitle(blogId, postId);
- if (!TextUtils.isEmpty(postTitle)) {
- setPostTitle(txtPostTitle, postTitle, true);
- } else {
- txtPostTitle.setText(R.string.untitled);
- }
- }
- }
+ @Override
+ public void onSuccess() {
+ if (!isAdded()) return;
- @Override
- public void onFailure(int statusCode) {
+ // update title if it wasn't set above
+ if (!hasTitle) {
+ String postTitle = ReaderPostTable.getPostTitle(blogId, postId);
+ if (!TextUtils.isEmpty(postTitle)) {
+ setPostTitle(txtPostTitle, postTitle, true);
+ } else {
+ txtPostTitle.setText(R.string.untitled);
}
- });
+ }
+ }
+
+ @Override
+ public void onFailure(int statusCode) {
+ }
+ });
}
txtPostTitle.setOnClickListener(new View.OnClickListener() {
@@ -870,7 +862,8 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
}
} else {
String errorMessage = TextUtils.isEmpty(result.getMessage()) ? getString(R.string.reply_failed) : result.getMessage();
- ToastUtils.showToast(getActivity(), errorMessage, ToastUtils.Duration.LONG);
+ String strUnEscapeHTML = StringEscapeUtils.unescapeHtml(errorMessage);
+ ToastUtils.showToast(getActivity(), strUnEscapeHTML, ToastUtils.Duration.LONG);
// refocus editor on failure and show soft keyboard
EditTextUtils.showSoftInput(mEditReply);
}
@@ -1027,18 +1020,23 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
private boolean canModerate() {
return mEnabledActions != null && (mEnabledActions.contains(EnabledActions.ACTION_APPROVE) || mEnabledActions.contains(EnabledActions.ACTION_UNAPPROVE));
}
+
private boolean canMarkAsSpam() {
return (mEnabledActions != null && mEnabledActions.contains(EnabledActions.ACTION_SPAM));
}
+
private boolean canReply() {
return (mEnabledActions != null && mEnabledActions.contains(EnabledActions.ACTION_REPLY));
}
+
private boolean canTrash() {
return canModerate();
}
+
private boolean canEdit() {
return (mLocalBlogId > 0 && canModerate());
}
+
private boolean canLike() {
return (!mShouldRequestCommentFromNote && mEnabledActions != null && mEnabledActions.contains(EnabledActions.ACTION_LIKE));
}
@@ -1117,7 +1115,7 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
ReaderAnim.animateLikeButton(mBtnLikeIcon, mBtnLikeComment.isActivated());
// Bump analytics
- AnalyticsTracker.track(mBtnLikeComment.isActivated() ? Stat.NOTIFICATION_LIKED : Stat.NOTIFICATION_UNLIKED);
+ AnalyticsTracker.track(mBtnLikeComment.isActivated() ? Stat.NOTIFICATION_LIKED : Stat.NOTIFICATION_UNLIKED);
boolean commentWasUnapproved = false;
if (mNotificationsDetailListFragment != null && mComment != null) {
@@ -1138,7 +1136,7 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
new RestRequest.Listener() {
@Override
public void onResponse(JSONObject response) {
- if (response != null && !response.optBoolean("success")) {
+ if (response != null && !response.optBoolean("success")) {
if (!isAdded()) return;
// Failed, so switch the button state back
@@ -1233,8 +1231,4 @@ public class CommentDetailFragment extends Fragment implements NotificationFragm
final String path = String.format("/sites/%s/comments/%s", remoteBlogId, commentId);
WordPress.getRestClientUtils().get(path, restListener, restErrListener);
}
-
- private void setRemoteBlogId(int remoteBlogId) {
- mRemoteBlogId = remoteBlogId;
- }
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/MySiteFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/main/MySiteFragment.java
index 7ee7d0470..7352b4e51 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/main/MySiteFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/main/MySiteFragment.java
@@ -97,14 +97,6 @@ public class MySiteFragment extends Fragment
}
@Override
- public void onPause() {
- super.onPause();
- if (mFabView.getVisibility() == View.VISIBLE) {
- AniUtils.showFab(mFabView, false);
- }
- }
-
- @Override
public void onResume() {
super.onResume();
@@ -156,6 +148,11 @@ public class MySiteFragment extends Fragment
mFabView = rootView.findViewById(R.id.fab_button);
mCurrentPlanNameTextView = (WPTextView) rootView.findViewById(R.id.my_site_current_plan_text_view);
+ // hide the FAB the first time the fragment is created in order to animate it in onResume()
+ if (savedInstanceState == null) {
+ mFabView.setVisibility(View.INVISIBLE);
+ }
+
mFabView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerAdapter.java
index 59a55f6ff..7267d8d5e 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerAdapter.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerAdapter.java
@@ -83,10 +83,14 @@ class SitePickerAdapter extends RecyclerView.Adapter<SitePickerAdapter.SiteViewH
@Override
public void onClick(View view) {
int clickedPosition = getAdapterPosition();
- if (mIsMultiSelectEnabled) {
- toggleSelection(clickedPosition);
- } else if (mSiteSelectedListener != null) {
- mSiteSelectedListener.onSiteClick(getItem(clickedPosition));
+ if (isValidPosition(clickedPosition)) {
+ if (mIsMultiSelectEnabled) {
+ toggleSelection(clickedPosition);
+ } else if (mSiteSelectedListener != null) {
+ mSiteSelectedListener.onSiteClick(getItem(clickedPosition));
+ }
+ } else {
+ AppLog.w(AppLog.T.MAIN, "site picker > invalid clicked position " + clickedPosition);
}
}
});
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/CommentUserNoteBlock.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/CommentUserNoteBlock.java
index e218c6347..8f8513482 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/CommentUserNoteBlock.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/CommentUserNoteBlock.java
@@ -9,6 +9,7 @@ import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
import org.wordpress.android.models.CommentStatus;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.util.DateTimeUtils;
@@ -56,7 +57,8 @@ public class CommentUserNoteBlock extends UserNoteBlock {
final CommentUserNoteBlockHolder noteBlockHolder = (CommentUserNoteBlockHolder)view.getTag();
noteBlockHolder.nameTextView.setText(Html.fromHtml("<strong>" + getNoteText().toString() + "</strong>"));
- noteBlockHolder.agoTextView.setText(DateTimeUtils.timestampToTimeSpan(getTimestamp()));
+ noteBlockHolder.agoTextView.setText(DateTimeUtils.timeSpanFromTimestamp(getTimestamp(),
+ WordPress.getContext()));
if (!TextUtils.isEmpty(getMetaHomeTitle()) || !TextUtils.isEmpty(getMetaSiteUrl())) {
noteBlockHolder.bulletTextView.setVisibility(View.VISIBLE);
noteBlockHolder.siteTextView.setVisibility(View.VISIBLE);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java
index 78bcdf971..ca878b3cf 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java
@@ -283,6 +283,7 @@ public class PeopleListFragment extends Fragment {
public interface OnFetchPeopleListener {
boolean onFetchFirstPage(PeopleListFilter filter);
+
boolean onFetchMorePeople(PeopleListFilter filter);
}
@@ -344,7 +345,10 @@ public class PeopleListFragment extends Fragment {
peopleViewHolder.imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR);
peopleViewHolder.txtDisplayName.setText(StringUtils.unescapeHTML(person.getDisplayName()));
if (person.getRole() != null) {
+ peopleViewHolder.txtRole.setVisibility(View.VISIBLE);
peopleViewHolder.txtRole.setText(StringUtils.capitalize(person.getRole().toDisplayString()));
+ } else {
+ peopleViewHolder.txtRole.setVisibility(View.GONE);
}
if (!person.getUsername().isEmpty()) {
peopleViewHolder.txtUsername.setVisibility(View.VISIBLE);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
index 276383909..e670d7cd7 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
@@ -1439,34 +1439,21 @@ public class EditPostActivity extends AppCompatActivity implements EditorFragmen
* Media
*/
- private void fetchMedia(final List<Uri> mediaUris) {
- new AsyncTask<List<Uri>, Boolean, Void>() {
- @Override
- protected Void doInBackground(List<Uri>... lists) {
- for (Uri mediaUri : mediaUris) {
- if (mediaUri == null) {
- publishProgress(false);
- continue;
- }
-
- if (!addMedia(mediaUri)) {
- publishProgress(false);
- }
- }
-
- return null;
+ private void fetchMedia(List<Uri> mediaUris) {
+ for (Uri mediaUri : mediaUris) {
+ if (mediaUri == null) {
+ Toast.makeText(EditPostActivity.this,
+ getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
+ continue;
}
- @Override
- protected void onProgressUpdate(Boolean... values) {
- // use onProgressUpdate to Toast on error
+ if (!addMedia(mediaUri)) {
Toast.makeText(EditPostActivity.this, getResources().getText(R.string.gallery_error),
Toast.LENGTH_SHORT).show();
}
- }.execute(mediaUris);
+ }
}
-
private void updateMediaFileOnServer(WPImageSpan wpIS) {
Blog currentBlog = WordPress.getCurrentBlog();
if (currentBlog == null || wpIS == null)
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 84122968b..ef7c9245b 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
@@ -20,6 +20,7 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.datasets.ReaderLikeTable;
import org.wordpress.android.datasets.ReaderPostTable;
@@ -353,9 +354,9 @@ public class ReaderPostDetailFragment extends Fragment
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);
}
}
@@ -910,7 +911,7 @@ public class ReaderPostDetailFragment extends Fragment
imgAvatar.showDefaultGravatarImage();
}
- String timestamp = DateTimeUtils.javaDateToTimeSpan(mPost.getDatePublished());
+ String timestamp = DateTimeUtils.javaDateToTimeSpan(mPost.getDisplayDate(), WordPress.getContext());
if (mPost.hasAuthorName()) {
txtDateline.setText(mPost.getAuthorName() + ReaderConstants.UNICODE_BULLET_WITH_SPACE + timestamp);
} else if (mPost.hasBlogName()) {
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 f245cd9ec..69409385e 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 class ReaderPostListFragment extends Fragment
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;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
index 54c9c527e..1674102ba 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
@@ -64,7 +64,7 @@ public class ReaderCommentActions {
newComment.setText(commentText);
Date dtPublished = DateTimeUtils.nowUTC();
- newComment.setPublished(DateTimeUtils.javaDateToIso8601(dtPublished));
+ newComment.setPublished(DateTimeUtils.iso8601FromDate(dtPublished));
newComment.timestamp = dtPublished.getTime();
ReaderUser currentUser = ReaderUserTable.getCurrentUser();
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java
index 5cd79af0f..8039d13f8 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java
@@ -14,6 +14,7 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
import org.wordpress.android.datasets.ReaderCommentTable;
import org.wordpress.android.datasets.ReaderPostTable;
import org.wordpress.android.models.ReaderComment;
@@ -216,8 +217,8 @@ public class ReaderCommentAdapter extends RecyclerView.Adapter<RecyclerView.View
CommentHolder commentHolder = (CommentHolder) holder;
commentHolder.txtAuthor.setText(comment.getAuthorName());
- java.util.Date dtPublished = DateTimeUtils.iso8601ToJavaDate(comment.getPublished());
- commentHolder.txtDate.setText(DateTimeUtils.javaDateToTimeSpan(dtPublished));
+ java.util.Date dtPublished = DateTimeUtils.dateFromIso8601(comment.getPublished());
+ commentHolder.txtDate.setText(DateTimeUtils.javaDateToTimeSpan(dtPublished, WordPress.getContext()));
if (comment.hasAuthorAvatar()) {
String avatarUrl = GravatarUtils.fixGravatarUrl(comment.getAuthorAvatar(), mAvatarSz);
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 be9f7cf2c..e650bc22b 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
@@ -13,6 +13,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.datasets.ReaderPostTable;
import org.wordpress.android.models.ReaderPost;
@@ -46,6 +47,8 @@ import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.UrlUtils;
import org.wordpress.android.widgets.WPNetworkImageView;
+import java.util.HashSet;
+
public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ReaderTag mCurrentTag;
private long mCurrentBlogId;
@@ -64,6 +67,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private final ReaderTypes.ReaderPostListType mPostListType;
private final ReaderPostList mPosts = new ReaderPostList();
+ private final HashSet<String> mRenderedIds = new HashSet<>();
private ReaderInterfaces.OnPostSelectedListener mPostSelectedListener;
private ReaderInterfaces.OnTagSelectedListener mOnTagSelectedListener;
@@ -304,7 +308,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
holder.txtTitle.setText(post.getTitle());
- String timestamp = DateTimeUtils.javaDateToTimeSpan(post.getDatePublished());
+ String timestamp = DateTimeUtils.javaDateToTimeSpan(post.getDisplayDate(), WordPress.getContext());
if (post.hasAuthorName()) {
holder.txtDateline.setText(post.getAuthorName() + ReaderConstants.UNICODE_BULLET_WITH_SPACE + timestamp);
} else if (post.hasBlogName()) {
@@ -456,6 +460,13 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
});
checkLoadMore(position);
+
+ // 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());
+ }
}
/*
@@ -604,6 +615,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void setCurrentTag(ReaderTag tag) {
if (!ReaderTag.isSameTag(tag, mCurrentTag)) {
mCurrentTag = tag;
+ mRenderedIds.clear();
reload();
}
}
@@ -617,6 +629,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
if (blogId != mCurrentBlogId || feedId != mCurrentFeedId) {
mCurrentBlogId = blogId;
mCurrentFeedId = feedId;
+ mRenderedIds.clear();
reload();
}
}
@@ -758,7 +771,7 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
/*
* 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;
}
@@ -773,12 +786,12 @@ public class ReaderPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
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/ui/reader/services/ReaderPostService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderPostService.java
index 5cb575f46..a0cf613bb 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderPostService.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderPostService.java
@@ -178,11 +178,11 @@ public class ReaderPostService extends Service {
switch (updateAction) {
case REQUEST_OLDER:
// request posts older than the oldest existing post with this tag
- beforeDate = ReaderPostTable.getOldestPubDateWithTag(tag);
+ beforeDate = ReaderPostTable.getOldestDateWithTag(tag);
break;
case REQUEST_OLDER_THAN_GAP:
// request posts older than the post with the gap marker for this tag
- beforeDate = ReaderPostTable.getGapMarkerPubDateForTag(tag);
+ beforeDate = ReaderPostTable.getGapMarkerDateForTag(tag);
break;
default:
beforeDate = null;
@@ -220,7 +220,7 @@ public class ReaderPostService extends Service {
// append the date of the oldest cached post in this blog when requesting older posts
if (updateAction == UpdateAction.REQUEST_OLDER) {
- String dateOldest = ReaderPostTable.getOldestPubDateInBlog(blogId);
+ String dateOldest = ReaderPostTable.getOldestDateInBlog(blogId);
if (!TextUtils.isEmpty(dateOldest)) {
path += "&before=" + UrlUtils.urlEncode(dateOldest);
}
@@ -248,7 +248,7 @@ public class ReaderPostService extends Service {
final UpdateResultListener resultListener) {
String path = "read/feed/" + feedId + "/posts/?meta=site,likes";
if (updateAction == UpdateAction.REQUEST_OLDER) {
- String dateOldest = ReaderPostTable.getOldestPubDateInFeed(feedId);
+ String dateOldest = ReaderPostTable.getOldestDateInFeed(feedId);
if (!TextUtils.isEmpty(dateOldest)) {
path += "&before=" + UrlUtils.urlEncode(dateOldest);
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderCommentsPostHeaderView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderCommentsPostHeaderView.java
index e41be2b19..cefb3c285 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderCommentsPostHeaderView.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderCommentsPostHeaderView.java
@@ -6,6 +6,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
import org.wordpress.android.models.ReaderPost;
import org.wordpress.android.ui.reader.utils.ReaderUtils;
import org.wordpress.android.util.DateTimeUtils;
@@ -51,8 +52,8 @@ public class ReaderCommentsPostHeaderView extends LinearLayout {
txtBlogName.setText(R.string.reader_untitled_post);
}
- java.util.Date dtPublished = DateTimeUtils.iso8601ToJavaDate(post.getPublished());
- String dateLine = DateTimeUtils.javaDateToTimeSpan(dtPublished);
+ java.util.Date dtPost = DateTimeUtils.dateFromIso8601(post.getDate());
+ String dateLine = DateTimeUtils.javaDateToTimeSpan(dtPost, WordPress.getContext());
if (post.isCommentsOpen || post.numReplies > 0) {
dateLine += " \u2022 " + ReaderUtils.getShortCommentLabelText(getContext(), post.numReplies);
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderThumbnailStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderThumbnailStrip.java
index 36186ef81..042b1cf19 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderThumbnailStrip.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderThumbnailStrip.java
@@ -61,7 +61,7 @@ public class ReaderThumbnailStrip extends LinearLayout {
mView = inflate(context, R.layout.reader_thumbnail_strip, this);
mContainer = (LinearLayout) mView.findViewById(R.id.thumbnail_strip_container);
mThumbnailSize = context.getResources().getDimensionPixelSize(R.dimen.reader_thumbnail_strip_image_size);
- mCountStr = context.getResources().getString(R.string.reader_label_image_count);
+ mCountStr = context.getResources().getString(R.string.reader_label_image_count_multi);
// base max image count on display width
int displayWidth = DisplayUtils.getDisplayPixelWidth(context);
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 9348cdc47..c8dd0867a 100644
--- a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java
@@ -2,19 +2,32 @@ package org.wordpress.android.util;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
import android.text.Html;
+import android.text.TextUtils;
+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.analytics.AnalyticsMetadata;
+import org.wordpress.android.analytics.AnalyticsTrackerNosara;
import org.wordpress.android.models.AccountHelper;
import org.wordpress.android.models.Blog;
import org.wordpress.android.models.ReaderPost;
import java.util.HashMap;
+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;
+
public class AnalyticsUtils {
private static String BLOG_ID_KEY = "blog_id";
private static String POST_ID_KEY = "post_id";
@@ -186,6 +199,72 @@ public class AnalyticsUtils {
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);
+
+ // record a railcar interact event if the post has a railcar and this can be tracked
+ // as an interaction
+ if (canTrackRailcarInteraction(stat) && post.hasRailcar()) {
+ trackRailcarInteraction(stat, post.getRailcarJson());
+ }
+ }
+
+ /**
+ * Track when a railcar item has been rendered
+ *
+ * @param post The JSON string of the railcar
+ *
+ */
+ public static void trackRailcarRender(String railcarJson) {
+ if (TextUtils.isEmpty(railcarJson)) return;
+
+ 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
+ *
+ */
+ private static void trackRailcarInteraction(AnalyticsTracker.Stat stat, String railcarJson) {
+ if (TextUtils.isEmpty(railcarJson)) return;
+
+ Map<String, Object> properties = railcarJsonToProperties(railcarJson);
+ properties.put("action", AnalyticsTrackerNosara.getEventNameForStat(stat));
+ 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 interaction
+ */
+ private static boolean canTrackRailcarInteraction(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
+ */
+ private static Map<String, Object> railcarJsonToProperties(@NonNull String railcarJson) {
+ Map<String, Object> properties = new HashMap<>();
+ try {
+ JSONObject jsonRailcar = new JSONObject(railcarJson);
+ Iterator<String> 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);
+ }
+
+ return properties;
+ }
+
}
diff --git a/WordPress/src/main/java/org/wordpress/android/util/DateTimeUtils.java b/WordPress/src/main/java/org/wordpress/android/util/DateTimeUtils.java
deleted file mode 100644
index cc38bf601..000000000
--- a/WordPress/src/main/java/org/wordpress/android/util/DateTimeUtils.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package org.wordpress.android.util;
-
-import android.text.format.DateUtils;
-
-import org.wordpress.android.R;
-import org.wordpress.android.WordPress;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-public class DateTimeUtils {
- private DateTimeUtils() {
- throw new AssertionError();
- }
-
- /*
- * see http://drdobbs.com/java/184405382
- */
- private static final ThreadLocal<DateFormat> ISO8601Format = new ThreadLocal<DateFormat>() {
- @Override
- protected DateFormat initialValue() {
- return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
- }
- };
-
- /*
- * converts a date to a relative time span ("8h", "3d", etc.) - similar to
- * DateUtils.getRelativeTimeSpanString but returns shorter result
- */
- public static String javaDateToTimeSpan(final Date date) {
- if (date == null)
- return "";
-
- long passedTime = date.getTime();
- long currentTime = System.currentTimeMillis();
-
- // return "now" if less than a minute has elapsed
- long secondsSince = (currentTime - passedTime) / 1000;
- if (secondsSince < 60)
- return WordPress.getContext().getString(R.string.reader_timespan_now);
-
- // less than an hour (ex: 12m)
- long minutesSince = secondsSince / 60;
- if (minutesSince < 60)
- return Long.toString(minutesSince) + "m";
-
- // less than a day (ex: 17h)
- long hoursSince = minutesSince / 60;
- if (hoursSince < 24)
- return Long.toString(hoursSince) + "h";
-
- // less than a week (ex: 5d)
- long daysSince = hoursSince / 24;
- if (daysSince < 7)
- return Long.toString(daysSince) + "d";
-
- // less than a year old, so return day/month without year (ex: Jan 30)
- if (daysSince < 365)
- return DateUtils.formatDateTime(WordPress.getContext(), passedTime, DateUtils.FORMAT_NO_YEAR | DateUtils.FORMAT_ABBREV_ALL);
-
- // date is older, so include year (ex: Jan 30, 2013)
- return DateUtils.formatDateTime(WordPress.getContext(), passedTime, DateUtils.FORMAT_ABBREV_ALL);
- }
-
- /*
- * converts an ISO8601 date to a Java date
- */
- public static Date iso8601ToJavaDate(final String strDate) {
- try {
- DateFormat formatter = ISO8601Format.get();
- return formatter.parse(strDate);
- } catch (ParseException e) {
- return null;
- }
- }
-
- /*
- * converts a Java date to ISO8601
- */
- public static String javaDateToIso8601(Date date) {
- if (date==null)
- return "";
- DateFormat formatter = ISO8601Format.get();
- return formatter.format(date);
- }
-
- /*
- * returns the current UTC date
- */
- public static Date nowUTC() {
- Date dateTimeNow = new Date();
- return localDateToUTC(dateTimeNow);
- }
-
- public static Date localDateToUTC(Date dtLocal) {
- if (dtLocal==null)
- return null;
- TimeZone tz = TimeZone.getDefault();
- int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(dtLocal) ? tz.getDSTSavings() : 0);
- return new Date(dtLocal.getTime() - currentOffsetFromUTC);
- }
-
- /*
- * routines to return a diff between two dates - always return a positive number
- */
- public static int daysBetween(Date dt1, Date dt2) {
- long hrDiff = hoursBetween(dt1, dt2);
- if (hrDiff == 0) {
- return 0;
- }
- return (int) (hrDiff / 24);
- }
-
- public static int hoursBetween(Date dt1, Date dt2) {
- long minDiff = minutesBetween(dt1, dt2);
- if (minDiff == 0) {
- return 0;
- }
- return (int) (minDiff / 60);
- }
- public static int minutesBetween(Date dt1, Date dt2) {
- long msDiff = millisecondsBetween(dt1, dt2);
- if (msDiff==0)
- return 0;
- return (int)(msDiff / 60000);
- }
- public static int secondsBetween(Date dt1, Date dt2) {
- long msDiff = millisecondsBetween(dt1, dt2);
- if (msDiff == 0) {
- return 0;
- }
- return (int)(msDiff / 1000);
- }
- public static long millisecondsBetween(Date dt1, Date dt2) {
- if (dt1==null || dt2==null)
- return 0;
- return Math.abs(dt1.getTime() - dt2.getTime());
- }
- public static long iso8601ToTimestamp(final String strDate) {
- Date date = iso8601ToJavaDate(strDate);
- if (date==null)
- return 0;
- return (date.getTime() / 1000);
- }
-
- public static boolean isSameYear(Date dt1, Date dt2) {
- if (dt1 == null || dt2 == null) {
- return false;
- }
- return dt1.getYear() == dt2.getYear();
- }
-
- public static boolean isSameMonthAndYear(Date dt1, Date dt2) {
- if (dt1 == null || dt2 == null) {
- return false;
- }
- return dt1.getYear() == dt2.getYear()
- && dt1.getMonth() == dt2.getMonth();
- }
-
- /*
- * routines involving Unix timestamps (GMT assumed)
- */
- public static Date timestampToDate(long timeStamp) {
- return new java.util.Date(timeStamp*1000);
- }
- public static String timestampToIso8601Str(long timestamp) {
- return javaDateToIso8601(timestampToDate(timestamp));
- }
- public static String timestampToTimeSpan(long timeStamp) {
- Date dtGmt = timestampToDate(timeStamp);
- return javaDateToTimeSpan(dtGmt);
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java
index 9c5feab28..8602152aa 100644
--- a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java
@@ -75,7 +75,7 @@ public class WPActivityUtils {
public static void removeToolbarFromDialog(final Fragment context, final Dialog dialog) {
if (dialog == null || !context.isAdded()) return;
- LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
+ ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.list).getParent();
if (root.getChildAt(0) instanceof Toolbar) {
root.removeViewAt(0);
}
diff --git a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
index 7140e7b97..a07bc2e6a 100644
--- a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
+++ b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
@@ -450,7 +450,7 @@ public class ApiHelper {
authorEmail = contentHash.get("author_email").toString();
postTitle = contentHash.get("post_title").toString();
date = (java.util.Date) contentHash.get("date_created_gmt");
- pubDate = DateTimeUtils.javaDateToIso8601(date);
+ pubDate = DateTimeUtils.iso8601FromDate(date);
Comment comment = new Comment(
postID,