package com.mogujie.tt.biz;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.mogujie.tt.cache.biz.CacheHub;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.entity.RecentInfo;
import com.mogujie.tt.entity.User;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.base.Packet;
/**
* @Description 联系人界面的公用业务逻辑处理
* @date 2014-7-12
*/
public class ContactHelper {
private static Logger logger = Logger.getLogger(ContactHelper.class);
private static List<RecentInfo> recentInfoList = new ArrayList<RecentInfo>();
public ContactHelper() {
super();
}
/**
* @Description 获取排序后的联系人信息
* @return
*/
public static List<RecentInfo> getSortedRecentInfoList() {
sortContactInfo();
return recentInfoList;
}
/**
* @Description 获取当前联系人信息
* @return
*/
public static List<RecentInfo> getRecentInfoList() {
return recentInfoList;
}
/**
* @Description 清除最近联系人
* @return void
*/
public static void clearRecentInfo() {
recentInfoList.clear();
}
// /**
// * @Description 请求最近联系人
// */
// public static void reqRecentContact(final Handler msgHandler, final Handler uiHandler) {
// Packet packet = PacketDistinguisher.make(
// ProtocolConstant.SID_BUDDY_LIST,
// ProtocolConstant.CID_REQUEST_RECNET_CONTACT, null, true);
//
// ActionCallback callback = new ActionCallback() {
//
// @Override
// public void onSuccess(Packet packet) {
// sendMessageToMsgHandler(packet, msgHandler);
// }
//
// @Override
// public void onTimeout(Packet packet) {
// uiHandler.sendEmptyMessage(HandlerConstant.HANDLER_CONTACTS_REQUEST_TIMEOUT);
// }
//
// @Override
// public void onFaild(Packet packet) {
// onTimeout(packet);
// }
// };
// PushActionToQueueTask task = new PushActionToQueueTask(packet, callback);
// TaskManager.getInstance().trigger(task);
// }
/**
* @Description 向msg handler发送消息
* @param packet
* @param msgHandler
*/
public static void sendMessageToMsgHandler(Packet packet, Handler msgHandler) {
if (packet == null || msgHandler == null)
return;
int serviceId = packet.getResponse().getHeader().getServiceId();
int commandId = packet.getResponse().getHeader().getCommandId();
Message msg = new Message();
msg.what = serviceId * 1000 + commandId;
msg.obj = packet;
msgHandler.sendMessage(msg);
}
/**
* @Description 检查联系人列表长度,如果大于定义的最大值就进行remove操作
*/
private static void checkSizeForRecentList() {
try {
if (null == recentInfoList) {
return;
}
int sz = recentInfoList.size();
while (sz > SysConstant.MAX_CONTACTS_COUNT) {
recentInfoList.remove(sz - 1);
sz = recentInfoList.size();
}
} catch (Exception e) {
logger.e(e.getMessage());
}
}
/**
* @Description 加载最近联系人
* @param msgHandler
*/
public static void loadRecentInfoList(Handler msgHandler, Context context) {
try {
// 1.使当前联系人列表信息和缓存中的信息保持一致
int friendNo = CacheHub.getInstance()
.getFriendIdList(CacheHub.getInstance().getLoginUserId(), context).size();
if (friendNo > recentInfoList.size()) {
List<String> friendIds = CacheHub.getInstance().getFriendIdList(
CacheHub.getInstance().getLoginUserId(), context);
addRecentContactsFromIdList(friendIds);
}
// 2.完善最近联系人信息,缓存中有的直接使用,没的有从服务端取
Iterator<RecentInfo> itr = recentInfoList.iterator();
Queue<String> userIdList = new LinkedList<String>();
Queue<String> requestUserList = new LinkedList<String>();// 需要请求详细信息的id列表
while (itr.hasNext()) {
RecentInfo recentInfo = itr.next();
String friendId = recentInfo.getUserId();
User userInfo = CacheHub.getInstance().getUser(friendId, context);
if (null != userInfo) {
recentInfo.setUserId(friendId);
if (!TextUtils.isEmpty(userInfo.getNickName())) {
logger.d("recent#1");
recentInfo.setUserName(userInfo.getNickName());
} else if (!TextUtils.isEmpty(userInfo.getName())) {
logger.d("recent#2");
recentInfo.setUserName(userInfo.getName());
} else {
userIdList.add(friendId);
logger.d("recent#3");
recentInfo.setUserName(friendId);
}
recentInfo.setUserAvatar(userInfo.getAvatarUrl());
} else {
requestUserList.add(friendId);
//todo eric set user name is here
logger.d("recent#4");
recentInfo.setUserName(friendId);
}
MessageInfo msgInfo = CacheHub.getInstance().getLastMessage(
friendId);
if (null != msgInfo) {
recentInfo.setLastContent(msgInfo.getMsgOverview());
recentInfo
.setLastTime(Long.valueOf(msgInfo.getUpdated() > 0 ? msgInfo
.getUpdated() : msgInfo.getCreated()) * 1000);
recentInfo.setMsgType(msgInfo.getMsgType());
recentInfo.setDisplayType(msgInfo.getDisplayType());
} else {
recentInfo.setLastTime(0L);
}
int unreadCount = CacheHub.getInstance().getUnreadCount(
friendId);
recentInfo.setUnReadCount(unreadCount);
}
// 3.排序联系人
sortContactInfo();
// 4.向服务端请求信息
if (requestUserList.size() > 0) {
//todo eric
//requestUserInfo(requestUserList, msgHandler);
}
} catch (Exception e) {
logger.e(e.toString());
}
}
/**
* @Description 由id列表向联系人列表添加新的联系人对象
* @param friendIds
*/
private static void addRecentContactsFromIdList(List<String> friendIds) {
if (null == friendIds) {
return;
}
try {
Iterator<String> itr = friendIds.iterator();
while (itr.hasNext()) {
String friendId = itr.next();
if (CacheHub.getInstance().isLoadedFriendId(friendId)) {
continue; // 已经加载进最近联系人列表则忽略
}
RecentInfo recentInfo = new RecentInfo();
recentInfo.setUserId(friendId);
addNewRecentInfo(recentInfo, false); // 加在最后
CacheHub.getInstance().setLoadedFriendId(friendId);
}
} catch (Exception e) {
logger.e(e.getMessage());
}
}
/**
* @Description (从服务端请求用户信息成功后)更新联系人列表中的用户信息
* @param msgHandler
*/
public static void refreshUserInfo(Handler msgHandler, Context context) {
if (0 == getRecentInfoList().size()) {
return; // 如果好友列表为空,直接返回
}
try {
Iterator<RecentInfo> itr = recentInfoList.iterator();
RecentInfo recentInfo = null;
String friendId = "";
Queue<String> requestUserList = new LinkedList<String>();// 如果用户信息为空会一直向服务端请求,直到正常获取为止
while (itr.hasNext()) {
recentInfo = itr.next();
friendId = recentInfo.getUserId();
User userInfo = CacheHub.getInstance().getUser(friendId, context);
if (null != userInfo) {
recentInfo.setUserId(friendId);
if (!TextUtils.isEmpty(userInfo.getNickName())) {
logger.d("recent#5");
recentInfo.setUserName(userInfo.getNickName());
} else if (!TextUtils.isEmpty(userInfo.getName())) {
logger.d("recent#6");
recentInfo.setUserName(userInfo.getName());
} else {
logger.d("recent#7");
recentInfo.setUserName(friendId);
}
recentInfo.setUserAvatar(userInfo.getAvatarUrl());
} else {
requestUserList.add(friendId);
}
}
if (requestUserList.size() > 0) {
requestUserInfo(requestUserList, msgHandler);
}
} catch (Exception e) {
logger.e(e.toString());
}
}
@SuppressWarnings("unchecked")
public static void sortContactInfo() {
Collections.sort(recentInfoList);
}
/*
* 添加一条最近联系人
* @param recentInfo 最近联系人信息
* @param before 是否加在最前面
* @return void
*/
public static void addNewRecentInfo(RecentInfo recentInfo, Boolean before) {
if (null == recentInfo || null == recentInfo.getUserId()) {
return;
}
try {
if (before) {
recentInfoList.add(0, recentInfo); // 加在最前
} else {
recentInfoList.add(recentInfoList.size(), recentInfo); // 加在最后
}
// hmContacts.put(recentInfo.getUserId(), true);
checkSizeForRecentList();
} catch (Exception e) {
logger.e(e.toString());
}
}
/**
* @Description 请求用户信息
* @param entityId
* @param msgHandler
*/
public static void requestUserInfo(Queue<String> userList, final Handler msgHandler) {
// MessageHelper.sendTaskForUserInfo(userList, new ActionCallback() {
//
// @Override
// public void onSuccess(Packet packet) {
// MessageHelper.sendMessageToMsgHandler(packet, msgHandler);
// }
//
// @Override
// public void onTimeout(Packet packet) {
// }
//
// @Override
// public void onFaild(Packet packet) {
// }
// });
}
/**
* @Description 由位置信息获取到最近联系人信息
* @param position
* @return
*/
public static RecentInfo getRecentInfoByPosition(int position) {
if (position >= recentInfoList.size() || position < 0) {
return null;
}
return recentInfoList.get(position);
}
/**
* @Description 由最近联系人Id获取到联系人信息
* @param userId
* @return
*/
public static RecentInfo getRecentInfoByUserId(String userId) {
if (null == userId) {
return null;
}
Iterator<RecentInfo> itr = recentInfoList.iterator();
while (itr.hasNext()) {
RecentInfo recentInfo = itr.next();
if (userId.equals(recentInfo.getUserId())) {
return recentInfo;
}
}
return null;
}
/**
* @Description 重置联系人消息状态,清空消息计数,设置DB中消息状态为已读,返回已读的消息计数
* @param recentinfo
* @return
*/
public static int resetContactMessagetState(RecentInfo recentinfo) {
if (null == recentinfo)
return 0;
// 设置消息计数为0
recentinfo.setUnReadCount(0);
int readCount = CacheHub.getInstance().clearUnreadCount(
recentinfo.getUserId());
// 设置当前选中用户本地DB中消息为已读
CacheHub.getInstance().updateMsgReadStatus(
CacheHub.getInstance().getLoginUserId(),
recentinfo.getUserId(),
SysConstant.MESSAGE_ALREADY_READ);
return readCount; // 返回已读的消息计数
}
/*
* 修改缓存用户信息
*/
public static Queue<String> updateUserListInCache(List<RecentInfo> userList, Context context) {
Queue<String> userIdList = new LinkedList<String>();
for (int i = 0; i < userList.size(); ++i) {
RecentInfo info = userList.get(i);
User user = new User();
user.setUserId(info.getUserId());
user.setName(info.getUserName());
user.setNickName(info.getNickName());
user.setAvatarUrl(info.getUserAvatar());
userIdList.add(info.getUserId());
CacheHub.getInstance().addFriendId(info.getUserId());
CacheHub.getInstance().setUser(user, context);
}
return userIdList;
}
}