From 3e2a0ab8ae4ff59520646b89a52e03dda2bc39e4 Mon Sep 17 00:00:00 2001 From: Adizbek Date: Sat, 4 May 2019 15:13:35 +0500 Subject: [PATCH 1/6] Group user avatar if author the same --- .../android/chatroom/adapter/BaseViewHolder.kt | 4 +++- .../android/chatroom/adapter/ChatRoomAdapter.kt | 12 +++++++++++- .../android/chatroom/adapter/MessageViewHolder.kt | 13 ++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt index 68b420e7d5..fb792f5876 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt @@ -29,13 +29,15 @@ abstract class BaseViewHolder>( ) : RecyclerView.ViewHolder(itemView), MenuItem.OnMenuItemClickListener { var data: T? = null + var groupMessage = false init { setupActionMenu(itemView) } - fun bind(data: T) { + fun bind(data: T, groupMessage: Boolean = false) { this.data = data + this.groupMessage = groupMessage bindViews(data) bindReactions() } diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index ad1788ee43..327f3eb55d 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -106,9 +106,19 @@ class ChatRoomAdapter( } } + var groupMessage = false + + dataSet[position].message.sender?.let { a -> + dataSet[position + 1].message.sender?.let { b -> + if (a.id.equals(b.id)) { + groupMessage = true + } + } + } + when (holder) { is MessageViewHolder -> - holder.bind(dataSet[position] as MessageUiModel) + holder.bind(dataSet[position] as MessageUiModel, groupMessage) is UrlPreviewViewHolder -> { holder.bind(dataSet[position] as UrlPreviewUiModel) } diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt index 7773d483d3..09c9efcf47 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt @@ -77,11 +77,18 @@ class MessageViewHolder( read_receipt_view.isVisible = true } - image_avatar.setOnClickListener { - data.message.sender?.id?.let { userId -> - avatarListener(userId) + if (!groupMessage) { + image_avatar.setOnClickListener { + data.message.sender?.id?.let { userId -> + avatarListener(userId) + } + } + } else { + image_avatar.visibility = View.GONE } + + } } From b0781eef75f7bac1f8ac1077638d58e6af36ddc3 Mon Sep 17 00:00:00 2001 From: Adizbek Date: Sat, 4 May 2019 16:54:37 +0500 Subject: [PATCH 2/6] Updates. --- .../chatroom/adapter/ChatRoomAdapter.kt | 47 ++++++++++++++++--- .../chatroom/adapter/MessageViewHolder.kt | 17 ++++++- app/src/main/res/layout/item_message.xml | 3 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index 327f3eb55d..9a6f948aad 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -1,5 +1,6 @@ package chat.rocket.android.chatroom.adapter +import android.content.res.Resources import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -22,6 +23,9 @@ import chat.rocket.core.model.attachment.actions.ButtonAction import chat.rocket.core.model.isSystemMessage import timber.log.Timber import java.security.InvalidParameterException +import java.util.Calendar +import kotlin.Comparator +import kotlin.collections.ArrayList class ChatRoomAdapter( private val roomId: String? = null, @@ -108,12 +112,11 @@ class ChatRoomAdapter( var groupMessage = false - dataSet[position].message.sender?.let { a -> - dataSet[position + 1].message.sender?.let { b -> - if (a.id.equals(b.id)) { - groupMessage = true - } - } + if (position + 1 < dataSet.size) { + val a = dataSet[position].message + val b = dataSet[position + 1].message + + groupMessage = shouldGroupMessage(a, b) } when (holder) { @@ -129,6 +132,23 @@ class ChatRoomAdapter( } } + + private fun shouldGroupMessage(a: Message, b: Message): Boolean { + a.sender?.let { u1 -> + b.sender?.let { u2 -> + if (u1.id.equals(u2.id)) { + val date1 = a.getDate() + val date2 = b.getDate() + + if (date1.isSameDay(date2)) + return true + } + } + } + + return false + } + override fun getItemId(position: Int): Long { val model = dataSet[position] return when (model) { @@ -346,3 +366,18 @@ class ChatRoomAdapter( fun reportMessage(id: String) } } + +fun Message.getDate(): Calendar { + return Calendar.getInstance().apply { + timeInMillis = this@getDate.timestamp + } +} + +fun Calendar.isSameDay(other: Calendar): Boolean { + return this.get(Calendar.YEAR) == other.get(Calendar.YEAR) && + this.get(Calendar.MONTH) == other.get(Calendar.MONTH) && + this.get(Calendar.DAY_OF_MONTH) == other.get(Calendar.DAY_OF_MONTH) +} + +val Int.toPx: Float + get() = (this * Resources.getSystem().displayMetrics.density) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt index 09c9efcf47..0e785f3ff4 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt @@ -6,6 +6,7 @@ import android.text.Spannable import android.text.method.LinkMovementMethod import android.text.style.ImageSpan import android.view.View +import android.view.ViewGroup import androidx.core.view.isVisible import chat.rocket.android.R import chat.rocket.android.chatroom.uimodel.MessageUiModel @@ -78,14 +79,26 @@ class MessageViewHolder( } if (!groupMessage) { + layout_avatar.visibility = View.VISIBLE + message_header.visibility = View.VISIBLE + (text_content.layoutParams as ViewGroup.MarginLayoutParams).apply { + marginStart = 16.toPx.toInt() + } + image_avatar.setOnClickListener { data.message.sender?.id?.let { userId -> avatarListener(userId) } - } } else { - image_avatar.visibility = View.GONE + layout_avatar.visibility = View.GONE + message_header.visibility = View.GONE + + (text_content.layoutParams as ViewGroup.MarginLayoutParams).apply { + marginStart = 56.toPx.toInt() + } + + image_avatar.setOnClickListener(null) } diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index 9f1e708032..662ddf1ed1 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -147,6 +147,7 @@ From bddb8d1e2dcf8d7681c89396c72af23a080e0afe Mon Sep 17 00:00:00 2001 From: Adizbek Date: Sun, 5 May 2019 07:12:26 +0500 Subject: [PATCH 3/6] Disable groupping, as in web. --- .../rocket/android/chatroom/adapter/ChatRoomAdapter.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index 9a6f948aad..ccd226e491 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -18,6 +18,7 @@ import chat.rocket.android.emoji.EmojiReactionListener import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.openTabbedUrl import chat.rocket.core.model.Message +import chat.rocket.core.model.attachment.Attachment import chat.rocket.core.model.attachment.actions.Action import chat.rocket.core.model.attachment.actions.ButtonAction import chat.rocket.core.model.isSystemMessage @@ -117,6 +118,12 @@ class ChatRoomAdapter( val b = dataSet[position + 1].message groupMessage = shouldGroupMessage(a, b) + + a.attachments?.let { + if(it.any { a -> a.type != null }){ // check if message media attachment. + groupMessage = false + } + } } when (holder) { @@ -140,7 +147,7 @@ class ChatRoomAdapter( val date1 = a.getDate() val date2 = b.getDate() - if (date1.isSameDay(date2)) + if (date1.isSameDay(date2) && date1.timeInMillis - date2.timeInMillis <= 900000) // this should be depend on settings. return true } } From 154de6ee6044ba77c2752924af5c87c4feef1c9b Mon Sep 17 00:00:00 2001 From: Adizbek Date: Sun, 5 May 2019 07:12:59 +0500 Subject: [PATCH 4/6] Fix --- .../java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index ccd226e491..caeedfc8f2 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -18,7 +18,6 @@ import chat.rocket.android.emoji.EmojiReactionListener import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.openTabbedUrl import chat.rocket.core.model.Message -import chat.rocket.core.model.attachment.Attachment import chat.rocket.core.model.attachment.actions.Action import chat.rocket.core.model.attachment.actions.ButtonAction import chat.rocket.core.model.isSystemMessage From 76bdab8224674b94952ec69ea2e24cc48c53dc90 Mon Sep 17 00:00:00 2001 From: Adizbek Date: Tue, 14 May 2019 12:10:53 +0500 Subject: [PATCH 5/6] Fix. --- .../android/chatroom/adapter/MessageViewHolder.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt index 0e785f3ff4..9528fb2076 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt @@ -7,6 +7,7 @@ import android.text.method.LinkMovementMethod import android.text.style.ImageSpan import android.view.View import android.view.ViewGroup +import androidx.core.view.isGone import androidx.core.view.isVisible import chat.rocket.android.R import chat.rocket.android.chatroom.uimodel.MessageUiModel @@ -79,8 +80,9 @@ class MessageViewHolder( } if (!groupMessage) { - layout_avatar.visibility = View.VISIBLE - message_header.visibility = View.VISIBLE + layout_avatar.isVisible = true + message_header.isVisible = true + (text_content.layoutParams as ViewGroup.MarginLayoutParams).apply { marginStart = 16.toPx.toInt() } @@ -91,8 +93,8 @@ class MessageViewHolder( } } } else { - layout_avatar.visibility = View.GONE - message_header.visibility = View.GONE + layout_avatar.isGone = true + message_header.isGone = true (text_content.layoutParams as ViewGroup.MarginLayoutParams).apply { marginStart = 56.toPx.toInt() From 1f441b2e92d4f7d21c36ddd06a88a00b3d8fc188 Mon Sep 17 00:00:00 2001 From: Adizbek Date: Tue, 14 May 2019 14:06:53 +0500 Subject: [PATCH 6/6] Code cleanup. Checking by user alias. --- .../chatroom/adapter/ChatRoomAdapter.kt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index caeedfc8f2..02fc6a98e0 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -119,7 +119,7 @@ class ChatRoomAdapter( groupMessage = shouldGroupMessage(a, b) a.attachments?.let { - if(it.any { a -> a.type != null }){ // check if message media attachment. + if (it.any { a -> a.type != null }) { // check if message media attachment. groupMessage = false } } @@ -140,16 +140,12 @@ class ChatRoomAdapter( private fun shouldGroupMessage(a: Message, b: Message): Boolean { - a.sender?.let { u1 -> - b.sender?.let { u2 -> - if (u1.id.equals(u2.id)) { - val date1 = a.getDate() - val date2 = b.getDate() - - if (date1.isSameDay(date2) && date1.timeInMillis - date2.timeInMillis <= 900000) // this should be depend on settings. - return true - } - } + if (a.senderAlias == b.senderAlias) { + val date1 = a.getDate() + val date2 = b.getDate() + + if (date1.isSameDay(date2) && date1.timeInMillis - date2.timeInMillis <= 900000) // this should be depend on settings. + return true } return false