FriendHelper.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.xzjmyk.pm.activity.helper;
  2. import android.content.Context;
  3. import com.android.volley.Response.ErrorListener;
  4. import com.android.volley.VolleyError;
  5. import com.xzjmyk.pm.activity.bean.circle.CircleMessage;
  6. import com.xzjmyk.pm.activity.broadcast.CardcastUiUpdateUtil;
  7. import com.xzjmyk.pm.activity.db.dao.ChatMessageDao;
  8. import com.xzjmyk.pm.activity.db.dao.CircleMessageDao;
  9. import com.xzjmyk.pm.activity.db.dao.FriendDao;
  10. import com.xzjmyk.pm.activity.sp.TableVersionSp;
  11. import com.xzjmyk.pm.activity.util.TimeUtils;
  12. import com.xzjmyk.pm.activity.volley.ArrayResult;
  13. import com.xzjmyk.pm.activity.volley.Result;
  14. import com.xzjmyk.pm.activity.volley.StringJsonArrayRequest;
  15. import com.xzjmyk.pm.activity.MyApplication;
  16. import com.xzjmyk.pm.activity.bean.AttentionUser;
  17. import com.xzjmyk.pm.activity.bean.Friend;
  18. import com.xzjmyk.pm.activity.broadcast.MsgBroadcast;
  19. import com.xzjmyk.pm.activity.volley.FastVolley;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. /**
  23. * @author Dean Tao
  24. */
  25. public class FriendHelper {
  26. /**
  27. * @param loginUserId 当前登陆者的Id
  28. * @param friendId 朋友的Id
  29. * @param attentionUser 从服务器上获取的关系
  30. */
  31. public static boolean updateFriendRelationship(String loginUserId, String friendId, AttentionUser attentionUser) {// 更新两者的关系,因为本地数据可能不正确
  32. boolean changed = false;
  33. Friend friend = FriendDao.getInstance().getFriend(loginUserId, friendId);// 本地好友
  34. if (attentionUser == null || (attentionUser.getStatus() != Friend.STATUS_ATTENTION && attentionUser.getStatus() != Friend.STATUS_FRIEND)) {// 服务器上不存在关系
  35. if (friend == null) {// 本地也不存在关系
  36. // do no thing
  37. } else {// 本地存在关系
  38. removeAttentionOrFriend(loginUserId, friendId);// 直接删除好友(也有可能是关注关系,但是删除好友的操作包括删除关注的所有操作,所以直接删除好友)|
  39. changed = true;
  40. }
  41. } else {// 服务器上存在关系
  42. if (friend == null) {// 本地不存在关系,那么就要插入一条好友记录
  43. friend = new Friend();
  44. friend.setTimeCreate(attentionUser.getCreateTime());
  45. friend.setTimeSend(TimeUtils.sk_time_current_time());
  46. friend.setOwnerId(attentionUser.getUserId());
  47. friend.setUserId(attentionUser.getToUserId());
  48. friend.setNickName(attentionUser.getToNickName());
  49. friend.setRemarkName(attentionUser.getRemarkName());
  50. friend.setRoomFlag(0);// 0朋友 1群组
  51. friend.setCompanyId(attentionUser.getCompanyId());// 公司
  52. int status = (attentionUser.getBlacklist() == 0) ? attentionUser.getStatus() : Friend.STATUS_BLACKLIST;
  53. friend.setStatus(status);
  54. friend.setVersion(TableVersionSp.getInstance(MyApplication.getInstance()).getFriendTableVersion(loginUserId));// 更新版本
  55. FriendDao.getInstance().createOrUpdateFriend(friend);
  56. if (status == Friend.STATUS_BLACKLIST) {// 如果在黑名单中(理论上不可能)
  57. // do no thing
  58. } else if (status == Friend.STATUS_ATTENTION) {// 如果是关注(理论上不可能)
  59. addAttentionExtraOperation(loginUserId, friendId);
  60. } else if (status == Friend.STATUS_FRIEND) {// 如果是好友
  61. addFriendExtraOperation(loginUserId, friendId);
  62. }
  63. changed = true;
  64. } else {
  65. int status = attentionUser.getBlacklist() == 0 ? attentionUser.getStatus() : Friend.STATUS_BLACKLIST;
  66. if (status == friend.getStatus()) {
  67. // do no thing
  68. } else {
  69. FriendDao.getInstance().updateFriendStatus(loginUserId, friendId, status);
  70. if (status == Friend.STATUS_BLACKLIST) {// 如果之前在黑名单中,现在是STATUS_ATTENTION或者STATUS_FRIEND
  71. if (friend.getStatus() == Friend.STATUS_ATTENTION) {
  72. addAttentionExtraOperation(loginUserId, friendId);
  73. } else if (friend.getStatus() == Friend.STATUS_FRIEND) {
  74. addFriendExtraOperation(loginUserId, friendId);
  75. }
  76. } else if (status == Friend.STATUS_ATTENTION) {// 如果之前是关注,现在是黑名单或者好友
  77. if (friend.getStatus() == Friend.STATUS_BLACKLIST) {
  78. addBlacklistExtraOperation(loginUserId, friendId);
  79. } else if (friend.getStatus() == Friend.STATUS_FRIEND) {
  80. addFriendExtraOperation(loginUserId, friendId);
  81. }
  82. } else if (status == Friend.STATUS_FRIEND) {
  83. if (friend.getStatus() == Friend.STATUS_BLACKLIST) {
  84. addBlacklistExtraOperation(loginUserId, friendId);
  85. } else if (friend.getStatus() == Friend.STATUS_ATTENTION) {// 本来是好友,现在变成关注
  86. // 消息表中删除
  87. ChatMessageDao.getInstance().deleteMessageTable(loginUserId, friendId);
  88. // 2、更新消息界面(消息界面可能之前存在和该用户的聊天记录,要删除掉)
  89. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  90. // 3、更新主界面未读数量(消息界面可能之前存在和该用户的聊天记录,要删除掉,未读数量可能改变)
  91. MsgBroadcast.broadcastMsgNumReset(MyApplication.getInstance());
  92. }
  93. }
  94. changed = true;
  95. }
  96. }
  97. }
  98. return changed;
  99. }
  100. /**
  101. * 加入黑名单,额外需要做的操作
  102. */
  103. public static void addBlacklistExtraOperation(String loginUserId, String friendId) {
  104. // 消息表中删除
  105. ChatMessageDao.getInstance().deleteMessageTable(loginUserId, friendId);
  106. // 商务圈消息表删除
  107. CircleMessageDao.getInstance().deleteMessage(loginUserId, friendId);
  108. // 2、更新消息界面(消息界面可能之前存在和该用户的聊天记录,要删除掉)
  109. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  110. // 3、更新主界面未读数量(消息界面可能之前存在和该用户的聊天记录,要删除掉,未读数量可能改变)
  111. MsgBroadcast.broadcastMsgNumReset(MyApplication.getInstance());
  112. }
  113. /**
  114. * 添加特别关注
  115. */
  116. public static void addPeculiarFriend(Friend friend) {
  117. friend.setPrivacy("true");
  118. FriendDao.getInstance().createOrUpdateFriend(friend);
  119. }
  120. /**
  121. * 移除特别关注
  122. */
  123. public static void removePeculiarFriend(Friend friend) {
  124. friend.setPrivacy("false");
  125. FriendDao.getInstance().createOrUpdateFriend(friend);
  126. }
  127. /**
  128. * 在本地数据库表中出入一条关注记录,额外需要做的操作
  129. */
  130. public static void addAttentionExtraOperation(String loginUserId, String friendId) {
  131. // 下载商务圈消息
  132. FriendHelper.downloadCircleMessage(loginUserId, friendId);
  133. }
  134. /**
  135. * 在本地数据库表中出入一条好友记录,额外需要做的操作
  136. */
  137. public static void addFriendExtraOperation(String loginUserId, String friendId) {
  138. // 下载商务圈消息
  139. FriendHelper.downloadCircleMessage(loginUserId, friendId);
  140. // 插入一条系统提示消息
  141. FriendDao.getInstance().addNewFriendInMsgTable(loginUserId, friendId);
  142. // 更新Message Ui
  143. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  144. // 更新Main Ui message 未读数量
  145. MsgBroadcast.broadcastMsgNumUpdate(MyApplication.getInstance(), true, 1);
  146. }
  147. /**
  148. * 如果关注或加好友某个人,那么就去下载他的商务圈消息
  149. *
  150. * @param loginUserId
  151. * @param firendId
  152. */
  153. public static void downloadCircleMessage(final String loginUserId, final String firendId) {
  154. final Context context = MyApplication.getInstance();
  155. // 先清除他的商务圈消息,容错
  156. CircleMessageDao.getInstance().deleteMessage(loginUserId, firendId);
  157. // 下载他的商务圈消息
  158. HashMap<String, String> params = new HashMap<String, String>();
  159. params.put("access_token", MyApplication.getInstance().mAccessToken);
  160. params.put("userId", firendId);
  161. StringJsonArrayRequest<CircleMessage> request = new StringJsonArrayRequest<CircleMessage>(
  162. MyApplication.getInstance().getConfig().USER_CIRCLE_MESSAGE, new ErrorListener() {
  163. @Override
  164. public void onErrorResponse(VolleyError arg0) {
  165. }
  166. }, new StringJsonArrayRequest.Listener<CircleMessage>() {
  167. @Override
  168. public void onResponse(ArrayResult<CircleMessage> result) {
  169. boolean success = Result.defaultParser(context, result, false);
  170. if (success && result.getData() != null) {
  171. List<CircleMessage> list = result.getData();
  172. for (int i = 0; i < list.size(); i++) {
  173. // 消息完整性填充
  174. list.get(i).setUserId(firendId);
  175. }
  176. CircleMessageDao.getInstance().addFriendMessages(loginUserId, firendId, result.getData());
  177. }
  178. }
  179. }, CircleMessage.class, params);
  180. request.setRetryPolicy(FastVolley.newDefaultRetryPolicy());
  181. MyApplication.getInstance().getFastVolley().addDefaultRequest(null, request);
  182. }
  183. /**
  184. * 移除一个关注级别的用户,可能是关注或者好友
  185. * @param ownerId
  186. */
  187. public static void removeAttentionOrFriend(String ownerId, String friendId) {
  188. // 从好友表中删除
  189. FriendDao.getInstance().deleteFriend(ownerId, friendId);
  190. // 新朋友表中删除
  191. // NewFriendDao.getInstance().deleteNewFriend(ownerId, friendId);
  192. // 消息表中删除
  193. ChatMessageDao.getInstance().deleteMessageTable(ownerId, friendId);
  194. // 商务圈消息表删除
  195. CircleMessageDao.getInstance().deleteMessage(ownerId, friendId);
  196. // 更新消息界面(消息界面可能之前存在和该用户的聊天记录,要删除掉)
  197. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  198. // 3、更新主界面未读数量(消息界面可能之前存在和该用户的聊天记录,要删除掉,未读数量可能改变)
  199. MsgBroadcast.broadcastMsgNumReset(MyApplication.getInstance());
  200. }
  201. // ////////////////////上面是我的主动操作/////////////////
  202. // ////////////////////下面是我的被动操作/////////////////
  203. /**
  204. * 被加入黑名单
  205. *
  206. */
  207. public static void beAddBlacklist(String loginUserId, String friendId) {
  208. Friend friend = FriendDao.getInstance().getFriend(loginUserId, friendId);// 本地好友
  209. if (friend == null) {// 不存在该好友
  210. return;
  211. }
  212. // 商务圈消息表删除
  213. CircleMessageDao.getInstance().deleteMessage(loginUserId, friendId);
  214. }
  215. /**
  216. * 别人删除了关注我
  217. */
  218. public static void beDeleteSeeNewFriend(String loginUserId, String friendId) {
  219. Friend friend = FriendDao.getInstance().getFriend(loginUserId, friendId);
  220. if (friend != null) {// 如果我也有这个好友
  221. if (friend.getStatus() == Friend.STATUS_FRIEND) {// 如果之前是朋友,那么现在降级为关注
  222. friend.setStatus(Friend.STATUS_ATTENTION);
  223. friend.setContent("");
  224. // 由好友变为关注,更新一些数据
  225. FriendDao.getInstance().createOrUpdateFriend(friend);
  226. // 消息表中删除
  227. ChatMessageDao.getInstance().deleteMessageTable(loginUserId, friendId);
  228. // 更新消息界面(消息界面可能之前存在和该用户的聊天记录,要删除掉)
  229. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  230. // 3、更新主界面未读数量(消息界面可能之前存在和该用户的聊天记录,要删除掉,未读数量可能改变)
  231. MsgBroadcast.broadcastMsgNumReset(MyApplication.getInstance());
  232. // 可能正在看通讯录,那么通讯录也要更新
  233. CardcastUiUpdateUtil.broadcastUpdateUi(MyApplication.getInstance());
  234. }
  235. }
  236. }
  237. /**
  238. * 别人彻底删除了我
  239. */
  240. public static void beDeleteAllNewFriend(String loginUserId, String friendId) {
  241. removeAttentionOrFriend(loginUserId, friendId);
  242. // 可能正在看通讯录,那么通讯录也要更新
  243. CardcastUiUpdateUtil.broadcastUpdateUi(MyApplication.getInstance());
  244. }
  245. /**
  246. * 在本地数据库表中出入一条好友记录,额外需要做的操作
  247. */
  248. public static void beAddFriendExtraOperation(String loginUserId, String friendId) {
  249. // 插入一条系统提示消息
  250. FriendDao.getInstance().addNewFriendInMsgTable(loginUserId, friendId);
  251. // 更新Message Ui
  252. MsgBroadcast.broadcastMsgUiUpdate(MyApplication.getInstance());
  253. // 更新Main Ui message 未读数量
  254. MsgBroadcast.broadcastMsgNumUpdate(MyApplication.getInstance(), true, 1);
  255. }
  256. }