That fuck shit the fascists are using
at master 76 lines 2.2 kB view raw
1package org.tm.archive.components; 2 3import android.content.Context; 4import android.graphics.drawable.Drawable; 5import android.graphics.drawable.GradientDrawable; 6import android.graphics.drawable.LayerDrawable; 7 8import org.tm.archive.R; 9 10public class BubbleDrawableBuilder { 11 private int color; 12 private int shadowColor; 13 private boolean hasShadow = true; 14 private boolean[] corners = new boolean[]{true,true,true,true}; 15 16 protected BubbleDrawableBuilder() { } 17 18 public BubbleDrawableBuilder setColor(int color) { 19 this.color = color; 20 return this; 21 } 22 23 public BubbleDrawableBuilder setShadowColor(int shadowColor) { 24 this.shadowColor = shadowColor; 25 return this; 26 } 27 28 public BubbleDrawableBuilder setHasShadow(boolean hasShadow) { 29 this.hasShadow = hasShadow; 30 return this; 31 } 32 33 public BubbleDrawableBuilder setCorners(boolean[] corners) { 34 this.corners = corners; 35 return this; 36 } 37 38 public Drawable create(Context context) { 39 final GradientDrawable bubble = new GradientDrawable(); 40 final int radius = context.getResources().getDimensionPixelSize(R.dimen.message_bubble_corner_radius); 41 final float[] radii = cornerBooleansToRadii(corners, radius); 42 43 bubble.setColor(color); 44 bubble.setCornerRadii(radii); 45 46 if (!hasShadow) { 47 return bubble; 48 } else { 49 final GradientDrawable shadow = new GradientDrawable(); 50 final int distance = context.getResources().getDimensionPixelSize(R.dimen.message_bubble_shadow_distance); 51 52 shadow.setColor(shadowColor); 53 shadow.setCornerRadii(radii); 54 55 final LayerDrawable layers = new LayerDrawable(new Drawable[]{shadow, bubble}); 56 layers.setLayerInset(1, 0, 0, 0, distance); 57 return layers; 58 } 59 } 60 61 private float[] cornerBooleansToRadii(boolean[] corners, int radius) { 62 if (corners == null || corners.length != 4) { 63 throw new AssertionError("there are four corners in a rectangle, silly"); 64 } 65 66 float[] radii = new float[8]; 67 int i = 0; 68 for (boolean corner : corners) { 69 radii[i] = radii[i+1] = corner ? radius : 0; 70 i += 2; 71 } 72 73 return radii; 74 } 75 76}