Hibok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
4.0 KiB

  1. import 'package:chat/data/constants.dart';
  2. import 'package:chat/models/UserInfo.dart';
  3. import 'package:chat/utils/HttpUtil.dart';
  4. import 'package:chat/utils/conversation_table.dart';
  5. import 'package:chat/utils/sql_util.dart';
  6. import 'package:chat/utils/TokenMgr.dart';
  7. import 'package:shared_preferences/shared_preferences.dart';
  8. class FriendListMgr {
  9. // 工厂模式
  10. factory FriendListMgr() => _getInstance();
  11. static FriendListMgr get instance => _getInstance();
  12. static FriendListMgr _instance;
  13. FriendListMgr._internal();
  14. static FriendListMgr _getInstance() {
  15. if (_instance == null) {
  16. _instance = FriendListMgr._internal();
  17. }
  18. return _instance;
  19. }
  20. List<FriendModel> friendList = [];
  21. //获取好友列表
  22. getFriendList() async {
  23. if (friendList != null && friendList.length > 0) {
  24. return friendList;
  25. }
  26. friendList = await SqlUtil.friendTableModel.getAllConversation();
  27. if (friendList.length == 0) {
  28. //从服务器拉取
  29. print('从服务器获取好友数据');
  30. getFriendListFromServer();
  31. }
  32. return friendList;
  33. }
  34. getFriendListFromServer() {
  35. HttpUtil().getFriendList((List data) async {
  36. Set oldUserId = new Set();
  37. for (var friendModel in friendList) {
  38. oldUserId.add(friendModel.friendId);
  39. }
  40. data.forEach((f) {
  41. var friend = FriendModel.fromServerJson(f);
  42. if (!oldUserId.contains(friend.friendId)) {
  43. addFriend(friend);
  44. }
  45. oldUserId.remove(friend.friendId);
  46. });
  47. for (var friendId in oldUserId) {
  48. delteFriend(friendId);
  49. }
  50. });
  51. deleteLocalUserId();
  52. }
  53. deleteLocalUserId() async {
  54. //删除本地新加好友记录
  55. SharedPreferences prefs = await SharedPreferences.getInstance();
  56. List<String> list = prefs.getStringList(Constants.NewFriendsList);
  57. if (list != null) {
  58. for (int i = 0; i < list.length; i++) {
  59. if (isMyFriend(int.parse(list[i]))) {
  60. list.remove(list[i]);
  61. }
  62. }
  63. prefs.setStringList(Constants.NewFriendsList, list);
  64. }
  65. }
  66. //添加好友
  67. addFriend(FriendModel friendModel) {
  68. if (isMyFriend(friendModel.friendId)) {
  69. return;
  70. }
  71. friendList.add(friendModel);
  72. SqlUtil.friendTableModel.insert(friendModel);
  73. }
  74. //删除好友
  75. delteFriend(int friendId) {
  76. for (var friendModel in friendList) {
  77. if (friendModel.friendId == friendId) {
  78. friendList.remove(friendModel);
  79. break;
  80. }
  81. }
  82. SqlUtil.friendTableModel.deleteFriend(friendId);
  83. }
  84. //删除所有好友
  85. deleteAllFriend() {
  86. friendList.clear();
  87. SqlUtil.friendTableModel.clear();
  88. }
  89. //是否是我的朋友
  90. isMyFriend(int userId) {
  91. for (var friendModel in friendList) {
  92. if (friendModel.friendId == userId) {
  93. return true;
  94. }
  95. }
  96. return false;
  97. }
  98. //同步好友信息
  99. updateFriendInfo(UserInfo info) {
  100. for (int i = 0; i < friendList.length; i++) {
  101. if (friendList[i].friendId == info.userId) {
  102. SqlUtil.friendTableModel.deleteFriend(info.userId);
  103. friendList[i].name = info.nickName;
  104. friendList[i].avatar = info.headimgurl;
  105. friendList[i].nameTag = friendList[i].getNameTag();
  106. SqlUtil.friendTableModel.insert(friendList[i]);
  107. }
  108. }
  109. }
  110. updateRefNmae(int userId) {
  111. for (int i = 0; i < friendList.length; i++) {
  112. if (friendList[i].friendId == userId) {
  113. friendList[i].updataRefName();
  114. }
  115. }
  116. }
  117. //从服务器校验好友
  118. checkFromServer(String sign) async {
  119. List<FriendModel> friendList =
  120. await SqlUtil.friendTableModel.getAllConversation();
  121. List idList = [];
  122. for (var model in friendList) {
  123. idList.add(model.friendId);
  124. }
  125. idList.sort();
  126. if (friendList.length == 0 ||
  127. TokenMgr().generateMd5(idList.join(',')) != sign) {
  128. getFriendListFromServer();
  129. }
  130. }
  131. }