package io.kaif.mobile.view.drawable;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.content.res.ResourcesCompat;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import io.kaif.mobile.R;
import io.kaif.mobile.view.util.Views;
public class NewsFeedBadgeDrawable extends Drawable {
private long count;
private TextPaint textPaint;
private Paint circlePaint;
private final Resources resources;
private final Drawable icon;
private StaticLayout textLayout;
private int countRadius;
public NewsFeedBadgeDrawable(Resources resources) {
this.resources = resources;
icon = ResourcesCompat.getDrawable(resources, R.drawable.ic_notifications_white, null);
textPaint = new TextPaint();
textPaint.setTextSize((int) (11.0f * resources.getDisplayMetrics().density + 0.5f));
textPaint.setColor(resources.getColor(android.R.color.white));
textPaint.setAntiAlias(true);
circlePaint = new Paint();
circlePaint.setColor(0xffff0000);
circlePaint.setAntiAlias(true);
changeCount(0);
}
@Override
public void draw(Canvas canvas) {
icon.draw(canvas);
if (count == 0) {
return;
}
canvas.save();
canvas.translate(Views.convertDpToPixel(24, resources), Views.convertDpToPixel(8, resources));
canvas.drawCircle(0, 0, countRadius, circlePaint);
canvas.translate(-textLayout.getWidth() / 2 - 1, -textLayout.getHeight() / 2 - 1);
textLayout.draw(canvas);
canvas.restore();
}
@Override
public void setAlpha(int alpha) {
icon.setAlpha(alpha);
textPaint.setAlpha(alpha);
circlePaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
icon.setColorFilter(cf);
textPaint.setColorFilter(cf);
circlePaint.setColorFilter(cf);
}
@Override
public int getIntrinsicHeight() {
return (int) Views.convertDpToPixel(36, resources);
}
@Override
public int getIntrinsicWidth() {
return (int) Views.convertDpToPixel(36, resources);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
private String count() {
return count > 10 ? "10+" : String.valueOf(count);
}
public final void changeCount(int count) {
this.count = count;
int textWidth = (int) (textPaint.measureText(count()));
textLayout = new StaticLayout(count(),
textPaint,
textWidth,
Layout.Alignment.ALIGN_CENTER,
1.0f,
0.0f,
false);
countRadius = (int) (Math.sqrt(Math.pow(textLayout.getWidth() / 2.0, 2)
+ Math.pow(textLayout.getHeight() / 2.0, 2)));
}
@Override
protected void onBoundsChange(Rect bounds) {
int size = (int) Views.convertDpToPixel(24, resources);
int horizontalPadding = Math.max(0, (bounds.width() - size) / 2);
int verticalPadding = Math.max(0, (bounds.height() - size) / 2);
icon.setBounds(horizontalPadding,
verticalPadding,
Math.min(horizontalPadding + size, bounds.right),
Math.min(verticalPadding + size, bounds.bottom));
}
}