package com.easemob.chatuidemo.activity; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Hashtable; import java.util.List; import com.easemob.chat.EMChatManager; import com.easemob.chat.EMConversation; import com.easemob.chat.EMConversation.EMConversationType; import com.easemob.chatuidemo.Constant; import com.easemob.chatuidemo.DemoApplication; import com.easemob.chatuidemo.adapter.ChatAllHistoryAdapter; import com.easemob.chatuidemo.db.InviteMessgeDao; import com.sxit.dreamiya.R; import com.sxit.dreamiya.activity.chat.ContactActivity; import com.sxit.dreamiya.utils.SOAP_UTILS; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; import android.util.Pair; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; /** * 显示所有会话记录,比较简单的实现,更好的可能是把陌生人存入本地,这样取到的聊天记录是可控的 * */ public class ChatAllHistoryFragment extends Fragment implements View.OnClickListener { private InputMethodManager inputMethodManager; private ListView listView; private ChatAllHistoryAdapter adapter; private EditText query; private ImageButton clearSearch; public RelativeLayout errorItem; public TextView errorText; private boolean hidden; private List<EMConversation> conversationList = new ArrayList<EMConversation>(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_conversation_history, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(savedInstanceState != null && savedInstanceState.getBoolean("isConflict", false)) return; inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); errorItem = (RelativeLayout) getView().findViewById(R.id.rl_error_item); errorText = (TextView) errorItem.findViewById(R.id.tv_connect_errormsg); conversationList.addAll(loadConversationsWithRecentChat()); listView = (ListView) getView().findViewById(R.id.list); adapter = new ChatAllHistoryAdapter(getActivity(), 1, conversationList, listView); // 设置adapter listView.setAdapter(adapter); Button group_bt = (Button) getView().findViewById(R.id.group_bt); Button contact_bt = (Button) getView().findViewById(R.id.contact_bt); group_bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(getActivity(), GroupsActivity.class); startActivity(intent); } }); contact_bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(getActivity(), ContactActivity.class); startActivity(intent); } }); final String st2 = getResources().getString(R.string.Cant_chat_with_yourself); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { EMConversation conversation = adapter.getItem(position); String username = conversation.getUserName(); if (username.equals(DemoApplication.getInstance().getUserName())) Toast.makeText(getActivity(), st2, 0).show(); else { // 进入聊天页面 Intent intent = new Intent(getActivity(), ChatActivity.class); if(conversation.isGroup()){ if(conversation.getType() == EMConversationType.ChatRoom){ // it is group chat intent.putExtra("chatType", ChatActivity.CHATTYPE_CHATROOM); intent.putExtra("groupId", username); }else{ // it is group chat intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP); intent.putExtra("groupId", username); } }else{ // it is single chat intent.putExtra("userId", username); } String name = SplashActivity.userinfo.getRealName(); String pic = SplashActivity.userinfo.getHeadPic(); String conversation_name = conversation.getLastMessage().getStringAttribute("name", ""); String toname = ""; String topic = ""; if(conversation_name.equals(name)){ toname = conversation.getLastMessage().getStringAttribute("toname", ""); topic = conversation.getLastMessage().getStringAttribute("topic", ""); }else{ toname = conversation.getLastMessage().getStringAttribute("name", ""); topic = conversation.getLastMessage().getStringAttribute("pic", ""); } intent.putExtra("Realname", toname); intent.putExtra("name", name); intent.putExtra("toname", toname); intent.putExtra("pic", SOAP_UTILS.PIC_FILE + pic); intent.putExtra("topic", topic); startActivity(intent); } } }); // 注册上下文菜单 registerForContextMenu(listView); listView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 隐藏软键盘 hideSoftKeyboard(); return false; } }); // 搜索框 query = (EditText) getView().findViewById(R.id.query); String strSearch = getResources().getString(R.string.search); query.setHint(strSearch); // 搜索框中清除button clearSearch = (ImageButton) getView().findViewById(R.id.search_clear); query.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { adapter.getFilter().filter(s); if (s.length() > 0) { clearSearch.setVisibility(View.VISIBLE); } else { clearSearch.setVisibility(View.INVISIBLE); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } }); clearSearch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { query.getText().clear(); hideSoftKeyboard(); } }); } void hideSoftKeyboard() { if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) { if (getActivity().getCurrentFocus() != null) inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); // if(((AdapterContextMenuInfo)menuInfo).position > 0){ m, getActivity().getMenuInflater().inflate(R.menu.delete_message, menu); // } } @Override public boolean onContextItemSelected(MenuItem item) { boolean handled = false; boolean deleteMessage = false; if (item.getItemId() == R.id.delete_message) { deleteMessage = true; handled = true; } else if (item.getItemId() == R.id.delete_conversation) { deleteMessage = false; handled = true; } EMConversation tobeDeleteCons = adapter.getItem(((AdapterContextMenuInfo) item.getMenuInfo()).position); // 删除此会话 EMChatManager.getInstance().deleteConversation(tobeDeleteCons.getUserName(), tobeDeleteCons.isGroup(), deleteMessage); InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(getActivity()); inviteMessgeDao.deleteMessage(tobeDeleteCons.getUserName()); adapter.remove(tobeDeleteCons); adapter.notifyDataSetChanged(); // 更新消息未读数 ((MainActivity) getActivity()).updateUnreadLabel(); return handled ? true : super.onContextItemSelected(item); } /** * 刷新页面 */ public void refresh() { conversationList.clear(); conversationList.addAll(loadConversationsWithRecentChat()); if(adapter != null) adapter.notifyDataSetChanged(); } /** * 获取所有会话 * * @param context * @return + */ private List<EMConversation> loadConversationsWithRecentChat() { // 获取所有会话,包括陌生人 Hashtable<String, EMConversation> conversations = EMChatManager.getInstance().getAllConversations(); // 过滤掉messages size为0的conversation /** * 如果在排序过程中有新消息收到,lastMsgTime会发生变化 * 影响排序过程,Collection.sort会产生异常 * 保证Conversation在Sort过程中最后一条消息的时间不变 * 避免并发问题 */ List<Pair<Long, EMConversation>> sortList = new ArrayList<Pair<Long, EMConversation>>(); synchronized (conversations) { for (EMConversation conversation : conversations.values()) { if (conversation.getAllMessages().size() != 0) { //if(conversation.getType() != EMConversationType.ChatRoom){ sortList.add(new Pair<Long, EMConversation>(conversation.getLastMessage().getMsgTime(), conversation)); //} } } } try { // Internal is TimSort algorithm, has bug sortConversationByLastChatTime(sortList); } catch (Exception e) { e.printStackTrace(); } List<EMConversation> list = new ArrayList<EMConversation>(); for (Pair<Long, EMConversation> sortItem : sortList) { list.add(sortItem.second); } return list; } /** * 根据最后一条消息的时间排序 * * @param usernames */ private void sortConversationByLastChatTime(List<Pair<Long, EMConversation>> conversationList) { Collections.sort(conversationList, new Comparator<Pair<Long, EMConversation>>() { @Override public int compare(final Pair<Long, EMConversation> con1, final Pair<Long, EMConversation> con2) { if (con1.first == con2.first) { return 0; } else if (con2.first > con1.first) { return 1; } else { return -1; } } }); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); this.hidden = hidden; if (!hidden) { refresh(); } } @Override public void onResume() { super.onResume(); if (!hidden && ! ((MainActivity)getActivity()).isConflict) { refresh(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if(((MainActivity)getActivity()).isConflict){ outState.putBoolean("isConflict", true); }else if(((MainActivity)getActivity()).getCurrentAccountRemoved()){ outState.putBoolean(Constant.ACCOUNT_REMOVED, true); } } @Override public void onClick(View v) { } }