mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
Reduce complexity for function 'ChatController#processMessages'
Signed-off-by: Tim Krüger <t@timkrueger.me>
This commit is contained in:
parent
f762d0c9e5
commit
4cab75f6ed
@ -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,49 +2321,51 @@ 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 (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
|
||||
}
|
||||
}
|
||||
|
||||
previousMessageId = chatMessage.jsonMessageId
|
||||
}
|
||||
|
||||
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++
|
||||
if (isFromTheFuture) {
|
||||
processMessagesFromTheFuture(chatMessageList)
|
||||
} else {
|
||||
countGroupedMessages = 0
|
||||
processMessagesNotFromTheFuture(chatMessageList)
|
||||
}
|
||||
|
||||
updateReadStatusOfAllMessages(xChatLastCommonRead)
|
||||
adapter?.notifyDataSetChanged()
|
||||
|
||||
if (inConversation) {
|
||||
pullChatMessages(1, 1, xChatLastCommonRead)
|
||||
}
|
||||
} else if (response.code() == HTTP_CODE_NOT_MODIFIED && !isFromTheFuture) {
|
||||
if (isFirstMessagesProcessing) {
|
||||
cancelNotificationsForCurrentConversation()
|
||||
|
||||
isFirstMessagesProcessing = false
|
||||
binding.progressBar.visibility = View.GONE
|
||||
}
|
||||
|
||||
historyRead = true
|
||||
|
||||
if (!lookingIntoFuture && inConversation) {
|
||||
pullChatMessages(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val chatMessage = chatMessageList[i]
|
||||
chatMessage.isOneToOneConversation =
|
||||
currentConversation?.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
|
||||
chatMessage.activeUser = conversationUser
|
||||
}
|
||||
private fun updateReadStatusOfAllMessages(xChatLastCommonRead: Int?) {
|
||||
for (message in adapter!!.items) {
|
||||
xChatLastCommonRead?.let {
|
||||
if (message.item is ChatMessage) {
|
||||
val chatMessage = message.item as ChatMessage
|
||||
|
||||
if (adapter != null) {
|
||||
adapter?.addToEnd(chatMessageList, false)
|
||||
}
|
||||
scrollToRequestedMessageIfNeeded()
|
||||
if (chatMessage.jsonMessageId <= it) {
|
||||
chatMessage.readStatus = ReadStatus.READ
|
||||
} else {
|
||||
chatMessage.readStatus = ReadStatus.SENT
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun processMessagesFromTheFuture(chatMessageList: List<ChatMessage>) {
|
||||
var chatMessage: ChatMessage
|
||||
|
||||
val shouldAddNewMessagesNotice = (adapter?.itemCount ?: 0) > 0 && chatMessageList.isNotEmpty()
|
||||
@ -2453,37 +2444,63 @@ class ChatController(args: Bundle) :
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
previousMessageId = chatMessage.jsonMessageId
|
||||
}
|
||||
|
||||
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 {
|
||||
chatMessage.readStatus = ReadStatus.SENT
|
||||
countGroupedMessages = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
adapter?.notifyDataSetChanged()
|
||||
|
||||
if (inConversation) {
|
||||
pullChatMessages(1, 1, xChatLastCommonRead)
|
||||
}
|
||||
} else if (response.code() == HTTP_CODE_NOT_MODIFIED && !isFromTheFuture) {
|
||||
if (isFirstMessagesProcessing) {
|
||||
cancelNotificationsForCurrentConversation()
|
||||
|
||||
isFirstMessagesProcessing = false
|
||||
binding.progressBar.visibility = View.GONE
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user