package org.starfishrespect.myconsumption.android.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
import com.astuetz.PagerSlidingTabStrip;
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.ReloadConfigEvent;
import org.starfishrespect.myconsumption.android.events.ReloadStatEvent;
import org.starfishrespect.myconsumption.android.events.ReloadUserEvent;
import org.starfishrespect.myconsumption.server.api.dto.StatDTO;
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;
/**
* StatActivity provides an analysis of consumption based on statistics.
* S23Y (2015). Licensed under the Apache License, Version 2.0.
* Author: Thibaud Ledent
*/
public class StatActivity extends BaseActivity {
private static final String TAG = makeLogTag(StatActivity.class);
private Toolbar mToolbar;
private PagerSlidingTabStrip mTabs;
private ViewPager mPager;
private Spinner mSpinner;
private MyPagerAdapter mPageAdapter;
private SpinnerSensorAdapter mSpinnerAdapter;
private List<StatDTO> mStats;
private boolean mFirstStart = true;
private boolean statReloaded = false;
private boolean configReloaded = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Register to the EventBus
EventBus.getDefault().register(this);
setContentView(R.layout.activity_stat);
mToolbar = getActionBarToolbar();
getSupportActionBar().setTitle(getString(R.string.title_stat));
setUpActionBarSpinner();
mTabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
mPager = (ViewPager) findViewById(R.id.pager);
mTabs.setOnTabReselectedListener(new PagerSlidingTabStrip.OnTabReselectedListener() {
@Override
public void onTabReselected(int position) {
Toast.makeText(StatActivity.this, "Tab reselected: " + position, Toast.LENGTH_SHORT).show();
}
});
reloadPager();
overridePendingTransition(0, 0);
}
@Override
protected void onDestroy() {
// Unregister to the EventBus
EventBus.getDefault().unregister(this);
super.onDestroy();
}
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(StatActivity.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(StatActivity.this, "Sensor selected " + mSpinnerAdapter.getItem(position), Toast.LENGTH_SHORT).show();
SingleInstance.setSpinnerSensorPosition(position);
Intent intent = getIntent();
finish();
startActivity(intent);
}
mFirstStart = false;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
@Override
protected int getSelfNavDrawerItem() {
// set this to have a nav drawer associated with this activity
return NAVDRAWER_ITEM_STATS;
}
private void reloadPager() {
String sensorId = SingleInstance.getUserController().getUser().getSensors().get(SingleInstance.getSpinnerSensorPosition()).getSensorId();
SingleInstance.getStatsController().loadStats(sensorId);
mStats = SingleInstance.getStatsController().getStats();
mPageAdapter = new MyPagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPageAdapter);
mTabs.setViewPager(mPager);
final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
mPager.setPageMargin(pageMargin);
mPager.setCurrentItem(0);
}
/**
* Triggered when the reload of stats from server is done.
* @param event A ReloadStat event
*/
public void onEvent(ReloadStatEvent event) {
statReloaded = true;
if (configReloaded && statReloaded) {
configReloaded = statReloaded = false;
reloadPager();
}
}
/**
* Triggered when the reload of configs from server is done.
* @param event A ReloadConfig event
*/
public void onEvent(ReloadConfigEvent event) {
configReloaded = true;
if (configReloaded && statReloaded) {
configReloaded = statReloaded = false;
reloadPager();
}
}
/**
* Triggered when the user wants to reload data.
* @param event A ReloadUser event
*/
public void onEvent(ReloadUserEvent event) {
if (event.refreshDataFromServer())
this.refreshData();
}
public void openSpinner(View view) {
mSpinner.performClick();
}
public class MyPagerAdapter extends FragmentPagerAdapter {
private final String[] TITLES = {"DAY", "WEEK", "MONTH", "YEAR", "ALL TIME"};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public Fragment getItem(int position) {
StatDTO stat = null;
try {
stat = mStats.get(position);
} catch (Exception e) {
LOGD(TAG, "Stat not found while trying to populate SlidingStatFragment " + e.toString());
}
return SlidingStatFragment.newInstance(stat);
}
}
}