package au.id.teda.broadband.usage.chart;
import java.util.List;
import au.id.teda.broadband.usage.helper.AccountStatusHelper;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.DefaultRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.content.Context;
import android.util.Log;
import au.id.teda.broadband.usage.R;
import au.id.teda.broadband.usage.activity.BaseActivity;
public class ChartBuilder {
//protected static final String DEBUG_TAG = BaseActivity.DEBUG_TAG;
private Context mContext;
//private double maxDataUsage = 0;
long accumAnytime;
long accumPeak;
long accumPeakStacked;
long accumOffpeak = 0;
// Color values for focus and alternate
public final int colorBackgroundLight;
public final int colorBackground;
public final int colorBase;
public final int colorBaseLight;
public final int colorBaseLighter;
public final int colorBaseDark;
public final int colorBaseDarker;
public final int colorAccent;
public final int iPeakColor;
public final int iOffpeakColor;
public final int iUploadColor;
private final String xAxes;
//private final static int LEGEND_TEXT_SIZE = 18;
//private final static int LABEL_TEXT_SIZE = 12;
// Chart builder constructor
public ChartBuilder(Context context) {
mContext = context;
colorBase = mContext.getResources().getColor(R.color.chart_base);
colorBaseLight = mContext.getResources().getColor(R.color.chart_base_light);
colorBaseLighter = mContext.getResources().getColor(R.color.chart_base_lighter);
colorBaseDark = mContext.getResources().getColor(R.color.chart_base_dark);
colorBaseDarker = mContext.getResources().getColor(R.color.chart_base_darker);
colorBackgroundLight = mContext.getResources().getColor(R.color.background_alt_light);
colorBackground = mContext.getResources().getColor(R.color.background_alt);
colorAccent = mContext.getResources().getColor(R.color.accent);
iPeakColor = mContext.getResources().getColor(R.color.chart_peak);
iOffpeakColor = mContext.getResources().getColor(R.color.chart_offpeak);
iUploadColor = mContext.getResources().getColor(R.color.chart_upload);
// Chart strings
xAxes = mContext.getResources().getString(R.string.fragment_daily_usage_chart_x_title);
}
public int getAccentColor() {
return colorAccent;
}
public int getPeakColor() {
return iPeakColor;
}
public int getPeakFillColor(){
return colorBaseLight;
}
public int getPeakTrendColor(){
return colorBase;
}
public int getOffpeakColor() {
return iOffpeakColor;
}
public int getOffpeakFillColor(){
return colorBaseLighter;
}
public int getOffpeakTrendColor(){
return colorBase;
}
public int getUploadColor() {
return iUploadColor;
}
public int getUploadFillColor(){
return colorBaseLight;
}
public int getUploadTrendColor(){
return colorBase;
}
public int getLabelColor() {
return colorBaseDarker;
}
public int getBackgroundColor() {
return colorBackground;
}
public int getBackgroundAltColor() {
return colorBackgroundLight;
}
/**
* Calculate pixel value for dip
* @param dip value to be converted
* @return pixel value of dip for current screen density
*/
protected float getPixelDip(int dip){
final float scale = mContext.getResources().getDisplayMetrics().density;
float pixels = (dip * scale + 0.5f);
return pixels;
}
public float getLegendTextSize(int dip){
return getPixelDip(dip);
}
public float getLabelsTextSize(int dip){
return getPixelDip(dip);
}
/**
* Get string X-Axis from XML
*
* @return String value
*/
public String getXAxes() {
return xAxes;
}
/**
* Builds a bar multiple series renderer to use the provided colors.
*
* @param colors the series renderers colors
* @return the bar multiple series renderer
*/
protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(25);
int length = colors.length;
for (int i = 0; i < length; i++) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(colors[i]);
renderer.addSeriesRenderer(r);
}
return renderer;
}
/**
* Builds an XY multiple series renderer.
*
* @param colors the series rendering colors
* @param styles the series point styles
* @return the XY multiple series renderers
*/
protected XYMultipleSeriesRenderer buildRenderer(int[] colors,
PointStyle[] styles) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
setRenderer(renderer, colors, styles);
return renderer;
}
protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors,
PointStyle[] styles) {
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[] { 20, 30, 15, 20 });
int length = colors.length;
for (int i = 0; i < length; i++) {
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
r.setPointStyle(styles[i]);
renderer.addSeriesRenderer(r);
}
}
/**
* Builds a bar multiple series dataset using the provided values.
*
* @param titles the series titles
* @param values the values
* @return the XY multiple bar dataset
*/
protected XYMultipleSeriesDataset buildBarDataset(String[] titles,
List<double[]> values) {
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
int length = titles.length;
for (int i = 0; i < length; i++) {
CategorySeries series = new CategorySeries(titles[i]);
double[] v = values.get(i);
int seriesLength = v.length;
for (int k = 0; k < seriesLength; k++) {
series.add(v[k]);
}
dataset.addSeries(series.toXYSeries());
}
return dataset;
}
/**
* Builds a category renderer to use the provided colors.
*
* @param colors the colors
* @return the category renderer
*/
protected DefaultRenderer buildCategoryRenderer(int[] colors) {
DefaultRenderer renderer = new DefaultRenderer();
for (int color : colors) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(color);
renderer.addSeriesRenderer(r);
}
return renderer;
}
/**
* Method for returning the number of calendar days for this period
*
* @return
*/
protected int getChartDays() {
AccountStatusHelper status = new AccountStatusHelper(mContext);
int daysSoFare = status.getDaysSoFar();
int daysToGo = status.getDaysToGo();
int chartDays = daysSoFare + daysToGo + 1;
return chartDays;
}
// Calculate peak upload based on percentage value between peak & offpeak
public long peakUploadGuess(Long peak, Long offpeak, Long upload){
// Calculate floating point percentage of peak upload
float percentage = (float) peak / (float) (peak + offpeak);
// Cacluate peak upload from percentage
float peakUpload = upload * percentage;
// Cast to long and return peak upload
return (long) peakUpload;
}
// Calculate offpeak upload based on percentage value between peak & offpeak
public long offpeakUploadGuess(Long peak, Long offpeak, Long upload){
// Calculate floating point percentage of peak upload
float percentage = (float) peak / (float) (peak + offpeak);
// Cacluate peak upload from percentage
float offpeakUpload = upload * percentage;
// Cast to long and return peak upload
return (long) offpeakUpload;
}
}