package ru.orangesoftware.financisto2.widget; import android.app.Activity; import android.content.Intent; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import ru.orangesoftware.financisto2.R; import ru.orangesoftware.financisto2.activity.AbstractActivity; import ru.orangesoftware.financisto2.activity.ActivityLayout; import ru.orangesoftware.financisto2.model.Currency; import static ru.orangesoftware.financisto2.activity.AbstractActivity.setVisibility; /** * Created by IntelliJ IDEA. * User: Denis Solonenko * Date: 6/24/11 6:45 PM */ public class RateLayoutView implements RateNodeOwner { private final AbstractActivity activity; private final ActivityLayout x; private final LinearLayout layout; private AmountInput amountInputFrom; private AmountInput amountInputTo; private RateNode rateNode; private View amountInputFromNode; private View amountInputToNode; private int amountFromTitleId; private int amountToTitleId; private AmountInput.OnAmountChangedListener amountFromChangeListener; private AmountInput.OnAmountChangedListener amountToChangeListener; private Currency currencyFrom; private Currency currencyTo; public RateLayoutView(AbstractActivity activity, ActivityLayout x, LinearLayout layout) { this.activity = activity; this.x = x; this.layout = layout; } public void setAmountFromChangeListener(AmountInput.OnAmountChangedListener amountFromChangeListener) { this.amountFromChangeListener = amountFromChangeListener; } public void setAmountToChangeListener(AmountInput.OnAmountChangedListener amountToChangeListener) { this.amountToChangeListener = amountToChangeListener; } private void createUI(int fromAmountTitleId, int toAmountTitleId) { //amount from amountInputFrom = AmountInput_.build(activity); amountInputFrom.setOwner(activity); amountInputFrom.setExpense(); amountFromTitleId = fromAmountTitleId; amountInputFromNode = x.addEditNode(layout, fromAmountTitleId, amountInputFrom); //amount to & rate amountInputTo = AmountInput_.build(activity); amountInputTo.setOwner(activity); amountInputTo.setIncome(); amountToTitleId = toAmountTitleId; amountInputToNode = x.addEditNode(layout, toAmountTitleId, amountInputTo); amountInputTo.setOnAmountChangedListener(onAmountToChangedListener); amountInputFrom.setOnAmountChangedListener(onAmountFromChangedListener); setVisibility(amountInputToNode, View.GONE); rateNode = new RateNode(this, x, layout); setVisibility(rateNode.rateInfoNode, View.GONE); } public void createTransferUI() { createUI(R.string.amount_from, R.string.amount_to); amountInputFrom.disableIncomeExpenseButton(); amountInputTo.disableIncomeExpenseButton(); } public void createTransactionUI() { createUI(R.string.amount, R.string.amount); amountInputTo.disableIncomeExpenseButton(); } public void setIncome() { amountInputFrom.setIncome(); amountInputTo.setIncome(); } public void setExpense() { amountInputFrom.setExpense(); amountInputTo.setExpense(); } public void selectCurrencyFrom(Currency currency) { currencyFrom = currency; amountInputFrom.setCurrency(currencyFrom); updateTitle(amountInputFromNode, amountFromTitleId, currencyFrom); checkNeedRate(); } public void selectCurrencyTo(Currency currency) { currencyTo = currency; amountInputTo.setCurrency(currencyTo); updateTitle(amountInputToNode, amountToTitleId, currencyTo); checkNeedRate(); } private void updateTitle(View node, int titleId, Currency currency) { TextView title = (TextView) node.findViewById(R.id.label); if (currency != null && currency.id > 0) { title.setText(activity.getString(titleId)+" ("+currency.name+")"); } else { title.setText(activity.getString(titleId)); } } private void checkNeedRate() { if (isDifferentCurrencies()) { setVisibility(rateNode.rateInfoNode, View.VISIBLE); setVisibility(amountInputToNode, View.VISIBLE); calculateRate(); } else { setVisibility(rateNode.rateInfoNode, View.GONE); setVisibility(amountInputToNode, View.GONE); } } private void calculateRate() { long amountFrom = amountInputFrom.getAmount(); long amountTo = amountInputTo.getAmount(); float r = 1.0f*amountTo/amountFrom; if (!Float.isNaN(r)) { rateNode.setRate(r); } rateNode.updateRateInfo(); } public long getFromAmount() { return amountInputFrom.getAmount(); } public long getToAmount() { if (isDifferentCurrencies()) { return amountInputTo.getAmount(); } else { return -amountInputFrom.getAmount(); } } private boolean isDifferentCurrencies() { return currencyFrom != null && currencyTo != null && currencyFrom.id != currencyTo.id; } public void onActivityResult(int requestCode, Intent data) { if (amountInputFrom.processActivityResult(requestCode, data)) { calculateRate(); return; } if (amountInputTo.processActivityResult(requestCode, data)) { calculateRate(); return; } if (requestCode == RateNode.EDIT_RATE) { String amount = data.getStringExtra(AmountInput.EXTRA_AMOUNT); if (amount != null) { rateNode.setRate(Float.parseFloat(amount)); updateToAmountFromRate(); } } } private final AmountInput.OnAmountChangedListener onAmountFromChangedListener = new AmountInput.OnAmountChangedListener(){ @Override public void onAmountChanged(long oldAmount, long newAmount) { double r = rateNode.getRate(); if (r > 0) { long amountFrom = amountInputFrom.getAmount(); long amountTo = Math.round(r*amountFrom); amountInputTo.setOnAmountChangedListener(null); amountInputTo.setAmount(amountTo); amountInputTo.setOnAmountChangedListener(onAmountToChangedListener); } else { long amountFrom = amountInputFrom.getAmount(); long amountTo = amountInputTo.getAmount(); if (amountFrom > 0) { rateNode.setRate(1.0f * amountTo / amountFrom); } } if (amountInputFrom.isIncomeExpenseEnabled()) { if (amountInputFrom.isExpense()) { amountInputTo.setExpense(); } else { amountInputTo.setIncome(); } } rateNode.updateRateInfo(); if (amountFromChangeListener != null) { amountFromChangeListener.onAmountChanged(oldAmount, newAmount); } } }; private final AmountInput.OnAmountChangedListener onAmountToChangedListener = new AmountInput.OnAmountChangedListener(){ @Override public void onAmountChanged(long oldAmount, long newAmount) { long amountFrom = amountInputFrom.getAmount(); long amountTo = amountInputTo.getAmount(); if (amountFrom > 0) { rateNode.setRate(1.0f * amountTo / amountFrom); } rateNode.updateRateInfo(); if (amountToChangeListener != null) { amountToChangeListener.onAmountChanged(oldAmount, newAmount); } } }; public void setFromAmount(long fromAmount) { amountInputFrom.setAmount(fromAmount); calculateRate(); } public void setToAmount(long toAmount) { amountInputTo.setAmount(toAmount); calculateRate(); } private void updateToAmountFromRate() { double r = rateNode.getRate(); long amountFrom = amountInputFrom.getAmount(); long amountTo = (long)Math.floor(r*amountFrom); amountInputTo.setOnAmountChangedListener(null); amountInputTo.setAmount(amountTo); rateNode.updateRateInfo(); amountInputTo.setOnAmountChangedListener(onAmountToChangedListener); } public void openFromAmountCalculator() { amountInputFrom.openCalculator(); } @Override public void onBeforeRateDownload() { amountInputFrom.setEnabled(false); amountInputTo.setEnabled(false); rateNode.disableAll(); } @Override public Currency getCurrencyFrom() { return currencyFrom; } @Override public Currency getCurrencyTo() { return currencyTo; } public long getCurrencyToId() { return currencyTo != null ? currencyTo.id : 0; } @Override public void onAfterRateDownload() { amountInputFrom.setEnabled(true); amountInputTo.setEnabled(true); rateNode.enableAll(); } @Override public void onSuccessfulRateDownload() { updateToAmountFromRate(); } @Override public void onRateChanged() { updateToAmountFromRate(); } @Override public Activity getActivity() { return activity; } public void selectSameCurrency(Currency currency) { selectCurrencyFrom(currency); selectCurrencyTo(currency); } }