package com.ywwxhz.data.impl;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.ywwxhz.adapters.CommentListAdapter;
import com.ywwxhz.cnbetareader.R;
import com.ywwxhz.data.ListDataProvider;
import com.ywwxhz.entitys.CommentItem;
import com.ywwxhz.entitys.CommentListObject;
import com.ywwxhz.entitys.ResponseObject;
import com.ywwxhz.lib.CroutonStyle;
import com.ywwxhz.lib.handler.BaseHttpResponseHandler;
import com.ywwxhz.lib.kits.FileCacheKit;
import com.ywwxhz.lib.kits.NetKit;
import com.ywwxhz.lib.kits.Toolkit;
import org.apache.http.Header;
import java.util.ArrayList;
import java.util.HashMap;
import de.keyboardsurfer.android.widget.crouton.Style;
/**
* cnBetaReader
* <p/>
* Created by 远望の无限(ywwxhz) on 2015/4/4 20:44.
*/
public class NewsCommentProvider extends ListDataProvider<CommentItem, CommentListAdapter> {
private int sid;
private String sn;
private String token;
private View actionButton;
private TextView message;
private View listView;
private View mSwipeLayout;
private final AsyncHttpResponseHandler handler = new BaseHttpResponseHandler<CommentListObject>(new TypeToken<ResponseObject<CommentListObject>>() {
}) {
@Override
protected void onSuccess(CommentListObject result) {
callOnLoadingSuccess(result, false, false);
}
@Override
protected Activity getActivity() {
return NewsCommentProvider.this.getActivity();
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
if (!callOnFailure(false, false)) {
super.onFailure(statusCode, headers, responseString, throwable);
}
}
@Override
protected void onError(int statusCode, Header[] headers, String responseString, Throwable cause) {
super.onError(statusCode, headers, responseString, cause);
callOnFailure(true, true);
}
@Override
public void onFinish() {
if (callback != null) callback.onLoadFinish(1);
}
};
public NewsCommentProvider(Activity activity) {
super(activity);
}
@Override
protected CommentListAdapter newAdapter() {
return new CommentListAdapter(getActivity(), new ArrayList<CommentItem>(20));
}
@Override
public String getTypeKey() {
return null;
}
@Override
public String getTypeName() {
return "全部评论";
}
@Override
public void loadNewData() {
NetKit.getInstance().getCommentBySnAndSid(sn, sid + "", handler);
}
@Override
public void loadNextData() {
}
@Override
public AdapterView.OnItemLongClickListener getOnItemLongClickListener() {
return new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ClipboardManager clipboardManager = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, getAdapter().getDataSetItem(position - 1).getComment()));
Toast.makeText(getActivity(), "评论已复制到剪贴板", Toast.LENGTH_SHORT).show();
return true;
}
};
}
@Override
public void loadData(boolean startup) {
loadNewData();
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
private void callOnLoadingSuccess(CommentListObject commentListObject, boolean fromCache, boolean isClosed) {
this.token = commentListObject.getToken();
this.getAdapter().setToken(token);
ArrayList<CommentItem> cmntlist = commentListObject.getCmntlist();
HashMap<String, CommentItem> cmntstore = commentListObject.getCmntstore();
for (CommentItem item : cmntlist) {
StringBuilder sb = new StringBuilder();
item.copy(cmntstore.get(item.getTid()));
CommentItem parent = cmntstore.get(item.getPid());
while (parent != null) {
sb.append("//@");
sb.append(parent.getName());
sb.append(": [");
sb.append(parent.getHost_name());
sb.append("] <br/>");
sb.append(parent.getComment());
parent = cmntstore.get(parent.getPid());
if (parent != null) {
sb.append("<br/>");
}
}
item.setRefContent(sb.toString());
}
ArrayList<CommentItem> hotcmntlist = commentListObject.getHotlist();
for (CommentItem item : hotcmntlist) {
StringBuilder sb = new StringBuilder();
item.copy(cmntstore.get(item.getTid()));
CommentItem parent = cmntstore.get(item.getPid());
while (parent != null) {
sb.append("//@");
sb.append(parent.getName());
sb.append(": [");
sb.append(parent.getHost_name());
sb.append("] <br/>");
sb.append(parent.getComment());
parent = cmntstore.get(parent.getPid());
if (parent != null) {
sb.append("<br/>");
}
}
item.setRefContent(sb.toString());
}
if (cmntlist.size() > 0) { //针对加载缓存和普通访问
this.getAdapter().setDataSet(cmntlist);
this.getAdapter().setHotComment(hotcmntlist);
if (!isClosed && !fromCache) {
this.getAdapter().setEnable(true);
this.actionButton.postDelayed(new Runnable() {
@Override
public void run() {
actionButton.setVisibility(View.VISIBLE);
actionButton.animate().scaleX(1).scaleY(1).setDuration(500).setInterpolator(new AccelerateDecelerateInterpolator()).start();
}
}, 200);
FileCacheKit.getInstance().putAsync(sid + "", Toolkit.getGson().toJson(commentListObject), "comment", null);
Toolkit.showCrouton(getActivity(), R.string.message_flush_success, CroutonStyle.INFO);
} else {
this.getAdapter().setEnable(false);
}
} else if (commentListObject.getOpen() == 0) { //针对关平的新闻评论
Toolkit.showCrouton(getActivity(), R.string.message_comment_close, Style.ALERT);
this.getAdapter().setEnable(false);
this.mSwipeLayout.setEnabled(false);
if (callOnFailure(false, true)) {
this.message.setText(R.string.message_comment_close);
this.listView.setVisibility(View.GONE);
this.message.setVisibility(View.VISIBLE);
}
} else {//针对暂时无评论的情况
Toolkit.showCrouton(getActivity(), R.string.message_no_comment, CroutonStyle.INFO);
if (getAdapter().getCount() != 0) {
this.listView.setVisibility(View.GONE);
}
this.actionButton.postDelayed(new Runnable() {
@Override
public void run() {
actionButton.setVisibility(View.VISIBLE);
actionButton.animate().scaleX(1).scaleY(1).setDuration(500).setInterpolator(new AccelerateDecelerateInterpolator()).start();
}
}, 200);
this.message.setText(R.string.message_no_comment);
this.message.setVisibility(View.VISIBLE);
}
}
private boolean callOnFailure(boolean isWebChange, boolean isCommentClose) {
CommentListObject commentListObject = FileCacheKit.getInstance().getAsObject(sid + "", "comment", new TypeToken<CommentListObject>() {
});
if (commentListObject != null) {
callOnLoadingSuccess(commentListObject, true, isCommentClose);
if (!isWebChange && !isCommentClose) {
Toolkit.showCrouton(getActivity(), R.string.message_load_from_cache, Style.ALERT);
return true;
} else return !isCommentClose;
} else {
if (!isCommentClose) {
this.message.setText(R.string.message_no_network);
this.message.setVisibility(View.VISIBLE);
return false;
} else {
return true;
}
}
}
public void setActionButton(View actionButton) {
this.actionButton = actionButton;
}
public void setListView(View listView) {
this.listView = listView;
}
public void setMessage(TextView message) {
this.message = message;
}
public void setSwipeLayout(View mSwipeLayout) {
this.mSwipeLayout = mSwipeLayout;
}
}