package it.angelic.soulissclient.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.HorizontalScrollView;
import android.widget.Spinner;
import android.widget.TextView;
import com.dacer.androidcharts.LineView;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Set;
import it.angelic.soulissclient.R;
import it.angelic.soulissclient.model.ISoulissTypicalSensor;
import it.angelic.soulissclient.model.db.SoulissDBHelper;
import it.angelic.soulissclient.model.db.SoulissGraphData;
import it.angelic.soulissclient.model.db.SoulissHistoryGraphData;
import static it.angelic.soulissclient.Constants.TAG;
import static it.angelic.soulissclient.Constants.yearFormat;
import static junit.framework.Assert.assertTrue;
public class ChartFragment extends Fragment {
private static ISoulissTypicalSensor collected;
private SoulissDBHelper datasource;
private Spinner graphtSpinner;
private LineView lineView;
private Spinner rangeSpinner;
public static ChartFragment newInstance(ISoulissTypicalSensor content) {
ChartFragment f = new ChartFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
collected = content;
// Ci metto il nodo dentro
if (content != null) {
args.putSerializable("TIPICO", content);
}
f.setArguments(args);
return f;
}
private void drawGroupedGraphAndroChart(SparseArray<SoulissGraphData> logs, ChartTypeEnum bymonth) {
//must*
ArrayList<String> test = new ArrayList<>();
ArrayList<Integer> dataList = new ArrayList<>();
ArrayList<Integer> dataListMin = new ArrayList<>();
ArrayList<Integer> dataListMax = new ArrayList<>();
if (bymonth == ChartTypeEnum.GROUP_MONTH) {
Calendar cal = Calendar.getInstance();
for (int k = 0; k < logs.size(); k++) {
cal.set(Calendar.MONTH, k);
test.add(String.format(Locale.getDefault(), "%tb", cal));
}
} else if (bymonth == ChartTypeEnum.GROUP_WEEK) {//DAY OF W
Calendar cal = Calendar.getInstance();
for (int k = 0; k < logs.size(); k++) {
cal.set(Calendar.DAY_OF_WEEK, k + 1);//+1 perche Calendar.DAY_OF_WEEK parte da 1, domenica
test.add(String.format(Locale.getDefault(), "%ta", cal));
}
} else if (bymonth == ChartTypeEnum.GROUP_HOUR) {
for (int k = 0; k < logs.size(); k++) {
test.add(k + ":00");
}
}
int lengt = logs.size();
for (int k = 0; k < lengt; k++) {
dataList.add((int) logs.get(k).average);
dataListMin.add((int) logs.get(k).min);
dataListMax.add((int) logs.get(k).max);
Log.d(TAG, "Adding serie " + (k) + ": min=" + logs.get(k).min + " max="
+ logs.get(k).max
+ " AVG=" + logs.get(k).average);
}
lineView.setBottomTextList(test);
ArrayList<ArrayList<Integer>> dataLists = new ArrayList<>();
dataLists.add(dataListMax);
dataLists.add(dataListMin);
dataLists.add(dataList);
assertTrue(test.size() == dataList.size());
lineView.setDataList(dataLists);
lineView.setDrawDotLine(true);
lineView.setShowPopup(LineView.SHOW_POPUPS_NONE);
lineView.setVisibility(View.VISIBLE);
}
/**
* @param logs
*/
private void drawHistoryGraphAndroChart(HashMap<Date, SoulissHistoryGraphData> logs) {
//must*
ArrayList<String> test = new ArrayList<>();
ArrayList<Integer> dataList = new ArrayList<>();
ArrayList<Integer> dataListMin = new ArrayList<>();
ArrayList<Integer> dataListMax = new ArrayList<>();
Set<Date> dates = logs.keySet();
for (Date date2 : dates) {
test.add(yearFormat.format(date2));
dataList.add((int) logs.get(date2).average);
dataListMin.add((int) logs.get(date2).min);
dataListMax.add((int) logs.get(date2).max);
Log.d(TAG, "Adding serie " + date2 + ": min=" + logs.get(date2).min
+ " max=" + logs.get(date2).max);
}
lineView.setBottomTextList(test);
ArrayList<ArrayList<Integer>> dataLists = new ArrayList<>();
dataLists.add(dataListMax);
dataLists.add(dataListMin);
dataLists.add(dataList);
assertTrue(test.size() == dataList.size());
lineView.setDataList(dataLists);
lineView.setDrawDotLine(true);
lineView.setShowPopup(LineView.SHOW_POPUPS_NONE);
lineView.setVisibility(View.VISIBLE);
//layout.addView(lineView);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null)
return null;
datasource = new SoulissDBHelper(getActivity());
SoulissDBHelper.open();
Bundle extras = getActivity().getIntent().getExtras();
View ret = inflater.inflate(R.layout.frag_chart, container, false);
TextView nodeinfo = (TextView) ret.findViewById(R.id.TextViewTypNodeInfo);
graphtSpinner = (Spinner) ret.findViewById(R.id.spinnerGraphType);
rangeSpinner = (Spinner) ret.findViewById(R.id.spinnerGraphRange);
rangeSpinner.setSelection(2);
lineView = (LineView) ret.findViewById(R.id.line_view);
TextView upda = (TextView) ret.findViewById(R.id.TextViewTypUpdate);
assertTrue("TIPICO NULLO", collected != null);
//Setta STATUS BAR
// ProgressBar sfumata
/**
* LISTENER TIPO GRAFICO
*/
OnItemSelectedListener lit = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// Filtro tempo
String bid = (String) rangeSpinner.getSelectedItem();
int len = 0;
final String[] tempArray = getResources().getStringArray(R.array.graphRange);
for (int i = 0; i < tempArray.length; i++) {
if (tempArray[i].compareTo(bid) == 0)
len = i;
}
redrawGraph(pos, len);
}
public void onNothingSelected(AdapterView<?> parent) {
}
};
graphtSpinner.setOnItemSelectedListener(lit);
/**
* LISTENER RANGE
*/
OnItemSelectedListener lite = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// Filtro tempo
String bid = (String) graphtSpinner.getSelectedItem();
int len = 0;
final String[] tempArray = getResources().getStringArray(R.array.graphType);
for (int i = 0; i < tempArray.length; i++) {
if (tempArray[i].compareTo(bid) == 0)
len = i;
}
redrawGraph(len, pos);
}
public void onNothingSelected(AdapterView<?> parent) {
}
};
rangeSpinner.setOnItemSelectedListener(lite);
return ret;
}
@Override
public void onDestroy() {
super.onDestroy();
// datasource.close();
}
private void redrawGraph(int graphType, int timeFilter) {
final HorizontalScrollView layout = (HorizontalScrollView) getActivity().findViewById(R.id.horizontalScrollView);
//final TextView tinfo = (TextView) getActivity().findViewById(R.id.TextViewGraphName);
// Log.i(TAG, selectedVal);
ChartTypeEnum tipoGrafico = ChartTypeEnum.values()[graphType];
switch (tipoGrafico) {
case HISTORY:
//TODO se vuoto skippa
HashMap<Date, SoulissHistoryGraphData> logs = datasource.getHistoryTypicalLogs(collected, timeFilter);
drawHistoryGraphAndroChart(logs);
break;
case GROUP_HOUR://fallback
//TODO se vuoto skippa
SparseArray<SoulissGraphData> logss = datasource.getGroupedTypicalLogs(collected, "%H", timeFilter);
drawGroupedGraphAndroChart(logss, tipoGrafico);
break;
case GROUP_MONTH:
//TODO se vuoto skippa
SparseArray<SoulissGraphData> logsd = datasource.getGroupedTypicalLogs(collected, "%m", timeFilter);
drawGroupedGraphAndroChart(logsd, tipoGrafico);
break;
case GROUP_WEEK:
//TODO se vuoto skippa
SparseArray<SoulissGraphData> logsf = datasource.getGroupedTypicalLogs(collected, "%w", timeFilter);
drawGroupedGraphAndroChart(logsf, tipoGrafico);
break;
}
}
}