diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 59ee0bff06..f50133547b 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 59ee0bff06ee54f3202421c28f7fb6e3d421dad8 +Subproject commit f50133547b5e19fb7ad32e64370573d60f6791fd diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 8af2818c0a..9af6c88b29 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -22,6 +22,7 @@ import com.tangem.tap.features.onboarding.products.wallet.ui.dialogs.UnfinishedB import com.tangem.tap.features.wallet.redux.WalletDialog import com.tangem.tap.features.wallet.ui.dialogs.AmountToSendBottomSheetDialog import com.tangem.tap.features.wallet.ui.dialogs.ChooseTradeActionBottomSheetDialog +import com.tangem.tap.features.wallet.ui.dialogs.RussianCardholdersWarningBottomSheetDialog import com.tangem.tap.features.wallet.ui.dialogs.ScanFailsDialog import com.tangem.tap.features.wallet.ui.dialogs.SignedHashesWarningDialog import com.tangem.tap.features.wallet.ui.dialogs.SimpleOkDialog @@ -115,6 +116,8 @@ class DialogManager : StoreSubscriber { AmountToSendBottomSheetDialog(context, state.dialog) is WalletDialog.SignedHashesMultiWalletDialog -> SignedHashesWarningDialog.create(context) + is WalletDialog.RussianCardholdersWarningDialog -> + RussianCardholdersWarningBottomSheetDialog(context) else -> null } dialog?.show() diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 540209a39c..a82d5ba94b 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -85,4 +85,8 @@ sealed class GlobalAction : Action { object Update : GlobalAction() } + + object FetchUserCountry : GlobalAction() { + data class Success(val countryCode: String) : GlobalAction() + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index ea77ce5ed9..7f61d63022 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -4,13 +4,14 @@ import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.common.extensions.ifNotNull +import com.tangem.common.services.Result import com.tangem.domain.common.extensions.withMainContext -import com.tangem.tap.* import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState +import com.tangem.tap.currenciesRepository import com.tangem.tap.domain.configurable.warningMessage.WarningMessagesManager import com.tangem.tap.features.send.redux.SendAction import com.tangem.tap.features.wallet.redux.WalletAction @@ -18,6 +19,11 @@ import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.network.exchangeServices.mercuryo.MercuryoApi import com.tangem.tap.network.exchangeServices.mercuryo.MercuryoService import com.tangem.tap.network.exchangeServices.moonpay.MoonPayService +import com.tangem.tap.preferencesStorage +import com.tangem.tap.scope +import com.tangem.tap.store +import com.tangem.tap.tangemSdkManager +import java.util.Locale import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.DispatchFunction @@ -134,5 +140,26 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di } } } + is GlobalAction.FetchUserCountry -> { + scope.launch { + val techService = store.state.domainNetworks.tangemTechService + when (val result = techService.userCountry()) { + is Result.Success -> { + store.dispatch( + GlobalAction.FetchUserCountry.Success( + countryCode = result.data.code.lowercase() + ) + ) + } + is Result.Failure -> { + store.dispatch( + GlobalAction.FetchUserCountry.Success( + countryCode = Locale.getDefault().country.lowercase() + ) + ) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index 681d1f758a..449d47ae10 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -75,7 +75,9 @@ fun globalReducer(action: Action, state: AppState): GlobalState { } is GlobalAction.SetIfCardVerifiedOnline -> globalState.copy(cardVerifiedOnline = action.verified) - + is GlobalAction.FetchUserCountry.Success -> globalState.copy( + userCountryCode = action.countryCode + ) else -> globalState } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index 48591606c1..8588256411 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -28,6 +28,7 @@ data class GlobalState( val exchangeManager: CurrencyExchangeManager? = null, val resources: AndroidResources = AndroidResources(), val analyticsHandlers: AnalyticsHandler? = null, + val userCountryCode: String? = null, ) : StateType diff --git a/app/src/main/java/com/tangem/tap/features/home/RegionProvider.kt b/app/src/main/java/com/tangem/tap/features/home/RegionProvider.kt index 17a5076984..22cac042e5 100644 --- a/app/src/main/java/com/tangem/tap/features/home/RegionProvider.kt +++ b/app/src/main/java/com/tangem/tap/features/home/RegionProvider.kt @@ -44,5 +44,7 @@ class TelephonyManagerRegionProvider(context: Context) : RegionProvider { } class LocaleRegionProvider : RegionProvider { - override fun getRegion(): String? = Locale.current.region -} \ No newline at end of file + override fun getRegion(): String = Locale.current.region +} + +const val RUSSIA_COUNTRY_CODE = "ru" \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 8a3878556d..0edb0a435b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -15,6 +15,7 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.FragmentShareTransition import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.home.redux.HomeMiddleware.Companion.BUY_WALLET_URL import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction @@ -35,7 +36,7 @@ class HomeMiddleware { } } -private val homeMiddleware: Middleware = { dispatch, state -> +private val homeMiddleware: Middleware = { _, _ -> { next -> { action -> when (action) { @@ -43,6 +44,7 @@ private val homeMiddleware: Middleware = { dispatch, state -> store.dispatch(GlobalAction.RestoreAppCurrency) store.dispatch(GlobalAction.ExchangeManager.Init) store.dispatch(HomeAction.SetTermsOfUseState(preferencesStorage.wasDisclaimerAccepted())) + store.dispatch(GlobalAction.FetchUserCountry) } is HomeAction.ShouldScanCardOnResume -> { if (action.shouldScanCard) { @@ -55,8 +57,8 @@ private val homeMiddleware: Middleware = { dispatch, state -> // store.dispatch(NavigationAction.NavigateTo(AppScreen.AddCustomTokens)) } is HomeAction.GoToShop -> { - when (action.regionProvider.getRegion()?.toLowerCase()) { - "ru" -> store.dispatchOpenUrl(BUY_WALLET_URL) + when (action.regionProvider.getRegion()?.lowercase()) { + RUSSIA_COUNTRY_CODE -> store.dispatchOpenUrl(BUY_WALLET_URL) else -> store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) } store.state.globalState.analyticsHandlers?.triggerEvent( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 769d28a8cd..c90af2af53 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -145,6 +145,7 @@ sealed class WalletAction : Action { object SignedHashesMultiWalletDialog : DialogAction() object ChooseTradeActionDialog : DialogAction() data class ChooseCurrency(val amounts: List?) : DialogAction() + object RussianCardholdersWarningDialog : DialogAction() object Hide : DialogAction() } @@ -155,8 +156,10 @@ sealed class WalletAction : Action { object EmptyWallet : WalletAction() sealed class TradeCryptoAction : WalletAction() { - object Buy : TradeCryptoAction() object Sell : TradeCryptoAction() + data class Buy( + val checkUserLocation: Boolean = true, + ) : TradeCryptoAction() data class FinishSelling(val transactionId: String) : TradeCryptoAction() data class SendCrypto( val currencyId: String, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index 26224eb41e..1bbf3366a6 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -1,7 +1,12 @@ package com.tangem.tap.features.wallet.redux import android.graphics.Bitmap -import com.tangem.blockchain.common.* +import com.tangem.blockchain.common.Amount +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.DerivationStyle +import com.tangem.blockchain.common.Token +import com.tangem.blockchain.common.Wallet +import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType import com.tangem.common.extensions.isZero import com.tangem.domain.common.extensions.canHandleToken @@ -17,15 +22,21 @@ import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState import com.tangem.tap.features.tokens.redux.TokenWithBlockchain -import com.tangem.tap.features.wallet.models.* +import com.tangem.tap.features.wallet.models.PendingTransaction +import com.tangem.tap.features.wallet.models.TotalBalance +import com.tangem.tap.features.wallet.models.WalletRent +import com.tangem.tap.features.wallet.models.WalletWarning +import com.tangem.tap.features.wallet.models.hasPendingTransactions +import com.tangem.tap.features.wallet.models.hasSendableAmounts +import com.tangem.tap.features.wallet.models.isSendableAmount import com.tangem.tap.features.wallet.redux.reducers.calculateTotalFiatAmount import com.tangem.tap.features.wallet.redux.reducers.findProgressState import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.store -import org.rekotlin.StateType import java.math.BigDecimal +import org.rekotlin.StateType import kotlin.properties.ReadOnlyProperty data class WalletState( @@ -317,6 +328,7 @@ sealed interface WalletDialog : StateDialog { val currenciesList: List, val currentAppCurrency: FiatCurrency, ) : WalletDialog + object RussianCardholdersWarningDialog : WalletDialog } enum class ProgressState : WidgetState { Loading, Refreshing, Done, Error } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 3ff2589348..ebbaae8538 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -8,6 +8,7 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.demo.DemoHelper +import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.send.redux.PrepareSendScreen import com.tangem.tap.features.send.redux.SendAction import com.tangem.tap.features.wallet.redux.Currency @@ -24,33 +25,34 @@ class TradeCryptoMiddleware { if (DemoHelper.tryHandle(state, action)) return when (action) { - is WalletAction.TradeCryptoAction.Buy -> startExchange(action) - is WalletAction.TradeCryptoAction.Sell -> startExchange(action) + is WalletAction.TradeCryptoAction.Buy -> proceedBuyAction(state, action) + is WalletAction.TradeCryptoAction.Sell -> proceedSellAction() is WalletAction.TradeCryptoAction.SendCrypto -> preconfigureAndOpenSendScreen(action) is WalletAction.TradeCryptoAction.FinishSelling -> openReceiptUrl(action.transactionId) } } - private fun startExchange(action: WalletAction.TradeCryptoAction) { - val selectedWalletData = store.state.walletState.getSelectedWalletData() - val exchangeManager = store.state.globalState.exchangeManager ?: return - val addresses = selectedWalletData?.walletAddresses ?: return - if (addresses.list.isEmpty()) return - val appCurrency = store.state.globalState.appCurrency - - val defaultAddress = addresses.list[0].address - val currency = selectedWalletData.currency - val currencySymbol = selectedWalletData.currency.currencySymbol - - val exchangeAction = if (action is WalletAction.TradeCryptoAction.Buy) { - CurrencyExchangeManager.Action.Buy - } else { - CurrencyExchangeManager.Action.Sell + private fun proceedBuyAction( + state: () -> AppState?, + action: WalletAction.TradeCryptoAction.Buy, + ) { + if (action.checkUserLocation && state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE) { + store.dispatchOnMain( + WalletAction.DialogAction.RussianCardholdersWarningDialog + ) + return } - if (exchangeAction == CurrencyExchangeManager.Action.Buy && - currency is Currency.Token && currency.blockchain.isTestnet() - ) { + val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return + val exchangeManager = store.state.globalState.exchangeManager ?: return + val appCurrency = store.state.globalState.appCurrency + + val addresses = selectedWalletData.walletAddresses?.list.orEmpty() + if (addresses.isEmpty()) return + + val currency = selectedWalletData.currency + + if (currency is Currency.Token && currency.blockchain.isTestnet()) { val walletManager = store.state.walletState.getWalletManager(currency) if (walletManager !is EthereumWalletManager) { store.dispatchDebugErrorNotification("Testnet tokens available only for the Ethereum") @@ -62,13 +64,31 @@ class TradeCryptoMiddleware { } exchangeManager.getUrl( - action = exchangeAction, + action = CurrencyExchangeManager.Action.Buy, blockchain = currency.blockchain, - cryptoCurrencyName = currencySymbol, + cryptoCurrencyName = currency.currencySymbol, fiatCurrencyName = appCurrency.code, - walletAddress = defaultAddress + walletAddress = addresses[0].address )?.let { store.dispatchOnMain(NavigationAction.OpenUrl(it)) } + } + private fun proceedSellAction() { + val selectedWalletData = store.state.walletState.getSelectedWalletData() ?: return + val exchangeManager = store.state.globalState.exchangeManager ?: return + val appCurrency = store.state.globalState.appCurrency + + val addresses = selectedWalletData.walletAddresses?.list.orEmpty() + if (addresses.isEmpty()) return + + val currency = selectedWalletData.currency + + exchangeManager.getUrl( + action = CurrencyExchangeManager.Action.Sell, + blockchain = currency.blockchain, + cryptoCurrencyName = currency.currencySymbol, + fiatCurrencyName = appCurrency.code, + walletAddress = addresses[0].address + )?.let { store.dispatchOnMain(NavigationAction.OpenUrl(it)) } } private fun preconfigureAndOpenSendScreen(action: WalletAction.TradeCryptoAction.SendCrypto) { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt index e495c55c94..e760c446f2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt @@ -27,10 +27,13 @@ class WalletDialogsMiddleware { is WalletAction.DialogAction.ChooseCurrency -> { store.dispatchDialogShow( WalletDialog.SelectAmountToSendDialog( - amounts = action.amounts + amounts = action.amounts ) ) } + is WalletAction.DialogAction.RussianCardholdersWarningDialog -> { + store.dispatchDialogShow(WalletDialog.RussianCardholdersWarningDialog) + } is WalletAction.DialogAction.Hide -> { store.dispatchDialogHide() } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index d5bd095cbc..1cf3a038b2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -91,7 +91,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), private fun setupButtons() = with(binding) { rowButtons.onBuyClick = { - store.dispatch(WalletAction.TradeCryptoAction.Buy) + store.dispatch(WalletAction.TradeCryptoAction.Buy()) } rowButtons.onSellClick = { store.dispatch(WalletAction.TradeCryptoAction.Sell) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ChooseTradeActionBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ChooseTradeActionBottomSheetDialog.kt index 1c65315d3a..397231a58c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ChooseTradeActionBottomSheetDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/ChooseTradeActionBottomSheetDialog.kt @@ -27,7 +27,7 @@ class ChooseTradeActionBottomSheetDialog(context: Context) : BottomSheetDialog(c } binding!!.dialogBtnBuy.setOnClickListener { - store.dispatch(WalletAction.TradeCryptoAction.Buy) + store.dispatch(WalletAction.TradeCryptoAction.Buy()) dismiss() } binding!!.dialogBtnSell.setOnClickListener { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt new file mode 100644 index 0000000000..a41dce9228 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt @@ -0,0 +1,44 @@ +package com.tangem.tap.features.wallet.ui.dialogs + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.tangem.tap.common.extensions.dispatchDialogHide +import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.store +import com.tangem.wallet.databinding.DialogRussiansCardholdersWarningBinding + +class RussianCardholdersWarningBottomSheetDialog(context: Context) : BottomSheetDialog(context) { + + private var binding: DialogRussiansCardholdersWarningBinding? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DialogRussiansCardholdersWarningBinding + .inflate(LayoutInflater.from(context)) + .also { setContentView(it.root) } + } + + override fun show() { + super.show() + setOnDismissListener { + binding = null + store.dispatchDialogHide() + } + + binding?.btnYes?.setOnClickListener { + store.dispatch(WalletAction.TradeCryptoAction.Buy(checkUserLocation = false)) + dismiss() + } + binding?.btnNo?.setOnClickListener { + store.dispatch(NavigationAction.OpenUrl(INSTRUCTION_URL)) + dismiss() + } + } + + companion object { + private const val INSTRUCTION_URL = "https://tangem.com/howtobuy.html" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt index 19815ccfe7..7c431c33b7 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt @@ -149,7 +149,7 @@ class SingleWalletView : WalletView { val allowedToBuy = tradeCryptoState.isAvailableToBuy() val allowedToSell = tradeCryptoState.isAvailableToSell() val action = when { - allowedToBuy && !allowedToSell -> WalletAction.TradeCryptoAction.Buy + allowedToBuy && !allowedToSell -> WalletAction.TradeCryptoAction.Buy() !allowedToBuy && allowedToSell -> WalletAction.TradeCryptoAction.Sell allowedToBuy && allowedToSell -> WalletAction.DialogAction.ChooseTradeActionDialog else -> null diff --git a/app/src/main/res/drawable/ic_cross_rounded_24.xml b/app/src/main/res/drawable/ic_cross_rounded_24.xml new file mode 100644 index 0000000000..ad1cab5a84 --- /dev/null +++ b/app/src/main/res/drawable/ic_cross_rounded_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/img_flag_ru_24.xml b/app/src/main/res/drawable/img_flag_ru_24.xml new file mode 100644 index 0000000000..deff0dc4bb --- /dev/null +++ b/app/src/main/res/drawable/img_flag_ru_24.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/layout/dialog_russians_cardholders_warning.xml b/app/src/main/res/layout/dialog_russians_cardholders_warning.xml new file mode 100644 index 0000000000..8f2196c2d5 --- /dev/null +++ b/app/src/main/res/layout/dialog_russians_cardholders_warning.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 97c8b2d0af..3e7c059c3a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,6 +1,5 @@ - Nein Änderungen speichern Warnung Erneut versuchen @@ -196,4 +195,4 @@ RECHTLICHER HAFTUNGSAUSSCHLUSS Um %s XTZ reduzieren Nein, alles senden - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9e6777a914..069163f054 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,6 @@ - Non Sauvegarder les modifications Alerte Réessayer @@ -188,4 +187,4 @@ Avertissement Réduire de% s XTZ Non, envoyer toute la somme - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a7011d4bcc..7ad1cddc70 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,7 +1,6 @@ - No Mantieni le modifiche Avviso Riprova @@ -195,4 +194,4 @@ Questa nota legale è stata modificata l\'ultima volta 01.10.2020. Riduci di %s XTZ No, invia l\'intero importo - \ No newline at end of file + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3712df8712..1e7e892972 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,6 @@ Tangem - Нет Сохранить изменения Предупреждение Повторить попытку @@ -382,4 +381,5 @@ Привет, команда поддержки, Пожалуйста, расскажите нам больше о Вашей проблеме. Каждая деталь может быть полезной. Информация ниже не является обязательной. Вы можете стереть её, если хотите. + Нет diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index 201a1684ae..cd706ff8af 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -50,4 +50,21 @@ В сумме учтены не все монеты Управление токенами Нет цены + + Скрыть токен + Скрыть %s + Скрыть + Вы скрываете токен с главного экрана, но в любой момент сможете добавить его обратно. + Невозможно скрыть %s + Токен %s является основной валютой в сети %s и не может быть скрыт, до тех пор пока у вас в списке есть другие токены этой сети. + + Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. + Сеть %s + + Бэкап кошелька не был произведен + Чтобы защитить свои активы, мы советуем вам выполнить эту процедуру + + Карты банков РФ в данный момент не принимаются + У вас есть карта банка другой страны или платежной системы UnionPay? + Да diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 520b7bc183..5a05ac5fae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,6 @@ Tangem - No Save changes Warning Retry diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index d59d31ff0e..3a16ec6ea0 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -50,4 +50,23 @@ The amount does not include some of your funds Manage tokens No rate + + Hide token + Hide %s + Hide + You are about to hide this token from the main screen. You can add it back anytime. + Unable to hide %s + The %s token is the main currency on the %s network and cannot be hidden as long as you have other tokens on this network in the list. + + %s network not found. Please, add it first and try again. + %s network + + Your wallet has not been backed up + To protect your assets, we advise you to carry out this procedure + Remove token + + Russian bank cards are not accepted at the moment + Do you have a bank card of another country or a UnionPay card? + Yes + No diff --git a/network/src/main/java/com/tangem/network/api/tangemTech/Responses.kt b/network/src/main/java/com/tangem/network/api/tangemTech/Responses.kt index c21fb92726..9a4b2cd8b1 100644 --- a/network/src/main/java/com/tangem/network/api/tangemTech/Responses.kt +++ b/network/src/main/java/com/tangem/network/api/tangemTech/Responses.kt @@ -43,4 +43,8 @@ data class CurrenciesResponse(val currencies: List) { val unit: String, // $, €, ₽ val type: String, ) : TangemTechResponse -} \ No newline at end of file +} + +data class GeoResponse( + val code: String +) : TangemTechResponse \ No newline at end of file diff --git a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechApi.kt b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechApi.kt index 0081f4ee24..80558732dd 100644 --- a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechApi.kt +++ b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechApi.kt @@ -27,4 +27,6 @@ interface TangemTechApi { @GET("currencies") suspend fun currencies(): CurrenciesResponse + @GET("geo") + suspend fun geo(): GeoResponse } \ No newline at end of file diff --git a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt index 5790bdac3a..3bf3bd232e 100644 --- a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt +++ b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt @@ -47,6 +47,10 @@ class TangemTechService { } } + suspend fun userCountry(): Result = withContext(Dispatchers.IO) { + performRequest { api.geo() } + } + suspend fun currencies(): Result = withContext(Dispatchers.IO) { performRequest { api.currencies() } }