package com.buddycloud.fragments.adapter;
import java.util.Comparator;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Context;
import android.widget.Toast;
import com.buddycloud.R;
import com.buddycloud.log.Logger;
import com.buddycloud.model.ModelCallback;
import com.buddycloud.model.ModelCallbackImpl;
import com.buddycloud.model.SubscribedChannelsModel;
import com.buddycloud.model.SyncModel;
import com.buddycloud.preferences.Preferences;
public class SubscribedChannelsAdapter extends GenericChannelAdapter {
private static final String PERSONAL = "PERSONAL";
private static final String SUBSCRIBED = "SUBSCRIBED";
private String myChannel;
public SubscribedChannelsAdapter() {
setCategoryOrder(PERSONAL, SUBSCRIBED);
}
public String getTitle(final Context context) {
return (context != null) ? context.getResources().getString(R.string.app_name) : null;
}
public void load(final Context context) {
reload(context);
loadFromServer(context);
}
public void reload(final Context context) {
this.myChannel = Preferences.getPreference(context, Preferences.MY_CHANNEL_JID);
JSONObject subscriptions = SubscribedChannelsModel.getInstance().getFromCache(context);
JSONArray channels = subscriptions.names();
clear();
for (int i = 0; channels != null && i < channels.length(); i++) {
String channel = channels.optString(i);
if (!channel.equals(myChannel)) {
addChannel(SUBSCRIBED, createChannelItem(channel), context);
} else {
addChannel(PERSONAL, createChannelItem(channel), context);
}
}
sort(context);
notifyDataSetChanged();
}
public void loadFromServer(final Context context) {
SubscribedChannelsModel.getInstance().fill(context, new ModelCallback<Void>() {
@Override
public void success(Void response) {
SyncModel.getInstance().syncNoSummary(
context, new ModelCallbackImpl<Void>(){
@Override
public void success(Void response) {
SyncModel.getInstance().fill(
context, new ModelCallbackImpl<Void>());
}
@Override
public void error(Throwable throwable) {
success(null);
}
});
}
@Override
public void error(Throwable throwable) {
Logger.warn(SubscribedChannelsAdapter.class.toString(),
throwable.getLocalizedMessage(), throwable);
Toast.makeText(context, context.getString(
R.string.message_fetch_subscribed_failed),
Toast.LENGTH_LONG).show();
}
});
}
public void sort(final Context context) {
final JSONObject allCounters = SyncModel.getInstance().getFromCache(context);
sort(new Comparator<JSONObject>() {
@Override
public int compare(JSONObject lhs, JSONObject rhs) {
int diff = compareCounters(lhs, rhs, "mentionsCount", "replyCount",
"totalCount", "visitCount", "lastWeekActivity");
if (diff != 0) {
return diff;
}
return lhs.optString("jid").compareTo(rhs.optString("jid"));
}
private int compareCounters(JSONObject lhs, JSONObject rhs, String... fields) {
for (String field : fields) {
int countA = getCounter(allCounters, lhs.optString("jid"), field);
int countB = getCounter(allCounters, rhs.optString("jid"), field);
int diff = countB - countA;
if (diff != 0) {
return diff;
}
}
return 0;
}
});
}
private static int getCounter(JSONObject allCounters, String channel, String key) {
JSONObject channelCounters = allCounters.optJSONObject(channel);
if (channelCounters == null) {
return 0;
}
return channelCounters.optInt(key);
}
}