1package eu.siacs.conversations.ui.text;
 2
 3import android.graphics.Canvas;
 4import android.graphics.Paint;
 5import android.text.Layout;
 6import android.text.TextPaint;
 7import android.text.style.CharacterStyle;
 8import android.text.style.LeadingMarginSpan;
 9import android.util.DisplayMetrics;
10import android.util.TypedValue;
11
12import androidx.annotation.ColorInt;
13
14public class QuoteSpan extends CharacterStyle implements LeadingMarginSpan {
15
16	private final int color;
17
18	private final int width;
19	private final int paddingLeft;
20	private final int paddingRight;
21
22	private static final float WIDTH_SP = 2f;
23	private static final float PADDING_LEFT_SP = 1.5f;
24	private static final float PADDING_RIGHT_SP = 8f;
25
26	public QuoteSpan(int color, DisplayMetrics metrics) {
27		this.color = color;
28		this.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, WIDTH_SP, metrics);
29		this.paddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, PADDING_LEFT_SP, metrics);
30		this.paddingRight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, PADDING_RIGHT_SP, metrics);
31	}
32
33	@Override
34	public void updateDrawState(TextPaint tp) {
35		tp.setColor(this.color);
36	}
37
38	@Override
39	public int getLeadingMargin(boolean first) {
40		return paddingLeft + width + paddingRight;
41	}
42
43	@Override
44	public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom,
45			CharSequence text, int start, int end, boolean first, Layout layout) {
46		Paint.Style style = p.getStyle();
47		int color = p.getColor();
48		p.setStyle(Paint.Style.FILL);
49		p.setColor(this.color);
50		c.drawRect(x + dir * paddingLeft, top, x + dir * (paddingLeft + width), bottom, p);
51		p.setStyle(style);
52		p.setColor(color);
53	}
54
55	@ColorInt
56	public int getColor() {
57		return this.color;
58	}
59}