diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java b/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java new file mode 100644 index 000000000..b9ddd7e26 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/models/PostsListPost.java @@ -0,0 +1,183 @@ +package org.wordpress.android.models; + +import android.text.TextUtils; +import android.text.format.DateUtils; + +import org.wordpress.android.WordPress; +import org.wordpress.android.ui.posts.services.PostUploadService; +import org.wordpress.android.util.DateTimeUtils; +import org.wordpress.android.util.HtmlUtils; +import org.wordpress.android.util.StringUtils; + +import java.text.BreakIterator; +import java.util.Date; + +/** + * Barebones post/page as listed in PostsListFragment + */ +public class PostsListPost { + private static final int MAX_EXCERPT_LEN = 150; + + private final long postId; + private final long blogId; + private long dateCreatedGmt; + private final long featuredImageId; + + private final String title; + private String excerpt; + private final String description; + private final String status; + + private final boolean isLocalDraft; + private final boolean hasLocalChanges; + private final boolean isUploading; + + // featuredImageUrl is generated by the adapter on the fly + private transient String featuredImageUrl; + + public PostsListPost(Post post) { + postId = post.getLocalTablePostId(); + blogId = post.getLocalTableBlogId(); + featuredImageId = post.getFeaturedImageId(); + + title = post.getTitle(); + description = post.getDescription(); + excerpt = post.getPostExcerpt(); + + status = post.getPostStatus(); + isLocalDraft = post.isLocalDraft(); + hasLocalChanges = post.isLocalChange(); + isUploading = PostUploadService.isPostUploading(postId); + + setDateCreatedGmt(post.getDate_created_gmt()); + + // if the post doesn't have an excerpt, generate one from the description + if (!hasExcerpt() && hasDescription()) { + excerpt = makeExcerpt(description); + } + } + + public long getPostId() { + return postId; + } + + public long getBlogId() { + return blogId; + } + + public String getTitle() { + return StringUtils.notNullStr(title); + } + public boolean hasTitle() { + return !TextUtils.isEmpty(title); + } + + public String getDescription() { + return StringUtils.notNullStr(description); + } + public boolean hasDescription() { + return !TextUtils.isEmpty(description); + } + + public String getExcerpt() { + return StringUtils.notNullStr(excerpt); + } + public boolean hasExcerpt() { + return !TextUtils.isEmpty(excerpt); + } + + /* + * java's string.trim() doesn't handle non-breaking space chars (#160), which may appear at the + * end of post content - work around this by converting them to standard spaces before trimming + */ + private static final String NBSP = String.valueOf((char) 160); + private static String trimEx(final String s) { + return s.replace(NBSP, " ").trim(); + } + + private static String makeExcerpt(String description) { + if (TextUtils.isEmpty(description)) { + return null; + } + + String s = HtmlUtils.fastStripHtml(description); + if (s.length() < MAX_EXCERPT_LEN) { + return trimEx(s); + } + + StringBuilder result = new StringBuilder(); + BreakIterator wordIterator = BreakIterator.getWordInstance(); + wordIterator.setText(s); + int start = wordIterator.first(); + int end = wordIterator.next(); + int totalLen = 0; + while (end != BreakIterator.DONE) { + String word = s.substring(start, end); + result.append(word); + totalLen += word.length(); + if (totalLen >= MAX_EXCERPT_LEN) { + break; + } + start = end; + end = wordIterator.next(); + } + + if (totalLen == 0) { + return null; + } + return trimEx(result.toString()) + "..."; + } + + public long getFeaturedImageId() { + return featuredImageId; + } + public boolean hasFeaturedImageId() { + return featuredImageId != 0; + } + + public String getFeaturedImageUrl() { + return StringUtils.notNullStr(featuredImageUrl); + } + public void setFeaturedImageUrl(String url) { + this.featuredImageUrl = StringUtils.notNullStr(url); + } + public boolean hasFeaturedImageUrl() { + return !TextUtils.isEmpty(featuredImageUrl); + } + + public long getDateCreatedGmt() { + return dateCreatedGmt; + } + private void setDateCreatedGmt(long dateCreatedGmt) { + this.dateCreatedGmt = dateCreatedGmt; + } + + public String getOriginalStatus() { + return StringUtils.notNullStr(status); + } + + public PostStatus getStatusEnum() { + return PostStatus.fromPostsListPost(this); + } + + public String getFormattedDate() { + if (getStatusEnum() == PostStatus.SCHEDULED) { + return DateUtils.formatDateTime(WordPress.getContext(), dateCreatedGmt, DateUtils.FORMAT_ABBREV_ALL); + } else { + return DateTimeUtils.javaDateToTimeSpan(new Date(dateCreatedGmt), WordPress.getContext()); + } + } + + public boolean isLocalDraft() { + return isLocalDraft; + } + + public boolean hasLocalChanges() { + return hasLocalChanges; + } + + public boolean isUploading() { + return isUploading; + } + +} |