/*
* Copyright (C) 2012 Daryl Daly
*
* This file is part of Heart Observe
*
* Heart Observe is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Heart Observe is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ca.ddaly.android.heart;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import java.util.Calendar;
import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.model.TimeSeries;
public class TimePressureGraph {
private static final String TAG = "TimePressureGraph";
private static TimePressureGraph singleton = null;
private Context ctxt = null;
synchronized static TimePressureGraph getInstance(Context ctxt) {
if (singleton == null) {
singleton=new TimePressureGraph(ctxt.getApplicationContext());
}
return(singleton);
}
public TimePressureGraph(Context ctxt) {
this.ctxt=ctxt;
}
/**
* prepares an intent for starting the graph activity
*
* @return: the intent or null if nothing to display
*/
public Intent getIntent() {
XYMultipleSeriesDataset dataset = getDataset();
if (dataset == null) {
return null;
}
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[] {20,50,15,20});
XYSeriesRenderer seriesOne = new XYSeriesRenderer();
seriesOne.setColor(Color.MAGENTA);
seriesOne.setPointStyle(PointStyle.CIRCLE);
renderer.addSeriesRenderer(seriesOne);
XYSeriesRenderer seriesTwo = new XYSeriesRenderer();
seriesTwo.setColor(Color.GREEN);
seriesTwo.setPointStyle(PointStyle.TRIANGLE);
renderer.addSeriesRenderer(seriesTwo);
renderer.setChartTitle(ctxt.getString(R.string.graph_title));
renderer.setXTitle("");
renderer.setYTitle("mmHg");
renderer.setShowGridX(true);
renderer.setYLabelsAlign(Paint.Align.RIGHT);
renderer.setYAxisMax(getYDataMax(dataset) + 10);
renderer.setYAxisMin(getYDataMin(dataset) - 10);
return ChartFactory.getTimeChartIntent(ctxt, getDataset(), renderer,
"MM/dd/yyyy",
ctxt.getString(R.string.app_name));
}
/**
* determines maximum Y value of the series in the given dataset
*
*/
private double getYDataMax(XYMultipleSeriesDataset dataset) {
double max = 0;
for (XYSeries series: dataset.getSeries()) {
double series_max = series.getMaxY();
if (series_max > max) {
max = series_max;
}
}
return max;
}
/**
* determines minimum Y value of the series in the given dataset
*
*/
private double getYDataMin(XYMultipleSeriesDataset dataset) {
double min = 999;
for (XYSeries series: dataset.getSeries()) {
double series_min = series.getMinY();
if (series_min < min) {
min = series_min;
}
}
return min;
}
/**
* loads a dataset from the database
*
* @return: dataset if records found otherwise null
*/
private XYMultipleSeriesDataset getDataset() {
Calendar cal = Calendar.getInstance();
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
TimeSeries systolic = new TimeSeries(ctxt.getString(R.string.systolic));
TimeSeries diastolic = new TimeSeries(ctxt.getString(R.string.diastolic));
// TODO -- should be off of the UI thread
Cursor result = DatabaseHelper.getInstance(ctxt).getReadableDatabase().rawQuery(
"Select "
+ " date, "
+ " systolic, "
+ " diastolic "
+ "From heart "
+ "Order by date",
null);
if ( result.getCount() > 1 ) { // using 1 here because one record doesn't graph very well
while (result.moveToNext()) {
Long date = result.getLong(0);
Integer systolic_val = result.getInt(1);
Integer diastolic_val = result.getInt(2);
systolic.add(date,systolic_val);
diastolic.add(date,diastolic_val);
}
dataset.addSeries(systolic);
dataset.addSeries(diastolic);
} else {
dataset = null;
}
result.close();
return dataset;
}
}