| 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; |
| } |
| |
| } |