From bdab469f9680ff10917dc3f5324c9dcd82c5d7d3 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 4 Jul 2019 18:49:55 +0400 Subject: [PATCH] Grouping messages from the same author --- .../chatkit/commons/models/IMessage.java | 1 + .../chatkit/messages/MessageHolders.java | 13 +++++- .../chatkit/messages/MessagesListAdapter.java | 40 ++++++++++++++++++- .../sample/common/data/model/Message.java | 1 + .../CustomIncomingImageMessageViewHolder.java | 9 +++++ .../CustomIncomingTextMessageViewHolder.java | 8 ++++ .../item_custom_incoming_text_message.xml | 2 +- 7 files changed, 71 insertions(+), 3 deletions(-) diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IMessage.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IMessage.java index 4605aab3..52beca0e 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IMessage.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IMessage.java @@ -50,4 +50,5 @@ public interface IMessage { * @return the message creation date */ Date getCreatedAt(); + } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java index c089cbdf..88d69545 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java @@ -563,7 +563,7 @@ protected ViewHolder getHolder(ViewGroup parent, int viewType, MessagesListStyle } @SuppressWarnings("unchecked") - protected void bind(final ViewHolder holder, final Object item, boolean isSelected, + protected void bind(final ViewHolder holder, final Object item, boolean isSelected, boolean isContinuous, final ImageLoader imageLoader, final View.OnClickListener onMessageClickListener, final View.OnLongClickListener onMessageLongClickListener, @@ -572,6 +572,7 @@ protected void bind(final ViewHolder holder, final Object item, boolean isSelect if (item instanceof IMessage) { ((MessageHolders.BaseMessageViewHolder) holder).isSelected = isSelected; + ((BaseMessageViewHolder) holder).isContinuous = isContinuous; ((MessageHolders.BaseMessageViewHolder) holder).imageLoader = imageLoader; holder.itemView.setOnLongClickListener(onMessageLongClickListener); holder.itemView.setOnClickListener(onMessageClickListener); @@ -676,6 +677,7 @@ public static abstract class BaseMessageViewHolder ext boolean isSelected; + boolean isContinuous; /** * For setting custom data to ViewHolder */ @@ -705,6 +707,15 @@ public boolean isSelected() { return isSelected; } + /** + * Returns whether item belongs to the same user + * + * @return weather item belongs to the same user. + */ + public boolean isContinuous() { + return isContinuous; + } + /** * Returns weather is selection mode enabled * diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java index e0fcb8a2..b4bfad5f 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java @@ -19,6 +19,7 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.graphics.Paint; import android.support.annotation.LayoutRes; import android.support.v7.widget.RecyclerView; import android.text.Spannable; @@ -34,6 +35,7 @@ import com.stfalcon.chatkit.commons.ImageLoader; import com.stfalcon.chatkit.commons.ViewHolder; import com.stfalcon.chatkit.commons.models.IMessage; +import com.stfalcon.chatkit.commons.models.IUser; import com.stfalcon.chatkit.utils.DateFormatter; import java.util.ArrayList; @@ -103,13 +105,45 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @Override public void onBindViewHolder(ViewHolder holder, int position) { Wrapper wrapper = items.get(position); - holders.bind(holder, wrapper.item, wrapper.isSelected, imageLoader, + boolean isContinuous = false; + if (position > 0 && position != items.size() - 1) { + isContinuous = isContinuous(items.get(position), items.get(position - 1)); + } + holders.bind(holder, wrapper.item, wrapper.isSelected, isContinuous, imageLoader, getMessageClickListener(wrapper), getMessageLongClickListener(wrapper), dateHeadersFormatter, viewClickListenersArray); } + private boolean isContinuous(Wrapper currentMsg, Wrapper precedingMsg) { + // null check + if (currentMsg == null || precedingMsg == null) { + return false; + } + + IUser currentUser = null, precedingUser = null; + if (currentMsg.item instanceof IMessage) { + currentUser = ((IMessage) currentMsg.item).getUser(); + } else { + return false; + } + if (precedingMsg.item instanceof IMessage) { + precedingUser = ((IMessage) precedingMsg.item).getUser(); + } else { + return false; + } + + + System.out.println(" ------------------ " + (!(currentUser == null || precedingUser == null) + && currentUser.getId().equals(precedingUser.getId()))); + // If admin message or + return !(currentUser == null || precedingUser == null) + && currentUser.getId().equals(precedingUser.getId()); + + + } + @Override public int getItemCount() { return items.size(); @@ -155,7 +189,11 @@ public void addToStart(MESSAGE message, boolean scroll) { } Wrapper element = new Wrapper<>(message); items.add(0, element); + boolean isContinuous = isPreviousSameAuthor(message.getUser().getId(), 0); notifyItemRangeInserted(0, isNewMessageToday ? 2 : 1); + if (isContinuous) { + notifyItemChanged(1); + } if (layoutManager != null && scroll) { layoutManager.scrollToPosition(0); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Message.java b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Message.java index c24fd039..a458bafd 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Message.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Message.java @@ -18,6 +18,7 @@ public class Message implements IMessage, private User user; private Image image; private Voice voice; + private boolean isContinous; public Message(String id, User user, String text) { this(id, user, text, new Date()); diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java index 124b4cc4..9f6aecfa 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java @@ -1,5 +1,6 @@ package com.stfalcon.chatkit.sample.features.demo.custom.holder.holders.messages; +import android.animation.Animator; import android.view.View; import com.stfalcon.chatkit.messages.MessageHolders; @@ -29,5 +30,13 @@ public void onBind(Message message) { } else { onlineIndicator.setBackgroundResource(R.drawable.shape_bubble_offline); } + + if (isContinuous()) { + userAvatar.setVisibility(View.INVISIBLE); + onlineIndicator.setVisibility(View.GONE); + } else { + userAvatar.setVisibility(View.VISIBLE); + onlineIndicator.setVisibility(View.VISIBLE); + } } } \ No newline at end of file diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java index a846a840..fe1cc072 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java @@ -1,5 +1,6 @@ package com.stfalcon.chatkit.sample.features.demo.custom.holder.holders.messages; +import android.animation.Animator; import android.view.View; import com.stfalcon.chatkit.messages.MessageHolders; @@ -37,6 +38,13 @@ public void onClick(View view) { } } }); + if (isContinuous()) { + userAvatar.setVisibility(View.INVISIBLE); + onlineIndicator.setVisibility(View.GONE); + } else { + userAvatar.setVisibility(View.VISIBLE); + onlineIndicator.setVisibility(View.VISIBLE); + } } public static class Payload { diff --git a/sample/src/main/res/layout/item_custom_incoming_text_message.xml b/sample/src/main/res/layout/item_custom_incoming_text_message.xml index bc1bbd96..52d52e7c 100644 --- a/sample/src/main/res/layout/item_custom_incoming_text_message.xml +++ b/sample/src/main/res/layout/item_custom_incoming_text_message.xml @@ -9,7 +9,7 @@