From 8e2f4095c543e4a2a2082f12889db233ec30aabf Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 30 Mar 2019 14:42:26 +0300 Subject: [PATCH 01/20] Updated on 2026-08-14 --- app/build.gradle | 18 +++++++++++++--- app/src/debug/java/com/tangem/Test.java | 4 ++++ app/src/debug/res/values/strings.xml | 3 +-- app/src/main/AndroidManifest.xml | 12 +++++------ app/src/main/java/com/tangem/Constant.kt | 3 +++ .../java/com/tangem/data/LogFileProvider.java | 3 ++- .../com/tangem/ui/activity/LogoActivity.kt | 19 +++++++++++++---- .../com/tangem/ui/activity/MainActivity.kt | 3 ++- app/src/main/res/layout/activity_logo.xml | 21 ++++++++++++++++++- app/src/main/res/values/strings.xml | 8 ++++++- .../res/values/strings_untranslatable.xml | 1 + .../res/values/strings.xml | 1 - app/src/tangemCardano/res/values/strings.xml | 6 ++++++ 13 files changed, 82 insertions(+), 20 deletions(-) create mode 100644 app/src/debug/java/com/tangem/Test.java rename app/src/{release => tangemAccess}/res/values/strings.xml (56%) create mode 100644 app/src/tangemCardano/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index ab63c2525b..59599b9cfa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,11 +12,8 @@ static def generateVersionName() { android { compileSdkVersion 28 defaultConfig { - applicationId "com.tangem.wallet" minSdkVersion 21 targetSdkVersion 28 - versionCode 106 - versionName "0.903.2." + generateVersionName() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } androidExtensions { @@ -36,6 +33,21 @@ android { signingConfig signingConfigs.debug } } + flavorDimensions "" + productFlavors { + tangemAccess { + versionName "0.903.2." + generateVersionName() + versionCode 106 + applicationId "com.tangem.wallet" + signingConfig signingConfigs.debug + } + tangemCardano { + versionName "0.1.0" + versionCode 1 + applicationId "com.tangem.cardano" + signingConfig signingConfigs.debug + } + } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/app/src/debug/java/com/tangem/Test.java b/app/src/debug/java/com/tangem/Test.java new file mode 100644 index 0000000000..df5872e621 --- /dev/null +++ b/app/src/debug/java/com/tangem/Test.java @@ -0,0 +1,4 @@ +package com.tangem; + +public class Test { +} diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index 700e32affc..9ef8838437 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -1,7 +1,6 @@ - DEV - com.tangem.data.LogFileProvider.debug + DEBUG \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0758bd9d3e..fbc7175cf5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,12 +29,12 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - + + + + + + { + tvExtension.visibility = View.VISIBLE + tvExtension.text = getString(R.string.cardano) + } + else -> { + tvExtension.visibility = View.GONE + } + } if (intent.getBooleanExtra(Constant.EXTRA_AUTO_HIDE, true)) ivLogo.postDelayed(hideRunnable, Constant.MILLIS_AUTO_HIDE.toLong()) diff --git a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt index 4ee6e16658..41138e9327 100644 --- a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt @@ -142,7 +142,8 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco val responseBuildVersion = responseVersionName.split('.').last() val appBuildVersion = BuildConfig.VERSION_NAME.split('.').last() if (responseBuildVersion.toInt() > appBuildVersion.toInt()) - toastHelper.showSnackbarUpdateVersion(this, cl, responseVersionName) + if (BuildConfig.FLAVOR.equals(Constant.FLAVOR_TANGEM_ACCESS)) + toastHelper.showSnackbarUpdateVersion(this, cl, responseVersionName) } catch (E: Exception) { E.printStackTrace() } diff --git a/app/src/main/res/layout/activity_logo.xml b/app/src/main/res/layout/activity_logo.xml index 97397e9d4d..cf3bb0afc9 100644 --- a/app/src/main/res/layout/activity_logo.xml +++ b/app/src/main/res/layout/activity_logo.xml @@ -7,6 +7,25 @@ tools:context="com.tangem.ui.activity.LogoActivity" tools:ignore="contentDescription"> + + + app:layout_constraintTop_toBottomOf="@+id/tvExtension" /> No connection with blockchain nodes Continue Not found - Card must be loaded first! Tag lost! command @@ -56,6 +55,7 @@ Show QR-code LOAD BETA + Cardano Your Android device is rooted. Security at risk! @@ -84,6 +84,12 @@ Reset PINs to default Erase wallet + + BETA v.%1$s \n dev \n build %2$s + BETA v.%1$s + + Hello, %1$s! You have %2$d new messages. + Tap Tangem card with your smartphone Scan a banknote with your \n %1$s \n as shown above diff --git a/app/src/main/res/values/strings_untranslatable.xml b/app/src/main/res/values/strings_untranslatable.xml index 78b9c55461..13279d3f9c 100644 --- a/app/src/main/res/values/strings_untranslatable.xml +++ b/app/src/main/res/values/strings_untranslatable.xml @@ -20,6 +20,7 @@ 9 0 + com.tangem.data.LogFileProvider Can\'t create CoinEngine! diff --git a/app/src/release/res/values/strings.xml b/app/src/tangemAccess/res/values/strings.xml similarity index 56% rename from app/src/release/res/values/strings.xml rename to app/src/tangemAccess/res/values/strings.xml index 0b18bb17aa..7999593bc8 100644 --- a/app/src/release/res/values/strings.xml +++ b/app/src/tangemAccess/res/values/strings.xml @@ -2,6 +2,5 @@ Tangem Access - com.tangem.data.LogFileProvider \ No newline at end of file diff --git a/app/src/tangemCardano/res/values/strings.xml b/app/src/tangemCardano/res/values/strings.xml new file mode 100644 index 0000000000..7086e50661 --- /dev/null +++ b/app/src/tangemCardano/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + Cardano + + \ No newline at end of file From 33854d62c0dd58b369f14be55bba5f0b6d889e2f Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 31 Mar 2019 23:35:21 +0300 Subject: [PATCH 02/20] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/tangem/data/LogFileProvider.java | 2 +- app/src/main/java/com/tangem/di/Navigator.kt | 1 + .../java/com/tangem/di/NavigatorComponent.kt | 2 +- .../tangemAccess/java/com/tangem/Test2.java | 4 + .../tangem/ui}/PrepareTransactionActivity.kt | 5 +- .../layout/activity_prepare_transaction.xml | 2 +- .../tangemCardano/java/com/tangem/Test1.java | 4 + .../tangem/ui/PrepareTransactionActivity.kt | 180 ++++++++++++ .../layout/activity_prepare_transaction.xml | 262 ++++++++++++++++++ 10 files changed, 458 insertions(+), 6 deletions(-) create mode 100644 app/src/tangemAccess/java/com/tangem/Test2.java rename app/src/{main/java/com/tangem/ui/activity => tangemAccess/java/com/tangem/ui}/PrepareTransactionActivity.kt (97%) rename app/src/{main => tangemAccess}/res/layout/activity_prepare_transaction.xml (99%) create mode 100644 app/src/tangemCardano/java/com/tangem/Test1.java create mode 100644 app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt create mode 100644 app/src/tangemCardano/res/layout/activity_prepare_transaction.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fbc7175cf5..2cc8950e80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -99,7 +99,7 @@ android:theme="@style/AppTheme.NoActionBar" /> diff --git a/app/src/main/java/com/tangem/data/LogFileProvider.java b/app/src/main/java/com/tangem/data/LogFileProvider.java index b3c3f18457..268d3f4884 100644 --- a/app/src/main/java/com/tangem/data/LogFileProvider.java +++ b/app/src/main/java/com/tangem/data/LogFileProvider.java @@ -61,7 +61,7 @@ public class LogFileProvider extends ContentProvider { // The desired file name is specified by the last segment of the // path // E.g. - // 'content://it.my.app.LogFileProvider/Test.txt' + // 'content://it.my.app.LogFileProvider/Test1.txt' // Take this and build the path to the file String fileLocation = getContext().getCacheDir() + File.separator + uri.getLastPathSegment(); diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index 07ba69f100..d9c9c4ed6b 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.nfc.Tag import com.tangem.Constant import com.tangem.domain.wallet.TangemContext +import com.tangem.ui.PrepareTransactionActivity import com.tangem.ui.activity.* class Navigator { diff --git a/app/src/main/java/com/tangem/di/NavigatorComponent.kt b/app/src/main/java/com/tangem/di/NavigatorComponent.kt index f3cef57221..25990b46a1 100644 --- a/app/src/main/java/com/tangem/di/NavigatorComponent.kt +++ b/app/src/main/java/com/tangem/di/NavigatorComponent.kt @@ -6,7 +6,7 @@ import com.tangem.ui.activity.LogoActivity import com.tangem.ui.activity.MainActivity import com.tangem.ui.activity.PrepareCryptonitOtherApiWithdrawalActivity import com.tangem.ui.activity.PrepareKrakenWithdrawalActivity -import com.tangem.ui.activity.PrepareTransactionActivity +import com.tangem.ui.PrepareTransactionActivity import com.tangem.ui.activity.PurgeActivity import com.tangem.ui.activity.VerifyCardActivity diff --git a/app/src/tangemAccess/java/com/tangem/Test2.java b/app/src/tangemAccess/java/com/tangem/Test2.java new file mode 100644 index 0000000000..c4c336af47 --- /dev/null +++ b/app/src/tangemAccess/java/com/tangem/Test2.java @@ -0,0 +1,4 @@ +package com.tangem; + +public class Test2 { +} diff --git a/app/src/main/java/com/tangem/ui/activity/PrepareTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt similarity index 97% rename from app/src/main/java/com/tangem/ui/activity/PrepareTransactionActivity.kt rename to app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt index 9789a22815..e18c1d92c1 100644 --- a/app/src/main/java/com/tangem/ui/activity/PrepareTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui import android.app.Activity import android.content.Context @@ -21,9 +21,10 @@ 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.main.activity_prepare_transaction.* +import kotlinx.android.synthetic.tangemAccess.activity_prepare_transaction.* import java.io.IOException import javax.inject.Inject diff --git a/app/src/main/res/layout/activity_prepare_transaction.xml b/app/src/tangemAccess/res/layout/activity_prepare_transaction.xml similarity index 99% rename from app/src/main/res/layout/activity_prepare_transaction.xml rename to app/src/tangemAccess/res/layout/activity_prepare_transaction.xml index 6f465b04a0..8da055a7a0 100644 --- a/app/src/main/res/layout/activity_prepare_transaction.xml +++ b/app/src/tangemAccess/res/layout/activity_prepare_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.PrepareTransactionActivity" + tools:context="com.tangem.ui.PrepareTransactionActivity" tools:ignore="contentDescription"> = 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 + } + + if (ctx.card!!.remainingSignatures < 2) + etAmount.isEnabled = false + + tvCurrency.text = engine.balance.currency + etAmount.setText(engine.balance.toValueString()) + + // limit number of symbols after comma + etAmount.filters = engine.amountInputFilters + + // 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(this)) { + Toast.makeText(this, R.string.no_connection, Toast.LENGTH_LONG).show() + return@setOnClickListener + } + + val engine1 = CoinEngineFactory.create(ctx) + val strAmount: String = etAmount.text.toString().replace(",", ".") + val amount = engine1!!.convertToAmount(etAmount.text.toString(), tvCurrency.text.toString()) + + try { + if (!engine.checkNewTransactionAmount(amount)) + etAmount.error = getString(R.string.not_enough_funds_on_your_card) + else + etAmount.error = null + } catch (e: Exception) { + etAmount.error = getString(R.string.unknown_amount_format) + } + + // check wallet address + if (!engine1.validateAddress(etWallet.text.toString())) { + etWallet.error = getString(R.string.incorrect_destination_wallet_address) + return@setOnClickListener + } else + etWallet.error = null + + if (etWallet.text.toString() == ctx.coinData!!.wallet) { + etWallet.error = getString(R.string.destination_wallet_address_equal_source_address) + return@setOnClickListener + } + + if (!etAmount.error.isNullOrEmpty() || !etWallet.error.isNullOrEmpty()) { + return@setOnClickListener + } + + val intent = Intent(baseContext, ConfirmTransactionActivity::class.java) + ctx.saveToIntent(intent) + intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + intent.putExtra(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) + intent.putExtra(Constant.EXTRA_AMOUNT, strAmount) + intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + startActivityForResult(intent, Constant.REQUEST_CODE_SEND_TRANSACTION__) + } + + ivCamera.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR) } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { + var code = data.getStringExtra("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 { + nfcManager.ignoreTag(tag) + } catch (e: IOException) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/app/src/tangemCardano/res/layout/activity_prepare_transaction.xml b/app/src/tangemCardano/res/layout/activity_prepare_transaction.xml new file mode 100644 index 0000000000..8da055a7a0 --- /dev/null +++ b/app/src/tangemCardano/res/layout/activity_prepare_transaction.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From c760f36c339dc54f6825b6c641b823e206f57182 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Apr 2019 00:52:20 +0300 Subject: [PATCH 03/20] 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +