Updated on 2026-08-14

This commit is contained in:
Tangem 2022-09-14 11:35:59 +03:00
commit 784a908734
9 changed files with 134 additions and 132 deletions

View file

@ -1,24 +0,0 @@
package com.tangem.wallet
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getTargetContext()
assertEquals("com.tangem.wallet", appContext.packageName)
}
}

View file

@ -2,7 +2,6 @@ package com.tangem.tap.features.details.ui.cardsettings
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@ -10,6 +9,10 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@ -51,14 +54,12 @@ fun CardSettingsReadCard(
Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.SpaceBetween,
) {
Box(
modifier = modifier
.fillMaxWidth(),
) {
.fillMaxWidth()
.padding(bottom = 40.dp),
) {
Image(
modifier = modifier
.fillMaxWidth()
@ -77,16 +78,13 @@ fun CardSettingsReadCard(
contentDescription = "",
contentScale = ContentScale.FillWidth,
)
}
Spacer(modifier = Modifier.weight(1f))
Column(
modifier = modifier
.fillMaxWidth()
.padding(start = 16.dp, end = 16.dp, bottom = 32.dp),
) {
Text(
text = stringResource(id = R.string.scan_card_settings_title),
color = colorResource(id = R.color.text_primary_1),
@ -97,6 +95,9 @@ fun CardSettingsReadCard(
text = stringResource(id = R.string.scan_card_settings_message),
color = colorResource(id = R.color.text_secondary),
style = TangemTypography.body1,
modifier = modifier
.verticalScroll(rememberScrollState())
.weight(weight = 1f, fill = false),
)
Spacer(modifier = modifier.size(29.dp))
DetailsMainButton(
@ -113,11 +114,13 @@ fun CardSettings(
state: CardSettingsScreenState,
modifier: Modifier = Modifier,
) {
Column(
if (state.cardDetails == null) return
LazyColumn(
modifier = modifier
.fillMaxWidth(),
) {
state.cardDetails?.map {
items(state.cardDetails) {
val paddingBottom = when (it) {
is CardInfo.CardId, is CardInfo.Issuer -> 12.dp
is CardInfo.SignedHashes -> 14.dp
@ -156,9 +159,7 @@ fun CardSettings(
style = TangemTypography.body2,
)
}
}
}
}

View file

@ -1,18 +1,18 @@
package com.tangem.tap.features.details.ui.resetcard
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Icon
import androidx.compose.material.IconToggleButton
import androidx.compose.material.Text
@ -36,18 +36,11 @@ fun ResetCardScreen(
onBackPressed: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(modifier = modifier.background(colorResource(id = R.color.background_primary))) {
Image(
painter = painterResource(id = R.drawable.ic_reset_background),
contentDescription = "",
modifier = modifier.offset(y = (-16).dp),
)
SettingsScreensScaffold(
content = { ResetCardView(state = state, modifier = modifier) },
onBackClick = onBackPressed,
backgroundColor = Color.Transparent,
)
}
}
@Composable
@ -57,81 +50,91 @@ fun ResetCardView(
) {
Column(
modifier = modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Bottom,
.fillMaxSize()
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.SpaceBetween,
) {
Box(
modifier = modifier,
) {
Image(
painter = painterResource(id = R.drawable.ic_reset_background),
contentDescription = "",
modifier = modifier.offset(y = (-82).dp),
)
ScreenTitle(titleRes = R.string.reset_card_to_factory_navigation_title)
}
Spacer(
modifier = modifier.weight(1f),
)
Column(
modifier = modifier
.defaultMinSize(20.dp)
.weight(1f),
)
Text(
text = stringResource(id = R.string.common_attention),
modifier = modifier.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.headline3,
color = colorResource(id = R.color.text_primary_1),
)
Spacer(modifier = modifier.size(24.dp))
Text(
text = stringResource(id = R.string.reset_card_to_factory_message),
modifier = modifier.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.body1,
color = colorResource(id = R.color.text_secondary),
)
Spacer(modifier = modifier.size(44.dp))
Row(
modifier = modifier
.fillMaxWidth()
.padding(end = 20.dp),
.offset(y = (-32).dp),
verticalArrangement = Arrangement.Bottom,
) {
IconToggleButton(
checked = state.accepted,
onCheckedChange = state.onAcceptWarningToggleClick,
modifier = modifier.padding(start = 20.dp, end = 20.dp),
) {
Icon(
painter = painterResource(
if (state.accepted) {
R.drawable.ic_accepted
} else {
R.drawable.ic_unticked
},
),
contentDescription = null,
tint = if (state.accepted) {
colorResource(id = R.color.icon_accent)
} else {
colorResource(id = R.color.icon_secondary)
},
)
}
Text(
text = stringResource(id = R.string.reset_card_to_factory_warning_message),
style = TangemTypography.body2,
text = stringResource(id = R.string.common_attention),
modifier = modifier.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.headline3,
color = colorResource(id = R.color.text_primary_1),
)
Spacer(modifier = modifier.size(24.dp))
Text(
text = stringResource(id = R.string.reset_card_to_factory_message),
modifier = modifier
.padding(start = 20.dp, end = 20.dp),
style = TangemTypography.body1,
color = colorResource(id = R.color.text_secondary),
)
}
Spacer(modifier = modifier.size(32.dp))
Box(
modifier = modifier
.padding(start = 16.dp, end = 16.dp, bottom = 32.dp),
) {
DetailsMainButton(
title = stringResource(id = R.string.reset_card_to_factory_button_title),
onClick = state.onResetButtonClick,
enabled = state.resetButtonEnabled,
)
}
Spacer(modifier = modifier.size(44.dp))
Row(
modifier = modifier
.fillMaxWidth()
.padding(end = 20.dp),
) {
IconToggleButton(
checked = state.accepted,
onCheckedChange = state.onAcceptWarningToggleClick,
modifier = modifier.padding(start = 20.dp, end = 20.dp),
) {
Icon(
painter = painterResource(
if (state.accepted) {
R.drawable.ic_accepted
} else {
R.drawable.ic_unticked
},
),
contentDescription = null,
tint = if (state.accepted) {
colorResource(id = R.color.icon_accent)
} else {
colorResource(id = R.color.icon_secondary)
},
)
}
Text(
text = stringResource(id = R.string.reset_card_to_factory_warning_message),
style = TangemTypography.body2,
color = colorResource(id = R.color.text_secondary),
)
}
Spacer(modifier = modifier.size(32.dp))
Box(
modifier = modifier
.padding(start = 16.dp, end = 16.dp),
) {
DetailsMainButton(
title = stringResource(id = R.string.reset_card_to_factory_button_title),
onClick = state.onResetButtonClick,
enabled = state.resetButtonEnabled,
)
}
}
}
}

View file

@ -6,10 +6,11 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.RadioButton
import androidx.compose.material.RadioButtonDefaults
import androidx.compose.material.Text
@ -22,6 +23,7 @@ import androidx.compose.ui.unit.dp
import com.tangem.tap.common.compose.TangemTypography
import com.tangem.tap.features.details.redux.SecurityOption
import com.tangem.tap.features.details.ui.common.DetailsMainButton
import com.tangem.tap.features.details.ui.common.ScreenTitle
import com.tangem.tap.features.details.ui.common.SettingsScreensScaffold
import com.tangem.wallet.R
@ -33,7 +35,7 @@ fun SecurityModeScreen(
) {
SettingsScreensScaffold(
content = { SecurityModeOptions(state = state, modifier = modifier) },
titleRes = R.string.card_settings_security_mode,
// titleRes = R.string.card_settings_security_mode,
onBackClick = onBackPressed,
)
}
@ -47,10 +49,13 @@ fun SecurityModeOptions(
Column(
modifier = modifier
.fillMaxSize()
.padding(bottom = 28.dp)
.offset(y = (-16).dp),
.verticalScroll(rememberScrollState())
.padding(bottom = 28.dp),
verticalArrangement = Arrangement.SpaceBetween,
) {
ScreenTitle(titleRes = R.string.card_settings_security_mode, modifier.padding(bottom = 36.dp))
state.availableOptions.map {
SecurityOption(option = it, state = state, modifier = modifier)
}

View file

@ -3,7 +3,6 @@ package com.tangem.tap.features.send.redux.reducers
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.AmountType
import com.tangem.blockchain.common.Blockchain
import com.tangem.tap.common.extensions.fullNameWithoutTestnet
import com.tangem.tap.features.send.redux.FeeAction
import com.tangem.tap.features.send.redux.FeeActionUi
import com.tangem.tap.features.send.redux.SendScreenAction
@ -106,12 +105,17 @@ class FeeReducer : SendInternalReducer {
private fun getFeePrecision(sendState: SendState): FeePrecision {
val blockchain = sendState.walletManager?.wallet?.blockchain
return if (
(blockchain?.fullNameWithoutTestnet == Blockchain.Arbitrum.fullName ||
blockchain?.fullNameWithoutTestnet == Blockchain.Tron.fullName ||
blockchain?.fullNameWithoutTestnet == Blockchain.Gnosis.fullName) &&
sendState.amountState.typeOfAmount is AmountType.Token
) {
val amountType = sendState.amountState.typeOfAmount
val canBeLower = when (blockchain) {
Blockchain.Tron, Blockchain.TronTestnet -> amountType is AmountType.Token
Blockchain.Fantom, Blockchain.FantomTestnet -> amountType is AmountType.Token
Blockchain.Arbitrum, Blockchain.ArbitrumTestnet -> true
Blockchain.Stellar, Blockchain.StellarTestnet -> true
else -> false
}
return if (canBeLower) {
FeePrecision.CAN_BE_LOWER
} else {
FeePrecision.PRECISE

View file

@ -6,7 +6,17 @@ import com.tangem.tap.common.extensions.scaleToFiat
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.features.send.redux.ReceiptAction.RefreshReceipt
import com.tangem.tap.features.send.redux.SendScreenAction
import com.tangem.tap.features.send.redux.states.*
import com.tangem.tap.features.send.redux.states.AmountState
import com.tangem.tap.features.send.redux.states.FeeState
import com.tangem.tap.features.send.redux.states.MainCurrencyType
import com.tangem.tap.features.send.redux.states.ReceiptCrypto
import com.tangem.tap.features.send.redux.states.ReceiptFiat
import com.tangem.tap.features.send.redux.states.ReceiptLayoutType
import com.tangem.tap.features.send.redux.states.ReceiptState
import com.tangem.tap.features.send.redux.states.ReceiptSymbols
import com.tangem.tap.features.send.redux.states.ReceiptTokenCrypto
import com.tangem.tap.features.send.redux.states.ReceiptTokenFiat
import com.tangem.tap.features.send.redux.states.SendState
import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN
import com.tangem.tap.store
import java.math.BigDecimal
@ -91,7 +101,7 @@ class ReceiptReducer : SendInternalReducer {
if (feeState.feeIsIncluded) {
return ReceiptCrypto(
amountCrypto = amountState.amountToSendCrypto.minus(feeCrypto).stripZeroPlainString(),
feeCrypto = feeCrypto.stripZeroPlainString(),
feeCrypto = feeCrypto.stripZeroPlainString().addPrecisionSign(),
totalCrypto = amountState.amountToSendCrypto.stripZeroPlainString(),
feeFiat = feeFiat,
willSentFiat = convertToFiatPrecision(amountState.amountToSendCrypto),
@ -101,7 +111,7 @@ class ReceiptReducer : SendInternalReducer {
val totalCrypto = amountState.amountToSendCrypto.plus(feeCrypto)
return ReceiptCrypto(
amountCrypto = amountState.amountToSendCrypto.stripZeroPlainString(),
feeCrypto = feeCrypto.stripZeroPlainString(),
feeCrypto = feeCrypto.stripZeroPlainString().addPrecisionSign(),
totalCrypto = totalCrypto.stripZeroPlainString(),
feeFiat = feeFiat,
willSentFiat = convertToFiatPrecision(totalCrypto),
@ -125,8 +135,7 @@ class ReceiptReducer : SendInternalReducer {
val totalFiat = amountFiat.plus(feeFiat)
ReceiptTokenFiat(
amountFiat = amountFiat.scaleToFiat(true).stripZeroPlainString(),
feeFiat = feeFiat.scaleToFiat(true)
.stripZeroPlainString().addPrecisionSign(),
feeFiat = feeFiat.scaleToFiat(true).stripZeroPlainString().addPrecisionSign(),
totalFiat = totalFiat.scaleToFiat(true).stripZeroPlainString(),
willSentToken = tokensToSend.stripZeroPlainString(),
willSentFeeCoin = feeCoin.stripZeroPlainString(),

View file

@ -131,9 +131,7 @@ sealed class WalletAction : Action {
object Scan : WalletAction()
data class Send(val amount: Amount? = null) : WalletAction() {
data class ChooseCurrency(val amounts: List<Amount>?) : WalletAction()
}
data class Send(val amount: Amount? = null) : WalletAction()
object EmptyField : WalletAction(), ErrorAction {
override val error = TapError.PayIdEmptyField

View file

@ -12,7 +12,13 @@ import com.tangem.domain.common.extensions.withMainContext
import com.tangem.operations.attestation.Attestation
import com.tangem.operations.attestation.OnlineCardVerifier
import com.tangem.tap.common.analytics.Analytics
import com.tangem.tap.common.extensions.*
import com.tangem.tap.common.extensions.copyToClipboard
import com.tangem.tap.common.extensions.dispatchDebugErrorNotification
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.dispatchOpenUrl
import com.tangem.tap.common.extensions.onCardScanned
import com.tangem.tap.common.extensions.shareText
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.common.redux.navigation.AppScreen
@ -22,11 +28,11 @@ import com.tangem.tap.domain.loadedRates
import com.tangem.tap.features.demo.DemoHelper
import com.tangem.tap.features.home.redux.HomeAction
import com.tangem.tap.features.send.redux.PrepareSendScreen
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.models.PendingTransactionType
import com.tangem.tap.features.wallet.models.filterByCoin
import com.tangem.tap.features.wallet.models.getPendingTransactions
import com.tangem.tap.features.wallet.models.getSendableAmounts
import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.WalletData
import com.tangem.tap.features.wallet.redux.WalletState
@ -36,7 +42,6 @@ import com.tangem.tap.preferencesStorage
import com.tangem.tap.scope
import com.tangem.tap.store
import com.tangem.tap.tangemSdkManager
import java.math.BigDecimal
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
@ -44,6 +49,7 @@ import org.rekotlin.Action
import org.rekotlin.DispatchFunction
import org.rekotlin.Middleware
import timber.log.Timber
import java.math.BigDecimal
class WalletMiddleware {
private val tradeCryptoMiddleware = TradeCryptoMiddleware()
@ -276,7 +282,7 @@ class WalletMiddleware {
}
} else {
if (amounts?.size ?: 0 > 1) {
WalletAction.Send.ChooseCurrency(amounts)
WalletAction.DialogAction.ChooseCurrency(amounts)
} else {
val amountToSend = amounts?.first()
PrepareSendScreen(

View file

@ -2,7 +2,7 @@ ext.versions = [
kotlin : '1.6.10',
build_gradle : '7.1.3',
tangem_card_sdk : 'develop-159',
tangem_blockchain_sdk: 'develop-105',
tangem_blockchain_sdk: 'AND-2102-develop-105-hotfix_xlm-109',
// tangem_blockchain_sdk: '0.0.1',
]