package hillfly.wifichat.adapter;
import hillfly.wifichat.R;
import hillfly.wifichat.common.BaseApplication;
import hillfly.wifichat.common.BaseObjectListAdapter;
import hillfly.wifichat.common.socket.tcp.TcpClient;
import hillfly.wifichat.common.socket.tcp.TcpService;
import hillfly.wifichat.common.view.EmoticonsTextView;
import hillfly.wifichat.model.Entity;
import hillfly.wifichat.model.FileState;
import hillfly.wifichat.model.Message;
import hillfly.wifichat.model.Users;
import hillfly.wifichat.util.FileUtils;
import hillfly.wifichat.util.ImageUtils;
import hillfly.wifichat.util.SessionUtils;
import java.io.File;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
public class ChatAdapter extends BaseObjectListAdapter {
private static final int TYPE_LEFT_TEXT = 0;
private static final int TYPE_LEFT_IMAGE = 1;
private static final int TYPE_LEFT_VOICE = 2;
private static final int TYPE_LEFT_FILE = 3;
private static final int TYPE_RIGHT_TEXT = 4;
private static final int TYPE_RIGHT_IMAGE = 5;
private static final int TYPE_RIGHT_VOICE = 6;
private static final int TYPE_RIGHT_FILE = 7;
private static final int ITEM_POSITION = -1;
private ListView mListView;
private int mAvatarId;
private Users mChatUser;
public ChatAdapter(Context context, List<? extends Entity> datas) {
super(context, datas);
TcpClient.setHandler(mHandler); // 绑定handler
TcpService.setHandler(mHandler);
}
public void setData(List<? extends Entity> datas) {
super.setData(datas);
}
public void setListView(ListView view) {
this.mListView = view;
}
public void setChatUser(Users user) {
this.mChatUser = user;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Message msg = (Message) getItem(position);
if (SessionUtils.isLocalUser(msg.getSenderIMEI())) {
String avatarFileName = Users.AVATAR + SessionUtils.getAvatar();
mAvatarId = ImageUtils.getImageID(avatarFileName);
}
else {
Users users = mUDPListener.getOnlineUser(msg.getSenderIMEI());
String avatarFileName = Users.AVATAR + users.getAvatar();
mAvatarId = ImageUtils.getImageID(avatarFileName);
}
int messageType = getItemViewType(position);
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
switch (messageType) {
case TYPE_LEFT_TEXT:
convertView = mInflater.inflate(R.layout.message_group_receive_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.left_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_text, null);
holder.mIvLeftAvatar = (ImageView) convertView
.findViewById(R.id.left_message_iv_userphoto);
holder.mEtvTextContent = (EmoticonsTextView) holder.mView
.findViewById(R.id.message_etv_msgtext);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_LEFT_IMAGE:
convertView = mInflater.inflate(R.layout.message_group_receive_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.left_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_image, null);
holder.mIvLeftAvatar = (ImageView) convertView
.findViewById(R.id.left_message_iv_userphoto);
holder.mIvImageContent = (ImageView) holder.mView
.findViewById(R.id.message_iv_msgimage);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_LEFT_VOICE:
convertView = mInflater.inflate(R.layout.message_group_receive_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.left_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_voice, null);
holder.mIvLeftAvatar = (ImageView) convertView
.findViewById(R.id.left_message_iv_userphoto);
holder.mIvVoiceImage = (ImageView) holder.mView
.findViewById(R.id.voice_message_iv_msgimage);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_LEFT_FILE:
convertView = mInflater.inflate(R.layout.message_group_receive_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.left_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_file, null);
holder.mHtvLoadingProcess = (TextView) holder.mView
.findViewById(R.id.message_file_htv_loading_text);
holder.mIvLeftAvatar = (ImageView) convertView
.findViewById(R.id.left_message_iv_userphoto);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_RIGHT_TEXT:
convertView = mInflater.inflate(R.layout.message_group_send_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.right_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_text, null);
holder.mIvRightAvatar = (ImageView) convertView
.findViewById(R.id.right_message_iv_userphoto);
holder.mEtvTextContent = (EmoticonsTextView) holder.mView
.findViewById(R.id.message_etv_msgtext);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_RIGHT_IMAGE:
convertView = mInflater.inflate(R.layout.message_group_send_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.right_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_image, null);
holder.mIvRightAvatar = (ImageView) convertView
.findViewById(R.id.right_message_iv_userphoto);
holder.mIvImageContent = (ImageView) holder.mView
.findViewById(R.id.message_iv_msgimage);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_RIGHT_VOICE:
convertView = mInflater.inflate(R.layout.message_group_send_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.right_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_voice, null);
holder.mIvRightAvatar = (ImageView) convertView
.findViewById(R.id.right_message_iv_userphoto);
holder.mIvVoiceImage = (ImageView) holder.mView
.findViewById(R.id.voice_message_iv_msgimage);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
case TYPE_RIGHT_FILE:
convertView = mInflater.inflate(R.layout.message_group_send_template, null);
holder.mHtvTimeStampTime = (TextView) convertView
.findViewById(R.id.message_timestamp_htv_time);
holder.mLayoutMessageContainer = (LinearLayout) convertView
.findViewById(R.id.right_message_layout_messagecontainer);
holder.mView = mInflater.inflate(R.layout.message_file, null);
holder.mHtvLoadingProcess = (TextView) holder.mView
.findViewById(R.id.message_file_htv_loading_text);
holder.mIvRightAvatar = (ImageView) convertView
.findViewById(R.id.right_message_iv_userphoto);
holder.mLayoutMessageContainer.addView(holder.mView);
break;
}
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
switch (messageType) {
case TYPE_LEFT_TEXT:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
holder.mEtvTextContent.setText(msg.getMsgContent());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvLeftAvatar);
break;
case TYPE_LEFT_IMAGE:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvLeftAvatar);
Picasso.with(mContext).load(getThumbnailPath(msg)).into(holder.mIvImageContent);
break;
case TYPE_LEFT_VOICE:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
holder.mIvVoiceImage.setImageResource(R.drawable.voicerecord_left);
Picasso.with(mContext).load(mAvatarId).into(holder.mIvLeftAvatar);
break;
case TYPE_LEFT_FILE:
holder.mHtvLoadingProcess.setTag(FileUtils.getNameByPath(msg.getMsgContent()));
holder.mHtvLoadingProcess.setTag(ITEM_POSITION, position);
holder.mHtvTimeStampTime.setText(msg.getSendTime());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvLeftAvatar);
if (FileUtils.isFileExists(msg.getMsgContent())) {
holder.mHtvLoadingProcess.setVisibility(View.GONE);
}
else {
holder.mHtvLoadingProcess.setVisibility(View.VISIBLE);
holder.mHtvLoadingProcess.setText(msg.getPercent() + "");
}
break;
case TYPE_RIGHT_TEXT:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
holder.mEtvTextContent.setText(msg.getMsgContent());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvRightAvatar);
break;
case TYPE_RIGHT_IMAGE:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvRightAvatar);
Picasso.with(mContext).load(getThumbnailPath(msg)).into(holder.mIvImageContent);
break;
case TYPE_RIGHT_VOICE:
holder.mHtvTimeStampTime.setText(msg.getSendTime());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvRightAvatar);
Picasso.with(mContext).load(R.drawable.voicerecord_right)
.into(holder.mIvVoiceImage);
break;
case TYPE_RIGHT_FILE:
holder.mHtvLoadingProcess.setTag(FileUtils.getNameByPath(msg.getMsgContent()));
holder.mHtvLoadingProcess.setTag(ITEM_POSITION, position);
holder.mHtvTimeStampTime.setText(msg.getSendTime());
Picasso.with(mContext).load(mAvatarId).into(holder.mIvRightAvatar);
if (FileUtils.isFileExists(msg.getMsgContent())) {
holder.mHtvLoadingProcess.setVisibility(View.GONE);
}
else {
holder.mHtvLoadingProcess.setVisibility(View.VISIBLE);
holder.mHtvLoadingProcess.setText(msg.getPercent() + "");
}
break;
}
return convertView;
}
/**
* 根据数据源的position返回需要显示的的layout的type
*
* */
@Override
public int getItemViewType(int position) {
Message msg = (Message) getItem(position);
int type = -1;
if (SessionUtils.isLocalUser(msg.getSenderIMEI())) {
switch (msg.getContentType()) {
case TEXT:
type = 4;
break;
case IMAGE:
type = 5;
break;
case VOICE:
type = 6;
break;
case FILE:
type = 7;
break;
}
}
else {
switch (msg.getContentType()) {
case TEXT:
type = 0;
break;
case IMAGE:
type = 1;
break;
case VOICE:
type = 2;
break;
case FILE:
type = 3;
break;
}
}
return type;
}
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message paramMsg) {
updateView(paramMsg);
}
};
private void updateView(android.os.Message paramMsg) {
FileState file = (FileState) paramMsg.obj;
if (mListView != null) {
TextView htvView = (TextView) mListView.findViewWithTag(FileUtils
.getNameByPath(file.fileName));
if (htvView != null) {
int itemPosition = (Integer) htvView.getTag(ITEM_POSITION);
int visiblePos = mListView.getFirstVisiblePosition();
int offset = itemPosition - visiblePos;
Message itemMessage = (Message) getItem(itemPosition);
itemMessage.setPercent(file.percent);
// 只有在可见区域才更新
if (offset < 0)
return;
else {
if (file.percent != 100) {
htvView.setText(file.percent + "");
}
else {
htvView.setVisibility(View.GONE);
}
}
}
}
}
@SuppressWarnings("unused")
private Bitmap getThumbnailBitmap(Message msg) {
String imagePath = BaseApplication.THUMBNAIL_PATH + File.separator;
if (SessionUtils.isLocalUser(msg.getSenderIMEI())) {
imagePath = imagePath + mChatUser.getIMEI() + File.separator
+ FileUtils.getNameByPath(msg.getMsgContent());
}
else {
imagePath = imagePath + msg.getSenderIMEI() + File.separator
+ FileUtils.getNameByPath(msg.getMsgContent());
}
Bitmap bitmap = ImageUtils.getBitmapFromPath(imagePath);
return bitmap;
}
private String getThumbnailPath(Message msg) {
StringBuffer imagePath = new StringBuffer();
imagePath.append("file://").append(BaseApplication.THUMBNAIL_PATH).append(File.separator);
if (SessionUtils.isLocalUser(msg.getSenderIMEI())) {
imagePath.append(mChatUser.getIMEI()).append(File.separator)
.append(FileUtils.getNameByPath(msg.getMsgContent()));
}
else {
imagePath.append(msg.getSenderIMEI()).append(File.separator)
.append(FileUtils.getNameByPath(msg.getMsgContent()));
}
return imagePath.toString();
}
/**
* 返回所有的layout的数量
*
* */
@Override
public int getViewTypeCount() {
return 8;
}
static class ViewHolder {
private TextView mHtvTimeStampTime; // 时间
private LinearLayout mLayoutMessageContainer; // 消息容器
private View mView;
private EmoticonsTextView mEtvTextContent; // 文本内容
private ImageView mIvImageContent; // 图像内容
private ImageView mIvVoiceImage; // 声音图像
private TextView mHtvLoadingProcess; // 下载进度条
private ImageView mIvLeftAvatar; // 左边的头像
private ImageView mIvRightAvatar; // 右边的头像
}
}