package org.starfishrespect.myconsumption.android.ui;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.github.mikephil.charting.utils.Highlight;
import org.starfishrespect.myconsumption.android.R;
import org.starfishrespect.myconsumption.android.SingleInstance;
import org.starfishrespect.myconsumption.android.adapters.SpinnerSensorAdapter;
import org.starfishrespect.myconsumption.android.data.SensorData;
import org.starfishrespect.myconsumption.android.events.ReloadStatEvent;
import org.starfishrespect.myconsumption.android.events.ReloadUserEvent;
import org.starfishrespect.myconsumption.android.util.PrefUtils;
import org.starfishrespect.myconsumption.android.util.StatUtils;
import org.starfishrespect.myconsumption.server.api.dto.Period;
import org.starfishrespect.myconsumption.server.api.dto.StatDTO;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
import static org.starfishrespect.myconsumption.android.util.LogUtils.LOGD;
import static org.starfishrespect.myconsumption.android.util.LogUtils.makeLogTag;
/**
* Activity that displays the comparison.
*
* S23Y (2015). Licensed under the Apache License, Version 2.0.
* Author: Thibaud Ledent
*/
public class ComparisonActivity extends BaseActivity implements OnChartValueSelectedListener {
private static final String TAG = makeLogTag(ComparisonActivity.class);
private ImageView mImageView;
private TextView mTxtViewProfile, mTxtViewAvgCons, mTxtViewMyCons;
private TextView mTxtViewPercent, mTxtViewUnderOver;
private BarChart mChart;
private Toolbar mToolbar;
private Spinner mSpinner;
private SpinnerSensorAdapter mSpinnerAdapter;
private boolean mFirstStart = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Register to the EventBus
EventBus.getDefault().register(this);
setContentView(R.layout.activity_comparison);
mToolbar = getActionBarToolbar();
getSupportActionBar().setTitle(getString(R.string.title_comp));
setUpActionBarSpinner();
mImageView = (ImageView) findViewById(R.id.imageViewComp);
mTxtViewProfile = (TextView) findViewById(R.id.txtVwProfileDescription);
mTxtViewAvgCons = (TextView) findViewById(R.id.txtVwCompAvgCons);
mTxtViewMyCons = (TextView) findViewById(R.id.txtVwCompMyCons);
mTxtViewPercent = (TextView) findViewById(R.id.txtVwCompPercent);
mTxtViewUnderOver = (TextView) findViewById(R.id.txtVwCompUnderOver);
mChart = (BarChart) findViewById(R.id.chart1);
initBarChart();
populateView();
overridePendingTransition(0, 0);
}
@Override
protected void onDestroy() {
// Unregister to the EventBus
EventBus.getDefault().unregister(this);
super.onDestroy();
}
private void initBarChart() {
mChart.setOnChartValueSelectedListener(this);
mChart.setDescription("");
// scaling can now only be done on x- and y-axis separately
mChart.setPinchZoom(false);
mChart.setDrawBarShadow(false);
mChart.setDrawGridBackground(false);
mChart.getXAxis().setEnabled(false);
mChart.getAxisLeft().setEnabled(false);
mChart.getAxisRight().setEnabled(false);
Legend l = mChart.getLegend();
l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);
l.setTextSize(12f);
}
private void setData(float value1, float value2) {
ArrayList<BarEntry> yVals1 = new ArrayList<>();
ArrayList<BarEntry> yVals2 = new ArrayList<>();
yVals1.add(new BarEntry(value1, 0));
yVals2.add(new BarEntry(value2, 0));
BarDataSet set1 = new BarDataSet(yVals1, "My consumption");
set1.setBarSpacePercent(55f);
set1.setColor(Color.rgb(192, 255, 140));
BarDataSet set2 = new BarDataSet(yVals2, "Average profile");
set2.setBarSpacePercent(55f);
set2.setColor(Color.rgb(255, 247, 140));
ArrayList<BarDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
dataSets.add(set2);
String[] xVals = {""};
BarData data = new BarData(xVals, dataSets);
data.setValueTextSize(12f);
mChart.setData(data);
}
private void populateView() {
String textProfile = PrefUtils.getProfileTextDescription(this);
if (!textProfile.isEmpty()) mTxtViewProfile.setText(textProfile);
switch (PrefUtils.getProfileIndex(this)) {
case 0:
mImageView.setImageDrawable(getResources().getDrawable(R.drawable.consumption_profile_0));
break;
case 1:
mImageView.setImageDrawable(getResources().getDrawable(R.drawable.consumption_profile_1));
break;
case 2:
mImageView.setImageDrawable(getResources().getDrawable(R.drawable.consumption_profile_2));
break;
}
double profileConsumption = PrefUtils.getProfileConsumption(this);
mTxtViewAvgCons.setText(String.valueOf((int) profileConsumption));
String sensorId = SingleInstance.getUserController().getUser().getSensors().get(SingleInstance.getSpinnerSensorPosition()).getSensorId();
SingleInstance.getStatsController().loadStats(sensorId);
SingleInstance.getStatsController().loadStats(sensorId);
StatDTO stat = SingleInstance.getStatsController().getStats().get(Period.WEEK.getValue() - 1);
double myCons = StatUtils.wh2kWh(stat.getConsumption() * 52);
mTxtViewMyCons.setText(String.valueOf((int) myCons));
double percent = (( myCons - profileConsumption) / profileConsumption) * 100.0;
mTxtViewPercent.setText(String.valueOf((int) percent) + " %");
if (percent > 0)
mTxtViewUnderOver.setText(getString(R.string.text_comp_over));
else
mTxtViewUnderOver.setText(getString(R.string.text_comp_under));
setData((float) myCons, (float) profileConsumption);
}
public void modifyProfile(View view) {
// Launch settings activity
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
}
@Override
protected int getSelfNavDrawerItem() {
// set this to have a nav drawer associated with this activity
return NAVDRAWER_ITEM_COMPARISON;
}
@Override
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
LOGD("Activity", "Selected: " + e.toString() + ", dataSet: " + dataSetIndex);
}
@Override
public void onNothingSelected() {
LOGD("Activity", "Nothing selected.");
}
private void setUpActionBarSpinner() {
LOGD(TAG, "Configuring Action Bar spinner.");
View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.actionbar_spinner,
mToolbar, false);
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.RIGHT;
mToolbar.addView(spinnerContainer, lp);
List<SensorData> sensors = SingleInstance.getUserController().getUser().getSensors();
mSpinnerAdapter = new SpinnerSensorAdapter(ComparisonActivity.this, sensors);
// Populate spinners
mSpinner = (Spinner) spinnerContainer.findViewById(R.id.actionbar_spinner);
// Apply the adapter to the spinner
mSpinner.setAdapter(mSpinnerAdapter);
mSpinner.setSelection(SingleInstance.getSpinnerSensorPosition());
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> spinner, View view, int position, long itemId) {
if (!mFirstStart) {
Toast.makeText(ComparisonActivity.this, "Sensor selected " + mSpinnerAdapter.getItem(position), Toast.LENGTH_SHORT).show();
//mSensorId = (String) mSpinnerAdapter.getItem(position);
SingleInstance.setSpinnerSensorPosition(position);
Intent intent = getIntent();
finish();
startActivity(intent);
}
mFirstStart = false;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
public void openSpinner(View view) {
mSpinner.performClick();
}
/**
* Triggered when the user wants to reload data.
* @param event A ReloadUser event
*/
public void onEvent(ReloadUserEvent event) {
if (event.refreshDataFromServer())
this.refreshData();
}
/**
* Triggered when the reload of stats from server is done.
* @param event A ReloadStat event
*/
public void onEvent(ReloadStatEvent event) {
populateView();
}
}