package im.actor.sdk.controllers.conversation.messages.content; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.method.LinkMovementMethod; import android.view.View; import android.widget.TextView; import im.actor.sdk.ActorSDK; import im.actor.sdk.controllers.conversation.messages.MessagesAdapter; import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedData; import im.actor.sdk.controllers.conversation.view.BubbleContainer; import im.actor.sdk.controllers.conversation.view.ReactionSpan; import im.actor.sdk.util.DateFormatting; import im.actor.core.entity.Message; import im.actor.core.entity.Peer; import im.actor.core.entity.PeerType; import static im.actor.sdk.util.ActorSDKMessenger.myUid; import static im.actor.sdk.util.ActorSDKMessenger.users; public abstract class MessageHolder extends AbsMessageViewHolder implements BubbleContainer.OnAvatarClickListener, BubbleContainer.OnAvatarLongClickListener, View.OnClickListener, View.OnLongClickListener { protected MessagesAdapter adapter; protected BubbleContainer container; protected boolean isFullSize; protected Message currentMessage; protected Spannable reactions; protected boolean hasMyReaction; public MessageHolder(MessagesAdapter adapter, final View itemView, boolean isFullSize) { super(itemView); this.adapter = adapter; this.container = (BubbleContainer) itemView; this.isFullSize = isFullSize; if (isFullSize) { container.makeFullSizeBubble(); } else { container.setOnClickListener((View.OnClickListener) this); container.setOnClickListener((BubbleContainer.OnAvatarClickListener) this); container.setOnLongClickListener((View.OnLongClickListener) this); container.setOnLongClickListener((BubbleContainer.OnAvatarLongClickListener) this); } } public void setOnline(boolean online, boolean isBot) { container.setOnline(online, isBot); } public MessagesAdapter getAdapter() { return adapter; } public Peer getPeer() { return adapter.getMessagesFragment().getPeer(); } @Override public final void bindData(Message message, Message prev, Message next, long readDate, long receiveDate, PreprocessedData preprocessedData) { boolean isUpdated = currentMessage == null || currentMessage.getRid() != message.getRid(); currentMessage = message; // Date div boolean useDiv; if (prev != null) { useDiv = !DateFormatting.areSameDays(prev.getDate(), message.getDate()); } else { useDiv = true; } if (useDiv) { container.showDate(message.getDate()); } else { container.hideDate(); } // Unread if (message.getRid() == adapter.getFirstUnread()) { container.showUnread(); } else { container.hideUnread(); } // Bubble layout if (!isFullSize) { if (message.getSenderId() == myUid()) { container.makeOutboundBubble(); } else { boolean isGroupBot = getPeer().getPeerType().equals(PeerType.GROUP) && users().get(message.getSenderId()).getName().get().equals("Bot"); container.makeInboundBubble( getPeer().getPeerType() == PeerType.GROUP || !ActorSDK.sharedActor().style.isShowAvatarInTitle() || (!ActorSDK.sharedActor().style.isShowAvatarPrivateInTitle() && getPeer().getPeerType() == PeerType.PRIVATE), message.getSenderId(), isGroupBot ? getPeer().getPeerId() : 0); } } // Updating selection state container.setBubbleSelected(adapter.isSelected(currentMessage)); hasMyReaction = false; if (preprocessedData != null) { reactions = preprocessedData.getReactionsSpannable(); if (reactions != null) { for (ReactionSpan r : reactions.getSpans(0, reactions.length(), ReactionSpan.class)) { if (r.hasMyReaction()) { hasMyReaction = true; } } } } // Bind content bindData(message, readDate, receiveDate, isUpdated, preprocessedData); } protected abstract void bindData(Message message, long readDate, long receiveDate, boolean isUpdated, PreprocessedData preprocessedData); @Override public void onAvatarClick(int uid) { adapter.getMessagesFragment().onAvatarClick(uid); } @Override public void onAvatarLongClick(int uid) { adapter.getMessagesFragment().onAvatarLongClick(uid); } @Override public final void onClick(View v) { if (currentMessage != null) { if (!adapter.getMessagesFragment().onClick(currentMessage)) { onClick(currentMessage); } } } public void onClick(Message currentMessage) { } @Override public boolean onLongClick(View v) { if (currentMessage != null) { return adapter.getMessagesFragment().onLongClick(currentMessage, hasMyReaction); } return false; } @Override public void unbind() { currentMessage = null; } protected void setTimeAndReactions(TextView time) { Spannable timeWithReactions = null; if (reactions != null) { SpannableStringBuilder builder = new SpannableStringBuilder(reactions); timeWithReactions = builder.append(DateFormatting.formatTime(currentMessage.getDate())); } time.setText(timeWithReactions != null ? timeWithReactions : DateFormatting.formatTime(currentMessage.getDate())); time.setMovementMethod(LinkMovementMethod.getInstance()); } }