package agency.tango.android.avatarview; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import agency.tango.android.avatarview.utils.StringUtils; public class AvatarPlaceholder extends Drawable { public static final String DEFAULT_PLACEHOLDER_STRING = "-"; private static final String DEFAULT_PLACEHOLDER_COLOR = "#3F51B5"; private static final String COLOR_FORMAT = "#FF%06X"; public static final int DEFAULT_TEXT_SIZE_PERCENTAGE = 33; private Paint textPaint; private Paint backgroundPaint; private RectF placeholderBounds; private String avatarText; private int textSizePercentage; private String defaultString; private float textStartXPoint; private float textStartYPoint; public AvatarPlaceholder(String name) { this(name, DEFAULT_TEXT_SIZE_PERCENTAGE, DEFAULT_PLACEHOLDER_STRING); } public AvatarPlaceholder(String name, @IntRange int textSizePercentage) { this(name, textSizePercentage, DEFAULT_PLACEHOLDER_STRING); } public AvatarPlaceholder(String name, @NonNull String defaultString) { this(name, DEFAULT_TEXT_SIZE_PERCENTAGE, defaultString); } public AvatarPlaceholder(String name, @IntRange int textSizePercentage, @NonNull String defaultString) { this.defaultString = resolveStringWhenNoName(defaultString); this.avatarText = convertNameToAvatarText(name); this.textSizePercentage = textSizePercentage; textPaint = new Paint(); textPaint.setAntiAlias(true); textPaint.setColor(Color.parseColor("white")); textPaint.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL)); backgroundPaint = new Paint(); backgroundPaint.setAntiAlias(true); backgroundPaint.setStyle(Paint.Style.FILL); backgroundPaint.setColor(Color.parseColor(convertStringToColor(name))); } @Override public void draw(@NonNull Canvas canvas) { if (placeholderBounds == null) { placeholderBounds = new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); setAvatarTextValues(); } canvas.drawRect(placeholderBounds, backgroundPaint); canvas.drawText(avatarText, textStartXPoint, textStartYPoint, textPaint); } @Override public void setAlpha(int alpha) { textPaint.setAlpha(alpha); backgroundPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter colorFilter) { textPaint.setColorFilter(colorFilter); backgroundPaint.setColorFilter(colorFilter); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } private void setAvatarTextValues() { textPaint.setTextSize(calculateTextSize()); textStartXPoint = calculateTextStartXPoint(); textStartYPoint = calculateTextStartYPoint(); } private float calculateTextStartXPoint() { float stringWidth = textPaint.measureText(avatarText); return (getBounds().width() / 2f) - (stringWidth / 2f); } private float calculateTextStartYPoint() { return (getBounds().height() / 2f) - ((textPaint.ascent() + textPaint.descent()) / 2f); } private String resolveStringWhenNoName(String stringWhenNoName) { return StringUtils.isNotNullOrEmpty(stringWhenNoName) ? stringWhenNoName : DEFAULT_PLACEHOLDER_STRING; } private String convertNameToAvatarText(String name) { return StringUtils.isNotNullOrEmpty(name) ? name.substring(0, 1).toUpperCase() : defaultString; } private String convertStringToColor(String text) { return StringUtils.isNullOrEmpty(text) ? DEFAULT_PLACEHOLDER_COLOR : String.format(COLOR_FORMAT, (0xFFFFFF & text.hashCode())); } private float calculateTextSize() { if (textSizePercentage < 0 || textSizePercentage > 100) { textSizePercentage = DEFAULT_TEXT_SIZE_PERCENTAGE; } return getBounds().height() * (float) textSizePercentage / 100; } }