package org.wordpress.android.ui.plans.models; import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.util.JSONUtils; import org.wordpress.android.util.StringUtils; public class Feature { /* { "product_slug": "space", "title": "Space", "description": "Increase your available storage space and add the ability to upload audio files.", "icon": "", "plans": { "1": { "title": "Media storage", "description": "Upload up to 3GB of photos, videos, or music.", "icon": "" }, "1003": { "title": "Expanded media storage", "description": "Upload up to 13GB of photos, videos, or music.", "icon": "" }, "1008": { "title": "Unlimited media storage", "description": "You can upload unlimited photos, videos, or music.", "icon": "" } } }, OR { "product_slug": "ecommerce", "title": "eCommerce", "description": "Sell stuff right on your blog with Ecwid and Shopify.", "icon": "", "plans": { "1008": true } }, */ private String mProductSlug; private String mTitle; private String mIcon; private String mDescription; private boolean mIsNotPartOfFreeTrial; private final JSONObject mPlanIDToDescription; public Feature(JSONObject featureJSONObject) throws JSONException { mProductSlug = featureJSONObject.getString("product_slug"); mTitle = featureJSONObject.getString("title"); mIcon = featureJSONObject.optString("icon"); mDescription = featureJSONObject.getString("description"); mPlanIDToDescription = featureJSONObject.optJSONObject("plans"); if (featureJSONObject.has("not_part_of_free_trial") && JSONUtils.getBool(featureJSONObject, "not_part_of_free_trial")) { // not part of free trial mIsNotPartOfFreeTrial = true; } } public String getProductSlug() { return StringUtils.notNullStr(mProductSlug); } public String getTitle() { return StringUtils.notNullStr(mTitle); } public String getDescription() { return StringUtils.notNullStr(mDescription); } public boolean isNotPartOfFreeTrial() { return mIsNotPartOfFreeTrial; } /** * Return the description of this feature for a given plan. * If description is not provided for the given plan, fallback to the global description of the feature. */ public String getDescriptionForPlan(Long planID) { return getPropertyForPlan(planID, "description", mDescription); } /** * Return the title of this feature for a given plan. * If title is not provided for the given plan, fallback to the global title of the feature. */ public String getTitleForPlan(Long planID) { return getPropertyForPlan(planID, "title", mTitle); } /** * Return the icon of this feature for a given plan. * If icon is not provided for the given plan, fallback to the global icon for this feature. */ public String getIconForPlan(Long planID) { return getPropertyForPlan(planID, "icon", mIcon); } private String getPropertyForPlan(Long planID, String propertyName, String fallback) { String planIdAsString = String.valueOf(planID); fallback = StringUtils.notNullStr(fallback); if (mPlanIDToDescription != null && mPlanIDToDescription.has(planIdAsString)) { JSONObject plan = mPlanIDToDescription.optJSONObject(planIdAsString); if (plan != null) { // It's not a JSON object. Just `true` in the response. That means the plan has this feature with generic description/title/icon. return plan.optString( propertyName, fallback ); } } return fallback; } }