Improve Send Workflow (#386)

* remove password query on initial spend screen

* report error if send tx fails

* better failed tx alert
This commit is contained in:
m2049r 2018-08-11 12:23:00 +02:00 committed by GitHub
parent d78a2be120
commit 5aded68c53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 27 deletions

View File

@ -431,17 +431,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
@Override @Override
public void onSendRequest() { public void onSendRequest() {
if (needVerifyIdentity) { replaceFragment(new SendFragment(), null, null);
Helper.promptPassword(WalletActivity.this, getWallet().getName(), true, new Helper.PasswordAction() {
@Override
public void action(String walletName, String password, boolean fingerprintUsed) {
replaceFragment(new SendFragment(), null, null);
needVerifyIdentity = false;
}
});
} else {
replaceFragment(new SendFragment(), null, null);
}
} }
@Override @Override

View File

@ -216,9 +216,9 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements
} }
@Override @Override
public void sendFailed() { public void sendFailed(String error) {
Timber.e("SEND FAILED");
pbProgressSend.setVisibility(View.INVISIBLE); pbProgressSend.setVisibility(View.INVISIBLE);
Toast.makeText(getContext(), getString(R.string.status_transaction_failed, error), Toast.LENGTH_LONG).show();
} }
@Override @Override

View File

@ -19,7 +19,7 @@ package com.m2049r.xmrwallet.fragment.send;
import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.PendingTransaction;
interface SendConfirm { interface SendConfirm {
void sendFailed(); void sendFailed(String errorText);
void createTransactionFailed(String errorText); void createTransactionFailed(String errorText);

View File

@ -145,17 +145,22 @@ public class SendConfirmWizardFragment extends SendWizardFragment implements Sen
} }
@Override @Override
public void sendFailed() { public void sendFailed(String errorText) {
pbProgressSend.setVisibility(View.INVISIBLE); pbProgressSend.setVisibility(View.INVISIBLE);
showAlert(getString(R.string.send_create_tx_error_title), errorText);
} }
@Override @Override
public void createTransactionFailed(String errorText) { public void createTransactionFailed(String errorText) {
hideProgress(); hideProgress();
showAlert(getString(R.string.send_create_tx_error_title), errorText);
}
private void showAlert(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setCancelable(true). builder.setCancelable(true).
setTitle(getString(R.string.send_create_tx_error_title)). setTitle(title).
setMessage(errorText). setMessage(message).
create(). create().
show(); show();
} }

View File

@ -534,12 +534,11 @@ public class SendFragment extends Fragment
public void onSendTransactionFailed(final String error) { public void onSendTransactionFailed(final String error) {
Timber.d("error=%s", error); Timber.d("error=%s", error);
committedTx = null; committedTx = null;
Toast.makeText(getContext(), getString(R.string.status_transaction_failed, error), Toast.LENGTH_SHORT).show(); final SendConfirm confirm = getSendConfirm();
enableNavigation(); if (confirm != null) {
final SendConfirm fragment = getSendConfirm(); confirm.sendFailed(getString(R.string.status_transaction_failed, error));
if (fragment != null) {
fragment.sendFailed();
} }
enableNavigation();
} }
@Override @Override

View File

@ -340,19 +340,21 @@ public class WalletService extends Service {
Wallet myWallet = getWallet(); Wallet myWallet = getWallet();
Timber.d("SEND TX for wallet: %s", myWallet.getName()); Timber.d("SEND TX for wallet: %s", myWallet.getName());
PendingTransaction pendingTransaction = myWallet.getPendingTransaction(); PendingTransaction pendingTransaction = myWallet.getPendingTransaction();
if ((pendingTransaction == null) if (pendingTransaction == null) {
|| (pendingTransaction.getStatus() != PendingTransaction.Status.Status_Ok)) { throw new IllegalArgumentException("PendingTransaction is null"); // die
}
if (pendingTransaction.getStatus() != PendingTransaction.Status.Status_Ok) {
Timber.e("PendingTransaction is %s", pendingTransaction.getStatus()); Timber.e("PendingTransaction is %s", pendingTransaction.getStatus());
final String error = pendingTransaction.getErrorString(); final String error = pendingTransaction.getErrorString();
myWallet.disposePendingTransaction(); // it's broken anyway myWallet.disposePendingTransaction(); // it's broken anyway
if (observer != null) observer.onSendTransactionFailed(error); if (observer != null) observer.onSendTransactionFailed(error);
return; return;
} }
final String txid = pendingTransaction.getFirstTxId(); final String txid = pendingTransaction.getFirstTxId(); // tx ids vanish after commit()!
boolean success = pendingTransaction.commit("", true); boolean success = pendingTransaction.commit("", true);
myWallet.disposePendingTransaction();
if (observer != null) observer.onTransactionSent(txid);
if (success) { if (success) {
myWallet.disposePendingTransaction();
if (observer != null) observer.onTransactionSent(txid);
String notes = extras.getString(REQUEST_CMD_SEND_NOTES); String notes = extras.getString(REQUEST_CMD_SEND_NOTES);
if ((notes != null) && (!notes.isEmpty())) { if ((notes != null) && (!notes.isEmpty())) {
myWallet.setUserNote(txid, notes); myWallet.setUserNote(txid, notes);
@ -364,6 +366,11 @@ public class WalletService extends Service {
} }
if (observer != null) observer.onWalletStored(rc); if (observer != null) observer.onWalletStored(rc);
listener.updated = true; listener.updated = true;
} else {
final String error = pendingTransaction.getErrorString();
myWallet.disposePendingTransaction();
if (observer != null) observer.onSendTransactionFailed(error);
return;
} }
} else if (cmd.equals(REQUEST_CMD_SETNOTE)) { } else if (cmd.equals(REQUEST_CMD_SETNOTE)) {
Wallet myWallet = getWallet(); Wallet myWallet = getWallet();