package com.ioabsoftware.gameraven.views.rowview;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.text.method.ArrowKeyMovementMethod;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.ioabsoftware.gameraven.AllInOneV2;
import com.ioabsoftware.gameraven.R;
import com.ioabsoftware.gameraven.util.Theming;
import com.ioabsoftware.gameraven.views.BaseRowData;
import com.ioabsoftware.gameraven.views.BaseRowView;
import com.ioabsoftware.gameraven.views.ClickableLinksTextView;
import com.ioabsoftware.gameraven.views.RowType;
import com.ioabsoftware.gameraven.views.rowdata.MessageRowData;
import com.koushikdutta.ion.Ion;
public class MessageRowView extends BaseRowView implements View.OnClickListener {
View topWrapper;
ImageView avatar;
TextView overflowIcon;
TextView user;
TextView post;
LinearLayout pollWrapper;
ClickableLinksTextView message;
private static float userTextSize = 0;
private static float postTextSize, messageTextSize;
MessageRowData myData;
MessageHeaderDrawable headerSelector;
boolean isHighlighted = false;
boolean isShowingPoll = false;
boolean isUsingAvatars = false;
boolean isDeleted = false;
public MessageRowView(Context context) {
super(context);
}
public MessageRowView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MessageRowView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void init(Context context) {
myType = RowType.MESSAGE;
LayoutInflater.from(context).inflate(R.layout.msgview, this, true);
topWrapper = findViewById(R.id.mvTopWrapper);
avatar = (ImageView) findViewById(R.id.mvAvatar);
overflowIcon = (TextView) findViewById(R.id.mvMessageMenuIcon);
user = (TextView) findViewById(R.id.mvUser);
post = (TextView) findViewById(R.id.mvPostNumber);
pollWrapper = (LinearLayout) findViewById(R.id.mvPollWrapper);
message = (ClickableLinksTextView) findViewById(R.id.mvMessage);
if (userTextSize == 0) {
userTextSize = user.getTextSize();
postTextSize = post.getTextSize();
messageTextSize = message.getTextSize();
}
ShapeDrawable d = new ShapeDrawable();
d.getPaint().setColor(Theming.colorPrimary());
headerSelector = new MessageHeaderDrawable(new Drawable[]{d});
topWrapper.setBackgroundDrawable(headerSelector);
topWrapper.setOnClickListener(this);
}
@Override
protected void retheme() {
user.setTextSize(PX, userTextSize * myScale);
post.setTextSize(PX, postTextSize * myScale);
message.setTextSize(PX, messageTextSize * myScale);
message.setLinkTextColor(Theming.colorAccent());
}
@Override
public void showView(BaseRowData data) {
if (data.getRowType() != myType)
throw new IllegalArgumentException("data RowType does not match myType");
myData = (MessageRowData) data;
if (isDeleted != myData.isDeleted()) {
isDeleted = myData.isDeleted();
if (isDeleted) {
findViewById(R.id.mvDeletedMessageWrapper).setVisibility(View.VISIBLE);
findViewById(R.id.mvDMSep).setBackgroundColor(Theming.colorPrimary());
topWrapper.setVisibility(View.GONE);
pollWrapper.setVisibility(View.GONE);
message.setVisibility(View.GONE);
} else {
findViewById(R.id.mvDeletedMessageWrapper).setVisibility(View.GONE);
topWrapper.setVisibility(View.VISIBLE);
pollWrapper.setVisibility(View.VISIBLE);
message.setVisibility(View.VISIBLE);
}
}
if (isDeleted) {
((TextView)findViewById(R.id.mvDMNum)).setText(myData.getPostNum());
return;
}
topWrapper.setClickable(myData.topClickable());
if (myData.topClickable())
overflowIcon.setVisibility(View.VISIBLE);
else
overflowIcon.setVisibility(View.INVISIBLE);
user.setText(myData.getUser() + myData.getUserTitles());
post.setText(myData.getPostNum() + ", Posted " + myData.getPostTime());
if (myData.hasPoll()) {
isShowingPoll = true;
pollWrapper.removeAllViews();
pollWrapper.addView(myData.getPoll());
pollWrapper.setVisibility(View.VISIBLE);
} else if (isShowingPoll) {
isShowingPoll = false;
pollWrapper.setVisibility(View.GONE);
pollWrapper.removeAllViews();
}
if (myData.getHLColor() == 0) {
if (isHighlighted) {
isHighlighted = false;
headerSelector.clearHighlightColor();
}
} else {
isHighlighted = true;
headerSelector.setHighlightColor(myData.getHLColor());
}
if (isUsingAvatars != globalIsUsingAvatars) {
isUsingAvatars = globalIsUsingAvatars;
if (isUsingAvatars) {
avatar.setVisibility(View.VISIBLE);
} else {
avatar.setVisibility(View.GONE);
}
}
if (isUsingAvatars)
Ion.with(avatar)
.placeholder(R.drawable.avatar_placeholder)
.error(R.drawable.avatar_default)
.load(myData.getAvatarUrl());
message.setText(myData.getSpannedMessage());
message.setMovementMethod(ArrowKeyMovementMethod.getInstance());
message.setTextIsSelectable(true);
// the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0);
headerSelector.invalidateDrawable(headerSelector);
}
/**
* @return selected text, or null if no text is selected
*/
public String getSelection() {
int start = message.getSelectionStart();
int end = message.getSelectionEnd();
if (start != end) {
if (start > end) {
int temp = end;
end = start;
start = temp;
}
return message.getText().subSequence(start, end).toString();
} else
return null;
}
@Override
public void onClick(View v) {
AllInOneV2.get().messageMenuClicked(this);
}
public String getMessageDetailLink() {
return myData.getMessageDetailLink();
}
public String getUserDetailLink() {
return myData.getUserDetailLink();
}
public boolean isEdited() {
return myData.isEdited();
}
public String getMessageID() {
return myData.getMessageID();
}
public String getUser() {
return myData.getUser();
}
public String getPostNum() {
return myData.getPostNum();
}
public String getMessageForQuoting() {
return myData.getMessageForQuoting();
}
public String getMessageForEditing() {
return myData.getMessageForEditing();
}
private static boolean globalIsUsingAvatars;
public static void setUsingAvatars(boolean set) {
globalIsUsingAvatars = set;
}
public boolean canReport() {
return myData.canReport();
}
public boolean canDelete() {
return myData.canDelete();
}
public boolean canEdit() {
return myData.canEdit();
}
public boolean canQuote() {
return myData.canQuote();
}
public class MessageHeaderDrawable extends LayerDrawable {
private int myColor, myClickedColor;
public MessageHeaderDrawable(Drawable[] layers) {
super(layers);
clearHighlightColor();
}
public void setHighlightColor(int myColorIn) {
myColor = myColorIn;
float[] hsv = new float[3];
Color.colorToHSV(myColor, hsv);
hsv[2] *= 0.8f;
myClickedColor = Color.HSVToColor(hsv);
onStateChange(getState());
}
public void clearHighlightColor() {
myColor = Theming.colorPrimary();
myClickedColor = Theming.colorPrimaryDark();
onStateChange(getState());
}
@Override
protected boolean onStateChange(int[] states) {
boolean isClicked = false;
for (int state : states) {
if (state == android.R.attr.state_focused || state == android.R.attr.state_pressed) {
isClicked = true;
}
}
if (isClicked) {
super.setColorFilter(myClickedColor, PorterDuff.Mode.SRC);
} else {
super.setColorFilter(myColor, PorterDuff.Mode.SRC);
}
return super.onStateChange(states);
}
@Override
public boolean isStateful() {
return true;
}
}
}