XChatManager.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. package com.xzjmyk.pm.activity.xmpp;
  2. import android.text.TextUtils;
  3. import android.util.Log;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.xzjmyk.pm.activity.bean.message.NewFriendMessage;
  7. import com.xzjmyk.pm.activity.db.dao.FriendDao;
  8. import com.xzjmyk.pm.activity.db.dao.NewFriendDao;
  9. import com.xzjmyk.pm.activity.util.DateFormatUtil;
  10. import com.xzjmyk.pm.activity.xmpp.util.XmppStringUtil;
  11. import com.xzjmyk.pm.activity.MyApplication;
  12. import com.xzjmyk.pm.activity.bean.Friend;
  13. import com.xzjmyk.pm.activity.bean.message.ChatMessage;
  14. import com.xzjmyk.pm.activity.bean.message.XmppMessage;
  15. import com.xzjmyk.pm.activity.broadcast.CardcastUiUpdateUtil;
  16. import com.xzjmyk.pm.activity.broadcast.MsgBroadcast;
  17. import com.xzjmyk.pm.activity.broadcast.MucgroupUpdateUtil;
  18. import com.xzjmyk.pm.activity.db.dao.ChatMessageDao;
  19. import com.xzjmyk.pm.activity.helper.FriendHelper;
  20. import com.xzjmyk.pm.activity.util.ThreadManager;
  21. import com.xzjmyk.pm.activity.util.TimeUtils;
  22. import com.xzjmyk.pm.activity.xmpp.listener.ChatMessageListener;
  23. import org.jivesoftware.smack.Chat;
  24. import org.jivesoftware.smack.ChatManager;
  25. import org.jivesoftware.smack.ChatManagerListener;
  26. import org.jivesoftware.smack.MessageListener;
  27. import org.jivesoftware.smack.PacketListener;
  28. import org.jivesoftware.smack.SmackException.NotConnectedException;
  29. import org.jivesoftware.smack.XMPPConnection;
  30. import org.jivesoftware.smack.filter.PacketFilter;
  31. import org.jivesoftware.smack.packet.Message;
  32. import org.jivesoftware.smack.packet.Packet;
  33. import org.jivesoftware.smack.util.StringUtils;
  34. import org.jivesoftware.smackx.receipts.DeliveryReceiptManager;
  35. import java.util.HashMap;
  36. import java.util.Map;
  37. import java.util.UUID;
  38. public class XChatManager {
  39. // private static final String TAG = XChatManager.class.getSimpleName();
  40. private XMPPConnection mConnection;
  41. private ChatManager mChatManager;
  42. private String mLoginUserId;
  43. private String mServerName;
  44. private Map<String, Chat> mChatMaps = new HashMap<String, Chat>();
  45. private CoreService mService;
  46. /**
  47. * @注释:参数是service和connection
  48. */
  49. public XChatManager(CoreService service, XMPPConnection connection) {
  50. mService = service;
  51. mConnection = connection;
  52. mConnection.addPacketListener(packetListener, packetFilter);
  53. mLoginUserId = StringUtils.parseName(mConnection.getUser());
  54. mServerName = mConnection.getServiceName();
  55. mChatManager = ChatManager.getInstanceFor(mConnection);
  56. mChatManager.setNormalIncluded(true);// 包含普通的消息
  57. CardcastUiUpdateUtil.broadcastUpdateUi(mService);
  58. mChatManager.addChatListener(new ChatManagerListener() {
  59. @Override
  60. public void chatCreated(Chat arg0, boolean arg1) {
  61. String userId = StringUtils.parseName(arg0.getParticipant());
  62. Chat existChat = mChatMaps.get(userId);
  63. if (existChat == arg0) {
  64. Log.d("roamer", "existChat == arg0");
  65. return;
  66. }
  67. if (existChat != null) {
  68. existChat.removeMessageListener(mMessageListener);
  69. existChat.close();
  70. }
  71. mChatMaps.put(userId, arg0);
  72. arg0.addMessageListener(mMessageListener);//添加消息监听
  73. }
  74. });
  75. }
  76. /**
  77. * @desc: 监听
  78. * @author:Administrator on 2016/3/15 16:24
  79. */
  80. PacketListener packetListener = new PacketListener() {
  81. @Override
  82. public void processPacket(Packet arg0) throws NotConnectedException {
  83. Message message = (Message) arg0;
  84. String from = message.getFrom();
  85. String to = message.getTo();
  86. }
  87. };
  88. PacketFilter packetFilter = new PacketFilter() {
  89. @Override
  90. public boolean accept(Packet arg0) {
  91. if (arg0 instanceof Message) {
  92. Message message = (Message) arg0;
  93. if (message.getType() == Message.Type.chat) {
  94. return true;
  95. }
  96. return false;
  97. } else {
  98. return false;
  99. }
  100. }
  101. };
  102. public void reset() {
  103. String userId = StringUtils.parseName(mConnection.getUser());
  104. if (!mLoginUserId.equals(userId)) {
  105. mChatMaps.clear();
  106. mLoginUserId = userId;
  107. }
  108. }
  109. /**
  110. * 消息change的监听
  111. */
  112. private MessageListener mMessageListener = new MessageListener() {
  113. @Override
  114. public void processMessage(Chat arg0, Message message) {
  115. String from = message.getFrom();
  116. String to = message.getTo();
  117. if (TextUtils.isEmpty(from) || TextUtils.isEmpty(to)) {
  118. return;
  119. }
  120. if (!XmppStringUtil.isJID(from) || !XmppStringUtil.isJID(to)) {
  121. return;
  122. }
  123. if (!StringUtils.parseName(to).equals(mLoginUserId)) {// 不是发给我的,基本上是不可能的情况,还是麻痹的判断下
  124. return;
  125. }
  126. saveSingleMessage(message, false);//将消息保存到本地
  127. if (mService != null) {
  128. Log.d("roamer", "chatMessage:开始 "+ DateFormatUtil.getDateTimeStr());
  129. ChatMessage chatMessage = new ChatMessage(message.getBody());
  130. Log.d("roamer", "chatMessage: 结束 "+ DateFormatUtil.getDateTimeStr());
  131. if (chatMessage != null && chatMessage.getFromUserId() != mLoginUserId) {
  132. mService.notificationMesage(chatMessage);
  133. }
  134. }
  135. Log.d("roamer", "将消息保存到本地");
  136. }
  137. };
  138. /**
  139. * 发送聊天的消息
  140. *
  141. * @param toUserId 要发送给的用户,
  142. * @param chatMessage 已经存到本地数据库的一条即将发送的消息
  143. */
  144. public void sendMessage(final String toUserId, final ChatMessage chatMessage) {
  145. ThreadManager.getPool().execute(new Runnable() {
  146. public void run() {
  147. Chat chat = getChat(toUserId);
  148. try {
  149. Message msg = new Message();
  150. msg.setType(Message.Type.chat);
  151. if (chatMessage.getType() >= XmppMessage.TYPE_TEXT && chatMessage.getType() <= XmppMessage.TYPE_TIP) {
  152. msg.setBody(chatMessage.toJsonString(false));
  153. } else {
  154. msg.setBody(chatMessage.toJsonString(true));// 新朋友推送消息
  155. // 需要fromUserId字段
  156. }
  157. msg.setPacketID(chatMessage.getPacketId());
  158. DeliveryReceiptManager.addDeliveryReceiptRequest(msg);
  159. // 发送消息
  160. Log.i("roamer", "消息正文:" + JSON.toJSONString(msg));
  161. chat.sendMessage(msg);
  162. Log.i("roamer", "消息chat:"+JSON.toJSONString(chat));
  163. Log.d("roamer", "消息发送中");
  164. ListenerManager.getInstance().notifyMessageSendStateChange(mLoginUserId, toUserId, chatMessage.get_id(),
  165. ChatMessageListener.MESSAGE_SEND_ING);
  166. } catch (NotConnectedException e) {
  167. e.printStackTrace();
  168. ListenerManager.getInstance().notifyMessageSendStateChange(mLoginUserId, toUserId, chatMessage.get_id(),
  169. ChatMessageListener.MESSAGE_SEND_FAILED);
  170. }
  171. }
  172. });
  173. }
  174. /**
  175. * 发送新朋友推送消息
  176. *
  177. * @param toUserId 要发送给的用户,
  178. */
  179. public void sendMessage(final String toUserId, final NewFriendMessage newFriendMessage) {
  180. ThreadManager.getPool().execute(new Runnable() {
  181. public void run() {
  182. Chat chat = getChat(toUserId);
  183. try {
  184. Message msg = new Message();
  185. msg.setType(Message.Type.chat);
  186. msg.setBody(newFriendMessage.toJsonString());// 新朋友推送消息
  187. msg.setPacketID(newFriendMessage.getPacketId());
  188. DeliveryReceiptManager.addDeliveryReceiptRequest(msg);
  189. // 发送消息
  190. chat.sendMessage(msg);
  191. ListenerManager.getInstance().notifyNewFriendSendStateChange(toUserId, newFriendMessage, ChatMessageListener.MESSAGE_SEND_ING);
  192. } catch (NotConnectedException e) {
  193. e.printStackTrace();
  194. ListenerManager.getInstance().notifyNewFriendSendStateChange(toUserId, newFriendMessage, ChatMessageListener.MESSAGE_SEND_FAILED);
  195. }
  196. }
  197. });
  198. }
  199. private Chat getChat(String toUserId) {
  200. Log.d("roamer", "getChat....");
  201. Chat chat = mChatMaps.get(toUserId);
  202. if (chat != null) {
  203. return chat;
  204. }
  205. chat = mChatManager.createChat(toUserId + "@" + mServerName, mMessageListener);
  206. return chat;
  207. }
  208. /**
  209. * 保存接收到的聊天信息(单聊)
  210. *
  211. * @param
  212. * @param
  213. * @param
  214. * @param isRead
  215. * @return
  216. */
  217. private void saveSingleMessage(Message message, boolean isRead) {
  218. String fromUserId = StringUtils.parseName(message.getFrom());
  219. String messageBody = message.getBody();
  220. String packetId = message.getPacketID();
  221. if (fromUserId.equals(Friend.ID_SYSTEM_MESSAGE)) {// 推送的系统消息
  222. } else if (fromUserId.equals(Friend.ID_INTERVIEW_MESSAGE)) {
  223. // InterviewBrodcast.getInstance().newMessageCome(new InterviewMessage(messageBody));
  224. } else if (fromUserId.equals(Friend.ID_BLOG_MESSAGE)) {// 商务圈的推送消息
  225. } else if (fromUserId.equals(Friend.ID_MUC_ROOM)) {
  226. saveMucMessage(messageBody, packetId);
  227. } else {// 普通用户发送的消息
  228. if (message.getType() != Message.Type.chat) {// 朋友的消息必须是Chat类型的
  229. return;
  230. }
  231. JSONObject jObject = JSON.parseObject(messageBody);
  232. int type = 0;
  233. try {
  234. type = jObject.getIntValue("type");
  235. Log.d("roamer", "type:" + type);
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. }
  239. // 根据消息的不同类型,做不同的存储操作
  240. if (type <= 10) {// 普通的聊天消息,没有带fromUserId,所以要自己加上
  241. saveChatMessage(messageBody, fromUserId, packetId);
  242. Log.d("roamer", "普通的聊天消息,没有带fromUserId,所以要自己加上");
  243. } else {// 广播消息
  244. if (type == XmppMessage.TYPE_ENTERING) {// 正在输入
  245. // TODO 暂时不处理
  246. } else if (type >= XmppMessage.TYPE_SAYHELLO && type <= XmppMessage.TYPE_FRIEND) {// 新朋消息的处理
  247. saveNewFriendMessage(fromUserId, messageBody, packetId);
  248. }
  249. }
  250. }
  251. }
  252. private void saveMucMessage(String messageBody, String packetId) {
  253. JSONObject jObject = JSON.parseObject(messageBody);
  254. System.out.println(messageBody.toString() + "========================");
  255. int type = 0;
  256. String objectId = null;
  257. String content = null;
  258. int timeSend = 0;
  259. String fromUserId = null;
  260. String fromUserName = null;
  261. String toUserId = null;
  262. String toUserName = null;
  263. try {
  264. objectId = jObject.getString("objectId");
  265. if (TextUtils.isEmpty(objectId)) {
  266. return;
  267. }
  268. type = jObject.getIntValue("type");
  269. content = jObject.getString("content");
  270. timeSend = jObject.getIntValue("timeSend");
  271. fromUserId = jObject.getString("fromUserId");
  272. fromUserName = jObject.getString("fromUserName");
  273. toUserId = jObject.getString("toUserId");
  274. toUserName = jObject.getString("toUserName");
  275. } catch (Exception e) {
  276. e.printStackTrace();
  277. }
  278. Friend friend = FriendDao.getInstance().getMucFriendByRoomId(objectId);
  279. if (friend == null) {
  280. return;
  281. }
  282. switch (type) {
  283. case XmppMessage.TYPE_CHANGE_NICK_NAME: {// 昵称修改
  284. String currentName = toUserName;
  285. String name = friend.getRoomMyNickName();
  286. if (toUserId != null && toUserId.equals(mLoginUserId)) {// 我修改了昵称
  287. if (content != null && !currentName.equals(friend.getRoomMyNickName())) {// 我的昵称变了
  288. friend.setRoomMyNickName(content);
  289. FriendDao.getInstance().createOrUpdateFriend(friend);
  290. ListenerManager.getInstance().notifyNickNameChanged(friend.getUserId(), toUserId, content);
  291. ChatMessageDao.getInstance().updateNickName(mLoginUserId, friend.getUserId(), toUserId, content);
  292. }
  293. } else {// 其他人的昵称变了,通知下就可以了
  294. ChatMessage message = new ChatMessage();
  295. message.setTimeSend(timeSend);
  296. message.setContent("用户:" + currentName + " 昵称修改为 ‘" + content + "’");
  297. message.setPacketId(packetId);
  298. message.setType(XmppMessage.TYPE_TIP);
  299. if (ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, friend.getUserId(), message)) {
  300. ListenerManager.getInstance().notifyNewMesssage(mLoginUserId, friend.getUserId(), message, true);
  301. }
  302. ChatMessageDao.getInstance().updateNickName(mLoginUserId, friend.getUserId(), toUserId, content);
  303. ListenerManager.getInstance().notifyNickNameChanged(friend.getUserId(), toUserId, content);
  304. }
  305. }
  306. break;
  307. case XmppMessage.TYPE_CHANGE_ROOM_NAME: // 房间名字修改
  308. case XmppMessage.TYPE_NEW_NOTICE:// 新公告
  309. {
  310. if (TextUtils.isEmpty(content)) {
  311. return;
  312. }
  313. ChatMessage message = new ChatMessage();
  314. message.setTimeSend(timeSend);
  315. if (type == XmppMessage.TYPE_CHANGE_ROOM_NAME) {
  316. FriendDao.getInstance().updateMucFriendRoomName(objectId, content);
  317. message.setContent("房间名字修改为:" + content);
  318. MyApplication.getInstance().roomName = content;
  319. } else {
  320. message.setContent("新公告为:" + content);
  321. }
  322. message.setPacketId(packetId);
  323. message.setType(XmppMessage.TYPE_TIP);
  324. if (ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, friend.getUserId(), message)) {
  325. ListenerManager.getInstance().notifyNewMesssage(mLoginUserId, friend.getUserId(), message, true);
  326. }
  327. }
  328. break;
  329. case XmppMessage.TYPE_DELETE_ROOM: {// 删除房间
  330. // 删除这个房间
  331. FriendDao.getInstance().deleteFriend(mLoginUserId, friend.getUserId());
  332. // 消息表中删除
  333. ChatMessageDao.getInstance().deleteMessageTable(mLoginUserId, friend.getUserId());
  334. // 通知界面更新
  335. MsgBroadcast.broadcastMsgNumReset(mService);
  336. MsgBroadcast.broadcastMsgUiUpdate(mService);
  337. CardcastUiUpdateUtil.broadcastUpdateUi(mService);
  338. MucgroupUpdateUtil.broadcastUpdateUi(mService);
  339. ListenerManager.getInstance().notifyDeleteMucRoom(friend.getUserId());
  340. }
  341. break;
  342. case XmppMessage.TYPE_DELETE_MEMBER: {// 删除成员
  343. if (TextUtils.isEmpty(toUserId)) {
  344. return;
  345. }
  346. if (toUserId.equals(mLoginUserId)) {// 如果这个成员是我,从这个房间退出
  347. // 删除这个房间
  348. FriendDao.getInstance().deleteFriend(mLoginUserId, friend.getUserId());
  349. // 消息表中删除
  350. ChatMessageDao.getInstance().deleteMessageTable(mLoginUserId, friend.getUserId());
  351. // 通知界面更新
  352. MsgBroadcast.broadcastMsgNumReset(mService);
  353. MsgBroadcast.broadcastMsgUiUpdate(mService);
  354. CardcastUiUpdateUtil.broadcastUpdateUi(mService);
  355. ListenerManager.getInstance().notifyMyBeDelete(friend.getUserId());
  356. } else {// 其他人被房间删除了
  357. ChatMessage message = new ChatMessage();
  358. message.setTimeSend(timeSend);
  359. message.setContent("成员:" + toUserName + " 已退出了房间");
  360. message.setPacketId(packetId);
  361. message.setType(XmppMessage.TYPE_TIP);
  362. if (ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, friend.getUserId(), message)) {
  363. ListenerManager.getInstance().notifyNewMesssage(mLoginUserId, friend.getUserId(), message, true);
  364. }
  365. }
  366. }
  367. break;
  368. case XmppMessage.TYPE_GAG: {// 禁言
  369. int time = 0;
  370. try {
  371. time = Integer.parseInt(content);
  372. } catch (NumberFormatException e) {
  373. e.printStackTrace();
  374. }
  375. if (toUserId != null && toUserId.equals(mLoginUserId)) {// 我被禁言了或者取消禁言
  376. friend.setRoomTalkTime(time);
  377. FriendDao.getInstance().createOrUpdateFriend(friend);
  378. ListenerManager.getInstance().notifyMyVoiceBanned(friend.getUserId(), time);
  379. }
  380. ChatMessage message = new ChatMessage();
  381. message.setTimeSend(timeSend);
  382. if (time > (System.currentTimeMillis() / 1000)) {
  383. message.setContent("用户:" + toUserName + " 已被禁言");
  384. } else {
  385. message.setContent("用户:" + toUserName + " 已被取消禁言");
  386. }
  387. message.setPacketId(packetId);
  388. message.setType(XmppMessage.TYPE_TIP);
  389. if (ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, friend.getUserId(), message)) {
  390. ListenerManager.getInstance().notifyNewMesssage(mLoginUserId, friend.getUserId(), message, true);
  391. }
  392. }
  393. break;
  394. case XmppMessage.NEW_MEMBER:
  395. // {
  396. // "type": 907,
  397. // "objectId": "房间Id",
  398. // "fromUserId": 邀请人Id,
  399. // "fromUserName": "邀请人昵称",
  400. // "toUserId": 新成员Id,
  401. // "toUserName": "新成员昵称",
  402. // "timeSend": 123
  403. // }
  404. break;
  405. default:
  406. break;
  407. }
  408. }
  409. /**
  410. * @param messageBody
  411. * @param fromUserId 因为普通聊天消息在传输中,没有带fromUserId,所以要从xmpp报文中取值并赋值(新朋友就不用,它自带了)
  412. * @param packetId
  413. */
  414. private void saveChatMessage(String messageBody, String fromUserId, String packetId) {
  415. Log.d("roamer", "开始保存消息啦");
  416. ChatMessage chatMessage = new ChatMessage(messageBody);
  417. chatMessage.setFromUserId(fromUserId);
  418. if (TextUtils.isEmpty(packetId)) {
  419. chatMessage.setPacketId(UUID.randomUUID().toString().replaceAll("-", ""));
  420. } else {
  421. chatMessage.setPacketId(packetId);
  422. }
  423. Friend friend = FriendDao.getInstance().getFriend(mLoginUserId, fromUserId);
  424. // if (friend == null || friend.getStatus() == Friend.STATUS_BLACKLIST) {
  425. // return;// 不是我的好友,或者在黑名单中,直接返回
  426. // }
  427. if (friend == null) {// 如果不是朋友,那么直接加为好友
  428. friend = new Friend();
  429. friend.setTimeCreate((int) System.currentTimeMillis() / 1000);
  430. friend.setOwnerId(mLoginUserId);
  431. friend.setUserId(fromUserId);
  432. friend.setNickName(chatMessage.getFromUserName());
  433. friend.setRoomFlag(0);// 0朋友 1群组
  434. friend.setStatus(2);// 2是互为好友
  435. friend.setTimeSend(TimeUtils.sk_time_current_time());
  436. FriendDao.getInstance().createOrUpdateFriend(friend);
  437. }
  438. //保存聊天信息,并通知
  439. if (ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, fromUserId, chatMessage)) {
  440. ListenerManager.getInstance().notifyNewMesssage(mLoginUserId, fromUserId, chatMessage, false);
  441. }
  442. }
  443. private void saveNewFriendMessage(String fromUserId, String messageBody, String packetId) {
  444. // 新朋友的消息的处理
  445. NewFriendMessage newFriend = new NewFriendMessage(messageBody);
  446. newFriend.setOwnerId(mLoginUserId);
  447. newFriend.setPacketId(packetId);
  448. newFriend.setMySend(false);
  449. newFriend.setRead(false);
  450. newFriend.setUserId(fromUserId);
  451. switch (newFriend.getType()) {
  452. case XmppMessage.TYPE_BLACK:// 我进入了别人的黑名单,那么就不能再去看商务圈
  453. FriendHelper.beAddBlacklist(newFriend.getOwnerId(), newFriend.getUserId());
  454. return;
  455. case XmppMessage.TYPE_DELSEE:// 别人的删除了关注我
  456. FriendHelper.beDeleteSeeNewFriend(newFriend.getOwnerId(), newFriend.getUserId());
  457. return;
  458. case XmppMessage.TYPE_DELALL:// 别人彻底删除了我
  459. FriendHelper.beDeleteAllNewFriend(newFriend.getOwnerId(), newFriend.getUserId());
  460. return;
  461. }
  462. int status = FriendDao.getInstance().getFriendStatus(newFriend.getOwnerId(), newFriend.getUserId());
  463. if (status == Friend.STATUS_BLACKLIST) {// 如果是黑名单中,那么下面的那些消息就不用处理了
  464. return;
  465. }
  466. if (status == Friend.STATUS_FRIEND) {// 如果已经是好友了,那么下面的那些消息没有处理的必要了
  467. return;
  468. }
  469. boolean isPreRead = NewFriendDao.getInstance().isNewFriendRead(newFriend);// 之前可能存在的消息读没读,那么未读数量就不再+1
  470. switch (newFriend.getType()) {
  471. case XmppMessage.TYPE_NEWSEE:// 别人发的新关注消息
  472. case XmppMessage.TYPE_SAYHELLO:// 别人发的打招呼 status=STATUS_UNKNOW
  473. NewFriendDao.getInstance().createOrUpdateNewFriend(newFriend);
  474. break;
  475. case XmppMessage.TYPE_PASS:// 通过别人的验证 status=STATUS_FRIEND
  476. case XmppMessage.TYPE_FRIEND:// 直接成为了好友status=STATUS_FRIEND
  477. NewFriendDao.getInstance().ascensionNewFriend(newFriend, Friend.STATUS_FRIEND);
  478. FriendHelper.beAddFriendExtraOperation(newFriend.getOwnerId(), newFriend.getUserId());
  479. break;
  480. case XmppMessage.TYPE_FEEDBACK:// 别人的回话 status=STATUS_ATTENTION
  481. NewFriendDao.getInstance().createOrUpdateNewFriend(newFriend);
  482. break;
  483. case XmppMessage.TYPE_RECOMMEND:// 新推荐好友 TODO
  484. break;
  485. default:
  486. break;
  487. }
  488. // 更新朋友表中 100001号未读数量和最后一条的消息
  489. FriendDao.getInstance().updateLastChatMessage(mLoginUserId, Friend.ID_NEW_FRIEND_MESSAGE, new ChatMessage(messageBody));
  490. ListenerManager.getInstance().notifyNewFriend(mLoginUserId, newFriend, isPreRead);
  491. }
  492. }