Updated on 2026-08-14

This commit is contained in:
Tangem 2021-02-20 15:04:52 +03:00
parent 1f6b9ac469
commit 5c5d891014
11 changed files with 62 additions and 67 deletions

View file

@ -0,0 +1,46 @@
package com.tangem.tap.domain.termsOfUse
import android.content.res.Resources
import android.net.Uri
import androidx.core.os.ConfigurationCompat
import com.tangem.commands.common.card.Card
import java.util.*
/**
[REDACTED_AUTHOR]
*/
class CardTou {
private val locale: Locale = ConfigurationCompat.getLocales(Resources.getSystem().configuration).get(0)
fun getUrl(card: Card): Uri? {
val issuerName = card.cardData?.issuerName ?: return null
if (issuerName.toLowerCase() != "start2coin") return null
val baseUrl = "https://app.tangem.com/tou/"
val regionCode = regionCode(card.cardId) ?: "fr"
val filename = filename(locale.language, regionCode)
return Uri.parse(baseUrl + filename)
}
private fun filename(languageCode: String, regionCode: String): String {
return when {
languageCode == "fr" && regionCode == "ch" -> "Start2Coin-fr-ch-tangem.pdf"
languageCode == "de" && regionCode == "ch" -> "Start2Coin-de-ch-tangem.pdf"
languageCode == "en" && regionCode == "ch" -> "Start2Coin-en-ch-tangem.pdf"
languageCode == "it" && regionCode == "ch" -> "Start2Coin-it-ch-tangem.pdf"
languageCode == "fr" && regionCode == "fr" -> "Start2Coin-fr-fr-atangem.pdf"
languageCode == "de" && regionCode == "at" -> "Start2Coin-de-at-tangem.pdf"
languageCode.isEmpty() && regionCode == "fr" -> "Start2Coin-fr-fr-atangem.pdf"
languageCode.isEmpty() && regionCode == "ch" -> "Start2Coin-en-ch-tangem.pdf"
languageCode.isEmpty() && regionCode == "at" -> "Start2Coin-de-at-tangem.pdf"
else -> "Start2Coin-fr-fr-atangem.pdf"
}
}
private fun regionCode(cardId: String): String? = when (cardId.substring(2..3)) {
"0" -> "fr"
"1" -> "ch"
"2" -> "at"
else -> null
}
}

View file

@ -1,52 +0,0 @@
package com.tangem.tap.domain.termsOfUse
import android.content.res.Resources
import androidx.core.os.ConfigurationCompat
import java.util.*
/**
[REDACTED_AUTHOR]
*/
class TermsOfUse {
val locale: Locale = ConfigurationCompat.getLocales(Resources.getSystem().configuration).get(0)
fun getUrl(cardId: String): String? {
val terms = CardTermsFactory.create(cardId) ?: return null
return terms.getUrl(locale.country)
}
}
class CardTermsOfUse(
private val urlsByRegion: Map<String, String>,
private val defaultRegion: String,
) {
fun getUrl(region: String): String? {
return urlsByRegion[region.toLowerCase()] ?: urlsByRegion[defaultRegion]
}
}
class CardTermsFactory {
companion object {
fun create(cardId: String): CardTermsOfUse? {
val batch = cardId.substring(0..3)
return when (batch) {
"CB05" -> {
CardTermsOfUse(
mapOf(
"ru" to "https://yandex.ru/",
"en" to "https://www.google.com/",
"fr" to "https://www.qwant.com",
),
"ru"
)
}
else -> null
}
}
}
}

View file

@ -6,7 +6,7 @@ import com.tangem.commands.common.card.Card
import com.tangem.tap.common.redux.NotificationAction
import com.tangem.tap.common.redux.global.FiatCurrencyName
import com.tangem.tap.domain.tasks.ScanNoteResponse
import com.tangem.tap.domain.termsOfUse.TermsOfUse
import com.tangem.tap.domain.termsOfUse.CardTou
import com.tangem.tap.domain.twins.TwinCardNumber
import com.tangem.tap.features.details.redux.twins.CreateTwinWallet
import com.tangem.tap.network.coinmarketcap.FiatCurrency
@ -20,7 +20,7 @@ sealed class DetailsAction : Action {
val scanNoteResponse: ScanNoteResponse,
val wallet: Wallet?,
val isCreatingTwinWalletAllowed: Boolean?,
val termsOfUse: TermsOfUse,
val cardTou: CardTou,
val fiatCurrencyName: FiatCurrencyName,
val fiatCurrencies: List<FiatCurrencyName>? = null,
) : DetailsAction()

View file

@ -74,7 +74,7 @@ private fun handlePrepareScreen(action: DetailsAction.PrepareScreen, state: Deta
),
securityScreenState = SecurityScreenState(currentOption = securityOption),
createTwinWalletState = twinsState,
cardTermsOfUseUrl = action.termsOfUse.getUrl(action.card.cardId)
cardTermsOfUseUrl = action.cardTou.getUrl(action.card)
)
}

