From 7b3e4dcc7b55f98cf67982f76613909ef6d8e3c3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Jul 2018 11:33:37 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../data/network/task/ElectrumTask.java | 10 ++++- .../com/tangem/domain/wallet/BtcEngine.java | 19 +++----- .../activity/ConfirmPaymentActivity.java | 27 +++++------- .../activity/PreparePaymentActivity.java | 2 +- .../activity/SignPaymentActivity.java | 2 +- .../presentation/fragment/LoadedWallet.java | 29 ++++++------ .../tangem/presentation/fragment/Main.java | 26 +++++------ .../main/java/com/tangem/util/FormatUtil.java | 44 ++++++++++++++++++- .../res/layout/activity_prepare_payment.xml | 4 +- 9 files changed, 98 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/tangem/data/network/task/ElectrumTask.java b/app/src/main/java/com/tangem/data/network/task/ElectrumTask.java index 558688e739..6ab6426418 100644 --- a/app/src/main/java/com/tangem/data/network/task/ElectrumTask.java +++ b/app/src/main/java/com/tangem/data/network/task/ElectrumTask.java @@ -7,14 +7,19 @@ import com.tangem.data.network.request.ElectrumRequest; import com.tangem.domain.wallet.SharedData; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; /** * Created by dvol on 16.07.2017. @@ -56,8 +61,11 @@ public class ElectrumTask extends AsyncTask 0) { return false; } - return true; } diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java index 3acf58e002..fca13d0111 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java @@ -298,12 +298,12 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap finalFee = Math.round(finalFee) / (float) 10000; - if (request.getBlockCount() == FeeRequest.MINIMAL) { + if ((request.getBlockCount() == FeeRequest.MINIMAL) && (minFee == null)) { minFee = String.valueOf(finalFee); minFeeInInternalUnits = mCard.InternalUnitsFromString(String.valueOf(finalFee)); - } else if (request.getBlockCount() == FeeRequest.NORMAL) { + } else if ((request.getBlockCount() == FeeRequest.NORMAL) && (normalFee == null)) { normalFee = String.valueOf(finalFee); - } else if (request.getBlockCount() == FeeRequest.PRIORITY) { + } else if ((request.getBlockCount() == FeeRequest.PRIORITY) && (maxFee == null)) { maxFee = String.valueOf(finalFee); } @@ -514,20 +514,16 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap String nodeAddress = engineCoin.GetNextNode(mCard); int nodePort = engineCoin.GetNextNodePort(mCard); - //ConnectTask connectTaskEx = new ConnectTask(Blockchain.getNextServiceHost(mCard), Blockchain.getNextServicePort(mCard), data); ConnectTask connectTaskEx = new ConnectTask(nodeAddress, nodePort, data); - - //connectTaskEx.execute(ElectrumRequest.CheckBalance(mCard.getWallet())); connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet())); } - String nodeAddress = engineCoin.GetNode(mCard); - int nodePort = engineCoin.GetNodePort(mCard); - ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data); - - //ConnectTask connectTask = new ConnectTask(Blockchain.getServiceHost(mCard), Blockchain.getServicePort(mCard)); - - connectTask.execute(/*ElectrumRequest.CheckBalance(mCard.getWallet()), */ElectrumRequest.GetFee(mCard.getWallet())); +// String nodeAddress = engineCoin.GetNode(mCard); +// int nodePort = engineCoin.GetNodePort(mCard); +// ConnectTask connectTask = new ConnectTask(nodeAddress, nodePort, data); +// +// +// connectTask.execute(ElectrumRequest.GetFee(mCard.getWallet())); int calcSize = 256; try { @@ -543,7 +539,8 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap ConnectFeeTask feeTask = new ConnectFeeTask(sharedFee); - feeTask.execute(FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL), + feeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, + FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.NORMAL), FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.MINIMAL), FeeRequest.GetFee(mCard.getWallet(), calcSize, FeeRequest.PRIORITY)); } @@ -608,7 +605,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap switch (keyCode) { case KeyEvent.KEYCODE_BACK: Intent intent = new Intent(); - intent.putExtra("message", "Operation canceled"); +// intent.putExtra("message", "Operation canceled"); setResult(Activity.RESULT_CANCELED, intent); finish(); return true; diff --git a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java index 7da826495f..a64c3bdcfe 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java @@ -136,7 +136,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap btnVerify.setOnClickListener(v -> { String strAmount; - strAmount = etAmount.getText().toString(); + strAmount = etAmount.getText().toString().replace(",","."); CoinEngine engine1 = CoinEngineFactory.Create(mCard.getBlockchain()); Log.i(TAG, mCard.getBlockchain().getOfficialName()); diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java index dbe19a41e2..3775aa9091 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java @@ -1 +1 @@ -package com.tangem.presentation.activity; import android.app.Activity; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Color; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.IsoDep; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.tangem.data.nfc.SignPaymentTask; import com.tangem.domain.cardReader.CardProtocol; import com.tangem.domain.cardReader.NfcManager; import com.tangem.domain.wallet.TangemCard; import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog; import com.tangem.presentation.dialog.WaitSecurityDelayDialog; import com.tangem.util.Util; import com.tangem.wallet.R; public class SignPaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public static final int REQUEST_CODE_SEND_PAYMENT = 1; public static final int RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER; private TangemCard mCard; private TextView tvCardID; private NfcManager mNfcManager; private static final String logTag = "SignPayment"; private ProgressBar progressBar; private SignPaymentTask signPaymentTask; private String amountStr; private String feeStr; private String outAddressStr; private boolean lastReadSuccess = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_payment); MainActivity.commonInit(getApplicationContext()); mCard = new TangemCard(getIntent().getStringExtra("UID")); mCard.LoadFromBundle(getIntent().getExtras().getBundle("Card")); amountStr = getIntent().getStringExtra("Amount"); feeStr = getIntent().getStringExtra("Fee"); outAddressStr = getIntent().getStringExtra("Wallet"); tvCardID = findViewById(R.id.tvCardID); tvCardID.setText(mCard.getCIDDescription()); mNfcManager = new NfcManager(this, this); progressBar = findViewById(R.id.progressBar); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } @Override public void onTagDiscovered(Tag tag) { try { // get IsoDep handle and run cardReader thread final IsoDep isoDep = IsoDep.get(tag); if (isoDep == null) { throw new CardProtocol.TangemException(getString(R.string.wrong_tag_err)); } byte UID[] = tag.getId(); String sUID = Util.byteArrayToHexString(UID); Log.v(logTag, "UID: " + sUID); if (sUID.equals(mCard.getUID())) { if (lastReadSuccess) { isoDep.setTimeout(mCard.getPauseBeforePIN2() + 5000); } else { isoDep.setTimeout(mCard.getPauseBeforePIN2() + 65000); } signPaymentTask = new SignPaymentTask(this, mCard, mNfcManager, isoDep, this, amountStr, feeStr, outAddressStr); signPaymentTask.start(); } else { Log.d(logTag, "Mismatch card UID (" + sUID + " instead of " + mCard.getUID() + ")"); mNfcManager.ignoreTag(isoDep.getTag()); return; } } catch (Exception e) { e.printStackTrace(); } } @Override public void onResume() { super.onResume(); mNfcManager.onResume(); } @Override public void onPause() { mNfcManager.onPause(); if (signPaymentTask != null) { signPaymentTask.cancel(true); } super.onPause(); } @Override public void onStop() { // dismiss enable NFC dialog mNfcManager.onStop(); if (signPaymentTask != null) { signPaymentTask.cancel(true); } super.onStop(); } // @Override // public Dialog CreateNFCDialog(int id, AlertDialogWrapper.Builder builder, LayoutInflater li) { // return mNfcManager.onCreateDialog(id, builder, li); // } // private class SignPaymentTask extends Thread { // // String txAmount = ""; // String txFee = ""; // // public void SetTransactionValue(String amount, String fee) { // txAmount = amount; // txFee = fee; // } // // private String txOutAddress; // // IsoDep mIsoDep; // CardProtocol.Notifications mNotifications; // private boolean isCancelled = false; // // public SignPaymentTask(IsoDep isoDep, CardProtocol.Notifications notifications, String amount, String fee, String outAddress) { // mIsoDep = isoDep; // mNotifications = notifications; // txOutAddress = outAddress; // SetTransactionValue(amount, fee); // } // // @Override // public void run() { // if (mIsoDep == null) { // return; // } // CardProtocol protocol = new CardProtocol(getBaseContext(), mIsoDep, mCard, mNotifications); // // mNotifications.OnReadStart(protocol); // try { // // // for Samsung's bugs - // // Workaround for the Samsung Galaxy S5 (since the // // first connection always hangs on transceive). // int timeout = mIsoDep.getTimeout(); // mIsoDep.connect(); // mIsoDep.close(); // mIsoDep.connect(); // mIsoDep.setTimeout(timeout); // try { // mNotifications.OnReadProgress(protocol, 5); // // Log.i("SignPaymentTask", "[-- Start sign payment --]"); // // if (isCancelled) return; // protocol.run_VerifyCard(); // // Log.i("SignPaymentTask", "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); // // mNotifications.OnReadProgress(protocol, 30); // if (isCancelled) return; //// //// if (mCard.getBlockchain() == Blockchain.Ethereum) { //// SignETH_TX(protocol); //// } else { //// SignBTC_TX(protocol); //// } // // CoinEngine engine = CoinEngineFactory.Create(mCard.getBlockchain()); // if (engine != null) { // if (mCard.getPauseBeforePIN2() > 0) { // mNotifications.OnReadWait(mCard.getPauseBeforePIN2()); // } // // byte[] tx; //// try { // tx = engine.Sign(txFee, txAmount, txOutAddress, mCard, protocol); //// } //// finally { //// mNotifications.OnReadWait(0); //// } // // if (tx != null) { // String txStr = BTCUtils.toHex(tx); // if (mCard.getBlockchain() == Blockchain.Ethereum || mCard.getBlockchain() == Blockchain.EthereumTestNet || mCard.getBlockchain() == Blockchain.Token) { // txStr = String.format("0x%s", txStr); // } // // LastSignStorage.setLastTX(mCard.getWallet(), txStr); // // Intent intent = new Intent(getBaseContext(), SendTransactionActivity.class); // intent.putExtra("UID", mCard.getUID()); // intent.putExtra("Card", mCard.getAsBundle()); // intent.putExtra("TX", txStr); // startActivityForResult(intent, REQUEST_CODE_SEND_PAYMENT); // } // } // mNotifications.OnReadProgress(protocol, 100); // // // if (isCancelled) return; // // } finally { // mNfcManager.ignoreTag(mIsoDep.getTag()); // } // } catch (CardProtocol.TangemException_InvalidPIN e) { // e.printStackTrace(); // protocol.setError(e); // } catch (Exception e) { // e.printStackTrace(); // protocol.setError(e); // // } finally { // Log.i("SignPaymentTask", "[-- Finish sign payment --]"); // mNotifications.OnReadFinish(protocol); // } // } // // public void cancel(Boolean AllowInterrupt) { // try { // if (this.isAlive()) { // isCancelled = true; // join(500); // } // if (this.isAlive() && AllowInterrupt) { // interrupt(); // mNotifications.OnReadCancel(); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // // } public void OnReadStart(CardProtocol cardProtocol) { progressBar.post(() -> { progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(5); }); } public void OnReadFinish(final CardProtocol cardProtocol) { signPaymentTask = null; if (cardProtocol != null) { if (cardProtocol.getError() == null) { progressBar.post(() -> { progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.GREEN)); }); } else { lastReadSuccess = false; if (cardProtocol.getError().getClass().equals(CardProtocol.TangemException_InvalidPIN.class)) { progressBar.post(() -> { progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); }); progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); Intent intent = new Intent(); intent.putExtra("message", "Cannot sign transaction. Make sure you enter correct PIN2!"); intent.putExtra("UID", cardProtocol.getCard().getUID()); intent.putExtra("Card", cardProtocol.getCard().getAsBundle()); setResult(RESULT_INVALID_PIN, intent); finish(); } catch (Exception e) { e.printStackTrace(); } }, 500); return; } else { progressBar.post(() -> { if (cardProtocol.getError() instanceof CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allreadyShowed) { new NoExtendedLengthSupportDialog().show(getFragmentManager(), NoExtendedLengthSupportDialog.TAG); } } else { Toast.makeText(getBaseContext(), R.string.try_to_scan_again, Toast.LENGTH_LONG).show(); } progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); }); } } } progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } catch (Exception e) { e.printStackTrace(); } }, 500); } public void OnReadProgress(CardProtocol protocol, final int progress) { progressBar.post(() -> progressBar.setProgress(progress)); } public void OnReadCancel() { signPaymentTask = null; progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } catch (Exception e) { e.printStackTrace(); } }, 500); } @Override public void OnReadWait(final int msec) { WaitSecurityDelayDialog.OnReadWait(this, msec); } @Override public void OnReadBeforeRequest(int timeout) { WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout); } @Override public void OnReadAfterRequest() { WaitSecurityDelayDialog.onReadAfterRequest(this); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: Intent intent = new Intent(); intent.putExtra("message", "Operation canceled by user"); setResult(Activity.RESULT_CANCELED, intent); finish(); return true; } return super.onKeyDown(keyCode, event); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_SEND_PAYMENT) { setResult(resultCode, data); finish(); return; } super.onActivityResult(requestCode, resultCode, data); } } \ No newline at end of file +package com.tangem.presentation.activity; import android.app.Activity; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Color; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.IsoDep; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.tangem.data.nfc.SignPaymentTask; import com.tangem.domain.cardReader.CardProtocol; import com.tangem.domain.cardReader.NfcManager; import com.tangem.domain.wallet.TangemCard; import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog; import com.tangem.presentation.dialog.WaitSecurityDelayDialog; import com.tangem.util.Util; import com.tangem.wallet.R; public class SignPaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications { public static final int REQUEST_CODE_SEND_PAYMENT = 1; public static final int RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER; private TangemCard mCard; private TextView tvCardID; private NfcManager mNfcManager; private static final String logTag = "SignPayment"; private ProgressBar progressBar; private SignPaymentTask signPaymentTask; private String amountStr; private String feeStr; private String outAddressStr; private boolean lastReadSuccess = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_payment); MainActivity.commonInit(getApplicationContext()); mCard = new TangemCard(getIntent().getStringExtra("UID")); mCard.LoadFromBundle(getIntent().getExtras().getBundle("Card")); amountStr = getIntent().getStringExtra("Amount"); feeStr = getIntent().getStringExtra("Fee"); outAddressStr = getIntent().getStringExtra("Wallet"); tvCardID = findViewById(R.id.tvCardID); tvCardID.setText(mCard.getCIDDescription()); mNfcManager = new NfcManager(this, this); progressBar = findViewById(R.id.progressBar); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } @Override public void onTagDiscovered(Tag tag) { try { // get IsoDep handle and run cardReader thread final IsoDep isoDep = IsoDep.get(tag); if (isoDep == null) { throw new CardProtocol.TangemException(getString(R.string.wrong_tag_err)); } byte UID[] = tag.getId(); String sUID = Util.byteArrayToHexString(UID); Log.v(logTag, "UID: " + sUID); if (sUID.equals(mCard.getUID())) { if (lastReadSuccess) { isoDep.setTimeout(mCard.getPauseBeforePIN2() + 5000); } else { isoDep.setTimeout(mCard.getPauseBeforePIN2() + 65000); } signPaymentTask = new SignPaymentTask(this, mCard, mNfcManager, isoDep, this, amountStr, feeStr, outAddressStr); signPaymentTask.start(); } else { Log.d(logTag, "Mismatch card UID (" + sUID + " instead of " + mCard.getUID() + ")"); mNfcManager.ignoreTag(isoDep.getTag()); return; } } catch (Exception e) { e.printStackTrace(); } } @Override public void onResume() { super.onResume(); mNfcManager.onResume(); } @Override public void onPause() { mNfcManager.onPause(); if (signPaymentTask != null) { signPaymentTask.cancel(true); } super.onPause(); } @Override public void onStop() { // dismiss enable NFC dialog mNfcManager.onStop(); if (signPaymentTask != null) { signPaymentTask.cancel(true); } super.onStop(); } // @Override // public Dialog CreateNFCDialog(int id, AlertDialogWrapper.Builder builder, LayoutInflater li) { // return mNfcManager.onCreateDialog(id, builder, li); // } // private class SignPaymentTask extends Thread { // // String txAmount = ""; // String txFee = ""; // // public void SetTransactionValue(String amount, String fee) { // txAmount = amount; // txFee = fee; // } // // private String txOutAddress; // // IsoDep mIsoDep; // CardProtocol.Notifications mNotifications; // private boolean isCancelled = false; // // public SignPaymentTask(IsoDep isoDep, CardProtocol.Notifications notifications, String amount, String fee, String outAddress) { // mIsoDep = isoDep; // mNotifications = notifications; // txOutAddress = outAddress; // SetTransactionValue(amount, fee); // } // // @Override // public void run() { // if (mIsoDep == null) { // return; // } // CardProtocol protocol = new CardProtocol(getBaseContext(), mIsoDep, mCard, mNotifications); // // mNotifications.OnReadStart(protocol); // try { // // // for Samsung's bugs - // // Workaround for the Samsung Galaxy S5 (since the // // first connection always hangs on transceive). // int timeout = mIsoDep.getTimeout(); // mIsoDep.connect(); // mIsoDep.close(); // mIsoDep.connect(); // mIsoDep.setTimeout(timeout); // try { // mNotifications.OnReadProgress(protocol, 5); // // Log.i("SignPaymentTask", "[-- Start sign payment --]"); // // if (isCancelled) return; // protocol.run_VerifyCard(); // // Log.i("SignPaymentTask", "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); // // mNotifications.OnReadProgress(protocol, 30); // if (isCancelled) return; //// //// if (mCard.getBlockchain() == Blockchain.Ethereum) { //// SignETH_TX(protocol); //// } else { //// SignBTC_TX(protocol); //// } // // CoinEngine engine = CoinEngineFactory.Create(mCard.getBlockchain()); // if (engine != null) { // if (mCard.getPauseBeforePIN2() > 0) { // mNotifications.OnReadWait(mCard.getPauseBeforePIN2()); // } // // byte[] tx; //// try { // tx = engine.Sign(txFee, txAmount, txOutAddress, mCard, protocol); //// } //// finally { //// mNotifications.OnReadWait(0); //// } // // if (tx != null) { // String txStr = BTCUtils.toHex(tx); // if (mCard.getBlockchain() == Blockchain.Ethereum || mCard.getBlockchain() == Blockchain.EthereumTestNet || mCard.getBlockchain() == Blockchain.Token) { // txStr = String.format("0x%s", txStr); // } // // LastSignStorage.setLastTX(mCard.getWallet(), txStr); // // Intent intent = new Intent(getBaseContext(), SendTransactionActivity.class); // intent.putExtra("UID", mCard.getUID()); // intent.putExtra("Card", mCard.getAsBundle()); // intent.putExtra("TX", txStr); // startActivityForResult(intent, REQUEST_CODE_SEND_PAYMENT); // } // } // mNotifications.OnReadProgress(protocol, 100); // // // if (isCancelled) return; // // } finally { // mNfcManager.ignoreTag(mIsoDep.getTag()); // } // } catch (CardProtocol.TangemException_InvalidPIN e) { // e.printStackTrace(); // protocol.setError(e); // } catch (Exception e) { // e.printStackTrace(); // protocol.setError(e); // // } finally { // Log.i("SignPaymentTask", "[-- Finish sign payment --]"); // mNotifications.OnReadFinish(protocol); // } // } // // public void cancel(Boolean AllowInterrupt) { // try { // if (this.isAlive()) { // isCancelled = true; // join(500); // } // if (this.isAlive() && AllowInterrupt) { // interrupt(); // mNotifications.OnReadCancel(); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // // } public void OnReadStart(CardProtocol cardProtocol) { progressBar.post(() -> { progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(5); }); } public void OnReadFinish(final CardProtocol cardProtocol) { signPaymentTask = null; if (cardProtocol != null) { if (cardProtocol.getError() == null) { progressBar.post(() -> { progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.GREEN)); }); } else { lastReadSuccess = false; if (cardProtocol.getError().getClass().equals(CardProtocol.TangemException_InvalidPIN.class)) { progressBar.post(() -> { progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); }); progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); Intent intent = new Intent(); intent.putExtra("message", "Cannot sign transaction. Make sure you enter correct PIN2!"); intent.putExtra("UID", cardProtocol.getCard().getUID()); intent.putExtra("Card", cardProtocol.getCard().getAsBundle()); setResult(RESULT_INVALID_PIN, intent); finish(); } catch (Exception e) { e.printStackTrace(); } }, 500); return; } else { progressBar.post(() -> { if (cardProtocol.getError() instanceof CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allreadyShowed) { new NoExtendedLengthSupportDialog().show(getFragmentManager(), NoExtendedLengthSupportDialog.TAG); } } else { Toast.makeText(getBaseContext(), R.string.try_to_scan_again, Toast.LENGTH_LONG).show(); } progressBar.setProgress(100); progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED)); }); } } } progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } catch (Exception e) { e.printStackTrace(); } }, 500); } public void OnReadProgress(CardProtocol protocol, final int progress) { progressBar.post(() -> progressBar.setProgress(progress)); } public void OnReadCancel() { signPaymentTask = null; progressBar.postDelayed(() -> { try { progressBar.setProgress(0); progressBar.setProgressTintList(ColorStateList.valueOf(Color.DKGRAY)); progressBar.setVisibility(View.INVISIBLE); } catch (Exception e) { e.printStackTrace(); } }, 500); } @Override public void OnReadWait(final int msec) { WaitSecurityDelayDialog.OnReadWait(this, msec); } @Override public void OnReadBeforeRequest(int timeout) { WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout); } @Override public void OnReadAfterRequest() { WaitSecurityDelayDialog.onReadAfterRequest(this); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: Intent intent = new Intent(); // intent.putExtra("message", "Operation canceled"); setResult(Activity.RESULT_CANCELED, intent); finish(); return true; } return super.onKeyDown(keyCode, event); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_SEND_PAYMENT) { setResult(resultCode, data); finish(); return; } super.onActivityResult(requestCode, resultCode, data); } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.java b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.java index c08dd7f1a1..797800c9bf 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.java +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.java @@ -416,7 +416,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre updateTasks.add(updateWalletInfoTask); - updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), + updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.GetTransaction(mWalletAddress, hash)); } } @@ -456,7 +456,7 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort); updateTasks.add(updateWalletInfoTask); - updateWalletInfoTask.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), + updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.GetTransaction(mWalletAddress, hash)); } @@ -903,15 +903,11 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre int nodePort = engine.GetNextNodePort(mCard); UpdateWalletInfoTask connectTaskEx = new UpdateWalletInfoTask(nodeAddress, nodePort, data); connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(mCard.getWallet())); - } - String nodeAddress = Objects.requireNonNull(engine).GetNode(mCard); - int nodePort = engine.GetNodePort(mCard); - UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data); - updateTasks.add(updateWalletInfoTask); - updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet()) - ,ElectrumRequest.ListHistory(mCard.getWallet()) - ); + UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data); + updateTasks.add(updateWalletInfoTask); + updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet())); + } RateInfoTask taskRate = new RateInfoTask(); ExchangeRequest rate = ExchangeRequest.GetRate(mCard.getWallet(), "bitcoin", "bitcoin"); @@ -932,8 +928,8 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre UpdateWalletInfoTask updateWalletInfoTask = new UpdateWalletInfoTask(nodeAddress, nodePort, data); updateTasks.add(updateWalletInfoTask); - updateWalletInfoTask.execute(ElectrumRequest.ListUnspent(mCard.getWallet()) - ,ElectrumRequest.ListHistory(mCard.getWallet()) + updateWalletInfoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(mCard.getWallet()) +// ElectrumRequest.ListHistory(mCard.getWallet()) ); RateInfoTask taskRate = new RateInfoTask(); @@ -1023,8 +1019,9 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre } public void ErrorOnUpdate(String message) { - mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain)); - updateViews(); +// mCard.setError(getString(R.string.cannot_obtain_data_from_blockchain)); +// mCard.setError(message); +// updateViews(); } @@ -1450,13 +1447,13 @@ public class LoadedWallet extends Fragment implements SwipeRefreshLayout.OnRefre int nodePort = engine.GetNodePort(mCard); UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort); - connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx)); + connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx)); } else if (mCard.getBlockchain() == Blockchain.BitcoinCash || mCard.getBlockchain() == Blockchain.BitcoinCashTestNet) { String nodeAddress = engine.GetNode(mCard); int nodePort = engine.GetNodePort(mCard); UpdateWalletInfoTask connectTask = new UpdateWalletInfoTask(nodeAddress, nodePort); - connectTask.execute(ElectrumRequest.Broadcast(mCard.getWallet(), tx)); + connectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.Broadcast(mCard.getWallet(), tx)); } } diff --git a/app/src/main/java/com/tangem/presentation/fragment/Main.java b/app/src/main/java/com/tangem/presentation/fragment/Main.java index 5c8baf99e3..13af3bc966 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/Main.java +++ b/app/src/main/java/com/tangem/presentation/fragment/Main.java @@ -201,7 +201,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis if (height != -1) { RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port); requestTasks.add(task); - task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.GetTransaction(mWalletAddress, hash)); } } @@ -225,7 +225,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis RequestWalletInfoTask task = new RequestWalletInfoTask(request.Host, request.Port); requestTasks.add(task); - task.execute(ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.GetHeader(mWalletAddress, String.valueOf(height)), ElectrumRequest.GetTransaction(mWalletAddress, hash)); } } @@ -754,9 +754,9 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort); - requestTasks.add(task); - task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet())); +// task.execute(ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet())); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet())); RateInfoTask taskRate = new RateInfoTask(); ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin"); taskRate.execute(rate); @@ -778,7 +778,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort); requestTasks.add(task); - task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet())); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet())); RateInfoTask taskRate = new RateInfoTask(); ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash"); taskRate.execute(rate); @@ -838,18 +838,12 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis int nodePort = engine.GetNextNodePort(card); RequestWalletInfoTask connectTaskEx = new RequestWalletInfoTask(nodeAddress, nodePort, data); connectTaskEx.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.CheckBalance(card.getWallet())); + + RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort); + requestTasks.add(task); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet())); } - String nodeAddress = engine.GetNode(card); - int nodePort = engine.GetNodePort(card); - RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort); - - requestTasks.add(task); - task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet())); - RateInfoTask taskRate = new RateInfoTask(); - ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin", "bitcoin"); - taskRate.execute(rate); - } else if (card.getBlockchain() == Blockchain.BitcoinCashTestNet || card.getBlockchain() == Blockchain.BitcoinCash) { SharedData data = new SharedData(SharedData.COUNT_REQUEST); for (int i = 0; i < data.allRequest; ++i) { @@ -865,7 +859,7 @@ public class Main extends Fragment implements NfcAdapter.ReaderCallback, CardLis RequestWalletInfoTask task = new RequestWalletInfoTask(nodeAddress, nodePort); requestTasks.add(task); - task.execute(ElectrumRequest.ListUnspent(card.getWallet()), ElectrumRequest.ListHistory(card.getWallet())); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ElectrumRequest.ListUnspent(card.getWallet()));//, ElectrumRequest.ListHistory(card.getWallet())); RateInfoTask taskRate = new RateInfoTask(); ExchangeRequest rate = ExchangeRequest.GetRate(card.getWallet(), "bitcoin-cash", "bitcoin-cash"); taskRate.execute(rate); diff --git a/app/src/main/java/com/tangem/util/FormatUtil.java b/app/src/main/java/com/tangem/util/FormatUtil.java index 1cf6d062ab..25f0abdaf9 100644 --- a/app/src/main/java/com/tangem/util/FormatUtil.java +++ b/app/src/main/java/com/tangem/util/FormatUtil.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; +import java.util.Locale; /** * Created by Ilia on 15.02.2018. @@ -33,8 +34,49 @@ public class FormatUtil { return myFormatter; } + public static BigDecimal stringToBigDecimal(final String formattedString, + final Locale locale) + { + final DecimalFormatSymbols symbols; + final char groupSeparatorChar; + final String groupSeparator; + final char decimalSeparatorChar; + final String decimalSeparator; + String fixedString; + final BigDecimal number; + + symbols = new DecimalFormatSymbols(locale); + groupSeparatorChar = symbols.getGroupingSeparator(); + decimalSeparatorChar = symbols.getDecimalSeparator(); + + if(groupSeparatorChar == '.') + { + groupSeparator = "\\" + groupSeparatorChar; + } + else + { + groupSeparator = Character.toString(groupSeparatorChar); + } + + if(decimalSeparatorChar == '.') + { + decimalSeparator = "\\" + decimalSeparatorChar; + } + else + { + decimalSeparator = Character.toString(decimalSeparatorChar); + } + + fixedString = formattedString.replaceAll(groupSeparator , ""); + fixedString = fixedString.replaceAll(decimalSeparator , "."); + number = new BigDecimal(fixedString); + + return (number); + } + public static long ConvertStringToLong(String caption) throws Exception { - BigDecimal d = new BigDecimal(caption); +// BigDecimal d = new BigDecimal(caption); + BigDecimal d = stringToBigDecimal(caption,Locale.US); d = d.multiply(new BigDecimal(100000)); d = d.setScale(5); BigInteger b = d.toBigInteger(); diff --git a/app/src/main/res/layout/activity_prepare_payment.xml b/app/src/main/res/layout/activity_prepare_payment.xml index d8435f1694..95e958ab1f 100644 --- a/app/src/main/res/layout/activity_prepare_payment.xml +++ b/app/src/main/res/layout/activity_prepare_payment.xml @@ -203,10 +203,10 @@ android:id="@+id/etAmount" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="8dp" android:fontFamily="@font/montserrat_light" android:hint="@string/enter_amount" android:inputType="numberDecimal" + android:digits="0123456789.," android:padding="12dp" android:textColor="@color/colorPrimaryDark" android:textSize="@dimen/text_size_large" @@ -214,7 +214,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintWidth_min="150dp"/> + app:layout_constraintWidth_min="150dp" />