/* * Copyright (c) 2012 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ package ru.orangesoftware.financisto2.widget; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.*; import ru.orangesoftware.financisto2.R; import ru.orangesoftware.financisto2.activity.ActivityLayout; import ru.orangesoftware.financisto2.db.DatabaseAdapter; import ru.orangesoftware.financisto2.db.DatabaseAdapter_; import ru.orangesoftware.financisto2.model.Currency; import ru.orangesoftware.financisto2.rates.ExchangeRate; import ru.orangesoftware.financisto2.rates.ExchangeRateProvider; import ru.orangesoftware.financisto2.utils.MyPreferences; import ru.orangesoftware.financisto2.utils.Utils; import java.text.DecimalFormat; import static ru.orangesoftware.financisto2.utils.NetworkUtils.isOnline; /** * Created by IntelliJ IDEA. * User: denis.solonenko * Date: 1/19/12 11:24 PM */ public class RateNode { public static final int EDIT_RATE = 112; private final DecimalFormat nf = new DecimalFormat("0.00000"); private final RateNodeOwner owner; private final ActivityLayout x; private final LinearLayout layout; private final DatabaseAdapter db; public View rateInfoNode; public TextView rateInfo; public EditText rate; public ImageButton bCalc; public ImageButton bDownload; public RateNode(RateNodeOwner owner, ActivityLayout x, LinearLayout layout) { this.owner = owner; this.x = x; this.layout = layout; this.db = DatabaseAdapter_.getInstance_(owner.getActivity()); createUI(); } private void createUI() { rateInfoNode = x.addRateNode(layout); rate = (EditText)rateInfoNode.findViewById(R.id.rate); rate.addTextChangedListener(rateWatcher); rate.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { if (b) { rate.selectAll(); } } }); rateInfo = (TextView)rateInfoNode.findViewById(R.id.data); bCalc = (ImageButton)rateInfoNode.findViewById(R.id.rateCalculator); bCalc.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Activity activity = owner.getActivity(); Intent intent = new Intent(activity, CalculatorInput.class); intent.putExtra(AmountInput.EXTRA_AMOUNT, String.valueOf(getRate())); activity.startActivityForResult(intent, EDIT_RATE); } }); bDownload = (ImageButton)rateInfoNode.findViewById(R.id.rateDownload); bDownload.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { new RateDownloadTask().execute(); } }); } public void disableAll() { rate.setEnabled(false); bCalc.setEnabled(false); bDownload.setEnabled(false); } public void enableAll() { rate.setEnabled(true); bCalc.setEnabled(true); bDownload.setEnabled(true); } public float getRate() { try { String rateText = Utils.text(rate); if (rateText != null) { rateText = rateText.replace(',', '.'); return Float.parseFloat(rateText); } return 0; } catch (NumberFormatException ex) { return 0; } } public void setRate(double r) { rate.removeTextChangedListener(rateWatcher); rate.setText(nf.format(Math.abs(r))); rate.addTextChangedListener(rateWatcher); } public void updateRateInfo() { double r = getRate(); StringBuilder sb = new StringBuilder(); Currency currencyFrom = owner.getCurrencyFrom(); Currency currencyTo = owner.getCurrencyTo(); if (currencyFrom != null && currencyTo != null) { sb.append("1").append(currencyFrom.name).append("=").append(nf.format(r)).append(currencyTo.name).append(", "); sb.append("1").append(currencyTo.name).append("=").append(nf.format(1.0/r)).append(currencyFrom.name); } rateInfo.setText(sb.toString()); } private class RateDownloadTask extends AsyncTask<Void, Void, ExchangeRate> { private ProgressDialog progressDialog; private volatile boolean isOfflineRate = false; @Override protected ExchangeRate doInBackground(Void... args) { Currency fromCurrency = owner.getCurrencyFrom(); Currency toCurrency = owner.getCurrencyTo(); if (fromCurrency != null && toCurrency != null) { if (isOnline(owner.getActivity())) { isOfflineRate = false; return getProvider().getRate(fromCurrency, toCurrency); } else { isOfflineRate = true; return db.getLatestRates().getRate(fromCurrency, toCurrency); } } return null; } @Override protected void onPreExecute() { showProgressDialog(); owner.onBeforeRateDownload(); } private void showProgressDialog() { Context context = owner.getActivity(); String message = context.getString(R.string.downloading_rate, owner.getCurrencyFrom(), owner.getCurrencyTo()); progressDialog = ProgressDialog.show(context, null, message, true, true, new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { cancel(true); } }); } @Override protected void onCancelled() { super.onCancelled(); owner.onAfterRateDownload(); } @Override protected void onPostExecute(ExchangeRate result) { progressDialog.dismiss(); owner.onAfterRateDownload(); if (result != null) { if (result.isOk()) { if (isOfflineRate) { Toast.makeText(owner.getActivity(), R.string.offline_rate, Toast.LENGTH_LONG).show(); } setRate(result.rate); owner.onSuccessfulRateDownload(); } else { Toast.makeText(owner.getActivity(), result.getErrorMessage(), Toast.LENGTH_LONG).show(); } } } private ExchangeRateProvider getProvider() { return MyPreferences.createExchangeRatesProvider(owner.getActivity()); } } private final TextWatcher rateWatcher = new TextWatcher(){ @Override public void afterTextChanged(Editable s) { owner.onRateChanged(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } }; }