package co.smartreceipts.android.adapters; import android.content.Context; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.TextView; import java.lang.ref.WeakReference; import java.math.BigDecimal; import java.util.Vector; import co.smartreceipts.android.model.TaxItem; public class TaxAutoCompleteAdapter extends ArrayAdapter<TaxItem> implements TextWatcher, View.OnFocusChangeListener { private static final BigDecimal VAT_0 = BigDecimal.ZERO; private static final BigDecimal VAT_5_5 = new BigDecimal(5.5f); private static final BigDecimal VAT_10 = new BigDecimal(10); private static final BigDecimal VAT_20 = new BigDecimal(20); private final LayoutInflater mInflater; private final int mListItemId; private final TaxItem mDefaultValue; private final WeakReference<TextView> mPriceBox; private final WeakReference<AutoCompleteTextView> mTaxBox; private final boolean usePreTaxPrice; /** * The internal {@link java.util.List} that the {@link ArrayAdapter} uses to track entries caused * some synchronization issues. I used a {@link Vector} to resolve this. */ private final Vector<TaxItem> mData; public TaxAutoCompleteAdapter(Context context, TextView priceBox, AutoCompleteTextView taxBox, boolean usePreTaxPrice, float defaultValue) { super(context, android.R.layout.two_line_list_item); mInflater = LayoutInflater.from(context); mData = new Vector<>(); mListItemId = android.R.layout.two_line_list_item; mDefaultValue = new TaxItem(defaultValue, usePreTaxPrice); mPriceBox = new WeakReference<>(priceBox); mTaxBox = new WeakReference<>(taxBox); priceBox.addTextChangedListener(this); taxBox.setOnFocusChangeListener(this); this.usePreTaxPrice = usePreTaxPrice; } @Override public int getCount() { return mData.size(); } @Override public TaxItem getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public boolean isEmpty() { return mData.isEmpty(); } private static class MyViewHolder { public TextView top; public TextView bottom; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView priceBox = mPriceBox.get(); if (priceBox == null || TextUtils.isEmpty(priceBox.getText())) { return null; } final MyViewHolder holder; if (convertView == null) { holder = new MyViewHolder(); convertView = mInflater.inflate(mListItemId, parent, false); holder.top = (TextView) convertView.findViewById(android.R.id.text1); holder.bottom = (TextView) convertView.findViewById(android.R.id.text2); convertView.setTag(holder); } else { holder = (MyViewHolder) convertView.getTag(); } TaxItem item = getItem(position); item.setPrice(priceBox.getText().toString()); holder.top.setText(item.toString()); holder.bottom.setText(item.getPercentAsString()); return convertView; } @Override public void afterTextChanged(Editable editable) { // Method stub } @Override public void beforeTextChanged(CharSequence text, int start, int before, int count) { // Method stub } @Override public synchronized void onTextChanged(CharSequence text, int start, int before, int count) { if (text.length() > 0) { if (this.isEmpty()) { // If our adapter is empty, let's fill it up if (this.hasDefaultValue()) { mData.add(mDefaultValue); } mData.add(new TaxItem(VAT_0, usePreTaxPrice)); mData.add(new TaxItem(VAT_5_5, usePreTaxPrice)); mData.add(new TaxItem(VAT_10, usePreTaxPrice)); mData.add(new TaxItem(VAT_20, usePreTaxPrice)); } TextView taxBox = mTaxBox.get(); if (this.hasDefaultValue() && taxBox != null) { mDefaultValue.setPrice(text.toString()); taxBox.setText(mDefaultValue.toString()); } } else { TextView taxBox = mTaxBox.get(); if (this.hasDefaultValue() && taxBox != null) { mDefaultValue.setPrice("0"); taxBox.setText(mDefaultValue.toString()); } mData.clear(); } } public boolean hasDefaultValue() { return BigDecimal.ZERO.compareTo(mDefaultValue.getPercent()) < 0; } @Override public synchronized void onFocusChange(View view, boolean hasFocus) { AutoCompleteTextView taxBox = mTaxBox.get(); if (taxBox != null) { try { taxBox.showDropDown(); } catch (Exception e) { // Ignore } } } }