use of org.bitcoin.protocols.payments.Protos.Payment in project bitcoin-wallet by bitcoin-wallet.
the class SendCoinsFragment method sendPayment.
private void sendPayment(final SendRequest sendRequest, final Coin finalAmount) {
final Wallet wallet = walletActivityViewModel.wallet.getValue();
new SendCoinsOfflineTask(wallet, backgroundHandler) {
@Override
protected void onSuccess(final Transaction transaction) {
viewModel.sentTransaction.setValue(transaction);
setState(SendCoinsViewModel.State.SENDING);
final Address refundAddress = viewModel.paymentIntent.standard == Standard.BIP70 ? wallet.freshAddress(KeyPurpose.REFUND) : null;
final Payment payment = PaymentProtocol.createPaymentMessage(Collections.singletonList(transaction), finalAmount, refundAddress, null, viewModel.paymentIntent.payeeData);
if (directPaymentEnableView.isChecked())
directPay(payment);
final ListenableFuture<Transaction> future = walletActivityViewModel.broadcastTransaction(transaction);
future.addListener(() -> {
// Auto-close the dialog after a short delay
if (config.getSendCoinsAutoclose())
handler.postDelayed(() -> activity.finish(), Constants.AUTOCLOSE_DELAY_MS);
}, Threading.THREAD_POOL);
final ComponentName callingActivity = activity.getCallingActivity();
if (callingActivity != null) {
log.info("returning result to calling activity: {}", callingActivity.flattenToString());
final Intent result = new Intent();
BitcoinIntegration.transactionHashToResult(result, transaction.getTxId().toString());
if (viewModel.paymentIntent.standard == Standard.BIP70)
BitcoinIntegration.paymentToResult(result, payment.toByteArray());
activity.setResult(Activity.RESULT_OK, result);
}
}
private void directPay(final Payment payment) {
final DirectPaymentTask.ResultCallback callback = new DirectPaymentTask.ResultCallback() {
@Override
public void onResult(final boolean ack) {
viewModel.directPaymentAck = ack;
if (viewModel.state == SendCoinsViewModel.State.SENDING)
setState(SendCoinsViewModel.State.SENT);
updateView();
}
@Override
public void onFail(final int messageResId, final Object... messageArgs) {
final DialogBuilder dialog = DialogBuilder.warn(activity, R.string.send_coins_fragment_direct_payment_failed_title, viewModel.paymentIntent.paymentUrl + "\n" + getString(messageResId, messageArgs) + "\n\n" + getString(R.string.send_coins_fragment_direct_payment_failed_msg));
dialog.setPositiveButton(R.string.button_retry, (d, which) -> directPay(payment));
dialog.setNegativeButton(R.string.button_dismiss, null);
dialog.show();
}
};
if (viewModel.paymentIntent.isHttpPaymentUrl()) {
new DirectPaymentTask.HttpPaymentTask(backgroundHandler, callback, viewModel.paymentIntent.paymentUrl, application.httpUserAgent()).send(payment);
} else if (viewModel.paymentIntent.isBluetoothPaymentUrl() && bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
new DirectPaymentTask.BluetoothPaymentTask(backgroundHandler, callback, bluetoothAdapter, Bluetooth.getBluetoothMac(viewModel.paymentIntent.paymentUrl)).send(payment);
}
}
@Override
protected void onInsufficientMoney(final Coin missing) {
setState(SendCoinsViewModel.State.INPUT);
final Coin estimated = wallet.getBalance(BalanceType.ESTIMATED);
final Coin available = wallet.getBalance(BalanceType.AVAILABLE);
final Coin pending = estimated.subtract(available);
final MonetaryFormat btcFormat = config.getFormat();
final StringBuilder msg = new StringBuilder();
msg.append(getString(R.string.send_coins_fragment_insufficient_money_msg1, btcFormat.format(missing)));
if (pending.signum() > 0)
msg.append("\n\n").append(getString(R.string.send_coins_fragment_pending, btcFormat.format(pending)));
if (viewModel.paymentIntent.mayEditAmount())
msg.append("\n\n").append(getString(R.string.send_coins_fragment_insufficient_money_msg2));
final DialogBuilder dialog = DialogBuilder.warn(activity, R.string.send_coins_fragment_insufficient_money_title, msg);
if (viewModel.paymentIntent.mayEditAmount()) {
dialog.setPositiveButton(R.string.send_coins_options_empty, (d, which) -> handleEmpty());
dialog.setNegativeButton(R.string.button_cancel, null);
} else {
dialog.setNeutralButton(R.string.button_dismiss, null);
}
dialog.show();
}
@Override
protected void onInvalidEncryptionKey() {
setState(SendCoinsViewModel.State.INPUT);
privateKeyBadPasswordView.setVisibility(View.VISIBLE);
privateKeyPasswordView.requestFocus();
}
@Override
protected void onEmptyWalletFailed() {
setState(SendCoinsViewModel.State.INPUT);
final DialogBuilder dialog = DialogBuilder.warn(activity, R.string.send_coins_fragment_empty_wallet_failed_title, R.string.send_coins_fragment_hint_empty_wallet_failed);
dialog.setNeutralButton(R.string.button_dismiss, null);
dialog.show();
}
@Override
protected void onFailure(Exception exception) {
setState(SendCoinsViewModel.State.FAILED);
final DialogBuilder dialog = DialogBuilder.warn(activity, R.string.send_coins_error_msg, exception.toString());
dialog.setNeutralButton(R.string.button_dismiss, null);
dialog.show();
}
}.sendCoinsOffline(// send asynchronously
sendRequest);
}
Aggregations