package com.buddycloud.model; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.http.entity.StringEntity; import org.json.JSONObject; import android.content.Context; import com.buddycloud.http.BuddycloudHTTPHelper; import com.buddycloud.model.dao.SubscribedChannelsDAO; import com.buddycloud.preferences.Preferences; public class SubscribedChannelsModel extends AbstractModel<JSONObject, JSONObject, String> { private static SubscribedChannelsModel instance; public static final String ROLE = "com.buddycloud.ROLE"; public static final String ROLE_MEMBER = "member"; public static final String ROLE_PUBLISHER = "publisher"; public static final String ROLE_OUTCAST = "outcast"; public static final String ROLE_MODERATOR = "moderator"; public static final String ROLE_OWNER = "owner"; public static final String SUBSCRIPTION_SUBSCRIBED = "subscribed"; public static final String SUBSCRIPTION_PENDING = "pending"; public static final String SUBSCRIPTION_NONE = "none"; public static final String ACCESS_MODEL = "com.buddycloud.ACCESS_MODEL"; public static final String ACCESS_MODEL_OPEN = "open"; public static final String ACCESS_MODEL_AUTHORIZE = "authorize"; public static final String POST_NODE_SUFIX = "/posts"; private static final String ENDPOINT = "/subscribed"; private SubscribedChannelsModel() {} public static SubscribedChannelsModel getInstance() { if (instance == null) { instance = new SubscribedChannelsModel(); } return instance; } public void getFromServer(final Context context, final ModelCallback<JSONObject> callback, String... p) { } private static String url(Context context) { String apiAddress = Preferences.getPreference(context, Preferences.API_ADDRESS); return apiAddress + ENDPOINT; } @Override public void save(final Context context, JSONObject object, final ModelCallback<JSONObject> callback, String... p) { if (p.length > 0) { return; } try { StringEntity requestEntity = new StringEntity(object.toString(), "UTF-8"); requestEntity.setContentType("application/json"); BuddycloudHTTPHelper.post(url(context), true, false, requestEntity, context, new ModelCallback<JSONObject>() { @Override public void success(final JSONObject subscription) { fill(context, new ModelCallback<Void>() { @Override public void success(Void response) { callback.success(subscription); } @Override public void error(Throwable throwable) { callback.error(throwable); } }); } @Override public void error(Throwable throwable) { callback.error(throwable); } }); } catch (Exception e) { callback.error(e); } } @Override public JSONObject getFromCache(Context context, String... p) { JSONObject subscribed = SubscribedChannelsDAO.getInstance(context).get(null); if (subscribed == null) { return new JSONObject(); } return subscribed; } @Override public void fill(final Context context, final ModelCallback<Void> callback, String... p) { BuddycloudHTTPHelper.getObject(url(context), context, new ModelCallback<JSONObject>() { @SuppressWarnings("unchecked") @Override public void success(JSONObject response) { final Map<String, String> subscriptions = new HashMap<String, String>(); Iterator<String> keyIterator = response.keys(); while (keyIterator.hasNext()) { String node = (String) keyIterator.next(); if (node.endsWith(POST_NODE_SUFIX)) { subscriptions.put(node.split("/")[0], response.optString(node)); } } SubscribedChannelsDAO dao = SubscribedChannelsDAO.getInstance(context); if (dao.get(null) == null) { dao.insert(null, new JSONObject(subscriptions)); } else { dao.update(null, new JSONObject(subscriptions)); } notifyChanged(); callback.success(null); } @Override public void error(Throwable throwable) { callback.error(throwable); } }); } public static boolean canEditMetadata(final String role) { return role != null && role.equals(ROLE_OWNER); } public static boolean canPost(String role) { if (role == null) { return false; } return role.equals(ROLE_OWNER) || role.equals(ROLE_MODERATOR) || role.equals(ROLE_PUBLISHER); } public static boolean canDeletePost(String role) { if (role == null) { return false; } return role.equals(ROLE_OWNER) || role.equals(ROLE_MODERATOR); } public static boolean canDeleteChannel(String role) { if (role == null) { return false; } return role.equals(ROLE_OWNER); } public static boolean isFollowing(String role) { if (role == null) { return false; } return role.equals(ROLE_OWNER) || role.equals(ROLE_MODERATOR) || role.equals(ROLE_PUBLISHER) || role.equals(ROLE_MEMBER); } public static boolean canMakeModerator(String role) { return role != null && role.equals(ROLE_OWNER); } public static boolean canChangeAffiliation(String role) { if (role == null) { return false; } return role.equals(ROLE_OWNER) || role.equals(ROLE_MODERATOR); } @Override public void delete(Context context, ModelCallback<Void> callback, String... p) { // TODO Auto-generated method stub } }