/**
* @author UFreedom
* @since 2014 2014-10-3 上午10:57:13
* @see www.52yummy.com
* <br>
* sunfreedom@sina.cn
* <br>
* Copyright (C) 2014 UFreedom. All Rights Reserved.
*/
package com.codecomb.views.adapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.codecomb.infrastructure.cache.BitmapCacheManage;
import com.codecomb.module.base.Base;
import com.codecomb.module.contacts.Contact;
import com.codecomb.module.im.Message;
import com.codecomb.module.im.MessageManager;
import com.codecomb.module.profile.Profile;
import com.codecomb.ufreedom.R;
import com.codecomb.utils.DateUtils;
import com.codecomb.view.widgets.CircularImageView;
public class ChatAdapter extends BaseAdapter {
private static final String TAG = ChatAdapter.class.getSimpleName();
private static final int TIMELINE_INTERVAL = 300000;
private static final int TYPE_COUNT = 3;
private static final int TYPE_TIMELINE = 0;
private static final int TYPE_SEND_TEXT = 1;
private static final int TYPE_RECV_TEXT = 2;
private Context context;
private LayoutInflater layoutInflater;
private List<Object> chatDate;
private ListView listview;
private Contact contact;
private Profile profile;
private Date lastDateTime;
private Handler hander;
private ExecutorService sendMessageExecutorService;
// private CopyOnWriteArrayList<Object> chatData;
public ChatAdapter(Context context, ListView lv, Profile profile,
Contact contact) {
this.context = context;
listview = lv;
this.profile = profile;
this.contact = contact;
this.chatDate = new ArrayList<Object>();
layoutInflater = LayoutInflater.from(context);
// chatData = new CopyOnWriteArrayList<Object>();
hander = new Handler();
sendMessageExecutorService = Executors
.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("message send");
thread.setDaemon(true);
return thread;
}
});
}
@Override
public int getCount() {
return chatDate.size();
}
@Override
public Object getItem(int position) {
return chatDate.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
Object data = getItem(position);
if (Message.class.isInstance(data)) {
Message message = (Message) data;
return message.getSenderID() == profile.getUserId()
? TYPE_SEND_TEXT
: TYPE_RECV_TEXT;
} else {
return TYPE_TIMELINE;
}
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object data = getItem(position);
if (data != null) {
int type = getItemViewType(position);
switch (type) {
case TYPE_SEND_TEXT :
convertView = getSendTextView(convertView, (Message) data);
break;
case TYPE_RECV_TEXT :
convertView = getRecvTextView(convertView, (Message) data);
break;
case TYPE_TIMELINE :
convertView = getTimeLineView(convertView, (TimeLine) data);
break;
default :
break;
}
}
return convertView;
}
private View getRecvTextView(View convertView, Message message) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(
R.layout.lv_item_chatting_msg_text_recv, null);
holder.vContent = (TextView) convertView
.findViewById(R.id.vMessageContent);
holder.vAvatar = (CircularImageView) convertView.findViewById(R.id.vAvatar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Bitmap avatar = BitmapCacheManage.getInstance().getBitmapFromCache(Integer.toString(message.getSenderID()));
if (avatar != null) {
holder.vAvatar.setImageBitmap(avatar);
}else{
holder.vAvatar.setImageResource(R.drawable.ic_avatar_default);
}
holder.vContent.setText(message.getContent());
return convertView;
}
private View getSendTextView(View convertView, Message message) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(
R.layout.lv_item_chatting_msg_text_sender, null);
holder.vContent = (TextView) convertView
.findViewById(R.id.vMessageContent);
holder.vAvatar = (CircularImageView) convertView.findViewById(R.id.vAvatar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.vContent.setText(message.getContent());
Bitmap avatar = BitmapCacheManage.getInstance().getBitmapFromCache(Integer.toString(message.getSenderID()));
if (avatar != null) {
holder.vAvatar.setImageBitmap(avatar);
}else{
holder.vAvatar.setImageResource(R.drawable.ic_avatar_default);
}
return convertView;
}
private View getTimeLineView(View converView, TimeLine timeLine) {
TimeLineHolder holder = null;
if (converView == null) {
holder = new TimeLineHolder();
converView = layoutInflater.inflate(
R.layout.lv_item_chatting_msg_time_line, null);
holder.vDateTime = (TextView) converView
.findViewById(R.id.vDatetime);
converView.setTag(holder);
} else {
holder = (TimeLineHolder) converView.getTag();
}
holder.vDateTime.setText(timeLine.getDateTime());
return converView;
}
public void sendMessage(final String content) {
sendMessageExecutorService.execute(new Runnable() {
@Override
public void run() {
MessageManager.getInstance().sendMessage(contact.getUserID(),
content);
}
});
}
public void add(Message message) {
Date nextDate = message.getTime();
if (lastDateTime == null
|| nextDate.getTime() - lastDateTime.getTime() > TIMELINE_INTERVAL) {
chatDate.add(new TimeLine(DateUtils.format(message.getTime(),
"yyyy-MM-dd HH:mm")));
lastDateTime = nextDate;
}
chatDate.add(message);
}
public void addAll(Collection<? extends Message> data) {
for (Object ob : data) {
add((Message) ob);
}
}
public void refresh() {
hander.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public void refreshAndSetListViewTobottom() {
hander.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
listview.setSelection(getCount() - 1);
}
});
}
class ViewHolder {
private TextView vContent;
private CircularImageView vAvatar;
}
class TimeLineHolder {
TextView vDateTime;
}
class TimeLine {
public TimeLine(String dateTime) {
this.dateTime = dateTime;
}
private String dateTime;
public String getDateTime() {
return dateTime;
}
public void setDateTime(String dateTime) {
this.dateTime = dateTime;
}
}
}