package au.id.teda.broadband.usage.chart;
import android.webkit.WebStorage;
import au.id.teda.broadband.usage.helper.AccountInfoHelper;
import org.achartengine.ChartFactory;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import au.id.teda.broadband.usage.R;
import au.id.teda.broadband.usage.util.DailyVolumeUsage;
//TODO: Add uploads to chart
public class StackedBarChart extends ChartBuilder {
// Debug tag pulled from main activity
//private final static String DEBUG_TAG = BaseActivity.DEBUG_TAG;
// Activity context to be used
private Context mContext;
// Helper classes
private AccountInfoHelper mAccountInfo;
private int MB = 1000000;
private double max = 0;
public StackedBarChart(Context context) {
super(context);
this.mContext = context;
mAccountInfo = new AccountInfoHelper(mContext);
}
public View getBarChartView (DailyVolumeUsage[] usage){
return ChartFactory.getBarChartView(mContext,
getStackedBarChartDataSet(usage),
getStackedBarChartRenderer(),
Type.STACKED);
}
public double getMaxDataUsage() {
return max;
}
protected XYMultipleSeriesDataset getStackedBarChartDataSet(DailyVolumeUsage[] usage) {
if(mAccountInfo.isAccountAnyTime()){
return getAnytimeDataset(usage);
} else {
return getPeakOffpeakDataset(usage);
}
}
private XYMultipleSeriesRenderer getStackedBarChartRenderer() {
if (mAccountInfo.isAccountAnyTime()){
return getAnytimeSeriesRenderer();
} else {
return getPeakOffpeakSeriesRenderer();
}
}
private XYMultipleSeriesDataset getAnytimeDataset(DailyVolumeUsage[] usage) {
// Set String value categories for graph
CategorySeries anytimeSeries = new CategorySeries(mContext.getString(R.string.chart_data_series_anytime));
CategorySeries uploadsSeries = new CategorySeries(mContext.getString(R.string.chart_data_series_upload));
long dailyQuota = mAccountInfo.getAnyTimeQuotaDailyMb();
for (DailyVolumeUsage volumeUsage : usage) {
long upload = (volumeUsage.uploads / MB);
long anytime = (volumeUsage.anytime / MB);
long anytimeUsage = anytime - upload;
long uploadUsage = upload;
long anytimeUsageStaked = anytimeUsage;
long uploadUsageStaked = anytimeUsageStaked + uploadUsage;
// Add current cursor values to data series
uploadsSeries.add(uploadUsageStaked);
anytimeSeries.add(anytimeUsageStaked);
// Set max data dev for rendering graph
if (max < uploadUsageStaked) {
max = uploadUsageStaked * 1.05;
}
if (max < dailyQuota) {
max = dailyQuota * 1.05;
}
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(uploadsSeries.toXYSeries());
dataset.addSeries(anytimeSeries.toXYSeries());
return dataset;
}
private XYMultipleSeriesDataset getPeakOffpeakDataset(DailyVolumeUsage[] usage) {
// Set String value categories for graph
CategorySeries peakSeries = new CategorySeries(mContext.getString(R.string.chart_data_series_peak));
CategorySeries uploadsSeries = new CategorySeries(mContext.getString(R.string.chart_data_series_upload));
CategorySeries offpeakSeries = new CategorySeries(mContext.getString(R.string.chart_data_series_offpeak));
long dailyQuota = mAccountInfo.getPeakQuotaDailyMb() + mAccountInfo.getOffpeakQuotaDailyMb();
for (DailyVolumeUsage volumeUsage : usage) {
// Get and set usage values
long peak = (volumeUsage.peak / MB);
long offpeak = (volumeUsage.offpeak / MB);
long upload = (volumeUsage.uploads / MB);
long peakUsage = peak - peakUploadGuess(peak, offpeak, upload);
long offpeakUsage = offpeak - offpeakUploadGuess(peak, offpeak, upload);
long uploadUsage = upload;
long peakUsageStaked = peakUsage;
long offpeakUsageStaked = peakUsageStaked + offpeakUsage;
long uploadUsageStaked = offpeakUsageStaked + uploadUsage;
// Add current cursor values to data series
peakSeries.add(peakUsageStaked);
offpeakSeries.add(offpeakUsageStaked);
uploadsSeries.add(uploadUsageStaked);
// Set max data dev for rendering graph
if (max < uploadUsageStaked) {
max = uploadUsageStaked * 1.05;
}
if (max < dailyQuota) {
max = dailyQuota * 1.05;
}
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(uploadsSeries.toXYSeries());
dataset.addSeries(offpeakSeries.toXYSeries());
dataset.addSeries(peakSeries.toXYSeries());
return dataset;
}
private XYMultipleSeriesRenderer getAnytimeSeriesRenderer() {
// Set data series color
int[] colors = new int[] { getUploadColor(), getPeakColor() };
// Load and initialise render objects
XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
renderer.setXAxisMin(0);
renderer.setXAxisMax(getChartDays());
renderer.setYAxisMin(0);
renderer.setYAxisMax(getMaxDataUsage());
renderer.setLabelsColor(getLabelColor());
renderer.setXLabelsColor(getLabelColor());
// Chart render settings
renderer.setApplyBackgroundColor(true);
renderer.setBackgroundColor(Color.TRANSPARENT);
renderer.setMarginsColor(getBackgroundColor());
renderer.setPanEnabled(false, false);
renderer.setFitLegend(true);
renderer.setLabelsTextSize(getLabelsTextSize(12));
renderer.setLegendTextSize(getLegendTextSize(12));
renderer.setAxesColor(getLabelColor());
renderer.setAntialiasing(true);
renderer.setBarSpacing(0.5f);
return renderer;
}
private XYMultipleSeriesRenderer getPeakOffpeakSeriesRenderer() {
// Set data series color
int[] colors = new int[] { getUploadColor(), getOffpeakColor(), getPeakColor() };
// Load and initialise render objects
XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
renderer.setXAxisMin(0);
renderer.setXAxisMax(getChartDays());
renderer.setYAxisMin(0);
renderer.setYAxisMax(getMaxDataUsage());
renderer.setLabelsColor(getLabelColor());
renderer.setXLabelsColor(getLabelColor());
// Chart render settings
renderer.setApplyBackgroundColor(true);
renderer.setBackgroundColor(Color.TRANSPARENT);
renderer.setMarginsColor(getBackgroundColor());
renderer.setPanEnabled(false, false);
renderer.setFitLegend(true);
renderer.setLabelsTextSize(getLabelsTextSize(12));
renderer.setLegendTextSize(getLegendTextSize(12));
renderer.setAxesColor(getLabelColor());
renderer.setAntialiasing(true);
renderer.setBarSpacing(0.5f);
return renderer;
}
}