package com.pedrocarrillo.expensetracker.ui.expenses;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.pedrocarrillo.expensetracker.R;
import com.pedrocarrillo.expensetracker.interfaces.IConstants;
import com.pedrocarrillo.expensetracker.interfaces.IDateMode;
import com.pedrocarrillo.expensetracker.interfaces.IUserActionsMode;
import com.pedrocarrillo.expensetracker.ui.MainActivity;
import com.pedrocarrillo.expensetracker.ui.MainFragment;
import com.pedrocarrillo.expensetracker.utils.DialogManager;
import com.pedrocarrillo.expensetracker.utils.ExpensesManager;
import java.util.Arrays;
import java.util.List;
/**
* @author pcarrillo on 16/10/2015.
*/
public class ExpensesContainerFragment extends MainFragment implements ExpensesFragment.IExpenseContainerListener {
public static final int RQ_NEW_EXPENSE = 1001;
private ViewPager vpExpensesContainer;
private ExpensesViewPagerAdapter expensesViewPagerAdapter;
// Action mode for expenses.
private android.view.ActionMode mActionMode;
public static ExpensesContainerFragment newInstance() {
ExpensesContainerFragment fragment = new ExpensesContainerFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
public ExpensesContainerFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_expenses_container, container, false);
vpExpensesContainer = (ViewPager)rootView.findViewById(R.id.vp_expenses);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMainActivityListener.setTitle(getString(R.string.expenses));
mMainActivityListener.setMode(MainActivity.NAVIGATION_MODE_TABS);
mMainActivityListener.setFAB(R.drawable.ic_add_white_48dp, new View.OnClickListener() {
@Override
public void onClick(View v) {
onAddNewExpense();
}
});
expensesViewPagerAdapter = new ExpensesViewPagerAdapter(getChildFragmentManager());
expensesViewPagerAdapter.addFrag(ExpensesFragment.newInstance(IDateMode.MODE_TODAY), getString(R.string.today));
expensesViewPagerAdapter.addFrag(ExpensesFragment.newInstance(IDateMode.MODE_WEEK), getString(R.string.week));
expensesViewPagerAdapter.addFrag(ExpensesFragment.newInstance(IDateMode.MODE_MONTH), getString(R.string.month));
vpExpensesContainer.setAdapter(expensesViewPagerAdapter);
mMainActivityListener.setPager(vpExpensesContainer, new TabLayout.ViewPagerOnTabSelectedListener(vpExpensesContainer) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
super.onTabSelected(tab);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
super.onTabUnselected(tab);
endActionMode();
}
});
}
private void onAddNewExpense() {
NewExpenseFragment newExpenseFragment = NewExpenseFragment.newInstance(IUserActionsMode.MODE_CREATE, null);
newExpenseFragment.setTargetFragment(this, RQ_NEW_EXPENSE);
newExpenseFragment.show(getChildFragmentManager(), "NEW_EXPENSE");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RQ_NEW_EXPENSE && resultCode == Activity.RESULT_OK) {
updateExpensesFragments();
}
}
@Override
public void updateExpensesFragments(){
updateExpenseSummary();
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(IConstants.BROADCAST_UPDATE_EXPENSES));
}
private android.view.ActionMode.Callback mActionModeCallback = new android.view.ActionMode.Callback() {
// Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.expenses_context_menu, menu);
return true;
}
// Called each time the action mode is shown. Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
eraseExpenses();
return true;
default:
return false;
}
}
// Called when the user exits the action mode
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
endActionMode();
mActionMode = null;
}
};
@Override
public boolean isActionMode() {
return mActionMode != null;
}
@Override
public void startActionMode() {
mActionMode = mMainActivityListener.setActionMode(mActionModeCallback);
}
@Override
public void endActionMode() {
if (mActionMode != null) {
mActionMode.finish();
ExpensesManager.getInstance().resetSelectedItems();
updateExpensesFragments();
}
}
@Override
public void setActionModeTitle(String title) {
mActionMode.setTitle(title);
mActionMode.invalidate();
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(IConstants.IS_ACTION_MODE_ACTIVATED, mActionMode != null);
super.onSaveInstanceState(outState);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
boolean isActionMode = savedInstanceState.getBoolean(IConstants.IS_ACTION_MODE_ACTIVATED);
if(isActionMode) {
mActionMode = mMainActivityListener.setActionMode(mActionModeCallback);
setActionModeTitle(String.valueOf(ExpensesManager.getInstance().getSelectedExpensesItems().size()));
}
}
}
private void eraseExpenses() {
DialogManager.getInstance().createCustomAcceptDialog(getActivity(), getString(R.string.delete), getString(R.string.confirm_delete_items), getString(R.string.confirm), getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
ExpensesManager.getInstance().eraseSelectedExpenses();
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(IConstants.BROADCAST_UPDATE_EXPENSES));
}
mActionMode.finish();
mActionMode = null;
}
});
}
private void updateExpenseSummary() {
if (vpExpensesContainer != null && expensesViewPagerAdapter != null) {
ExpensesFragment expensesFragment = expensesViewPagerAdapter.getItem(vpExpensesContainer.getCurrentItem());
if (mMainActivityListener != null)
mMainActivityListener.setExpensesSummary(expensesFragment.getCurrentDateMode());
}
}
}