package com.hci.moola; import android.animation.Animator; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.hci.moola.model.ColorPicker; import com.hci.moola.model.Iou; import com.hci.moola.model.ObservableSortedList; import com.hci.moola.model.Transaction; import com.hci.moola.view.ExpandableListItem; import com.hci.moola.view.ExpandableMultiSelectAdapter; import com.hci.moola.view.NaturalListView; import com.hci.moola.view.SwipeDismissTouchListener; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; public class IouListFragment extends Fragment { private ObservableSortedList<Iou> mIous; private IouAdapter mAdapter; private NaturalListView mIouListView; private IouListFragmentCallback mCallback; private static final String TAG_ARGS = "model"; public static IouListFragment newInstance(ArrayList<Iou> ious) { IouListFragment fragment = new IouListFragment(); Bundle args = new Bundle(); args.putParcelableArrayList(TAG_ARGS, ious); fragment.setArguments(args); return fragment; } public void addTransaction(Transaction txn) { for (Iou iou : mIous) { if (txn.belongsToIou(iou)) { iou.addTransaction(txn); mAdapter.notifyDataSetChanged(); return; } } mIous.add(new Iou(txn, ColorPicker.getInstance().next())); mAdapter.notifyDataSetChanged(); } public void updateTransaction(Transaction txn) { for (Iou iou : mIous) { if (txn.belongsToIou(iou)) { iou.updateTransaction(txn); break; } } mAdapter.notifyDataSetChanged(); } public interface IouListFragmentCallback { public void onTransactionClicked(Iou iou, Transaction txn); } @Override public void onAttach(Activity activity) { super.onAttach(activity); mCallback = (IouListFragmentCallback) activity; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { ArrayList<Iou> items = getArguments().getParcelableArrayList(TAG_ARGS); mIous = new ObservableSortedList<Iou>(); for (Iou i : items) mIous.add(i); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View rootView = inflater.inflate(R.layout.fragment_iou_list, container, false); mIouListView = (NaturalListView) rootView.findViewById(R.id.iouListView); mAdapter = new IouAdapter(this.getActivity(), mIous, mIouListView, mCallback); mIouListView.setAdapter(mAdapter); mIouListView.setNaturalListViewListener(mAdapter); return rootView; } private static class IouAdapter extends ExpandableMultiSelectAdapter<Iou> implements NaturalListView.NaturalListViewListener { private Locale mLocale; private LayoutInflater mInflater; private NaturalListView mListView; private IouListFragmentCallback mFragmentCallback; private static final int TEXT_DARK_COLOR = 0xff333333; private static final int TEXT_LIGHT_COLOR = 0xfff0f0f0; private static final int TEXT_DARK_SEC_COLOR = 0xff666666; private static final int TEXT_LIGHT_SEC_COLOR = 0xffe0e0e0; public IouAdapter(Activity activity, ObservableSortedList<Iou> items, NaturalListView listView, IouListFragmentCallback callback) { super(activity, items); mInflater = activity.getLayoutInflater(); mLocale = activity.getResources().getConfiguration().locale; mListView = listView; mFragmentCallback = callback; } public void collapseAllItems() { for (ExpandableListItem<Iou> item : mItems) { item.setExpanded(false); } notifyDataSetChanged(); } @Override public View getView(final int position, View convertView, ViewGroup parent) { final TitleViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_iou, parent, false); holder = new TitleViewHolder(); holder.person = (TextView) convertView.findViewById(R.id.list_item_iou_person); holder.amount = (TextView) convertView.findViewById(R.id.list_item_iou_amount); holder.expandableLayout = (LinearLayout) convertView.findViewById(R.id.list_item_iou_expandablelayout); holder.summaryLayout = (ViewGroup) convertView.findViewById(R.id.list_item_iou_summary_layout); convertView.setTag(holder); } else holder = (TitleViewHolder) convertView.getTag(); convertView.setOnTouchListener(new SwipeDismissTouchListener(convertView, null, new SwipeDismissTouchListener.DismissCallbacks() { @Override public boolean canDismiss(Object token, float x, float y) { return y >= holder.summaryLayout.getTop() && y <= holder.summaryLayout.getBottom(); } @Override public void onDismiss(View view, Object token) { IouAdapter.this.mItems.remove(position); IouAdapter.this.notifyDataSetChanged(); } @Override public void onClick(View view, Object token, float x, float y) { mListView.onItemClick(view, position); } })); final ExpandableListItem<Iou> expandedItem = (ExpandableListItem<Iou>) getItem(position); final Iou item = expandedItem.getItem(); if (item != null) { int textColor = ColorPicker.isDarkColor(item.getColor()) ? TEXT_LIGHT_COLOR : TEXT_DARK_COLOR; holder.person.setText(item.getPerson()); holder.person.setTextColor(textColor); holder.amount.setText(item.getTotalAmountText()); holder.amount.setTextColor(textColor); List<Transaction> txns = item.getTransactionList(); for (int i = 0; i < txns.size(); i++) { View tRow; if (holder.expandableLayout.getChildCount() <= i) { tRow = mInflater.inflate(R.layout.list_item_iou_expanded, null); holder.expandableLayout.addView(tRow); } else tRow = holder.expandableLayout.getChildAt(i); tRow.setBackgroundColor((item.getColor() & 0x00FFFFFF) ^ 0xa0000000); final Transaction t = txns.get(i); tRow.setOnTouchListener(new SwipeDismissTouchListener(tRow, null, new SwipeDismissTouchListener.DismissCallbacks() { @Override public boolean canDismiss(Object token, float x, float y) { return true; } @Override public void onDismiss(View view, Object token) { if (item.getTransactionList().size() <= 1) { IouAdapter.this.remove((ExpandableListItem<Iou>) IouAdapter.this.getItem(position)); // IouAdapter.this.collapseAllItems(); } item.removeTransaction(t); IouAdapter.this.notifyDataSetChanged(); } @Override public void onClick(View view, Object token, float x, float y) { mFragmentCallback.onTransactionClicked(item, t); } })); TextView description = (TextView) tRow.findViewById(R.id.list_item_iou_expanded_description); description.setTextColor(textColor); TextView date = (TextView) tRow.findViewById(R.id.list_item_iou_expanded_date); date.setTextColor(ColorPicker.isDarkColor(item.getColor()) ? TEXT_LIGHT_SEC_COLOR : TEXT_DARK_SEC_COLOR); description.setText(t.getFormattedDescription()); date.setText(t.getDate(mLocale)); } while (holder.expandableLayout.getChildCount() > txns.size()) holder.expandableLayout.removeViewAt(holder.expandableLayout.getChildCount() - 1); if (!expandedItem.isExpanded()) holder.expandableLayout.setVisibility(View.GONE); convertView.setBackgroundColor(item.getColor()); } return convertView; } @Override public boolean onExpandStart(View v, ExpandableListItem viewObject) { TitleViewHolder holder = (TitleViewHolder) v.getTag(); holder.expandableLayout.setVisibility(View.VISIBLE); return true; } @Override public void onExpandEnd(View v, ExpandableListItem viewObject) { } @Override public void onCollapseStart(View v, ExpandableListItem viewObject) { } @Override public void onCollapseEnd(View v, ExpandableListItem viewObject) { TitleViewHolder holder = (TitleViewHolder) v.getTag(); holder.expandableLayout.setVisibility(View.GONE); } @Override public Collection<Animator> addExpandAnimations(View v, ExpandableListItem viewObject) { return null; } @Override public Collection<Animator> addCollapseAnimations(View v, ExpandableListItem viewObject) { return null; } private static class TitleViewHolder { ViewGroup summaryLayout; TextView person; TextView amount; LinearLayout expandableLayout; } } }