package com.code44.finance.ui.reports.categories;
import android.content.Context;
import android.support.v4.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.code44.finance.R;
import com.code44.finance.data.model.Currency;
import com.code44.finance.data.model.Tag;
import com.code44.finance.utils.MoneyFormatter;
import java.util.List;
public class CategoriesReportAdapter extends BaseAdapter {
private final Context context;
private final Currency defaultCurrency;
private CategoriesReportData categoriesReportData;
private long totalAmount = 0;
public CategoriesReportAdapter(Context context, Currency defaultCurrency) {
this.context = context;
this.defaultCurrency = defaultCurrency;
}
@Override public int getCount() {
return categoriesReportData != null ? categoriesReportData.size() : 0;
}
@Override public Object getItem(int position) {
return categoriesReportData.get(position);
}
@Override public long getItemId(int position) {
return position;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.li_category_report, parent, false);
holder = new ViewHolder(convertView);
} else {
holder = (ViewHolder) convertView.getTag();
}
final CategoriesReportData.CategoriesReportItem item = categoriesReportData.get(position);
holder.color_IV.setColorFilter(item.getCategory().getColor());
final int percent = getPercent(item.getAmount());
holder.percent_TV.setText((percent == 0 ? "<1" : (percent == 100 && getCount() > 1 ? ">99" : percent)) + "%");
holder.title_TV.setText(item.getCategory().getTitle());
holder.amount_TV.setText(MoneyFormatter.format(defaultCurrency, item.getAmount()));
bindTags((ViewGroup) convertView, item.getTags());
return convertView;
}
public void setData(CategoriesReportData categoriesReportData, long totalAmount) {
this.categoriesReportData = categoriesReportData;
this.totalAmount = totalAmount;
notifyDataSetChanged();
}
private int getPercent(long amount) {
return Math.round(100.0f * amount / totalAmount);
}
private void bindTags(ViewGroup parent, List<Pair<Tag, Long>> tags) {
final int staticViewCount = 1;
final int currentCount = parent.getChildCount() - staticViewCount;
final int newCount = tags.size();
if (newCount > currentCount) {
for (int i = currentCount; i < newCount; i++) {
final View view = LayoutInflater.from(context).inflate(R.layout.li_category_report_tag, parent, false);
new TagViewHolder(view);
parent.addView(view);
}
} else {
parent.removeViews(staticViewCount, currentCount - newCount);
}
for (int i = staticViewCount, size = staticViewCount + tags.size(); i < size; i++) {
final TagViewHolder holder = (TagViewHolder) parent.getChildAt(i).getTag();
final Pair<Tag, Long> tagAmount = tags.get(i - staticViewCount);
holder.title_TV.setText(tagAmount.first.getTitle());
holder.amount_TV.setText(MoneyFormatter.format(defaultCurrency, tagAmount.second));
}
}
private static final class ViewHolder {
public final ImageView color_IV;
public final TextView percent_TV;
public final TextView title_TV;
public final TextView amount_TV;
public ViewHolder(View view) {
color_IV = (ImageView) view.findViewById(R.id.colorImageView);
percent_TV = (TextView) view.findViewById(R.id.percent_TV);
title_TV = (TextView) view.findViewById(R.id.titleTextView);
amount_TV = (TextView) view.findViewById(R.id.amountTextView);
view.setTag(this);
}
}
private static final class TagViewHolder {
public final TextView title_TV;
public final TextView amount_TV;
public TagViewHolder(View view) {
title_TV = (TextView) view.findViewById(R.id.titleTextView);
amount_TV = (TextView) view.findViewById(R.id.amountTextView);
view.setTag(this);
}
}
}