package com.evancharlton.mileage;
import com.artfulbits.aiCharts.ChartView;
import com.artfulbits.aiCharts.Base.ChartArea;
import com.artfulbits.aiCharts.Base.ChartSeries;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.ZoomControls;
public abstract class ChartActivity extends Activity implements DialogInterface.OnCancelListener {
public static final String VEHICLE_ID = "vehicle_id";
private static final int PROGRESS_DIALOG = 1;
private ChartView mChart;
private ZoomControls mZoomControls;
private ChartGenerator mChartGenerator;
private ProgressDialog mProgressDialog;
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chart);
mChart = (ChartView) findViewById(R.id.chart);
mZoomControls = (ZoomControls) findViewById(R.id.zoom_controls);
restoreLastNonConfigurationInstance();
mChart.setPanning(ChartView.PANNING_HORIZONTAL);
mZoomControls.setOnZoomInClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
zoom(0.5);
}
});
mZoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
zoom(2);
}
});
}
protected void zoom(double factor) {
getChart().getAreas().get(0).getDefaultXAxis().getScale().mulZoom(factor);
}
@Override
public Object onRetainNonConfigurationInstance() {
return new Object[] {
mChartGenerator,
serializeData()
};
}
private void restoreLastNonConfigurationInstance() {
Object saved = getLastNonConfigurationInstance();
if (saved != null) {
Object[] array = (Object[]) saved;
mChartGenerator = (ChartGenerator) array[0];
unserializeData(array[1]);
} else {
mChartGenerator = createChartGenerator();
}
mChartGenerator.attach(this);
if (mChartGenerator.getStatus() == AsyncTask.Status.PENDING) {
mChartGenerator.execute(getExecuteParameters());
}
}
protected abstract Object serializeData();
protected abstract void unserializeData(Object saved);
protected final ChartView getChart() {
return mChart;
}
protected abstract ChartGenerator createChartGenerator();
protected Object[] getExecuteParameters() {
return null;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_DIALOG:
if (mProgressDialog != null) {
removeDialog(PROGRESS_DIALOG);
}
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setIndeterminate(false);
mProgressDialog.setTitle(R.string.creating_chart);
mProgressDialog.setOnCancelListener(this);
mProgressDialog.setCancelable(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
return mProgressDialog;
}
return super.onCreateDialog(id);
}
@Override
public void onCancel(DialogInterface dialog) {
if (mChartGenerator != null && mChartGenerator.getStatus() == AsyncTask.Status.RUNNING) {
mChartGenerator.cancel(true);
}
finish();
}
protected ProgressDialog getProgressDialog() {
return mProgressDialog;
}
protected void addChartSeries(ChartSeries series) {
ChartArea area = new ChartArea();
area.getDefaultXAxis().setFormat(DateFormat.getDateFormat(this));
mChart.getSeries().add(series);
mChart.getAreas().add(area);
}
public abstract static class ChartGenerator extends AsyncTask<Object, Integer, ChartSeries[]> {
private ChartActivity mActivity;
private ProgressDialog mCachedProgressDialog;
public final void attach(ChartActivity activity) {
mActivity = activity;
mCachedProgressDialog = mActivity.getProgressDialog();
}
@Override
protected void onPreExecute() {
mActivity.showDialog(PROGRESS_DIALOG);
mCachedProgressDialog = mActivity.getProgressDialog();
}
@Override
protected void onProgressUpdate(Integer... updates) {
mCachedProgressDialog.setProgress(updates[0]);
if (updates.length > 1) {
mCachedProgressDialog.setMax(updates[1]);
}
}
@Override
protected void onPostExecute(ChartSeries[] series) {
if (isCancelled()) {
return;
}
mActivity.removeDialog(PROGRESS_DIALOG);
final int length = series.length;
for (int i = 0; i < length; i++) {
mActivity.addChartSeries(series[i]);
}
}
protected final ChartActivity getActivity() {
return mActivity;
}
}
}