package com.evancharlton.mileage.charts; import com.artfulbits.aiCharts.Base.ChartPoint; import com.artfulbits.aiCharts.Base.ChartPointCollection; import com.artfulbits.aiCharts.Base.ChartSeries; import com.artfulbits.aiCharts.Types.ChartTypes; import com.evancharlton.mileage.ChartActivity; import com.evancharlton.mileage.dao.Fillup; import com.evancharlton.mileage.dao.Vehicle; import com.evancharlton.mileage.provider.tables.FillupsTable; import com.evancharlton.mileage.provider.tables.VehiclesTable; import android.database.Cursor; import java.util.Date; public abstract class LineChart extends ChartActivity { private ChartPointCollection mPoints; protected abstract String getAxisTitle(); protected abstract ChartGenerator createChartGenerator(); protected final void createSeries(LineChartGenerator generator, ChartPointCollection points, Cursor cursor, Vehicle vehicle) { mPoints = points; // TODO(3.1) - consolidate this while loop processCursor(generator, cursor, vehicle); } protected final void addPoint(Date date, double value) { mPoints.addDate(date, value); } protected final void addPoint(long timestamp, double value) { addPoint(new Date(timestamp), value); } protected abstract void processCursor(LineChartGenerator generator, Cursor cursor, Vehicle vehicle); protected final Vehicle getVehicle() { Cursor cursor = managedQuery(VehiclesTable.BASE_URI, VehiclesTable.PROJECTION, Vehicle._ID + " = ?", new String[] { getIntent().getStringExtra(VEHICLE_ID) }, null); return new Vehicle(cursor); } @Override protected final Object serializeData() { return getChart().getSeries().get(0).getPoints().toArray(); } @Override protected final void unserializeData(Object saved) { ChartPoint[] savedData = (ChartPoint[]) saved; if (savedData != null) { ChartSeries series = new ChartSeries(getAxisTitle().toString(), ChartTypes.Line); ChartPointCollection points = series.getPoints(); for (ChartPoint point : savedData) { points.add(point); } addChartSeries(series); } } @Override protected final Object[] getExecuteParameters() { return null; } protected ChartSeries createSeries() { return new ChartSeries(getAxisTitle(), ChartTypes.Line); } protected static class LineChartGenerator extends ChartGenerator { private final LineChart mActivity; private final Vehicle mVehicle; private final String[] mProjection; public LineChartGenerator(LineChart chartActivity, Vehicle vehicle, String[] projection) { mActivity = chartActivity; mVehicle = vehicle; mProjection = projection; } @Override protected ChartSeries[] doInBackground(Object... params) { ChartSeries series = mActivity.createSeries(); ChartPointCollection points = series.getPoints(); Cursor cursor = getActivity().getContentResolver().query(FillupsTable.BASE_URI, mProjection, Fillup.VEHICLE_ID + " = ?", new String[] { String.valueOf(mVehicle.getId()) }, Fillup.ODOMETER + " asc"); publishProgress(0, cursor.getCount()); cursor.moveToFirst(); mActivity.createSeries(this, points, cursor, mVehicle); cursor.close(); if (isCancelled()) { return null; } return new ChartSeries[] { series }; } public final void update(int update) { publishProgress(update); } } }