Ver Fonte

fix: 修复隐藏的会话过多造成会话消失错觉问题 (#28)

Co-authored-by: wutiaorong <wutiaorong@gmail.com>
Talon há 11 meses atrás
pai
commit
61f84efed4

+ 53 - 2
module/message/src/main/java/com/adealink/weparty/message/conversationlist/viewmodel/ConversationListViewModel.kt

@@ -492,8 +492,7 @@ open class ConversationListViewModel(
                     )
             }
             ConversationListType.All.type -> {
-                IMService.innerService
-                    .getConversationListByPage(
+                getConversationListByPage(
                         callback, 0, sizePerPage, isTopPriority, *supportedTypes
                     )
             }
@@ -563,6 +562,58 @@ open class ConversationListViewModel(
         }
     }
 
+    /**
+     * 因为会通过dataFilter.filtered进行过滤的缘故,最新返回数量可能少于一页
+     * 如果少得比较多(会话少于一屏)就会让用户造成会话消失错觉,所以做递归拉取,直到拉满或者没有了
+     */
+    private fun getConversationListByPage(
+        callback: IRongCoreCallback.ResultCallback<List<Conversation>?>?,
+        timeStamp: Long,
+        count: Int,
+        topPriority: Boolean,
+        vararg supportedTypes: ConversationType?
+    ) {
+        val finalResult = mutableListOf<Conversation>()
+        var loadCount = count
+        var loadTimeStamp = timeStamp
+
+        fun loadNextPage() {
+            IMService.innerService
+                .getConversationListByPage(
+                    object: IRongCoreCallback.ResultCallback<List<Conversation>?>() {
+                        override fun onSuccess(conversations: List<Conversation>?) {
+                            val getConversations = conversations ?: emptyList()
+                            val hasMore = getConversations.size >= sizePerPage
+                            val filtered = dataFilter.filtered(getConversations)
+                            finalResult.addAll(filtered)
+                            if (!hasMore) {
+                                //后续没有更多了,直接返回结果
+                                callback?.onSuccess(finalResult)
+                                return
+                            }
+                            if (finalResult.size < sizePerPage) {
+                                // 过滤后数量不足,加一页继续拉
+                                loadCount += pageLimit
+                                loadTimeStamp = getConversations.lastOrNull()?.sentTime ?: 0
+                                loadNextPage()
+                            } else {
+                                // 拉完了,通过callback通知出去
+                                callback?.onSuccess(finalResult.take(sizePerPage))
+                            }
+                        }
+
+                        override fun onError(e: IRongCoreEnum.CoreErrorCode?) {
+                            callback?.onError(e)
+                        }
+
+                    }, loadTimeStamp, loadCount, topPriority, *supportedTypes
+                )
+        }
+
+        // 开始第一次拉取
+        loadNextPage()
+    }
+
     private fun doUpdate(
         conversations: List<Conversation>?,
         loadMore: Boolean,