/*
* 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.budget;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.ContextMenu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.money.manager.ex.R;
import com.money.manager.ex.adapter.MoneySimpleCursorAdapter;
import com.money.manager.ex.budget.events.BudgetSelectedEvent;
import com.money.manager.ex.common.BaseListFragment;
import com.money.manager.ex.common.MmxCursorLoader;
import com.money.manager.ex.core.ContextMenuIds;
import com.money.manager.ex.core.MenuHelper;
import com.money.manager.ex.datalayer.BudgetRepository;
import com.money.manager.ex.datalayer.Select;
import com.money.manager.ex.domainmodel.Budget;
import org.greenrobot.eventbus.EventBus;
/**
* Use the {@link BudgetListFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class BudgetListFragment
extends BaseListFragment
implements LoaderManager.LoaderCallbacks<Cursor> {
public static final int REQUEST_EDIT_BUDGET = 1;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @return A new instance of fragment BudgetListFragment.
*/
public static BudgetListFragment newInstance() {
BudgetListFragment fragment = new BudgetListFragment();
Bundle args = new Bundle();
// args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}
private final int LOADER_BUDGETS = 1;
private MoneySimpleCursorAdapter mAdapter;
public BudgetListFragment() {
// Required empty public constructor
}
@Override
public String getSubTitle() {
return getString(R.string.budget_list);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setFloatingActionButtonVisible(true);
attachFloatingActionButtonToListView();
registerForContextMenu(getListView());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// @Override
// public View onCreateView(LayoutInflater inflater, ViewGroup container,
// Bundle savedInstanceState) {
// // Inflate the layout for this fragment
// return inflater.inflate(R.layout.fragment_budgets_list, container, false);
// }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_CANCELED) return;
switch (requestCode) {
case REQUEST_EDIT_BUDGET:
// refresh budget list
getLoaderManager().restartLoader(LOADER_BUDGETS, null, this);
break;
}
}
@Override
public void onViewCreated (View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
displayBudgets();
}
// Loader events
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Loader<Cursor> result = null;
switch (id) {
case LOADER_BUDGETS:
BudgetRepository repo = new BudgetRepository(getActivity());
Select query = new Select(repo.getAllColumns())
.orderBy(Budget.BUDGETYEARNAME);
result = new MmxCursorLoader(getActivity(), repo.getUri(), query);
break;
}
return result;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch (loader.getId()) {
case LOADER_BUDGETS:
// mAdapter.swapCursor(data);
mAdapter.changeCursor(data);
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
switch (loader.getId()) {
case LOADER_BUDGETS:
// mAdapter.swapCursor(null);
mAdapter.changeCursor(null);
break;
}
}
// Context Menu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
// get selected item name
SimpleCursorAdapter adapter = (SimpleCursorAdapter) getListAdapter();
Cursor cursor = (Cursor) adapter.getItem(info.position);
menu.setHeaderTitle(cursor.getString(cursor.getColumnIndex(Budget.BUDGETYEARNAME)));
MenuHelper menuHelper = new MenuHelper(getActivity(), menu);
menuHelper.addEditToContextMenu();
menuHelper.addDeleteToContextMenu();
//todo menu.add(Menu.NONE, ContextMenuIds.COPY, Menu.NONE, getString(R.string.copy));
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int budgetId = (int) info.id;
int id = item.getItemId();
ContextMenuIds menuId = ContextMenuIds.get(id);
switch (menuId) {
case EDIT:
editBudget(budgetId);
break;
case DELETE:
confirmDelete(budgetId);
break;
case COPY:
BudgetService service = new BudgetService(getActivity());
service.copy(budgetId);
break;
default:
return false;
}
return false;
}
// Other
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// Notify the parent to show the budget details.
Cursor cursor = (Cursor) l.getItemAtPosition(position);
String budgetName = cursor.getString(cursor.getColumnIndex(Budget.BUDGETYEARNAME));
EventBus.getDefault().post(new BudgetSelectedEvent(id, budgetName));
}
@Override
public void onFloatingActionButtonClicked() {
createBudget();
}
// Private
private void displayBudgets() {
mAdapter = new MoneySimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_1,
null,
new String[]{ Budget.BUDGETYEARNAME },
new int[]{ android.R.id.text1}, 0);
setListAdapter(mAdapter);
setListShown(false);
getLoaderManager().initLoader(LOADER_BUDGETS, null, this);
}
private void editBudget(int budgetId) {
Intent intent = new Intent(getActivity(), BudgetEditActivity.class);
intent.putExtra(BudgetEditActivity.KEY_BUDGET_ID, budgetId);
intent.setAction(Intent.ACTION_EDIT);
//startActivity(intent);
startActivityForResult(intent, REQUEST_EDIT_BUDGET);
}
private void createBudget() {
Intent intent = new Intent(getActivity(), BudgetEditActivity.class);
intent.setAction(Intent.ACTION_INSERT);
startActivityForResult(intent, REQUEST_EDIT_BUDGET);
}
private void confirmDelete(final int budgetId) {
new MaterialDialog.Builder(getActivity())
.title(R.string.delete)
.content(R.string.confirmDelete)
.positiveText(android.R.string.ok)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
BudgetService service = new BudgetService(getActivity());
service.delete(budgetId);
}
})
.neutralText(android.R.string.cancel)
.show();
}
}