package com.mogujie.tt.ui.fragment;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.mogujie.tt.R;
import com.mogujie.tt.adapter.EntityListViewAdapter;
import com.mogujie.tt.adapter.EntityListViewAdapter.ViewHolder;
import com.mogujie.tt.adapter.GroupManagerAdapter;
import com.mogujie.tt.adapter.GroupManagerAdapter.OnDeleteItemListener;
import com.mogujie.tt.config.SysConstant;
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.service.IMService;
import com.mogujie.tt.imlib.utils.IMUIHelper;
import com.mogujie.tt.ui.base.TTBaseFragment;
import com.mogujie.tt.ui.utils.EntityList;
import com.mogujie.tt.ui.utils.IMGroupMemberGridViewHelper;
import com.mogujie.tt.ui.utils.IMServiceHelper;
import com.mogujie.tt.ui.utils.IMServiceHelper.OnIMServiceListner;
import com.mogujie.tt.utils.ContactUtils;
import com.mogujie.tt.widget.SearchEditText;
import com.mogujie.tt.widget.SortSideBar;
import com.mogujie.tt.widget.SortSideBar.OnTouchingLetterChangedListener;
public class GroupMemberSelectFragment extends TTBaseFragment
implements
OnIMServiceListner,
OnTouchingLetterChangedListener {
@Override
public void onDestroyView() {
imServiceHelper.disconnect(getActivity());
// TODO Auto-generated method stub
super.onDestroyView();
}
private View curView = null;
private ListView contactListView;
private IMServiceHelper imServiceHelper = new IMServiceHelper();
private IMService imService;
private IMGroupMemberGridViewHelper gridViewHelper = new IMGroupMemberGridViewHelper();
private EntityListViewAdapter contactAdapter;
private SortSideBar sortSideBar;
private TextView dialog;
private SearchEditText searchEditText;
private IMUIHelper.SessionInfo sessionInfo;
private EntityList entityList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (null != curView) {
((ViewGroup) curView.getParent()).removeView(curView);
return curView;
}
curView = inflater.inflate(R.layout.tt_fragment_group_member_select, topContentView);
List<String> actions = new ArrayList<String>();
actions.add(IMActions.ACTION_GROUP_CREATE_TEMP_GROUP_RESULT);
actions.add(IMActions.ACTION_GROUP_CHANGE_TEMP_GROUP_MEMBER_RESULT);
imServiceHelper.connect(getActivity(), actions, IMServiceHelper.INTENT_NO_PRIORITY, this);
initRes();
return curView;
}
/**
* @Description 初始化资源
*/
private void initRes() {
// 设置标题栏
// todo eric
setTopTitle("编辑群联系人");
setTopLeftButton(R.drawable.tt_top_back);
setTopLeftText(getActivity().getString(R.string.top_left_back));
setTopRightText(getActivity().getString(R.string.save));
topLeftBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().finish();
}
});
topRightTitleTxt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
logger.d("tempgroup#on 'save' btn clicked");
IMGroupManager groupMgr = imService.getGroupManager();
GroupManagerAdapter adapter = gridViewHelper.getAdapter();
int sessionType = GroupMemberSelectFragment.this.sessionInfo.getSessionType();
if (sessionType == IMSession.SESSION_P2P) {
List<String> memberList = adapter.getMemberList();
String loginId = imService.getLoginManager().getLoginId();
logger.d("tempgroup#loginId:%s", loginId);
memberList.add(0, loginId);
logger.d("tempgroup#memberList size:%d", memberList.size());
for (String id : memberList) {
logger.d("tempgroup#member:%s", id);
}
String tempGroupName = generateTempGroupName(memberList);
logger.d("tempgroup#generateTempGroupName:%s", tempGroupName);
groupMgr.reqCreateTempGroup(tempGroupName, memberList);
} else if (sessionType == IMSession.SESSION_TEMP_GROUP) {
List<String> addingMemberList = gridViewHelper.getAdapter().getAddingMemberList();
List<String> removingMemberList = gridViewHelper.getAdapter().getRemovingMemberList();
imService.getGroupManager().changeTempGroupMembers(sessionInfo.getSessionId(), addingMemberList, removingMemberList);
}
}
private String generateTempGroupName(List<String> memberList) {
int MAX_NAME_PREFIX_LEN = 15;
String name = "";
IMContactManager contactMgr = imService.getContactManager();
ContactEntity prevContact = null;
for (String id : memberList) {
ContactEntity contact = contactMgr.findContact(id);
if (contact == null) {
continue;
}
logger.d("tempgroup#member contact:%s", contact);
if (prevContact != null) {
name += "," + contact.name;
} else {
// first element
name += contact.name;
}
if (name.length() >= MAX_NAME_PREFIX_LEN) {
name = name.substring(0, MAX_NAME_PREFIX_LEN);
name += "...";
break;
}
prevContact = contact;
}
return name;
}
});
sortSideBar = (SortSideBar) curView.findViewById(R.id.sidrbar);
sortSideBar.setOnTouchingLetterChangedListener(this);
dialog = (TextView) curView.findViewById(R.id.dialog);
sortSideBar.setTextView(dialog);
contactListView = (ListView) curView.findViewById(R.id.all_contact_list);
contactAdapter = new EntityListViewAdapter(getActivity());
contactAdapter.showCheckbox();
contactListView.setAdapter(contactAdapter);
contactAdapter.initClickEvents(contactListView);
searchEditText = (SearchEditText) curView.findViewById(R.id.filter_edit);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
contactAdapter.onSearch(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
gridViewHelper.onInit(curView, R.id.group_manager_grid, getActivity(), false, null, new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
gridViewHelper.getAdapter().setRemoveState(true);
gridViewHelper.getAdapter().notifyDataSetChanged();
return false;
}
}, new OnDeleteItemListener() {
@Override
public void onDeleteItem(String contactId) {
((BaseAdapter) contactListView.getAdapter()).notifyDataSetChanged();
}
});
}
private void initContactList(Set<String> removedIdSet) {
Map<String, ContactEntity> contacts = imService.getContactManager().getContacts();
List<Object> contactList = IMUIHelper.getContactSortedList(contacts);
List<Object> finalContactList = new ArrayList<Object>();
for (Object obj : contactList) {
ContactEntity contact = (ContactEntity) obj;
if (contact == null) {
continue;
}
if (removedIdSet.contains(contact.id)) {
continue;
}
finalContactList.add(obj);
}
entityList = new EntityList(finalContactList) {
@Override
public boolean shouldCheckBoxChecked(int position) {
ContactEntity contact = (ContactEntity) list.get(position);
if (contact == null) {
return false;
}
return gridViewHelper.getAdapter().isInGroup(contact.id);
}
@Override
public void onItemClick(Context ctx, View view, int position) {
// TODO Auto-generated method stub
handleContactItemClick(view, GroupMemberSelectFragment.this.getActivity(), position);
}
private void handleContactItemClick(View view, Context ctx,
int position) {
logger.d("contactUI#handleContactItemClick position:%d", position);
ContactEntity contact = (ContactEntity) list.get(position);
logger.d("chat#clicked contact:%s", contact);
ViewHolder viewHolder = (ViewHolder) view.getTag();
if (viewHolder == null) {
return;
}
viewHolder.checkBox.toggle();
boolean checked = viewHolder.checkBox.isChecked();
if (checked) {
gridViewHelper.getAdapter().add(contact);
} else {
gridViewHelper.getAdapter().removeById(contact.id);
}
}
@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);
}
@Override
public void onAction(String action, Intent intent,
BroadcastReceiver broadcastReceiver) {
// TODO Auto-generated method stub
if (action.equals(IMActions.ACTION_GROUP_CREATE_TEMP_GROUP_RESULT)) {
handleAddTempGroupResult(intent);
} else if (action.equals(IMActions.ACTION_GROUP_CHANGE_TEMP_GROUP_MEMBER_RESULT)) {
handleChangeTempGroupMemberResult(intent);
}
}
private void handleChangeTempGroupMemberResult(Intent intent) {
logger.d("tempgroup#handleChangeTempGroupMemberResult");
boolean ok = intent.getBooleanExtra(SysConstant.OPERATION_RESULT_KEY, false);
if (!ok) {
Toast.makeText(getActivity(), getString(R.string.change_temp_group_member_failed), Toast.LENGTH_SHORT).show();
return;
}
String sessionId = intent.getStringExtra(SysConstant.SESSION_ID_KEY);
logger.d("tempgroup#result ok, sessionId:%s", sessionId);
//todo eric adding an notification to the chat window, tell that "members are changed, right now, members are 'a', 'b', 'c' "
IMUIHelper.openSessionChatActivity(logger, getActivity(), sessionId, IMSession.SESSION_TEMP_GROUP, imService);
getActivity().finish();
}
private void handleAddTempGroupResult(Intent intent) {
logger.d("groupmgr#on ACTION_GROUP_CREATE_TEMP_GROUP_RESULT");
int result = intent.getIntExtra(SysConstant.OPERATION_RESULT_KEY, -1);
if (result != 0) {
logger.d("groupmgr#result failed");
Toast.makeText(getActivity(), getString(R.string.create_temp_group_failed), Toast.LENGTH_SHORT).show();
return;
}
String sessionId = intent.getStringExtra(SysConstant.SESSION_ID_KEY);
logger.d("groupmgr#result ok");
IMUIHelper.openSessionChatActivity(logger, getActivity(), sessionId, IMSession.SESSION_TEMP_GROUP, imService);
getActivity().finish();
}
@Override
public void onIMServiceConnected() {
// TODO Auto-generated method stub
logger.d("groupmgr#onIMServiceConnected");
imService = imServiceHelper.getIMService();
Intent intent = getActivity().getIntent();
sessionInfo = IMUIHelper.getSessionInfoFromIntent(intent);
Set<String> removedIdSet = new HashSet<String>();
removedIdSet.add(imService.getLoginManager().getLoginId());
int sessionType = sessionInfo.getSessionType();
if (sessionType == IMSession.SESSION_P2P) {
removedIdSet.add(sessionInfo.getSessionId());
}
gridViewHelper.getAdapter().setFixIdSet(removedIdSet);
gridViewHelper.onSetGridData(imService, intent);
initContactList(removedIdSet);
}
@Override
protected void initHandler() {
// TODO Auto-generated method stub
}
@Override
public void onTouchingLetterChanged(String s) {
// TODO Auto-generated method stub
int position = contactAdapter.getPositionForSection(s.charAt(0));
if (position != -1) {
contactListView.setSelection(position);
}
}
}