From c760f36c339dc54f6825b6c641b823e206f57182 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Apr 2019 00:52:20 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 2 +- .../tangem/ui}/ConfirmTransactionActivity.kt | 6 +- .../tangem/ui/PrepareTransactionActivity.kt | 1 - .../layout/activity_confirm_transaction.xml | 2 +- .../tangem/ui/ConfirmTransactionActivity.kt | 300 +++++++++++++++ .../tangem/ui/PrepareTransactionActivity.kt | 1 - .../layout/activity_confirm_transaction.xml | 344 ++++++++++++++++++ .../layout/activity_prepare_transaction.xml | 1 + app/src/tangemCardano/res/values/strings.xml | 3 + 9 files changed, 654 insertions(+), 6 deletions(-) rename app/src/{main/java/com/tangem/ui/activity => tangemAccess/java/com/tangem/ui}/ConfirmTransactionActivity.kt (98%) rename app/src/{main => tangemAccess}/res/layout/activity_confirm_transaction.xml (99%) create mode 100644 app/src/tangemCardano/java/com/tangem/ui/ConfirmTransactionActivity.kt create mode 100644 app/src/tangemCardano/res/layout/activity_confirm_transaction.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2cc8950e80..99a29f4097 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -104,7 +104,7 @@ android:theme="@style/AppTheme.NoActionBar" /> diff --git a/app/src/main/java/com/tangem/ui/activity/ConfirmTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt similarity index 98% rename from app/src/main/java/com/tangem/ui/activity/ConfirmTransactionActivity.kt rename to app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt index ed4d1d7a5f..30f1693e35 100644 --- a/app/src/main/java/com/tangem/ui/activity/ConfirmTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui import android.app.Activity import android.content.Intent @@ -25,12 +25,14 @@ import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard import com.tangem.util.UtilHelper import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_confirm_transaction.* import org.greenrobot.eventbus.EventBus import java.io.IOException import java.util.* import com.tangem.card_android.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID +import com.tangem.ui.activity.PinRequestActivity +import com.tangem.ui.activity.SignTransactionActivity +import kotlinx.android.synthetic.tangemAccess.activity_confirm_transaction.* class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { diff --git a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt index e18c1d92c1..c6edc34fb4 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt @@ -21,7 +21,6 @@ import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.card_android.android.nfc.NfcLifecycleObserver import com.tangem.card_android.android.reader.NfcManager -import com.tangem.ui.activity.ConfirmTransactionActivity import com.tangem.util.UtilHelper import com.tangem.wallet.R import kotlinx.android.synthetic.tangemAccess.activity_prepare_transaction.* diff --git a/app/src/main/res/layout/activity_confirm_transaction.xml b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml similarity index 99% rename from app/src/main/res/layout/activity_confirm_transaction.xml rename to app/src/tangemAccess/res/layout/activity_confirm_transaction.xml index 6e10638831..471d9b6850 100644 --- a/app/src/main/res/layout/activity_confirm_transaction.xml +++ b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.tangem.ui.activity.ConfirmTransactionActivity" + tools:context="com.tangem.ui.ConfirmTransactionActivity" tools:ignore="Autofill"> = Build.VERSION_CODES.N) + Html.fromHtml(engine!!.balanceHTML, Html.FROM_HTML_MODE_LEGACY) + else + Html.fromHtml(engine!!.balanceHTML) + tvBalance.text = html + + isIncludeFee = intent.getBooleanExtra(Constant.EXTRA_FEE_INCLUDED, true) + + if (isIncludeFee) + tvIncFee.setText(R.string.including_fee) + else + tvIncFee.setText(R.string.not_including_fee) + + amount = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_AMOUNT), intent.getStringExtra(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(intent.getStringExtra(Constant.EXTRA_TARGET_ADDRESS)) + + btnSend.visibility = View.INVISIBLE + + if (!engine.allowSelectFeeLevel()) { + rgFee.visibility = View.INVISIBLE + } + + // 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.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(this)) { + val calendar = Calendar.getInstance() + calendar.add(Calendar.MINUTE, -1) + + if (dtVerified == null || dtVerified!!.before(calendar.time)) { + finishWithError(Activity.RESULT_CANCELED, getString(R.string.the_obtained_data_is_outdated_try_again)) + return@setOnClickListener + } + + val engineCoin = CoinEngineFactory.create(ctx) + + if (engineCoin!!.isNeedCheckNode && !nodeCheck) { + Toast.makeText(baseContext, getString(R.string.cannot_reach_current_active_blockchain_node_try_again), 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_) + } else + Toast.makeText(this, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() + } + + val coinEngine = CoinEngineFactory.create(ctx) + + progressBar.visibility = View.VISIBLE + + coinEngine!!.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(this@ConfirmTransactionActivity) + } + }, + etWallet.text.toString(), + amount) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == Constant.REQUEST_CODE_SIGN_TRANSACTION) { + if (data != null && data.extras != null) { + if (data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + ctx.card = updatedCard + } + } + if (resultCode == Constant.RESULT_INVALID_PIN_ && requestPIN2Count < 2) { + requestPIN2Count++ + + 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_) + + return + } + setResult(resultCode, data) + finish() + } else if (requestCode == Constant.REQUEST_CODE_REQUEST_PIN2_) { + if (resultCode == Activity.RESULT_OK) { + val intent = Intent(baseContext, SignTransactionActivity::class.java) + ctx.saveToIntent(intent) + intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + intent.putExtra(Constant.EXTRA_AMOUNT, etAmount.text.toString()) + intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + intent.putExtra(Constant.EXTRA_FEE, etFee.text.toString()) + intent.putExtra(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) + intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + startActivityForResult(intent, Constant.REQUEST_CODE_SIGN_TRANSACTION) + } else + Toast.makeText(baseContext, R.string.pin_2_is_required_to_sign_the_transaction, Toast.LENGTH_LONG).show() + } + } + + 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 onTagDiscovered(tag: Tag) { + try { + 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) + + val intent = Intent() + intent.putExtra(Constant.EXTRA_MESSAGE, message) + setResult(errorCode, intent) + finish() + } + +} \ No newline at end of file diff --git a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt b/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt index a7e4b017b3..d43a330596 100644 --- a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt +++ b/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt @@ -21,7 +21,6 @@ import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.card_android.android.nfc.NfcLifecycleObserver import com.tangem.card_android.android.reader.NfcManager -import com.tangem.ui.activity.ConfirmTransactionActivity import com.tangem.util.UtilHelper import com.tangem.wallet.R import kotlinx.android.synthetic.tangemCardano.activity_prepare_transaction.* diff --git a/app/src/tangemCardano/res/layout/activity_confirm_transaction.xml b/app/src/tangemCardano/res/layout/activity_confirm_transaction.xml new file mode 100644 index 0000000000..6f9e6375a1 --- /dev/null +++ b/app/src/tangemCardano/res/layout/activity_confirm_transaction.xml @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +