Эх сурвалжийг харах

Reduce complexity for function 'ChatController#processMessages'

Signed-off-by: Tim Krüger <t@timkrueger.me>
Tim Krüger 2 жил өмнө
parent
commit
4cab75f6ed

+ 152 - 135
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -2294,23 +2294,12 @@ class ChatController(args: Bundle) :
     }
 
     private fun processMessages(response: Response<*>, isFromTheFuture: Boolean) {
-        val xChatLastGivenHeader: String? = response.headers()["X-Chat-Last-Given"]
+
         val xChatLastCommonRead = response.headers()["X-Chat-Last-Common-Read"]?.let {
             Integer.parseInt(it)
         }
-        if (response.headers().size > 0 && !TextUtils.isEmpty(xChatLastGivenHeader)) {
-            val header = Integer.parseInt(xChatLastGivenHeader!!)
-            if (header > 0) {
-                if (isFromTheFuture) {
-                    globalLastKnownFutureMessageId = header
-                } else {
-                    if (globalLastKnownFutureMessageId == -1) {
-                        globalLastKnownFutureMessageId = header
-                    }
-                    globalLastKnownPastMessageId = header
-                }
-            }
-        }
+
+        processHeaderChatLastGiven(response, isFromTheFuture)
 
         if (response.code() == HTTP_CODE_OK) {
             val chatOverall = response.body() as ChatOverall?
@@ -2332,158 +2321,186 @@ class ChatController(args: Bundle) :
                 binding.messagesListView.visibility = View.VISIBLE
             }
 
-            var countGroupedMessages = 0
-            if (!isFromTheFuture) {
-                var previousMessageId = NO_PREVIOUS_MESSAGE_ID
-                for (i in chatMessageList.indices.reversed()) {
-                    val chatMessage = chatMessageList[i]
+            if (isFromTheFuture) {
+                processMessagesFromTheFuture(chatMessageList)
+            } else {
+                processMessagesNotFromTheFuture(chatMessageList)
+            }
 
-                    if (previousMessageId > NO_PREVIOUS_MESSAGE_ID) {
-                        chatMessage.previousMessageId = previousMessageId
-                    } else if (adapter?.isEmpty != true) {
-                        if (adapter!!.items[0].item is ChatMessage) {
-                            chatMessage.previousMessageId = (adapter!!.items[0].item as ChatMessage).jsonMessageId
-                        } else if (adapter!!.items.size > 1 && adapter!!.items[1].item is ChatMessage) {
-                            chatMessage.previousMessageId = (adapter!!.items[1].item as ChatMessage).jsonMessageId
-                        }
-                    }
+            updateReadStatusOfAllMessages(xChatLastCommonRead)
+            adapter?.notifyDataSetChanged()
 
-                    previousMessageId = chatMessage.jsonMessageId
-                }
+            if (inConversation) {
+                pullChatMessages(1, 1, xChatLastCommonRead)
+            }
+        } else if (response.code() == HTTP_CODE_NOT_MODIFIED && !isFromTheFuture) {
+            if (isFirstMessagesProcessing) {
+                cancelNotificationsForCurrentConversation()
 
-                for (i in chatMessageList.indices) {
-                    if (chatMessageList.size > i + 1) {
-                        if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
-                            chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
-                            countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
-                        ) {
-                            chatMessageList[i].isGrouped = true
-                            countGroupedMessages++
-                        } else {
-                            countGroupedMessages = 0
-                        }
-                    }
+                isFirstMessagesProcessing = false
+                binding.progressBar.visibility = View.GONE
+            }
 
-                    val chatMessage = chatMessageList[i]
-                    chatMessage.isOneToOneConversation =
-                        currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
-                    chatMessage.activeUser = conversationUser
-                }
+            historyRead = true
 
-                if (adapter != null) {
-                    adapter?.addToEnd(chatMessageList, false)
-                }
-                scrollToRequestedMessageIfNeeded()
-            } else {
-                var chatMessage: ChatMessage
+            if (!lookingIntoFuture && inConversation) {
+                pullChatMessages(1)
+            }
+        }
+    }
 
-                val shouldAddNewMessagesNotice = (adapter?.itemCount ?: 0) > 0 && chatMessageList.isNotEmpty()
+    private fun updateReadStatusOfAllMessages(xChatLastCommonRead: Int?) {
+        for (message in adapter!!.items) {
+            xChatLastCommonRead?.let {
+                if (message.item is ChatMessage) {
+                    val chatMessage = message.item as ChatMessage
 
-                if (shouldAddNewMessagesNotice) {
-                    val unreadChatMessage = ChatMessage()
-                    unreadChatMessage.jsonMessageId = -1
-                    unreadChatMessage.actorId = "-1"
-                    unreadChatMessage.timestamp = chatMessageList[0].timestamp
-                    unreadChatMessage.message = context.getString(R.string.nc_new_messages)
-                    adapter?.addToStart(unreadChatMessage, false)
+                    if (chatMessage.jsonMessageId <= it) {
+                        chatMessage.readStatus = ReadStatus.READ
+                    } else {
+                        chatMessage.readStatus = ReadStatus.SENT
+                    }
                 }
+            }
+        }
+    }
 
-                val isThereANewNotice =
-                    shouldAddNewMessagesNotice || adapter?.getMessagePositionByIdInReverse("-1") != -1
+    private fun processMessagesFromTheFuture(chatMessageList: List<ChatMessage>) {
+        var chatMessage: ChatMessage
 
-                var previousMessageId = NO_PREVIOUS_MESSAGE_ID
-                for (i in chatMessageList.indices.reversed()) {
-                    val chatMessageItem = chatMessageList[i]
+        val shouldAddNewMessagesNotice = (adapter?.itemCount ?: 0) > 0 && chatMessageList.isNotEmpty()
 
-                    if (previousMessageId > NO_PREVIOUS_MESSAGE_ID) {
-                        chatMessageItem.previousMessageId = previousMessageId
-                    } else if (adapter?.isEmpty != true) {
-                        if (adapter!!.items[0].item is ChatMessage) {
-                            chatMessageItem.previousMessageId = (adapter!!.items[0].item as ChatMessage).jsonMessageId
-                        } else if (adapter!!.items.size > 1 && adapter!!.items[1].item is ChatMessage) {
-                            chatMessageItem.previousMessageId = (adapter!!.items[1].item as ChatMessage).jsonMessageId
-                        }
-                    }
+        if (shouldAddNewMessagesNotice) {
+            val unreadChatMessage = ChatMessage()
+            unreadChatMessage.jsonMessageId = -1
+            unreadChatMessage.actorId = "-1"
+            unreadChatMessage.timestamp = chatMessageList[0].timestamp
+            unreadChatMessage.message = context.getString(R.string.nc_new_messages)
+            adapter?.addToStart(unreadChatMessage, false)
+        }
+
+        val isThereANewNotice =
+            shouldAddNewMessagesNotice || adapter?.getMessagePositionByIdInReverse("-1") != -1
 
-                    previousMessageId = chatMessageItem.jsonMessageId
+        var previousMessageId = NO_PREVIOUS_MESSAGE_ID
+        for (i in chatMessageList.indices.reversed()) {
+            val chatMessageItem = chatMessageList[i]
+
+            if (previousMessageId > NO_PREVIOUS_MESSAGE_ID) {
+                chatMessageItem.previousMessageId = previousMessageId
+            } else if (adapter?.isEmpty != true) {
+                if (adapter!!.items[0].item is ChatMessage) {
+                    chatMessageItem.previousMessageId = (adapter!!.items[0].item as ChatMessage).jsonMessageId
+                } else if (adapter!!.items.size > 1 && adapter!!.items[1].item is ChatMessage) {
+                    chatMessageItem.previousMessageId = (adapter!!.items[1].item as ChatMessage).jsonMessageId
                 }
+            }
 
-                for (i in chatMessageList.indices) {
-                    chatMessage = chatMessageList[i]
+            previousMessageId = chatMessageItem.jsonMessageId
+        }
 
-                    chatMessage.activeUser = conversationUser
+        for (i in chatMessageList.indices) {
+            chatMessage = chatMessageList[i]
 
-                    val shouldScroll =
-                        !isThereANewNotice &&
-                            !shouldAddNewMessagesNotice &&
-                            layoutManager?.findFirstVisibleItemPosition() == 0 ||
-                            adapter != null &&
-                            adapter?.itemCount == 0
+            chatMessage.activeUser = conversationUser
 
-                    if (!shouldAddNewMessagesNotice && !shouldScroll) {
-                        if (!binding.popupBubbleView.isShown) {
-                            newMessagesCount = 1
-                            binding.popupBubbleView.show()
-                        } else if (binding.popupBubbleView.isShown) {
-                            newMessagesCount++
-                        }
-                    } else {
-                        newMessagesCount = 0
-                    }
+            val shouldScroll =
+                !isThereANewNotice &&
+                    !shouldAddNewMessagesNotice &&
+                    layoutManager?.findFirstVisibleItemPosition() == 0 ||
+                    adapter != null &&
+                    adapter?.itemCount == 0
 
-                    if (adapter != null) {
-                        chatMessage.isGrouped = (
-                            adapter!!.isPreviousSameAuthor(
-                                chatMessage.actorId,
-                                -1
-                            ) && adapter!!.getSameAuthorLastMessagesCount(chatMessage.actorId) %
-                                GROUPED_MESSAGES_SAME_AUTHOR_THRESHOLD > 0
-                            )
-                        chatMessage.isOneToOneConversation =
-                            (currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)
-                        adapter?.addToStart(chatMessage, shouldScroll)
-                    }
+            if (!shouldAddNewMessagesNotice && !shouldScroll) {
+                if (!binding.popupBubbleView.isShown) {
+                    newMessagesCount = 1
+                    binding.popupBubbleView.show()
+                } else if (binding.popupBubbleView.isShown) {
+                    newMessagesCount++
                 }
+            } else {
+                newMessagesCount = 0
+            }
 
-                if (shouldAddNewMessagesNotice && adapter != null) {
-                    layoutManager?.scrollToPositionWithOffset(
-                        adapter!!.getMessagePositionByIdInReverse("-1"),
-                        binding.messagesListView.height / 2
+            if (adapter != null) {
+                chatMessage.isGrouped = (
+                    adapter!!.isPreviousSameAuthor(
+                        chatMessage.actorId,
+                        -1
+                    ) && adapter!!.getSameAuthorLastMessagesCount(chatMessage.actorId) %
+                        GROUPED_MESSAGES_SAME_AUTHOR_THRESHOLD > 0
                     )
-                }
+                chatMessage.isOneToOneConversation =
+                    (currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)
+                adapter?.addToStart(chatMessage, shouldScroll)
             }
+        }
+
+        if (shouldAddNewMessagesNotice && adapter != null) {
+            layoutManager?.scrollToPositionWithOffset(
+                adapter!!.getMessagePositionByIdInReverse("-1"),
+                binding.messagesListView.height / 2
+            )
+        }
+    }
 
-            // update read status of all messages
-            for (message in adapter!!.items) {
-                xChatLastCommonRead?.let {
-                    if (message.item is ChatMessage) {
-                        val chatMessage = message.item as ChatMessage
+    private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
+        var countGroupedMessages = 0
+        var previousMessageId = NO_PREVIOUS_MESSAGE_ID
+        for (i in chatMessageList.indices.reversed()) {
+            val chatMessage = chatMessageList[i]
 
-                        if (chatMessage.jsonMessageId <= it) {
-                            chatMessage.readStatus = ReadStatus.READ
-                        } else {
-                            chatMessage.readStatus = ReadStatus.SENT
-                        }
-                    }
+            if (previousMessageId > NO_PREVIOUS_MESSAGE_ID) {
+                chatMessage.previousMessageId = previousMessageId
+            } else if (adapter?.isEmpty != true) {
+                if (adapter!!.items[0].item is ChatMessage) {
+                    chatMessage.previousMessageId = (adapter!!.items[0].item as ChatMessage).jsonMessageId
+                } else if (adapter!!.items.size > 1 && adapter!!.items[1].item is ChatMessage) {
+                    chatMessage.previousMessageId = (adapter!!.items[1].item as ChatMessage).jsonMessageId
                 }
             }
-            adapter?.notifyDataSetChanged()
 
-            if (inConversation) {
-                pullChatMessages(1, 1, xChatLastCommonRead)
-            }
-        } else if (response.code() == HTTP_CODE_NOT_MODIFIED && !isFromTheFuture) {
-            if (isFirstMessagesProcessing) {
-                cancelNotificationsForCurrentConversation()
+            previousMessageId = chatMessage.jsonMessageId
+        }
 
-                isFirstMessagesProcessing = false
-                binding.progressBar.visibility = View.GONE
+        for (i in chatMessageList.indices) {
+            if (chatMessageList.size > i + 1) {
+                if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
+                    chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
+                    countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
+                ) {
+                    chatMessageList[i].isGrouped = true
+                    countGroupedMessages++
+                } else {
+                    countGroupedMessages = 0
+                }
             }
 
-            historyRead = true
+            val chatMessage = chatMessageList[i]
+            chatMessage.isOneToOneConversation =
+                currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
+            chatMessage.activeUser = conversationUser
+        }
 
-            if (!lookingIntoFuture && inConversation) {
-                pullChatMessages(1)
+        if (adapter != null) {
+            adapter?.addToEnd(chatMessageList, false)
+        }
+        scrollToRequestedMessageIfNeeded()
+    }
+
+    private fun processHeaderChatLastGiven(response: Response<*>, isFromTheFuture: Boolean) {
+        val xChatLastGivenHeader: String? = response.headers()["X-Chat-Last-Given"]
+        if (response.headers().size > 0 && !TextUtils.isEmpty(xChatLastGivenHeader)) {
+            val header = Integer.parseInt(xChatLastGivenHeader!!)
+            if (header > 0) {
+                if (isFromTheFuture) {
+                    globalLastKnownFutureMessageId = header
+                } else {
+                    if (globalLastKnownFutureMessageId == -1) {
+                        globalLastKnownFutureMessageId = header
+                    }
+                    globalLastKnownPastMessageId = header
+                }
             }
         }
     }