View file

@ -1,5 +1,6 @@
package com.tangem.tap.features.details.redux
import android.net.Uri
import com.tangem.blockchain.common.Wallet
import com.tangem.commands.common.card.Card
import com.tangem.tap.common.entities.Button
@ -19,13 +20,13 @@ data class DetailsState(
val confirmScreenState: ConfirmScreenState? = null,
val securityScreenState: SecurityScreenState? = null,
val createTwinWalletState: CreateTwinWalletState? = null,
val cardTermsOfUseUrl: String? = null
val cardTermsOfUseUrl: Uri? = null,
) : StateType
data class CardInfo(
val cardId: String,
val issuer: String,
val signedHashes: Int
val signedHashes: Int,
)
enum class EraseWalletState { Allowed, NotAllowedByCard, NotEmpty }
@ -34,7 +35,7 @@ data class SecurityScreenState(
val currentOption: SecurityOption = SecurityOption.LongTap,
val selectedOption: SecurityOption = currentOption,
val allowedOptions: EnumSet<SecurityOption> = EnumSet.allOf(SecurityOption::class.java),
val buttonProceed: Button = Button(true)
val buttonProceed: Button = Button(true),
)
enum class SecurityOption { LongTap, PassCode, AccessCode }

View file

@ -1,7 +1,6 @@
package com.tangem.tap.features.details.ui
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.activity.OnBackPressedCallback
@ -85,7 +84,7 @@ class DetailsFragment : Fragment(R.layout.fragment_details), StoreSubscriber<Det
tv_card_tou.show(state.cardTermsOfUseUrl != null)
tv_card_tou.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(state.cardTermsOfUseUrl)
intent.data = state.cardTermsOfUseUrl
startActivity(intent)
}

View file

@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.transition.TransitionInflater
import com.google.android.material.snackbar.Snackbar
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.store
@ -30,6 +31,9 @@ abstract class BaseStoreFragment(layoutId: Int) : Fragment(layoutId) {
store.dispatch(NavigationAction.PopBackTo())
}
})
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.slide_right)
exitTransition = inflater.inflateTransition(R.transition.fade)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

View file

@ -22,7 +22,6 @@ import com.tangem.tap.common.qrCodeScan.ScanQrCodeActivity
import com.tangem.tap.common.snackBar.MaxAmountSnackbar
import com.tangem.tap.common.text.truncateMiddleWith
import com.tangem.tap.common.toggleWidget.*
import com.tangem.tap.domain.termsOfUse.TermsOfUse
import com.tangem.tap.features.send.BaseStoreFragment
import com.tangem.tap.features.send.redux.*
import com.tangem.tap.features.send.redux.AddressPayIdActionUi.*
@ -72,8 +71,6 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) {
setupAmountLayout()
setupFeeLayout()
val locale = TermsOfUse().locale
btnSend.setOnClickListener {
store.dispatch(SendActionUi.SendAmountToRecipient(
Message(getString(R.string.initial_message_sign_header))

View file

@ -18,7 +18,7 @@ import com.tangem.blockchain.common.address.AddressType
import com.tangem.tap.common.extensions.*
import com.tangem.tap.common.redux.navigation.AppScreen
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.domain.termsOfUse.TermsOfUse
import com.tangem.tap.domain.termsOfUse.CardTou
import com.tangem.tap.domain.twins.TwinCardNumber
import com.tangem.tap.features.details.redux.DetailsAction
import com.tangem.tap.features.wallet.redux.*
@ -313,7 +313,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
scanNoteResponse.card, scanNoteResponse,
store.state.walletState.wallet,
store.state.globalState.configManager?.config?.isCreatingTwinCardsAllowed,
TermsOfUse(),
CardTou(),
store.state.globalState.appCurrency
))
store.dispatch(NavigationAction.NavigateTo(AppScreen.Details))

View file

@ -139,7 +139,7 @@
app:drawableEndCompat="@drawable/ic_angle_bracket_right"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_disclaimer"
android:text="@string/details_terms_of_use" />
android:text="@string/details_row_title_card_tou" />
<TextView
android:id="@+id/tv_settings_title"

View file

@ -27,7 +27,7 @@ this wallet.
<string name="details_twins_recreate_subtitle" translatable="false">The wallet creation procedure consists of three steps. You must complete it to the end, otherwise you will have to start from the beginning.</string>
<string name="details_twins_recreate_button_format" translatable="false">Tap the card #%s</string>
<string name="details_twins_recreate_alert" translatable="false">You have already started the process of recreating twin wallet. If you interrupt it, you won\'t be able to use your twin cards until you start it again and complete recreating the wallet.</string>
<string name="details_terms_of_use" translatable="false">Terms of use</string>
<string name="details_row_title_card_tou" translatable="false">Card terms of use</string>
<string name="notification_twins_recreate_success" translatable="false">The twin address was successfully created</string>