package org.qii.weiciyuan.ui.adapter;
import org.qii.weiciyuan.bean.MessageBean;
import org.qii.weiciyuan.bean.UserBean;
import org.qii.weiciyuan.support.lib.AutoScrollListView;
import org.qii.weiciyuan.support.lib.TopTipBar;
import org.qii.weiciyuan.support.lib.VelocityListView;
import org.qii.weiciyuan.support.settinghelper.SettingUtility;
import org.qii.weiciyuan.support.utils.TimeLineUtility;
import org.qii.weiciyuan.support.utils.Utility;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.LongSparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import java.util.List;
import java.util.WeakHashMap;
/**
* User: qii
* Date: 12-8-19
*/
public class StatusListAdapter extends AbstractAppListAdapter<MessageBean> {
private WeakHashMap<ViewHolder, Drawable> bg = new WeakHashMap<ViewHolder, Drawable>();
private LongSparseArray<Integer> msgHeights = new LongSparseArray<Integer>();
private LongSparseArray<Integer> msgWidths = new LongSparseArray<Integer>();
private LongSparseArray<Integer> oriMsgHeights = new LongSparseArray<Integer>();
private LongSparseArray<Integer> oriMsgWidths = new LongSparseArray<Integer>();
private TopTipBar topTipBar;
private Handler handler = new Handler();
public StatusListAdapter(Fragment fragment, List<MessageBean> bean, ListView listView,
boolean showOriStatus) {
this(fragment, bean, listView, showOriStatus, false);
}
public StatusListAdapter(Fragment fragment, List<MessageBean> bean, ListView listView,
boolean showOriStatus, boolean pre) {
super(fragment, bean, listView, showOriStatus, pre);
}
public void setTopTipBar(TopTipBar bar) {
this.topTipBar = bar;
AutoScrollListView autoScrollListView = (AutoScrollListView) listView;
autoScrollListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
VelocityListView velocityListView = (VelocityListView) view;
// if (velocityListView.getVelocity() < 0) {
// topTipBar.hideCount();
// } else if (velocityListView.getVelocity() > 0) {
// if (topTipBar.getValues().size() == 0) {
// return;
// }
View childView = Utility
.getListViewItemViewFromPosition(listView, firstVisibleItem);
if (childView == null) {
return;
}
int position = firstVisibleItem - ((ListView) view).getHeaderViewsCount();
if (childView.getTop() == 0 && position <= 0) {
topTipBar.clearAndReset();
} else {
handle(position + 1);
}
// }
}
private void handle(int position) {
if (position > 0 && topTipBar != null && position < bean.size()) {
MessageBean next = bean.get(position);
if (next != null) {
MessageBean helperMsg = bean.get(position - 1);
long helperId = 0L;
if (helperMsg != null) {
helperId = helperMsg.getIdLong();
}
topTipBar.handle(next.getIdLong(), helperId);
}
}
}
});
}
@Override
protected void bindViewData(final ViewHolder holder, int position) {
Drawable drawable = bg.get(holder);
if (drawable != null) {
holder.listview_root.setBackgroundDrawable(drawable);
} else {
drawable = holder.listview_root.getBackground();
bg.put(holder, drawable);
}
if (listView.getCheckedItemPosition() == position + listView.getHeaderViewsCount()) {
holder.listview_root.setBackgroundColor(checkedBG);
}
final MessageBean msg = bean.get(position);
UserBean user = msg.getUser();
if (user != null) {
holder.username.setVisibility(View.VISIBLE);
if (!TextUtils.isEmpty(user.getRemark())) {
holder.username.setText(new StringBuilder(user.getScreen_name()).append("(")
.append(user.getRemark()).append(")").toString());
} else {
holder.username.setText(user.getScreen_name());
}
if (!showOriStatus && !SettingUtility.getEnableCommentRepostListAvatar()) {
holder.avatar.setLayoutParams(new RelativeLayout.LayoutParams(0, 0));
} else {
buildAvatar(holder.avatar, position, user);
}
} else {
holder.username.setVisibility(View.INVISIBLE);
holder.avatar.setVisibility(View.INVISIBLE);
}
if (!TextUtils.isEmpty(msg.getListViewSpannableString())) {
boolean haveCachedHeight = msgHeights.get(msg.getIdLong()) != null;
ViewGroup.LayoutParams layoutParams = holder.content.getLayoutParams();
if (haveCachedHeight) {
layoutParams.height = msgHeights.get(msg.getIdLong());
} else {
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
}
boolean haveCachedWidth = msgWidths.get(msg.getIdLong()) != null;
if (haveCachedWidth) {
layoutParams.width = msgWidths.get(msg.getIdLong());
} else {
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
}
holder.content.requestLayout();
holder.content.setText(msg.getListViewSpannableString());
if (!haveCachedHeight) {
msgHeights.append(msg.getIdLong(), layoutParams.height);
}
if (!haveCachedWidth) {
msgWidths.append(msg.getIdLong(), layoutParams.width);
}
} else {
TimeLineUtility.addJustHighLightLinks(msg);
holder.content.setText(msg.getListViewSpannableString());
}
holder.time.setTime(msg.getMills());
if (holder.source != null) {
holder.source.setText(msg.getSourceString());
}
if (showOriStatus) {
boolean checkRepostsCount = (msg.getReposts_count() != 0);
boolean checkCommentsCount = (msg.getComments_count() != 0);
boolean checkPic = msg.havePicture()
|| (msg.getRetweeted_status() != null
&& msg.getRetweeted_status().havePicture());
checkPic = (checkPic && !SettingUtility.isEnablePic());
boolean checkGps = (msg.getGeo() != null);
if (!checkRepostsCount && !checkCommentsCount && !checkPic && !checkGps) {
holder.count_layout.setVisibility(View.INVISIBLE);
} else {
holder.count_layout.setVisibility(View.VISIBLE);
if (checkPic) {
holder.timeline_pic.setVisibility(View.VISIBLE);
} else {
holder.timeline_pic.setVisibility(View.GONE);
}
if (checkGps) {
holder.timeline_gps.setVisibility(View.VISIBLE);
} else {
holder.timeline_gps.setVisibility(View.INVISIBLE);
}
if (checkRepostsCount) {
holder.repost_count.setText(String.valueOf(msg.getReposts_count()));
holder.repost_count.setVisibility(View.VISIBLE);
} else {
holder.repost_count.setVisibility(View.GONE);
}
if (checkCommentsCount) {
holder.comment_count.setText(String.valueOf(msg.getComments_count()));
holder.comment_count.setVisibility(View.VISIBLE);
} else {
holder.comment_count.setVisibility(View.GONE);
}
}
}
holder.repost_content.setVisibility(View.GONE);
holder.repost_content_pic.setVisibility(View.GONE);
holder.repost_content_pic_multi.setVisibility(View.GONE);
holder.content_pic.setVisibility(View.GONE);
holder.content_pic_multi.setVisibility(View.GONE);
if (msg.havePicture()) {
if (msg.isMultiPics()) {
buildMultiPic(msg, holder.content_pic_multi);
} else {
buildPic(msg, holder.content_pic, position);
}
}
MessageBean repost_msg = msg.getRetweeted_status();
if (repost_msg != null && showOriStatus) {
if (holder.repost_layout != null) {
holder.repost_layout.setVisibility(View.VISIBLE);
}
holder.repost_flag.setVisibility(View.VISIBLE);
//sina weibo official account can send repost message with picture, fuck sina weibo
if (holder.content_pic.getVisibility() != View.GONE) {
holder.content_pic.setVisibility(View.GONE);
}
buildRepostContent(msg, repost_msg, holder, position);
if (holder.content_pic_multi != holder.repost_content_pic_multi) {
interruptPicDownload(holder.content_pic_multi);
}
if (holder.repost_content_pic != holder.content_pic) {
interruptPicDownload(holder.repost_content_pic);
}
} else {
if (holder.content_pic_multi != holder.repost_content_pic_multi) {
interruptPicDownload(holder.repost_content_pic_multi);
}
if (holder.repost_content_pic != holder.content_pic) {
interruptPicDownload(holder.repost_content_pic);
}
if (holder.repost_layout != null) {
holder.repost_layout.setVisibility(View.GONE);
}
holder.repost_flag.setVisibility(View.GONE);
}
boolean interruptPic = false;
boolean interruptMultiPic = false;
boolean interruptRepostPic = false;
boolean interruptRepostMultiPic = false;
if (msg.havePicture()) {
if (msg.isMultiPics()) {
interruptPic = true;
} else {
interruptMultiPic = true;
}
}
if (repost_msg != null && showOriStatus) {
if (repost_msg.havePicture()) {
if (repost_msg.isMultiPics()) {
interruptRepostPic = true;
} else {
interruptRepostMultiPic = true;
}
}
}
if (interruptPic && interruptRepostPic) {
interruptPicDownload(holder.content_pic);
interruptPicDownload(holder.repost_content_pic);
}
if (interruptMultiPic && interruptRepostMultiPic) {
interruptPicDownload(holder.content_pic_multi);
interruptPicDownload(holder.repost_content_pic_multi);
}
if (interruptPic && !interruptRepostPic) {
if (holder.content_pic != holder.repost_content_pic) {
interruptPicDownload(holder.content_pic);
}
}
if (!interruptPic && interruptRepostPic) {
if (holder.content_pic != holder.repost_content_pic) {
interruptPicDownload(holder.repost_content_pic);
}
}
if (interruptMultiPic && !interruptRepostMultiPic) {
if (holder.content_pic_multi != holder.repost_content_pic_multi) {
interruptPicDownload(holder.content_pic_multi);
}
}
if (!interruptMultiPic && interruptRepostMultiPic) {
if (holder.content_pic_multi != holder.repost_content_pic_multi) {
interruptPicDownload(holder.repost_content_pic_multi);
}
}
}
private void buildRepostContent(MessageBean msg, final MessageBean repost_msg,
ViewHolder holder, int position) {
holder.repost_content.setVisibility(View.VISIBLE);
if (!repost_msg.getId().equals((String) holder.repost_content.getTag())) {
boolean haveCachedHeight = oriMsgHeights.get(msg.getIdLong()) != null;
ViewGroup.LayoutParams layoutParams = holder.repost_content.getLayoutParams();
if (haveCachedHeight) {
layoutParams.height = oriMsgHeights.get(msg.getIdLong());
} else {
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
}
boolean haveCachedWidth = oriMsgWidths.get(msg.getIdLong()) != null;
if (haveCachedWidth) {
layoutParams.width = oriMsgWidths.get(msg.getIdLong());
} else {
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
}
holder.repost_content.requestLayout();
holder.repost_content.setText(repost_msg.getListViewSpannableString());
if (!haveCachedHeight) {
oriMsgHeights.append(msg.getIdLong(), layoutParams.height);
}
if (!haveCachedWidth) {
oriMsgWidths.append(msg.getIdLong(), layoutParams.width);
}
holder.repost_content.setText(repost_msg.getListViewSpannableString());
holder.repost_content.setTag(repost_msg.getId());
}
if (repost_msg.havePicture()) {
if (repost_msg.isMultiPics()) {
buildMultiPic(repost_msg, holder.repost_content_pic_multi);
} else {
buildPic(repost_msg, holder.repost_content_pic, position);
}
}
}
}