package com.thanksmister.btcblue.ui; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; import com.thanksmister.btcblue.R; import com.thanksmister.btcblue.data.ExchangeService; import com.thanksmister.btcblue.data.WriterService; import com.thanksmister.btcblue.data.api.model.Exchange; import com.thanksmister.btcblue.db.DbManager; import com.thanksmister.btcblue.utils.Calculations; import com.thanksmister.btcblue.utils.Conversions; import com.thanksmister.btcblue.utils.Doubles; import com.thanksmister.btcblue.utils.Strings; import java.io.File; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import rx.Observable; import rx.Subscription; import rx.functions.Action1; import rx.subscriptions.Subscriptions; import timber.log.Timber; import static rx.android.app.AppObservable.bindActivity; public class CalculatorActivity extends BaseActivity implements View.OnFocusChangeListener, TextWatcher { private final static double DEFAULT_BTC_VALUE = 1; private final static int EDIT_ARS = 1; private final static int EDIT_USD = 2; private final static int EDIT_BTC = 3; @Inject DbManager dbManager; @Inject ExchangeService exchangeService; @InjectView(R.id.totalARS) TextView totalARS; @InjectView(R.id.totalUSD) TextView totalUSD; @InjectView(R.id.totalBTC) TextView totalBTC; @InjectView(R.id.editARS) EditText editARS; @InjectView(R.id.editBTC) EditText editBTC; @InjectView(R.id.editUSD) EditText editUSD; @InjectView(R.id.copyARS) ImageButton copyARS; @InjectView(R.id.copyUSD) ImageButton copyUSD; @InjectView(R.id.copyBTC) ImageButton copyBTC; @InjectView(R.id.copyTotalARS) ImageButton copyTotalARS; @InjectView(R.id.copyTotalUSD) ImageButton copyTotalUSD; @InjectView(R.id.copyTotalBTC) ImageButton copyTotalBTC; @OnClick(R.id.clearExchange) public void clearExchangeClicked() { reset(); } @OnClick(R.id.copyARS) public void copyARSClicked() { CharSequence copy = editARS.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("ARS", copy); } } @OnClick(R.id.copyUSD) public void copyUSDClicked() { CharSequence copy = editUSD.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("USD", copy); } } @OnClick(R.id.copyBTC) public void copyBTCClicked() { CharSequence copy = editBTC.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("BTC", copy); } } @OnClick(R.id.copyTotalARS) public void copyTotalArsClicked() { CharSequence copy = totalARS.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("Total ARS", copy); } } @OnClick(R.id.copyTotalUSD) public void copyTotalUsdClicked() { CharSequence copy = totalUSD.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("Total USD", copy); } } @OnClick(R.id.copyTotalBTC) public void copyTotalBtcClicked() { CharSequence copy = totalBTC.getText(); if(!Strings.isBlank(copy)) { setTextOnClipboard("Total BTC", copy); } } @InjectView(android.R.id.progress) View progress; @InjectView(R.id.content) View content; private Observable<Exchange> exchangeObservable; Subscription subscription = Subscriptions.empty(); double rateUSD = 0; double rateARS = 0; double bitcoinValue = DEFAULT_BTC_VALUE; double arsValue = 0; double usdValue = 0; int whoHasFocus = 0; Exchange exchange; AlertDialog dialog; Toolbar toolbar; public static Intent createStartIntent(Context context) { return new Intent(context, CalculatorActivity.class); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calculator); ButterKnife.inject(this); // database data String exchangeName = exchangeService.getSelectedExchangeName(); exchangeObservable = bindActivity(this, dbManager.exchangeQuery(exchangeName)); setupToolbar(); setupEditText(); } @Override public void onResume() { super.onResume(); subscribeData(); } @Override public void onPause() { super.onPause(); subscription.unsubscribe(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_calculator, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == android.R.id.home) { onBackPressed(); return true; } else if(id == R.id.action_print) { onReceipt(); } return super.onOptionsItemSelected(item); } private void onProgress(boolean show) { progress.setVisibility((show)? View.VISIBLE: View.GONE); content.setVisibility((show)? View.GONE: View.VISIBLE); } private void setupEditText() { editBTC.setOnFocusChangeListener(this); editBTC.addTextChangedListener(this); editBTC.setFilters(new InputFilter[]{new Calculations.DecimalPlacesInputFilter(8)}); editUSD.setOnFocusChangeListener(this); editUSD.addTextChangedListener(this); editUSD.setFilters(new InputFilter[]{new Calculations.DecimalPlacesInputFilter(2)}); editARS.setOnFocusChangeListener(this); editARS.addTextChangedListener(this); editARS.setFilters(new InputFilter[]{new Calculations.DecimalPlacesInputFilter(2)}); } private void setupToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // Show menu icon final ActionBar ab = getSupportActionBar(); ab.setTitle(R.string.title_calculator); //ab.setHomeAsUpIndicator(R.drawable.ic_action_navigation_menu); ab.setDisplayHomeAsUpEnabled(true); } public void subscribeData() { // we alreayd set the value don't reset on rotate or resume if(editBTC != null && !Strings.isBlank(editBTC.getText().toString())) { onProgress(false); return; } subscription = exchangeObservable.subscribe(new Action1<Exchange>() { @Override public void call(Exchange exchange) { setExchange(exchange); onProgress(false); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { onProgress(false); reportError(throwable); } }); } private void setExchange(Exchange exchange) { this.exchange = exchange; rateUSD = exchange.getUSDValue(); rateARS = exchange.getARSValue(); reset(); } private void reset() { bitcoinValue = DEFAULT_BTC_VALUE; arsValue = Calculations.calculateARSValue(rateARS, bitcoinValue); usdValue = Calculations.calculateUSDValue(rateUSD, bitcoinValue); editBTC.setText(Conversions.formatBitcoinAmount(bitcoinValue)); editARS.setText(Conversions.formatCurrencyAmount(rateARS)); editUSD.setText(Conversions.formatCurrencyAmount(rateUSD)); calculateTotal(); } private void setTextOnClipboard(String title, CharSequence copy) { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText(title, copy); clipboard.setPrimaryClip(clip); toast(R.string.text_saved_to_clipboard); } private void calculateTotal() { totalBTC.setText(Conversions.formatBitcoinAmount(bitcoinValue)); totalARS.setText(Conversions.formatCurrencyAmount(arsValue)); totalUSD.setText(Conversions.formatCurrencyAmount(usdValue)); } @Override public void onFocusChange(View view, boolean b) { switch (view.getId()) { case R.id.editARS: whoHasFocus = EDIT_ARS; break; case R.id.editUSD: whoHasFocus = EDIT_USD; break; case R.id.editBTC: whoHasFocus = EDIT_BTC; break; } } @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { String stringValue = editable.toString(); switch (whoHasFocus) { case EDIT_ARS: if (editARS.getText().hashCode() == editable.hashCode()) { arsValue = Doubles.convertToDouble(stringValue); bitcoinValue = Calculations.calculateBTC(arsValue, rateARS); usdValue = Calculations.calculateUSDValue(rateUSD, bitcoinValue); if(Strings.isBlank(stringValue)) { editUSD.setText(""); editBTC.setText(""); } else { editUSD.setText(Conversions.formatCurrencyAmount(usdValue)); editBTC.setText(Conversions.formatBitcoinAmount(bitcoinValue)); } } break; case EDIT_USD: if (editUSD.getText().hashCode() == editable.hashCode()) { usdValue = Doubles.convertToDouble(stringValue); bitcoinValue = Calculations.calculateBTC(usdValue, rateUSD); arsValue = Calculations.calculateARSValue(rateARS, bitcoinValue); if(Strings.isBlank(stringValue)) { editARS.setText(""); editBTC.setText(""); } else { editARS.setText(Conversions.formatCurrencyAmount(arsValue)); editBTC.setText(Conversions.formatBitcoinAmount(bitcoinValue)); } } break; case EDIT_BTC: if (editBTC.getText().hashCode() == editable.hashCode()) { bitcoinValue = Doubles.convertToDouble(stringValue); usdValue = Calculations.calculateUSDValue(rateUSD, bitcoinValue); arsValue = Calculations.calculateARSValue(rateARS, bitcoinValue); if(Strings.isBlank(stringValue)) { editARS.setText(""); editUSD.setText(""); } else { editARS.setText(Conversions.formatCurrencyAmount(arsValue)); editUSD.setText(Conversions.formatCurrencyAmount(usdValue)); } } break; } calculateTotal(); } public void createAlert() { LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View dialogView = inflater.inflate(R.layout.dialogview, null); AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setView(dialogView); final EditText input = (EditText) dialogView.findViewById(android.R.id.text1); input.setImeActionLabel("Enter", KeyEvent.KEYCODE_ENTER); input.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { if(keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) { String value = input.getText().toString(); generateReceipt(value); dialog.dismiss(); } return false; } }); final Button button1 = (Button) dialogView.findViewById(android.R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String value = input.getText().toString(); generateReceipt(value); dialog.dismiss(); } }); final Button button2 = (Button) dialogView.findViewById(android.R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); dialog = alertDialog.show(); } private void onReceipt() { createAlert(); } private void shareReceipt(File file) { Timber.d("Share Receipt"); Uri uri = Uri.fromFile(file); Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_SUBJECT, file.getName()); sendIntent.putExtra(Intent.EXTRA_STREAM, uri); sendIntent.setType("text/csv"); sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(sendIntent); } public void generateReceipt(String title) { Timber.d("Generate Receipt"); final WriterService writerService = new WriterService(); Observable<File> observable = writerService.writeReceiptFileObservable(title, exchange, String.valueOf(bitcoinValue), String.valueOf(arsValue), String.valueOf(usdValue)); observable.subscribe(new Action1<File>() { @Override public void call(File file) { shareReceipt(file); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { reportError(throwable); } }); } }