piuk.blockchain.android.ui.AmountCalculatorFragment.java Source code

Java tutorial

Introduction

Here is the source code for piuk.blockchain.android.ui.AmountCalculatorFragment.java

Source

/*
 * Copyright 2011-2012 the original author or authors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package piuk.blockchain.android.ui;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import piuk.blockchain.android.R;
import piuk.blockchain.android.Constants;
import piuk.blockchain.android.ExchangeRatesProvider;

/**
 * @author Andreas Schildbach
 */
public final class AmountCalculatorFragment extends DialogFragment
        implements LoaderManager.LoaderCallbacks<Cursor> {
    public static interface Listener {
        void use(final BigInteger amount);
    }

    public static final String FRAGMENT_TAG = AmountCalculatorFragment.class.getName();

    private LayoutInflater inflater;
    private String exchangeCurrency;
    private Double exchangeRate;
    private boolean exchangeDirection = true;
    private CurrencyAmountView btcAmountView, localAmountView;
    private Listener listener;

    public AmountCalculatorFragment(final Listener listener) {
        this.listener = listener;
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {
        final FragmentActivity activity = getActivity();
        inflater = LayoutInflater.from(activity);
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
        exchangeCurrency = prefs.getString(Constants.PREFS_KEY_EXCHANGE_CURRENCY,
                Constants.DEFAULT_EXCHANGE_CURRENCY);

        final Builder dialog = new AlertDialog.Builder(activity).setTitle(R.string.amount_calculator_dialog_title);

        final View view = inflater.inflate(R.layout.amount_calculator_dialog, null);

        btcAmountView = (CurrencyAmountView) view.findViewById(R.id.amount_calculator_row_btc);
        btcAmountView.setListener(new CurrencyAmountView.Listener() {
            public void changed() {
                if (btcAmountView.getAmount() != null) {
                    exchangeDirection = true;

                    updateAppearance();
                } else {
                    localAmountView.setHint(null);
                }
            }

            public void done() {
                AmountCalculatorFragment.this.done();
            }
        });

        localAmountView = (CurrencyAmountView) view.findViewById(R.id.amount_calculator_row_local);
        localAmountView.setCurrencyCode(exchangeCurrency);
        localAmountView.setListener(new CurrencyAmountView.Listener() {
            public void changed() {
                if (localAmountView.getAmount() != null) {
                    exchangeDirection = false;

                    updateAppearance();
                } else {
                    btcAmountView.setHint(null);
                }
            }

            public void done() {
                AmountCalculatorFragment.this.done();
            }
        });

        dialog.setView(view);

        dialog.setPositiveButton(R.string.amount_calculator_dialog_button_use,
                new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, final int whichButton) {
                        done();
                    }
                });

        dialog.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
            public void onClick(final DialogInterface dialog, final int whichButton) {
                try {
                    dismiss();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        updateAppearance();

        getLoaderManager().initLoader(0, null, this);

        return dialog.create();
    }

    private void updateAppearance() {
        if (exchangeRate != null) {
            localAmountView.setEnabled(true);

            final BigDecimal bdExchangeRate = new BigDecimal(exchangeRate);

            if (exchangeDirection) {
                final BigInteger btcAmount = btcAmountView.getAmount();
                if (btcAmount != null) {
                    localAmountView.setAmount(null);
                    localAmountView.setHint(new BigDecimal(btcAmount).multiply(bdExchangeRate).toBigInteger());
                    btcAmountView.setHint(null);
                }
            } else {
                final BigInteger localAmount = localAmountView.getAmount();
                if (localAmount != null) {
                    btcAmountView.setAmount(null);
                    btcAmountView.setHint(new BigDecimal(localAmount).divide(bdExchangeRate, RoundingMode.HALF_UP)
                            .toBigInteger());
                    localAmountView.setHint(null);
                }
            }
        } else {
            localAmountView.setEnabled(false);
        }
    }

    private void done() {
        final BigInteger amount = exchangeDirection ? btcAmountView.getAmount()
                : new BigDecimal(localAmountView.getAmount())
                        .divide(new BigDecimal(exchangeRate), RoundingMode.HALF_UP).toBigInteger();

        listener.use(amount);

        dismiss();
    }

    public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
        return new CursorLoader(getActivity(), ExchangeRatesProvider.CONTENT_URI, null,
                ExchangeRatesProvider.KEY_CURRENCY_CODE, new String[] { exchangeCurrency }, null);
    }

    public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
        if (data != null) {
            data.moveToFirst();
            exchangeRate = data.getDouble(data.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_EXCHANGE_RATE_15M));

            updateAppearance();
        }
    }

    public void onLoaderReset(final Loader<Cursor> loader) {
    }
}