package com.novoda.bonfire.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import com.novoda.bonfire.R;
public class MessageBubbleDrawable extends Drawable {
public enum Gravity {
START, END
}
private final Paint paint;
private final RectF rect;
private Gravity gravity;
private int messageBubblePadding;
private int messageBubbleCornerRadius;
private int bubbleCenterVertical;
private int bumpDiameter;
private int smallBubbleDiameter;
public MessageBubbleDrawable(Context context, @ColorRes int color, Gravity gravity) {
this.gravity = gravity;
rect = new RectF();
paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(context.getResources().getColor(color));
resolveDimensions(context.getResources());
}
private void resolveDimensions(Resources resources) {
messageBubblePadding = resources.getDimensionPixelSize(R.dimen.chat_message_bubble_left_margin);
messageBubbleCornerRadius = resources.getDimensionPixelSize(R.dimen.chat_message_bubble_corner_radius);
bubbleCenterVertical = resources.getDimensionPixelSize(R.dimen.chat_message_bump_vertical_position);
bumpDiameter = resources.getDimensionPixelSize(R.dimen.chat_message_bump_diameter);
smallBubbleDiameter = resources.getDimensionPixelSize(R.dimen.chat_message_small_bubble_diameter);
}
@Override
public void draw(Canvas canvas) {
int messageBubbleLeft = gravity == Gravity.START ? messageBubblePadding : 0;
int messageBubbleRight = gravity == Gravity.START ? canvas.getWidth() : canvas.getWidth() - messageBubblePadding;
int bumpCenterHorizontal = gravity == Gravity.START ? messageBubbleLeft : messageBubbleRight;
int smallBubbleCenterHorizontal = gravity == Gravity.START ? smallBubbleDiameter / 2 : canvas.getWidth() - smallBubbleDiameter / 2;
rect.set(messageBubbleLeft, 0, messageBubbleRight, canvas.getHeight());
canvas.drawRoundRect(rect, messageBubbleCornerRadius, messageBubbleCornerRadius, paint);
drawBubble(canvas, bumpCenterHorizontal, bubbleCenterVertical, bumpDiameter);
drawBubble(canvas, smallBubbleCenterHorizontal, bubbleCenterVertical, smallBubbleDiameter);
}
private void drawBubble(Canvas canvas, int xPosition, int yPosition, int diameter) {
int radius = diameter / 2;
rect.set(xPosition - radius, yPosition - radius, xPosition + radius, yPosition + radius);
canvas.drawRoundRect(rect, radius, radius, paint);
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}