package com.suan.weclient.adapter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.suan.weclient.R;
import com.suan.weclient.activity.ShowImgActivity;
import com.suan.weclient.util.ListCacheManager;
import com.suan.weclient.util.Util;
import com.suan.weclient.util.data.DataManager;
import com.suan.weclient.util.data.bean.MessageBean;
import com.suan.weclient.util.net.WeChatLoader;
import com.suan.weclient.util.net.WechatManager;
import com.suan.weclient.util.net.WechatManager.OnActionFinishListener;
import com.suan.weclient.util.net.images.ImageCacheManager;
import com.suan.weclient.util.text.SpanUtil;
import com.suan.weclient.util.voice.VoiceHolder;
import com.suan.weclient.util.voice.VoiceManager.AudioPlayListener;
public class ChatListAdapter extends BaseAdapter implements OnScrollListener {
private LayoutInflater mInflater;
private ListCacheManager mListCacheManager;
private DataManager mDataManager;
private Context mContext;
private HashMap<String, VoiceHolder> voiceCache;
/*
* whether the scroll is busy
*/
private boolean mBusy = false;
public ChatListAdapter(Context context, DataManager dataManager) {
this.mInflater = LayoutInflater.from(context);
this.mDataManager = dataManager;
this.mContext = context;
this.mListCacheManager = new ListCacheManager();
this.voiceCache = new HashMap<String, VoiceHolder>();
initListener();
}
private void initListener() {
mDataManager.addChatNewItemGetListener(new DataManager.ChatNewItemGetListener() {
@Override
public void onChatItemGet(ArrayList<MessageBean> getMessage, String msgId) {
int index = -1;
for (int i = 0; i < getMessageItems().size(); i++) {
MessageBean nowMessage = getMessageItems().get(i);
if (nowMessage.getId().equals(msgId)) {
index = i;
}
}
if (index != -1) {
getMessageItems().remove(index);
for (int i = 0; i < getMessage.size(); i++) {
getMessageItems().add(index, getMessage.get(i));
}
}
}
});
}
private ArrayList<MessageBean> getMessageItems() {
if (mDataManager.getChatHolder() == null) {
ArrayList<MessageBean> blankArrayList = new ArrayList<MessageBean>();
return blankArrayList;
}
return mDataManager.getChatHolder().getMessageList();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return getMessageItems().size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public void updateCache() {
mListCacheManager.clearData();
}
public View newView(final int position) {
View convertView = null;
switch (getMessageItems().get(position).getType()
+ getMessageItems().get(position).getOwner() * 10) {
case MessageBean.MESSAGE_OWNER_HER * 10 + MessageBean.MESSAGE_TYPE_TEXT:
convertView = mInflater.inflate(R.layout.chat_item_her_text_layout,
null);
break;
case MessageBean.MESSAGE_OWNER_HER * 10 + MessageBean.MESSAGE_TYPE_IMG:
convertView = mInflater.inflate(R.layout.chat_item_her_img_layout,
null);
break;
case MessageBean.MESSAGE_OWNER_HER * 10
+ MessageBean.MESSAGE_TYPE_VOICE:
convertView = mInflater.inflate(
R.layout.chat_item_her_voice_layout, null);
break;
case MessageBean.MESSAGE_OWNER_ME * 10 + MessageBean.MESSAGE_TYPE_TEXT:
convertView = mInflater.inflate(R.layout.chat_item_me_text_layout,
null);
break;
case MessageBean.MESSAGE_OWNER_ME * 10 + MessageBean.MESSAGE_TYPE_IMG:
convertView = mInflater.inflate(R.layout.chat_item_me_img_layout,
null);
break;
case MessageBean.MESSAGE_OWNER_ME * 10 + MessageBean.MESSAGE_TYPE_VOICE:
convertView = mInflater.inflate(R.layout.chat_item_me_voice_layout,
null);
break;
default:
if (getMessageItems().get(position).getOwner() == MessageBean.MESSAGE_OWNER_ME) {
convertView = mInflater.inflate(R.layout.chat_item_me_text_layout,
null);
} else {
convertView = mInflater.inflate(R.layout.chat_item_her_text_layout,
null);
}
break;
}
/*
convertView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int messageSendState = getMessageItems().get(position).getSendState();
switch (messageSendState) {
case MessageBean.MESSAGE_SEND_FAILED:
break;
case MessageBean.MESSAGE_SEND_NONE:
break;
case MessageBean.MESSAGE_SEND_OK:
break;
}
return false;
}
});
*/
return convertView;
}
private ItemViewHolder getHolder(final View view, int position) {
ItemViewHolder holder = (ItemViewHolder) view.getTag();
if (holder == null) {
holder = new ItemViewHolder(view, position);
view.setTag(holder);
}
return holder;
}
public class ItemViewHolder {
private ImageView profileImageView;
private RelativeLayout timeLayout;
private TextView timeTextView;
private RelativeLayout contentLayout;
private ImageView contentImageView;
private TextView contentTextView;
private ImageView voicePlayView;
private TextView voiceInfoTextView;
private MessageBean messageBean;
public MessageBean getMessageBean() {
return messageBean;
}
public ItemViewHolder(View parentView, final int position) {
this.messageBean = getMessageItems().get(position);
switch (messageBean.getType()
+ messageBean.getOwner() * 10) {
case MessageBean.MESSAGE_OWNER_HER * 10
+ MessageBean.MESSAGE_TYPE_TEXT:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_her_text_layout_content);
contentTextView = (TextView) parentView
.findViewById(R.id.chat_item_her_text_text_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_her_text_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
String content = getMessageItems().get(position)
.getContent();
SpanUtil.setHtmlSpanAndImgSpan(contentTextView, content, mContext);
break;
case MessageBean.MESSAGE_OWNER_HER * 10
+ MessageBean.MESSAGE_TYPE_IMG:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_her_img_layout_content);
contentImageView = (ImageView) parentView
.findViewById(R.id.chat_item_her_img_img_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_her_img_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
break;
case MessageBean.MESSAGE_OWNER_HER * 10
+ MessageBean.MESSAGE_TYPE_VOICE:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_her_voice_layout_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_her_voice_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
voicePlayView = (ImageView) parentView.findViewById(R.id.chat_item_her_voice_button_play);
voiceInfoTextView = (TextView) parentView.findViewById(R.id.chat_item_her_voice_text_info);
break;
case MessageBean.MESSAGE_OWNER_ME * 10
+ MessageBean.MESSAGE_TYPE_TEXT:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_me_text_layout_content);
contentTextView = (TextView) parentView
.findViewById(R.id.chat_item_me_text_text_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_me_text_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
String meContent = getMessageItems().get(position)
.getContent();
SpanUtil.setHtmlSpanAndImgSpan(contentTextView, meContent, mContext);
break;
case MessageBean.MESSAGE_OWNER_ME * 10
+ MessageBean.MESSAGE_TYPE_IMG:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_me_img_layout_content);
contentImageView = (ImageView) parentView
.findViewById(R.id.chat_item_me_img_img_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_me_img_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
break;
case MessageBean.MESSAGE_OWNER_ME * 10
+ MessageBean.MESSAGE_TYPE_VOICE:
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_me_voice_layout_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_me_voice_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
voicePlayView = (ImageView) parentView.findViewById(R.id.chat_item_me_voice_button_play);
voiceInfoTextView = (TextView) parentView.findViewById(R.id.chat_item_me_voice_text_info);
break;
default:
if (getMessageItems().get(position).getOwner() == MessageBean.MESSAGE_OWNER_ME) {
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_me_text_layout_content);
contentTextView = (TextView) parentView
.findViewById(R.id.chat_item_me_text_text_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_me_text_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
contentTextView.setText("[目前暂不支持该类型消息]");
} else {
contentLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_her_text_layout_content);
contentTextView = (TextView) parentView
.findViewById(R.id.chat_item_her_text_text_content);
profileImageView = (ImageView) parentView
.findViewById(R.id.chat_item_her_text_img_profile);
timeTextView = (TextView) parentView
.findViewById(R.id.chat_item_text_time);
timeLayout = (RelativeLayout) parentView.findViewById(R.id.chat_item_layout_time);
contentTextView.setText("[目前暂不支持该类型消息]");
}
break;
}
}
}
public void bindView(View view, final int position) {
ItemViewHolder holder = getHolder(view, position);
switch (getMessageItems().get(position).getType()) {
case MessageBean.MESSAGE_TYPE_TEXT:
break;
case MessageBean.MESSAGE_TYPE_IMG:
setImgMessageContent(holder);
break;
case MessageBean.MESSAGE_TYPE_VOICE:
setVoiceMessageContent(holder);
break;
default:
break;
}
if (holder.getMessageBean().getTimeTagShow()) {
long time = Long.parseLong(holder.getMessageBean()
.getDateTime());
Date date = new Date(time * 1000);
SimpleDateFormat format = new SimpleDateFormat("MM.dd HH:mm ");
String timeString = "" + format.format(date);
holder.timeLayout.setVisibility(View.VISIBLE);
holder.timeTextView.setText(timeString);
}else{
holder.timeLayout.setVisibility(View.GONE);
}
if (holder.getMessageBean().getSendState() >= MessageBean.MESSAGE_SEND_PREPARE && holder.getMessageBean().getMessageSendListener() == null) {
switch (holder.getMessageBean().getSendState()) {
case MessageBean.MESSAGE_SEND_ING:
holder.contentLayout.setSelected(true);
break;
case MessageBean.MESSAGE_SEND_OK:
holder.contentLayout.setSelected(false);
break;
default:
holder.contentLayout.setSelected(true);
break;
}
holder.getMessageBean().setMessageSendListener(holder, new MessageBean.MessageSendListener() {
@Override
public void onSendFinish(int state, ItemViewHolder holder) {
switch (state) {
case MessageBean.MESSAGE_SEND_ING:
holder.contentLayout.setSelected(true);
break;
case MessageBean.MESSAGE_SEND_OK:
holder.contentLayout.setSelected(false);
break;
default:
holder.contentLayout.setSelected(true);
break;
}
}
});
}
if (holder.getMessageBean().getSendState() == MessageBean.MESSAGE_SEND_FAILED_FANS_NOT_RECEIVE ||
holder.getMessageBean().getSendState() == MessageBean.MESSAGE_SEND_FAILED_LIMIT_OF_TIME) {
holder.contentLayout.setSelected(true);
}
setHeadImg(holder);
}
private void setVoiceMessageContent(final ItemViewHolder holder) {
boolean voiceLoaded = false;
if (holder.contentLayout.getTag() != null) {
voiceLoaded = true;
}
if (!mBusy || !voiceLoaded) {
if (voiceCache.containsKey(holder.getMessageBean().getId())) {
VoiceHolder voiceHolder = voiceCache.get(holder.getMessageBean().getId());
int playLength = Integer.parseInt(holder.getMessageBean().getPlayLength());
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
holder.voiceInfoTextView.setText(info);
holder.contentLayout.setTag(voiceHolder);
} else {
mDataManager.getWechatManager().getMessageVoice(
mDataManager.getCurrentPosition(),
holder.getMessageBean(),
Integer.parseInt(holder.getMessageBean()
.getLength()), mDataManager.getCurrentUser(),
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
try {
byte[] bytes = (byte[]) object;
VoiceHolder voiceHolder = new VoiceHolder(
bytes, holder.getMessageBean()
.getPlayLength(),
holder.getMessageBean()
.getLength());
int playLength = Integer.parseInt(holder.getMessageBean().getPlayLength());
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
holder.voiceInfoTextView.setText(info);
holder.contentLayout.setTag(voiceHolder);
voiceCache.put(holder.getMessageBean().getId(), voiceHolder);
} catch (Exception exception) {
}
}
});
}
}
holder.contentLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.contentLayout.getTag() != null) {
final VoiceHolder voiceHolder = (VoiceHolder) holder.contentLayout
.getTag();
if (voiceHolder.getPlaying()) {
mDataManager.getVoiceManager().stopMusic();
} else {
mDataManager.getVoiceManager().playVoice(
voiceHolder.getBytes(),
voiceHolder.getPlayLength(),
voiceHolder.getLength(),
new AudioPlayListener() {
@Override
public void onAudioStop() {
// TODO Auto-generated method stub
voiceHolder.setPlaying(false);
holder.voicePlayView.setSelected(false);
}
@Override
public void onAudioStart() {
// TODO Auto-generated method stub
voiceHolder.setPlaying(true);
holder.voicePlayView.setSelected(true);
}
@Override
public void onAudioError() {
// TODO Auto-generated method stub
}
});
}
} else {
}
}
});
}
private void setImgMessageContent(final ItemViewHolder holder) {
holder.contentImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mDataManager.createImgHolder(holder.getMessageBean(), mDataManager.getCurrentUser());
Intent jumbIntent = new Intent();
jumbIntent.setClass(mContext, ShowImgActivity.class);
mContext.startActivity(jumbIntent);
}
});
boolean imgLoaded = false;
if (holder.contentImageView.getTag() != null) {
imgLoaded = (Boolean) holder.contentImageView.getTag();
}
if (!mBusy || !imgLoaded) {
Bitmap contentBitmap = mDataManager.getCacheManager().getBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMessageBean().getId());
if (contentBitmap == null) {
mDataManager.getWechatManager().getMessageImg(
mDataManager.getCurrentPosition(),
holder.getMessageBean(),
holder.contentImageView,
WeChatLoader.WECHAT_URL_MESSAGE_IMG_SMALL,
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
if (code == WechatManager.ACTION_SUCCESS) {
holder.contentImageView.setTag(true);
Bitmap bitmap = (Bitmap) object;
mDataManager.getCacheManager().putBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMessageBean().getId(),
bitmap, true);
}
}
});
} else {
holder.contentImageView.setImageBitmap(contentBitmap);
}
}
}
private void setHeadImg(final ItemViewHolder holder) {
boolean imgLoaded = false;
if (holder.profileImageView.getTag() != null) {
imgLoaded = (Boolean) holder.profileImageView.getTag();
}
if (!mBusy || !imgLoaded) {
Bitmap headBitmap = mDataManager.getCacheManager().getBitmap(
ImageCacheManager.CACHE_CHAT_LIST_PROFILE
+ holder.getMessageBean().getFakeId());
if (headBitmap != null) {
if (holder.getMessageBean().getOwner() == MessageBean.MESSAGE_OWNER_ME) {
Bitmap bitmap = Util.roundCornerWithBorder(headBitmap,
(int) Util.dipToPx(40, mContext.getResources()), 15,
Color.parseColor("#ffffff"));
holder.profileImageView.setImageBitmap(bitmap);
} else {
holder.profileImageView.setImageBitmap(headBitmap);
}
} else {
mDataManager.getWechatManager().getMessageHeadImg(
mDataManager.getCurrentPosition(),
holder.getMessageBean().getFakeId(),
holder.getMessageBean().getReferer(),
holder.profileImageView, new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
if (code == WechatManager.ACTION_SUCCESS) {
holder.profileImageView.setTag(true);
Bitmap roundBitmap = Util.roundCornerWithBorder((Bitmap) object,
(int) Util.dipToPx(40, mContext.getResources()), 15, Color.parseColor("#ffffff"));
holder.profileImageView.setImageBitmap(roundBitmap);
mDataManager.getCacheManager().putBitmap(
ImageCacheManager.CACHE_CHAT_LIST_PROFILE
+ holder.getMessageBean().getFakeId(),
roundBitmap, true);
}
}
});
}
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v;
v = newView(position);
bindView(v, position);
return v;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { // 滑动停止
mBusy = false;
} else if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {// 滑动手未松开
mBusy = true;
} else if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {// 滑动中手已松开
mBusy = true;
}
}
}