package com.shaweibo.biu.adapter.timeline;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.shaweibo.biu.R;
import com.shaweibo.biu.Utils.DeviceUtil;
import com.shaweibo.biu.Utils.StatusTimeUtils;
import com.shaweibo.biu.Utils.Utility;
import com.shaweibo.biu.dao.favo.FavoDao;
import com.shaweibo.biu.dao.favo.LikeDao;
import com.shaweibo.biu.global.Constants;
import com.shaweibo.biu.global.MyApplication;
import com.shaweibo.biu.model.MessageListModel;
import com.shaweibo.biu.model.MessageModel;
import com.shaweibo.biu.model.PicSize;
import com.shaweibo.biu.ui.picture.PicsActivity;
import com.shaweibo.biu.ui.post.PostNewCommentActivity;
import com.shaweibo.biu.ui.post.PostNewRepostActivity;
import com.shaweibo.biu.ui.timeline.StatusDetailActivity;
import com.shaweibo.biu.ui.timeline.UserHomeActivity;
import com.shaweibo.biu.ui.common.StatusContextMenu;
import com.shaweibo.biu.ui.common.StatusContextMenuManager;
import com.shaweibo.biu.widget.FlowLayout;
import com.shaweibo.biu.widget.TagImageVIew;
import com.shaweibo.biu.widget.TextViewFixTouchConsume;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* Created by Administrator on 2014.12.29.
*/
public class TimelineAdapter extends BaseTimelinAdapter<MessageListModel> implements View.OnClickListener, StatusContextMenu.OnStatusContextMenuItemClickListener {
private StatusTimeUtils mTimeUtils;
private int photoMargin;
private float imageMaxWidth;
private float repostImageMaxWidth;
float avatarSize;
public OnClickListener mListenner;
public TimelineAdapter(Context context, MessageListModel messageListModel) {
super(context, messageListModel);
mTimeUtils = StatusTimeUtils.instance(context);
float padding = context.getResources().getDimension(R.dimen.NormalMargin);
avatarSize = context.getResources().getDimension(R.dimen.avatar_lst_item);
photoMargin = context.getResources().getDimensionPixelSize(R.dimen.moment_photo_margin);
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
imageMaxWidth = metrics.widthPixels - 4 * padding - avatarSize;
float smallPadding = context.getResources().getDimension(R.dimen.SmallPadding);
repostImageMaxWidth = imageMaxWidth - 2 * smallPadding;
}
@Override
public void onClick(View v) {
int viewId = v.getId();
int postion = (int) v.getTag();
MessageModel msg = mListModel.get(postion);
switch (viewId) {
case R.id.ll_comment:
PostNewCommentActivity.start(mContext, msg);
break;
case R.id.ll_repost:
PostNewRepostActivity.start(mContext, msg);
break;
case R.id.iv_avatar:
UserHomeActivity.start(mContext, msg.user);
break;
case R.id.btn_more:
StatusContextMenuManager.getInstance().toggleContextMenuFromView(v, postion, this);
break;
// case R.id.tv_orignal_content:
case R.id.rl_repost:
StatusDetailActivity.start(mContext, mListModel.get(postion).retweeted_status);
break;
case R.id.ll_like:
LikeDao likeDao=new LikeDao(msg.id,mContext);
if(!msg.liked) {
likeDao.like();
mListModel.get(postion).attitudes_count++;
mListModel.get(postion).liked=true;
ImageView iv_like = (ImageView) v.findViewById(R.id.iv_like);
TextView tv_like_count= (TextView) v.findViewById(R.id.tv_like_count);
setLikeBtn(iv_like,tv_like_count,postion);
ScaleAnimation myAnimation_Scale = new ScaleAnimation(1.0f, 1.3f, 1.0f,
1.3f, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Scale.setDuration(300);
iv_like.startAnimation(myAnimation_Scale);
}
else{
likeDao.unLike();
mListModel.get(postion).attitudes_count--;
mListModel.get(postion).liked=false;
ImageView iv_like = (ImageView) v.findViewById(R.id.iv_like);
TextView tv_like_count= (TextView) v.findViewById(R.id.tv_like_count);
setLikeBtn(iv_like, tv_like_count, postion);
}
break;
}
}
@Override
public void onFavoClick(int feedItem) {
StatusContextMenuManager.getInstance().hideContextMenu();
FavoDao dao = new FavoDao(mListModel.get(feedItem).id,mContext);
dao.favo();
}
@Override
public void onCopyClick(int feedItem) {
StatusContextMenuManager.getInstance().hideContextMenu();
ClipboardManager c= (ClipboardManager)mContext.getSystemService(mContext.CLIPBOARD_SERVICE);
c.setText(mListModel.get(feedItem).text);
}
@Override
public void onCancelClick(int feedItem) {
StatusContextMenuManager.getInstance().hideContextMenu();
}
public static enum ITEM_TYPE {
ITEM_TYPE_HEADER,
ITEM_TYPE_BOTTOM,
ITEM_TYPE_CONTENT_BASE,
ITEM_TYPE_CONTENT_REPOST,
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof RepostWeiboViewHolder) {
MessageModel msg = mListModel.getList().get(position);
onBindRepostWeiboViewHolder((RepostWeiboViewHolder) holder, position);
dealImageLayout(msg.retweeted_status, ((BaseWeiboViewHolder) holder), repostImageMaxWidth, position);
} else if (holder instanceof BaseWeiboViewHolder) {
MessageModel msg = mListModel.getList().get(position);
onBindBaseWeiboViewHolder((BaseWeiboViewHolder) holder, position);
dealImageLayout(msg, ((BaseWeiboViewHolder) holder), imageMaxWidth, position);
}
}
public void onBindBaseWeiboViewHolder(BaseWeiboViewHolder holder, int position) {
resetViewHolder(holder);
final MessageModel msg = mListModel.get(position);
holder.tv_content.setText(msg.span);
holder.tv_content.setMovementMethod(TextViewFixTouchConsume.LocalLinkMovementMethod.getInstance());
holder.tv_username.setText(msg.user.getName());
String url = avartarHd?msg.user.avatar_large:msg.user.profile_image_url;
if (!url.equals(holder.iv_avatar.getTag())) {
holder.iv_avatar.setTag(url);
ImageLoader.getInstance().displayImage(url, holder.iv_avatar, Constants.getAvatarOptions(msg.user.name.substring(0, 1)));
}
holder.iv_avatar.setTag(position);
holder.iv_avatar.setOnClickListener(this);
holder.ll_comment.setOnClickListener(this);
holder.ll_comment.setTag(position);
holder.ll_repost.setOnClickListener(this);
holder.ll_repost.setTag(position);
holder.ll_like.setOnClickListener(this);
holder.ll_like.setTag(position);
holder.btn_more.setVisibility(View.VISIBLE);
holder.btn_more.setOnClickListener(this);
holder.btn_more.setTag(position);
setLikeBtn(holder.iv_like,holder.tv_like_count,position);
String source = TextUtils.isEmpty(msg.source) ? "" : Utility.dealSourceString(msg.source);
holder.tv_time_source.setText(mTimeUtils.buildTimeString(msg.created_at) + " | " + source);
holder.tv_comment_count.setText(Utility.getCountString(msg.comments_count));
holder.tv_repost_count.setText(Utility.getCountString(msg.reposts_count));
}
private void setLikeBtn(ImageView iv_like,TextView tv_like_count,int position){
if(mListModel.get(position).liked){
iv_like.setImageResource(R.mipmap.ic_like_red);
}
else{
iv_like.setImageResource(R.mipmap.ic_like_full);
}
tv_like_count.setText(" " + Utility.getCountString(mListModel.get(position).attitudes_count));
}
public void onBindRepostWeiboViewHolder(RepostWeiboViewHolder holder, int position) {
onBindBaseWeiboViewHolder(holder, position);
MessageModel msg = mListModel.getList().get(position).retweeted_status;
holder.tv_orignal_content.setText(msg.origSpan);
holder.tv_orignal_content.setMovementMethod(TextViewFixTouchConsume.LocalLinkMovementMethod.getInstance());
holder.rl_repost.setTag(position);
holder.tv_orignal_content.setTag(position);
holder.rl_repost.setOnClickListener(this);
}
@Override
public RecyclerView.ViewHolder onCreateContentView(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE.ITEM_TYPE_CONTENT_BASE.ordinal()) {
View view = mLayoutInflater.inflate(R.layout.item_weibo, parent, false);
BaseWeiboViewHolder holder = new BaseWeiboViewHolder(view, mContext);
return holder;
} else if (viewType == ITEM_TYPE.ITEM_TYPE_CONTENT_REPOST.ordinal()) {
View view = mLayoutInflater.inflate(R.layout.item_weibo_repost, parent, false);
RepostWeiboViewHolder holder = new RepostWeiboViewHolder(view, mContext);
return holder;
} else {
return null;
}
}
public void setOnClickListenner(OnClickListener onClickListenner) {
this.mListenner = onClickListenner;
}
@Override
public int getContentItemCount() {
return mListModel.getList().size();
}
@Override
public int getContentItemViewType(int position) {
MessageModel msg = mListModel.getList().get(position);
if (msg.retweeted_status == null) {
return ITEM_TYPE.ITEM_TYPE_CONTENT_BASE.ordinal();
} else {
return ITEM_TYPE.ITEM_TYPE_CONTENT_REPOST.ordinal();
}
}
/**
* 图片处理
*/
private void dealImageLayout(final MessageModel msg, BaseWeiboViewHolder holder, float maxWidth, int position) {
List<MessageModel.PictureUrl> medias = msg.pic_urls;
if (medias != null && medias.size() > 0) {
// int size = 0;
int mediumSize = (int) ((maxWidth - photoMargin) / 2);
int smallSize = (int) ((maxWidth - 2 * photoMargin) / 3);
int count = medias.size();
for (int i = 0; i < count; i++) {
// 图片超过九张
if (i > holder.fl_images.getChildCount() - 1) {
break;
}
final MessageModel.PictureUrl pictureUrl = medias.get(i);
String imgUrl = pictureUrl.getThumbnail();
if (netWorkType == DeviceUtil.NetWorkType.wifi && !pictureUrl.isGif()&&picQuantity==2) {
imgUrl = pictureUrl.getMedium();
}
TagImageVIew imageView = holder.listImageView.get(i);
imageView.setMinimumHeight(smallSize);
imageView.setMinimumWidth(smallSize);
FlowLayout.LayoutParams param = new FlowLayout.LayoutParams(smallSize, smallSize);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
PicSize picSize = null;
switch (count) {
case 1:
if(picQuantity!=0) {
imgUrl = pictureUrl.getMedium();
}
else{
imgUrl = pictureUrl.getThumbnail();
}
picSize = MyApplication.picSizeCache.get(imgUrl);
if (picSize != null) {
param = new FlowLayout.LayoutParams(picSize.getWidth(), picSize.getHeight());
} else {
param = new FlowLayout.LayoutParams(FlowLayout.LayoutParams.WRAP_CONTENT, FlowLayout.LayoutParams.WRAP_CONTENT);
}
imageView.setMaxHeight((int) maxWidth);
imageView.setMaxWidth((int) maxWidth);
break;
case 3:
case 6:
case 9:
param = new FlowLayout.LayoutParams(smallSize, smallSize);
break;
case 2:
case 4:
param = new FlowLayout.LayoutParams(mediumSize, mediumSize);
break;
case 5:
case 7:
if (1 < i && i < 5) {
param = new FlowLayout.LayoutParams(smallSize, smallSize);
} else {
param = new FlowLayout.LayoutParams(mediumSize, mediumSize);
}
break;
case 8:
if (2 < i && i < 5) {
param = new FlowLayout.LayoutParams(mediumSize, mediumSize);
} else {
param = new FlowLayout.LayoutParams(smallSize, smallSize);
}
break;
default:
break;
}
imageView.setVisibility(View.VISIBLE);
imageView.setLayoutParams(param);
if (pictureUrl.isGif()) {
imageView.setDrawTag(true);
}
final int index = i;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PicsActivity.start((Activity) mContext, msg, index);
}
});
if (!TextUtils.isEmpty(imgUrl) && !imgUrl.equals(imageView.getTag())) {
ImageLoadingListener imageLoadingListener = null;
if (count == 1 && picSize == null) {
imageLoadingListener = new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
int width = loadedImage.getWidth();
int height = loadedImage.getHeight();
ImageView imageView = (ImageView) view;
int singleImgMaxHeight = (int) (imageMaxWidth * 2 / 3);
if (height > singleImgMaxHeight) {
height = (int) singleImgMaxHeight;
}
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
FlowLayout.LayoutParams param = new FlowLayout.LayoutParams(width, height);
imageView.setLayoutParams(param);
imageView.setImageBitmap(loadedImage);
PicSize picSize = new PicSize();
picSize.setKey(imageUri);
picSize.setWidth(width);
picSize.setHeight(height);
// 放入内存
MyApplication.picSizeCache.put(picSize.getKey(), picSize);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
};
}
ImageLoader.getInstance().displayImage(imgUrl, imageView, Constants.timelineListOptions, imageLoadingListener);
imageView.setTag(imgUrl);
}
}
holder.fl_images.setVisibility(View.VISIBLE);
}
}
public void resetViewHolder(BaseWeiboViewHolder holder) {
holder.fl_images.setVisibility(View.GONE);
for (TagImageVIew imageView : holder.listImageView) {
imageView.setVisibility(View.GONE);
imageView.setDrawTag(false);
}
}
public class BaseWeiboViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.tv_time_source)
public TextView tv_time_source;
@InjectView(R.id.tv_username)
public TextView tv_username;
@InjectView(R.id.tv_content)
public TextViewFixTouchConsume tv_content;
@InjectView(R.id.ll_comment)
public LinearLayout ll_comment;
@InjectView(R.id.ll_like)
public LinearLayout ll_like;
@InjectView(R.id.ll_repost)
public LinearLayout ll_repost;
@InjectView(R.id.fl_images)
public FlowLayout fl_images;
@InjectView(R.id.iv_avatar)
public ImageView iv_avatar;
@InjectView(R.id.tv_comment_count)
public TextView tv_comment_count;
@InjectView(R.id.tv_repost_count)
public TextView tv_repost_count;
@InjectView(R.id.tv_like_count)
public TextView tv_like_count;
@InjectView(R.id.iv_like)
public ImageView iv_like;
@InjectView(R.id.btn_more)
public ImageButton btn_more;
public List<TagImageVIew> listImageView = new ArrayList<TagImageVIew>();
public BaseWeiboViewHolder(View itemView, Context context) {
super(itemView);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListenner != null) {
mListenner.onTtemClick(v, getAdapterPosition());
}
}
});
for (int i = 0; i < 9; i++) {
TagImageVIew imageView = new TagImageVIew(context);
imageView.setBackgroundColor(context.getResources().getColor(R.color.list_line));
imageView.setVisibility(View.GONE);
imageView.setAdjustViewBounds(true);
listImageView.add(imageView);
fl_images.addView(imageView);
}
}
}
public class RepostWeiboViewHolder extends BaseWeiboViewHolder {
@InjectView(R.id.tv_orignal_content)
public TextViewFixTouchConsume tv_orignal_content;
@InjectView(R.id.rl_repost)
public View rl_repost;
public RepostWeiboViewHolder(View itemView, Context context) {
super(itemView, context);
}
}
public interface OnClickListener {
public void onTtemClick(View view, int position);
}
}