/**
\ * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hx.hxchat.activity;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v4.app.Fragment;
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.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
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.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMContact;
import com.easemob.chat.EMConversation;
import com.easemob.chat.EMGroup;
import com.easemob.chat.EMGroupManager;
import com.easemob.chat.EMMessage;
import com.google.gson.Gson;
import com.hx.hxchat.adapter.ChatHistoryAdapter;
import com.hx.hxchat.db.InviteMessgeDao;
import com.hx.hxchat.db.LinkerDao;
import com.hx.hxchat.db.TopUserDao;
import com.hx.hxchat.db.UserDao;
import com.hx.hxchat.domain.TopUser;
import com.hx.hxchat.domain.User;
import com.hx.hxchat.domain.UserFriendBean.Items;
import com.hx.hxchat.interfaces.isLoadDataListener;
import com.hx.hxchat.utils.CommonUtils;
import com.hx.hxchat.utils.UserUtils;
import com.mgw.member.R;
import com.mgw.member.manager.BaseApplication;
import com.mgw.member.ottoEvent.FragmentNeedRefreshEvent;
import com.mgw.member.ui.activity.MainActivity;
import com.mgw.member.uitls.LogUtils;
import com.squareup.otto.Subscribe;
/**
* 聊天记录Fragment
*
*/
public class ChatHistoryFragment extends Fragment {
private static final String TAG = ChatHistoryFragment.class.getSimpleName();
private InputMethodManager inputMethodManager;
private ListView listView;
private Context context;
private Map<String, User> contactList;
private ChatHistoryAdapter adapter;
public RelativeLayout errorItem;
public TextView errorText;
private boolean hidden;
private boolean onPostExecuting = false;
private Gson gson;
private Dialog progressDialog;
private List<EMContact> m_EmContacts;
private Vibrator vibrator;
//置顶消息 start
private List<EMContact> top_lists = new ArrayList<EMContact>();
private Map<String, TopUser> topMap;
//置顶消息 end
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Toast.makeText(context, "ssssssssssssss",
// Toast.LENGTH_SHORT).show();
errorItem.setVisibility(View.GONE);
}
};
@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);
context = getActivity();
gson = new Gson();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("ishxlogined");
getActivity().registerReceiver(myReceiver, intentFilter);
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);
// contact list
progressDialog = CommonUtils.getUserDefinedDialog(context, "正在为你卖命加载...", false, true);
listView = (ListView) getView().findViewById(R.id.list);
// 注册上下文菜单
initData();
}
private void initData() {
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
EMContact emContact = adapter.getItem(position);
if (adapter.getItem(position).getUsername().equals(BaseApplication.getApplication().getUserName()))
Toast.makeText(getActivity(), "不能和自己聊天", 0).show();
else {
if (EMChatManager.getInstance().isConnected()) {
// 进入聊天页面
Intent intent = new Intent(getActivity(), ChatActivity.class);
if (emContact instanceof EMGroup) {
// it is group chat
intent.putExtra("chatType", ChatActivity.CHATTYPE_GROUP);
intent.putExtra("groupId", ((EMGroup) emContact).getGroupId());
} else {
// it is single chat
intent.putExtra("userId", emContact.getUsername());
intent.putExtra("userName", emContact.getNick());
// intent.putExtra("userId",
// adapter.m_User_s.get(position).getM_name());
}
startActivity(intent);
} else {
BaseApplication.getApplication().isHxLogined = false;
// BaseApplication.getApplication().Hxlogin();
Toast.makeText(getActivity(), "正在连接服务器,请稍后", 0).show();
}
}
}
});
// 隐藏输入法
listView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 隐藏软键盘
if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
if (getActivity().getCurrentFocus() != null)
inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
return false;
}
});
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if(vibrator==null)
vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
long[] pattern={100,100};
vibrator.vibrate(30);
String title="";
EMContact item = adapter.getItem(position);
if(item instanceof EMGroup){
title=((EMGroup) item).getGroupName();
}else{
title= item.getNick();
}
showMyDialog(title, adapter, position);
return false;
}
});
// registerForContextMenu(listView);
if (!CommonUtils.isNetWorkConnected(context)) {
return;
}
// (数据拿到了)
new GetDataAcyncTask().execute();
setLoadDataComplete(new isLoadDataListener() {
@Override
public void loadStart() {
onPostExecuting = true;
if (!progressDialog.isShowing() && !hidden) {
// progressDialog.show();
}
}
@Override
public void loadComplete() {
onPostExecuting = false;
if (progressDialog.isShowing() && !hidden) {
// progressDialog.dismiss();
}
}
@Override
public void progress(int progress) {
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// if (((AdapterContextMenuInfo) menuInfo).position > 0) {
getActivity().getMenuInflater().inflate(R.menu.delete_message, menu);
// }
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == R.id.delete_message) {
EMContact tobeDeleteUser = adapter.getItem(((AdapterContextMenuInfo) item.getMenuInfo()).position);
boolean isGroup = false;
if (tobeDeleteUser instanceof EMGroup)
isGroup = true;
// 删除此会话
boolean deleteConversation = EMChatManager.getInstance().deleteConversation(tobeDeleteUser.getUsername());
InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(getActivity());
inviteMessgeDao.deleteMessage(tobeDeleteUser.getUsername());
BaseApplication.getApplication().GetLinkerDao().deleteContact(tobeDeleteUser.getUsername());
adapter.remove(tobeDeleteUser);
adapter.notifyDataSetChanged();
// 更新消息未读数
// TODO
// ((MainActivity) getActivity()).updateUnreadLabel();
return true;
}
return super.onContextItemSelected(item);
}
/**
* 刷新页面(获取数据)
*/
public void refresh() {
if (!onPostExecuting) {
new GetDataAcyncTask().execute();
}
}
/**
* 刷新页面()
*/
public void refreshNoDialog() {
if (!onPostExecuting) {
new GetDataAcyncTask().execute();
}
}
/**
* 获取有聊天记录的users和groups
*
* @param context
* @return
*/
private List<EMContact> loadUsersWithRecentChat() {
topMap = BaseApplication.getApplication().getTopUserList();
// =========没聊天页显示在上面
Map<String, User> linkcontactList = BaseApplication.getApplication().GetLinkerDao().getContactList();
List<EMContact> resultList = new ArrayList<EMContact>();
List<EMContact> topList = new ArrayList<EMContact>();
// 包含陌生人的会话
if (EMChatManager.getInstance().isConnected()) {
Hashtable<String, EMConversation> conversations = EMChatManager.getInstance().getAllConversations();
Enumeration<String> keys = conversations.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
LogUtils.i(TAG, "nextElement"+key);
EMConversation emConversation = conversations.get(key);
if (emConversation!=null&&!linkcontactList.containsKey(emConversation.getUserName())) {
// if("admin".equals(emConversation.getUserName())){
// String admin="00001";
//
//
//// if (!BaseApplication.getApplication().GetLinkerDao().containsKey(admin)) {
//// User user1=new User(admin);
//// BaseApplication.getApplication().GetLinkerDao().saveContact(user1);
//// linkcontactList.put(user1.getUsername(), user1);
//// }else{
//// User contact = BaseApplication.getApplication().GetLinkerDao().getContact(admin);
//// linkcontactList.put(contact.getUsername(), contact);
//// }
////
// linkcontactList.put("admin", new User("admin"));
//
// }else{
User user = UserUtils.getUseFromNet(emConversation.getUserName());
if (user != null) {
user.setLinkcache("0");
if (!BaseApplication.getApplication().GetLinkerDao().containsKey(user.getUsername())) {
BaseApplication.getApplication().GetLinkerDao().saveContact(user);
}
linkcontactList.put(user.getUsername(), user);
}
// }
}else if(emConversation!=null&&linkcontactList.containsKey(emConversation.getUserName())&&"1".equals(linkcontactList.get(emConversation.getUserName()).getLinkcache())){
User user = linkcontactList.get(emConversation.getUserName());
user.setLinkcache("0");
BaseApplication.getApplication().GetLinkerDao().updateContact(user);
}
}
}
// 将好友会话和临时会话存入返回
for (User user : linkcontactList.values()) {
if ((!("1".equals(user.getLinkcache())))&&(!topMap.containsKey(user.getUsername()))) {
resultList.add(user);
}else if((topMap.containsKey(user.getUsername()))){
topList.add(user);
}
}
for (EMGroup group : EMGroupManager.getInstance().getAllGroups()) {
EMConversation conversation = EMChatManager.getInstance().getConversation(group.getGroupId());
if (conversation.getMsgCount() > 0) {
if(!topMap.containsKey(group.getGroupId())){
resultList.add(group);
}else{
topList.add(group);
}
}
}
top_lists.clear();
top_lists.addAll(topList);
// 排序
sortUserByLastChatTime(resultList);
sortUserByLastChatTime(top_lists);
return resultList;
}
/**
* 根据最后一条消息的时间排序
*
* @param usernames
*/
private void sortUserByLastChatTime(List<EMContact> contactList) {
Collections.sort(contactList, new Comparator<EMContact>() {
@Override
public int compare(final EMContact user1, final EMContact user2) {
EMConversation conversation1 = EMChatManager.getInstance().getConversation(user1.getUsername());
EMConversation conversation2 = EMChatManager.getInstance().getConversation(user2.getUsername());
EMMessage user2LastMessage = conversation2.getLastMessage();
if (user2LastMessage == null) {
return -1;
}
EMMessage user1LastMessage = conversation1.getLastMessage();
if (user1LastMessage == null) {
return -1;
}
if (user2LastMessage.getMsgTime() == user1LastMessage.getMsgTime()) {
return 0;
} else if (user2LastMessage.getMsgTime() > user1LastMessage.getMsgTime()) {
return 1;
} else {
return -1;
}
}
});
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
this.hidden = hidden;
if (!hidden) {
refresh();
}
// String string = getActivity().getSharedPreferences("mgw_data",
// 0).getString("mgw_data", "d");
if (!EMChatManager.getInstance().isConnected()) {
// BaseApplication.getApplication().Hxlogin();
}
}
@Override
public void onResume() {
super.onResume();
if (!hidden) {
refresh();
}
if (errorItem.getVisibility() == View.VISIBLE) {
}
}
public class GetDataAcyncTask extends AsyncTask<Object, Void, List<Items>> {
@Override
protected void onPreExecute() {
onPostExecuting = true;
if (loadLisneter != null) {
loadLisneter.loadStart();
}
contactList = BaseApplication.getApplication().getContactList();
}
@Override
protected List<Items> doInBackground(Object... params) {
List<Items> m_User_s = new ArrayList<Items>();
m_EmContacts = loadUsersWithRecentChat();
// for(EMContact dd: m_EmContacts){
// System.out.println(dd.getEid()+dd.getNick()+dd.getUsername());
// }
//
// TODO 可能出现ConcurrentModificationException
for (EMContact dd : m_EmContacts) {
UserDao dao = new UserDao(context);
User user = dao.getContact(dd.getUsername());
if (user != null) {
m_User_s.add(new Items(user.getUsername(), user.getNick(), user.getAvatar()));
} else {
LinkerDao linkerDao = new LinkerDao(context);
User user2 = linkerDao.getContact(dd.getUsername());
if (user2 == null) {
User user3 = UserUtils.getUseFromNet(dd.getUsername());
if (user3 == null) {
m_User_s.add(new Items(dd.getUsername(), dd.getUsername(), ""));
} else {
m_User_s.add(new Items(user3.getUsername(), user3.getNick(), user3.getAvatar()));
}
} else {
m_User_s.add(new Items(user2.getUsername(), user2.getNick(), user2.getAvatar()));
}
}
// Log.i("chath", user.toString());
}
//
return m_User_s;
}
@Override
protected void onPostExecute(List<Items> result) {
if (m_EmContacts == null) {
m_EmContacts = loadUsersWithRecentChat();
}
adapter = new ChatHistoryAdapter(MainActivity.mainActivity, R.layout.row_chat_history, m_EmContacts, result,top_lists);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
if (loadLisneter != null) {
loadLisneter.loadComplete();
}
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
// 声明这一接口变量
private isLoadDataListener loadLisneter;
// 给接口赋值,得到接口对象
public void setLoadDataComplete(isLoadDataListener dataComplete) {
this.loadLisneter = dataComplete;
}
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@Override
public void onDestroy() {
// TODO Auto-generated m
super.onDestroy();
if (myReceiver != null)
getActivity().unregisterReceiver(myReceiver);
}
/**
*
* @param title 标题
* @param emContact
*/
private void showMyDialog(String title,final ChatHistoryAdapter adapter,final int position) {
final AlertDialog dlg = new AlertDialog.Builder(context).create();
dlg.show();
Window window = dlg.getWindow();
// 设置窗口的内容页面,shrew_exit_dialog.xml文件中定义view内容
window.setContentView(R.layout.alertdialog);
window.findViewById(R.id.ll_title).setVisibility(View.VISIBLE);
TextView tv_title = (TextView) window.findViewById(R.id.tv_title);
tv_title.setText(title);
TextView tv_content1 = (TextView) window.findViewById(R.id.tv_content1);
final String username = adapter.getItem(position).getUsername();
// 是否已经置顶
if (topMap.containsKey(username)) {
tv_content1.setText("取消置顶");
} else {
tv_content1.setText("置顶聊天");
}
tv_content1.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SdCardPath")
public void onClick(View v) {
if (topMap.containsKey(username)) {
topMap.remove(username);
TopUserDao topUserDao = new TopUserDao(context);
topUserDao.deleteTopUser(username);
} else {
TopUser topUser = new TopUser();
topUser.setTime(System.currentTimeMillis());
// 1---表示是群组
topUser.setType(1);
topUser.setUserName(username);
Map<String, TopUser> map = new HashMap<String, TopUser>();
map.put(adapter.getItem(position).getUsername(), topUser);
topMap.putAll(map);
TopUserDao topUserDao = new TopUserDao(context);
topUserDao.saveTopUser(topUser);
}
refresh();
dlg.cancel();
}
});
TextView tv_content2 = (TextView) window.findViewById(R.id.tv_content2);
tv_content2.setText("删除该聊天");
tv_content2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EMContact tobeDeleteUser = adapter.getItem(position);
EMChatManager.getInstance().deleteConversation(adapter.getItem(position).getUsername());
InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(context);
inviteMessgeDao.deleteMessage(tobeDeleteUser.getUsername());
BaseApplication.getApplication().GetLinkerDao().deleteContact(tobeDeleteUser.getUsername());
adapter.remove(tobeDeleteUser);
adapter.notifyDataSetChanged();
// ((MainActivity) context).homefragment.refresh();
// boolean isGroup = false;
//
//
// if (tobeDeleteUser instanceof EMGroup)
// isGroup = true;
//
// // 删除此会话
// boolean deleteConversation = EMChatManager.getInstance().deleteConversation(tobeDeleteUser.getUsername());
// InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(getActivity());
// inviteMessgeDao.deleteMessage(tobeDeleteUser.getUsername());
//
// BaseApplication.getApplication().GetLinkerDao().deleteContact(tobeDeleteUser.getUsername());
// adapter.remove(tobeDeleteUser);
// adapter.notifyDataSetChanged();
//
// // 更新消息未读数
// // TODO
// // ((MainActivity) getActivity()).updateUnreadLabel();
//
//
//
dlg.cancel();
}
});
}
/**
* 刷新adapter的消费者
* @param fragmentNeedRefreshEvent
*/
@Subscribe
public void FragmentNeedRefreshEvent(FragmentNeedRefreshEvent fragmentNeedRefreshEvent) {
if(TAG.equals(fragmentNeedRefreshEvent.getFragmentName())){
refresh();
LogUtils.i("otto", TAG+",refresh");
}
}
}