From 401c233a364af99c543ecfb91432adfe13bcea4f Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 6 Mar 2020 16:56:19 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle | 6 - .../tangemCardano/java/com/tangem/Test1.java | 4 - .../tangem/ui/ConfirmTransactionFragment.kt | 310 --------------- .../tangem/ui/PrepareTransactionFragment.kt | 207 ---------- .../com/tangem/ui/SignTransactionActivity.kt | 0 .../com/tangem/ui/SignTransactionFragment.kt | 362 ------------------ .../layout/fragment_confirm_transaction.xml | 344 ----------------- .../layout/fragment_prepare_transaction.xml | 267 ------------- .../res/layout/fragment_sign_transaction.xml | 62 --- app/src/tangemCardano/res/values/strings.xml | 10 - .../tangem/blockchain/common/Blockchain.kt | 2 +- fastlane/Fastfile | 4 +- settings.gradle | 2 +- tangem-core/build.gradle | 1 - 14 files changed, 3 insertions(+), 1578 deletions(-) delete mode 100644 app/src/tangemCardano/java/com/tangem/Test1.java delete mode 100644 app/src/tangemCardano/java/com/tangem/ui/ConfirmTransactionFragment.kt delete mode 100644 app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt delete mode 100644 app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt delete mode 100644 app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt delete mode 100644 app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml delete mode 100644 app/src/tangemCardano/res/layout/fragment_prepare_transaction.xml delete mode 100644 app/src/tangemCardano/res/layout/fragment_sign_transaction.xml delete mode 100644 app/src/tangemCardano/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index 82e421bdfc..a3a738a121 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,12 +57,6 @@ android { applicationId "com.tangem.wallet" signingConfig signingConfigs.debug } - tangemCardano { - versionCode 1 - versionName "0.1.0" - applicationId "com.tangem.cardano" - signingConfig signingConfigs.debug - } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/app/src/tangemCardano/java/com/tangem/Test1.java b/app/src/tangemCardano/java/com/tangem/Test1.java deleted file mode 100644 index fa30c973e7..0000000000 --- a/app/src/tangemCardano/java/com/tangem/Test1.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tangem; - -public class Test1 { -} diff --git a/app/src/tangemCardano/java/com/tangem/ui/ConfirmTransactionFragment.kt b/app/src/tangemCardano/java/com/tangem/ui/ConfirmTransactionFragment.kt deleted file mode 100644 index 0a3e4a3844..0000000000 --- a/app/src/tangemCardano/java/com/tangem/ui/ConfirmTransactionFragment.kt +++ /dev/null @@ -1,310 +0,0 @@ -package com.tangem.ui - -import android.app.Activity -import android.nfc.NfcAdapter -import android.nfc.Tag -import android.os.Build -import android.os.Bundle -import android.text.Editable -import android.text.Html -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import androidx.activity.OnBackPressedCallback -import androidx.core.os.bundleOf -import com.tangem.Constant -import com.tangem.tangem_sdk.android.data.PINStorage -import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD -import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD_UID -import com.tangem.tangem_sdk.data.loadFromBundle -import com.tangem.tangem_card.data.TangemCard -import com.tangem.ui.activity.MainActivity -import com.tangem.ui.event.TransactionFinishWithError -import com.tangem.ui.fragment.BaseFragment -import com.tangem.ui.fragment.pin.PinRequestFragment -import com.tangem.ui.navigation.NavigationResultListener -import com.tangem.util.UtilHelper -import com.tangem.wallet.CoinEngine -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.R -import com.tangem.wallet.TangemContext -import kotlinx.android.synthetic.tangemCardano.fragment_confirm_transaction.* -import org.greenrobot.eventbus.EventBus -import java.io.IOException -import java.util.* - -class ConfirmTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { - - override val layoutId = R.layout.fragment_confirm_transaction - - private val ctx: TangemContext by lazy { TangemContext() } - private lateinit var amount: CoinEngine.Amount - - private var isIncludeFee: Boolean = true - private var requestPIN2Count = 0 - private var nodeCheck = true - private var dtVerified: Date? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - val callback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - navigateBackWithResult(Activity.RESULT_CANCELED) - } - } - requireActivity().onBackPressedDispatcher.addCallback(this, callback) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val engine = CoinEngineFactory.createCardano(ctx) - - @Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - Html.fromHtml(engine!!.balanceHTML, Html.FROM_HTML_MODE_LEGACY) - else - Html.fromHtml(engine!!.balanceHTML) - tvBalance.text = html - - isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true - - if (isIncludeFee) - tvIncFee.setText(R.string.confirm_transaction_including_fee) - else - tvIncFee.setText(R.string.confirm_transaction_not_including_fee) - - amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT) ?: "0", - arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY) ?: "") - - if (engine.allowSelectFeeInclusion()) - tvIncFee.visibility = View.VISIBLE - else - tvIncFee.visibility = View.INVISIBLE - -// if (ctx.card.blockchainID == Blockchain.Token.id) { -// // for Blockchain.Token limit decimals -// etAmount.setText(amount.toValueString(ctx.card.tokensDecimal)) -// } else { - // for others - etAmount.setText(amount.toValueString()) -// } - - tvCurrency.text = engine.balanceCurrency - tvCurrency2.text = engine.feeCurrency -// tvCardID.text = ctx.card.cidDescription - etWallet.setText(arguments?.getString(Constant.EXTRA_TARGET_ADDRESS)) - - btnSend.visibility = View.INVISIBLE - - if (!engine.allowSelectFeeLevel()) { - rgFee.visibility = View.GONE - } - - // set listeners - rgFee.setOnCheckedChangeListener { _, checkedId -> doSetFee(checkedId) } - etFee.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - - } - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - try { - val eqFee = engine.evaluateFeeEquivalent(etFee!!.text.toString()) - tvFeeEquivalent.text = eqFee - - if (!ctx.coinData!!.amountEquivalentDescriptionAvailable) { - tvFeeEquivalent.error = getString(R.string.confirm_transaction_error_service_unavailable) - tvCurrency2.visibility = View.GONE - tvFeeEquivalent.visibility = View.GONE - } else - tvFeeEquivalent.error = null - - } catch (e: Exception) { - e.printStackTrace() - tvFeeEquivalent.text = "" - } - } - - override fun afterTextChanged(s: Editable) { - - } - }) - btnSend.setOnClickListener { - if (UtilHelper.isOnline(requireContext())) { - val calendar = Calendar.getInstance() - calendar.add(Calendar.MINUTE, -1) - - if (dtVerified == null || dtVerified!!.before(calendar.time)) { - finishWithError(Activity.RESULT_CANCELED, getString(R.string.confirm_transaction_error_data_is_outdated)) - return@setOnClickListener - } - - val engineCoin = CoinEngineFactory.createCardano(ctx) - - if (engineCoin!!.isNeedCheckNode && !nodeCheck) { - Toast.makeText(context, getString(R.string.confirm_transaction_error_cannot_reach_node), Toast.LENGTH_LONG).show() - return@setOnClickListener - } - - val txFee = engineCoin.convertToAmount(etFee.text.toString(), tvCurrency2.text.toString()) - val txAmount = engineCoin.convertToAmount(etAmount.text.toString(), tvCurrency.text.toString()) - -// if (!engineCoin.hasBalanceInfo()) { -// finishWithError(Activity.RESULT_CANCELED, getString(R.string.cannot_check_balance_no_connection_with_blockchain_nodes)) -// return@setOnClickListener -// -// } else if (!engineCoin.isBalanceNotZero) { -// finishWithError(Activity.RESULT_CANCELED, getString(R.string.the_wallet_is_empty)) -// return@setOnClickListener -// -// } else if (!engineCoin.isExtractPossible) { -// finishWithError(Activity.RESULT_CANCELED, getString(R.string.please_wait_for_confirmation_of_incoming_transaction)) -// return@setOnClickListener -// } -// -// if (!engineCoin.checkNewTransactionAmountAndFee(txAmount, txFee, isIncludeFee)) { -// finishWithError(Activity.RESULT_CANCELED, getString(R.string.not_enough_funds_on_your_card)) -// return@setOnClickListener -// } - - requestPIN2Count = 0 -// val intent = Intent(baseContext, PinRequestActivity::class.java) -// intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) -// ctx.saveToIntent(intent) -// intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) -// startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_) - - //TODO - PIN2 workaround - PINStorage.setPIN2(PINStorage.getDefaultPIN2()) - val data = Bundle() - ctx.saveToBundle(data) - data.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - data.putString(Constant.EXTRA_AMOUNT, etAmount.text.toString()) - data.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - data.putString(Constant.EXTRA_FEE, etFee.text.toString()) - data.putString(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) - data.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - navigateForResult( - Constant.REQUEST_CODE_SIGN_TRANSACTION, - R.id.action_confirmTransactionFragment_to_signTransactionFragment, - data) - } else - Toast.makeText(context, getString(R.string.general_error_no_connection), Toast.LENGTH_SHORT).show() - } - - progressBar.visibility = View.VISIBLE - - if (!navigatedBack) requestFee(engine) - } - - private fun requestFee(engine: CoinEngine) { - engine.requestFee( - object : CoinEngine.BlockchainRequestsCallbacks { - override fun onComplete(success: Boolean) { - if (success) { - onProgress() - progressBar.visibility = View.INVISIBLE - dtVerified = Date() - } else { - finishWithError(Activity.RESULT_CANCELED, ctx.error) - } - } - override fun onProgress() { - doSetFee(rgFee.checkedRadioButtonId) - } - override fun allowAdvance(): Boolean { - return UtilHelper.isOnline(requireContext()) - } - }, - etWallet.text.toString(), - amount) - } - - override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { - if (requestCode == Constant.REQUEST_CODE_SIGN_TRANSACTION) { - if (data != null) { - if (data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)!!) - ctx.card = updatedCard - } - } - if (resultCode == Constant.RESULT_INVALID_PIN_ && requestPIN2Count < 2) { - requestPIN2Count++ - val bundle = Bundle() - bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) - ctx.saveToBundle(bundle) - bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_, - R.id.action_confirmTransactionFragment_to_pinRequestFragment, - bundle) - return - - } - navigateBackWithResult(resultCode, data) - - } else if (requestCode == Constant.REQUEST_CODE_REQUEST_PIN2_) { - if (resultCode == Activity.RESULT_OK) { - val bundle = Bundle() - ctx.saveToBundle(bundle) - bundle.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - bundle.putString(Constant.EXTRA_AMOUNT, etAmount.text.toString()) - bundle.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - bundle.putString(Constant.EXTRA_FEE, etFee.text.toString()) - bundle.putString(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) - bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - navigateForResult(Constant.REQUEST_CODE_SIGN_TRANSACTION, - R.id.action_confirmTransactionFragment_to_signTransactionFragment, - bundle) - } else - Toast.makeText(context, R.string.confirm_transaction_error_pin_2_is_required, Toast.LENGTH_LONG).show() - } - } - - override fun onTagDiscovered(tag: Tag) { - try { - (activity as MainActivity).nfcManager.ignoreTag(tag) - } catch (e: IOException) { - e.printStackTrace() - } - } - - private fun doSetFee(checkedRadioButtonId: Int) { - var txtFee = "" - when (checkedRadioButtonId) { - R.id.rbMinimalFee -> - if (ctx.coinData.minFee != null) { - txtFee = ctx.coinData.minFee!!.toValueString() - btnSend.visibility = View.VISIBLE - } else - btnSend.visibility = View.INVISIBLE - - R.id.rbNormalFee -> - if (ctx.coinData.normalFee != null) { - txtFee = ctx.coinData.normalFee!!.toValueString() - btnSend.visibility = View.VISIBLE - } else - btnSend.visibility = View.INVISIBLE - - R.id.rbMaximumFee -> - if (ctx.coinData.maxFee != null) { - txtFee = ctx.coinData.maxFee!!.toValueString() - btnSend.visibility = View.VISIBLE - } else - btnSend.visibility = View.INVISIBLE - } - etFee.setText(txtFee.replace(',', '.')) - } - - private fun finishWithError(errorCode: Int, message: String) { - val transactionFinishWithError = TransactionFinishWithError() - transactionFinishWithError.message = message - EventBus.getDefault().post(transactionFinishWithError) - - navigateBackWithResult(errorCode, bundleOf(Constant.EXTRA_MESSAGE to message)) - } - -} \ No newline at end of file diff --git a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt b/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt deleted file mode 100644 index 4f47260897..0000000000 --- a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt +++ /dev/null @@ -1,207 +0,0 @@ -package com.tangem.ui - -import android.app.Activity -import android.content.Context -import android.nfc.NfcAdapter -import android.nfc.Tag -import android.os.Build -import android.os.Bundle -import android.text.Html -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.View -import android.view.View.OnTouchListener -import android.view.ViewGroup -import android.view.inputmethod.EditorInfo -import android.view.inputmethod.InputMethodManager -import android.widget.Toast -import com.tangem.Constant -import com.tangem.data.dp.PrefsManager -import com.tangem.ui.activity.MainActivity -import com.tangem.ui.event.TransactionFinishWithError -import com.tangem.ui.event.TransactionFinishWithSuccess -import com.tangem.ui.fragment.BaseFragment -import com.tangem.ui.navigation.NavigationResultListener -import com.tangem.util.UtilHelper -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.R -import com.tangem.wallet.TangemContext -import kotlinx.android.synthetic.tangemCardano.fragment_prepare_transaction.* -import org.greenrobot.eventbus.EventBus -import org.greenrobot.eventbus.Subscribe -import java.io.IOException - -class PrepareTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { - - override val layoutId = R.layout.fragment_prepare_transaction - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - val engine = CoinEngineFactory.createCardano(TangemContext()) - - @Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - Html.fromHtml(engine?.balanceHTML, Html.FROM_HTML_MODE_LEGACY) - else - Html.fromHtml(engine?.balanceHTML) - tvBalance.text = html - - if (!engine!!.allowSelectFeeInclusion()) { - rgIncFee.visibility = View.INVISIBLE - } else { - rgIncFee.visibility = View.VISIBLE - } - - tvCurrency.text = engine.balance?.currency - etAmount.setText(engine.balance?.toValueString()) - - // limit number of symbols after comma - etAmount.filters = engine.amountInputFilters - - etWallet.setText(PrefsManager.getInstance().lastWalletAddress) - - // set listeners - etAmount.setOnEditorActionListener { lv, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - val imm = lv.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(lv.windowToken, 0) - lv.clearFocus() - true - } else { - false - } - } - - btnVerify.setOnClickListener { - if (!UtilHelper.isOnline(requireContext())) { - Toast.makeText(context, R.string.general_error_no_connection, Toast.LENGTH_LONG).show() - return@setOnClickListener - } - - // check on empty wallet address - if (etWallet.text.toString() == "") { - etWallet.error = getString(R.string.general_wallet_empty) - return@setOnClickListener - } - - // check on empty amount - if (etAmount.text.toString() == "") { - etAmount.error = getString(R.string.prepare_transaction_error_amount_empty) - return@setOnClickListener - } - - val strAmount: String = etAmount.text.toString().replace(",", ".") - val amount = engine.convertToAmount(etAmount.text.toString(), tvCurrency.text.toString()) - - // check amount - try { - if (!engine.checkNewTransactionAmount(amount)) - etAmount.error = getString(R.string.prepare_transaction_error_not_enough_funds) - else - etAmount.error = null - } catch (e: Exception) { - etAmount.error = getString(R.string.prepare_transaction_error_unknown_amount_format) - } - - // check wallet address - if (!engine.validateAddress(etWallet.text.toString())) { - etWallet.error = getString(R.string.prepare_transaction_error_incorrect_destination) - return@setOnClickListener - } else - etWallet.error = null - - if (!etAmount.error.isNullOrEmpty() || !etWallet.error.isNullOrEmpty()) { - return@setOnClickListener - } - - PrefsManager.getInstance().saveLastWalletAddress(etWallet.text.toString()) - - val data = Bundle() - data.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - data.putBoolean(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) - data.putString(Constant.EXTRA_AMOUNT, strAmount) - data.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - navigateForResult( - Constant.REQUEST_CODE_SEND_TRANSACTION__, - R.id.action_prepareTransactionFragment_to_confirmTransactionFragment, - data) - } - - ivCamera.setOnClickListener { - etWallet.text.clear() - navigateForResult(Constant.REQUEST_CODE_SCAN_QR, R.id.action_prepareTransactionFragment_to_qrScanFragment) - } - - etWallet.setOnTouchListener(OnTouchListener { _, event -> - if (event.action == MotionEvent.ACTION_UP) { - if (event.rawX >= etWallet.right - etWallet.compoundDrawables[2].bounds.width()) { - etWallet.text.clear() - return@OnTouchListener true - } - } - false - }) - } - - override fun onStart() { - super.onStart() - if (!EventBus.getDefault().isRegistered(this)) - EventBus.getDefault().register(this) - } - - override fun onDestroy() { - EventBus.getDefault().unregister(this) - super.onDestroy() - } - - @Subscribe - fun onTransactionFinishWithSuccess(transactionFinishWithSuccess: TransactionFinishWithSuccess) { - transactionFinishWithSuccess.message?.let { message -> - (activity as MainActivity).toastHelper.showSnackbarSuccess(requireContext(), cl, message) - } - } - - @Subscribe - fun onTransactionFinishWithError(transactionFinishWithError: TransactionFinishWithError) { - transactionFinishWithError.message?.let { message -> - (activity as MainActivity).toastHelper.showSnackbarError(requireContext(), cl, message) - } - } - - override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { - if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.containsKey("QRCode")) { - val code = data.getString("QRCode") -// when (ctx.blockchain) { -// Blockchain.Bitcoin -> { -// if (code.contains("bitcoin:")) { -// val tmp = code.split("bitcoin:".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() -// code = tmp[1] -// } -// } -// Blockchain.Ethereum, Blockchain.Token -> { -// if (code.contains("ethereum:")) { -// val tmp = code.split("ethereum:".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() -// code = tmp[1] -// } else if (code.contains("blockchain:")) { -// val tmp = code.split("blockchain:".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() -// code = tmp[1] -// } -// } -// else -> { -// } -// } - etWallet?.setText(code) -// } else if (requestCode == Constant.REQUEST_CODE_SEND_TRANSACTION__) { -// setResult(resultCode, data) -// finish() - } - } - - override fun onTagDiscovered(tag: Tag) { - try { - (activity as MainActivity).nfcManager.ignoreTag(tag) - } catch (e: IOException) { - e.printStackTrace() - } - } - -} \ No newline at end of file diff --git a/app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt b/app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt b/app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt deleted file mode 100644 index 00585cb35c..0000000000 --- a/app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt +++ /dev/null @@ -1,362 +0,0 @@ -package com.tangem.ui - -import android.app.Activity -import android.content.Intent -import android.content.res.ColorStateList -import android.graphics.Color -import android.media.MediaPlayer -import android.nfc.NfcAdapter -import android.nfc.Tag -import android.nfc.tech.IsoDep -import android.os.Bundle -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import androidx.activity.OnBackPressedCallback -import com.tangem.App -import com.tangem.Constant -import com.tangem.tangem_sdk.android.nfc.NfcDeviceAntennaLocation -import com.tangem.tangem_sdk.android.reader.NfcManager -import com.tangem.tangem_sdk.android.reader.NfcReader -import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD -import com.tangem.tangem_sdk.data.EXTRA_TANGEM_CARD_UID -import com.tangem.tangem_sdk.data.asBundle -import com.tangem.tangem_card.data.TangemCard -import com.tangem.tangem_card.reader.CardCrypto -import com.tangem.tangem_card.reader.CardProtocol -import com.tangem.tangem_card.tasks.CustomReadCardTask -import com.tangem.tangem_card.tasks.OneTouchSignTask -import com.tangem.tangem_card.tasks.SignTask -import com.tangem.tangem_card.util.Log -import com.tangem.wallet.CoinEngine -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.ui.activity.MainActivity -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog -import com.tangem.ui.fragment.BaseFragment -import com.tangem.ui.navigation.NavigationResultListener -import com.tangem.util.LOG -import com.tangem.wallet.R -import kotlinx.android.synthetic.main.layout_progress_horizontal.* -import kotlinx.android.synthetic.main.layout_touch_card.* -import kotlinx.coroutines.runBlocking -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine - -class SignTransactionFragment : BaseFragment(), NavigationResultListener, - NfcAdapter.ReaderCallback, CardProtocol.Notifications { - - companion object { - val TAG: String = SignTransactionFragment::class.java.simpleName - } - - override val layoutId = R.layout.fragment_sign_transaction - - private lateinit var ctx: TangemContext - private lateinit var mpFinishSignSound: MediaPlayer - - private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation - - private var task: CustomReadCardTask? = null - - private lateinit var amount: CoinEngine.Amount - private lateinit var fee: CoinEngine.Amount - private var isIncludeFee = true - private var outAddressStr: String? = null - private var lastReadSuccess = true - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - ctx = TangemContext.loadFromBundle(context, arguments) - - val callback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - navigateBackWithResult(Activity.RESULT_CANCELED) - } - } - requireActivity().onBackPressedDispatcher.addCallback(this, callback) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - mpFinishSignSound = MediaPlayer.create(context, R.raw.scan_card_sound) - - // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(requireContext(), ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) - nfcDeviceAntenna.init() - - amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT), arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY)) - fee = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_FEE), arguments?.getString(Constant.EXTRA_FEE_CURRENCY)) - isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true - outAddressStr = arguments?.getString(Constant.EXTRA_TARGET_ADDRESS) - - // tvCardID.text = ctx.card!!.cidDescription - progressBar.progressTintList = ColorStateList.valueOf(Color.DKGRAY) - progressBar.visibility = View.INVISIBLE - } - - override fun onPause() { - task?.cancel(true) - super.onPause() - } - - override fun onStop() { - task?.cancel(true) - super.onStop() - } - - override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { - if (requestCode == Constant.REQUEST_CODE_SEND_TRANSACTION_) { - navigateBackWithResult(resultCode, data) - } - } - - override fun onTagDiscovered(tag: Tag) { - try { - // get IsoDep handle and run cardReader thread - val isoDep = IsoDep.get(tag) - - isoDep.timeout = 65000 - - val coinEngine = CoinEngineFactory.createCardano(ctx) - coinEngine?.setOnNeedSendTransaction { tx -> - if (tx != null) { - val data = Bundle() - ctx.saveToBundle(data) - data.putByteArray(Constant.EXTRA_TX, tx) - navigateForResult( - Constant.REQUEST_CODE_SEND_TRANSACTION_, - R.id.action_signTransactionFragment_to_sendTransactionFragment, - data) - } - } - - val tx: OneTouchSignTask.TransactionToSign = object : OneTouchSignTask.TransactionToSign { - var txToSign: SignTask.TransactionToSign? = null - suspend fun requestBalanceAndUnspentTransactions(): Boolean = suspendCoroutine { cont -> - coinEngine!!.requestBalanceAndUnspentTransactions(object : CoinEngine.BlockchainRequestsCallbacks { - override fun onComplete(success: Boolean?) { - cont.resume(success!!) - } - - override fun onProgress() { - } - - override fun allowAdvance(): Boolean { - return true - } - }) - } - - fun initData(card: TangemCard) { - if (ctx.card == null) { - ctx.card = card - } - if (ctx.coinData == null) { - ctx.coinData = CoinEngineFactory.createCardanoData() - } - if (ctx.coinData.wallet.isNullOrEmpty()) { - coinEngine?.defineWallet() - runBlocking { requestBalanceAndUnspentTransactions() } - Log.e(MainActivity.TAG, "requestBalanceAndUnspentTransactions completed") - } - if (txToSign == null) txToSign = coinEngine!!.constructTransaction(amount, fee, isIncludeFee, outAddressStr) - } - - override fun isSigningOnCardSupported(card: TangemCard?): Boolean { - initData(card!!) - return CoinEngineFactory.isCardano(card?.blockchainID) and (txToSign!!.isSigningMethodSupported(card?.signingMethod)) - } - - override fun isIssuerCanSignData(card: TangemCard?): Boolean { - return try { - card?.issuer?.privateDataKey!=null - } catch (e: java.lang.Exception) { - false - } - } - - override fun isIssuerCanSignTransaction(card: TangemCard?): Boolean { - return try { - card?.issuer?.privateTransactionKey!=null - } catch (e: java.lang.Exception) { - false - } - } - - override fun getHashesToSign(card: TangemCard?): Array { - initData(card!!) - return txToSign!!.hashesToSign - } - - override fun getRawDataToSign(card: TangemCard?): ByteArray { - initData(card!!) - return txToSign!!.rawDataToSign - } - - override fun getHashAlgToSign(card: TangemCard?): String { - initData(card!!) - return txToSign!!.hashAlgToSign - } - - override fun getIssuerTransactionSignature(card: TangemCard?, dataToSignByIssuer: ByteArray?): ByteArray { - initData(card!!) - if( card.issuer!=null && card.issuer.privateTransactionKey!=null) - { - return CardCrypto.Signature(card.issuer.privateTransactionKey, dataToSignByIssuer) - } - return txToSign!!.getIssuerTransactionSignature(dataToSignByIssuer) - } - - override fun onSignCompleted(card: TangemCard?, signature: ByteArray?) { - initData(card!!) - txToSign!!.onSignCompleted(signature) - } - - } - task = OneTouchSignTask(NfcReader((activity as MainActivity).nfcManager, isoDep), - App.localStorage, App.pinStorage, this, tx) - task!!.start() - - } catch (e: CardProtocol.TangemException_WrongAmount) { - try { - val data = Bundle() - data.putString(Constant.EXTRA_MESSAGE, getString(R.string.send_transaction_error_wrong_amount)) - data.putString(EXTRA_TANGEM_CARD_UID, ctx.card.uid) - data.putBundle(EXTRA_TANGEM_CARD, ctx.card.asBundle) - navigateBackWithResult(Activity.RESULT_CANCELED, data) - } catch (e: Exception) { - e.printStackTrace() - } - } catch (e: Exception) { - e.printStackTrace() - } - } - - override fun onReadStart(cardProtocol: CardProtocol) { - rlProgressBar.post { rlProgressBar.visibility = View.VISIBLE } - - progressBar?.post { - progressBar?.visibility = View.VISIBLE - progressBar?.progress = 5 - } - } - - override fun onReadProgress(protocol: CardProtocol, progress: Int) { - progressBar?.post { progressBar!!.progress = progress } - } - - override fun onReadFinish(cardProtocol: CardProtocol?) { - task = null - if (cardProtocol != null) { - if (cardProtocol.error == null) { - rlProgressBar.post { rlProgressBar.visibility = View.GONE } - - progressBar?.post { - progressBar?.progress = 100 - progressBar?.progressTintList = ColorStateList.valueOf(Color.GREEN) - } - - mpFinishSignSound.start() - } 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 data = Bundle() - data.putString(Constant.EXTRA_MESSAGE, getString(R.string.send_transaction_error_cannot_sign)) - data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - navigateBackWithResult(Constant.RESULT_INVALID_PIN_, data) - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } else { - if (cardProtocol.error is CardProtocol.TangemException_WrongAmount) { - try { - val data = Bundle() - data.putString(Constant.EXTRA_MESSAGE, getString(R.string.send_transaction_error_wrong_amount)) - data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - navigateBackWithResult(Activity.RESULT_CANCELED, data) - } catch (e: Exception) { - e.printStackTrace() - } - } - progressBar?.post { - if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { - if (!NoExtendedLengthSupportDialog.allReadyShowed) { - NoExtendedLengthSupportDialog.message = getText(R.string.dialog_the_nfc_adapter_length_apdu).toString() + "\n" + getText(R.string.dialog_the_nfc_adapter_length_apdu_advice).toString() - NoExtendedLengthSupportDialog().show(requireFragmentManager(), NoExtendedLengthSupportDialog.TAG) - } - } else { - Toast.makeText(context, R.string.general_notification_scan_again, Toast.LENGTH_LONG).show() - } - progressBar?.progress = 100 - progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) - } - } - } - } - - rlProgressBar.postDelayed({ - try { - rlProgressBar.visibility = View.GONE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - - progressBar?.postDelayed({ - try { - progressBar?.progress = 0 - progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) - progressBar?.visibility = View.INVISIBLE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } - - override fun onReadCancel() { - task = 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 onReadBeforeRequest(timeout: Int) { - LOG.i(TAG, "onReadBeforeRequest timeout $timeout") - WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) - } - - override fun onReadAfterRequest() { - LOG.i(TAG, "onReadAfterRequest") - WaitSecurityDelayDialog.onReadAfterRequest(activity) - } - - override fun onReadWait(msec: Int) { - LOG.i(TAG, "onReadWait msec $msec") - WaitSecurityDelayDialog.onReadWait(activity, msec) - } - -} \ No newline at end of file diff --git a/app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml b/app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml deleted file mode 100644 index cbfde5c74e..0000000000 --- a/app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -