com.mygeopay.wallet.ui.ExchangeRatesFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.mygeopay.wallet.ui.ExchangeRatesFragment.java

Source

package com.mygeopay.wallet.ui;

/*
 * Copyright 2011-2014 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/>.
 */

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;

import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.ResourceCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.mygeopay.core.coins.BitcoinMain;
import com.mygeopay.core.coins.CoinID;
import com.mygeopay.core.coins.CoinType;
import com.mygeopay.core.coins.Value;
import com.mygeopay.core.util.GenericUtils;
import com.mygeopay.wallet.Configuration;
import com.mygeopay.wallet.Constants;
import com.mygeopay.wallet.ExchangeRatesProvider;
import com.mygeopay.wallet.ExchangeRatesProvider.ExchangeRate;
import com.mygeopay.wallet.R;
import com.mygeopay.wallet.WalletApplication;
import com.mygeopay.wallet.ui.widget.Amount;
import com.mygeopay.wallet.ui.widget.CurrencyTextView;
import com.mygeopay.wallet.util.WalletUtils;

import org.bitcoinj.core.Coin;

import javax.annotation.CheckForNull;

/**
 * @author Andreas Schildbach
 * @author John L. Jegutanis
 */
public final class ExchangeRatesFragment extends ListFragment implements OnSharedPreferenceChangeListener {
    private Activity activity;
    private WalletApplication application;
    private Configuration config;
    private com.mygeopay.core.wallet.Wallet wallet;
    private Uri contentUri;
    private LoaderManager loaderManager;

    private ExchangeRatesAdapter adapter;
    private String query = null;

    private Coin balance = null;
    @CheckForNull
    private String defaultCurrency = null;

    private static final int ID_BALANCE_LOADER = 0;
    private static final int ID_RATE_LOADER = 1;
    private static final int ID_BLOCKCHAIN_STATE_LOADER = 2;
    private CoinType type;

