UnreadCountCustomView.java

 1package eu.siacs.conversations.ui.widget;
 2
 3import android.content.Context;
 4import android.content.res.TypedArray;
 5import android.graphics.Canvas;
 6import android.graphics.Color;
 7import android.graphics.Paint;
 8import android.graphics.Typeface;
 9import android.support.v4.content.ContextCompat;
10import android.util.AttributeSet;
11import android.view.View;
12
13import eu.siacs.conversations.R;
14
15public class UnreadCountCustomView extends View {
16
17    private int unreadCount;
18    private Paint paint, textPaint;
19    private int backgroundColor = 0xff326130;
20
21    public UnreadCountCustomView(Context context) {
22        super(context);
23        init();
24    }
25
26    public UnreadCountCustomView(Context context, AttributeSet attrs) {
27        super(context, attrs);
28        initXMLAttrs(context, attrs);
29        init();
30    }
31
32    public UnreadCountCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
33        super(context, attrs, defStyleAttr);
34        initXMLAttrs(context, attrs);
35        init();
36    }
37
38    private void initXMLAttrs(Context context, AttributeSet attrs) {
39        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UnreadCountCustomView);
40        setBackgroundColor(a.getColor(a.getIndex(0), ContextCompat.getColor(context, R.color.green700_desaturated)));
41        a.recycle();
42    }
43
44    void init() {
45        paint = new Paint();
46        paint.setColor(backgroundColor);
47        paint.setAntiAlias(true);
48        textPaint = new Paint();
49        textPaint.setColor(Color.WHITE);
50        textPaint.setTextAlign(Paint.Align.CENTER);
51        textPaint.setAntiAlias(true);
52        textPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
53    }
54
55    @Override
56    protected void onDraw(Canvas canvas) {
57        super.onDraw(canvas);
58        float midx = canvas.getWidth() / 2.0f;
59        float midy = canvas.getHeight() / 2.0f;
60        float radius = Math.min(canvas.getWidth(), canvas.getHeight()) / 2.0f;
61        float textOffset = canvas.getWidth() / 6.0f;
62        textPaint.setTextSize(0.95f * radius);
63        canvas.drawCircle(midx, midy, radius * 0.94f, paint);
64        canvas.drawText(unreadCount > 999 ? "\u221E" : String.valueOf(unreadCount), midx, midy + textOffset, textPaint);
65
66    }
67
68    public void setUnreadCount(int unreadCount) {
69        this.unreadCount = unreadCount;
70        invalidate();
71    }
72
73    public void setBackgroundColor(int backgroundColor) {
74        this.backgroundColor = backgroundColor;
75    }
76}