package com.greenaddress.greenbits.ui; import android.content.Context; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.support.v7.widget.GridLayout; import android.widget.TextView; import com.greenaddress.greenbits.GaService; import org.bitcoinj.core.Coin; import org.bitcoinj.utils.Fiat; import java.util.Locale; class Exchanger implements AmountFields.OnConversionFinishListener { private final Context mContext; private final GaService mService; private final TextView mAmountFiatWithCommission; private final TextView mAmountBtcWithCommission; private final EditText mAmountFiatEdit; private final EditText mAmountBtcEdit; private final boolean mIsBuyPage; public static final String TAG_EXCHANGER_TX_MEMO = "__exchanger_tx__"; interface OnCalculateCommissionFinishListener { void calculateCommissionFinish(); } private final OnCalculateCommissionFinishListener mOnCalculateCommissionFinishListener; Exchanger(final Context context, final GaService service, final View mView, final boolean isBuyPage, final OnCalculateCommissionFinishListener listener) { mContext = context; mService = service; mIsBuyPage = isBuyPage; mOnCalculateCommissionFinishListener = listener; mAmountFiatWithCommission = UI.find(mView, R.id.amountFiatWithCommission); mAmountBtcWithCommission = UI.find(mView, R.id.amountBtcWithCommission); final TextView bitcoinUnitText = UI.find(mView, R.id.sendBitcoinUnitText2); UI.setCoinText(mService, bitcoinUnitText, null, null); final String currency = mService.getFiatCurrency(); final FontAwesomeTextView fiatView = UI.find(mView, R.id.commissionFiatIcon); AmountFields.changeFiatIcon(fiatView, currency); if (GaService.IS_ELEMENTS) { bitcoinUnitText.setText(mService.getAssetSymbol() + ' '); UI.hide(UI.find(mView, R.id.commissionFiatColumn)); } mAmountFiatEdit = UI.find(mView, R.id.sendAmountFiatEditText); mAmountBtcEdit = UI.find(mView, R.id.sendAmountEditText); final String btnsValue = service.cfg().getString("exchanger_fiat_btns", ""); if (!btnsValue.isEmpty()) { final String[] btnsValueArray = btnsValue.split(" "); final GridLayout gridLayout = UI.find(mView, R.id.gridLayout); for (final String value : btnsValueArray) { final Button btn = new Button(mContext); btn.setText(String.format("%s %s", value, currency)); final GridLayout.Spec spec = GridLayout.spec(GridLayout.UNDEFINED, 1f); final GridLayout.LayoutParams param = new GridLayout.LayoutParams(spec, spec); btn.setLayoutParams(param); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View view) { mAmountFiatEdit.setText(value); if (GaService.IS_ELEMENTS) mAmountBtcEdit.setText(value); } }); gridLayout.addView(btn); } } } private String formatFiat(final float fiatAmount) { return String.format(Locale.US, "%.2f", fiatAmount); } void sellBtc(final float fiatAmount) { final String newFiatBill = formatFiat(getFiatInBill() + fiatAmount); mService.cfg().edit().putString("exchanger_fiat_in_bill", newFiatBill).apply(); } void buyBtc(final float fiatAmount) { final String newFiatBill = formatFiat(getFiatInBill() - fiatAmount); mService.cfg().edit().putString("exchanger_fiat_in_bill", newFiatBill).apply(); } float getFiatInBill() { float fiatBill = 0; final String fiatBillTxt = mService.cfg().getString("exchanger_fiat_in_bill", ""); if (!fiatBillTxt.isEmpty()) fiatBill = Float.valueOf(fiatBillTxt); return fiatBill; } private String getCommissionConfig(final String suffix, final String def) { final String prefix = mIsBuyPage ? "buy_commission_" : "sell_commission_"; final String value = mService.cfg().getString(prefix + suffix, def); return value.isEmpty() ? def : value; } public String getAmountWithCommission() { return mAmountBtcWithCommission.getText().toString(); } private void calculateAmountWithCommission() { // fixed commission final String commission = getCommissionConfig("fixed_coin", "0"); final Coin fixedCommissionBtc = Coin.valueOf(Long.valueOf(commission)); // percentage commission final String percentage = getCommissionConfig("percentage", ""); final Integer commissionPerc = percentage.isEmpty() ? 0 : Integer.valueOf(percentage); if (GaService.IS_ELEMENTS) { final String amountBtcTxt = mAmountBtcEdit.getText().toString(); final Coin coin = amountBtcTxt.isEmpty() ? Coin.ZERO : UI.parseCoinValue(mService, amountBtcTxt); final long amountBtcWithCommission = coin.getValue() * (100 - commissionPerc) / 100 - fixedCommissionBtc.getValue(); final Coin amountWithCommission = Coin.valueOf(amountBtcWithCommission); final String value = UI.formatCoinValue(mService, amountWithCommission); mAmountBtcWithCommission.setText(value); mAmountFiatWithCommission.setText(value); } else { final float fixedCommissionFiat = convertBtcToFiat(fixedCommissionBtc); // amount fiat final String amountFiatTxt = mAmountFiatEdit.getText().toString(); if (amountFiatTxt.isEmpty()) { mAmountBtcWithCommission.setText("0"); mAmountFiatWithCommission.setText("0"); return; } final float amountFiat = Float.valueOf(amountFiatTxt); final float amountFiatWithCommission = (amountFiat / 100) * (100 - commissionPerc) - fixedCommissionFiat; if (amountFiatWithCommission < 0) { mAmountBtcWithCommission.setText("0"); mAmountFiatWithCommission.setText("0"); return; } mAmountFiatWithCommission.setText(formatFiat(amountFiatWithCommission)); // amount btc final String amountBtcTxt = mAmountBtcEdit.getText().toString(); if (amountBtcTxt.isEmpty()) return; final Coin coin = UI.parseCoinValue(mService, amountBtcTxt); final long amountBtcWithCommission = (coin.getValue() / 100) * (100 - commissionPerc) - fixedCommissionBtc.getValue(); final Coin amountWithCommission = Coin.valueOf(amountBtcWithCommission); mAmountBtcWithCommission.setText(UI.formatCoinValue(mService, amountWithCommission)); } if (mOnCalculateCommissionFinishListener != null) mOnCalculateCommissionFinishListener.calculateCommissionFinish(); } @Override public void conversionFinish() { calculateAmountWithCommission(); } private float convertBtcToFiat(final Coin btcValue) { try { Fiat fiatValue = mService.getFiatRate().coinToFiat(btcValue); // strip extra decimals (over 2 places) because that's what the old JS client does fiatValue = fiatValue.subtract(fiatValue.divideAndRemainder((long) Math.pow(10, Fiat.SMALLEST_UNIT_EXPONENT - 2))[1]); return Float.valueOf(fiatValue.toPlainString()); } catch (final ArithmeticException | IllegalArgumentException e) { return -1; } } }