package ivl.android.moneybalance;
import java.util.ArrayList;
import java.util.List;
import ivl.android.moneybalance.dao.CalculationDataSource;
import ivl.android.moneybalance.dao.DataBaseHelper;
import ivl.android.moneybalance.data.Calculation;
import ivl.android.moneybalance.data.Currency;
import ivl.android.moneybalance.data.Expense;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
public class ManageCurrenciesActivity extends ActionBarActivity {
public static final String PARAM_CALCULATION_ID = "calculationId";
private final DataBaseHelper dbHelper = new DataBaseHelper(this);
private final CalculationDataSource calculationDataSource = new CalculationDataSource(dbHelper);
private Calculation calculation;
private class CurrencyEntry {
public Currency currency;
public boolean used;
}
private Spinner mainCurrencyField;
private final List<CurrencyEntry> additionalCurrencies = new ArrayList<>();
private AdditionalCurrencyAdapter additionalCurrencyAdapter;
private ListView additionalCurrencyList;
private class AdditionalCurrencyAdapter extends BaseAdapter {
@Override
public int getCount() {
// plus one for "Add Currency"
return additionalCurrencies.size() + 1;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.currency_list_entry, parent, false);
TextView textView = (TextView) view.findViewById(R.id.currency_details);
ImageView deleteButton = (ImageView) view.findViewById(R.id.delete_button);
textView.setId(position);
boolean showDeleteButton = false;
if (position < additionalCurrencies.size()) {
final Currency thisCurrency = additionalCurrencies.get(position).currency;
java.util.Currency newMainCurrency = (java.util.Currency) mainCurrencyField.getSelectedItem();
CurrencyHelper mainCurrencyHelper = new CurrencyHelper(newMainCurrency);
String text = String.format("%s (%s = %s)", thisCurrency.getCurrencyCode(),
thisCurrency.getCurrencyHelper().format(thisCurrency.getExchangeRateThis()),
mainCurrencyHelper.format(thisCurrency.getExchangeRateMain()));
textView.setText(text);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showEditCurrencyDialog(thisCurrency);
}
});
showDeleteButton = !additionalCurrencies.get(position).used;
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
deleteCurrency(thisCurrency);
}
});
} else {
textView.setText(R.string.add_currency);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showEditCurrencyDialog(null);
}
});
}
deleteButton.setVisibility(showDeleteButton ? View.VISIBLE : View.INVISIBLE);
return view;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
setContentView(R.layout.manage_currencies);
setTitle(R.string.manage_currencies);
Intent intent = getIntent();
long calculationId = intent.getLongExtra(PARAM_CALCULATION_ID, -1);
calculation = calculationDataSource.get(calculationId);
mainCurrencyField = (Spinner) findViewById(R.id.main_currency);
CurrencySpinnerAdapter mainCurrencyAdapter = new CurrencySpinnerAdapter(this);
mainCurrencyField.setAdapter(mainCurrencyAdapter);
int selected = mainCurrencyAdapter.findItem(calculation.getMainCurrencyCode());
mainCurrencyField.setSelection(selected);
mainCurrencyField.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
update();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
additionalCurrencyAdapter = new AdditionalCurrencyAdapter();
additionalCurrencyList = (ListView) findViewById(R.id.additional_currency_list);
update();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.manage_currencies_options, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_save:
doSave();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void update() {
additionalCurrencies.clear();
java.util.Currency newMainCurrency = (java.util.Currency) mainCurrencyField.getSelectedItem();
for (Currency currency : calculation.getCurrencies()) {
if (!currency.getCurrencyCode().equals(newMainCurrency.getCurrencyCode())) {
CurrencyEntry entry = new CurrencyEntry();
entry.currency = currency;
entry.used = false;
additionalCurrencies.add(entry);
}
}
for (Expense expense : calculation.getExpenses())
for (CurrencyEntry entry : additionalCurrencies)
if (entry.currency.equals(expense.getCurrency()))
entry.used = true;
additionalCurrencyList.setAdapter(additionalCurrencyAdapter);
}
private void deleteCurrency(Currency currency) {
if (!currency.equals(calculation.getMainCurrency()))
calculation.getCurrencies().remove(currency);
update();
}
private void showEditCurrencyDialog(final Currency currency) {
DialogFragment fragment = new DialogFragment() {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
List<Currency> hiddenCurrencies = new ArrayList<>();
for (Currency c : calculation.getCurrencies())
if (!c.equals(currency))
hiddenCurrencies.add(c);
final CurrencyEditor editor = new CurrencyEditor(getActivity(), calculation.getMainCurrency(), hiddenCurrencies);
if (currency != null)
editor.setValue(currency);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(editor.getView());
builder.setPositiveButton(android.R.string.ok, null);
builder.setNegativeButton(android.R.string.cancel, null);
final AlertDialog dialog = builder.create();
// register custom listener with validation for positive button
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface di) {
Button okButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (editor.validate()) {
Currency newCurrency = editor.getValue(calculation.getId());
if (currency != null) {
currency.setExchangeRate(newCurrency.getExchangeRateThis(), newCurrency.getExchangeRateMain());
} else {
calculation.getCurrencies().add(newCurrency);
}
dismiss();
update();
}
}
});
}
});
return dialog;
}
};
fragment.show(getSupportFragmentManager(), "editCurrency");
}
private void doSave() {
java.util.Currency newMainCurrency = (java.util.Currency) mainCurrencyField.getSelectedItem();
calculation.setMainCurrencyCode(newMainCurrency.getCurrencyCode());
calculationDataSource.update(calculation);
finish();
}
}