package au.id.teda.broadband.usage.chart;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
import au.id.teda.broadband.usage.helper.LayoutHelper;
public class CustomDonughtChartStacked extends View {
// Debug tag pulled from main activity
//private final static String DEBUG_TAG = BaseActivity.DEBUG_TAG;
private int mDaysSoFar = -1;
//private int mDaysToGo;
private int mDaysTotal = -1;
private long mPeakUsed = -1;
//private long mPeakRemaining;
private long mPeakQuota = -1;
private long mOffpeakUsed = -1;
//private long mOffpeakRemaining;
private long mOffpeakQuota = -1;
private int backgroundWidth;
private int usageWidth;
private int backgroundColor;
private int backgroundColorAlt;
private int usageColor;
private int usageColorAlt;
private int BACKGROUND_PX = 30;
private int USAGE_PX = 25;
private int PADDING = 4;
private LayoutHelper mLayoutHelper;
private final RectF mRectF;
public CustomDonughtChartStacked(Context context) {
super(context);
//Log.d(DEBUG_TAG, "CustomDonughtChart");
mRectF = new RectF();
// Get chart colors
ChartBuilder mChartBuilder = new ChartBuilder(context);
backgroundColor = mChartBuilder.getBackgroundColor();
backgroundColorAlt = mChartBuilder.getBackgroundAltColor();
usageColor = mChartBuilder.getPeakColor();
usageColorAlt = mChartBuilder.getOffpeakColor();
// get chart widths
mLayoutHelper = new LayoutHelper(context);
backgroundWidth = (int) mLayoutHelper.getPxFromDp(BACKGROUND_PX);
usageWidth = (int) mLayoutHelper.getPxFromDp(USAGE_PX);
}
public void setDays(int daysSoFar, int daysToGo){
mDaysSoFar = daysSoFar;
//mDaysToGo = daysToGo;
mDaysTotal = daysSoFar + daysToGo;
}
public void setPeakUsage(long peak, long quota){
mPeakUsed = peak;
mPeakQuota = quota;
//mPeakRemaining = quota - peak;
}
public void setOffpeakUsage(long offpeak, long quota){
mOffpeakUsed = offpeak;
mOffpeakQuota = quota;
//mOffpeakRemaining = quota - offpeak;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Get view width and height
float width = (float)getWidth();
float height = (float)getHeight();
drawPeak(canvas, width, height);
drawOffpeak(canvas, width, height);
}
private void drawPeak(Canvas canvas, float width, float height) {
// Calculate line width based on stroke width
int lineWidth = (backgroundWidth/2);
float left = 0 + lineWidth + mLayoutHelper.getPxFromDp(PADDING);
float top = 0 + lineWidth + mLayoutHelper.getPxFromDp(PADDING);
float right = width - lineWidth - mLayoutHelper.getPxFromDp(PADDING);
float bottom = height - lineWidth - mLayoutHelper.getPxFromDp(PADDING);
// Used to restrain canvas
mRectF.set(left, top, right, bottom);
// Draw days
drawDays(canvas, mRectF);
// Draw dev
drawPeakUsage(canvas, mRectF);
}
private void drawOffpeak(Canvas canvas, float width, float height) {
// Calculate line width based on stroke width
int lineWidth = (backgroundWidth/2);
float left = backgroundWidth + lineWidth + mLayoutHelper.getPxFromDp(PADDING);
float top = backgroundWidth + lineWidth + mLayoutHelper.getPxFromDp(PADDING);
float right = width - lineWidth - backgroundWidth - mLayoutHelper.getPxFromDp(PADDING);
float bottom = height - lineWidth - backgroundWidth - mLayoutHelper.getPxFromDp(PADDING);
// Used to restrain canvas
mRectF.set(left, top, right, bottom);
// Draw days
drawDays(canvas, mRectF);
// Draw dev
drawOffpeakUsage(canvas, mRectF);
}
private void drawDays(Canvas canvas, RectF rect){
// Calculate percentage ratios
float soFar = ( (float) mDaysSoFar / mDaysTotal );
//float toGo = ( (float) mDaysToGo / mDaysTotal );
// Calculate angle based on percentage ratios
int angleSoFar = (int) (soFar * 360);
int angleTotal = 360;
int angleToGo = (angleTotal - angleSoFar);
// Calculate arc lengths based on angles
int arcStart = -90;
int arcSoFar = arcStart + angleSoFar;
//int arcToGo = arcStart + angleTotal;
//Set the canvas values
Paint paint = new Paint();
paint.setColor(backgroundColor);
paint.setStrokeWidth(backgroundWidth);
paint.setAntiAlias(true);
paint.setStrokeCap(Paint.Cap.BUTT);
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(rect, arcStart, angleSoFar, false, paint);
Paint paint2 = new Paint();
paint2.setColor(backgroundColorAlt);
paint2.setStrokeWidth(backgroundWidth);
paint2.setAntiAlias(true);
paint2.setStrokeCap(Paint.Cap.BUTT);
paint2.setStyle(Paint.Style.STROKE);
canvas.drawArc(rect, arcSoFar, angleToGo, false, paint2);
}
private void drawPeakUsage(Canvas canvas, RectF rect){
// Calculate percentage ratios
float used = ( (float) mPeakUsed / mPeakQuota );
//float remaining = ( (float) mPeakRemaining / mPeakQuota );
// Calculate angle based on percentage ratios
int angleUsed = (int) (used * 360);
//int angleTotal = 360;
//int angleRemaining = (angleTotal - angleUsed);
// Calculate arc lengths based on angles
int arcStart = -90;
//int arcUsed = arcStart + angleUsed;
//int arcRemaining = arcStart + angleTotal;
//Set the canvas values
Paint paint = new Paint();
paint.setColor(usageColor);
paint.setStrokeWidth(usageWidth);
paint.setAntiAlias(true);
paint.setStrokeCap(Paint.Cap.BUTT);
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(rect, arcStart, angleUsed, false, paint);
}
private void drawOffpeakUsage(Canvas canvas, RectF rect){
// Calculate percentage ratios
float used = ( (float) mOffpeakUsed / mOffpeakQuota );
//float remaining = ( (float) mOffpeakRemaining / mOffpeakQuota );
// Calculate angle based on percentage ratios
int angleUsed = (int) (used * 360);
//int angleTotal = 360;
//int angleRemaining = (angleTotal - angleUsed);
// Calculate arc lengths based on angles
int arcStart = -90;
//int arcUsed = arcStart + angleUsed;
//int arcRemaining = arcStart + angleTotal;
//Set the canvas values
Paint paint = new Paint();
paint.setColor(usageColorAlt);
paint.setStrokeWidth(usageWidth);
paint.setAntiAlias(true);
paint.setStrokeCap(Paint.Cap.BUTT);
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(rect, arcStart, angleUsed, false, paint);
}
}