package ru.orangesoftware.financisto2.fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import org.androidannotations.annotations.InstanceState;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.OptionsMenuItem;
import org.androidannotations.annotations.ViewById;
import greendroid.widget.QuickAction;
import greendroid.widget.QuickActionGrid;
import greendroid.widget.QuickActionWidget;
import ru.orangesoftware.financisto2.R;
import ru.orangesoftware.financisto2.activity.AccountWidget;
import ru.orangesoftware.financisto2.activity.BlotterFilterActivity_;
import ru.orangesoftware.financisto2.activity.BlotterOperations;
import ru.orangesoftware.financisto2.activity.TransactionActivity_;
import ru.orangesoftware.financisto2.activity.TransferActivity_;
import ru.orangesoftware.financisto2.adapter.BlotterListAdapter2;
import ru.orangesoftware.financisto2.adapter.TransactionsListAdapter2;
import ru.orangesoftware.financisto2.blotter.BlotterFilter;
import ru.orangesoftware.financisto2.bus.BlotterTotal;
import ru.orangesoftware.financisto2.bus.GetBlotterTotal;
import ru.orangesoftware.financisto2.bus.GetTransactionList;
import ru.orangesoftware.financisto2.bus.RemoveBlotterFilter;
import ru.orangesoftware.financisto2.bus.TransactionDeleted;
import ru.orangesoftware.financisto2.bus.TransactionList;
import ru.orangesoftware.financisto2.db.DatabaseAdapter;
import ru.orangesoftware.financisto2.db.DatabaseAdapter_;
import ru.orangesoftware.financisto2.filter.WhereFilter;
import ru.orangesoftware.financisto2.utils.Utils;
@EFragment(R.layout.fragment_blotter)
@OptionsMenu(R.menu.blotter_menu)
public class BlotterFragment extends AbstractFragment implements QuickActionWidget.OnQuickActionClickListener {
@Bean
protected DatabaseAdapter db;
@Bean
protected Utils u;
@FragmentArg
protected long accountId = -1;
@FragmentArg
protected boolean saveFilter = true;
@OptionsMenuItem(R.id.menu_filter)
protected MenuItem filterMenuItem;
private long selectedId = -1;
private QuickActionWidget actionGrid;
@InstanceState
protected WhereFilter blotterFilter = WhereFilter.empty();
@InstanceState
protected int scrollPosition = -1;
@ViewById(R.id.recyclerView)
RecyclerView recyclerView;
@ViewById(R.id.total)
TextView totalView;
@AfterInject
public void restoreFilter() {
if (accountId != -1) {
blotterFilter.eq(BlotterFilter.FROM_ACCOUNT_ID, String.valueOf(accountId));
}
if (saveFilter && blotterFilter.isEmpty()) {
blotterFilter = WhereFilter.fromSharedPreferences(getActivity().getPreferences(0));
}
}
@AfterViews
public void initViews() {
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, long id, View v) {
onListItemClick(v, position, id);
}
});
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
updateFilterMenu();
}
public void updateFilterMenu() {
if (filterMenuItem != null) {
Drawable drawable = getResources().getDrawable(R.drawable.actionbar_filter);
if (!blotterFilter.isEmpty()) {
drawable.mutate().setColorFilter(getResources().getColor(R.color.holo_blue_light), PorterDuff.Mode.SRC_ATOP);
}
filterMenuItem.setIcon(drawable);
}
}
@Override
protected void reload() {
WhereFilter whereFilter = bus.removeSticky(WhereFilter.class);
if (whereFilter != null) {
saveFilter(whereFilter);
}
RemoveBlotterFilter removeBlotterFilter = bus.removeSticky(RemoveBlotterFilter.class);
if (removeBlotterFilter != null) {
saveFilter(WhereFilter.empty());
}
scrollPosition = recyclerView.getVerticalScrollbarPosition();
bus.post(new GetTransactionList(blotterFilter));
bus.post(new GetBlotterTotal(blotterFilter));
updateFilterMenu();
}
private void saveFilter(WhereFilter filter) {
blotterFilter = filter;
if (saveFilter) {
SharedPreferences preferences = getActivity().getPreferences(0);
blotterFilter.toSharedPreferences(preferences);
}
updateFilterMenu();
}
public void onEventMainThread(TransactionList event) {
FragmentActivity context = getActivity();
DatabaseAdapter db = DatabaseAdapter_.getInstance_(context);
BlotterListAdapter2 adapter;
if (event.accountId != -1) {
adapter = new TransactionsListAdapter2(context, event.cursor);
} else {
adapter = new BlotterListAdapter2(context, event.cursor);
}
recyclerView.setAdapter(adapter);
// TODO restore scroll position
}
public void onEventMainThread(BlotterTotal event) {
u.setTotal(totalView, event.total);
}
public void onEventMainThread(WhereFilter filter) {
blotterFilter = filter;
reload();
}
public void onEventMainThread(RemoveBlotterFilter filter) {
blotterFilter = WhereFilter.empty();
reload();
}
@OptionsItem(R.id.menu_add_transaction)
public void addTransaction() {
TransactionActivity_.IntentBuilder_ intent = TransactionActivity_.intent(this);
if (accountId != -1) {
intent.accountId(accountId);
}
intent.template(blotterFilter.getIsTemplate());
intent.start();
}
@OptionsItem(R.id.menu_add_transfer)
public void addTransfer() {
TransferActivity_.IntentBuilder_ intent = TransferActivity_.intent(this);
if (accountId != -1) {
intent.accountId(accountId);
}
intent.template(blotterFilter.getIsTemplate());
intent.start();
}
@OptionsItem(R.id.menu_filter)
public void filter() {
Intent intent = BlotterFilterActivity_.intent(this).get();
blotterFilter.toIntent(intent);
startActivity(intent);
}
public void onListItemClick(View v, int position, long id) {
selectedId = id;
prepareAccountActionGrid();
actionGrid.show(v);
}
private void prepareAccountActionGrid() {
Context context = getActivity();
actionGrid = new QuickActionGrid(context);
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_info, R.string.info));
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_edit, R.string.edit));
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_trash, R.string.delete));
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_copy, R.string.duplicate));
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_tick, R.string.clear));
actionGrid.addQuickAction(new QuickAction(context, R.drawable.ic_action_double_tick, R.string.reconcile));
actionGrid.setOnQuickActionClickListener(this);
}
@Override
public void onQuickActionClicked(QuickActionWidget widget, int position) {
switch (position) {
case 0:
showTransactionInfo();
break;
case 1:
editTransaction();
break;
case 2:
deleteTransaction();
break;
case 3:
duplicateTransaction(1);
break;
case 4:
clearTransaction();
break;
case 5:
reconcileTransaction();
break;
}
}
private void showTransactionInfo() {
}
private void editTransaction() {
new BlotterOperations(getActivity(), db, selectedId, bus).editTransaction();
}
private void deleteTransaction() {
new BlotterOperations(getActivity(), db, selectedId, bus).deleteTransaction();
}
private long duplicateTransaction(int multiplier) {
Context context = getActivity();
long newId = new BlotterOperations(context, db, selectedId, bus).duplicateTransaction(multiplier);
String toastText;
if (multiplier > 1) {
toastText = getString(R.string.duplicate_success_with_multiplier, multiplier);
} else {
toastText = getString(R.string.duplicate_success);
}
Toast.makeText(context, toastText, Toast.LENGTH_LONG).show();
AccountWidget.updateWidgets(context);
reload();
return newId;
}
private void clearTransaction() {
new BlotterOperations(getActivity(), db, selectedId, bus).clearTransaction();
reload();
}
private void reconcileTransaction() {
new BlotterOperations(getActivity(), db, selectedId, bus).reconcileTransaction();
reload();
}
public void onEventMainThread(TransactionDeleted event) {
AccountWidget.updateWidgets(getActivity());
reload();
}
}