package com.money.manager.ex.transactions; import android.content.Context; import android.content.Intent; import android.os.Build; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import com.money.manager.ex.R; import com.money.manager.ex.common.CategoryListActivity; import com.money.manager.ex.common.CommonSplitCategoryLogic; import com.money.manager.ex.core.Core; import com.money.manager.ex.core.FormatUtilities; import com.money.manager.ex.core.TransactionTypes; import com.money.manager.ex.database.ISplitTransaction; import com.money.manager.ex.servicelayer.CategoryService; import com.money.manager.ex.transactions.events.AmountEntryRequestedEvent; import com.money.manager.ex.transactions.events.CategoryRequestedEvent; import com.money.manager.ex.transactions.events.SplitItemRemovedEvent; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; import java.util.Collections; import java.util.List; import info.javaperformance.money.Money; import info.javaperformance.money.MoneyFactory; /** * Adapter for the recycler view version of Split Categories view. */ public class SplitCategoriesAdapter extends RecyclerView.Adapter<SplitItemViewHolder> implements SplitItemTouchAdapter { public SplitCategoriesAdapter() { splitTransactions = new ArrayList<>(); } public List<ISplitTransaction> splitTransactions; public int currencyId; /** * Transaction type for the main transaction that contains the splits. */ public TransactionTypes transactionType; private Context mContext; /** * Inflate a layout from XML and return the holder. */ @Override public SplitItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { mContext = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(R.layout.item_splittransaction, parent, false); SplitItemViewHolder viewHolder = new SplitItemViewHolder(view); initAmountControl(viewHolder); initCategorySelector(viewHolder); initTransactionTypeButton(viewHolder); return viewHolder; } /** * Populate data into the item through holder. */ @Override public void onBindViewHolder(SplitItemViewHolder holder, int position) { ISplitTransaction split = this.splitTransactions.get(position); bindCategory(getContext(), holder, split); bindTransactionTypeButton(split, holder); bindAmount(split, holder); } @Override public int getItemCount() { return splitTransactions.size(); } public Context getContext() { return mContext; } private void bindAmount(ISplitTransaction splitTransaction, SplitItemViewHolder holder) { Money displayAmount = splitTransaction.getAmount(); if (displayAmount != null && !(displayAmount.isZero())) { // Change the sign to positive. if(displayAmount.toDouble() < 0) { displayAmount = displayAmount.negate(); } } FormatUtilities formatter = new FormatUtilities(getContext()); formatter.formatAmountTextView(holder.txtAmount, displayAmount, currencyId); } private void bindCategory(Context context, SplitItemViewHolder holder, ISplitTransaction split) { CategoryService service = new CategoryService(context); String buttonText = service.getCategorySubcategoryName(split.getCategoryId(), split.getSubcategoryId()); holder.txtSelectCategory.setText(buttonText); } private void bindTransactionTypeButton(ISplitTransaction split, SplitItemViewHolder viewHolder) { int green; int red; // 15 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { green = getContext().getColor(R.color.material_green_700); red = getContext().getColor(R.color.material_red_700); } else { green = getContext().getResources().getColor(R.color.material_green_700); red = getContext().getResources().getColor(R.color.material_red_700); } if (split.getTransactionType(transactionType) == TransactionTypes.Withdrawal) { // withdrawal viewHolder.transactionTypeButton.setText(R.string.ic_diff_removed); viewHolder.transactionTypeButton.setTextColor(red); } else { // deposit viewHolder.transactionTypeButton.setText(R.string.ic_diff_added); viewHolder.transactionTypeButton.setTextColor(green); } } private void initAmountControl(final SplitItemViewHolder viewHolder) { if (viewHolder.txtAmount.hasOnClickListeners()) return; viewHolder.txtAmount.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Object tag = v.getTag(); Money amount; if (tag == null) { amount = MoneyFactory.fromString("0"); } else { amount = MoneyFactory.fromString(tag.toString()); } // Request the amount entry. EventBus.getDefault().post(new AmountEntryRequestedEvent(viewHolder.getAdapterPosition(), amount)); } }); } private void initCategorySelector(final SplitItemViewHolder holder) { holder.txtSelectCategory.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // request category selection EventBus.getDefault().post(new CategoryRequestedEvent(holder.getAdapterPosition())); } }); } private void initTransactionTypeButton(final SplitItemViewHolder viewHolder) { viewHolder.transactionTypeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = viewHolder.getAdapterPosition(); // change transaction type. ISplitTransaction split = splitTransactions.get(position); TransactionTypes newTransactionType; if (split.getTransactionType(transactionType) == TransactionTypes.Withdrawal) { newTransactionType = TransactionTypes.Deposit; } else { newTransactionType = TransactionTypes.Withdrawal; } split.setTransactionType(newTransactionType, transactionType); notifyItemChanged(position); } }); } /** * Swipe support */ @Override public void onItemMove(int fromPosition, int toPosition) { // if (fromPosition < toPosition) { // for (int i = fromPosition; i < toPosition; i++) { // Collections.swap(mItems, i, i + 1); // } // } else { // for (int i = fromPosition; i > toPosition; i--) { // Collections.swap(mItems, i, i - 1); // } // } // notifyItemMoved(fromPosition, toPosition); // return true; } @Override public void onItemDismiss(int position) { // add the removed item to the collection ISplitTransaction tx = splitTransactions.get(position); EventBus.getDefault().post(new SplitItemRemovedEvent(tx)); this.splitTransactions.remove(position); notifyItemRemoved(position); } }