/*
* Copyright 2011-2013 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 de.schildbach.wallet.digitalcoin.ui;
import java.math.BigInteger;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.google.digitalcoin.core.Wallet;
import com.google.digitalcoin.core.Wallet.BalanceType;
import de.schildbach.wallet.digitalcoin.Constants;
import de.schildbach.wallet.digitalcoin.ExchangeRatesProvider;
import de.schildbach.wallet.digitalcoin.ExchangeRatesProvider.ExchangeRate;
import de.schildbach.wallet.digitalcoin.WalletApplication;
import de.schildbach.wallet.digitalcoin.util.ThrottelingWalletChangeListener;
import de.schildbach.wallet.digitalcoin.util.WalletUtils;
import de.schildbach.wallet.digitalcoin.R;
/**
* @author Andreas Schildbach
*/
public final class WalletBalanceFragment extends Fragment
{
private WalletApplication application;
private AbstractWalletActivity activity;
private Wallet wallet;
private SharedPreferences prefs;
private LoaderManager loaderManager;
private CurrencyTextView viewBalance;
private CurrencyTextView viewBalanceLocal;
private boolean showLocalBalance;
private BigInteger balance = null;
private ExchangeRate exchangeRate = null;
private static final int ID_BALANCE_LOADER = 0;
private static final int ID_RATE_LOADER = 1;
@Override
public void onAttach(final Activity activity)
{
super.onAttach(activity);
this.activity = (AbstractWalletActivity) activity;
this.application = (WalletApplication) activity.getApplication();
this.wallet = application.getWallet();
this.prefs = PreferenceManager.getDefaultSharedPreferences(activity);
this.loaderManager = getLoaderManager();
showLocalBalance = getResources().getBoolean(R.bool.show_local_balance);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState)
{
final View view = inflater.inflate(R.layout.wallet_balance_fragment, container, false);
final boolean showExchangeRatesOption = getResources().getBoolean(R.bool.show_exchange_rates_option);
if (showExchangeRatesOption)
{
view.setOnClickListener(new OnClickListener()
{
public void onClick(final View v)
{
startActivity(new Intent(getActivity(), ExchangeRatesActivity.class));
}
});
}
else
{
view.setEnabled(false);
}
return view;
}
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
viewBalance = (CurrencyTextView) view.findViewById(R.id.wallet_balance);
viewBalance.setPrefix(Constants.CURRENCY_CODE_LITECOIN);
viewBalanceLocal = (CurrencyTextView) view.findViewById(R.id.wallet_balance_local);
viewBalanceLocal.setPrecision(Constants.LOCAL_PRECISION);
viewBalanceLocal.setInsignificantRelativeSize(1);
viewBalanceLocal.setStrikeThru(Constants.TEST);
}
@Override
public void onResume()
{
super.onResume();
loaderManager.initLoader(ID_BALANCE_LOADER, null, balanceLoaderCallbacks);
loaderManager.initLoader(ID_RATE_LOADER, null, rateLoaderCallbacks);
updateView();
}
@Override
public void onPause()
{
loaderManager.destroyLoader(ID_RATE_LOADER);
loaderManager.destroyLoader(ID_BALANCE_LOADER);
super.onPause();
}
private void updateView()
{
if (!showLocalBalance)
viewBalanceLocal.setVisibility(View.GONE);
if (balance != null)
{
viewBalance.setVisibility(View.VISIBLE);
viewBalance.setPrecision(Integer.parseInt(prefs.getString(Constants.PREFS_KEY_WDC_PRECISION, Integer.toString(Constants.WDC_PRECISION))));
viewBalance.setAmount(balance);
if (showLocalBalance)
{
if (exchangeRate != null)
{
final BigInteger localValue = WalletUtils.localValue(balance, exchangeRate.rate);
viewBalanceLocal.setVisibility(View.VISIBLE);
viewBalanceLocal.setPrefix(Constants.PREFIX_ALMOST_EQUAL_TO + exchangeRate.currencyCode);
viewBalanceLocal.setAmount(localValue);
viewBalanceLocal.setTextColor(getResources().getColor(R.color.fg_less_significant));
}
else
{
viewBalanceLocal.setVisibility(View.INVISIBLE);
}
}
}
else
{
viewBalance.setVisibility(View.INVISIBLE);
}
}
private static class BalanceLoader extends AsyncTaskLoader<BigInteger>
{
private final Wallet wallet;
private BalanceLoader(final Context context, final Wallet wallet)
{
super(context);
this.wallet = wallet;
}
@Override
protected void onStartLoading()
{
super.onStartLoading();
wallet.addEventListener(walletChangeListener);
forceLoad();
}
@Override
protected void onStopLoading()
{
wallet.removeEventListener(walletChangeListener);
walletChangeListener.removeCallbacks();
super.onStopLoading();
}
@Override
public BigInteger loadInBackground()
{
return wallet.getBalance(BalanceType.ESTIMATED);
}
private final ThrottelingWalletChangeListener walletChangeListener = new ThrottelingWalletChangeListener()
{
@Override
public void onThrotteledWalletChanged()
{
forceLoad();
}
};
}
private final LoaderCallbacks<BigInteger> balanceLoaderCallbacks = new LoaderManager.LoaderCallbacks<BigInteger>()
{
public Loader<BigInteger> onCreateLoader(final int id, final Bundle args)
{
return new BalanceLoader(activity, wallet);
}
public void onLoadFinished(final Loader<BigInteger> loader, final BigInteger balance)
{
WalletBalanceFragment.this.balance = balance;
updateView();
}
public void onLoaderReset(final Loader<BigInteger> loader)
{
}
};
private static class RateLoader extends CursorLoader implements OnSharedPreferenceChangeListener
{
private final SharedPreferences prefs;
public RateLoader(final Context context)
{
super(context, ExchangeRatesProvider.contentUri(context.getPackageName()), null, ExchangeRatesProvider.KEY_CURRENCY_CODE, null, null);
prefs = PreferenceManager.getDefaultSharedPreferences(context);
onCurrencyChange();
}
@Override
protected void onStartLoading()
{
super.onStartLoading();
prefs.registerOnSharedPreferenceChangeListener(this);
forceLoad();
}
@Override
protected void onStopLoading()
{
prefs.unregisterOnSharedPreferenceChangeListener(this);
super.onStopLoading();
}
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key)
{
if (Constants.PREFS_KEY_EXCHANGE_CURRENCY.equals(key))
{
cancelLoad();
onCurrencyChange();
forceLoad();
}
}
private void onCurrencyChange()
{
final String exchangeCurrency = prefs.getString(Constants.PREFS_KEY_EXCHANGE_CURRENCY, Constants.DEFAULT_EXCHANGE_CURRENCY);
setSelectionArgs(new String[] { exchangeCurrency });
}
}
private final LoaderCallbacks<Cursor> rateLoaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>()
{
public Loader<Cursor> onCreateLoader(final int id, final Bundle args)
{
return new RateLoader(activity);
}
public void onLoadFinished(final Loader<Cursor> loader, final Cursor data)
{
if (data != null)
{
data.moveToFirst();
exchangeRate = ExchangeRatesProvider.getExchangeRate(data);
updateView();
}
}
public void onLoaderReset(final Loader<Cursor> loader)
{
}
};
}