package com.mogujie.tt.imlib.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.text.Spannable;
import android.text.style.ForegroundColorSpan;
import android.view.ContextThemeWrapper;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.BufferType;
import com.mogujie.tt.R;
import com.mogujie.tt.adapter.GroupManagerAdapter;
import com.mogujie.tt.cache.biz.CacheHub;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.imlib.IMActions;
import com.mogujie.tt.imlib.IMContactManager;
import com.mogujie.tt.imlib.IMGroupManager;
import com.mogujie.tt.imlib.IMSession;
import com.mogujie.tt.imlib.proto.ContactEntity;
import com.mogujie.tt.imlib.proto.DepartmentEntity;
import com.mogujie.tt.imlib.proto.GroupEntity;
import com.mogujie.tt.imlib.service.IMService;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.ui.activity.MessageActivity;
import com.mogujie.tt.ui.activity.UserInfoActivity;
import com.mogujie.tt.utils.pinyin.PinYin.PinYinArea;
import com.mogujie.tt.utils.pinyin.PinYin.PinYinElement;
import com.mogujie.widget.imageview.MGWebImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class IMUIHelper {
public static class DepartmentPinyinComparator
implements
Comparator<Object> {
@Override
public int compare(Object objEntity1, Object objEntity2) {
DepartmentEntity entity1 = (DepartmentEntity) objEntity1;
DepartmentEntity entity2 = (DepartmentEntity) objEntity2;
return entity1.pinyinElement.pinyin.compareToIgnoreCase(entity2.pinyinElement.pinyin);
}
};
public static class GroupPinyinComparator implements Comparator<Object> {
@Override
public int compare(Object objEntity1, Object objEntity2) {
GroupEntity entity1 = (GroupEntity) objEntity1;
GroupEntity entity2 = (GroupEntity) objEntity2;
return entity1.pinyinElement.pinyin.compareToIgnoreCase(entity2.pinyinElement.pinyin);
}
};
public static boolean triggerSearchDataReady(Logger logger, Context ctx,
IMContactManager contactMgr, IMGroupManager groupMgr) {
//contact,department, group data are all ready
logger.d("search#triggerSearchDataReady");
if (isSearchDataReady(contactMgr, groupMgr)) {
logger.i("search#conditions are all ready, broadcast");
if (ctx != null) {
logger.d("search#start boradcast search_data_ready action");
ctx.sendBroadcast(new Intent(IMActions.ACTION_SEARCH_DATA_READY));
return true;
}
}
logger.d("search#didn't broadcast anything because conditions are still not ready");
return false;
}
public static boolean isSearchDataReady(IMContactManager contactMgr,
IMGroupManager groupMgr) {
return contactMgr.ContactsDataReady()
&& groupMgr.groupReadyConditionOk();
}
public static boolean handleContactPinyinSearch(Logger logger,
PinYinElement contactPinyinElement, String key,
SearchElement contactSearchElement) {
contactSearchElement.reset();
String pinyin = contactPinyinElement.pinyin;
//the first char # was added manually when creating pinyin
if (pinyin.startsWith("#")) {
pinyin = pinyin.substring(1);
}
SearchElement pinyinSearchElement = new SearchElement();
if (!IMUIHelper.handleNameSearch(pinyin, key, pinyinSearchElement)) {
return false;
}
logger.d("pinyin#pinyinSearchElement:%s", pinyinSearchElement);
return IMUIHelper.locateNameAreaByPinyinIndex(contactPinyinElement, contactSearchElement, pinyinSearchElement.startIndex, pinyinSearchElement.endIndex);
}
public static boolean locateNameAreaByPinyinIndex(
PinYinElement pinYinElement, SearchElement searchElement,
int pinyinStartIndex, int pinyinEndIndex) {
for (int i = 0; i < pinYinElement.pinyinArea.size(); ++i) {
PinYinArea area = pinYinElement.pinyinArea.get(i);
if (pinyinStartIndex >= area.startIndex
&& pinyinStartIndex <= area.endIndex) {
searchElement.startIndex = i;
}
if (pinyinEndIndex >= area.startIndex
&& pinyinEndIndex <= area.endIndex) {
searchElement.endIndex = i + 1;
return true;
}
}
return false;
}
public static boolean handleNameSearch(String name, String key,
SearchElement searchElement) {
int index = name.indexOf(key);
if (index == -1) {
return false;
}
searchElement.startIndex = index;
searchElement.endIndex = index + key.length();
return true;
}
public static void setTextViewCharHilighted(TextView textView, String text,
int startIndex, int endIndex, int color) {
if (textView == null || text == null) {
return;
}
if (startIndex < 0) {
return;
}
if (endIndex > text.length()) {
return;
}
textView.setText(text, BufferType.SPANNABLE);
Spannable span = (Spannable) textView.getText();
if (span == null) {
return;
}
span.setSpan(new ForegroundColorSpan(color), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
public static void setViewTouchHightlighted(final View view) {
if (view == null) {
return;
}
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
view.setBackgroundColor(Color.rgb(1, 175, 244));
} else if (event.getAction() == MotionEvent.ACTION_UP) {
view.setBackgroundColor(Color.rgb(255, 255, 255));
}
return false;
}
});
}
public static void handleContactItemLongClick(final Context ctx,
final ContactEntity contact) {
if (contact == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, android.R.style.Theme_Holo_Light_Dialog));
builder.setTitle(contact.name);
String[] items = new String[]{ctx.getString(R.string.check_profile),
getCallPhoneDescription(ctx, contact)};
builder.setItems(items, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0 :
IMUIHelper.openUserProfileActivity(ctx, contact.id);
break;
case 1 :
IMUIHelper.callPhone(ctx, contact.telephone);
break;
}
}
});
builder.show();
}
private static String getCallPhoneDescription(Context ctx,
ContactEntity contact) {
return String.format("%s(%s)", ctx.getString(R.string.call_phone), getPhoneNumberDescription(ctx, contact));
}
private static String getPhoneNumberDescription(Context ctx,
ContactEntity contact) {
if (contact.telephone.isEmpty()) {
return ctx.getString(R.string.empty_phone_no);
} else {
return contact.telephone;
}
}
public static void callPhone(Context ctx, String phoneNumber) {
if (ctx == null) {
return;
}
if (phoneNumber.isEmpty()) {
return;
}
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
+ phoneNumber));
ctx.startActivity(intent);
}
public static void openUserProfileActivity(Context ctx, String contactId) {
Intent intent = new Intent(ctx, UserInfoActivity.class);
IMUIHelper.setSessionInIntent(intent, contactId, IMSession.SESSION_P2P);
ctx.startActivity(intent);
}
public static boolean openSessionChatActivity(Logger logger, Context ctx,
String sessionId, int sessionType, IMService imService) {
if (logger == null || ctx == null || sessionId == null
|| imService == null) {
return false;
}
if (sessionType == IMSession.SESSION_P2P) {
ContactEntity contact = imService.getContactManager().findContact(sessionId);
if (contact == null) {
logger.e("chat#no such contact -> id:%s", sessionId);
return false;
}
openContactChatActivity(ctx, contact);
return true;
} else {
GroupEntity group = imService.getGroupManager().findGroup(sessionId);
if (group == null) {
logger.e("chat#no such group -> id:%s", sessionId);
return false;
}
openGroupChatActivity(ctx, group);
return true;
}
}
public static void openContactChatActivity(Context ctx,
ContactEntity contact) {
if (contact == null) {
return;
}
openChatActivity(ctx, IMSession.SESSION_P2P, contact.id);
}
// todo eric 讨论组
public static void openGroupChatActivity(Context ctx, GroupEntity group) {
if (group == null) {
return;
}
openChatActivity(ctx, group.type, group.id);
}
public static void openChatActivity(Context ctx, int sessionType,
String sessionId) {
Intent i = new Intent(ctx, MessageActivity.class);
i.setAction(IMActions.ACTION_NEW_MESSAGE_SESSION);
setSessionInIntent(i, sessionId, sessionType);
CacheHub.getInstance().setSessionInfo(new SessionInfo(sessionId, sessionType));
ctx.startActivity(i);
}
public static boolean setMessageOwnerName(Logger logger, IMSession session,
MessageInfo msgInfo, TextView nameTextView) {
if (logger == null || session == null || msgInfo == null
|| nameTextView == null) {
return false;
}
logger.d("name#setMessageOwnerName, fromid:%s, from usrname:%s", msgInfo.getMsgFromUserId(), msgInfo.getMsgFromName());
if (!msgInfo.isMyMsg()) {
logger.d("name#not my msg");
ContactEntity contact = session.getSessionContact(msgInfo.getMsgFromUserId());
if (contact != null) {
nameTextView.setText(contact.name);
return true;
} else {
logger.d("name#contact is null");
}
}
return false;
}
public static boolean setMessageOwnerAvatar(Logger logger,
IMSession session, MessageInfo msgInfo, MGWebImageView webImageView) {
if (logger == null || session == null || msgInfo == null
|| webImageView == null) {
return false;
}
logger.d("avatar#setMessageOwnerAvatar, fromid:%s, from usrname:%s", msgInfo.getMsgFromUserId(), msgInfo.getMsgFromName());
ContactEntity contact;
if (msgInfo.isMyMsg()) {
logger.d("avatar#isMyMsg");
contact = session.getLoginContact();
logger.d("avatar#login contact:%s", contact);
} else {
logger.d("avatar#is not my msg");
contact = session.getSessionContact(msgInfo.getMsgFromUserId());
logger.d("avatar#avatar:%s", contact);
}
if (contact != null) {
logger.d("avatar#setWebImageViewAvatar avatarUrl:%s", contact.avatarUrl);
setWebImageViewAvatar(webImageView, contact.avatarUrl, IMSession.SESSION_P2P);
return true;
} else {
logger.d("avatar#contact is null");
}
return false;
}
public static int getDefaultAvatarResId(int sessionType) {
if (sessionType == IMSession.SESSION_P2P) {
return R.drawable.tt_default_user_portrait_corner;
} else if (sessionType == IMSession.SESSION_GROUP) {
return R.drawable.group_default;
} else if (sessionType == IMSession.SESSION_TEMP_GROUP) {
return R.drawable.discussion_group_default;
}
return R.drawable.tt_default_user_portrait_corner;
}
public static void setWebImageViewAvatar(MGWebImageView webImageView,
String avatarUrl, int sessionType) {
if (avatarUrl == null) {
return;
}
// logger.d("contactUI#getView avatarUrl:%s", avatarUrl);
String realAvatarUrl = IMContactHelper.getRealAvatarUrl(avatarUrl);
Logger logger = Logger.getLogger(IMUIHelper.class);
logger.d("contactUI#realAvatarUrl:%s", realAvatarUrl);
if (realAvatarUrl.isEmpty()) {
webImageView.setImageResource(getDefaultAvatarResId(sessionType));
} else {
webImageView.setDefaultImageResId(getDefaultAvatarResId(sessionType));
webImageView.setImageUrlNeedFit(realAvatarUrl);
}
}
public static void setEntityImageViewAvatar(ImageView imageView,
String avatarUrl, int sessionType) {
Logger logger = Logger.getLogger(IMUIHelper.class);
logger.d("debug#setEntityImageViewAvatar imageView:%s, avatarUrl:%s", imageView, avatarUrl);
if (avatarUrl == null) {
return;
}
int defaultResId = getDefaultAvatarResId(sessionType);
//todo eric created too many options, but I can't find a way to change showImageOnLoading resource id
// dynamically based on sessionType
DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(defaultResId).showImageForEmptyUri(defaultResId).showImageOnFail(defaultResId).cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).displayer(new RoundedBitmapDisplayer(5)).build();
String realAvatarUrl = IMContactHelper.getRealAvatarUrl(avatarUrl);
logger.d("contactUI#realAvatarUrl:%s", realAvatarUrl);
ImageLoader.getInstance().displayImage(realAvatarUrl, imageView, options, null);
}
public static void setGroupMemberGridViewData(Logger logger, Intent intent,
IMService imService, GroupManagerAdapter adapter) {
if (adapter == null) {
logger.e("groupmgr#adapter is null");
return;
}
logger.d("groupmgr#setGridViewData");
if (imService == null) {
logger.e("groupmgr#imservice is null");
return;
}
String sessionId = intent.getStringExtra(SysConstant.SESSION_ID_KEY);
int sessiondType = intent.getIntExtra(SysConstant.SESSION_TYPE_KEY, 0);
logger.d("groupmgr#sessionType:%d, sessionId:%s", sessiondType, sessionId);
List<ContactEntity> contactList = new ArrayList<ContactEntity>();
if (sessiondType == IMSession.SESSION_P2P) {
ContactEntity contact = imService.getContactManager().findContact(sessionId);
if (contact == null) {
logger.e("groupmgr#no such contact by id:%s", sessionId);
return;
}
contactList.add(contact);
} else {
contactList = imService.getGroupManager().getGroupMembers(sessionId);
if (contactList == null) {
logger.e("groupmgr#get members from group id:%s failed", sessionId);
return;
}
}
adapter.setData(contactList);
}
public static void setSessionInIntent(Intent intent, String sessionId,
int sessionType) {
if (intent == null) {
return;
}
Logger.getLogger(IMUIHelper.class).d("notification#setSessionInIntent, sessionId:%s, sessionType:%d", sessionId, sessionType);
intent.putExtra(SysConstant.SESSION_ID_KEY, sessionId);
intent.putExtra(SysConstant.SESSION_TYPE_KEY, sessionType);
}
public static class SessionInfo {
@Override
public String toString() {
return "SessionInfo [sessionId=" + sessionId + ", sessionType="
+ sessionType + "]";
}
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
public void setSessionType(int sessionType) {
this.sessionType = sessionType;
}
String sessionId;
int sessionType;
public SessionInfo(String sessionId, int sessionType) {
super();
this.sessionId = sessionId;
this.sessionType = sessionType;
}
public int getSessionType() {
// TODO Auto-generated method stub
return sessionType;
}
}
public static SessionInfo getSessionInfoFromIntent(Intent intent) {
if (intent == null) {
return null;
}
return new SessionInfo(intent.getStringExtra(SysConstant.SESSION_ID_KEY), intent.getIntExtra(SysConstant.SESSION_TYPE_KEY, 0));
}
public static class ContactPinyinComparator implements Comparator<Object> {
@Override
public int compare(Object objEntity1, Object objEntity2) {
ContactEntity entity1 = (ContactEntity) objEntity1;
ContactEntity entity2 = (ContactEntity) objEntity2;
// TODO Auto-generated method stub
if (entity2.pinyinElement.pinyin.startsWith("#")) {
return -1;
} else if (entity1.pinyinElement.pinyin.startsWith("#")) {
// todo eric guess: latter is > 0
return 1;
} else {
return entity1.pinyinElement.pinyin.compareToIgnoreCase(entity2.pinyinElement.pinyin);
}
}
}
public static List<Object> getContactSortedList(
Map<String, ContactEntity> contacts) {
// todo eric efficiency
List<Object> contactList = new ArrayList<Object>(contacts.values());
Collections.sort(contactList, new ContactPinyinComparator());
return contactList;
}
public static List<Object> getGroupSortedList(
Map<String, GroupEntity> groups) {
// todo eric efficiency
List<Object> groupList = new ArrayList<Object>(groups.values());
Collections.sort(groupList, new GroupPinyinComparator());
return groupList;
}
public static List<Object> getDepartmentSortedList(
Map<String, DepartmentEntity> departments) {
// todo eric efficiency
List<Object> departmentList = new ArrayList<Object>(departments.values());
Collections.sort(departmentList, new DepartmentPinyinComparator());
return departmentList;
}
public static boolean isSameSession(SessionInfo sessionInfo,
IMSession session) {
if (sessionInfo == null || session == null) {
return false;
}
return (sessionInfo.getSessionId().equals(session.getSessionId()) && sessionInfo.getSessionType() == session.getType());
}
}