blob: b9d514c8ea5c0d86f6b8282137ec0e8605871ff9 [file] [log] [blame]
package org.wordpress.android.ui.notifications.blocks;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.view.View;
import org.json.JSONObject;
import org.wordpress.android.R;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.util.JSONUtils;
/**
* A clickable span that includes extra ids/urls
* Maps to a 'range' in a WordPress.com note object
*/
public class NoteBlockClickableSpan extends ClickableSpan {
private long mId;
private long mSiteId;
private long mPostId;
private NoteBlockRangeType mRangeType;
private String mUrl;
private int[] mIndices;
private boolean mPressed;
private boolean mShouldLink;
private boolean mIsFooter;
private int mTextColor;
private int mBackgroundColor;
private int mLinkColor;
private int mLightTextColor;
private final JSONObject mBlockData;
public NoteBlockClickableSpan(Context context, JSONObject blockData, boolean shouldLink, boolean isFooter) {
mBlockData = blockData;
mShouldLink = shouldLink;
mIsFooter = isFooter;
// Text/background colors
mTextColor = context.getResources().getColor(R.color.grey_dark);
mBackgroundColor = context.getResources().getColor(R.color.pressed_wordpress);
mLinkColor = context.getResources().getColor(R.color.blue_medium);
mLightTextColor = context.getResources().getColor(R.color.grey);
processRangeData();
}
private void processRangeData() {
if (mBlockData != null) {
mId = JSONUtils.queryJSON(mBlockData, "id", 0);
mSiteId = JSONUtils.queryJSON(mBlockData, "site_id", 0);
mPostId = JSONUtils.queryJSON(mBlockData, "post_id", 0);
mRangeType = NoteBlockRangeType.fromString(JSONUtils.queryJSON(mBlockData, "type", ""));
mUrl = JSONUtils.queryJSON(mBlockData, "url", "");
mIndices = NotificationsUtils.getIndicesForRange(mBlockData);
mShouldLink = shouldLinkRangeType();
// Apply grey color to some types
if (mIsFooter || getRangeType() == NoteBlockRangeType.BLOCKQUOTE || getRangeType() == NoteBlockRangeType.POST) {
mTextColor = mLightTextColor;
}
}
}
// Don't link certain range types, or unknown ones, unless we have a URL
private boolean shouldLinkRangeType() {
return mShouldLink &&
mRangeType != NoteBlockRangeType.BLOCKQUOTE &&
mRangeType != NoteBlockRangeType.MATCH &&
(mRangeType != NoteBlockRangeType.UNKNOWN || !TextUtils.isEmpty(mUrl));
}
@Override
public void updateDrawState(@NonNull TextPaint textPaint) {
// Set background color
textPaint.bgColor = mShouldLink && mPressed && !isBlockquoteType() ?
mBackgroundColor : Color.TRANSPARENT;
textPaint.setColor(mShouldLink && !mIsFooter ? mLinkColor : mTextColor);
// No underlines
textPaint.setUnderlineText(mIsFooter);
}
private boolean isBlockquoteType() {
return getRangeType() == NoteBlockRangeType.BLOCKQUOTE;
}
// return the desired style for this id type
public int getSpanStyle() {
if (mIsFooter) {
return Typeface.BOLD;
}
switch (getRangeType()) {
case USER:
case MATCH:
return Typeface.BOLD;
case SITE:
case POST:
case COMMENT:
case BLOCKQUOTE:
return Typeface.ITALIC;
default:
return Typeface.NORMAL;
}
}
@Override
public void onClick(View widget) {
// noop
}
public NoteBlockRangeType getRangeType() {
return mRangeType;
}
public int[] getIndices() {
return mIndices;
}
public long getId() {
return mId;
}
public long getSiteId() {
return mSiteId;
}
public long getPostId() {
return mPostId;
}
public void setPressed(boolean isPressed) {
this.mPressed = isPressed;
}
public String getUrl() {
return mUrl;
}
public void setCustomType(String type) {
mRangeType = NoteBlockRangeType.fromString(type);
}
}