package ivl.android.moneybalance;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Currency;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
class CurrencySpinnerAdapter extends BaseAdapter {
private final List<Currency> currencies;
private final Context context;
private boolean symbolOnly = false;
public CurrencySpinnerAdapter(Context context) {
this(context, getAllCurrencies());
}
public CurrencySpinnerAdapter(Context context, List<Currency> currencies) {
this.currencies = currencies;
this.context = context;
}
public void setSymbolOnly(boolean symbolOnly) {
this.symbolOnly = symbolOnly;
}
@Override
public int getCount() {
return currencies.size();
}
@Override
public Object getItem(int position) {
return currencies.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public int findItem(Currency currency) {
for (int i = 0; i < currencies.size(); i++)
if (currencies.get(i).equals(currency))
return i;
return -1;
}
public int findItem(String currencyCode) {
for (int i = 0; i < currencies.size(); i++)
if (currencies.get(i).getCurrencyCode().equals(currencyCode))
return i;
return -1;
}
public void hideItem(String currencyCode) {
Currency currency = Currency.getInstance(currencyCode);
currencies.remove(currency);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (TextView) inflater.inflate(android.R.layout.simple_spinner_item, parent, false);
}
Currency currency = currencies.get(position);
view.setText(symbolOnly ? currency.getSymbol() : getDisplayName(currency));
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (TextView) inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
}
Currency currency = currencies.get(position);
view.setText(getDisplayName(currency));
return view;
}
@TargetApi(19)
private static List<Currency> getAllCurrencies() {
List<Currency> currencies = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
for (Currency currency : Currency.getAvailableCurrencies())
currencies.add(currency);
} else {
// API <= 18 does not implement getAvailableLocales(), and Set<Currency> does
// not seem to work.
Set<String> codes = new TreeSet<>();
for (Locale locale : Locale.getAvailableLocales()) {
try {
codes.add(Currency.getInstance(locale).getCurrencyCode());
} catch (Exception ignored) {}
}
for (String code : codes)
currencies.add(Currency.getInstance(code));
}
Comparator<Currency> comparator = new Comparator<Currency>() {
@Override
public int compare(Currency lhs, Currency rhs) {
return getDisplayName(lhs).compareTo(getDisplayName(rhs));
}
};
List<Currency> result = new ArrayList<>(currencies);
Collections.sort(result, comparator);
return result;
}
@TargetApi(19)
private static String getDisplayName(Currency currency) {
String name;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
name = currency.getDisplayName();
} else {
name = currency.getCurrencyCode();
}
return String.format("%s (%s)", name, currency.getSymbol());
}
}