diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java new file mode 100644 index 000000000..e5c71a028 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java @@ -0,0 +1,169 @@ +package org.wordpress.android.models; + +import android.text.TextUtils; + +import org.json.JSONObject; +import org.wordpress.android.util.JSONUtils; +import org.wordpress.android.util.StringUtils; +import org.wordpress.android.util.UrlUtils; + +public class ReaderBlog { + public long blogId; + public long feedId; + + public boolean isPrivate; + public boolean isJetpack; + public boolean isFollowing; + public int numSubscribers; + + private String name; + private String description; + private String url; + private String imageUrl; + private String feedUrl; + + public static ReaderBlog fromJson(JSONObject json) { + ReaderBlog blog = new ReaderBlog(); + if (json == null) { + return blog; + } + + // if meta/data/site exists then JSON is for a read/following/mine?meta=site subscription, + // if meta/data/feed exists then JSON is for a read/following/mine?meta=feed subscription, + // otherwise JSON the response for a single site/$siteId or read/feed/$feedId + JSONObject jsonSite = JSONUtils.getJSONChild(json, "meta/data/site"); + JSONObject jsonFeed = JSONUtils.getJSONChild(json, "meta/data/feed"); + if (jsonSite != null) { + blog.blogId = jsonSite.optLong("ID"); + blog.setName(JSONUtils.getStringDecoded(jsonSite, "name")); + blog.setDescription(JSONUtils.getStringDecoded(jsonSite, "description")); + blog.setUrl(JSONUtils.getString(jsonSite, "URL")); + blog.isJetpack = JSONUtils.getBool(jsonSite, "jetpack"); + blog.isPrivate = JSONUtils.getBool(jsonSite, "is_private"); + blog.isFollowing = JSONUtils.getBool(jsonSite, "is_following"); + blog.numSubscribers = jsonSite.optInt("subscribers_count"); + JSONObject jsonIcon = jsonSite.optJSONObject("icon"); + if (jsonIcon != null) { + blog.setImageUrl(JSONUtils.getString(jsonIcon, "img")); + } + } else if (jsonFeed != null) { + blog.feedId = jsonFeed.optLong("feed_ID"); + blog.setFeedUrl(JSONUtils.getString(jsonFeed, "feed_URL")); + blog.setName(JSONUtils.getStringDecoded(jsonFeed, "name")); + blog.setUrl(JSONUtils.getString(jsonFeed, "URL")); + blog.numSubscribers = jsonFeed.optInt("subscribers_count"); + // read/following/mine doesn't include is_following for feeds, so assume to be true + blog.isFollowing = true; + } else { + blog.blogId = json.optLong("ID"); + blog.feedId = json.optLong("feed_ID"); + blog.setName(JSONUtils.getStringDecoded(json, "name")); + blog.setDescription(JSONUtils.getStringDecoded(json, "description")); + blog.setUrl(JSONUtils.getString(json, "URL")); + blog.setFeedUrl(JSONUtils.getString(json, "feed_URL")); + blog.isJetpack = JSONUtils.getBool(json, "jetpack"); + blog.isPrivate = JSONUtils.getBool(json, "is_private"); + blog.isFollowing = JSONUtils.getBool(json, "is_following"); + blog.numSubscribers = json.optInt("subscribers_count"); + } + + // blogId will be empty for feeds, so set it to the feedId (consistent with /read/ endpoints) + if (blog.blogId == 0 && blog.feedId != 0) { + blog.blogId = blog.feedId; + } + + JSONObject jsonIcon = JSONUtils.getJSONChild(json, "icon"); + if (jsonIcon != null) { + blog.setImageUrl(JSONUtils.getString(jsonIcon, "img")); + if (!blog.hasImageUrl()) { + blog.setImageUrl(JSONUtils.getString(jsonIcon, "ico")); + } + } + + return blog; + } + + public String getName() { + return StringUtils.notNullStr(name); + } + public void setName(String blogName) { + this.name = StringUtils.notNullStr(blogName).trim(); + } + + public String getDescription() { + return StringUtils.notNullStr(description); + } + public void setDescription(String description) { + this.description = StringUtils.notNullStr(description).trim(); + } + + public String getImageUrl() { + return StringUtils.notNullStr(imageUrl); + } + public void setImageUrl(String imageUrl) { + this.imageUrl = StringUtils.notNullStr(imageUrl); + } + + public String getUrl() { + return StringUtils.notNullStr(url); + } + public void setUrl(String url) { + this.url = StringUtils.notNullStr(url); + } + + public String getFeedUrl() { + return StringUtils.notNullStr(feedUrl); + } + public void setFeedUrl(String feedUrl) { + this.feedUrl = StringUtils.notNullStr(feedUrl); + } + + public boolean hasUrl() { + return !TextUtils.isEmpty(url); + } + + public boolean hasFeedUrl() { + return !TextUtils.isEmpty(feedUrl); + } + + public boolean hasImageUrl() { + return !TextUtils.isEmpty(imageUrl); + } + public boolean hasName() { + return !TextUtils.isEmpty(name); + } + public boolean hasDescription() { + return !TextUtils.isEmpty(description); + } + + public boolean isExternal() { + return (feedId != 0); + } + + /* + * returns the mshot url to use for this blog, ex: + * http://s.wordpress.com/mshots/v1/http%3A%2F%2Fnickbradbury.com?w=600 + * note that while mshots support a "h=" parameter, this crops rather than + * scales the image to that height + * https://github.com/Automattic/mShots + */ + public String getMshotsUrl(int width) { + return "http://s.wordpress.com/mshots/v1/" + + UrlUtils.urlEncode(getUrl()) + + String.format("?w=%d", width); + } + + public boolean isSameAs(ReaderBlog blogInfo) { + return blogInfo != null + && this.blogId == blogInfo.blogId + && this.feedId == blogInfo.feedId + && this.isFollowing == blogInfo.isFollowing + && this.isPrivate == blogInfo.isPrivate + && this.numSubscribers == blogInfo.numSubscribers + && this.getName().equals(blogInfo.getName()) + && this.getDescription().equals(blogInfo.getDescription()) + && this.getUrl().equals(blogInfo.getUrl()) + && this.getFeedUrl().equals(blogInfo.getFeedUrl()) + && this.getImageUrl().equals(blogInfo.getImageUrl()); + } +} |