package com.mogujie.tt.adapter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.SectionIndexer; import android.widget.TextView; import com.mogujie.tt.R; import com.mogujie.tt.entity.ContactSortEntity; 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.utils.IMUIHelper; import com.mogujie.tt.log.Logger; import com.mogujie.tt.utils.ContactUtils; import com.mogujie.widget.imageview.MGWebImageView; public class ContactAllAdapter extends BaseAdapter implements SectionIndexer, ContactBaseAdapter { public static final int VIEW_TYPE_CONTACT = 0; public static final int VIEW_TYPE_GROUP = 1; private Context context; private Logger logger = Logger.getLogger(ContactAllAdapter.class); // todo eric should i assign value here? private List<ContactEntity> contactList = new ArrayList<ContactEntity>(); private List<GroupEntity> groupList = new ArrayList<GroupEntity>(); public ContactAllAdapter(Context context) { this.context = context; } public int getCount() { return contactList.size() + groupList.size(); } public long getItemId(int position) { return position; } public final ContactEntity getContact(int position) { // todo eric, check bounds return contactList.get(position); } public void setGroupData(Map<String, GroupEntity> groups) { logger.d("group#setGroupData"); // todo efficiency groupList = new ArrayList<GroupEntity>(groups.values()); Collections.sort(groupList, new Comparator<GroupEntity>() { @Override public int compare(GroupEntity entity1, GroupEntity entity2) { return entity1.pinyinElement.pinyin.compareToIgnoreCase(entity2.pinyinElement.pinyin); } }); logger.d("group#groupList size:%d", groupList.size()); notifyDataSetChanged(); } public void setContactsData(Map<String, DepartmentEntity> departments, Map<String, ContactEntity> contacts) { // TODO Auto-generated method stub logger.d("contact#setContactsData"); // todo efficiency contactList = new ArrayList<ContactEntity>(contacts.values()); Collections.sort(contactList, new Comparator<ContactEntity>() { @Override public int compare(ContactEntity entity1, ContactEntity entity2) { // TODO Auto-generated method stub if (entity2.pinyinElement.pinyin.startsWith("#")) { return -1; } else if (entity1.pinyinElement.pinyin.startsWith("#")) { return 1; } else { return entity1.pinyinElement.pinyin.compareToIgnoreCase(entity2.pinyinElement.pinyin); } } }); notifyDataSetChanged(); } private String getSectionName(int position) { final ContactEntity contact = contactList.get(position); if (contact == null) { return ""; } String sectionName = ContactUtils.getSectionName(contact); if (position == 0) { return sectionName; } ContactEntity upperContact = contactList.get(position - 1); if (sectionName.equals(ContactUtils.getSectionName(upperContact))) { return ""; } else { return sectionName; } } private String getGroupSectionName(int position) { if (groupList.isEmpty()) { return ""; } if (position == 0) { // todo return "群"; } return ""; } // todo eric private View getViewImpl(View view, String sectionName, String avatarUrl, String name, int sessionType) { logger.d("contactUI#sectionName:%s, avatarUrl:%s, name:%s", sectionName, avatarUrl, name); ViewHolder viewHolder = null; if (view == null) { viewHolder = new ViewHolder(); view = LayoutInflater.from(context).inflate( R.layout.tt_item_contact, null); viewHolder.nameView = (TextView) view .findViewById(R.id.contact_item_title); viewHolder.sectionView = (TextView) view .findViewById(R.id.contact_category_title); viewHolder.avatar = (MGWebImageView) view .findViewById(R.id.contact_portrait); viewHolder.viewType = VIEW_TYPE_GROUP; view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } if (sectionName.isEmpty()) { viewHolder.sectionView.setVisibility(View.GONE); } else { viewHolder.sectionView.setVisibility(View.VISIBLE); viewHolder.sectionView.setText(sectionName); } viewHolder.nameView.setText(name); IMUIHelper.setWebImageViewAvatar(viewHolder.avatar, avatarUrl, sessionType); return view; } private View getGroupView(final int position, View view, ViewGroup arg2) { logger.d("contactUI#getGroupView position:%d", position); GroupEntity group = groupList.get(position); if (group == null) { return null; } return getViewImpl(view, getGroupSectionName(position), group.avatarUrl, group.name, group.type); } public static class PositionInfo { private boolean overflow; private int position; public PositionInfo(boolean overflow, int position) { this.overflow = overflow; this.position = position; } public boolean isOverflow() { return overflow; } public void setOverflow(boolean overflow) { this.overflow = overflow; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } @Override public String toString() { return "PositionInfo [overflow=" + overflow + ", position=" + position + "]"; } } private PositionInfo getListPosition(int position, List<?> entityList) { logger.d("contactUI#getListPosition:%d", position); PositionInfo positionInfo = new PositionInfo(true, 0); if (entityList == null) { logger.d("contactUI#entityList is null"); return positionInfo; } int entitySize = entityList.size(); logger.d("contactUI#entitySize:%d", entitySize); if (position >= entitySize) { logger.d("contactUI#overflow"); positionInfo.setPosition(position - entitySize); return positionInfo; } // right case logger.d("contactUI#not overFlow"); positionInfo.setOverflow(false); positionInfo.setPosition(position); return positionInfo; } private View getContactView(final int position, View view, ViewGroup arg2) { logger.d("contactUI#getContactView position:%d", position); ContactEntity contact = contactList.get(position); if (contact == null) { return null; } return getViewImpl(view, getSectionName(position), contact.avatarUrl, contact.name, IMSession.SESSION_P2P); } public View getView(final int position, View view, ViewGroup arg2) { logger.d("contactUI#getView position:%d", position); PositionInfo pi = getListPosition(position, groupList); logger.d("contactUI#groupPosition:%s", pi); if (!pi.isOverflow()) { return getGroupView(pi.getPosition(), view, arg2); } pi = getListPosition(pi.getPosition(), contactList); logger.d("contactUI#contactPosition:%s", pi); if (!pi.isOverflow()) { return getContactView(pi.getPosition(), view, arg2); } return null; } final static class ViewHolder { TextView sectionView; TextView nameView; MGWebImageView avatar; int viewType; } @Override public Object[] getSections() { return null; } // todo eric make section as a string @Override public int getPositionForSection(int section) { for (int i = 0; i < contactList.size(); ++i) { ContactEntity contact = contactList.get(i); if (contact.pinyinElement.pinyin.charAt(0) == section) { return i; } } logger.e("can't find such section:%d", section); return -1; } public void handleItemClick(Context ctx, int position) { logger.d("contactUI#handleItemClick position:%d", position); PositionInfo pi = getListPosition(position, groupList); logger.d("contactUI#groupPosition:%s", pi); if (!pi.isOverflow()) { handleGroupItemClick(ctx, pi.getPosition()); return; } pi = getListPosition(pi.getPosition(), contactList); logger.d("contactUI#handleItemClick contactPosition:%s", pi); if (!pi.isOverflow()) { handleContactItemClick(ctx, pi.getPosition()); } logger.e("contact#handleItemClick can't find entity -> position:%d", position); } private void handleContactItemClick(Context ctx, int position) { logger.d("contactUI#handleContactItemClick position:%d", position); ContactEntity contact = contactList.get(position); logger.d("chat#clicked contact:%s", contact); IMUIHelper.openContactChatActivity(ctx, contact); } private void handleGroupItemClick(Context ctx, int position) { logger.d("contactUI#handleGroupItemClick position:%d", position); GroupEntity group = groupList.get(position); logger.d("chat#clicked group:%s", group); IMUIHelper.openGroupChatActivity(ctx, group); } @Override public void updateListView(List<ContactSortEntity> list) { // TODO Auto-generated method stub } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public int getSectionForPosition(int arg0) { // TODO Auto-generated method stub return 0; } }