package im.actor.sdk.controllers.conversation.messages.content;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import im.actor.core.entity.Message;
import im.actor.core.entity.Peer;
import im.actor.sdk.ActorSDK;
import im.actor.sdk.R;
import im.actor.sdk.controllers.conversation.messages.MessagesAdapter;
import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedData;
import im.actor.sdk.controllers.conversation.messages.content.preprocessor.PreprocessedTextData;
import im.actor.sdk.util.Fonts;
import im.actor.sdk.view.TintImageView;
import static im.actor.sdk.util.ActorSDKMessenger.myUid;
public class TextHolder extends MessageHolder {
protected ViewGroup mainContainer;
protected FrameLayout messageBubble;
protected TextView text;
protected TextView time;
protected TintImageView status;
private int waitColor;
private int sentColor;
private int deliveredColor;
private int readColor;
private int errorColor;
public TextHolder(MessagesAdapter adapter, final View itemView, Peer peer) {
super(adapter, itemView, false);
mainContainer = (ViewGroup) itemView.findViewById(R.id.mainContainer);
messageBubble = (FrameLayout) itemView.findViewById(R.id.fl_bubble);
text = (TextView) itemView.findViewById(R.id.tv_text);
text.setTextColor(ActorSDK.sharedActor().style.getConvTextColor());
text.setTypeface(Fonts.regular());
time = (TextView) itemView.findViewById(R.id.tv_time);
ActorSDK.sharedActor().style.getConvTimeColor();
time.setTypeface(Fonts.regular());
time.setTextColor(ActorSDK.sharedActor().style.getConvTimeColor());
status = (TintImageView) itemView.findViewById(R.id.stateIcon);
waitColor = ActorSDK.sharedActor().style.getConvStatePendingColor();
sentColor = ActorSDK.sharedActor().style.getConvStateSentColor();
deliveredColor = ActorSDK.sharedActor().style.getConvStateDeliveredColor();
readColor = ActorSDK.sharedActor().style.getConvStateReadColor();
errorColor = ActorSDK.sharedActor().style.getConvStateErrorColor();
onConfigureViewHolder();
}
@Override
protected void bindData(final Message message, long readDate, long receiveDate, boolean isUpdated, PreprocessedData preprocessedData) {
PreprocessedTextData textData = (PreprocessedTextData) preprocessedData;
Spannable reactions = preprocessedData.getReactionsSpannable();
CharSequence text;
if (textData.getSpannableString() != null) {
text = textData.getSpannableString();
} else {
text = textData.getText();
}
bindRawText(text, readDate, receiveDate, reactions, message, false);
}
public void bindRawText(CharSequence rawText, long readDate, long receiveDate, Spannable reactions, Message message, boolean isItalic) {
text.setTag(R.id.peer, getPeer());
if (message.getSenderId() == myUid()) {
messageBubble.setBackgroundResource(R.drawable.bubble_text_out);
} else {
messageBubble.setBackgroundResource(R.drawable.bubble_text_in);
}
if (isItalic) {
text.setTypeface(Fonts.italic());
} else {
text.setTypeface(Fonts.regular());
}
text.setText(rawText);
// Fixing url long tap
text.setMovementMethod(new CustomLinkMovementMethod());
// Fixing span offsets
// if (rawText instanceof Spannable) {
// Spannable s = (Spannable) rawText;
// QuoteSpan[] qSpans = s.getSpans(0, s.length(), QuoteSpan.class);
// text.setMinimumWidth(0);
// if (qSpans.length > 0) {
// text.measure(0, 0);
// text.setMinimumWidth(text.getMeasuredWidth() + qSpans[0].getLeadingMargin(true));
// }
// }
if (message.getSenderId() == myUid()) {
status.setVisibility(View.VISIBLE);
switch (message.getMessageState()) {
case SENT:
if (message.getSortDate() <= readDate) {
status.setResource(R.drawable.msg_check_2);
status.setTint(readColor);
} else if (message.getSortDate() <= receiveDate) {
status.setResource(R.drawable.msg_check_2);
status.setTint(deliveredColor);
} else {
status.setResource(R.drawable.msg_check_1);
status.setTint(sentColor);
}
break;
default:
case PENDING:
status.setResource(R.drawable.msg_clock);
status.setTint(waitColor);
break;
case ERROR:
status.setResource(R.drawable.msg_error);
status.setTint(errorColor);
break;
}
} else {
status.setVisibility(View.GONE);
}
setTimeAndReactions(time);
}
class CustomLinkMovementMethod extends LinkMovementMethod {
@Override
public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {
super.onTouchEvent(textView, spannable, event);
mainContainer.onTouchEvent(event);
return true;
}
}
}