de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.GraphPlotFragment.java Source code

Java tutorial

Introduction

Here is the source code for de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.GraphPlotFragment.java

Source

/* 
 * Copyright (C) 2014 TU Darmstadt, Hessen, Germany.
 * Department of Computer Science Databases and Distributed Systems
 *
 * This program 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.
 *
 * This program 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 de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments;

import android.support.v4.app.Fragment;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import com.jjoe64.graphview.BarGraphView;
import com.jjoe64.graphview.CustomLabelFormatter;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.LineGraphView;

import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.R;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.graphActivities.GraphPlotBigActivity;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.transformationmanager.database.CookTraffic;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.transformationmanager.database.LocalTransformationDBMS;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.transformationmanager.database.TrafficData;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;

public class GraphPlotFragment extends Fragment {

    private static final String TAG = GraphPlotFragment.class.getSimpleName();
    private View rootView;

    private ArrayList<GraphViewData> data_line;
    private ArrayList<GraphViewData> data_bar;

    private ArrayList<String> avalDate;

    public static String firstGrpTitle = "";
    public static String secondGrpTitle = "";
    private int firstGrpType = -1;
    private int secondGrpType = -1;
    private boolean isFirstBar = false;
    private boolean isSecondBar = false;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_with_graph, container, false);

        Log.e(TAG, ": onCreateView");

        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);

        data_line = new ArrayList<GraphViewData>();
        data_bar = new ArrayList<GraphViewData>();

        CheckBox box = (CheckBox) rootView.findViewById(R.id.start_record);
        box.setVisibility(View.GONE);

        Button refrBtn = (Button) rootView.findViewById(R.id.refresh_btn);
        refrBtn.setVisibility(View.GONE);
        refrBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CookTraffic mCook = new CookTraffic(getActivity().getApplicationContext());
                mCook.cookUp();
                //            clearAllCharts();
                //            clearDb(((TextView) rootView.findViewById(R.id.at_date))
                //                  .getText().toString());
            }
        });

        TextView atDate = (TextView) rootView.findViewById(R.id.at_date);
        atDate.setText(getCurrentDate());

        Button backBtn = (Button) rootView.findViewById(R.id.date_back);
        backBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                dateBackAndForth(true);
            }
        });

        Button forthBtn = (Button) rootView.findViewById(R.id.date_next);
        forthBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                dateBackAndForth(false);

            }
        });

        updateTitleAndType();

        data_line = updateTrafficOnDate(getCurrentDate(), firstGrpType);
        data_bar = updateTrafficOnDate(getCurrentDate(), secondGrpType);
        redrawCharts();

        LinearLayout layout_light = (LinearLayout) rootView.findViewById(R.id.light_graph);
        LinearLayout layout_motion = (LinearLayout) rootView.findViewById(R.id.motion_graph);

        layout_light.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                openBig();
            }
        });
        layout_motion.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                openBig();
            }
        });
    }

    private void openBig() {
        Intent i = new Intent(this.getActivity().getApplicationContext(), GraphPlotBigActivity.class);
        String date = ((TextView) rootView.findViewById(R.id.at_date)).getText().toString();
        i.putExtra("Timy", date);
        i.putExtra("lineGraphTitle", firstGrpTitle);
        i.putExtra("lineGraphType", firstGrpType);
        i.putExtra("isFirstBarType", isFirstBar);
        i.putExtra("barGraphTitle", secondGrpTitle);
        i.putExtra("barGraphType", secondGrpType);
        i.putExtra("isSecondBarType", isSecondBar);
        this.getActivity().startActivity(i);

    }

    private void updateTitleAndType() {

        ArrayList<String> grpTitle = new ArrayList<String>();
        ArrayList<Integer> grpType = new ArrayList<Integer>();
        ArrayList<Boolean> grpBarType = new ArrayList<Boolean>();

        SharedPreferences pref = PreferenceManager
                .getDefaultSharedPreferences(getActivity().getApplicationContext());

        if (pref.getBoolean(getResources().getString(R.string.in_hum), false)) {
            grpTitle.add("Humidity");
            grpType.add(Sensor.TYPE_RELATIVE_HUMIDITY);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_lig), false)) {
            grpTitle.add("Light in lux/min");
            grpType.add(Sensor.TYPE_LIGHT);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_pres), false)) {
            grpTitle.add("Pressure in min");
            grpType.add(Sensor.TYPE_PRESSURE);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_prox), false)) {
            grpTitle.add("Proximity in min");
            grpType.add(Sensor.TYPE_PROXIMITY);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_tem), false)) {
            grpTitle.add("Ambient Temperature in C");
            grpType.add(Sensor.TYPE_AMBIENT_TEMPERATURE);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.pulse), false)) {
            grpTitle.add("Heart Rate bpm");
            grpType.add(999);
            grpBarType.add(false);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_acc), false)) {
            grpTitle.add("Motion Strength/min");
            grpType.add(Sensor.TYPE_ACCELEROMETER);
            grpBarType.add(true);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_mag), false)) {
            grpTitle.add("Magnetic Field Strength/min");
            grpType.add(Sensor.TYPE_MAGNETIC_FIELD);
            grpBarType.add(true);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_grav), false)) {
            grpTitle.add("Gravity Strength/min");
            grpType.add(Sensor.TYPE_GRAVITY);
            grpBarType.add(true);

        }

        if (pref.getBoolean(getResources().getString(R.string.in_gyrs), false)) {
            grpTitle.add("Gyroscope Strength/min");
            grpType.add(Sensor.TYPE_GYROSCOPE);
            grpBarType.add(true);

        }
        if (pref.getBoolean(getResources().getString(R.string.in_lin_acc), false)) {
            grpTitle.add("Linear Accelerometer Strength/min");
            grpType.add(Sensor.TYPE_LINEAR_ACCELERATION);
            grpBarType.add(true);

        }
        if (grpTitle.size() == 2 && grpType.size() == 2) {
            firstGrpTitle = grpTitle.get(0);
            firstGrpType = grpType.get(0);
            isFirstBar = grpBarType.get(0);

            secondGrpTitle = grpTitle.get(1);
            secondGrpType = grpType.get(1);
            isSecondBar = grpBarType.get(1);
        } else if (grpTitle.size() == 1 && grpType.size() == 1) {
            firstGrpTitle = grpTitle.get(0);
            firstGrpType = grpType.get(0);
            isFirstBar = grpBarType.get(0);

            secondGrpTitle = "";
            secondGrpType = -1;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    private void dateBackAndForth(boolean back) {
        updateTitleAndType();
        TextView atDate = (TextView) rootView.findViewById(R.id.at_date);
        String newDate = atDate.getText().toString();
        if (back) {
            newDate = getDate(-1, atDate.getText().toString());
        } else {
            newDate = getDate(1, atDate.getText().toString());
        }

        Log.e(TAG, "newDate: " + newDate); // FIXME
        data_line = updateTrafficOnDate(newDate, firstGrpType);
        data_bar = updateTrafficOnDate(newDate, secondGrpType);
        redrawCharts();
        atDate.setText(newDate);
    }

    private LocalTransformationDBMS transformationDB;

    private ArrayList<GraphView.GraphViewData> updateTrafficOnDate(String date, int type) {
        // initialize database
        Log.e(TAG, "date=" + date + " type:" + type);
        this.transformationDB = new LocalTransformationDBMS(getActivity().getApplicationContext());
        transformationDB.open();
        ArrayList<TrafficData> list = transformationDB.getAllTrafficFromDate(date, type);
        ArrayList<GraphView.GraphViewData> data = new ArrayList<GraphView.GraphViewData>();
        for (TrafficData t : list) {
            GraphViewData x = new GraphViewData(t.getxValue(), t.getyValue());
            data.add(x);
        }
        transformationDB.close();

        return data;
    }

    //   private void clearDb(String date) {
    //      // clear DBs of a today date
    //      // initialize database
    //      Log.e(TAG, "clear date: " + date);
    //      this.transformationDB = new LocalTransformationDBMS(getActivity()
    //            .getApplicationContext());
    //      transformationDB.open();
    //      int n = transformationDB.deleteAllTrafficFromDate(date);
    //      transformationDB.close();
    //
    //      Log.e(TAG, "number of deleted rows= " + n);
    //   }

    private void createGraph(String graphTitle, GraphViewSeries series, int Rid, boolean isBarChart) {
        GraphView graphView = null;

        if (isBarChart) {
            graphView = new BarGraphView(getActivity().getApplicationContext(), graphTitle);
            // graphView.setVerticalLabels(new String[] { "high", "mid", "low"
            // });
            // graphView.setManualYAxisBounds(11.0d, 9.0d);
        } else
            graphView = new LineGraphView(getActivity().getApplicationContext(), graphTitle);

        graphView.setCustomLabelFormatter(new CustomLabelFormatter() {
            @Override
            public String formatLabel(double value, boolean isValueX) {
                // make sure not have smth like 4:60 or 11:83 time frame!
                double whole = value;
                double fractionalPart = value % 1;
                double integralPart = value - fractionalPart;
                if (fractionalPart > 0.59) {
                    whole = integralPart + 1.0d + (fractionalPart - 0.60);
                }

                if (isValueX) {
                    // convert (double) hour.mm to hour:mm
                    return new DecimalFormat("00.00").format(whole).replaceAll("\\,", ":");
                } else {
                    if (value > 1000) {
                        return "high";
                    }
                    return new DecimalFormat("#0.00").format(value);
                }
            }
        });

        // add data
        graphView.addSeries(series);
        graphView.setScrollable(false);
        // optional - activate scaling / zooming
        // graphView.setScalable(true);
        // optional - legend
        // graphView.setShowLegend(true);
        graphView.getGraphViewStyle().setNumVerticalLabels(3);
        graphView.getGraphViewStyle().setNumHorizontalLabels(3);
        graphView.getGraphViewStyle().setVerticalLabelsWidth(80);

        LinearLayout layout = (LinearLayout) rootView.findViewById(Rid);
        layout.removeAllViews();
        layout.addView(graphView);
        rootView.postInvalidate();
    }

    //   private void clearAllCharts() {
    //      clearChart(firstGrpTitle);
    //      clearChart(secondGrpTitle);
    //   }

    private void clearChart(String title) {
        GraphViewData[] dataList = new GraphViewData[1];
        dataList[0] = new GraphViewData(0.0, 0.0);
        GraphViewSeries gvs_series = new GraphViewSeries(dataList);

        if (title.equals(firstGrpTitle)) {
            createGraph(firstGrpTitle, gvs_series, R.id.light_graph, isFirstBar);
            data_line = new ArrayList<GraphView.GraphViewData>();
        }
        if (title.equals(secondGrpTitle)) {
            createGraph(secondGrpTitle, gvs_series, R.id.motion_graph, isSecondBar);
            data_bar = new ArrayList<GraphView.GraphViewData>();
        }
    }

    private void redrawCharts() {
        if (data_line.size() > 0) {

            GraphViewData[] dataList = new GraphViewData[data_line.size()];
            for (int i = 0; i < data_line.size(); i++) {
                dataList[i] = data_line.get(i);
            }
            GraphViewSeries gvs_light = new GraphViewSeries(dataList);
            createGraph(firstGrpTitle, gvs_light, R.id.light_graph, isFirstBar);
        } else {
            clearChart(firstGrpTitle);
        }
        if (data_bar.size() > 0) {
            GraphViewData[] dataAcc = new GraphViewData[data_bar.size()];
            for (int i = 0; i < data_bar.size(); i++) {
                dataAcc[i] = data_bar.get(i);
            }
            GraphViewSeries gvs_acc = new GraphViewSeries(dataAcc);
            createGraph(secondGrpTitle, gvs_acc, R.id.motion_graph, isSecondBar);
        } else {
            clearChart(secondGrpTitle);
        }
    }

    /**
     * 
     * @param i
     *            0, 1 or -1
     * @return current, next or prev date
     */
    private String getDate(int i, String currentDate) {
        avalDate = new ArrayList<String>();
        this.transformationDB = new LocalTransformationDBMS(getActivity().getApplicationContext());
        transformationDB.open();
        avalDate = transformationDB.getAllAvalDate();
        transformationDB.close();
        if (avalDate.isEmpty())
            avalDate.add(getCurrentDate());

        int x = avalDate.indexOf(currentDate);
        if (x >= 0) {
            if (i == 1 && x < avalDate.size() - 1)
                return avalDate.get(x + i);

            if (i == -1 && x > 0)
                return avalDate.get(x + i);
        } else {
            if (i == 1) {
                return avalDate.get(avalDate.size() - 1); // last date
            }
            if (i == -1) {
                return avalDate.get(0); // last date
            }
        }
        return currentDate;

    }

    private static String getCurrentDate() {
        SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MM-yyyy");
        Date now = new Date();
        String strDate = sdfDate.format(now);
        return strDate;
    }

    @Override
    public void onStop() {
        super.onStop();
    }
}