package com.fanxin.easeui.adapter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.content.Context;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.TextView.BufferType;
import com.fanxin.easeui.model.EaseAtMessageHelper;
import com.fanxin.easeui.utils.EaseCommonUtils;
import com.fanxin.easeui.utils.EaseSmileUtils;
import com.fanxin.easeui.widget.EaseConversationList;
import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMConversation.EMConversationType;
import com.hyphenate.chat.EMGroup;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.easeui.R;
import com.fanxin.easeui.domain.EaseUser;
import com.fanxin.easeui.utils.EaseUserUtils;
import com.hyphenate.util.DateUtils;
/**
* conversation list adapter
*
*/
public class EaseConversationAdapater extends ArrayAdapter<EMConversation> {
private static final String TAG = "ChatAllHistoryAdapter";
private List<EMConversation> conversationList;
private List<EMConversation> copyConversationList;
private ConversationFilter conversationFilter;
private boolean notiyfyByFilter;
protected int primaryColor;
protected int secondaryColor;
protected int timeColor;
protected int primarySize;
protected int secondarySize;
protected float timeSize;
public EaseConversationAdapater(Context context, int resource,
List<EMConversation> objects) {
super(context, resource, objects);
conversationList = objects;
copyConversationList = new ArrayList<EMConversation>();
copyConversationList.addAll(objects);
}
@Override
public int getCount() {
return conversationList.size();
}
@Override
public EMConversation getItem(int arg0) {
if (arg0 < conversationList.size()) {
return conversationList.get(arg0);
}
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.ease_row_chat_history, parent, false);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
if (holder == null) {
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.unreadLabel = (TextView) convertView.findViewById(R.id.unread_msg_number);
holder.message = (TextView) convertView.findViewById(R.id.message);
holder.time = (TextView) convertView.findViewById(R.id.time);
holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
holder.msgState = convertView.findViewById(R.id.msg_state);
holder.list_itease_layout = (RelativeLayout) convertView.findViewById(R.id.list_itease_layout);
holder.motioned = (TextView) convertView.findViewById(R.id.mentioned);
convertView.setTag(holder);
}
holder.list_itease_layout.setBackgroundResource(R.drawable.ease_mm_listitem);
// get conversation
EMConversation conversation = getItem(position);
// get username or group id
String username = conversation.getUserName();
if (conversation.getType() == EMConversationType.GroupChat) {
String groupId = conversation.getUserName();
if(EaseAtMessageHelper.get().hasAtMeMsg(groupId)){
holder.motioned.setVisibility(View.VISIBLE);
}else{
holder.motioned.setVisibility(View.GONE);
}
// group message, show group avatar
holder.avatar.setImageResource(R.drawable.ease_group_icon);
EMGroup group = EMClient.getInstance().groupManager().getGroup(username);
holder.name.setText(group != null ? group.getGroupName() : username);
} else if(conversation.getType() == EMConversationType.ChatRoom){
holder.avatar.setImageResource(R.drawable.ease_group_icon);
EMChatRoom room = EMClient.getInstance().chatroomManager().getChatRoom(username);
holder.name.setText(room != null && !TextUtils.isEmpty(room.getName()) ? room.getName() : username);
}else {
EaseUserUtils.setUserAvatar(getContext(), username, holder.avatar);
EaseUserUtils.setUserNick(username, holder.name);
}
if (conversation.getUnreadMsgCount() > 0) {
// show unread message count
holder.unreadLabel.setText(String.valueOf(conversation.getUnreadMsgCount()));
holder.unreadLabel.setVisibility(View.VISIBLE);
} else {
holder.unreadLabel.setVisibility(View.INVISIBLE);
}
if (conversation.getAllMsgCount() != 0) {
// show the content of latest message
EMMessage lastMessage = conversation.getLastMessage();
String content = null;
if(cvsListHelper != null){
content = cvsListHelper.onSetItemSecondaryText(lastMessage);
}
holder.message.setText(EaseSmileUtils.getSmiledText(getContext(), EaseCommonUtils.getMessageDigest(lastMessage, (this.getContext()))),
BufferType.SPANNABLE);
if(content != null){
holder.message.setText(content);
}
holder.time.setText(DateUtils.getTimestampString(new Date(lastMessage.getMsgTime())));
if (lastMessage.direct() == EMMessage.Direct.SEND && lastMessage.status() == EMMessage.Status.FAIL) {
holder.msgState.setVisibility(View.VISIBLE);
} else {
holder.msgState.setVisibility(View.GONE);
}
}
//set property
holder.name.setTextColor(primaryColor);
holder.message.setTextColor(secondaryColor);
holder.time.setTextColor(timeColor);
if(primarySize != 0)
holder.name.setTextSize(TypedValue.COMPLEX_UNIT_PX, primarySize);
if(secondarySize != 0)
holder.message.setTextSize(TypedValue.COMPLEX_UNIT_PX, secondarySize);
if(timeSize != 0)
holder.time.setTextSize(TypedValue.COMPLEX_UNIT_PX, timeSize);
return convertView;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
if(!notiyfyByFilter){
copyConversationList.clear();
copyConversationList.addAll(conversationList);
notiyfyByFilter = false;
}
}
@Override
public Filter getFilter() {
if (conversationFilter == null) {
conversationFilter = new ConversationFilter(conversationList);
}
return conversationFilter;
}
public void setPrimaryColor(int primaryColor) {
this.primaryColor = primaryColor;
}
public void setSecondaryColor(int secondaryColor) {
this.secondaryColor = secondaryColor;
}
public void setTimeColor(int timeColor) {
this.timeColor = timeColor;
}
public void setPrimarySize(int primarySize) {
this.primarySize = primarySize;
}
public void setSecondarySize(int secondarySize) {
this.secondarySize = secondarySize;
}
public void setTimeSize(float timeSize) {
this.timeSize = timeSize;
}
private class ConversationFilter extends Filter {
List<EMConversation> mOriginalValues = null;
public ConversationFilter(List<EMConversation> mList) {
mOriginalValues = mList;
}
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<EMConversation>();
}
if (prefix == null || prefix.length() == 0) {
results.values = copyConversationList;
results.count = copyConversationList.size();
} else {
String prefixString = prefix.toString();
final int count = mOriginalValues.size();
final ArrayList<EMConversation> newValues = new ArrayList<EMConversation>();
for (int i = 0; i < count; i++) {
final EMConversation value = mOriginalValues.get(i);
String username = value.getUserName();
EMGroup group = EMClient.getInstance().groupManager().getGroup(username);
if(group != null){
username = group.getGroupName();
}else{
EaseUser user = EaseUserUtils.getUserInfo(username);
// TODO: not support Nick anymore
// if(user != null && user.getNick() != null)
// username = user.getNick();
}
// First match against the whole ,non-splitted value
if (username.startsWith(prefixString)) {
newValues.add(value);
} else{
final String[] words = username.split(" ");
final int wordCount = words.length;
// Start at index 0, in case valueText starts with space(s)
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
conversationList.clear();
if (results.values != null) {
conversationList.addAll((List<EMConversation>) results.values);
}
if (results.count > 0) {
notiyfyByFilter = true;
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
private EaseConversationList.EaseConversationListHelper cvsListHelper;
public void setCvsListHelper(EaseConversationList.EaseConversationListHelper cvsListHelper){
this.cvsListHelper = cvsListHelper;
}
private static class ViewHolder {
/** who you chat with */
TextView name;
/** unread message count */
TextView unreadLabel;
/** content of last message */
TextView message;
/** time of last message */
TextView time;
/** avatar */
ImageView avatar;
/** status of last message */
View msgState;
/** layout */
RelativeLayout list_itease_layout;
TextView motioned;
}
}