/*
* Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
*
* 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 com.money.manager.ex.reports;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.DatePicker;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.money.manager.ex.MoneyManagerApplication;
import com.money.manager.ex.R;
import com.money.manager.ex.common.MmxCursorLoader;
import com.money.manager.ex.database.SQLDataSet;
import com.money.manager.ex.database.ViewMobileData;
import com.money.manager.ex.common.BaseListFragment;
import com.money.manager.ex.datalayer.Select;
import com.money.manager.ex.utils.MmxDate;
import com.money.manager.ex.utils.MmxDateTimeUtils;
import java.util.Date;
import javax.inject.Inject;
import dagger.Lazy;
public abstract class BaseReportFragment
extends BaseListFragment
implements LoaderCallbacks<Cursor> {
protected static final int ID_LOADER = 1;
protected static final String KEY_ITEM_SELECTED = "PayeeReportFragment:ItemSelected";
protected static final String KEY_WHERE_CLAUSE = "PayeeReportFragment:WhereClause";
protected static final String KEY_FROM_DATE = "PayeeReportFragment:FromDate";
protected static final String KEY_TO_DATE = "PayeeReportFragment:ToDate";
@Inject Lazy<MmxDateTimeUtils> dateTimeUtilsLazy;
protected int mItemSelected = R.id.menu_all_time;
protected String mWhereClause = null;
protected Date mDateFrom = null;
protected Date mDateTo = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MoneyManagerApplication.getApp().iocComponent.inject(this);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//set list view
setHasOptionsMenu(true);
setEmptyText(getString(R.string.no_data));
setListShown(false);
// Restore instance state.
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_ITEM_SELECTED))
mItemSelected = savedInstanceState.getInt(KEY_ITEM_SELECTED);
if (savedInstanceState.containsKey(KEY_FROM_DATE)) {
String dateFromString = savedInstanceState.getString(KEY_FROM_DATE);
mDateFrom = new MmxDate(dateFromString).toDate();
}
if (savedInstanceState.containsKey(KEY_TO_DATE)) {
String dateToString = savedInstanceState.getString(KEY_TO_DATE);
mDateTo = new MmxDate(dateToString).toDate();
}
}
//start loader
startLoader(savedInstanceState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
//inflate menu
inflater.inflate(R.menu.menu_report, menu);
inflater.inflate(R.menu.menu_period_picker, menu);
//checked item
MenuItem item = menu.findItem(mItemSelected);
if (item != null) {
item.setChecked(true);
}
}
// Loader events
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Loader<Cursor> result = null;
switch (id) {
case ID_LOADER:
if (args != null && args.containsKey(KEY_WHERE_CLAUSE)) {
setWhereClause(args.getString(KEY_WHERE_CLAUSE));
}
String where = prepareQuery(getWhereClause());
Select query = new Select()
.where(where);
result = new MmxCursorLoader(getActivity(), // context
new SQLDataSet().getUri(), // uri
query);
break;
}
return result;
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
switch (loader.getId()) {
case ID_LOADER:
// ((CursorAdapter) getListAdapter()).swapCursor(null);
((CursorAdapter) getListAdapter()).changeCursor(null);
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch (loader.getId()) {
case ID_LOADER:
// ((CursorAdapter) getListAdapter()).swapCursor(data);
((CursorAdapter) getListAdapter()).changeCursor(data);
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// MmxDateTimeUtils dateUtils = dateTimeUtilsLazy.get();
MmxDate dateTime = new MmxDate();
switch (item.getItemId()) {
case R.id.menu_current_month:
mDateFrom = dateTime.firstDayOfMonth().setTimeToBeginningOfDay().toDate();
mDateTo = dateTime.lastDayOfMonth().toDate();
break;
case R.id.menu_last_month:
mDateFrom = dateTime.minusMonths(1).firstDayOfMonth().toDate();
mDateTo = dateTime.minusMonths(1).lastDayOfMonth().toDate();
break;
case R.id.menu_last_30_days:
mDateFrom = dateTime.minusDays(30).toDate();
mDateTo = dateTime.setTimeToBeginningOfDay().toDate();
break;
case R.id.menu_current_year:
mDateFrom = dateTime.firstMonthOfYear().firstDayOfMonth().toDate();
mDateTo = dateTime.lastMonthOfYear().lastDayOfMonth().toDate();
break;
case R.id.menu_last_year:
mDateFrom = dateTime.minusYears(1)
.firstMonthOfYear()
.firstDayOfMonth().toDate();
mDateTo = dateTime.minusYears(1)
.lastMonthOfYear()
.lastDayOfMonth().toDate();
break;
case R.id.menu_all_time:
mDateFrom = null;
mDateTo = null;
break;
case R.id.menu_custom_dates:
//check item
item.setChecked(true);
mItemSelected = item.getItemId();
//show binaryDialog
showDialogCustomDates();
return true;
// break;
default:
return super.onOptionsItemSelected(item);
}
String whereClause = null;
if (mDateFrom != null && mDateTo != null) {
whereClause = ViewMobileData.Date + " >= '" + new MmxDate(mDateFrom).toIsoString() +
"' AND " + ViewMobileData.Date + " <= '" + new MmxDate(mDateTo).toIsoString() + "'";
}
//check item
item.setChecked(true);
mItemSelected = item.getItemId();
//compose bundle
Bundle args = new Bundle();
args.putString(KEY_WHERE_CLAUSE, whereClause);
//starts loader
startLoader(args);
return true;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_ITEM_SELECTED, mItemSelected);
outState.putString(KEY_WHERE_CLAUSE, getWhereClause());
if (mDateFrom != null) {
outState.putString(KEY_FROM_DATE, new MmxDate(mDateFrom).toIsoString());
}
if (mDateTo != null) {
outState.putString(KEY_TO_DATE, new MmxDate(mDateTo).toIsoString());
}
}
protected View addListViewHeaderFooter(int layout) {
return View.inflate(getActivity(), layout, null);
}
/**
* Prepare SQL query to execute in content provider
*
* @param whereClause
* @return
*/
protected abstract String prepareQuery(String whereClause);
protected void setWhereClause(String mWhereClause) {
this.mWhereClause = mWhereClause;
}
/**
* Start loader with arguments
*
* @param args
*/
protected void startLoader(Bundle args) {
getLoaderManager().restartLoader(ID_LOADER, args, this);
}
protected String getWhereClause() {
return mWhereClause;
}
private void showDialogCustomDates() {
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.customView(R.layout.dialog_choose_date_report, false)
.positiveText(android.R.string.ok)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) {
View view = materialDialog.getCustomView();
DatePicker fromDatePicker = (DatePicker) view.findViewById(R.id.datePickerFromDate);
DatePicker toDatePicker = (DatePicker) view.findViewById(R.id.datePickerToDate);
mDateFrom = dateTimeUtilsLazy.get().from(fromDatePicker);
mDateTo = dateTimeUtilsLazy.get().from(toDatePicker);
String whereClause =
ViewMobileData.Date + ">='" + new MmxDate(mDateFrom).toIsoString() + "' AND " +
ViewMobileData.Date + "<='" + new MmxDate(mDateTo).toIsoString() + "'";
Bundle args = new Bundle();
args.putString(KEY_WHERE_CLAUSE, whereClause);
startLoader(args);
//super.onPositive(binaryDialog);
}
})
.show();
// set date if is null
if (mDateFrom == null) mDateFrom = new MmxDate().today().toDate();
if (mDateTo == null) mDateTo = new MmxDate().today().toDate();
View view = dialog.getCustomView();
DatePicker fromDatePicker = (DatePicker) view.findViewById(R.id.datePickerFromDate);
DatePicker toDatePicker = (DatePicker) view.findViewById(R.id.datePickerToDate);
dateTimeUtilsLazy.get().setDatePicker(mDateFrom, fromDatePicker);
dateTimeUtilsLazy.get().setDatePicker(mDateTo, toDatePicker);
}
}