diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 1257b1e56c..a2693a62ff 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/app/build.gradle b/app/build.gradle
index c60a3b80f4..2fdd7d6c42 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,7 +6,7 @@ android {
compileSdkVersion 27
defaultConfig {
applicationId "com.tangem.wallet"
- minSdkVersion 23
+ minSdkVersion 21
targetSdkVersion 27
versionCode 26
versionName "0.85.5.831.dev"
diff --git a/app/src/main/java/com/tangem/domain/wallet/BtcCashEngine.java b/app/src/main/java/com/tangem/domain/wallet/BtcCashEngine.java
index 03f7ef60c4..56676cdbdf 100644
--- a/app/src/main/java/com/tangem/domain/wallet/BtcCashEngine.java
+++ b/app/src/main/java/com/tangem/domain/wallet/BtcCashEngine.java
@@ -4,6 +4,9 @@ import android.net.Uri;
import com.tangem.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.TLV;
+import com.tangem.util.BTCUtils;
+import com.tangem.util.CryptoUtil;
+import com.tangem.util.DerEncodingUtil;
import com.tangem.util.FormatUtil;
import com.tangem.util.Util;
diff --git a/app/src/main/java/com/tangem/domain/wallet/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/BtcEngine.java
index b0d7834948..771bc4b732 100644
--- a/app/src/main/java/com/tangem/domain/wallet/BtcEngine.java
+++ b/app/src/main/java/com/tangem/domain/wallet/BtcEngine.java
@@ -4,6 +4,9 @@ import android.net.Uri;
import com.tangem.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.TLV;
+import com.tangem.util.BTCUtils;
+import com.tangem.util.CryptoUtil;
+import com.tangem.util.DerEncodingUtil;
import com.tangem.util.FormatUtil;
import com.tangem.util.Util;
diff --git a/app/src/main/java/com/tangem/domain/wallet/EthEngine.java b/app/src/main/java/com/tangem/domain/wallet/EthEngine.java
index 75a5867a82..e74a832dc7 100644
--- a/app/src/main/java/com/tangem/domain/wallet/EthEngine.java
+++ b/app/src/main/java/com/tangem/domain/wallet/EthEngine.java
@@ -5,6 +5,8 @@ import android.util.Log;
import com.tangem.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.TLV;
+import com.tangem.util.BTCUtils;
+import com.tangem.util.CryptoUtil;
import org.bitcoinj.core.ECKey;
diff --git a/app/src/main/java/com/tangem/domain/wallet/EthTransaction.java b/app/src/main/java/com/tangem/domain/wallet/EthTransaction.java
index 06f109068b..910e130787 100644
--- a/app/src/main/java/com/tangem/domain/wallet/EthTransaction.java
+++ b/app/src/main/java/com/tangem/domain/wallet/EthTransaction.java
@@ -3,7 +3,9 @@ package com.tangem.domain.wallet;
import android.util.Log;
+import com.tangem.util.BTCUtils;
import com.tangem.util.ByteUtil;
+import com.tangem.util.CryptoUtil;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Sha256Hash;
diff --git a/app/src/main/java/com/tangem/domain/wallet/RLPList.java b/app/src/main/java/com/tangem/domain/wallet/RLPList.java
index 90915c9f27..37162c32fc 100644
--- a/app/src/main/java/com/tangem/domain/wallet/RLPList.java
+++ b/app/src/main/java/com/tangem/domain/wallet/RLPList.java
@@ -1,5 +1,7 @@
package com.tangem.domain.wallet;
+import com.tangem.util.BTCUtils;
+
import java.util.ArrayList;
/**
diff --git a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java b/app/src/main/java/com/tangem/domain/wallet/TangemCard.java
index d6de1cedf1..ce42be9a10 100644
--- a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java
+++ b/app/src/main/java/com/tangem/domain/wallet/TangemCard.java
@@ -4,6 +4,7 @@ import android.os.Bundle;
import com.google.common.base.Strings;
import com.tangem.domain.cardReader.SettingsMask;
+import com.tangem.util.BTCUtils;
import com.tangem.util.FormatUtil;
import com.tangem.util.Util;
diff --git a/app/src/main/java/com/tangem/domain/wallet/TokenEngine.java b/app/src/main/java/com/tangem/domain/wallet/TokenEngine.java
index 05329265e0..841cc1d55d 100644
--- a/app/src/main/java/com/tangem/domain/wallet/TokenEngine.java
+++ b/app/src/main/java/com/tangem/domain/wallet/TokenEngine.java
@@ -6,6 +6,8 @@ import android.util.Log;
import com.google.common.base.Strings;
import com.tangem.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.TLV;
+import com.tangem.util.BTCUtils;
+import com.tangem.util.CryptoUtil;
import org.bitcoinj.core.ECKey;
diff --git a/app/src/main/java/com/tangem/domain/wallet/Transaction.java b/app/src/main/java/com/tangem/domain/wallet/Transaction.java
index 993e54f717..e9cf7aa04e 100644
--- a/app/src/main/java/com/tangem/domain/wallet/Transaction.java
+++ b/app/src/main/java/com/tangem/domain/wallet/Transaction.java
@@ -4,6 +4,9 @@ package com.tangem.domain.wallet;
* Created by Ilia on 29.09.2017.
*/
+import com.tangem.util.BTCUtils;
+import com.tangem.util.CryptoUtil;
+
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
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 e57aefacc6..2588f80f28 100644
--- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java
+++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java
@@ -26,11 +26,11 @@ import com.tangem.data.network.request.ElectrumRequest;
import com.tangem.domain.cardReader.NfcManager;
import com.tangem.domain.wallet.TangemCard;
import com.tangem.util.Util;
-import com.tangem.domain.wallet.BTCUtils;
+import com.tangem.util.BTCUtils;
import com.tangem.domain.wallet.Blockchain;
import com.tangem.domain.wallet.CoinEngine;
import com.tangem.domain.wallet.CoinEngineFactory;
-import com.tangem.domain.wallet.DerEncodingUtil;
+import com.tangem.util.DerEncodingUtil;
import com.tangem.data.network.task.ElectrumTask;
import com.tangem.data.network.request.FeeRequest;
import com.tangem.data.network.task.FeeTask;
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 dc242e47ff..2f7a821d85 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.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.NfcManager;
import com.tangem.domain.wallet.TangemCard;
import com.tangem.util.Util;
import com.tangem.domain.wallet.BTCUtils;
import com.tangem.domain.wallet.Blockchain;
import com.tangem.domain.wallet.CoinEngine;
import com.tangem.domain.wallet.CoinEngineFactory;
import com.tangem.domain.wallet.LastSignStorage;
import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog;
import com.tangem.wallet.R;
import com.tangem.presentation.dialog.WaitSecurityDelayDialog;
public class SignPaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {
private 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(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(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(5);
}
});
}
public void OnReadFinish(final CardProtocol cardProtocol) {
signPaymentTask = null;
if (cardProtocol != null) {
if (cardProtocol.getError() == null) {
progressBar.post(new Runnable() {
@Override
public void run() {
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.GREEN));
}
});
} else {
lastReadSuccess = false;
if (cardProtocol.getError().getClass().equals(CardProtocol.TangemException_InvalidPIN.class)) {
progressBar.post(new Runnable() {
@Override
public void run() {
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
}
});
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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(new Runnable() {
@Override
public void run() {
if (cardProtocol.getError() instanceof CardProtocol.TangemException_ExtendedLengthNotSupported) {
if (!NoExtendedLengthSupportDialog.allreadyShowed) {
new NoExtendedLengthSupportDialog().show(getFragmentManager(), "NoExtendedLengthSupportDialog");
}
} else {
Toast.makeText(getBaseContext(), "Try to scan again", Toast.LENGTH_LONG).show();
}
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
}
});
}
}
}
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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(new Runnable() {
@Override
public void run() {
progressBar.setProgress(progress);
}
});
}
public void OnReadCancel() {
signPaymentTask = null;
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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.domain.cardReader.CardProtocol;
import com.tangem.domain.cardReader.NfcManager;
import com.tangem.domain.wallet.TangemCard;
import com.tangem.util.Util;
import com.tangem.util.BTCUtils;
import com.tangem.domain.wallet.Blockchain;
import com.tangem.domain.wallet.CoinEngine;
import com.tangem.domain.wallet.CoinEngineFactory;
import com.tangem.domain.wallet.LastSignStorage;
import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog;
import com.tangem.wallet.R;
import com.tangem.presentation.dialog.WaitSecurityDelayDialog;
public class SignPaymentActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback, CardProtocol.Notifications {
private 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(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(new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(5);
}
});
}
public void OnReadFinish(final CardProtocol cardProtocol) {
signPaymentTask = null;
if (cardProtocol != null) {
if (cardProtocol.getError() == null) {
progressBar.post(new Runnable() {
@Override
public void run() {
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.GREEN));
}
});
} else {
lastReadSuccess = false;
if (cardProtocol.getError().getClass().equals(CardProtocol.TangemException_InvalidPIN.class)) {
progressBar.post(new Runnable() {
@Override
public void run() {
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
}
});
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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(new Runnable() {
@Override
public void run() {
if (cardProtocol.getError() instanceof CardProtocol.TangemException_ExtendedLengthNotSupported) {
if (!NoExtendedLengthSupportDialog.allreadyShowed) {
new NoExtendedLengthSupportDialog().show(getFragmentManager(), "NoExtendedLengthSupportDialog");
}
} else {
Toast.makeText(getBaseContext(), "Try to scan again", Toast.LENGTH_LONG).show();
}
progressBar.setProgress(100);
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
}
});
}
}
}
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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(new Runnable() {
@Override
public void run() {
progressBar.setProgress(progress);
}
});
}
public void OnReadCancel() {
signPaymentTask = null;
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
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
diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java b/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java
index e54439081f..0cd759c9d3 100644
--- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java
+++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java
@@ -50,7 +50,7 @@ import com.tangem.presentation.activity.PurgeActivity;
import com.tangem.presentation.activity.RequestPINActivity;
import com.tangem.presentation.activity.SwapPINActivity;
import com.tangem.presentation.activity.VerifyCardActivity;
-import com.tangem.domain.wallet.BTCUtils;
+import com.tangem.util.BTCUtils;
import com.tangem.domain.wallet.BitcoinException;
import com.tangem.domain.wallet.Blockchain;
import com.tangem.domain.wallet.CoinEngine;
diff --git a/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java b/app/src/main/java/com/tangem/util/BTCUtils.java
similarity index 98%
rename from app/src/main/java/com/tangem/domain/wallet/BTCUtils.java
rename to app/src/main/java/com/tangem/util/BTCUtils.java
index f12a750959..cacee6d0cd 100644
--- a/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java
+++ b/app/src/main/java/com/tangem/util/BTCUtils.java
@@ -1,4 +1,4 @@
-package com.tangem.domain.wallet;
+package com.tangem.util;
/**
* Created by Ilia on 29.09.2017.
@@ -6,8 +6,12 @@ package com.tangem.domain.wallet;
import android.util.Log;
-import com.tangem.util.FormatUtil;
-import com.tangem.util.Util;
+import com.tangem.domain.wallet.Base58;
+import com.tangem.domain.wallet.BitcoinException;
+import com.tangem.domain.wallet.BitcoinOutputStream;
+import com.tangem.domain.wallet.TangemCard;
+import com.tangem.domain.wallet.Transaction;
+import com.tangem.domain.wallet.UnspentOutputInfo;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
diff --git a/app/src/main/java/com/tangem/domain/wallet/CryptoUtil.java b/app/src/main/java/com/tangem/util/CryptoUtil.java
similarity index 99%
rename from app/src/main/java/com/tangem/domain/wallet/CryptoUtil.java
rename to app/src/main/java/com/tangem/util/CryptoUtil.java
index 599e3796b2..40aa618577 100644
--- a/app/src/main/java/com/tangem/domain/wallet/CryptoUtil.java
+++ b/app/src/main/java/com/tangem/util/CryptoUtil.java
@@ -1,8 +1,8 @@
-package com.tangem.domain.wallet;
+package com.tangem.util;
import android.util.Log;
-import com.tangem.util.Util;
+import com.tangem.domain.wallet.ECDSASignatureETH;
import org.spongycastle.asn1.ASN1EncodableVector;
import org.spongycastle.asn1.ASN1Integer;
diff --git a/app/src/main/java/com/tangem/domain/wallet/DerEncodingUtil.java b/app/src/main/java/com/tangem/util/DerEncodingUtil.java
similarity index 99%
rename from app/src/main/java/com/tangem/domain/wallet/DerEncodingUtil.java
rename to app/src/main/java/com/tangem/util/DerEncodingUtil.java
index 9cdf0d824b..8f03bb06b2 100644
--- a/app/src/main/java/com/tangem/domain/wallet/DerEncodingUtil.java
+++ b/app/src/main/java/com/tangem/util/DerEncodingUtil.java
@@ -1,4 +1,4 @@
-package com.tangem.domain.wallet;
+package com.tangem.util;
import com.tangem.domain.wallet.BitcoinOutputStream;
diff --git a/app/src/main/res/layout/fr_loaded_wallet.xml b/app/src/main/res/layout/fr_loaded_wallet.xml
index 1991e5e2de..2ae5608fad 100644
--- a/app/src/main/res/layout/fr_loaded_wallet.xml
+++ b/app/src/main/res/layout/fr_loaded_wallet.xml
@@ -1,5 +1,6 @@
-
-
+ android:textSize="18dp"/>
+ android:textSize="14dp"/>
+ android:paddingTop="2dp">
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+ app:layout_constraintTop_toTopOf="parent"/>
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
@@ -131,7 +128,7 @@
android:text="verified offline"
android:textAlignment="center"
android:textColor="@color/white"
- android:textSize="@dimen/font_small" />
+ android:textSize="@dimen/font_small"/>
+ android:textStyle="normal|bold"/>
+ android:src="@drawable/coinmarketcap"/>
+ android:textColor="@color/primary_dark"/>
+ android:textStyle="normal|bold"/>
+ android:layout_marginRight="4dp"
+ android:layout_marginTop="6dp"
+ android:background="@android:color/darker_gray"/>
+ android:textStyle="normal|bold"/>
+ app:srcCompat="@color/cardview_light_background"/>
+ android:src="@drawable/chain_lookup"/>
+ android:textStyle="normal|bold"/>
+
+
+ android:layout_marginRight="4dp"
+ android:background="@android:color/darker_gray"/>
+ android:textSize="12dp"/>
+ android:textStyle="normal|bold"/>
+ android:textSize="12dp"/>
+ android:textStyle="normal|bold"/>
+ android:textSize="12dp"/>
+ android:textStyle="normal|bold"/>
+ android:textSize="12dp"/>
+ android:textStyle="normal|bold"/>
+ android:textSize="12dp"/>
@@ -426,7 +425,7 @@
android:text="Message!"
android:textAlignment="center"
android:textColor="@color/black"
- android:textStyle="normal|bold" />
+ android:textStyle="normal|bold"/>
+ android:textStyle="bold"/>
+ android:src="@drawable/unlock_pin1"/>
+ android:src="@drawable/unlock_pin2"/>
+ android:src="@drawable/ic_developer_version"/>
+ android:textStyle="normal|bold"/>
+ android:textSize="12dp"/>
@@ -541,7 +540,7 @@
android:text="SEND"
android:textAlignment="center"
android:textColor="@color/white"
- android:textSize="18dp" />
+ android:textSize="18dp"/>
+ android:textSize="18dp"/>
@@ -573,8 +572,6 @@
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent" />
-
-
-
+ app:layout_constraintRight_toRightOf="parent"/>
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fr_main.xml b/app/src/main/res/layout/fr_main.xml
index f0d3648d62..1279b8ee9c 100644
--- a/app/src/main/res/layout/fr_main.xml
+++ b/app/src/main/res/layout/fr_main.xml
@@ -1,23 +1,24 @@
-
-
-
-
+
+
+
-
+
+ android:visibility="invisible"/>