From 49c3ff442763482a7a2a8d5f9c65ba676dbbb7c7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 5 Jun 2018 23:20:42 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .idea/caches/build_file_checksums.ser | Bin 536 -> 536 bytes .../data/network/task/VerifyCardTask.java | 2 +- .../tangem/domain/cardReader/NfcManager.java | 30 +++++++-------- .../activity/ConfirmPaymentActivity.java | 2 +- .../activity/CreateNewWalletActivity.java | 4 +- .../activity/EmptyWalletActivity.java | 2 +- .../presentation/activity/MainActivity.java | 36 +++++++++--------- .../activity/PreparePaymentActivity.java | 2 +- .../presentation/activity/PurgeActivity.java | 4 +- .../activity/RequestPINActivity.java | 2 +- .../activity/SignPaymentActivity.java | 2 +- .../activity/SwapPINActivity.java | 4 +- .../adapter/CardUnspentListAdapter.java | 13 ++++--- .../presentation/dialog/NFCEnableDialog.java | 21 ++++------ .../presentation/dialog/RootFoundDialog.java | 2 +- .../fragment/LoadedWalletFragment.java | 35 +++++++++-------- .../presentation/fragment/MainFragment.java | 5 +-- .../fragment/VerifyCardFragment.java | 2 +- 18 files changed, 78 insertions(+), 90 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index b7508e3fe1235c9bde4348593e126d75ca2a3ce6..56e6275b46a249ba00196f16e6a9864b585a38a9 100644 GIT binary patch delta 15 XcmbQiGJ|Ep43>+tWBoSHsbK^FF=Ylu delta 15 XcmbQiGJ|Ep43-NKg8Uoj)Gz`7EQJMk diff --git a/app/src/main/java/com/tangem/data/network/task/VerifyCardTask.java b/app/src/main/java/com/tangem/data/network/task/VerifyCardTask.java index 0f487578e5..3c2658b340 100644 --- a/app/src/main/java/com/tangem/data/network/task/VerifyCardTask.java +++ b/app/src/main/java/com/tangem/data/network/task/VerifyCardTask.java @@ -86,7 +86,7 @@ public class VerifyCardTask extends Thread { mNotifications.OnReadFinish(protocol); } } finally { - mNfcManager.IgnoreTag(mIsoDep.getTag()); + mNfcManager.ignoreTag(mIsoDep.getTag()); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java b/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java index b8632e8d60..89f259842a 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java +++ b/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java @@ -21,8 +21,7 @@ import com.tangem.presentation.dialog.NFCEnableDialog; import java.io.IOException; public class NfcManager { - - private static final String TAG = "NfcManager"; + public static final String TAG = NfcManager.class.getSimpleName(); // reader mode flags: listen for type A (not B), skipping ndef check private static final int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS; @@ -40,7 +39,7 @@ public class NfcManager { // // } -// @Inject + // @Inject public NfcManager(Activity activity, NfcAdapter.ReaderCallback readerCallback) { mActivity = activity; mReaderCallback = readerCallback; @@ -53,18 +52,13 @@ public class NfcManager { mActivity.registerReceiver(mBroadcastReceiver, filter); if (mNfcAdapter == null || !mNfcAdapter.isEnabled()) { - ShowNFCEnableDialog(); + showNFCEnableDialog(); } else { enableReaderMode(); } } - public void ShowNFCEnableDialog() { - mEnableNfcDialog = new NFCEnableDialog(); - mEnableNfcDialog.show(mActivity.getFragmentManager(), "NFCEnableDialog"); - } - public void onPause() { mActivity.unregisterReceiver(mBroadcastReceiver); disableReaderMode(); @@ -76,7 +70,7 @@ public class NfcManager { } } - public void IgnoreTag(Tag tag) throws IOException { + public void ignoreTag(Tag tag) throws IOException { // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // mNfcAdapter.ignore(tag, 500, null, null); // }else{ @@ -87,6 +81,11 @@ public class NfcManager { // } } + private void showNFCEnableDialog() { + mEnableNfcDialog = new NFCEnableDialog(); + mEnableNfcDialog.show(mActivity.getFragmentManager(), NFCEnableDialog.TAG); + } + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @SuppressWarnings("deprecation") @Override @@ -95,12 +94,9 @@ public class NfcManager { if (action == null) return; if (action.equals(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)) { - int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, - NfcAdapter.STATE_ON); - if (state == NfcAdapter.STATE_ON - || state == NfcAdapter.STATE_TURNING_ON) { - Log.d(TAG, "state: " + state + " , dialog: " - + mEnableNfcDialog); + int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_ON); + if (state == NfcAdapter.STATE_ON || state == NfcAdapter.STATE_TURNING_ON) { + Log.d(TAG, "state: " + state + " , dialog: " + mEnableNfcDialog); if (mEnableNfcDialog != null) { mEnableNfcDialog.dismiss(); } @@ -109,7 +105,7 @@ public class NfcManager { } } else { if (mEnableNfcDialog == null || !mEnableNfcDialog.isVisible()) { - ShowNFCEnableDialog(); + showNFCEnableDialog(); } } } 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 2f3cb225e0..4647019697 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.java @@ -364,7 +364,7 @@ public class ConfirmPaymentActivity extends AppCompatActivity implements NfcAdap public void onTagDiscovered(Tag tag) { try { Log.w(getClass().getName(), "Ignore discovered tag!"); - mNfcManager.IgnoreTag(tag); + mNfcManager.ignoreTag(tag); } catch (IOException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.java b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.java index 30ceaeb9b0..54002545a3 100644 --- a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.java @@ -76,7 +76,7 @@ public class CreateNewWalletActivity extends AppCompatActivity implements NfcAda createNewWalletTask.start(); } else { Log.d(logTag, "Mismatch card UID (" + sUID + " instead of " + mCard.getUID() + ")"); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); return; } @@ -169,7 +169,7 @@ public class CreateNewWalletActivity extends AppCompatActivity implements NfcAda protocol.run_Read(); } finally { - mNfcManager.IgnoreTag(mIsoDep.getTag()); + mNfcManager.ignoreTag(mIsoDep.getTag()); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.java b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.java index 1f7e858384..dea4ee02d4 100644 --- a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.java @@ -216,7 +216,7 @@ public class EmptyWalletActivity extends AppCompatActivity implements NfcAdapter String sUID = Util.byteArrayToHexString(UID); if (!mCard.getUID().equals(sUID)) { Log.d(logTag, "Invalid UID: " + sUID); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); return; } else { Log.v(logTag, "UID: " + sUID); diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.java b/app/src/main/java/com/tangem/presentation/activity/MainActivity.java index 2b68bf3e56..fc9110cca0 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.nfc.NfcAdapter; -import android.nfc.Tag; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; @@ -92,7 +91,6 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI lp.topMargin = (int) (dp * (-100 + antenna.Y * 250)); lp2.topMargin = (int) (dp * (-125 + antenna.Y * 250)); nfc.setLayoutParams(lp2); - Animation a = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { @@ -115,13 +113,13 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI hideCleanButton(); // NFC - Intent intent = getIntent(); - if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) { - Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - if (tag != null && onNFCReaderCallback != null) { - onNFCReaderCallback.onTagDiscovered(tag); - } - } +// Intent intent = getIntent(); +// if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) { +// Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); +// if (tag != null && onNFCReaderCallback != null) { +// onNFCReaderCallback.onTagDiscovered(tag); +// } +// } // check if device root RootBeer rootBeer = new RootBeer(this); @@ -129,16 +127,16 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI new RootFoundDialog().show(getFragmentManager(), RootFoundDialog.TAG); } - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) { - Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - if (tag != null && onNFCReaderCallback != null) { - onNFCReaderCallback.onTagDiscovered(tag); - } - } - } +// @Override +// protected void onNewIntent(Intent intent) { +// super.onNewIntent(intent); +// if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) { +// Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); +// if (tag != null && onNFCReaderCallback != null) { +// onNFCReaderCallback.onTagDiscovered(tag); +// } +// } +// } @Override public boolean onKeyDown(int keycode, KeyEvent e) { 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 2f4f09793b..a58939fee3 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.java @@ -201,7 +201,7 @@ public class PreparePaymentActivity extends AppCompatActivity implements NfcAdap public void onTagDiscovered(Tag tag) { try { Log.w(getClass().getName(), "Ignore discovered tag!"); - mNfcManager.IgnoreTag(tag); + mNfcManager.ignoreTag(tag); } catch (IOException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.java b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.java index c9ab49c818..a472fae5b7 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.java @@ -74,7 +74,7 @@ public class PurgeActivity extends AppCompatActivity implements NfcAdapter.Reade purgeTask.start(); } else { Log.d(logTag, "Mismatch card UID (" + sUID + " instead of " + mCard.getUID() + ")"); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); return; } @@ -173,7 +173,7 @@ public class PurgeActivity extends AppCompatActivity implements NfcAdapter.Reade if (isCancelled) return; } finally { - mNfcManager.IgnoreTag(mIsoDep.getTag()); + mNfcManager.ignoreTag(mIsoDep.getTag()); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/presentation/activity/RequestPINActivity.java b/app/src/main/java/com/tangem/presentation/activity/RequestPINActivity.java index e10c13d5ab..f15f972fdf 100644 --- a/app/src/main/java/com/tangem/presentation/activity/RequestPINActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/RequestPINActivity.java @@ -333,7 +333,7 @@ public class RequestPINActivity extends AppCompatActivity implements NfcAdapter. public void onTagDiscovered(Tag tag) { try { Log.w(getClass().getName(), "Ignore discovered tag!"); - mNfcManager.IgnoreTag(tag); + mNfcManager.ignoreTag(tag); } catch (IOException e) { e.printStackTrace(); } 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 2f7a821d85..0fc059862d 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.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 +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/activity/SwapPINActivity.java b/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.java index 1e55df0011..57c4010616 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.java +++ b/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.java @@ -76,7 +76,7 @@ public class SwapPINActivity extends AppCompatActivity implements NfcAdapter.Rea swapPinTask.start(); } else { Log.d(logTag, "Mismatch card UID (" + sUID + " instead of " + mCard.getUID() + ")"); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); } } catch (Exception e) { @@ -166,7 +166,7 @@ public class SwapPINActivity extends AppCompatActivity implements NfcAdapter.Rea mNotifications.OnReadProgress(protocol, 100); } finally { - mNfcManager.IgnoreTag(mIsoDep.getTag()); + mNfcManager.ignoreTag(mIsoDep.getTag()); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/presentation/adapter/CardUnspentListAdapter.java b/app/src/main/java/com/tangem/presentation/adapter/CardUnspentListAdapter.java index 83921279aa..634da5ebca 100644 --- a/app/src/main/java/com/tangem/presentation/adapter/CardUnspentListAdapter.java +++ b/app/src/main/java/com/tangem/presentation/adapter/CardUnspentListAdapter.java @@ -60,7 +60,7 @@ public class CardUnspentListAdapter extends BaseAdapter { TangemCard.UnspentTransaction unspentTransaction = (TangemCard.UnspentTransaction) getItem(position); - String html=String.format("%d mBTC
%s", unspentTransaction.Amount, unspentTransaction.txID); + String html = String.format("%d mBTC
%s", unspentTransaction.Amount, unspentTransaction.txID); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { tvItem.setText(Html.fromHtml(html, FROM_HTML_MODE_COMPACT)); @@ -76,11 +76,12 @@ public class CardUnspentListAdapter extends BaseAdapter { } public void UpdateUnspent(String tx_hash, int value, int height) { - TangemCard.UnspentTransaction newUT=new TangemCard.UnspentTransaction(); - newUT.txID=tx_hash; - newUT.Amount=value; - newUT.Height=height; + TangemCard.UnspentTransaction newUT = new TangemCard.UnspentTransaction(); + newUT.txID = tx_hash; + newUT.Amount = value; + newUT.Height = height; mCard.getUnspentTransactions().add(newUT); notifyDataSetChanged(); } -} + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/dialog/NFCEnableDialog.java b/app/src/main/java/com/tangem/presentation/dialog/NFCEnableDialog.java index caca5b59cb..317a4bfe22 100644 --- a/app/src/main/java/com/tangem/presentation/dialog/NFCEnableDialog.java +++ b/app/src/main/java/com/tangem/presentation/dialog/NFCEnableDialog.java @@ -2,7 +2,6 @@ package com.tangem.presentation.dialog; import android.app.Dialog; import android.app.DialogFragment; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.provider.Settings; @@ -15,6 +14,7 @@ import com.tangem.wallet.R; */ public class NFCEnableDialog extends DialogFragment { + public static final String TAG = NFCEnableDialog.class.getSimpleName(); @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -25,21 +25,16 @@ public class NFCEnableDialog extends DialogFragment { .setTitle(R.string.nfc_disabled) .setMessage(R.string.enable_nfc) .setPositiveButton(R.string.dialog_ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int id) { - // take user to wireless settings - getActivity().startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); - } + (dialog, id) -> { + // take user to wireless settings + getActivity().startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); }) .setNegativeButton(R.string.dialog_quit, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int id) { - dialog.cancel(); - getActivity().finish(); - } + (dialog, id) -> { + dialog.cancel(); + getActivity().finish(); }); return builder.create(); } + } diff --git a/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.java b/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.java index a100c2762f..b21e2ad791 100644 --- a/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.java +++ b/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.java @@ -20,4 +20,4 @@ public class RootFoundDialog extends DialogFragment { .create(); } -} +} \ 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 f07617a54b..e59d35b94f 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWalletFragment.java @@ -24,7 +24,6 @@ import android.text.Spanned; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -40,34 +39,34 @@ import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.tangem.data.network.request.ElectrumRequest; +import com.tangem.data.network.request.ExchangeRequest; +import com.tangem.data.network.request.InfuraRequest; +import com.tangem.data.network.task.ElectrumTask; +import com.tangem.data.network.task.ExchangeTask; +import com.tangem.data.network.task.InfuraTask; +import com.tangem.data.network.task.VerifyCardTask; import com.tangem.domain.cardReader.CardProtocol; import com.tangem.domain.cardReader.NfcManager; +import com.tangem.domain.wallet.BitcoinException; +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.domain.wallet.PINStorage; +import com.tangem.domain.wallet.SharedData; import com.tangem.domain.wallet.TangemCard; -import com.tangem.util.Util; import com.tangem.presentation.activity.CreateNewWalletActivity; import com.tangem.presentation.activity.PreparePaymentActivity; 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.util.BTCUtils; -import com.tangem.domain.wallet.BitcoinException; -import com.tangem.domain.wallet.Blockchain; -import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.CoinEngineFactory; -import com.tangem.data.network.task.ElectrumTask; -import com.tangem.data.network.request.ExchangeRequest; -import com.tangem.data.network.task.ExchangeTask; -import com.tangem.data.network.request.InfuraRequest; -import com.tangem.data.network.task.InfuraTask; -import com.tangem.domain.wallet.LastSignStorage; import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog; -import com.tangem.domain.wallet.PINStorage; +import com.tangem.presentation.dialog.WaitSecurityDelayDialog; +import com.tangem.util.BTCUtils; +import com.tangem.util.Util; import com.tangem.wallet.BuildConfig; import com.tangem.wallet.R; -import com.tangem.domain.wallet.SharedData; -import com.tangem.data.network.task.VerifyCardTask; -import com.tangem.presentation.dialog.WaitSecurityDelayDialog; import org.json.JSONArray; import org.json.JSONException; @@ -1022,7 +1021,7 @@ public class LoadedWalletFragment extends Fragment implements SwipeRefreshLayout String sUID = Util.byteArrayToHexString(UID); if (!mCard.getUID().equals(sUID)) { Log.d(logTag, "Invalid UID: " + sUID); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); return; } else { Log.v(logTag, "UID: " + sUID); diff --git a/app/src/main/java/com/tangem/presentation/fragment/MainFragment.java b/app/src/main/java/com/tangem/presentation/fragment/MainFragment.java index 9b70795024..068ff29e02 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/MainFragment.java +++ b/app/src/main/java/com/tangem/presentation/fragment/MainFragment.java @@ -164,7 +164,6 @@ public class MainFragment extends Fragment implements NfcAdapter.ReaderCallback, if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).setOnCardsClean(this); -// ((MainActivity) getActivity()).setOnCreateNFCDialog(this); ((MainActivity) getActivity()).setNfcAdapterReaderCallback(this); } @@ -195,7 +194,7 @@ public class MainFragment extends Fragment implements NfcAdapter.ReaderCallback, String sUID = Util.byteArrayToHexString(UID); if (slCardUIDs.indexOf(sUID) != -1) { Log.d(logTag, "Repeat UID: " + sUID); - mNfcManager.IgnoreTag(isoDep.getTag()); + mNfcManager.ignoreTag(isoDep.getTag()); return; } else { Log.v(logTag, "UID: " + sUID); @@ -631,7 +630,7 @@ public class MainFragment extends Fragment implements NfcAdapter.ReaderCallback, mNotifications.OnReadFinish(protocol); } } finally { - mNfcManager.IgnoreTag(mIsoDep.getTag()); + mNfcManager.ignoreTag(mIsoDep.getTag()); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCardFragment.java b/app/src/main/java/com/tangem/presentation/fragment/VerifyCardFragment.java index 022b2323f6..a76b6501c6 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCardFragment.java +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCardFragment.java @@ -353,7 +353,7 @@ public class VerifyCardFragment extends Fragment implements SwipeRefreshLayout.O public void onTagDiscovered(Tag tag) { try { Log.w(getClass().getName(), "Ignore discovered tag!"); - mNfcManager.IgnoreTag(tag); + mNfcManager.ignoreTag(tag); } catch (IOException e) { e.printStackTrace(); }