package org.wordpress.android.models; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.JSONUtils; import java.util.HashMap; import java.util.Map; // Maps to notification settings returned from the /me/notifications/settings endpoint on wp.com public class NotificationsSettings { public static final String KEY_BLOGS = "blogs"; public static final String KEY_OTHER = "other"; public static final String KEY_DOTCOM = "wpcom"; public static final String KEY_DEVICES = "devices"; public static final String KEY_DEVICE_ID = "device_id"; public static final String KEY_BLOG_ID = "blog_id"; private JSONObject mOtherSettings; private JSONObject mDotcomSettings; private Map<Long, JSONObject> mBlogSettings; // The main notification settings channels (displayed at root of NoticationsSettingsFragment) public enum Channel { OTHER, BLOGS, DOTCOM } // The notification setting type, used in BLOGS and OTHER channels public enum Type { TIMELINE, EMAIL, DEVICE; public String toString() { switch (this) { case TIMELINE: return "timeline"; case EMAIL: return "email"; case DEVICE: return "device"; default: return ""; } } } public NotificationsSettings(JSONObject json) { updateJson(json); } // Parses the json response from /me/notifications/settings endpoint and updates the instance variables public void updateJson(JSONObject json) { mBlogSettings = new HashMap<>(); mOtherSettings = JSONUtils.queryJSON(json, KEY_OTHER, new JSONObject()); mDotcomSettings = JSONUtils.queryJSON(json, KEY_DOTCOM, new JSONObject()); JSONArray siteSettingsArray = JSONUtils.queryJSON(json, KEY_BLOGS, new JSONArray()); for (int i=0; i < siteSettingsArray.length(); i++) { try { JSONObject siteSetting = siteSettingsArray.getJSONObject(i); mBlogSettings.put(siteSetting.optLong(KEY_BLOG_ID), siteSetting); } catch (JSONException e) { AppLog.e(AppLog.T.NOTIFS, "Could not parse blog JSON in notification settings"); } } } // Updates a specific notification setting after a user makes a change public void updateSettingForChannelAndType(Channel channel, Type type, String settingName, boolean newValue, long blogId) { String typeName = type.toString(); try { switch (channel) { case BLOGS: JSONObject blogJson = getBlogSettings().get(blogId); if (blogJson != null) { JSONObject blogSetting = JSONUtils.queryJSON(blogJson, typeName, new JSONObject()); blogSetting.put(settingName, newValue); blogJson.put(typeName, blogSetting); getBlogSettings().put(blogId, blogJson); } break; case OTHER: JSONObject otherSetting = JSONUtils.queryJSON(getOtherSettings(), typeName, new JSONObject()); otherSetting.put(settingName, newValue); getOtherSettings().put(typeName, otherSetting); break; case DOTCOM: getDotcomSettings().put(settingName, newValue); } } catch (JSONException e) { AppLog.e(AppLog.T.NOTIFS, "Could not update notifications settings JSON"); } } public JSONObject getOtherSettings() { return mOtherSettings; } public Map<Long, JSONObject> getBlogSettings() { return mBlogSettings; } public JSONObject getDotcomSettings() { return mDotcomSettings; } }