2017-10-26 01:33:38 +00:00
|
|
|
package cy.agorise.crystalwallet.activities;
|
|
|
|
|
2018-10-25 07:48:18 +00:00
|
|
|
import android.app.Activity;
|
2017-10-26 01:33:38 +00:00
|
|
|
import android.arch.lifecycle.LiveData;
|
|
|
|
import android.arch.lifecycle.Observer;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.support.annotation.Nullable;
|
2018-10-07 04:54:53 +00:00
|
|
|
import android.support.design.widget.FloatingActionButton;
|
2017-10-26 01:33:38 +00:00
|
|
|
import android.support.v7.app.AppCompatActivity;
|
|
|
|
import android.text.Editable;
|
|
|
|
import android.widget.Button;
|
|
|
|
import android.widget.EditText;
|
|
|
|
import android.widget.Spinner;
|
|
|
|
import android.widget.TextView;
|
2018-10-25 07:48:18 +00:00
|
|
|
import android.widget.Toast;
|
2017-10-26 01:33:38 +00:00
|
|
|
|
2018-09-03 21:59:32 +00:00
|
|
|
import com.jaredrummler.materialspinner.MaterialSpinner;
|
|
|
|
|
2017-10-26 01:33:38 +00:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import butterknife.BindView;
|
|
|
|
import butterknife.ButterKnife;
|
|
|
|
import butterknife.OnClick;
|
2017-10-26 02:55:56 +00:00
|
|
|
import butterknife.OnItemSelected;
|
2017-10-26 01:33:38 +00:00
|
|
|
import butterknife.OnTextChanged;
|
|
|
|
import cy.agorise.crystalwallet.R;
|
2018-03-28 01:44:41 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.ValidateBitsharesSendRequest;
|
2017-10-26 01:33:38 +00:00
|
|
|
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
|
|
|
import cy.agorise.crystalwallet.models.CryptoCoinBalance;
|
|
|
|
import cy.agorise.crystalwallet.models.CryptoCurrency;
|
|
|
|
import cy.agorise.crystalwallet.models.CryptoNetAccount;
|
2017-10-26 02:55:56 +00:00
|
|
|
import cy.agorise.crystalwallet.models.GrapheneAccount;
|
2017-10-26 01:33:38 +00:00
|
|
|
import cy.agorise.crystalwallet.viewmodels.validators.SendTransactionValidator;
|
|
|
|
import cy.agorise.crystalwallet.viewmodels.validators.UIValidatorListener;
|
|
|
|
import cy.agorise.crystalwallet.viewmodels.validators.validationfields.ValidationField;
|
2017-11-01 16:26:52 +00:00
|
|
|
import cy.agorise.crystalwallet.views.CryptoCurrencyAdapter;
|
2017-10-26 01:33:38 +00:00
|
|
|
|
|
|
|
public class SendTransactionActivity extends AppCompatActivity implements UIValidatorListener {
|
|
|
|
|
|
|
|
SendTransactionValidator sendTransactionValidator;
|
|
|
|
|
2018-09-03 21:59:32 +00:00
|
|
|
@BindView(R.id.spFrom)
|
2018-11-08 02:02:15 +00:00
|
|
|
Spinner spFrom;
|
2017-10-26 01:33:38 +00:00
|
|
|
@BindView(R.id.tvFromError)
|
|
|
|
TextView tvFromError;
|
|
|
|
@BindView(R.id.etTo)
|
|
|
|
EditText etTo;
|
|
|
|
@BindView(R.id.tvToError)
|
|
|
|
TextView tvToError;
|
|
|
|
@BindView(R.id.spAsset)
|
|
|
|
Spinner spAsset;
|
|
|
|
@BindView(R.id.tvAssetError)
|
|
|
|
TextView tvAssetError;
|
|
|
|
@BindView(R.id.etAmount)
|
|
|
|
EditText etAmount;
|
|
|
|
@BindView(R.id.tvAmountError)
|
|
|
|
TextView tvAmountError;
|
|
|
|
@BindView (R.id.etMemo)
|
|
|
|
EditText etMemo;
|
|
|
|
@BindView(R.id.tvMemoError)
|
|
|
|
TextView tvMemoError;
|
2017-11-29 01:50:46 +00:00
|
|
|
//@BindView(R.id.btnSend)
|
2017-10-26 01:33:38 +00:00
|
|
|
Button btnSend;
|
2017-11-29 01:50:46 +00:00
|
|
|
//@BindView(R.id.btnCancel)
|
2017-10-26 01:33:38 +00:00
|
|
|
Button btnCancel;
|
|
|
|
|
2018-10-07 04:54:53 +00:00
|
|
|
@BindView(R.id.fabCloseCamera)
|
|
|
|
FloatingActionButton btnCloseCamera;
|
|
|
|
|
2017-10-26 01:33:38 +00:00
|
|
|
private long cryptoNetAccountId;
|
|
|
|
private CryptoNetAccount cryptoNetAccount;
|
2017-10-26 02:55:56 +00:00
|
|
|
private GrapheneAccount grapheneAccount;
|
2017-10-26 01:33:38 +00:00
|
|
|
private CrystalDatabase db;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.send_transaction);
|
|
|
|
|
|
|
|
ButterKnife.bind(this);
|
|
|
|
|
|
|
|
btnSend.setEnabled(false);
|
|
|
|
|
|
|
|
this.cryptoNetAccountId = getIntent().getLongExtra("CRYPTO_NET_ACCOUNT_ID", -1);
|
|
|
|
|
|
|
|
if (this.cryptoNetAccountId != -1) {
|
|
|
|
db = CrystalDatabase.getAppDatabase(this);
|
|
|
|
this.cryptoNetAccount = db.cryptoNetAccountDao().getById(this.cryptoNetAccountId);
|
2017-10-26 02:55:56 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* this is only for graphene accounts.
|
|
|
|
*
|
|
|
|
**/
|
|
|
|
this.grapheneAccount = new GrapheneAccount(this.cryptoNetAccount);
|
|
|
|
this.grapheneAccount.loadInfo(db.grapheneAccountInfoDao().getByAccountId(this.cryptoNetAccountId));
|
|
|
|
|
2017-10-26 01:33:38 +00:00
|
|
|
final LiveData<List<CryptoCoinBalance>> balancesList = db.cryptoCoinBalanceDao().getBalancesFromAccount(cryptoNetAccountId);
|
|
|
|
balancesList.observe(this, new Observer<List<CryptoCoinBalance>>() {
|
|
|
|
@Override
|
|
|
|
public void onChanged(@Nullable List<CryptoCoinBalance> cryptoCoinBalances) {
|
|
|
|
ArrayList<Long> assetIds = new ArrayList<Long>();
|
|
|
|
for (CryptoCoinBalance nextBalance : balancesList.getValue()) {
|
|
|
|
assetIds.add(nextBalance.getCryptoCurrencyId());
|
|
|
|
}
|
|
|
|
List<CryptoCurrency> cryptoCurrencyList = db.cryptoCurrencyDao().getByIds(assetIds);
|
|
|
|
|
2017-11-01 16:26:52 +00:00
|
|
|
CryptoCurrencyAdapter assetAdapter = new CryptoCurrencyAdapter(getApplicationContext(), android.R.layout.simple_spinner_item, cryptoCurrencyList);
|
2017-10-26 01:33:38 +00:00
|
|
|
spAsset.setAdapter(assetAdapter);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-09-03 21:59:32 +00:00
|
|
|
sendTransactionValidator = new SendTransactionValidator(this.getApplicationContext(), this.cryptoNetAccount, spFrom, etTo, spAsset, etAmount, etMemo);
|
2017-10-26 01:33:38 +00:00
|
|
|
sendTransactionValidator.setListener(this);
|
|
|
|
} else {
|
|
|
|
this.finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-06 04:14:48 +00:00
|
|
|
/*@OnTextChanged(value = R.id.etFrom,
|
2017-10-26 01:33:38 +00:00
|
|
|
callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
|
|
|
|
void afterFromChanged(Editable editable) {
|
|
|
|
this.sendTransactionValidator.validate();
|
2017-12-06 04:14:48 +00:00
|
|
|
}*/
|
2017-10-26 01:33:38 +00:00
|
|
|
|
|
|
|
@OnTextChanged(value = R.id.etTo,
|
|
|
|
callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
|
|
|
|
void afterToChanged(Editable editable) {
|
|
|
|
this.sendTransactionValidator.validate();
|
|
|
|
}
|
|
|
|
|
2017-10-26 02:55:56 +00:00
|
|
|
@OnItemSelected(R.id.spAsset)
|
|
|
|
public void afterAssetSelected(Spinner spinner, int position) {
|
|
|
|
this.sendTransactionValidator.validate();
|
|
|
|
}
|
|
|
|
|
2017-10-26 01:33:38 +00:00
|
|
|
@OnTextChanged(value = R.id.etAmount,
|
|
|
|
callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
|
|
|
|
void afterAmountChanged(Editable editable) {
|
|
|
|
this.sendTransactionValidator.validate();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@OnTextChanged(value = R.id.etMemo,
|
|
|
|
callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
|
|
|
|
void afterMemoChanged(Editable editable) {
|
|
|
|
this.sendTransactionValidator.validate();
|
|
|
|
}
|
|
|
|
|
|
|
|
@OnClick(R.id.btnCancel)
|
|
|
|
public void cancel(){
|
|
|
|
this.finish();
|
|
|
|
}
|
|
|
|
|
2018-10-07 04:54:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
@OnClick(R.id.fabCloseCamera)
|
|
|
|
public void onClicCloseCamera(){
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-11-29 01:50:46 +00:00
|
|
|
//@OnClick(R.id.btnSend)
|
2017-10-26 02:55:56 +00:00
|
|
|
public void importSend(){
|
2017-10-26 01:33:38 +00:00
|
|
|
if (this.sendTransactionValidator.isValid()) {
|
2017-10-26 03:06:38 +00:00
|
|
|
//TODO convert the amount to long type using the precision of the currency
|
2018-01-24 01:19:09 +00:00
|
|
|
Long amountFromEditText = Long.parseLong(this.etAmount.getText().toString());
|
|
|
|
Long amount = amountFromEditText*Math.round(Math.pow(10,((CryptoCurrency)spAsset.getSelectedItem()).getPrecision()));
|
|
|
|
|
|
|
|
|
2017-10-26 02:55:56 +00:00
|
|
|
ValidateBitsharesSendRequest sendRequest = new ValidateBitsharesSendRequest(
|
|
|
|
this.getApplicationContext(),
|
|
|
|
this.grapheneAccount,
|
|
|
|
this.etTo.getText().toString(),
|
2018-01-24 01:19:09 +00:00
|
|
|
amount,
|
2017-10-26 02:55:56 +00:00
|
|
|
((CryptoCurrency)spAsset.getSelectedItem()).getName(),
|
|
|
|
etMemo.getText().toString()
|
|
|
|
);
|
2017-10-26 01:33:38 +00:00
|
|
|
|
|
|
|
this.finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onValidationSucceeded(final ValidationField field) {
|
|
|
|
final SendTransactionActivity activity = this;
|
|
|
|
|
|
|
|
activity.runOnUiThread(new Runnable() {
|
|
|
|
public void run() {
|
|
|
|
|
2017-12-06 04:14:48 +00:00
|
|
|
/*if (field.getView() == etFrom) {
|
2017-10-26 01:33:38 +00:00
|
|
|
tvFromError.setText("");
|
2017-12-06 04:14:48 +00:00
|
|
|
} else*/ if (field.getView() == etTo){
|
2017-10-26 01:33:38 +00:00
|
|
|
tvToError.setText("");
|
|
|
|
} else if (field.getView() == etAmount){
|
|
|
|
tvAmountError.setText("");
|
2017-10-26 02:55:56 +00:00
|
|
|
} else if (field.getView() == spAsset){
|
|
|
|
tvAssetError.setText("");
|
2017-10-26 01:33:38 +00:00
|
|
|
} else if (field.getView() == etMemo){
|
|
|
|
tvMemoError.setText("");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (activity.sendTransactionValidator.isValid()){
|
|
|
|
btnSend.setEnabled(true);
|
|
|
|
} else {
|
|
|
|
btnSend.setEnabled(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onValidationFailed(ValidationField field) {
|
2017-12-06 04:14:48 +00:00
|
|
|
/*if (field.getView() == etFrom) {
|
2017-10-26 01:33:38 +00:00
|
|
|
tvFromError.setText(field.getMessage());
|
2017-12-06 04:14:48 +00:00
|
|
|
} else*/ if (field.getView() == etTo){
|
2017-10-26 01:33:38 +00:00
|
|
|
tvToError.setText(field.getMessage());
|
2017-10-26 02:55:56 +00:00
|
|
|
} else if (field.getView() == spAsset){
|
|
|
|
tvAssetError.setText(field.getMessage());
|
2017-10-26 01:33:38 +00:00
|
|
|
} else if (field.getView() == etAmount){
|
|
|
|
tvAmountError.setText(field.getMessage());
|
|
|
|
} else if (field.getView() == etMemo){
|
|
|
|
tvMemoError.setText(field.getMessage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|