/* * FreeOTP * * Authors: Nathaniel McCallum <npmccallum@redhat.com> * * Copyright (C) 2013 Nathaniel McCallum, Red Hat * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fedorahosted.freeotp; import android.content.Context; import android.content.res.Resources.Theme; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; public class ProgressCircle extends View { private Paint mPaint; private RectF mRectF; private Rect mRect; private int mProgress; private int mMax; private boolean mHollow; private float mPadding; private float mStrokeWidth; public ProgressCircle(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setup(context, attrs); } public ProgressCircle(Context context, AttributeSet attrs) { super(context, attrs); setup(context, attrs); } public ProgressCircle(Context context) { super(context); setup(context, null); } private void setup(Context context, AttributeSet attrs) { DisplayMetrics dm = getResources().getDisplayMetrics(); mPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, dm); mStrokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, dm); mRectF = new RectF(); mRect = new Rect(); mPaint = new Paint(); mPaint.setARGB(0x99, 0x33, 0x33, 0x33); mPaint.setAntiAlias(true); mPaint.setStrokeCap(Paint.Cap.BUTT); if (attrs != null) { Theme t = context.getTheme(); TypedArray a = t.obtainStyledAttributes(attrs, R.styleable.ProgressCircle, 0, 0); try { setMax(a.getInteger(R.styleable.ProgressCircle_max, 100)); setHollow(a.getBoolean(R.styleable.ProgressCircle_hollow, false)); } finally { a.recycle(); } } } public void setMax(int max) { this.mMax = max; } public int getMax() { return mMax; } public void setHollow(boolean hollow) { mHollow = hollow; mPaint.setStyle(hollow ? Style.STROKE : Style.FILL); mPaint.setStrokeWidth(hollow ? mStrokeWidth : 0); } public boolean getHollow() { return mHollow; } public void setProgress(int progress) { mProgress = progress; int percent = mProgress * 100 / getMax(); if (percent > 25 || mProgress == 0) mPaint.setARGB(0x99, 0x33, 0x33, 0x33); else mPaint.setARGB(0x99, 0xff, 0xe0 * percent / 25, 0x00); invalidate(); } @Override protected void onDraw(Canvas canvas) { getDrawingRect(mRect); mRect.left += getPaddingLeft() + mPadding; mRect.top += getPaddingTop() + mPadding; mRect.right -= getPaddingRight() + mPadding; mRect.bottom -= getPaddingBottom() + mPadding; mRectF.set(mRect); canvas.drawArc(mRectF, -90, mProgress * 360 / getMax(), !mHollow, mPaint); } }