blob: b9ddd7e2641affc1522b4a8c990ef63d332529d9 [file] [log] [blame]
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;
}
}