package com.fanxin.app.fx.others;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMConversation;
import com.easemob.chat.EMGroup;
import com.easemob.chat.EMGroupManager;
import com.easemob.chat.EMMessage;
import com.easemob.chat.TextMessageBody;
import com.easemob.exceptions.EaseMobException;
import com.fanxin.app.Constant;
import com.fanxin.app.MYApplication;
import com.fanxin.app.R;
import com.fanxin.app.db.InviteMessgeDao;
import com.fanxin.app.domain.User;
import com.fanxin.app.fx.ChatActivity;
import com.fanxin.app.fx.MainActivity;
import com.fanxin.app.fx.others.LoadUserAvatar.ImageDownloadedCallBack;
import com.fanxin.app.utils.SmileUtils;
import com.easemob.util.DateUtils;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.TextView.BufferType;
@SuppressLint("InflateParams")
public class ConversationAdapter extends BaseAdapter {
private List<EMConversation> normal_list;
private List<EMConversation> top_list;
private LayoutInflater inflater;
private LoadUserAvatar avatarLoader;
private Context context;
Map<String, TopUser> topMap;
@SuppressLint("SdCardPath")
public ConversationAdapter(Context context,
List<EMConversation> normal_list, List<EMConversation> top_list,
Map<String, TopUser> topMap) {
this.context = context;
this.topMap = topMap;
this.normal_list = normal_list;
this.top_list = top_list;
inflater = LayoutInflater.from(context);
avatarLoader = new LoadUserAvatar(context, "/sdcard/fanxin/");
}
@Override
public int getCount() {
return normal_list.size() + top_list.size();
}
@Override
public EMConversation getItem(int position) {
if (position < top_list.size()) {
return top_list.get(position);
} else {
return normal_list.get(position - top_list.size());
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
// 获取与此用户/群组的会话
final EMConversation conversation = getItem(position);
// 获取用户username或者群组groupid
final String username = conversation.getUserName();
List<EMGroup> groups = EMGroupManager.getInstance().getAllGroups();
boolean isGroup = false;
String nick = "";
String groupName = "";
String[] avatars = new String[5];
int membersNum = 0;
for (EMGroup group : groups) {
if (group.getGroupId().equals(username)) {
isGroup = true;
String groupName_temp = group.getGroupName();
JSONObject jsonObject = JSONObject.parseObject(groupName_temp);
JSONArray jsonarray = jsonObject.getJSONArray("jsonArray");
groupName = jsonObject.getString("groupname");
String groupName_temp2 = "";
membersNum = jsonarray.size();
for (int i = 0; i < membersNum; i++) {
JSONObject json = (JSONObject) jsonarray.get(i);
if (i < 5) {
avatars[i] = json.getString("avatar");
Log.e("avatars[i]----->>>", avatars[i]);
}
if (i == 0) {
groupName_temp2 = json.getString("nick");
} else if (i < 4) {
groupName_temp2 += "、" + json.getString("nick");
} else if (i == 4) {
groupName_temp2 += "。。。";
}
}
if (groupName.equals("未命名")) {
groupName = groupName_temp2;
}
break;
}
}
//
// convertView= inflater.inflate(R.layout.item_conversation_single,
// parent, false);
convertView = creatConvertView(membersNum);
// // 单聊对话membersNum
// creatConvertView(convertView, parent, membersNum);
// Log.e("membersNum",String.valueOf(membersNum));
// 初始化控件
// 昵称
holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
// 未读消息
holder.tv_unread = (TextView) convertView.findViewById(R.id.tv_unread);
// 最近一条消息
holder.tv_content = (TextView) convertView
.findViewById(R.id.tv_content);
// 时间
holder.tv_time = (TextView) convertView.findViewById(R.id.tv_time);
// 发送状态
holder.msgState = (ImageView) convertView.findViewById(R.id.msg_state);
// 单聊数据加载
if (!isGroup) {
holder.iv_avatar = (ImageView) convertView
.findViewById(R.id.iv_avatar);
// 从好友列表中加载该用户的资料
User user = MYApplication.getInstance().getContactList()
.get(username);
if (user != null) {
nick = user.getNick();
String avatar = user.getAvatar();
// 显示昵称
holder.tv_name.setText(nick);
// 显示头像
showUserAvatar(holder.iv_avatar, avatar);
}else{
EMMessage message=conversation.getLastMessage();
if(message.direct==EMMessage.Direct.RECEIVE){
try {
nick=message.getStringAttribute("myUserNick");
String avatar=message.getStringAttribute("myUserAvatar");
// 显示昵称
holder.tv_name.setText(nick);
// 显示头像
showUserAvatar(holder.iv_avatar, avatar);
} catch (EaseMobException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
nick=message.getStringAttribute("toUserNick");
String avatar=message.getStringAttribute("toUserAvatar");
// 显示昵称
holder.tv_name.setText(nick);
// 显示头像
showUserAvatar(holder.iv_avatar, avatar);
} catch (EaseMobException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 群聊对话
else {
holder.tv_name.setText(groupName);
if (membersNum == 1) {
holder.iv_avatar1 = (ImageView) convertView
.findViewById(R.id.iv_avatar1);
showUserAvatar(holder.iv_avatar1, avatars[0]);
} else if (membersNum == 2) {
holder.iv_avatar1 = (ImageView) convertView
.findViewById(R.id.iv_avatar1);
holder.iv_avatar2 = (ImageView) convertView
.findViewById(R.id.iv_avatar2);
showUserAvatar(holder.iv_avatar1, avatars[0]);
showUserAvatar(holder.iv_avatar2, avatars[1]);
} else if (membersNum == 3) {
holder.iv_avatar1 = (ImageView) convertView
.findViewById(R.id.iv_avatar1);
holder.iv_avatar2 = (ImageView) convertView
.findViewById(R.id.iv_avatar2);
holder.iv_avatar3 = (ImageView) convertView
.findViewById(R.id.iv_avatar3);
showUserAvatar(holder.iv_avatar1, avatars[0]);
showUserAvatar(holder.iv_avatar2, avatars[1]);
showUserAvatar(holder.iv_avatar3, avatars[2]);
} else if (membersNum == 4) {
holder.iv_avatar1 = (ImageView) convertView
.findViewById(R.id.iv_avatar1);
holder.iv_avatar2 = (ImageView) convertView
.findViewById(R.id.iv_avatar2);
holder.iv_avatar3 = (ImageView) convertView
.findViewById(R.id.iv_avatar3);
holder.iv_avatar4 = (ImageView) convertView
.findViewById(R.id.iv_avatar4);
showUserAvatar(holder.iv_avatar1, avatars[0]);
showUserAvatar(holder.iv_avatar2, avatars[1]);
showUserAvatar(holder.iv_avatar3, avatars[2]);
showUserAvatar(holder.iv_avatar4, avatars[3]);
} else if (membersNum > 4) {
holder.iv_avatar1 = (ImageView) convertView
.findViewById(R.id.iv_avatar1);
holder.iv_avatar2 = (ImageView) convertView
.findViewById(R.id.iv_avatar2);
holder.iv_avatar3 = (ImageView) convertView
.findViewById(R.id.iv_avatar3);
holder.iv_avatar4 = (ImageView) convertView
.findViewById(R.id.iv_avatar4);
holder.iv_avatar5 = (ImageView) convertView
.findViewById(R.id.iv_avatar5);
showUserAvatar(holder.iv_avatar1, avatars[0]);
showUserAvatar(holder.iv_avatar2, avatars[1]);
showUserAvatar(holder.iv_avatar3, avatars[2]);
showUserAvatar(holder.iv_avatar4, avatars[3]);
showUserAvatar(holder.iv_avatar5, avatars[4]);
}
}
if (conversation.getUnreadMsgCount() > 0) {
// 显示与此用户的消息未读数
holder.tv_unread.setText(String.valueOf(conversation
.getUnreadMsgCount()));
holder.tv_unread.setVisibility(View.VISIBLE);
} else {
holder.tv_unread.setVisibility(View.INVISIBLE);
}
if (conversation.getMsgCount() != 0) {
// 把最后一条消息的内容作为item的message内容
EMMessage lastMessage = conversation.getLastMessage();
holder.tv_content.setText(
SmileUtils.getSmiledText(context,
getMessageDigest(lastMessage, context)),
BufferType.SPANNABLE);
holder.tv_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);
}
}
final String groupName_temp = groupName;
final boolean isGroup_temp = isGroup;
final String nick_temp = nick;
RelativeLayout re_parent = (RelativeLayout) convertView
.findViewById(R.id.re_parent);
re_parent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (username
.equals(MYApplication.getInstance().getUserName()))
Toast.makeText(context, "不能和自己聊天...", Toast.LENGTH_SHORT)
.show();
else {
// 进入聊天页面
Intent intent = new Intent(context, ChatActivity.class);
if (isGroup_temp) {
// it is group chat
intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP);
intent.putExtra("groupId", username);
intent.putExtra("groupName", groupName_temp);
} else {
// it is single chat
intent.putExtra("userId", username);
intent.putExtra("userNick", nick_temp);
}
context.startActivity(intent);
}
}
});
re_parent.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
String title = "";
if (isGroup_temp) {
title = groupName_temp;
} else {
title = nick_temp;
}
showMyDialog(title, conversation);
return false;
}
});
if (position < top_list.size()) {
// 加入删除后
re_parent.setBackgroundColor(0xFFF5FFF1);
}
return convertView;
}
private View creatConvertView(int size) {
View convertView;
if (size == 0) {
convertView = inflater.inflate(R.layout.item_conversation_single,
null, false);
} else if (size == 1) {
convertView = inflater.inflate(R.layout.item_conversation_group1,
null, false);
} else if (size == 2) {
convertView = inflater.inflate(R.layout.item_conversation_group2,
null, false);
} else if (size == 3) {
convertView = inflater.inflate(R.layout.item_conversation_group3,
null, false);
} else if (size == 4) {
convertView = inflater.inflate(R.layout.item_conversation_group4,
null, false);
} else if (size > 4) {
convertView = inflater.inflate(R.layout.item_conversation_group5,
null, false);
} else {
convertView = inflater.inflate(R.layout.item_conversation_group5,
null, false);
}
return convertView;
}
private static class ViewHolder {
/** 和谁的聊天记录 */
TextView tv_name;
/** 消息未读数 */
TextView tv_unread;
/** 最后一条消息的内容 */
TextView tv_content;
/** 最后一条消息的时间 */
TextView tv_time;
/** 用户头像 */
ImageView iv_avatar;
ImageView iv_avatar1;
ImageView iv_avatar2;
ImageView iv_avatar3;
ImageView iv_avatar4;
ImageView iv_avatar5;
ImageView msgState;
}
private void showUserAvatar(ImageView iamgeView, String avatar) {
final String url_avatar = Constant.URL_Avatar + avatar;
iamgeView.setTag(url_avatar);
if (url_avatar != null && !url_avatar.equals("")) {
Bitmap bitmap = avatarLoader.loadImage(iamgeView, url_avatar,
new ImageDownloadedCallBack() {
public void onImageDownloaded(ImageView imageView,
Bitmap bitmap) {
if (imageView.getTag() == url_avatar) {
imageView.setImageBitmap(bitmap);
}
}
});
if (bitmap != null)
iamgeView.setImageBitmap(bitmap);
}
}
/**
* 根据消息内容和消息类型获取消息内容提示
*
* @param message
* @param context
* @return
*/
private String getMessageDigest(EMMessage message, Context context) {
String digest = "";
switch (message.getType()) {
case LOCATION: // 位置消息
if (message.direct == EMMessage.Direct.RECEIVE) {
digest = getStrng(context, R.string.location_recv);
digest = String.format(digest, message.getFrom());
return digest;
} else {
// digest = EasyUtils.getAppResourceString(context,
// "location_prefix");
digest = getStrng(context, R.string.location_prefix);
}
break;
case IMAGE: // 图片消息
digest = getStrng(context, R.string.picture);
break;
case VOICE:// 语音消息
digest = getStrng(context, R.string.voice);
break;
case VIDEO: // 视频消息
digest = getStrng(context, R.string.video);
break;
case TXT: // 文本消息
if (!message.getBooleanAttribute(
Constant.MESSAGE_ATTR_IS_VOICE_CALL, false)) {
TextMessageBody txtBody = (TextMessageBody) message.getBody();
digest = txtBody.getMessage();
} else {
TextMessageBody txtBody = (TextMessageBody) message.getBody();
digest = getStrng(context, R.string.voice_call)
+ txtBody.getMessage();
}
break;
case FILE: // 普通文件消息
digest = getStrng(context, R.string.file);
break;
default:
System.err.println("error, unknow type");
return "";
}
return digest;
}
String getStrng(Context context, int resId) {
return context.getResources().getString(resId);
}
private void showMyDialog(String title, final EMConversation conversation) {
final AlertDialog dlg = new AlertDialog.Builder(context).create();
dlg.show();
Window window = dlg.getWindow();
// 设置窗口的内容页面,shrew_exit_dialog.xml文件中定义view内容
window.setContentView(R.layout.alertdialog);
window.findViewById(R.id.ll_title).setVisibility(View.VISIBLE);
TextView tv_title = (TextView) window.findViewById(R.id.tv_title);
tv_title.setText(title);
TextView tv_content1 = (TextView) window.findViewById(R.id.tv_content1);
final String username = conversation.getUserName();
// 是否已经置顶
if (topMap.containsKey(username)) {
tv_content1.setText("取消置顶");
} else {
tv_content1.setText("置顶聊天");
}
tv_content1.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SdCardPath")
public void onClick(View v) {
if (topMap.containsKey(username)) {
topMap.remove(username);
TopUserDao topUserDao = new TopUserDao(context);
topUserDao.deleteTopUser(username);
} else {
TopUser topUser = new TopUser();
topUser.setTime(System.currentTimeMillis());
// 1---表示是群组
topUser.setType(1);
topUser.setUserName(username);
Map<String, TopUser> map = new HashMap<String, TopUser>();
map.put(conversation.getUserName(), topUser);
topMap.putAll(map);
TopUserDao topUserDao = new TopUserDao(context);
topUserDao.saveTopUser(topUser);
}
((MainActivity) context).homefragment.refresh();
dlg.cancel();
}
});
TextView tv_content2 = (TextView) window.findViewById(R.id.tv_content2);
tv_content2.setText("删除该聊天");
tv_content2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EMChatManager.getInstance().deleteConversation(
conversation.getUserName(), conversation.isGroup());
InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(context);
inviteMessgeDao.deleteMessage(conversation.getUserName());
((MainActivity) context).homefragment.refresh();
dlg.cancel();
}
});
}
}