    @Override
    public void onAttach(final Activity activity) {
        super.onAttach(activity);

        this.activity = activity;
        this.application = (WalletApplication) activity.getApplication();
        this.config = application.getConfiguration();
        this.wallet = application.getWallet();

        this.loaderManager = getLoaderManager();
    }

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null && getArguments().containsKey(Constants.ARG_COIN_ID)) {
            type = CoinID.typeFromId(getArguments().getString(Constants.ARG_COIN_ID));
        } else {
            type = BitcoinMain.get();
        }
        contentUri = ExchangeRatesProvider.contentUriToLocal(activity.getPackageName(), type.getSymbol(), false);

        defaultCurrency = config.getExchangeCurrencyCode();
        config.registerOnSharedPreferenceChangeListener(this);

        adapter = new ExchangeRatesAdapter(activity);
        setListAdapter(adapter);

        loaderManager.initLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
            final Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_exchange_rates, container, false);
    }

    @Override
    public void setEmptyText(final CharSequence text) {
        final TextView emptyView = (TextView) getView().findViewById(android.R.id.empty);
        emptyView.setText(text);
    }

    @Override
    public void onViewCreated(final View view, final Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        getListView().setFastScrollEnabled(true);
        setEmptyText(getString(R.string.exchange_rates_loading));
    }

    @Override
    public void onResume() {
        super.onResume();

        //        loaderManager.initLoader(ID_BALANCE_LOADER, null, balanceLoaderCallbacks);
        //        loaderManager.initLoader(ID_BLOCKCHAIN_STATE_LOADER, null, blockchainStateLoaderCallbacks);

        updateView();
    }

    @Override
    public void onPause() {
        //        loaderManager.destroyLoader(ID_BALANCE_LOADER);
        //        loaderManager.destroyLoader(ID_BLOCKCHAIN_STATE_LOADER);

        super.onPause();
    }

    @Override
    public void onDestroy() {
        config.unregisterOnSharedPreferenceChangeListener(this);

        loaderManager.destroyLoader(ID_RATE_LOADER);

        super.onDestroy();
    }

    //
    //    @Override
    //    public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    //        inflater.inflate(R.menu.exchange_rates_fragment_options, menu);
    //
    //        final SearchView searchView = (SearchView) menu.findItem(R.id.exchange_rates_options_search).getActionView();
    //        searchView.setOnQueryTextListener(new OnQueryTextListener() {
    //            @Override
    //            public boolean onQueryTextChange(final String newText) {
    //                query = newText.trim();
    //                if (query.isEmpty())
    //                    query = null;
    //
    //                getLoaderManager().restartLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);
    //
    //                return true;
    //            }
    //
    //            @Override
    //            public boolean onQueryTextSubmit(final String query) {
    //                searchView.clearFocus();
    //
    //                return true;
    //            }
    //        });
    //
    //        super.onCreateOptionsMenu(menu, inflater);
    //    }
    //
    @Override
    public void onListItemClick(final ListView l, final View v, final int position, final long id) {
        final Cursor cursor = (Cursor) adapter.getItem(position);
        final ExchangeRate exchangeRate = ExchangeRatesProvider.getExchangeRate(cursor);

        defaultCurrency = exchangeRate.currencyCodeId;
        config.setExchangeCurrencyCode(defaultCurrency);
        updateView();

        Toast.makeText(getActivity(), getString(R.string.set_local_currency, defaultCurrency), Toast.LENGTH_SHORT)
                .show();

        getActivity().finish();
    }

    @Override
    public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
        if (Configuration.PREFS_KEY_EXCHANGE_CURRENCY.equals(key)) {
            defaultCurrency = config.getExchangeCurrencyCode();

            updateView();
        }
    }

    private void updateView() {
        //        balance = application.getWallet().getBalance(BalanceType.ESTIMATED);

        if (adapter != null && type != null) {
            adapter.setRateBase(type.getOneCoin());
        }
    }

    private final LoaderCallbacks<Cursor> rateLoaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() {
        @Override
        public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
            if (query == null) {
                return new CursorLoader(activity, contentUri, null, null, null, null);
            } else {
                return new CursorLoader(activity, contentUri, null, null, null, null);
                //                return new CursorLoader(activity, contentUri, null, ExchangeRatesProvider.QUERY_PARAM_Q, new String[]{query}, null);
            }
        }

        @Override
        public void onLoadFinished(final Loader<Cursor> loader, final Cursor data) {
            final Cursor oldCursor = adapter.swapCursor(data);

            if (data != null && oldCursor == null && defaultCurrency != null) {
                final int defaultCurrencyPosition = findCurrencyCode(data, defaultCurrency);
                if (defaultCurrencyPosition >= 0)
                    getListView().setSelection(defaultCurrencyPosition); // scroll to selection
            }

            setEmptyText(getString(
                    query != null ? R.string.exchange_rates_empty_search : R.string.exchange_rates_load_error));
        }

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

        private int findCurrencyCode(final Cursor cursor, final String currencyCode) {
            final int currencyCodeColumn = cursor.getColumnIndexOrThrow(ExchangeRatesProvider.KEY_CURRENCY_ID);

            cursor.moveToPosition(-1);
            while (cursor.moveToNext()) {
                if (cursor.getString(currencyCodeColumn).equals(currencyCode))
                    return cursor.getPosition();
            }

            return -1;
        }
    };

    //
    //    private final LoaderCallbacks<Coin> balanceLoaderCallbacks = new LoaderManager.LoaderCallbacks<Coin>() {
    //        @Override
    //        public Loader<Coin> onCreateLoader(final int id, final Bundle args) {
    //            return new WalletBalanceLoader(activity, wallet);
    //        }
    //
    //        @Override
    //        public void onLoadFinished(final Loader<Coin> loader, final Coin balance) {
    //            ExchangeRatesFragment.this.balance = balance;
    //
    //            updateView();
    //        }
    //
    //        @Override
    //        public void onLoaderReset(final Loader<Coin> loader) {
    //        }
    //    };
    //
    //    private final LoaderCallbacks<BlockchainState> blockchainStateLoaderCallbacks = new LoaderManager.LoaderCallbacks<BlockchainState>() {
    //        @Override
    //        public Loader<BlockchainState> onCreateLoader(final int id, final Bundle args) {
    //            return new BlockchainStateLoader(activity);
    //        }
    //
    //        @Override
    //        public void onLoadFinished(final Loader<BlockchainState> loader, final BlockchainState blockchainState) {
    //            ExchangeRatesFragment.this.blockchainState = blockchainState;
    //
    //            updateView();
    //        }
    //
    //        @Override
    //        public void onLoaderReset(final Loader<BlockchainState> loader) {
    //        }
    //    };
    //
    private final class ExchangeRatesAdapter extends ResourceCursorAdapter {
        private Coin rateBase = Coin.COIN;

        private ExchangeRatesAdapter(final Context context) {
            super(context, R.layout.exchange_rate_row, null, true);
        }

        public void setRateBase(final Coin rateBase) {
            this.rateBase = rateBase;

            notifyDataSetChanged();
        }

        @Override
        public void bindView(final View view, final Context context, final Cursor cursor) {
            final ExchangeRate exchangeRate = ExchangeRatesProvider.getExchangeRate(cursor);
            final boolean isDefaultCurrency = exchangeRate.currencyCodeId.equals(defaultCurrency);

            view.setBackgroundResource(isDefaultCurrency ? R.color.bg_list_selected : R.color.bg_list);

            //            final View defaultView = view.findViewById(R.id.exchange_rate_row_default);
            //            defaultView.setVisibility(isDefaultCurrency ? View.VISIBLE : View.INVISIBLE);

            final TextView currencyCodeView = (TextView) view.findViewById(R.id.exchange_rate_row_currency_code);
            currencyCodeView.setText(exchangeRate.currencyCodeId);

            final TextView currencyNameView = (TextView) view.findViewById(R.id.exchange_rate_row_currency_name);
            String currencyName = WalletUtils.getCurrencyName(exchangeRate.currencyCodeId);
            if (currencyName != null) {
                currencyNameView.setText(currencyName);
                currencyNameView.setVisibility(View.VISIBLE);
            } else {
                currencyNameView.setText(null);
                currencyNameView.setVisibility(View.INVISIBLE);
            }

            //            final CurrencyTextView rateView = (CurrencyTextView) view.findViewById(R.id.exchange_rate_row_rate);
            //            rateView.setFormat(Constants.LOCAL_CURRENCY_FORMAT);
            //            rateView.setAmount(exchangeRate.rate.coinToFiat(rateBase));

            final Amount rateAmountUnitView = (Amount) view.findViewById(R.id.exchange_rate_row_rate_unit);
            rateAmountUnitView.setAmount(GenericUtils.formatCoinValue(type, rateBase, true));
            rateAmountUnitView.setSymbol(type.getSymbol());

            final Amount rateAmountView = (Amount) view.findViewById(R.id.exchange_rate_row_rate);
            Value fiatAmount = exchangeRate.rate.convert(type, rateBase);
            rateAmountView.setAmount(GenericUtils.formatFiatValue(fiatAmount));
            rateAmountView.setSymbol(fiatAmount.type.getSymbol());

            //            final CurrencyTextView walletView = (CurrencyTextView) view.findViewById(R.id.exchange_rate_row_balance);
            //            walletView.setFormat(Constants.LOCAL_FORMAT);
            //            if (blockchainState == null || !blockchainState.replaying) {
            //                walletView.setAmount(exchangeRate.rate.coinToFiat(balance));
            //                walletView.setStrikeThru(Constants.TEST);
            //            } else {
            //                walletView.setText("n/a");
            //                walletView.setStrikeThru(false);
            //            }
            //            walletView.setTextColor(getResources().getColor(R.color.fg_less_significant));
        }
    }
}