package com.mogujie.tt.imlib;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import android.content.Intent;
import com.mogujie.tt.entity.RecentInfo;
import com.mogujie.tt.imlib.network.SocketThread;
import com.mogujie.tt.imlib.proto.AllContactsPacket;
import com.mogujie.tt.imlib.proto.ContactEntity;
import com.mogujie.tt.imlib.proto.DepartmentEntity;
import com.mogujie.tt.imlib.proto.DepartmentPacket;
import com.mogujie.tt.imlib.proto.RecentContactsPacket;
import com.mogujie.tt.imlib.proto.UnreadMsgContactListPacket;
import com.mogujie.tt.imlib.proto.UnreadMsgPacket;
import com.mogujie.tt.imlib.utils.IMContactHelper;
import com.mogujie.tt.imlib.utils.IMUIHelper;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.base.DataBuffer;
import com.mogujie.tt.utils.pinyin.PinYin;
public class IMContactManager extends IMManager {
private static IMContactManager inst;
private Logger logger = Logger.getLogger(IMContactManager.class);
private boolean departmentDataReady, allContactsDataReady,
recentContactsDataReady, unreadMsgContactListReady;
private ContactEntity loginContact;
private List<RecentContactsPacket.UserEntity> recentContactList;
private List<String> unreadMsgContactList;
// key = id
private Map<String, DepartmentEntity> departments = new ConcurrentHashMap<String, DepartmentEntity>();
private Map<String, ContactEntity> contacts = new ConcurrentHashMap<String, ContactEntity>();
public static IMContactManager instance() {
synchronized (IMContactManager.class) {
if (inst == null) {
inst = new IMContactManager();
}
return inst;
}
}
private IMContactManager() {
}
public ContactEntity getLoginContact() {
return loginContact;
}
public void setLoginContact(ContactEntity loginContact) {
this.loginContact = loginContact;
}
public void fetchContacts() {
logger.d("contact#fetchContacts");
if (triggerContactsDataReady()) {
logger.d("contact#contacts are already ready, notify it");
} else {
reqGetDepartments();
reqGetAllContacts();
reqGetRecentContacts();
reqUnreadMsgContactList();
}
}
public Map<String, DepartmentEntity> getDepartments() {
return departments;
}
public Map<String, ContactEntity> getContacts() {
return contacts;
}
public ContactEntity findContact(String contactId) {
return contacts.get(contactId);
}
public DepartmentEntity findDepartment(String departmentId) {
return departments.get(departmentId);
}
public boolean ContactsDataReady() {
return departmentDataReady && allContactsDataReady;
}
private void reqGetDepartments() {
logger.i("contact#reqGetDepartments");
SocketThread channel = IMLoginManager.instance().getMsgServerChannel();
if (channel == null) {
logger.e("contact#channel is null");
return;
}
channel.sendPacket(new DepartmentPacket());
}
private void reqGetAllContacts() {
logger.i("contact#reqGetAllContacts");
SocketThread channel = IMLoginManager.instance().getMsgServerChannel();
if (channel == null) {
logger.e("contact#channel is null");
return;
}
channel.sendPacket(new AllContactsPacket());
}
private boolean triggerContactsDataReady() {
logger.d("contact#triggerContactsDataReady");
if (ContactsDataReady()) {
logger.i("contact#contacts are ready, broadcast");
if (ctx != null) {
logger.i("contact#start boradcas t contact_ready action");
ctx.sendBroadcast(new Intent(IMActions.ACTION_CONTACT_READY));
return true;
} else {
logger.e("contact#ctx is null");
}
}
logger.i("contact#didn't broadcast anything because contacts data are not ready");
return false;
}
public void onRepDepartment(DataBuffer buffer) {
logger.i("contact#onRepDepartment");
DepartmentPacket packet = new DepartmentPacket();
packet.decode(buffer);
DepartmentPacket.PacketResponse resp = (DepartmentPacket.PacketResponse) packet
.getResponse();
logger.i("contact#department cnt:%d", resp.entityList.size());
for (DepartmentEntity department : resp.entityList) {
logger.i("department -> entity:%s", department);
PinYin.getPinYin(logger, department.title, department.pinyinElement);
departments.put(department.id, department);
}
departmentDataReady = true;
triggerContactsDataReady();
triggerSearchDataReady();
}
private void triggerSearchDataReady() {
IMUIHelper.triggerSearchDataReady(logger, ctx, this, IMGroupManager.instance());
}
public void onRepAllUsers(DataBuffer buffer) {
logger.i("contact#onRepAllUsers");
AllContactsPacket packet = new AllContactsPacket();
packet.decode(buffer);
AllContactsPacket.PacketResponse resp = (AllContactsPacket.PacketResponse) packet
.getResponse();
logger.i("contact#user cnt:%d", resp.entityList.size());
String loginId = IMLoginManager.instance().getLoginId();
for (ContactEntity contact : resp.entityList) {
PinYin.getPinYin(logger, contact.name, contact.pinyinElement);
//logger.i("user -> entity:%s", contact);
contacts.put(contact.id, contact);
if (contact.id.equals(loginId)) {
logger.i("contact#find login contact");
loginContact = contact;
}
}
allContactsDataReady = true;
triggerContactsDataReady();
triggerSearchDataReady();
triggerAddRecentContacts();
triggerReqUnreadMsgs();
}
private void reqGetRecentContacts() {
logger.i("contact#reqGetRecentContacts");
SocketThread channel = IMLoginManager.instance().getMsgServerChannel();
if (channel == null) {
logger.e("contact#channel is null");
return;
}
channel.sendPacket(new RecentContactsPacket());
}
public boolean recentContactsDataReady() {
return allContactsDataReady && recentContactsDataReady;
}
public void triggerAddRecentContacts() {
logger.d("contact#triggerAddRecentContacts");
if (recentContactsDataReady()) {
logger.d("contact#condition is ready");
for (RecentContactsPacket.UserEntity recentContact : recentContactList) {
ContactEntity contact = findContact(recentContact.id);
if (contact == null) {
logger.e("recent#no such contact by id:%s",
recentContact.id);
continue;
}
RecentInfo recentSession = IMContactHelper
.convertContactEntity2RecentInfo(contact,
recentContact.userUpdated);
IMRecentSessionManager.instance().addRecentSession(
recentSession);
}
IMRecentSessionManager.instance().broadcast();
} else {
logger.d("contact#condition is not ready");
}
}
public void onRepRecentContacts(DataBuffer buffer) {
logger.i("contact#onRepRecentContacts");
RecentContactsPacket packet = new RecentContactsPacket();
packet.decode(buffer);
RecentContactsPacket.PacketResponse resp = (RecentContactsPacket.PacketResponse) packet
.getResponse();
logger.i("contact#user cnt:%d", resp.entityList.size());
// for (RecentContactsPacket.UserEntity entity : resp.entityList) {
// //logger.i("user -> entity:%s", entity);
// }
recentContactList = resp.entityList;
recentContactsDataReady = true;
triggerAddRecentContacts();
}
private void reqUnreadMsgContactList() {
logger.i("unread#1reqUnreadMsgContactList");
SocketThread channel = IMLoginManager.instance().getMsgServerChannel();
if (channel == null) {
logger.e("unread#channel is null");
return;
}
channel.sendPacket(new UnreadMsgContactListPacket());
}
public void onRepUnreadMsgContactList(DataBuffer buffer) {
logger.i("unread#2onRepUnreadMsgContactList");
UnreadMsgContactListPacket packet = new UnreadMsgContactListPacket();
packet.decode(buffer);
UnreadMsgContactListPacket.PacketResponse resp = (UnreadMsgContactListPacket.PacketResponse) packet
.getResponse();
logger.i("unread#unreadMsgContactList cnt:%d", resp.entityList.size());
unreadMsgContactList = resp.entityList;
unreadMsgContactListReady = true;
triggerReqUnreadMsgs();
}
private boolean conditionReqUnreadMsgsOK() {
return unreadMsgContactListReady && allContactsDataReady;
}
private void triggerReqUnreadMsgs() {
logger.d("unread#triggerReqUnreadMsgs");
if (conditionReqUnreadMsgsOK()) {
reqUnreadMgs();
} else {
logger.d("unread#condition is not ok");
}
}
private void reqUnreadMgs() {
logger.i("unread#3reqUnreadMsgs");
SocketThread channel = IMLoginManager.instance().getMsgServerChannel();
if (channel == null) {
logger.e("unread#channel is null");
return;
}
for (String contactId : unreadMsgContactList) {
logger.d("unread#sending unreadmsg request -> contactId:%s",
contactId);
channel.sendPacket(new UnreadMsgPacket(contactId));
}
}
}