/*
* 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.activity;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.view.View;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.ViewById;
import java.util.Calendar;
import ru.orangesoftware.financisto2.R;
import ru.orangesoftware.financisto2.datetime.DateUtils;
import ru.orangesoftware.financisto2.model.Currency;
import ru.orangesoftware.financisto2.rates.ExchangeRate;
import ru.orangesoftware.financisto2.widget.AmountInput;
import ru.orangesoftware.financisto2.widget.RateNode;
import ru.orangesoftware.financisto2.widget.RateNodeOwner;
import static ru.orangesoftware.financisto2.utils.Utils.formatRateDate;
/**
* Created by IntelliJ IDEA.
* User: denis.solonenko
* Date: 1/19/12 7:41 PM
*/
@EActivity(R.layout.exchange_rate)
public class ExchangeRateActivity extends AbstractActivity implements RateNodeOwner {
@ViewById(R.id.list)
protected LinearLayout layout;
@Extra
protected long fromCurrencyId;
@Extra
protected long toCurrencyId;
@Extra
protected long date = -1;
private long originalDate = -1;
private double rate = 1;
private Currency fromCurrency;
private Currency toCurrency;
private TextView dateNode;
private RateNode rateNode;
@AfterViews
protected void afterViews() {
if (validateIntent()) {
updateUI();
} else {
finish();
}
}
@Click(R.id.bOK)
protected void onOk() {
ExchangeRate rate = createRateFromUI();
db.replaceRate(rate, originalDate != -1 ? originalDate : rate.date);
Intent data = new Intent();
setResult(RESULT_OK, data);
finish();
}
@Click(R.id.bCancel)
protected void onCancel() {
setResult(RESULT_CANCELED);
finish();
}
private ExchangeRate createRateFromUI() {
ExchangeRate rate = new ExchangeRate();
rate.fromCurrencyId = fromCurrency.id;
rate.toCurrencyId = toCurrency.id;
rate.date = date;
rate.rate = rateNode.getRate();
return rate;
}
private void updateUI() {
x.addInfoNode(layout, 0, R.string.rate_from_currency, fromCurrency.name);
x.addInfoNode(layout, 0, R.string.rate_to_currency, toCurrency.name);
dateNode = x.addInfoNode(layout, R.id.date, R.string.date, formatRateDate(this, date));
rateNode = new RateNode(this, x, layout);
rateNode.setRate(rate);
rateNode.updateRateInfo();
}
private boolean validateIntent() {
fromCurrency = db.get(Currency.class, fromCurrencyId);
if (fromCurrency == null) {
return false;
}
toCurrency = db.get(Currency.class, toCurrencyId);
if (toCurrency == null) {
return false;
}
if (date == -1) {
date = DateUtils.atMidnight(System.currentTimeMillis());
} else {
originalDate = date;
}
ExchangeRate rate = db.findRate(fromCurrency, toCurrency, date);
if (rate != null) {
this.rate = rate.rate;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == RateNode.EDIT_RATE) {
String amount = data.getStringExtra(AmountInput.EXTRA_AMOUNT);
if (amount != null) {
rateNode.setRate(Float.parseFloat(amount));
rateNode.updateRateInfo();
}
}
}
@Override
protected void onClick(View v, int id) {
switch (id) {
case R.id.date:
editDate();
break;
}
}
private void editDate() {
final Calendar c = Calendar.getInstance();
c.setTimeInMillis(date);
DatePickerDialog d = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener(){
@Override
public void onDateSet(DatePicker arg0, int y, int m, int d) {
c.set(y, m, d);
date = c.getTimeInMillis();
dateNode.setText(formatRateDate(ExchangeRateActivity.this, date));
}
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
d.show();
}
@Override
public void onBeforeRateDownload() {
rateNode.disableAll();
}
@Override
public void onAfterRateDownload() {
rateNode.enableAll();
}
@Override
public void onSuccessfulRateDownload() {
rateNode.updateRateInfo();
}
@Override
public void onRateChanged() {
rateNode.updateRateInfo();
}
@Override
public Activity getActivity() {
return this;
}
@Override
public Currency getCurrencyFrom() {
return fromCurrency;
}
@Override
public Currency getCurrencyTo() {
return toCurrency;
}
}