package com.siso.app.chat.ui; 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.siso.app.chat.adapter.ChatAllHistoryAdapter; import com.siso.app.chat.db.InviteMessgeDao; import com.siso.app.ui.MyApplication; import com.siso.app.ui.R; import com.siso.app.ui.common.BaseActionBarActivity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Pair; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; public class ChatAllHistoryActivity extends BaseActionBarActivity { private InputMethodManager inputMethodManager; private ListView listView; private ChatAllHistoryAdapter adapter; public RelativeLayout errorItem; public TextView errorText; private boolean hidden; private List<EMConversation> conversationList = new ArrayList<EMConversation>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat_all_history); initToolbar(getStringByRId(R.string.title_activity_chat_all_history)); if(savedInstanceState != null && savedInstanceState.getBoolean("isConflict", false)) return; inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); errorItem = (RelativeLayout) findViewById(R.id.rl_error_item); errorText = (TextView) errorItem.findViewById(R.id.tv_connect_errormsg); conversationList.addAll(loadConversationsWithRecentChat()); listView = (ListView) findViewById(R.id.list); adapter = new ChatAllHistoryAdapter(this, 1, conversationList); // 设置adapter listView.setAdapter(adapter); 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(MyApplication.getInstance().getUserName())) Toast.makeText(ChatAllHistoryActivity.this, st2, 0).show(); else { // 进入聊天页面 Intent intent = new Intent(ChatAllHistoryActivity.this, ChatActivity.class); if(conversation.isGroup()){ // it is group chat intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP); intent.putExtra("groupId", username); }else{ // it is single chat intent.putExtra("userId", username); } startActivity(intent); } } }); // 注册上下文菜单 registerForContextMenu(listView); listView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 隐藏软键盘 hideSoftKeyboard(); return false; } }); } void hideSoftKeyboard() { if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) { if (getCurrentFocus() != null) inputMethodManager.hideSoftInputFromWindow(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, 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(this); inviteMessgeDao.deleteMessage(tobeDeleteCons.getUserName()); adapter.remove(tobeDeleteCons); adapter.notifyDataSetChanged(); // 更新消息未读数 // updateUnreadLabel(); return handled ? true : super.onContextItemSelected(item); } /** * 刷新页面 */ public void refresh() { conversationList.clear(); conversationList.addAll(loadConversationsWithRecentChat()); if(adapter != null) adapter.notifyDataSetChanged(); } /** * 刷新未读消息数 */ // public void updateUnreadLabel() { // int count = getUnreadMsgCountTotal(); // if (count > 0) { // unreadLabel.setText(String.valueOf(count)); // unreadLabel.setVisibility(View.VISIBLE); // } else { // unreadLabel.setVisibility(View.INVISIBLE); // } // } /** * 获取未读消息数 * * @return */ // public int getUnreadMsgCountTotal() { // int unreadMsgCountTotal = 0; // unreadMsgCountTotal = EMChatManager.getInstance().getUnreadMsgsCount(); // return unreadMsgCountTotal; // } /** * 获取所有会话 * * @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) { 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 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // refresh(); } @Override public void onResume() { super.onResume(); refresh(); } }