package com.mogujie.tt.ui.fragment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.mogujie.tt.R;
import com.mogujie.tt.adapter.ContactBaseAdapter;
import com.mogujie.tt.adapter.EntityListViewAdapter;
import com.mogujie.tt.config.HandlerConstant;
import com.mogujie.tt.entity.ContactSortEntity;
import com.mogujie.tt.imlib.IMActions;
import com.mogujie.tt.imlib.IMContactManager;
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.imlib.utils.IMUIHelper;
import com.mogujie.tt.ui.utils.EntityList;
import com.mogujie.tt.ui.utils.IMServiceHelper;
import com.mogujie.tt.ui.utils.IMServiceHelper.OnIMServiceListner;
import com.mogujie.tt.utils.CharacterParser;
import com.mogujie.tt.utils.ContactUtils;
import com.mogujie.tt.utils.SortComparator;
import com.mogujie.tt.widget.SearchEditText;
import com.mogujie.tt.widget.SortSideBar;
import com.mogujie.tt.widget.SortSideBar.OnTouchingLetterChangedListener;
public class ContactFragment extends MainFragment
implements
OnTouchingLetterChangedListener,
OnIMServiceListner {
private View curView = null;
private static Handler uiHandler = null;
private ListView allContactListView;
private ListView departmentContactListView;
private SortSideBar sortSideBar;
private TextView dialog;
private EntityListViewAdapter contactAdapter;
private EntityListViewAdapter departmentAdapter;
private SearchEditText searchEditText;
private CharacterParser characterParser;
private List<ContactSortEntity> SourceDateList;
private SortComparator sortComparator;
private int curTabIndex = 0;
private IMServiceHelper imServiceHelper = new IMServiceHelper();
private IMService imService;
// todo eric when to release?
private IMContactManager contactMgr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initHandler();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
logger.d("contact#register actions");
ArrayList<String> actions = new ArrayList<String>();
actions.add(IMActions.ACTION_CONTACT_READY);
actions.add(IMActions.ACTION_GROUP_READY);
actions.add(IMActions.ACTION_SEARCH_DATA_READY);
imServiceHelper.connect(getActivity(), actions, IMServiceHelper.INTENT_NO_PRIORITY, this);
if (null != curView) {
((ViewGroup) curView.getParent()).removeView(curView);
return curView;
}
curView = inflater.inflate(R.layout.tt_fragment_contact, topContentView);
initRes();
return curView;
}
private List<Object> getDepartmentTabSortedList(
Map<String, ContactEntity> contacts) {
// todo eric efficiency
List<Object> contactList = new ArrayList<Object>(contacts.values());
Collections.sort(contactList, new Comparator<Object>() {
@Override
public int compare(Object objEntity1, Object objEntity2) {
ContactEntity entity1 = (ContactEntity) objEntity1;
ContactEntity entity2 = (ContactEntity) objEntity2;
DepartmentEntity group1 = contactMgr.findDepartment(entity1.departmentId);
DepartmentEntity group2 = contactMgr.findDepartment(entity2.departmentId);
if (group1.title.equals(group2.title)) {
// todo eric efficiency
return new IMUIHelper.ContactPinyinComparator().compare(objEntity1, objEntity2);
} else {
return group1.title.compareToIgnoreCase(group2.title);
}
}
});
return contactList;
}
public void locateDepartment(String departmentId) {
logger.d("department#locateDepartment id:%s", departmentId);
if (topContactTitle == null) {
logger.e("department#TopTabButton is null");
return;
}
Button tabDepartmentBtn = topContactTitle.getTabDepartmentBtn();
if (tabDepartmentBtn == null) {
return;
}
tabDepartmentBtn.performClick();
locateDepartmentImpl(departmentId);
}
private void locateDepartmentImpl(String departmentId) {
if (imService == null) {
return;
}
DepartmentEntity department = imService.getContactManager().findDepartment(departmentId);
if (department == null) {
logger.e("department:no such id:%s", departmentId);
return;
}
int position = departmentAdapter.locateDepartment(department.title);
logger.d("department#located position:%d", position);
if (position < 0) {
logger.e("department#locateDepartment id:%s failed", departmentId);
return;
}
departmentContactListView.setSelection(position);
}
private void onContactsReady() {
hideProgressBar();
contactTabOnContactsReady();
departmentTabOnContactsReady();
}
private void departmentTabOnContactsReady() {
logger.d("contact#departmentTabOnContactsReady");
Map<String, ContactEntity> contacts = contactMgr.getContacts();
List<Object> contactList = getDepartmentTabSortedList(contacts);
EntityList entityList = new EntityList(contactList) {
private String getContactSectioName(ContactEntity contact) {
if (contact == null) {
return "";
}
DepartmentEntity group = contactMgr.findDepartment(contact.departmentId);
if (group == null) {
return "";
}
return group.title;
}
@Override
public String getSectionName(int position) {
if (searchMode) {
return "";
}
// TODO Auto-generated method stub
final ContactEntity contact = (ContactEntity) list.get(position);
if (contact == null) {
return "";
}
String sectionName = getContactSectioName(contact);
if (position == 0) {
return sectionName;
}
ContactEntity upperContact = (ContactEntity) list.get(position - 1);
if (sectionName.equals(getContactSectioName(upperContact))) {
return "";
} else {
return sectionName;
}
}
public boolean isPinYinIndexable() {
return true;
}
public int getPinYinFirstCharacter(int position) {
// TODO Auto-generated method stub
final ContactEntity contact = (ContactEntity) list.get(position);
if (contact == null) {
return 0;
}
DepartmentEntity department = contactMgr.findDepartment(contact.departmentId);
if (department == null) {
return 0;
}
return department.pinyinElement.pinyin.charAt(0);
}
@Override
public void onSearchImpl(String key) {
ArrayList<Object> searchList = new ArrayList<Object>();
for (Object obj : list) {
ContactEntity contact = (ContactEntity) obj;
if (contact.pinyinElement.pinyin.contains(key)
|| contact.name.contains(key)) {
searchList.add(obj);
}
}
list = searchList;
}
};
departmentAdapter.add(0, entityList);
}
private void contactTabOnContactsReady() {
logger.d("contact#onContactReady");
Map<String, ContactEntity> contacts = contactMgr.getContacts();
List<Object> contactList = IMUIHelper.getContactSortedList(contacts);
EntityList entityList = new EntityList(contactList) {
@Override
public String getSectionName(int position) {
if (searchMode) {
return "";
}
// TODO Auto-generated method stub
final ContactEntity contact = (ContactEntity) list.get(position);
if (contact == null) {
return "";
}
String sectionName = ContactUtils.getSectionName(contact);
if (position == 0) {
return sectionName;
}
ContactEntity upperContact = (ContactEntity) list.get(position - 1);
if (sectionName.equals(ContactUtils.getSectionName(upperContact))) {
return "";
} else {
return sectionName;
}
}
public boolean isPinYinIndexable() {
return true;
}
public int getPinYinFirstCharacter(int position) {
// TODO Auto-generated method stub
final ContactEntity contact = (ContactEntity) list.get(position);
if (contact == null) {
return 0;
}
return contact.pinyinElement.pinyin.charAt(0);
}
@Override
public void onSearchImpl(String key) {
ArrayList<Object> searchList = new ArrayList<Object>();
for (Object obj : list) {
ContactEntity contact = (ContactEntity) obj;
if (contact.pinyinElement.pinyin.contains(key)
|| contact.name.contains(key)) {
searchList.add(obj);
}
}
list = searchList;
}
};
contactAdapter.add(0, entityList);
}
private void onGroupReady() {
logger.d("group#onGroupReady");
hideProgressBar();
// todo efficiency
List<Object> groupList = new ArrayList<Object>(imService.getGroupManager().getNormalGroupList());
Collections.sort(groupList, new IMUIHelper.GroupPinyinComparator());
logger.d("group#groupList size:%d", groupList.size());
EntityList entityList = new EntityList(groupList) {
@Override
public String getSectionName(int position) {
if (searchMode) {
return "";
}
if (list.isEmpty()) {
return "";
}
if (position == 0) {
return getString(R.string.fixed_group_name);
}
return "";
}
@Override
public void onSearchImpl(String key) {
logger.d("search#key:%s", key);
if (key.isEmpty()) {
logger.d("search#key is empty");
recoverFromBackup();
return;
}
ArrayList<Object> searchList = new ArrayList<Object>();
for (Object obj : list) {
GroupEntity group = (GroupEntity) obj;
logger.d("search#pinyin:%s", group.pinyinElement.pinyin);
if (group.pinyinElement.pinyin.contains(key)
|| group.name.contains(key)) {
logger.d("search#group contains the key");
searchList.add(obj);
}
}
list = searchList;
}
};
contactAdapter.add(0, entityList);
}
/**
* @Description 初始化界面资源
*/
private void initRes() {
// 设置顶部标题栏
showContactTopBar();
// if (chooseMode) {
// setTopLeftButton(R.drawable.tt_top_back);
// setTopLeftText(getActivity().getString(R.string.top_left_back));
// topLeftBtn.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// getActivity().finish();
// }
// });
// }
//
super.init(curView);
showProgressBar();
sortSideBar = (SortSideBar) curView.findViewById(R.id.sidrbar);
dialog = (TextView) curView.findViewById(R.id.dialog);
sortSideBar.setTextView(dialog);
sortSideBar.setOnTouchingLetterChangedListener(this);
allContactListView = (ListView) curView.findViewById(R.id.all_contact_list);
departmentContactListView = (ListView) curView.findViewById(R.id.department_contact_list);
characterParser = CharacterParser.getInstance();
sortComparator = new SortComparator();
SourceDateList = filledData(getResources().getStringArray(R.array.data));
Collections.sort(SourceDateList, sortComparator);
// logger.d("--------------dump contacts------------------");
// for (ContactSortEntity user : SourceDateList) {
// logger.d("userName:%s, pinyin:%s", user.getName(),
// user.getSortLetters());
// }
contactAdapter = new EntityListViewAdapter(getActivity());
departmentAdapter = new EntityListViewAdapter(getActivity());
allContactListView.setAdapter(contactAdapter);
departmentContactListView.setAdapter(departmentAdapter);
contactAdapter.initClickEvents(allContactListView);
departmentAdapter.initClickEvents(departmentContactListView);
searchEditText = (SearchEditText) curView.findViewById(R.id.filter_edit);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
((EntityListViewAdapter) getCurAdapter()).onSearch(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
// todo eric
// showLoadingProgressBar(true);
}
/**
* 为ListView填充数据
*
* @param data
* @return
*/
private List<ContactSortEntity> filledData(String[] data) {
List<ContactSortEntity> mSortList = new ArrayList<ContactSortEntity>();
for (int i = 0; i < data.length; i++) {
ContactSortEntity sortModel = new ContactSortEntity();
sortModel.setName(data[i]);
// 汉字转换成拼音
String pinyin = characterParser.getSelling(data[i]);
String sortString = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches("[A-Z]")) {
sortModel.setSortLetters(sortString.toUpperCase());
} else {
sortModel.setSortLetters("#");
}
mSortList.add(sortModel);
}
return mSortList;
}
private ContactBaseAdapter getCurAdapter() {
if (0 == curTabIndex) {
return contactAdapter;
} else {
return departmentAdapter;
}
}
private ListView getCurListView() {
if (0 == curTabIndex) {
return allContactListView;
} else {
return departmentContactListView;
}
}
public static Handler getHandler() {
return uiHandler;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroy() {
super.onDestroy();
imServiceHelper.disconnect(getActivity());
}
@Override
protected void initHandler() {
uiHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HandlerConstant.HANDLER_CHANGE_CONTACT_TAB :
if (null != msg.obj) {
curTabIndex = (Integer) msg.obj;
if (0 == curTabIndex) {
allContactListView.setVisibility(View.VISIBLE);
departmentContactListView.setVisibility(View.GONE);
} else {
departmentContactListView.setVisibility(View.VISIBLE);
allContactListView.setVisibility(View.GONE);
}
}
break;
}
}
};
}
@Override
public void onTouchingLetterChanged(String s) {
int position = getCurAdapter().getPositionForSection(s.charAt(0));
if (position != -1) {
getCurListView().setSelection(position);
}
}
@Override
public void onAction(String action, Intent intent,
BroadcastReceiver broadcastReceiver) {
// TODO Auto-generated method stub
logger.d("contact#receive action:%s", action);
if (action.equals(IMActions.ACTION_CONTACT_READY)) {
logger.d("contact#action is contact_ready");
onContactsReady();
} else if (action.equals(IMActions.ACTION_GROUP_READY)) {
logger.d("group#action is group_ready");
onGroupReady();
}
tryHandleSearchAction(action);
}
@Override
public void onIMServiceConnected() {
logger.d("contactUI#onIMServiceConnected");
imService = imServiceHelper.getIMService();
if (imService != null) {
contactMgr = imService.getContactManager();
}
if (contactMgr.ContactsDataReady()) {
onContactsReady();
}
if (imService.getGroupManager().groupReadyConditionOk()) {
onGroupReady();
}
tryInitSearch(imService);
}
}