aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java168
1 files changed, 168 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java
new file mode 100644
index 000000000..6732c49fa
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderTagActions.java
@@ -0,0 +1,168 @@
+package org.wordpress.android.ui.reader.actions;
+
+import com.android.volley.VolleyError;
+import com.wordpress.rest.RestRequest;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.datasets.ReaderTagTable;
+import org.wordpress.android.models.ReaderTag;
+import org.wordpress.android.models.ReaderTagList;
+import org.wordpress.android.models.ReaderTagType;
+import org.wordpress.android.ui.reader.ReaderConstants;
+import org.wordpress.android.ui.reader.utils.ReaderUtils;
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.AppLog.T;
+import org.wordpress.android.util.JSONUtils;
+import org.wordpress.android.util.VolleyUtils;
+
+public class ReaderTagActions {
+ private ReaderTagActions() {
+ throw new AssertionError();
+ }
+
+ public static boolean deleteTag(final ReaderTag tag,
+ final ReaderActions.ActionListener actionListener) {
+ if (tag == null) {
+ ReaderActions.callActionListener(actionListener, false);
+ return false;
+ }
+
+ final String tagNameForApi = ReaderUtils.sanitizeWithDashes(tag.getTagSlug());
+ final String path = "read/tags/" + tagNameForApi + "/mine/delete";
+
+ com.wordpress.rest.RestRequest.Listener listener = new RestRequest.Listener() {
+ @Override
+ public void onResponse(JSONObject jsonObject) {
+ AppLog.i(T.READER, "delete tag succeeded");
+ ReaderActions.callActionListener(actionListener, true);
+ }
+ };
+
+ RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError volleyError) {
+ // treat it as a success if the error says the user isn't following the deleted tag
+ String error = VolleyUtils.errStringFromVolleyError(volleyError);
+ if (error.equals("not_subscribed")) {
+ AppLog.w(T.READER, "delete tag succeeded with error " + error);
+ ReaderActions.callActionListener(actionListener, true);
+ return;
+ }
+
+ AppLog.w(T.READER, " delete tag failed");
+ AppLog.e(T.READER, volleyError);
+
+ // add back original tag
+ ReaderTagTable.addOrUpdateTag(tag);
+
+ ReaderActions.callActionListener(actionListener, false);
+ }
+ };
+
+ ReaderTagTable.deleteTag(tag);
+ WordPress.getRestClientUtilsV1_1().post(path, listener, errorListener);
+
+ return true;
+ }
+
+ public static boolean addTag(final ReaderTag tag,
+ final ReaderActions.ActionListener actionListener) {
+ if (tag == null) {
+ ReaderActions.callActionListener(actionListener, false);
+ return false;
+ }
+
+ final String tagNameForApi = ReaderUtils.sanitizeWithDashes(tag.getTagSlug());
+ final String path = "read/tags/" + tagNameForApi + "/mine/new";
+ String endpoint = "/read/tags/" + tagNameForApi + "/posts";
+
+ ReaderTag newTag = new ReaderTag(
+ tag.getTagSlug(),
+ tag.getTagDisplayName(),
+ tag.getTagTitle(),
+ endpoint,
+ ReaderTagType.FOLLOWED);
+
+ com.wordpress.rest.RestRequest.Listener listener = new RestRequest.Listener() {
+ @Override
+ public void onResponse(JSONObject jsonObject) {
+ AppLog.i(T.READER, "add tag succeeded");
+ // the response will contain the list of the user's followed tags
+ ReaderTagList tags = parseFollowedTags(jsonObject);
+ ReaderTagTable.replaceFollowedTags(tags);
+ ReaderActions.callActionListener(actionListener, true);
+ }
+ };
+
+ RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError volleyError) {
+ // treat is as a success if we're adding a tag and the error says the user is
+ // already following it
+ String error = VolleyUtils.errStringFromVolleyError(volleyError);
+ if (error.equals("already_subscribed")) {
+ AppLog.w(T.READER, "add tag succeeded with error " + error);
+ ReaderActions.callActionListener(actionListener, true);
+ return;
+ }
+
+ AppLog.w(T.READER, "add tag failed");
+ AppLog.e(T.READER, volleyError);
+
+ // revert on failure
+ ReaderTagTable.deleteTag(tag);
+
+ ReaderActions.callActionListener(actionListener, false);
+ }
+ };
+
+ ReaderTagTable.addOrUpdateTag(newTag);
+ WordPress.getRestClientUtilsV1_1().post(path, listener, errorListener);
+
+ return true;
+ }
+
+ /*
+ * return the user's followed tags from the response to read/tags/{tag}/mine/new
+ */
+ /*
+ {
+ "added_tag": "84776",
+ "subscribed": true,
+ "tags": [
+ {
+ "display_name": "fitness",
+ "ID": "5189",
+ "slug": "fitness",
+ "title": "Fitness",
+ "URL": "https://public-api.wordpress.com/rest/v1.1/read/tags/fitness/posts"
+ },
+ ...
+ }
+ */
+ private static ReaderTagList parseFollowedTags(JSONObject jsonObject) {
+ if (jsonObject == null) {
+ return null;
+ }
+
+ JSONArray jsonTags = jsonObject.optJSONArray(ReaderConstants.JSON_TAG_TAGS_ARRAY);
+ if (jsonTags == null || jsonTags.length() == 0) {
+ return null;
+ }
+
+ ReaderTagList tags = new ReaderTagList();
+ for (int i=0; i < jsonTags.length(); i++) {
+ JSONObject jsonThisTag = jsonTags.optJSONObject(i);
+ String tagTitle = JSONUtils.getStringDecoded(jsonThisTag, ReaderConstants.JSON_TAG_TITLE);
+ String tagDisplayName = JSONUtils.getStringDecoded(jsonThisTag, ReaderConstants.JSON_TAG_DISPLAY_NAME);
+ String tagSlug = JSONUtils.getStringDecoded(jsonThisTag, ReaderConstants.JSON_TAG_SLUG);
+ String endpoint = JSONUtils.getString(jsonThisTag, ReaderConstants.JSON_TAG_URL);
+ tags.add(new ReaderTag(tagSlug, tagDisplayName, tagTitle, endpoint, ReaderTagType.FOLLOWED));
+ }
+
+ return tags;
+ }
+
+}