package com.androsz.flatnote.app.widget;
import java.io.IOException;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import com.androsz.achartengine.ChartView;
import com.androsz.achartengine.chart.AbstractChart;
import com.androsz.achartengine.chart.TimeChart;
import com.androsz.achartengine.model.XYMultipleSeriesDataset;
import com.androsz.achartengine.model.XYSeries;
import com.androsz.achartengine.renderer.XYMultipleSeriesRenderer;
import com.androsz.achartengine.renderer.XYSeriesRenderer;
public class WaveformChart extends ChartView implements Serializable {
private static final long serialVersionUID = -5692853786456847694L;
private static final int MAX_POINTS_IN_A_GRAPH = 200;
public XYMultipleSeriesDataset xyMultipleSeriesDataset;
public XYMultipleSeriesRenderer xyMultipleSeriesRenderer;
public XYSeries xySeriesMovement;
public XYSeriesRenderer xySeriesMovementRenderer;
public XYSeries xySeriesCalibration;
public XYSeriesRenderer xySeriesCalibrationRenderer;
protected double calibrationLevel;// =
// SettingsActivity.DEFAULT_ALARM_SENSITIVITY;
public int rating;
public WaveformChart(final Context context) {
super(context);
}
public WaveformChart(final Context context, final AttributeSet as) {
super(context, as);
}
@Override
protected AbstractChart buildChart() {
if (xySeriesMovement == null) {
// set up sleep movement series/renderer
xySeriesMovement = new XYSeries("hahblah");
xySeriesMovementRenderer = new XYSeriesRenderer();
xySeriesMovementRenderer.setFillBelowLine(true);
xySeriesMovementRenderer.setFillBelowLineColor(Color.GREEN);
xySeriesMovementRenderer.setColor(Color.CYAN);
// set up calibration line series/renderer
xySeriesCalibration = new XYSeries("hahbleh");
xySeriesCalibrationRenderer = new XYSeriesRenderer();
xySeriesCalibrationRenderer.setFillBelowLine(true);
xySeriesCalibrationRenderer.setFillBelowLineColor(Color.GRAY);
xySeriesCalibrationRenderer.setColor(Color.WHITE);
// add series to the dataset
xyMultipleSeriesDataset = new XYMultipleSeriesDataset();
xyMultipleSeriesDataset.addSeries(xySeriesMovement);
xyMultipleSeriesDataset.addSeries(xySeriesCalibration);
// set up the dataset renderer
xyMultipleSeriesRenderer = new XYMultipleSeriesRenderer();
xyMultipleSeriesRenderer
.addSeriesRenderer(xySeriesMovementRenderer);
xyMultipleSeriesRenderer
.addSeriesRenderer(xySeriesCalibrationRenderer);
xyMultipleSeriesRenderer.setPanEnabled(false, false);
xyMultipleSeriesRenderer.setZoomEnabled(false, false);
final float textSize = 18;
xyMultipleSeriesRenderer.setAxisTitleTextSize(textSize);
xyMultipleSeriesRenderer.setLabelsTextSize(textSize);
xyMultipleSeriesRenderer.setLegendHeight(60);
xyMultipleSeriesRenderer.setLegendTextSize(textSize);
xyMultipleSeriesRenderer.setShowLegend(true);
xyMultipleSeriesRenderer.setShowLabels(true);
xyMultipleSeriesRenderer.setXLabels(6);
xyMultipleSeriesRenderer.setYLabels(5);
xyMultipleSeriesRenderer.setShowGrid(true);
xyMultipleSeriesRenderer.setAxesColor(Color.MAGENTA);
xyMultipleSeriesRenderer.setLabelsColor(xyMultipleSeriesRenderer
.getAxesColor());
xyMultipleSeriesRenderer.setApplyBackgroundColor(false);
final TimeChart timeChart = new TimeChart(xyMultipleSeriesDataset,
xyMultipleSeriesRenderer);
timeChart.setDateFormat("h:mm a");
return timeChart;
}
return null;
}
public double getCalibrationLevel() {
return calibrationLevel;
}
public boolean makesSenseToDisplay() {
return xySeriesMovement.getItemCount() > 1;
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
/*
* if (rating < 6 && rating > 0) { final Drawable dStarOn =
* getResources().getDrawable( R.drawable.rate_star_small_on); final
* Drawable dStarOff = getResources().getDrawable(
* R.drawable.rate_star_small_off); final int width =
* dStarOn.getMinimumWidth(); final int height =
* dStarOn.getMinimumHeight(); final int numOffStars = 5 - rating; final
* int centerThemDangStarz = (canvas.getWidth() - width * 5) / 2; for
* (int i = 0; i < rating; i++) { dStarOn.setBounds(width * i +
* centerThemDangStarz, height, width * i + width + centerThemDangStarz,
* height * 2); dStarOn.draw(canvas); } for (int i = 0; i < numOffStars;
* i++) { dStarOff.setBounds(width * (i + rating) + centerThemDangStarz,
* height, width * (i + rating) + width + centerThemDangStarz, height *
* 2); dStarOff.draw(canvas); } }
*/
}
public void reconfigure() {
if (makesSenseToDisplay()) {
final double firstX = xySeriesMovement.xyList.get(0).x;
final double lastX = xySeriesMovement.xyList.get(xySeriesMovement
.getItemCount() - 1).x;
if (makesSenseToDisplay()) {
// reconfigure the calibration line..
xySeriesCalibration.clear();
xySeriesCalibration.add(firstX, calibrationLevel);
xySeriesCalibration.add(lastX, calibrationLevel);
}
final int HOUR_IN_MS = 1000 * 60 * 60;
if (lastX - firstX > HOUR_IN_MS) {
((TimeChart) mChart).setDateFormat("h");
}
xyMultipleSeriesRenderer.setXAxisMin(firstX);
xyMultipleSeriesRenderer.setXAxisMax(lastX);
xyMultipleSeriesRenderer.setYAxisMin(-100);
xyMultipleSeriesRenderer.setYAxisMax(100);
}
}
public void setCalibrationLevel(final double calibrationLevel) {
this.calibrationLevel = calibrationLevel;
}
public void sync(final Cursor cursor) throws StreamCorruptedException,
IllegalArgumentException, IOException, ClassNotFoundException {
// sync(new SleepRecord(cursor));
}
public void sync(final Double x, final Double y, final double alarm) {
if (xySeriesMovement.xyList.size() >= MAX_POINTS_IN_A_GRAPH) {
xySeriesMovement.add(x, y);
xySeriesMovement.remove(0);
} else {
xySeriesMovement.add(x, y);
}
reconfigure();
repaint();
}
/*
* public void sync(final SleepRecord sleepRecord) { xySeriesMovement.xyList
* = sleepRecord.chartData; calibrationLevel = sleepRecord.alarm;
*
* rating = sleepRecord.rating;
*
* xyMultipleSeriesRenderer.setChartTitle(sleepRecord.title); reconfigure();
* repaint(); }
*/
}