3030public class SysMessageObserver {
3131
3232 final static String TAG = "SysMessageObserver" ;
33+
34+ static class InstanceHolder {
35+ final static SysMessageObserver instance = new SysMessageObserver ();
36+ }
37+
38+ private SysMessageObserver () {
39+ }
40+
41+ public static SysMessageObserver getInstance () {
42+ return InstanceHolder .instance ;
43+ }
44+
3345 /*******************************系统消息********************************/
3446
3547 private static final boolean MERGE_ADD_FRIEND_VERIFY = true ; // 是否要合并好友申请,同一个用户仅保留最近一条申请内容(默认不合并)
@@ -41,6 +53,7 @@ public class SysMessageObserver {
4153 private Set <String > addFriendVerifyRequestAccounts = new HashSet <>(); // 发送过好友申请的账号(好友申请合并用)
4254
4355 private Set <Long > itemIds = new HashSet <>();
56+ private List <Observer <SystemMessage >> observerList = new ArrayList <>();
4457
4558 // db
4659 private boolean firstLoad = true ;
@@ -53,6 +66,7 @@ public void loadMessages(boolean refresh) {
5366 int validMessageCount = 0 ; // 实际加载的数量(排除被过滤被合并的条目)
5467 List <String > messageFromAccounts = new ArrayList <>(LOAD_MESSAGE_COUNT );
5568
69+ List <SystemMessage > deleteList = new ArrayList <>();
5670 while (true ) {
5771 List <SystemMessage > temps = NIMClient .getService (SystemMessageService .class )
5872 .querySystemMessagesBlock (loadOffset , LOAD_MESSAGE_COUNT );
@@ -73,7 +87,7 @@ public void loadMessages(boolean refresh) {
7387
7488 // 同一个账号的好友申请仅保留最近一条
7589 if (addFriendVerifyFilter (m )) {
76- NIMClient . getService ( SystemMessageService . class ). deleteSystemMessage ( m . getMessageId ()); //删除旧的加好友通知
90+ deleteList . add ( m );
7791 continue ;
7892 }
7993
@@ -100,6 +114,13 @@ public void loadMessages(boolean refresh) {
100114 }
101115 }
102116 firstLoad = false ;
117+ if (!deleteList .isEmpty ()) {
118+ for (SystemMessage m : deleteList ) {
119+ NIMClient .getService (SystemMessageService .class ).deleteSystemMessage (m .getMessageId ());//删除旧的加好友通知
120+ }
121+ loadOffset -= deleteList .size ();
122+ deleteList .clear ();
123+ }
103124 // 更新数据源,刷新界面
104125 if (refresh )
105126 refresh ();
@@ -110,46 +131,84 @@ public void loadMessages(boolean refresh) {
110131
111132 boolean hasRegister ;
112133
134+ public void register (boolean register ) {
135+
136+ NIMClient .getService (SystemMessageObserver .class ).observeReceiveSystemMsg (baseSystemMessageObserver , register );
137+ registerSystemObserver (new Observer <SystemMessage >() {
138+ @ Override
139+ public void onEvent (SystemMessage systemMessage ) {
140+ if (hasRegister ) {
141+ return ;
142+ }
143+ onIncomingMessage (systemMessage , false );
144+ }
145+ }, register );
146+ }
147+
113148 public void registerSystemObserver (boolean register ) {
114149 if (hasRegister && register ) {
115150 return ;
116151 }
117152 hasRegister = register ;
118- NIMClient . getService ( SystemMessageObserver . class ). observeReceiveSystemMsg (systemMessageObserver , register );
153+ registerSystemObserver (systemMessageObserver , register );
119154 }
120155
156+ public void registerSystemObserver (Observer <SystemMessage > o , boolean register ) {
157+ if (o == null ) {
158+ return ;
159+ }
160+
161+ if (register ) {
162+ if (!observerList .contains (o )) {
163+ observerList .add (o );
164+ }
165+ } else {
166+ observerList .remove (o );
167+ }
168+
169+ }
170+
171+ private Observer <SystemMessage > baseSystemMessageObserver = new Observer <SystemMessage >() {
172+ @ Override
173+ public void onEvent (SystemMessage systemMessage ) {
174+ for (Observer <SystemMessage > o : observerList ) {
175+ o .onEvent (systemMessage );
176+ }
177+ }
178+ };
121179 private Observer <SystemMessage > systemMessageObserver = new Observer <SystemMessage >() {
122180 @ Override
123181 public void onEvent (SystemMessage systemMessage ) {
124- onIncomingMessage (systemMessage );
182+ onIncomingMessage (systemMessage , true );
125183 }
126184 };
127185
128186
129- private void onIncomingMessage (final SystemMessage message ) {
187+ private void onIncomingMessage (final SystemMessage message , boolean refresh ) {
130188 // 同一个账号的好友申请仅保留最近一条
189+ SystemMessage del = null ;
131190 if (addFriendVerifyFilter (message )) {
132- SystemMessage del = null ;
133191 for (SystemMessage m : sysItems ) {
134192 if (TextUtils .equals (m .getFromAccount (), message .getFromAccount ()) && m .getType () == SystemMessageType .AddFriend ) {
135193 AddFriendNotify attachData = (AddFriendNotify ) m .getAttachObject ();
136194 if (attachData != null && attachData .getEvent () == AddFriendNotify .Event .RECV_ADD_FRIEND_VERIFY_REQUEST ) {
137195 del = m ;
138- NIMClient .getService (SystemMessageService .class ).deleteSystemMessage (m .getMessageId ());//删除旧的加好友通知
139196 break ;
140197 }
141198 }
142199 }
143-
144- if (del != null ) {
145- sysItems .remove (del );
146- }
200+ }
201+ if (del != null ) {
202+ sysItems .remove (del );
203+ NIMClient .getService (SystemMessageService .class ).deleteSystemMessage (del .getMessageId ());//删除旧的加好友通知
204+ } else {
205+ loadOffset ++;
147206 }
148207
149- loadOffset ++;
150208 sysItems .add (0 , message );
151209
152- refresh ();
210+ if (refresh )
211+ refresh ();
153212
154213 // 收集未知用户资料的账号集合并从远程获取
155214 List <String > messageFromAccounts = new ArrayList <>(1 );
@@ -229,6 +288,7 @@ private void refresh() {
229288 public void startSystemMsg () {
230289 loadMessages (true );
231290 registerSystemObserver (true );
291+ NIMClient .getService (SystemMessageService .class ).resetSystemMessageUnreadCount ();
232292 }
233293
234294 public void stopSystemMsg () {
@@ -334,7 +394,7 @@ private void onProcessFailed(final int code, long messageId) {
334394 }
335395
336396 SystemMessageStatus status = SystemMessageStatus .expired ;
337- NIMClient .getService (SystemMessageService .class ).setSystemMessageRead (messageId );
397+ // NIMClient.getService(SystemMessageService.class).setSystemMessageRead(messageId);
338398 NIMClient .getService (SystemMessageService .class ).setSystemMessageStatus (messageId , status );
339399 refreshViewHolder (messageId , status );
340400 }
0 commit comments