package com.pedrocarrillo.expensetracker.ui.expenses; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.SparseBooleanArray; 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.adapters.MainExpenseAdapter; import com.pedrocarrillo.expensetracker.custom.BaseViewHolder; import com.pedrocarrillo.expensetracker.custom.DefaultRecyclerViewItemDecorator; import com.pedrocarrillo.expensetracker.custom.SparseBooleanArrayParcelable; import com.pedrocarrillo.expensetracker.entities.Expense; import com.pedrocarrillo.expensetracker.interfaces.IConstants; import com.pedrocarrillo.expensetracker.interfaces.IDateMode; import com.pedrocarrillo.expensetracker.ui.MainFragment; import com.pedrocarrillo.expensetracker.utils.DialogManager; import com.pedrocarrillo.expensetracker.utils.ExpensesManager; /** * Created by pcarrillo on 17/09/2015. */ public class ExpensesFragment extends MainFragment implements BaseViewHolder.RecyclerClickListener { public static final int RQ_NEW_EXPENSE = 1001; private MainExpenseAdapter mMainExpenseAdapter; private RecyclerView rvExpenses; private @IDateMode int mCurrentDateMode; private IExpenseContainerListener expenseContainerListener; private ExpenseChangeReceiver expenseChangeReceiver = new ExpenseChangeReceiver(); public static ExpensesFragment newInstance(@IDateMode int dateMode) { ExpensesFragment expensesFragment = new ExpensesFragment(); Bundle bundle = new Bundle(); bundle.putInt(IDateMode.DATE_MODE_TAG, dateMode); expensesFragment.setArguments(bundle); return expensesFragment; } public ExpensesFragment() { } @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, false); rvExpenses = (RecyclerView) rootView.findViewById(R.id.rv_expenses); return rootView; } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(IConstants.TAG_SELECTED_ITEMS, new SparseBooleanArrayParcelable(mMainExpenseAdapter.getSelectedBooleanArray())); super.onSaveInstanceState(outState); } @Override public void onResume() { super.onResume(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver(expenseChangeReceiver, new IntentFilter(IConstants.BROADCAST_UPDATE_EXPENSES)); } @Override public void onPause() { super.onPause(); LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(expenseChangeReceiver); } @Override public void onAttach(Context context) { super.onAttach(context); if (getParentFragment() != null) { expenseContainerListener = (IExpenseContainerListener) getParentFragment(); } } @Override public void onDetach() { super.onDetach(); if (getParentFragment() != null) { expenseContainerListener = null; } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getArguments() != null) { @IDateMode int mode = getArguments().getInt(IDateMode.DATE_MODE_TAG); mCurrentDateMode = mode; ExpensesManager.getInstance().setExpensesListByDateMode(mCurrentDateMode); mMainExpenseAdapter = new MainExpenseAdapter(getActivity(), this, mCurrentDateMode); rvExpenses.setAdapter(mMainExpenseAdapter); } if (savedInstanceState != null) { if (savedInstanceState.containsKey(IConstants.TAG_SELECTED_ITEMS)) { mMainExpenseAdapter.setSelectedItems((SparseBooleanArray)savedInstanceState.getParcelable(IConstants.TAG_SELECTED_ITEMS)); mMainExpenseAdapter.notifyDataSetChanged(); } } rvExpenses.setLayoutManager(new LinearLayoutManager(getActivity())); rvExpenses.addItemDecoration(new DefaultRecyclerViewItemDecorator(getResources().getDimension(R.dimen.dimen_5dp))); } public void updateData() { ExpensesManager.getInstance().setExpensesListByDateMode(mCurrentDateMode); ExpensesManager.getInstance().resetSelectedItems(); if (mMainExpenseAdapter != null) mMainExpenseAdapter.updateExpenses(mCurrentDateMode); } @Override public void onClick(RecyclerView.ViewHolder vh, int position) { if (!expenseContainerListener.isActionMode()) { Expense expenseSelected = (Expense) vh.itemView.getTag(); Intent expenseDetail = new Intent(getActivity(), ExpenseDetailActivity.class); expenseDetail.putExtra(ExpenseDetailFragment.EXPENSE_ID_KEY, expenseSelected.getId()); startActivity(expenseDetail); } else { toggleSelection(position); } } @Override public void onLongClick(RecyclerView.ViewHolder vh, int position) { if (!expenseContainerListener.isActionMode()) { expenseContainerListener.startActionMode(); } toggleSelection(position); } public void toggleSelection(int position) { mMainExpenseAdapter.toggleSelection(position); int count = mMainExpenseAdapter.getSelectedItemCount(); if (count == 0) { expenseContainerListener.endActionMode(); } else { expenseContainerListener.setActionModeTitle(String.valueOf(count)); } } public void cancelActionMode() { if (expenseContainerListener.isActionMode()) { expenseContainerListener.endActionMode(); mMainExpenseAdapter.clearSelection(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == RQ_NEW_EXPENSE && resultCode == Activity.RESULT_OK) { updateData(); } } public class ExpenseChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { updateData(); } } public @IDateMode int getCurrentDateMode() { return mCurrentDateMode; } public interface IExpenseContainerListener { void updateExpensesFragments(); boolean isActionMode(); void startActionMode(); void endActionMode(); void setActionModeTitle(String title); } }