diff options
author | Mario Zorz <mariozorz@gmail.com> | 2016-09-26 14:47:49 -0300 |
---|---|---|
committer | Mario Zorz <mariozorz@gmail.com> | 2016-09-26 14:47:49 -0300 |
commit | 31ab9d71018ba7b4663bb8860b8b8ad7ad83cca8 (patch) | |
tree | ab83f69440daa0f40a2e290ea03480b302c74d33 /WordPress/src/main/java | |
parent | 678a6202126af34960dfd325520781e377906809 (diff) | |
parent | 8726084f865537f8e11754b3b4f618ad4b4c5bef (diff) | |
download | gradle-perf-android-medium-31ab9d71018ba7b4663bb8860b8b8ad7ad83cca8.tar.gz |
solved merge conflicts
Diffstat (limited to 'WordPress/src/main/java')
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, |