package com.gh4a.widget; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.support.annotation.NonNull; import android.text.style.ReplacementSpan; import com.gh4a.R; import com.gh4a.utils.ApiHelpers; import com.gh4a.utils.UiUtils; import org.eclipse.egit.github.core.Label; public class IssueLabelSpan extends ReplacementSpan { private final RectF mTmpRect = new RectF(); private final int mFgColor; private final int mBgColor; private final int mPadding; private final int mRightAndBottomMargin; private final float mTextSize; private int mAscent; private int mDescent; public IssueLabelSpan(Context context, Label label, boolean withMargin) { super(); mBgColor = ApiHelpers.colorForLabel(label); mFgColor = UiUtils.textColorForBackground(context, mBgColor); Resources res = context.getResources(); mPadding = res.getDimensionPixelSize(R.dimen.issue_label_padding); mRightAndBottomMargin = withMargin ? res.getDimensionPixelSize(R.dimen.issue_label_margin) : 0; mTextSize = res.getDimension(R.dimen.issue_label_text_size); } @Override public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { paint.setTextSize(mTextSize); if (fm != null) { paint.getFontMetricsInt(fm); mAscent = -fm.ascent; mDescent = fm.descent; fm.top -= mPadding; fm.ascent -= mPadding; fm.bottom += mPadding + mRightAndBottomMargin; fm.descent += mPadding + mRightAndBottomMargin; } float textSize = paint.measureText(text, start, end); return (int) Math.ceil(textSize) + 2 * mPadding + mRightAndBottomMargin; } @Override public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { paint.setTextSize(mTextSize); float textSize = paint.measureText(text, start, end); final float bgLeft = x; final float bgRight = bgLeft + textSize + 2 * mPadding; final float bgTop = y - mAscent - mPadding; final float bgBottom = y + mDescent + mPadding; final float cornerRadius = mPadding; paint.setColor(mBgColor); mTmpRect.set(bgLeft, bgTop, bgRight, bgBottom); canvas.drawRoundRect(mTmpRect, cornerRadius, cornerRadius, paint); paint.setColor(mFgColor); canvas.drawText(text, start, end, x + mPadding, y, paint); } }