package au.id.teda.broadband.usage.fragments;
import au.id.teda.broadband.usage.chart.StackedBarChart;
import au.id.teda.broadband.usage.chart.StackedLineChart;
import au.id.teda.broadband.usage.database.DailyDataTableAdapter;
import au.id.teda.broadband.usage.util.DailyVolumeUsage;
import au.id.teda.broadband.usage.util.DailyVolumeUsageAdapter;
import au.id.teda.broadband.usage.util.PaginationView;
import org.achartengine.GraphicalView;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ViewFlipper;
import au.id.teda.broadband.usage.R;
public class DailyUsageFragment extends BaseFragment {
// View inflated by fragment
private View mFragmentView;
// Daily dev array
private DailyVolumeUsage mDailyUsageArray[];
// Gesture objects
private GestureDetector mGestureDetector;
private Animation mAnimSlideLeftIn;
private Animation mAnimSlideLeftOut;
private Animation mAnimSlideRightIn;
private Animation mAnimSlideRightOut;
private ViewFlipper mViewFlipper;
// Layout used
private TextView mLayoutUsed;
private PaginationView mPaginationView;
// Preference key for viewfliper tab location
private final static String PREF_FLIPPER_KEY = "pref_flipper_tab_key";
/**
* Called 3rd in the fragment life cycle
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Set reference to fragment layout to be inflated
mFragmentView = inflater.inflate(R.layout.fragment_daily_usage, container, false);
mLayoutUsed = (TextView) mFragmentView.findViewById(R.id.fragment_daily_usage_size);
if (!mLayoutHelper.isLayout_w800dp(mLayoutUsed)){
// Set reference to view flipper
mViewFlipper = (ViewFlipper) mFragmentView.findViewById(R.id.fragment_daily_usage_view_flipper);
// Load pagination view
mPaginationView = new PaginationView(mFragmentView, mContext);
// Set pagination
setPageNation();
}
return mFragmentView;
}
/**
* Called 4th in the fragment life cycle
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
loadGestures();
}
/**
* Called 5th in the fragment life cycle
*/
@Override
public void onResume() {
super.onResume();
// Check to see if layout used is landscape
if (mLayoutHelper.isLayoutPhoneLand(mLayoutUsed)){
// Build action bar title string
String title = mContext.getResources().getString(R.string.action_bar_title) + " - " + mAccountStatus.getCurrentMonthString();
// Set action bar title
getSherlockActivity().getSupportActionBar().setTitle(title);
}
}
/**
* Called 1st in the death of fragment
*/
@Override
public void onPause() {
super.onPause();
if (!mLayoutHelper.isLayout_w800dp(mLayoutUsed)){
// Remember ViewFliper tab position on fragment pause
int flipperPosition = mViewFlipper.getDisplayedChild();
mEditor.putInt(PREF_FLIPPER_KEY, flipperPosition);
mEditor.commit();
}
}
/**
* Load fragment view if account status and info is set
*/
@Override
protected void loadFragmentView(){
if (mAccountInfo.isInfoSet()
&& mAccountStatus.isStatusSet()){
// Get volume dev array
DailyDataTableAdapter mDatabase = new DailyDataTableAdapter(mContext);
String period = mAccountStatus.getDataBaseMonthString();
mDailyUsageArray = mDatabase.getDailyVolumeUsage(period);
TextView mCurrentMonthTV = (TextView) mFragmentView.findViewById(R.id.fragment_daily_usage_month_tv);
mCurrentMonthTV.setText(mAccountStatus.getCurrentMonthString());
if (!mLayoutHelper.isLayout_w800dp(mLayoutUsed)){
setFlipperView();
loadStackedBarChart();
loadStackedLineChart();
}
loadDataTable();
}
}
/**
* Set flipper view based on last stored value
*/
private void setFlipperView() {
// Set view flipper to last view
int flipperPosition = mSettings.getInt(PREF_FLIPPER_KEY, 0);
mViewFlipper.setDisplayedChild(flipperPosition);
}
/**
* Load gestures and flipper animation
*/
private void loadGestures() {
// Set reference to gesture detector
mGestureDetector = new GestureDetector(new MyGestureDetector());
// Set animation references
mAnimSlideLeftIn = AnimationUtils.loadAnimation(mContext, R.anim.slide_left_in);
mAnimSlideLeftOut = AnimationUtils.loadAnimation(mContext, R.anim.slide_left_out);
mAnimSlideRightIn = AnimationUtils.loadAnimation(mContext, R.anim.slide_right_in);
mAnimSlideRightOut = AnimationUtils.loadAnimation(mContext, R.anim.slide_right_out);
}
/**
* Load stacked bar chart into view
*/
private void loadStackedBarChart() {
// Set layout container for chart
LinearLayout mChartContainer = (LinearLayout) mFragmentView.findViewById(R.id.fragment_daily_usage_bar_chart_container);
// Initialise chart class
StackedBarChart mBarChart = new StackedBarChart(mContext);
// Get chart view from library
GraphicalView mBarChartView = (GraphicalView) mBarChart.getBarChartView(mDailyUsageArray);
// Add chart view to layout view
mChartContainer.removeAllViews();
mChartContainer.addView(mBarChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
// Setup the touch listener for chart
mBarChartView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return false;
}
});
}
/**
* Load data table into fragment view
*/
private void loadDataTable(){
// Initiate adapter to be used with list view
DailyVolumeUsageAdapter adapter = new DailyVolumeUsageAdapter(mContext, R.layout.listview_data_table_row, mDailyUsageArray);
// Reference list view to be used
ListView mListView = (ListView) mFragmentView.findViewById(R.id.fragment_daily_usage_listview);
// Add list view header
@SuppressWarnings("static-access")
View headerView = ((LayoutInflater) getActivity().getSystemService(getActivity().LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_data_table_header, null, false);
if (mListView.getHeaderViewsCount() == 0){
mListView.addHeaderView(headerView);
}
// Set adapter to be used with the list view
mListView.setAdapter(adapter);
// Setup the touch listener for chart
mListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return false;
}
});
}
/**
* Load stacked line chart into fragment view
*/
private void loadStackedLineChart() {
// Set layout container for chart
LinearLayout mChartContainer = (LinearLayout) mFragmentView.findViewById(R.id.fragment_daily_usage_line_chart_container);
// Initialise chart class
StackedLineChart mLineChart = new StackedLineChart(mContext);
// Get chart view from library
GraphicalView mLineChartView = (GraphicalView) mLineChart.getChartView(mDailyUsageArray);
// Add chart view to layout view
mChartContainer.removeAllViews();
mChartContainer.addView(mLineChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
// Setup the touch listener for chart
mLineChartView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return false;
}
});
}
/**
* Set view title based on flipper tab showing
*/
public void setFlipperTitle() {
// Set title TextView object and initialise
TextView chartTitle = (TextView) mFragmentView.findViewById(R.id.fragment_daily_usage_title_tv);
// Set title based on view flipper tab showing
String title = getResources().getString(R.string.fragment_daily_usage_default_title);
if (mViewFlipper.getDisplayedChild() == 0){
title = getResources().getString(R.string.fragment_daily_usage_usage_table);
} else if (mViewFlipper.getDisplayedChild() == 1){
title = getResources().getString(R.string.fragment_daily_usage_bar_chart);
} else if (mViewFlipper.getDisplayedChild() == 2){
title = getResources().getString(R.string.fragment_daily_usage_line_chart);
}
chartTitle.setText(title);
}
class MyGestureDetector extends SimpleOnGestureListener {
// Gesture static int values to detect fling
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent motionEvent1,
MotionEvent motionEvent2, float velocityX, float velocityY) {
try {
// Check to see if swipe is to short
if (Math.abs(motionEvent1.getY() - motionEvent2.getY()) > SWIPE_MAX_OFF_PATH) {
return false;
}
// Check if it is a right to left swipe
if (motionEvent1.getX() - motionEvent2.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (!mLayoutHelper.isLayout_w800dp(mLayoutUsed)){
mViewFlipper.setInAnimation(mAnimSlideLeftIn);
mViewFlipper.setOutAnimation(mAnimSlideLeftOut);
mViewFlipper.showNext();
setFlipperTitle();
setPageNation();
}
return true;
}
// Else check if it is a left to right swipe
else if (motionEvent2.getX() - motionEvent1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (!mLayoutHelper.isLayout_w800dp(mLayoutUsed)){
mViewFlipper.setInAnimation(mAnimSlideRightIn);
mViewFlipper.setOutAnimation(mAnimSlideRightOut);
mViewFlipper.showPrevious();
setFlipperTitle();
setPageNation();
}
return true;
}
} catch (Exception e) {
// nothing
}
return false;
}
// It is necessary to return true from onDown for the onFling event to
// register
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
public void setPageNation(){
mPaginationView.setActive(getViewFlipperTab());
}
public int getViewFlipperTab(){
return mViewFlipper.getDisplayedChild();
}
}