group chat messages

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
sowjanyakch 2024-10-07 09:04:57 +02:00
parent bf6e703419
commit 036485e28d
No known key found for this signature in database
GPG Key ID: F7AA2A8B65B50220
2 changed files with 49 additions and 16 deletions

View File

@ -2666,11 +2666,10 @@ class ChatActivity :
chatMessage.activeUser = conversationUser chatMessage.activeUser = conversationUser
adapter?.let { adapter?.let {
chatMessage.isGrouped = ( val lastItemIndex = adapter!!.itemCount - 1
it.isPreviousSameAuthor(chatMessage.actorId, -1) && val previousChatMessage = adapter!!.items[lastItemIndex].item as ChatMessage
it.getSameAuthorLastMessagesCount(chatMessage.actorId) % chatMessage.isGrouped = groupMessages(chatMessage, previousChatMessage)
GROUPED_MESSAGES_SAME_AUTHOR_THRESHOLD > 0
)
chatMessage.isOneToOneConversation = chatMessage.isOneToOneConversation =
(currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) (currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL)
chatMessage.isFormerOneToOneConversation = chatMessage.isFormerOneToOneConversation =
@ -2716,19 +2715,9 @@ class ChatActivity :
} }
private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) { private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
var countGroupedMessages = 0
for (i in chatMessageList.indices) { for (i in chatMessageList.indices) {
if (chatMessageList.size > i + 1) { if (chatMessageList.size > i + 1) {
if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) && chatMessageList[i].isGrouped = groupMessages(chatMessageList[i], chatMessageList[i + 1])
chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
) {
chatMessageList[i].isGrouped = true
countGroupedMessages++
} else {
countGroupedMessages = 0
}
} }
val chatMessage = chatMessageList[i] val chatMessage = chatMessageList[i]
@ -2754,6 +2743,40 @@ class ChatActivity :
} }
} }
private fun groupMessages(message1: ChatMessage, message2: ChatMessage): Boolean {
val message1IsSystem = message1.systemMessage.isNotEmpty()
val message2IsSystem = message2.systemMessage.isNotEmpty()
if (message1IsSystem != message2IsSystem) {
return false
}
if (message1.actorType == "bots" && message1.actorId != "changelog") {
return false
}
if (!message1IsSystem && (
(message1.actorType != message2.actorType) ||
(message2.actorId != message1.actorId)
)
) {
return false
}
val timeDifference = dateUtils.getTimeDifferenceInSeconds(
message2.timestamp,
message1.timestamp
)
val isLessThan5Min = timeDifference > 300
if (isSameDayMessages(message2, message1) &&
(message2.actorId == message1.actorId) &&
(!isLessThan5Min) &&
(message2.lastEditTimestamp == 0L || message1.lastEditTimestamp == 0L)
) {
return true
}
return false
}
private fun determinePreviousMessageIds(chatMessageList: List<ChatMessage>) { private fun determinePreviousMessageIds(chatMessageList: List<ChatMessage>) {
var previousMessageId = NO_PREVIOUS_MESSAGE_ID var previousMessageId = NO_PREVIOUS_MESSAGE_ID
for (i in chatMessageList.indices.reversed()) { for (i in chatMessageList.indices.reversed()) {
@ -2840,6 +2863,10 @@ class ChatActivity :
TextUtils.isEmpty(messageRight.systemMessage) && TextUtils.isEmpty(messageRight.systemMessage) &&
DateFormatter.isSameDay(messageLeft.createdAt, messageRight.createdAt) DateFormatter.isSameDay(messageLeft.createdAt, messageRight.createdAt)
private fun isSameDayMessages(message1: ChatMessage, message2: ChatMessage): Boolean {
return DateFormatter.isSameDay(message1.createdAt, message2.createdAt)
}
override fun onLoadMore(page: Int, totalItemsCount: Int) { override fun onLoadMore(page: Int, totalItemsCount: Int) {
val id = ( val id = (
adapter?.items?.last { adapter?.items?.last {

View File

@ -15,6 +15,7 @@ import com.nextcloud.talk.R
import java.text.DateFormat import java.text.DateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Date import java.util.Date
import kotlin.math.abs
import kotlin.math.roundToInt import kotlin.math.roundToInt
class DateUtils(val context: Context) { class DateUtils(val context: Context) {
@ -50,6 +51,11 @@ class DateUtils(val context: Context) {
return formatTime.format(Date(timestampSeconds * DateConstants.SECOND_DIVIDER)) return formatTime.format(Date(timestampSeconds * DateConstants.SECOND_DIVIDER))
} }
fun getTimeDifferenceInSeconds(time2: Long, time1: Long): Long {
val difference = (time2 - time1)
return abs(difference)
}
fun relativeStartTimeForLobby(timestampMilliseconds: Long, resources: Resources): String { fun relativeStartTimeForLobby(timestampMilliseconds: Long, resources: Resources): String {
val fmt = RelativeDateTimeFormatter.getInstance() val fmt = RelativeDateTimeFormatter.getInstance()
val timeLeftMillis = timestampMilliseconds - System.currentTimeMillis() val timeLeftMillis = timestampMilliseconds - System.currentTimeMillis()