package com.uservoice.uservoicesdk.model; import android.content.SharedPreferences; import com.uservoice.uservoicesdk.Session; import com.uservoice.uservoicesdk.rest.Callback; import com.uservoice.uservoicesdk.rest.RestTaskCallback; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.List; public class ClientConfig extends BaseModel { private boolean ticketsEnabled; private boolean feedbackEnabled; private boolean whiteLabel; private int defaultForumId; private List<CustomField> customFields; private String defaultSort; private String subdomainId; private String key; private String secret; private String accountName; public static void loadClientConfig(final Callback<ClientConfig> callback) { String path = Session.getInstance().getConfig().getKey() == null ? "/clients/default.json" : "/client.json"; final String cacheKey = String.format("uv-client-%s-%s", Session.getInstance().getConfig().getSite(), Session.getInstance().getConfig().getKey()); final SharedPreferences prefs = Session.getInstance().getSharedPreferences(); // cache the client config and then request it in the background ClientConfig clientConfig = load(prefs, cacheKey, "client", ClientConfig.class); if (clientConfig != null) { // Log.d("UV", "client config from cache"); callback.onModel(clientConfig); // background refresh doGet(apiPath(path), new RestTaskCallback(callback) { @Override public void onComplete(JSONObject result) throws JSONException { ClientConfig clientConfig = deserializeObject(result, "client", ClientConfig.class); clientConfig.persist(prefs, cacheKey, "client"); } }); } else { // Log.d("UV", "loading client config"); doGet(apiPath(path), new RestTaskCallback(callback) { @Override public void onComplete(JSONObject result) throws JSONException { ClientConfig clientConfig = deserializeObject(result, "client", ClientConfig.class); clientConfig.persist(prefs, cacheKey, "client"); callback.onModel(clientConfig); } }); } } @Override public void load(JSONObject object) throws JSONException { super.load(object); ticketsEnabled = object.getBoolean("tickets_enabled"); feedbackEnabled = object.getBoolean("feedback_enabled"); whiteLabel = object.getBoolean("white_label"); defaultForumId = object.getJSONObject("forum").getInt("id"); customFields = deserializeList(object, "custom_fields", CustomField.class); defaultSort = getString(object.getJSONObject("subdomain"), "default_sort"); subdomainId = getString(object.getJSONObject("subdomain"), "id"); accountName = getString(object.getJSONObject("subdomain"), "name"); key = object.getString("key"); // secret will only be available for the default client secret = object.has("secret") ? object.getString("secret") : null; } @Override public void save(JSONObject object) throws JSONException { super.save(object); object.put("tickets_enabled", ticketsEnabled); object.put("feedback_enabled", feedbackEnabled); object.put("white_label", whiteLabel); JSONObject forum = new JSONObject(); forum.put("id", defaultForumId); object.put("forum", forum); JSONArray jsonCustomFields = new JSONArray(); for (CustomField customField : customFields) { JSONObject jsonCustomField = new JSONObject(); customField.save(jsonCustomField); jsonCustomFields.put(jsonCustomField); } object.put("custom_fields", jsonCustomFields); JSONObject subdomain = new JSONObject(); subdomain.put("id", subdomainId); subdomain.put("default_sort", defaultSort); subdomain.put("name", accountName); object.put("subdomain", subdomain); object.put("key", key); if (secret != null) { object.put("secret", secret); } } public String getAccountName() { return accountName; } public boolean isTicketSystemEnabled() { return ticketsEnabled; } public boolean isFeedbackEnabled() { return feedbackEnabled; } public boolean isWhiteLabel() { return whiteLabel; } public int getDefaultForumId() { return defaultForumId; } public List<CustomField> getCustomFields() { return customFields; } public String getSuggestionSort() { return defaultSort.equals("new") ? "newest" : (defaultSort.equals("hot") ? "hot" : "votes"); } public String getSubdomainId() { return subdomainId; } public String getKey() { return key; } public String getSecret() { return secret; } }