diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java deleted file mode 100644 index 9e2ca87b24..0000000000 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.java +++ /dev/null @@ -1 +0,0 @@ -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 String EXTRA_AMOUNT = "Amount"; 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.Companion.commonInit(getApplicationContext()); mCard = new TangemCard(getIntent().getStringExtra("UID")); mCard.LoadFromBundle(getIntent().getExtras().getBundle("Card")); amountStr = getIntent().getStringExtra(EXTRA_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(); } 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.Companion.getAllReadyShowed()) { new NoExtendedLengthSupportDialog().show(getFragmentManager(), NoExtendedLengthSupportDialog.Companion.getTAG()); } } 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/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt new file mode 100644 index 0000000000..1aae4bbb1d --- /dev/null +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -0,0 +1,232 @@ +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.view.KeyEvent +import android.view.View +import android.widget.ProgressBar +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 +import kotlinx.android.synthetic.main.activity_sign_payment.* + +class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { + + companion object { + val TAG: String = SignPaymentActivity::class.java.simpleName + + const val EXTRA_AMOUNT = "Amount" + const val REQUEST_CODE_SEND_PAYMENT = 1 + const val RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER + } + + private var nfcManager: NfcManager? = null + private var mCard: TangemCard? = null + + private var signPaymentTask: SignPaymentTask? = null + + private var amountStr: String? = null + private var feeStr: String? = null + private var outAddressStr: String? = null + private var lastReadSuccess = true + + private var progressBar: ProgressBar? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_sign_payment) + + MainActivity.commonInit(applicationContext) + + nfcManager = NfcManager(this, this) + + mCard = TangemCard(intent.getStringExtra("UID")) + mCard!!.LoadFromBundle(intent.extras!!.getBundle("Card")) + + amountStr = intent.getStringExtra(EXTRA_AMOUNT) + feeStr = intent.getStringExtra("Fee") + outAddressStr = intent.getStringExtra("Wallet") + + tvCardID.text = mCard!!.cidDescription + + progressBar = findViewById(R.id.progressBar) + progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) + progressBar!!.visibility = View.INVISIBLE + } + + override fun onTagDiscovered(tag: Tag) { + try { + // get IsoDep handle and run cardReader thread + val isoDep = IsoDep.get(tag) + ?: throw CardProtocol.TangemException(getString(R.string.wrong_tag_err)) + val uid = tag.id + val sUID = Util.byteArrayToHexString(uid) +// Log.v(TAG, "UID: $sUID") + + if (sUID == mCard!!.uid) { + if (lastReadSuccess) { + isoDep.timeout = mCard!!.pauseBeforePIN2 + 5000 + } else { + isoDep.timeout = mCard!!.pauseBeforePIN2 + 65000 + } + signPaymentTask = SignPaymentTask(this, mCard, nfcManager, isoDep, this, amountStr, feeStr, outAddressStr) + signPaymentTask!!.start() + } else { +// Log.d(TAG, "Mismatch card UID (" + sUID + " instead of " + mCard!!.uid + ")") + nfcManager!!.ignoreTag(isoDep.tag) + } + + } catch (e: Exception) { + e.printStackTrace() + } + } + + public override fun onResume() { + super.onResume() + nfcManager!!.onResume() + } + + public override fun onPause() { + nfcManager!!.onPause() + if (signPaymentTask != null) + signPaymentTask!!.cancel(true) + super.onPause() + } + + public override fun onStop() { + // dismiss enable NFC dialog + nfcManager!!.onStop() + if (signPaymentTask != null) + signPaymentTask!!.cancel(true) + super.onStop() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { + if (requestCode == REQUEST_CODE_SEND_PAYMENT) { + setResult(resultCode, data) + finish() + return + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + when (keyCode) { + KeyEvent.KEYCODE_BACK -> { + val intent = Intent() + setResult(Activity.RESULT_CANCELED, intent) + finish() + return true + } + } + return super.onKeyDown(keyCode, event) + } + + override fun OnReadStart(cardProtocol: CardProtocol) { + progressBar!!.post { + progressBar!!.visibility = View.VISIBLE + progressBar!!.progress = 5 + } + } + + override fun OnReadFinish(cardProtocol: CardProtocol?) { + signPaymentTask = null + if (cardProtocol != null) { + if (cardProtocol.error == null) { + progressBar!!.post { + progressBar!!.progress = 100 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.GREEN) + } + } else { + lastReadSuccess = false + if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { + progressBar!!.post { + progressBar!!.progress = 100 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.RED) + } + progressBar!!.postDelayed({ + try { + progressBar!!.progress = 0 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) + progressBar!!.visibility = View.INVISIBLE + val intent = Intent() + intent.putExtra("message", "Cannot sign transaction. Make sure you enter correct PIN2!") + intent.putExtra("UID", cardProtocol.card.uid) + intent.putExtra("Card", cardProtocol.card.asBundle) + setResult(RESULT_INVALID_PIN, intent) + finish() + } catch (e: Exception) { + e.printStackTrace() + } + }, 500) + } else { + progressBar!!.post { + if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { + if (!NoExtendedLengthSupportDialog.allReadyShowed) { + NoExtendedLengthSupportDialog().show(fragmentManager, NoExtendedLengthSupportDialog.TAG) + } + } else { + Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() + } + progressBar!!.progress = 100 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.RED) + } + } + } + } + + progressBar!!.postDelayed({ + try { + progressBar!!.progress = 0 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) + progressBar!!.visibility = View.INVISIBLE + } catch (e: Exception) { + e.printStackTrace() + } + }, 500) + } + + override fun OnReadProgress(protocol: CardProtocol, progress: Int) { + progressBar!!.post { progressBar!!.progress = progress } + } + + override fun OnReadCancel() { + signPaymentTask = null + + progressBar!!.postDelayed({ + try { + progressBar!!.progress = 0 + progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) + progressBar!!.visibility = View.INVISIBLE + } catch (e: Exception) { + e.printStackTrace() + } + }, 500) + } + + override fun OnReadWait(msec: Int) { + WaitSecurityDelayDialog.OnReadWait(this, msec) + } + + override fun OnReadBeforeRequest(timeout: Int) { + WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + } + + override fun OnReadAfterRequest() { + WaitSecurityDelayDialog.onReadAfterRequest(this) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.kt index 5bda02e2af..dcd149d929 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SwapPINActivity.kt @@ -91,18 +91,16 @@ class SwapPINActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt public override fun onPause() { nfcManager!!.onPause() - if (swapPinTask != null) { + if (swapPinTask != null) swapPinTask!!.cancel(true) - } super.onPause() } public override fun onStop() { // dismiss enable NFC dialog nfcManager!!.onStop() - if (swapPinTask != null) { + if (swapPinTask != null) swapPinTask!!.cancel(true) - } super.onStop() } diff --git a/app/src/main/res/layout/activity_sign_payment.xml b/app/src/main/res/layout/activity_sign_payment.xml index 0b59c8a1c9..2bd46a5917 100644 --- a/app/src/main/res/layout/activity_sign_payment.xml +++ b/app/src/main/res/layout/activity_sign_payment.xml @@ -1,7 +1,5 @@ - + android:textSize="@dimen/text_size_medium" /> + tools:text="CB02 0000 0002 5000" /> + android:textSize="@dimen/text_size_medium" /> - + \ No newline at end of file