package org.thoughtcrime.securesms.components; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffXfermode; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import network.loki.messenger.R; public class HourglassView extends View { private final Paint foregroundPaint; private final Paint backgroundPaint; private final Paint progressPaint; private Bitmap empty; private Bitmap full; private float percentage; private int offset; public HourglassView(Context context) { this(context, null); } public HourglassView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public HourglassView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); int tint = 0; if (attrs != null) { TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HourglassView, 0, 0); this.empty = BitmapFactory.decodeResource(getResources(), typedArray.getResourceId(R.styleable.HourglassView_empty, 0)); this.full = BitmapFactory.decodeResource(getResources(), typedArray.getResourceId(R.styleable.HourglassView_full, 0)); this.percentage = typedArray.getInt(R.styleable.HourglassView_percentage, 50); this.offset = typedArray.getInt(R.styleable.HourglassView_offset, 0); tint = typedArray.getColor(R.styleable.HourglassView_tint, 0); typedArray.recycle(); } this.backgroundPaint = new Paint(); this.foregroundPaint = new Paint(); this.progressPaint = new Paint(); this.backgroundPaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.MULTIPLY)); this.foregroundPaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.MULTIPLY)); this.progressPaint.setColor(getResources().getColor(R.color.black)); this.progressPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); setLayerType(View.LAYER_TYPE_SOFTWARE, null); } @Override public void onDraw(Canvas canvas) { float progressHeight = (full.getHeight() - (offset*2)) * (percentage / 100); canvas.drawBitmap(full, 0, 0, backgroundPaint); canvas.drawRect(0, 0, full.getWidth(), offset + progressHeight, progressPaint); canvas.drawBitmap(empty, 0, 0, foregroundPaint); } public void setPercentage(float percentage) { this.percentage = percentage; invalidate(); } public void setTint(int tint) { this.backgroundPaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.MULTIPLY)); this.foregroundPaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.MULTIPLY)); } }