Updated on 2026-08-14
This commit is contained in:
commit
5be25a5c29
58 changed files with 959 additions and 289 deletions
|
|
@ -67,9 +67,9 @@ dependencies {
|
|||
implementation 'com.google.android.material:material:1.2.1'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
|
||||
|
||||
implementation 'com.tangem:blockchain:1.74.0'
|
||||
implementation 'com.tangem:core:1.63.0'
|
||||
implementation 'com.tangem:sdk:1.63.0'
|
||||
implementation 'com.tangem:blockchain:1.83.0'
|
||||
implementation 'com.tangem:core:1.68.0'
|
||||
implementation 'com.tangem:sdk:1.68.0'
|
||||
|
||||
//lifecycle
|
||||
implementation "androidx.lifecycle:lifecycle-runtime:2.2.0"
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen
|
|||
import com.tangem.tap.features.details.ui.DetailsConfirmFragment
|
||||
import com.tangem.tap.features.details.ui.DetailsFragment
|
||||
import com.tangem.tap.features.details.ui.DetailsSecurityFragment
|
||||
import com.tangem.tap.features.disclaimer.ui.DisclaimerFragment
|
||||
import com.tangem.tap.features.home.HomeFragment
|
||||
import com.tangem.tap.features.send.ui.SendFragment
|
||||
import com.tangem.tap.features.wallet.ui.WalletFragment
|
||||
|
|
@ -42,5 +43,6 @@ private fun fragmentFactory(screen: AppScreen): Fragment {
|
|||
AppScreen.Details -> DetailsFragment()
|
||||
AppScreen.DetailsConfirm -> DetailsConfirmFragment()
|
||||
AppScreen.DetailsSecurity -> DetailsSecurityFragment()
|
||||
AppScreen.Disclaimer -> DisclaimerFragment()
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.tangem.tap.common.redux
|
|||
import com.tangem.tap.common.redux.global.globalReducer
|
||||
import com.tangem.tap.common.redux.navigation.NavigationReducer
|
||||
import com.tangem.tap.features.details.redux.DetailsReducer
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerReducer
|
||||
import com.tangem.tap.features.home.redux.HomeReducer
|
||||
import com.tangem.tap.features.send.redux.reducers.SendScreenReducer
|
||||
import com.tangem.tap.features.wallet.redux.WalletReducer
|
||||
|
|
@ -18,7 +19,8 @@ fun appReducer(action: Action, state: AppState?): AppState {
|
|||
homeState = HomeReducer.reduce(action, state),
|
||||
walletState = WalletReducer.reduce(action, state),
|
||||
sendState = SendScreenReducer.reduce(action, state.sendState),
|
||||
detailsState = DetailsReducer.reduce(action, state)
|
||||
detailsState = DetailsReducer.reduce(action, state),
|
||||
disclaimerState = DisclaimerReducer.reduce(action, state)
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ import com.tangem.tap.common.redux.navigation.NavigationState
|
|||
import com.tangem.tap.common.redux.navigation.navigationMiddleware
|
||||
import com.tangem.tap.features.details.redux.DetailsMiddleware
|
||||
import com.tangem.tap.features.details.redux.DetailsState
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerMiddleware
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerState
|
||||
import com.tangem.tap.features.home.redux.HomeState
|
||||
import com.tangem.tap.features.home.redux.homeMiddleware
|
||||
import com.tangem.tap.features.send.redux.middlewares.sendMiddleware
|
||||
|
|
@ -21,7 +23,8 @@ data class AppState(
|
|||
val homeState: HomeState = HomeState(),
|
||||
val walletState: WalletState = WalletState(),
|
||||
val sendState: SendState = SendState(),
|
||||
val detailsState: DetailsState = DetailsState()
|
||||
val detailsState: DetailsState = DetailsState(),
|
||||
val disclaimerState: DisclaimerState = DisclaimerState()
|
||||
) : StateType {
|
||||
|
||||
companion object {
|
||||
|
|
@ -29,7 +32,8 @@ data class AppState(
|
|||
return listOf(
|
||||
logMiddleware, navigationMiddleware, notificationsMiddleware, globalMiddleware,
|
||||
homeMiddleware, walletMiddleware, sendMiddleware,
|
||||
DetailsMiddleware().detailsMiddleware
|
||||
DetailsMiddleware().detailsMiddleware,
|
||||
DisclaimerMiddleware().disclaimerMiddleware
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,5 @@ sealed class GlobalAction : Action {
|
|||
object RestoreAppCurrency : GlobalAction() {
|
||||
data class Success(val appCurrency: FiatCurrencyName) : GlobalAction()
|
||||
}
|
||||
data class UpdateWalletSignedHashes(val walletSignedHashes: Int) : GlobalAction()
|
||||
data class UpdateWalletSignedHashes(val walletSignedHashes: Int?) : GlobalAction()
|
||||
}
|
||||
|
|
@ -9,4 +9,4 @@ data class NavigationState(
|
|||
val activity: WeakReference<FragmentActivity>? = null
|
||||
) : StateType
|
||||
|
||||
enum class AppScreen { Home, Wallet, Send, Details, DetailsConfirm, DetailsSecurity }
|
||||
enum class AppScreen { Home, Wallet, Send, Details, DetailsConfirm, DetailsSecurity, Disclaimer }
|
||||
|
|
@ -10,9 +10,9 @@ import java.util.regex.Pattern
|
|||
class DecimalDigitsInputFilter(
|
||||
digitsBeforeDecimal: Int,
|
||||
digitsAfterDecimal: Int,
|
||||
decimalSeparator: String
|
||||
private val decimalSeparator: String
|
||||
) : InputFilter {
|
||||
private val pattern: Pattern = Pattern.compile("(([1-9]{1}[0-9]{0,${digitsBeforeDecimal -1}})?||[0]{1})((\\$decimalSeparator[0-9]{0,$digitsAfterDecimal})?)||(\\$decimalSeparator)?")
|
||||
private val pattern: Pattern = Pattern.compile("(([1-9]{1}[0-9]{0,${digitsBeforeDecimal - 1}})?||[0]{1})((\\$decimalSeparator[0-9]{0,$digitsAfterDecimal})?)||(\\$decimalSeparator)?")
|
||||
|
||||
override fun filter(source: CharSequence, sourceStart: Int, sourceEnd: Int, destination: Spanned, destinationStart: Int, destinationEnd: Int): CharSequence? {
|
||||
val destString = destination.toString()
|
||||
|
|
@ -24,7 +24,27 @@ class DecimalDigitsInputFilter(
|
|||
val resultSuffix = newDestination.substring(destinationStart, newDestination.length)
|
||||
val result = resultPrefix + source.toString() + resultSuffix
|
||||
|
||||
val hasMatches = pattern.matcher(result).matches()
|
||||
return if (hasMatches) null else ""
|
||||
return if (pattern.matcher(result).matches()) {
|
||||
null
|
||||
} else {
|
||||
val replacedWithAppropriateDecimalSeparator = setDecimalSeparator(result, decimalSeparator)
|
||||
if (pattern.matcher(replacedWithAppropriateDecimalSeparator).matches()) {
|
||||
decimalSeparator
|
||||
} else {
|
||||
""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun setDecimalSeparator(value: String, decimalSeparator: String): String {
|
||||
if (value.contains(decimalSeparator)) return value
|
||||
|
||||
return if (decimalSeparator == ".") {
|
||||
value.replace(",", decimalSeparator)
|
||||
} else {
|
||||
value.replace(".", decimalSeparator)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,17 +24,17 @@ class TangemSdkManager(val activity: ComponentActivity) {
|
|||
|
||||
suspend fun scanNote(): CompletionResult<ScanNoteResponse> {
|
||||
return runTaskAsyncReturnOnMain(ScanNoteTask(),
|
||||
initialMessage = Message(activity.getString(R.string.tap_to_scan)))
|
||||
initialMessage = Message(activity.getString(R.string.initial_message_scan_header)))
|
||||
}
|
||||
|
||||
suspend fun createWallet(cardId: String?): CompletionResult<ScanNoteResponse> {
|
||||
return runTaskAsyncReturnOnMain(CreateWalletAndRescanTask(), cardId,
|
||||
initialMessage = Message(activity.getString(R.string.tap_to_create_wallet)))
|
||||
initialMessage = Message(activity.getString(R.string.initial_message_create_wallet_body)))
|
||||
}
|
||||
|
||||
suspend fun eraseWallet(cardId: String?): CompletionResult<PurgeWalletResponse> {
|
||||
return runTaskAsyncReturnOnMain(PurgeWalletCommand(), cardId,
|
||||
initialMessage = Message(activity.getString(R.string.tap_to_purge_wallet)))
|
||||
initialMessage = Message(activity.getString(R.string.initial_message_purge_wallet_body)))
|
||||
}
|
||||
|
||||
suspend fun setPasscode(cardId: String?): CompletionResult<SetPinResponse> {
|
||||
|
|
@ -42,7 +42,7 @@ class TangemSdkManager(val activity: ComponentActivity) {
|
|||
pinType = PinType.Pin2,
|
||||
newPin1 = tangemSdk.config.defaultPin1.calculateSha256(),
|
||||
newPin2 = null
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.tap_to_change_passcode)))
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.initial_message_change_passcode_body)))
|
||||
}
|
||||
|
||||
suspend fun setAccessCode(cardId: String?): CompletionResult<SetPinResponse> {
|
||||
|
|
@ -50,7 +50,7 @@ class TangemSdkManager(val activity: ComponentActivity) {
|
|||
pinType = PinType.Pin1,
|
||||
newPin1 = null,
|
||||
newPin2 = tangemSdk.config.defaultPin2.calculateSha256()
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.tap_to_change_access_code)))
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.initial_message_change_access_code_body)))
|
||||
}
|
||||
|
||||
suspend fun setLongTap(cardId: String?): CompletionResult<SetPinResponse> {
|
||||
|
|
@ -58,7 +58,7 @@ class TangemSdkManager(val activity: ComponentActivity) {
|
|||
pinType = PinType.Pin1,
|
||||
newPin1 = tangemSdk.config.defaultPin1.calculateSha256(),
|
||||
newPin2 = tangemSdk.config.defaultPin2.calculateSha256()
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.tap_the_card)))
|
||||
), cardId, initialMessage = Message(activity.getString(R.string.initial_message_tap_header)))
|
||||
}
|
||||
|
||||
private suspend fun <T : CommandResponse> runTaskAsync(
|
||||
|
|
|
|||
|
|
@ -20,22 +20,22 @@ sealed class TapError(
|
|||
override val args: List<Any>? = null
|
||||
) : Throwable(), TapErrors, ArgError {
|
||||
|
||||
object UnknownError : TapError(R.string.error_unknown)
|
||||
object PayIdAlreadyCreated : TapError(R.string.error_payid_already_created)
|
||||
object PayIdCreatingError : TapError(R.string.error_creating_payid)
|
||||
object UnknownError : TapError(R.string.send_error_unknown)
|
||||
object PayIdAlreadyCreated : TapError(R.string.wallet_create_payid_error_already_created)
|
||||
object PayIdCreatingError : TapError(R.string.wallet_create_payid_error_message)
|
||||
object PayIdEmptyField : TapError(R.string.wallet_create_payid_empty)
|
||||
object UnknownBlockchain : TapError(R.string.wallet_unknown_blockchain)
|
||||
object NoInternetConnection : TapError(R.string.notification_no_internet)
|
||||
object InsufficientBalance : TapError(R.string.error_insufficient_balance)
|
||||
object BlockchainInternalError : TapError(R.string.error_blockchain_internal)
|
||||
object AmountExceedsBalance : TapError(R.string.amount_exceeds_balance)
|
||||
object FeeExceedsBalance : TapError(R.string.fee_exceeds_balance)
|
||||
object TotalExceedsBalance : TapError(R.string.total_exceeds_balance)
|
||||
object InvalidAmountValue : TapError(R.string.invalid_amount_value)
|
||||
object InvalidFeeValue : TapError(R.string.invalid_fee_value)
|
||||
data class DustAmount(override val args: List<Any>) : TapError(R.string.dust_amount)
|
||||
object DustChange : TapError(R.string.dust_change)
|
||||
data class CreateAccountUnderfunded(override val args: List<Any>) : TapError(R.string.create_account_underfunded)
|
||||
object UnknownBlockchain : TapError(R.string.wallet_error_unsupported_blockchain_subtitle)
|
||||
object NoInternetConnection : TapError(R.string.wallet_notification_no_internet)
|
||||
object InsufficientBalance : TapError(R.string.send_error_insufficient_balance)
|
||||
object BlockchainInternalError : TapError(R.string.send_error_blockchain_internal)
|
||||
object AmountExceedsBalance : TapError(R.string.send_validation_amount_exceeds_balance)
|
||||
object FeeExceedsBalance : TapError(R.string.send_validation_invalid_fee)
|
||||
object TotalExceedsBalance : TapError(R.string.send_validation_invalid_total)
|
||||
object InvalidAmountValue : TapError(R.string.send_validation_invalid_amount)
|
||||
object InvalidFeeValue : TapError(R.string.send_error_invalid_fee_value)
|
||||
data class DustAmount(override val args: List<Any>) : TapError(R.string.send_error_dust_amount_format)
|
||||
object DustChange : TapError(R.string.send_error_dust_change)
|
||||
data class CreateAccountUnderfunded(override val args: List<Any>) : TapError(R.string.send_error_no_target_account)
|
||||
|
||||
data class ValidateTransactionErrors(
|
||||
override val errorList: List<TapError>,
|
||||
|
|
@ -47,7 +47,7 @@ sealed class TapSdkError(override val messageResId: Int?) : Throwable(), TangemE
|
|||
final override val code: Int = 1
|
||||
override var customMessage: String = code.toString()
|
||||
|
||||
object CardForDifferentApp : TapSdkError(R.string.error_card_for_different_app)
|
||||
object CardForDifferentApp : TapSdkError(R.string.alert_unsupported_card)
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -17,12 +17,14 @@ sealed class DetailsAction : Action {
|
|||
val fiatCurrencies: List<FiatCurrencyName>? = null,
|
||||
): DetailsAction()
|
||||
|
||||
object ShowDisclaimer : DetailsAction()
|
||||
|
||||
|
||||
sealed class EraseWallet : DetailsAction() {
|
||||
object Check : EraseWallet()
|
||||
object Proceed : EraseWallet() {
|
||||
object NotAllowedByCard: EraseWallet(), NotificationAction {
|
||||
override val messageResource = R.string.details_notification_erase_wallet_not_allowed
|
||||
override val messageResource = R.string.error_purge_prohibited
|
||||
}
|
||||
object NotEmpty: EraseWallet(), NotificationAction {
|
||||
override val messageResource = R.string.details_notification_erase_wallet_not_possible
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.tangem.tap.common.redux.AppState
|
|||
import com.tangem.tap.common.redux.global.GlobalAction
|
||||
import com.tangem.tap.common.redux.navigation.AppScreen
|
||||
import com.tangem.tap.common.redux.navigation.NavigationAction
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerAction
|
||||
import com.tangem.tap.features.wallet.redux.WalletAction
|
||||
import com.tangem.tap.network.coinmarketcap.CoinMarketCapService
|
||||
import com.tangem.tap.preferencesStorage
|
||||
|
|
@ -29,6 +30,10 @@ class DetailsMiddleware {
|
|||
is DetailsAction.EraseWallet -> eraseWalletMiddleware.handle(action)
|
||||
is DetailsAction.AppCurrencyAction -> appCurrencyMiddleware.handle(action)
|
||||
is DetailsAction.ManageSecurity -> manageSecurityMiddleware.handle(action)
|
||||
is DetailsAction.ShowDisclaimer -> {
|
||||
store.dispatch(DisclaimerAction.ShowAcceptedDisclaimer)
|
||||
store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer))
|
||||
}
|
||||
}
|
||||
next(action)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ private fun internalReduce(action: Action, state: AppState): DetailsState {
|
|||
is DetailsAction.ManageSecurity -> {
|
||||
handleSecurityAction(action, detailsState)
|
||||
}
|
||||
else -> detailsState
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@ class CurrencySelectionDialog {
|
|||
var currentSelection = currencies.indexOfFirst { it.symbol == currentAppCurrency }
|
||||
|
||||
dialog = AlertDialog.Builder(context)
|
||||
.setTitle(context.getString(R.string.details_currency))
|
||||
.setNegativeButton(context.getString(R.string.generic_cancel)) { _, _ ->
|
||||
.setTitle(context.getString(R.string.details_row_title_currency))
|
||||
.setNegativeButton(context.getString(R.string.common_cancel)) { _, _ ->
|
||||
store.dispatch(DetailsAction.AppCurrencyAction.Cancel)
|
||||
}
|
||||
.setPositiveButton(context.getString(R.string.generic_done)) { _, _ ->
|
||||
.setPositiveButton(context.getString(R.string.common_done)) { _, _ ->
|
||||
val selectedCurrency = currencies[currentSelection]
|
||||
store.dispatch(DetailsAction.AppCurrencyAction.SelectAppCurrency(selectedCurrency.symbol))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,9 +58,9 @@ class DetailsConfirmFragment : Fragment(R.layout.fragment_details_confirm),
|
|||
|
||||
when (state.confirmScreenState) {
|
||||
ConfirmScreenState.EraseWallet -> {
|
||||
toolbar.title = getString(R.string.details_erase_wallet)
|
||||
toolbar.title = getString(R.string.details_row_title_erase_wallet)
|
||||
tv_warning_description.text = getString(R.string.details_erase_wallet_warning)
|
||||
btn_confirm.text = getString(R.string.details_erase_wallet)
|
||||
btn_confirm.text = getString(R.string.details_row_title_erase_wallet)
|
||||
btn_confirm.setCompoundDrawablesRelativeWithIntrinsicBounds(
|
||||
null, null, getDrawable(R.drawable.ic_send), null
|
||||
)
|
||||
|
|
@ -68,9 +68,9 @@ class DetailsConfirmFragment : Fragment(R.layout.fragment_details_confirm),
|
|||
}
|
||||
ConfirmScreenState.LongTap, ConfirmScreenState.AccessCode,
|
||||
ConfirmScreenState.PassCode -> {
|
||||
toolbar.title = getString(R.string.details_manage_security)
|
||||
tv_warning_description.text = getString(R.string.details_manage_security_warning)
|
||||
btn_confirm.text = getString(R.string.details_save_changes)
|
||||
toolbar.title = getString(R.string.details_row_title_manage_security)
|
||||
tv_warning_description.text = getString(R.string.details_security_management_warning)
|
||||
btn_confirm.text = getString(R.string.common_save_changes)
|
||||
btn_confirm.setCompoundDrawablesRelativeWithIntrinsicBounds(
|
||||
null, null, getDrawable(R.drawable.ic_save), null
|
||||
)
|
||||
|
|
|
|||
|
|
@ -64,6 +64,8 @@ class DetailsFragment : Fragment(R.layout.fragment_details), StoreSubscriber<Det
|
|||
tv_signed_hashes.text = state.cardInfo.signedHashes.toString()
|
||||
}
|
||||
|
||||
tv_disclaimer.setOnClickListener { store.dispatch(DetailsAction.ShowDisclaimer) }
|
||||
|
||||
tv_erase_wallet.setOnClickListener {
|
||||
store.dispatch(DetailsAction.EraseWallet.Check)
|
||||
store.dispatch(DetailsAction.EraseWallet.Proceed)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
package com.tangem.tap.features.disclaimer.redux
|
||||
|
||||
import org.rekotlin.Action
|
||||
|
||||
sealed class DisclaimerAction: Action {
|
||||
object AcceptDisclaimer : DisclaimerAction()
|
||||
object ShowAcceptedDisclaimer : DisclaimerAction()
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package com.tangem.tap.features.disclaimer.redux
|
||||
|
||||
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.preferencesStorage
|
||||
import com.tangem.tap.store
|
||||
import org.rekotlin.Middleware
|
||||
|
||||
class DisclaimerMiddleware {
|
||||
val disclaimerMiddleware: Middleware<AppState> = { dispatch, state ->
|
||||
{ next ->
|
||||
{ action ->
|
||||
when (action) {
|
||||
is DisclaimerAction.AcceptDisclaimer -> {
|
||||
preferencesStorage.saveDisclaimerAccepted()
|
||||
store.dispatch(NavigationAction.NavigateTo(AppScreen.Wallet))
|
||||
}
|
||||
}
|
||||
next(action)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.tangem.tap.features.disclaimer.redux
|
||||
|
||||
import com.tangem.tap.common.redux.AppState
|
||||
import org.rekotlin.Action
|
||||
|
||||
class DisclaimerReducer {
|
||||
companion object {
|
||||
fun reduce(action: Action, state: AppState): DisclaimerState = internalReduce(action, state)
|
||||
}
|
||||
}
|
||||
|
||||
private fun internalReduce(action: Action, state: AppState): DisclaimerState {
|
||||
if (action !is DisclaimerAction) return state.disclaimerState
|
||||
|
||||
val disclaimerState = state.disclaimerState
|
||||
return when (action) {
|
||||
is DisclaimerAction.AcceptDisclaimer, DisclaimerAction.ShowAcceptedDisclaimer -> {
|
||||
disclaimerState.copy(accepted = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.tangem.tap.features.disclaimer.redux
|
||||
|
||||
import org.rekotlin.StateType
|
||||
|
||||
data class DisclaimerState(
|
||||
val accepted: Boolean = false
|
||||
) : StateType
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package com.tangem.tap.features.disclaimer.ui
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.transition.TransitionInflater
|
||||
import com.tangem.tap.common.extensions.hide
|
||||
import com.tangem.tap.common.redux.navigation.NavigationAction
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerAction
|
||||
import com.tangem.tap.features.disclaimer.redux.DisclaimerState
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.wallet.R
|
||||
import kotlinx.android.synthetic.main.fragment_disclaimer.*
|
||||
import org.rekotlin.StoreSubscriber
|
||||
|
||||
class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer),
|
||||
StoreSubscriber<DisclaimerState> {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) {
|
||||
override fun handleOnBackPressed() {
|
||||
store.dispatch(NavigationAction.PopBackTo())
|
||||
}
|
||||
})
|
||||
val inflater = TransitionInflater.from(requireContext())
|
||||
enterTransition = inflater.inflateTransition(R.transition.slide_right)
|
||||
exitTransition = inflater.inflateTransition(R.transition.fade)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
store.subscribe(this) { state ->
|
||||
state.skipRepeats { oldState, newState ->
|
||||
oldState.disclaimerState == newState.disclaimerState
|
||||
}.select { it.disclaimerState }
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
store.unsubscribe(this)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
toolbar.setNavigationOnClickListener {
|
||||
store.dispatch(NavigationAction.PopBackTo())
|
||||
}
|
||||
setOnClickListeners()
|
||||
}
|
||||
|
||||
private fun setOnClickListeners() {
|
||||
btn_accept.setOnClickListener { store.dispatch(DisclaimerAction.AcceptDisclaimer) }
|
||||
}
|
||||
|
||||
override fun newState(state: DisclaimerState) {
|
||||
if (activity == null) return
|
||||
|
||||
if (state.accepted) btn_accept.hide()
|
||||
}
|
||||
}
|
||||
|
|
@ -31,8 +31,8 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber<HomeState
|
|||
override fun newState(state: HomeState) {
|
||||
if (activity == null) return
|
||||
if (state.firstLaunch) {
|
||||
tv_home_description.text = getText(R.string.home_do_you_have_card)
|
||||
btn_shop.text = getText(R.string.home_button_no_card)
|
||||
tv_home_description.text = getText(R.string.home_welcome)
|
||||
btn_shop.text = getText(R.string.common_no)
|
||||
btn_yes.text = getText(R.string.home_button_yes)
|
||||
} else {
|
||||
tv_home_description.text = getText(R.string.home_welcome_back)
|
||||
|
|
@ -54,6 +54,4 @@ class HomeFragment : Fragment(R.layout.fragment_home), StoreSubscriber<HomeState
|
|||
val inflater = TransitionInflater.from(requireContext())
|
||||
exitTransition = inflater.inflateTransition(R.transition.fade)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -34,7 +34,7 @@ val homeMiddleware: Middleware<AppState> = { dispatch, state ->
|
|||
is CompletionResult.Success -> {
|
||||
store.dispatch(GlobalAction.RestoreAppCurrency)
|
||||
store.state.globalState.tapWalletManager.onCardScanned(result.data)
|
||||
navigateToWallet()
|
||||
showDisclaimerOrNavigateToWallet()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -51,6 +51,15 @@ val homeMiddleware: Middleware<AppState> = { dispatch, state ->
|
|||
}
|
||||
}
|
||||
|
||||
private fun showDisclaimerOrNavigateToWallet() {
|
||||
if (preferencesStorage.wasDisclaimerAccepted()) {
|
||||
navigateToWallet()
|
||||
} else {
|
||||
store.dispatch(NavigationAction.NavigateTo(AppScreen.Disclaimer))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun navigateToWallet() {
|
||||
if (store.state.navigationState.backStack.isNotEmpty()) {
|
||||
val currentScreen = store.state.navigationState.backStack.last()
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ abstract class BaseStoreFragment(layoutId: Int) : Fragment(layoutId) {
|
|||
|
||||
fun showRetrySnackbar(message: String, action: () -> Unit) {
|
||||
val snackbar = Snackbar.make(mainView, message, Snackbar.LENGTH_INDEFINITE)
|
||||
snackbar.setAction(getString(R.string.generic_retry)) {
|
||||
snackbar.setAction(getString(R.string.common_retry)) {
|
||||
snackbar.dismiss()
|
||||
action()
|
||||
}.show()
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ sealed class SendAction : SendScreenAction {
|
|||
|
||||
data class ChangeSendButtonState(val state: SendButtonState) : SendAction()
|
||||
object SendSuccess : SendAction(), ToastNotificationAction {
|
||||
override val messageResource: Int = R.string.send_transaction_complete
|
||||
override val messageResource: Int = R.string.send_transaction_success
|
||||
}
|
||||
|
||||
data class SendError(override val error: TapError) : SendAction(), ErrorAction
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.tangem.blockchain.common.WalletManager
|
|||
import com.tangem.common.extensions.isZero
|
||||
import com.tangem.tap.common.CurrencyConverter
|
||||
import com.tangem.tap.common.entities.TapCurrency
|
||||
import com.tangem.tap.common.text.DecimalDigitsInputFilter
|
||||
import com.tangem.tap.domain.TapError
|
||||
import com.tangem.tap.store
|
||||
import org.rekotlin.StateType
|
||||
|
|
@ -143,13 +144,7 @@ data class AmountState(
|
|||
}
|
||||
|
||||
fun restoreDecimalSeparator(value: String): String {
|
||||
if (value.contains(decimalSeparator)) return value
|
||||
|
||||
return if (decimalSeparator == ".") {
|
||||
value.replace(",", decimalSeparator)
|
||||
} else {
|
||||
value.replace(".", decimalSeparator)
|
||||
}
|
||||
return DecimalDigitsInputFilter.setDecimalSeparator(value, decimalSeparator)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) {
|
|||
|
||||
btnSend.setOnClickListener {
|
||||
store.dispatch(SendActionUi.SendAmountToRecipient(
|
||||
Message(getString(R.string.tap_to_sign))
|
||||
Message(getString(R.string.initial_message_sign_header))
|
||||
))
|
||||
}
|
||||
}
|
||||
|
|
@ -144,7 +144,7 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) {
|
|||
}
|
||||
}
|
||||
|
||||
etAmountToSend.keyListener = DigitsKeyListener.getInstance("0123456789$decimalSeparator")
|
||||
etAmountToSend.keyListener = DigitsKeyListener.getInstance("0123456789,.")
|
||||
etAmountToSend.setOnFocusChangeListener { v, hasFocus ->
|
||||
snackbarControlledByChangingFocus = true
|
||||
if (hasFocus) {
|
||||
|
|
@ -255,7 +255,7 @@ class FeeUiHelper {
|
|||
|
||||
private fun ToggleWidget.setupSendButtonStateModifiers(context: Context) {
|
||||
mainViewModifiers.clear()
|
||||
mainViewModifiers.add(ReplaceTextStateModifier(context.getString(R.string.send_btn_send), ""))
|
||||
mainViewModifiers.add(ReplaceTextStateModifier(context.getString(R.string.send_title), ""))
|
||||
mainViewModifiers.add(
|
||||
TextViewDrawableStateModifier(
|
||||
context.getDrawableCompat(R.drawable.ic_arrow_right), null, TextViewDrawableStateModifier.RIGHT
|
||||
|
|
|
|||
|
|
@ -73,11 +73,11 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
private fun handleAddressPayIdState(fg: BaseStoreFragment, state: AddressPayIdState) {
|
||||
fun parseError(context: Context, error: Error?): String? {
|
||||
val resId = when (error) {
|
||||
Error.PAY_ID_UNSUPPORTED_BY_BLOCKCHAIN -> R.string.error_payid_unsupported_by_blockchain
|
||||
Error.PAY_ID_NOT_REGISTERED -> R.string.error_payid_not_registere
|
||||
Error.PAY_ID_REQUEST_FAILED -> R.string.error_payid_request_failed
|
||||
Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN -> R.string.error_address_invalid_or_unsupported
|
||||
Error.ADDRESS_SAME_AS_WALLET -> R.string.error_address_same_as_wallet
|
||||
Error.PAY_ID_UNSUPPORTED_BY_BLOCKCHAIN -> R.string.send_error_payid_unsupported_by_blockchain
|
||||
Error.PAY_ID_NOT_REGISTERED -> R.string.send_error_payid_not_registered
|
||||
Error.PAY_ID_REQUEST_FAILED -> R.string.send_error_payid_request_failed
|
||||
Error.ADDRESS_INVALID_OR_UNSUPPORTED_BY_BLOCKCHAIN -> R.string.send_validation_invalid_address
|
||||
Error.ADDRESS_SAME_AS_WALLET -> R.string.send_error_address_same_as_wallet
|
||||
else -> null
|
||||
}
|
||||
return if (resId == null) null else context.getString(resId, "", "")
|
||||
|
|
@ -139,7 +139,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
fg.tvAmountCurrency.update(state.mainCurrency.currencySymbol)
|
||||
(fg as? SendFragment)?.saveMainCurrency(state.mainCurrency.type)
|
||||
|
||||
val balanceText = fg.getString(R.string.send_balance,
|
||||
val balanceText = fg.getString(R.string.send_balance_subtitle_format,
|
||||
state.mainCurrency.currencySymbol,
|
||||
state.viewBalanceValue)
|
||||
fg.tvBalance.update(balanceText)
|
||||
|
|
@ -173,7 +173,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
}
|
||||
|
||||
if (state.error == FeeAction.Error.REQUEST_FAILED) {
|
||||
fg.showRetrySnackbar(fg.requireContext().getString(R.string.error_fee_request_failed)) {
|
||||
fg.showRetrySnackbar(fg.requireContext().getString(R.string.send_error_fee_request_failed)) {
|
||||
store.dispatch(FeeAction.RequestFee)
|
||||
}
|
||||
}
|
||||
|
|
@ -186,7 +186,8 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
val mainLayout = fg.clReceiptContainer as ViewGroup
|
||||
val totalLayout = fg.llTotal as ViewGroup
|
||||
val totalTokenLayout = fg.flTotalTokenCrypto as ViewGroup
|
||||
fun getString(id: Int): String = mainLayout.context.getString(id)
|
||||
fun getString(id: Int, vararg formatStrings: String): String =
|
||||
mainLayout.context.getString(id, *formatStrings)
|
||||
|
||||
val rough = getString(R.string.sign_rough)
|
||||
fun roughOrEmpty(value: String): String = if (value == ReceiptReducer.EMPTY) value else "$rough $value"
|
||||
|
|
@ -201,11 +202,9 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
fg.tvReceiptFeeValue.update("${receipt.feeFiat} ${receipt.symbols.fiat}")
|
||||
totalLayout.tvTotalValue.update("${roughOrEmpty(receipt.totalFiat)} ${receipt.symbols.fiat}")
|
||||
|
||||
val willSent = SpannableStringBuilder()
|
||||
.bold { append(receipt.willSentCrypto) }.append(" ")
|
||||
.append(receipt.symbols.crypto).append(" ")
|
||||
.append(getString(R.string.send_total_will_be_sent))
|
||||
totalLayout.tvWillBeSentValue.update(willSent.toString())
|
||||
val willSent = getString(R.string.send_total_subtitle_format,
|
||||
receipt.willSentCrypto, receipt.symbols.crypto)
|
||||
totalLayout.tvWillBeSentValue.update(willSent)
|
||||
|
||||
}
|
||||
ReceiptLayoutType.CRYPTO -> {
|
||||
|
|
@ -235,18 +234,12 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber
|
|||
fg.tvReceiptFeeValue.update("${receipt.feeFiat} ${receipt.symbols.fiat}")
|
||||
totalLayout.tvTotalValue.update("${roughOrEmpty(receipt.totalFiat)} ${receipt.symbols.fiat}")
|
||||
|
||||
val willSent = SpannableStringBuilder()
|
||||
.bold {
|
||||
append(receipt.symbols.token)
|
||||
append(" ")
|
||||
append(receipt.willSentToken)
|
||||
}.append(" ").append(getString(R.string.generic_and)).append(" ")
|
||||
.bold {
|
||||
append(receipt.symbols.crypto).append(" ")
|
||||
append(receipt.willSentFeeCoin).append(" ")
|
||||
}
|
||||
.append(mainLayout.context.getString(R.string.send_total_will_be_sent))
|
||||
totalLayout.tvWillBeSentValue.update(willSent.toString())
|
||||
val willSent = getString(
|
||||
R.string.send_total_subtitle_asset_format,
|
||||
receipt.symbols.token ?: "", receipt.willSentToken,
|
||||
receipt.symbols.crypto, receipt.willSentFeeCoin
|
||||
)
|
||||
totalLayout.tvWillBeSentValue.update(willSent)
|
||||
}
|
||||
ReceiptLayoutType.TOKEN_CRYPTO -> {
|
||||
val receipt = state.tokenCrypto ?: return
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ sealed class WalletAction : Action {
|
|||
|
||||
data class CopyAddress(val context: Context) : WalletAction() {
|
||||
object Success : WalletAction(), NotificationAction {
|
||||
override val messageResource = R.string.notification_address_copied
|
||||
override val messageResource = R.string.wallet_notification_address_copied
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,7 @@ package com.tangem.tap.features.wallet.redux
|
|||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.tangem.blockchain.common.Amount
|
||||
import com.tangem.blockchain.common.AmountType
|
||||
import com.tangem.blockchain.common.SignatureCountValidator
|
||||
import com.tangem.blockchain.common.Wallet
|
||||
import com.tangem.blockchain.common.*
|
||||
import com.tangem.blockchain.extensions.SimpleResult
|
||||
import com.tangem.commands.Card
|
||||
import com.tangem.commands.common.network.Result
|
||||
|
|
@ -218,22 +215,27 @@ private fun checkIfWarningNeeded(
|
|||
|
||||
private fun checkHashesCountOnline() {
|
||||
if (store.state.walletState.hashesCountVerified != false) return
|
||||
|
||||
if (!NetworkConnectivity.getInstance().isOnlineOrConnecting()) return
|
||||
|
||||
val card = store.state.globalState.scanNoteResponse?.card
|
||||
if (card == null || preferencesStorage.wasCardScannedBefore(card.cardId)) return
|
||||
|
||||
val validator = store.state.globalState.scanNoteResponse?.walletManager
|
||||
as? SignatureCountValidator
|
||||
|
||||
scope.launch {
|
||||
val result = validator?.validateSignatureCount(card?.walletSignedHashes
|
||||
?: 0)
|
||||
val result = validator?.validateSignatureCount(card.walletSignedHashes ?: 0)
|
||||
withContext(Dispatchers.Main) {
|
||||
when (result) {
|
||||
SimpleResult.Success -> store.dispatch(WalletAction.ConfirmHashesCount)
|
||||
is SimpleResult.Failure -> store.dispatch(
|
||||
WalletAction.ShowWarning(WarningType.CardSignedHashesBefore)
|
||||
)
|
||||
SimpleResult.Success -> {
|
||||
store.dispatch(WalletAction.ConfirmHashesCount)
|
||||
store.dispatch(WalletAction.SaveCardId)
|
||||
}
|
||||
is SimpleResult.Failure ->
|
||||
if (result.error is BlockchainSdkError.SignatureCountNotMatched) {
|
||||
store.dispatch(WalletAction.ShowWarning(WarningType.CardSignedHashesBefore))
|
||||
} else if (card.walletSignedHashes ?: 0 > 0) {
|
||||
store.dispatch(WalletAction.ShowWarning(WarningType.CardSignedHashesBefore))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ class BalanceWidget(
|
|||
R.id.tv_status_verified
|
||||
} else {
|
||||
fragment.tv_status_error.text =
|
||||
fragment.getText(R.string.wallet_transaction_in_progress)
|
||||
fragment.getText(R.string.wallet_balance_tx_in_progress)
|
||||
R.id.group_error
|
||||
}
|
||||
showStatus(statusView)
|
||||
|
|
@ -93,7 +93,7 @@ class BalanceWidget(
|
|||
fragment.tv_amount.text = ""
|
||||
fragment.tv_status_error_message.text = data.errorMessage
|
||||
fragment.tv_status_error.text =
|
||||
fragment.getString(R.string.wallet_blockchain_is_unreachable)
|
||||
fragment.getString(R.string.wallet_balance_blockchain_unreachable)
|
||||
|
||||
showStatus(R.id.group_error)
|
||||
fragment.tv_status_error_message.show(!data.errorMessage.isNullOrBlank())
|
||||
|
|
@ -101,25 +101,25 @@ class BalanceWidget(
|
|||
BalanceStatus.EmptyCard -> {
|
||||
fragment.l_balance.hide()
|
||||
fragment.l_balance_error.show()
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_empty_card)
|
||||
fragment.tv_error_descriptions.text = fragment.getText(R.string.wallet_empty_card_description)
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_error_empty_card)
|
||||
fragment.tv_error_descriptions.text = fragment.getText(R.string.wallet_error_empty_card_subtitle)
|
||||
}
|
||||
BalanceStatus.NoAccount -> {
|
||||
fragment.l_balance.hide()
|
||||
fragment.l_balance_error.show()
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_no_account)
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_error_no_account)
|
||||
fragment.tv_error_descriptions.text =
|
||||
fragment.getString(
|
||||
R.string.wallet_no_account_description,
|
||||
R.string.wallet_error_no_account_subtitle_format,
|
||||
data.amountToCreateAccount, data.currencySymbol
|
||||
)
|
||||
}
|
||||
BalanceStatus.UnknownBlockchain -> {
|
||||
fragment.l_balance.hide()
|
||||
fragment.l_balance_error.show()
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_unknown_blockchain_title)
|
||||
fragment.tv_error_title.text = fragment.getText(R.string.wallet_error_unsupported_blockchain)
|
||||
fragment.tv_error_descriptions.text =
|
||||
fragment.getString(R.string.wallet_unknown_blockchain)
|
||||
fragment.getString(R.string.wallet_error_unsupported_blockchain_subtitle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,12 +41,12 @@ class PendingTransactionsAdapter
|
|||
|
||||
fun bind(transaction: PendingTransaction) {
|
||||
val transactionDescriptionRes = when (transaction.type) {
|
||||
PendingTransactionType.Incoming -> R.string.wallet_pending_transaction_incoming
|
||||
PendingTransactionType.Outcoming -> R.string.wallet_pending_transaction_outcoming
|
||||
PendingTransactionType.Incoming -> R.string.wallet_pending_tx_receiving
|
||||
PendingTransactionType.Outcoming -> R.string.wallet_pending_tx_sending
|
||||
}
|
||||
val transactionAddressRes = when (transaction.type) {
|
||||
PendingTransactionType.Incoming -> R.string.wallet_pending_transaction_incoming_address
|
||||
PendingTransactionType.Outcoming -> R.string.wallet_pending_transaction_outcoming_address
|
||||
PendingTransactionType.Incoming -> R.string.wallet_pending_tx_receiving_address_format
|
||||
PendingTransactionType.Outcoming -> R.string.wallet_pending_tx_sending_address_format
|
||||
}
|
||||
val image = when (transaction.type) {
|
||||
PendingTransactionType.Incoming -> R.drawable.ic_arrow_left
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
|
|||
setHasOptionsMenu(true)
|
||||
activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) {
|
||||
override fun handleOnBackPressed() {
|
||||
store.dispatch(NavigationAction.PopBackTo())
|
||||
store.dispatch(NavigationAction.PopBackTo(AppScreen.Home))
|
||||
}
|
||||
})
|
||||
val inflater = TransitionInflater.from(requireContext())
|
||||
|
|
@ -72,7 +72,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
|
|||
(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)
|
||||
|
||||
toolbar.setNavigationOnClickListener {
|
||||
store.dispatch(NavigationAction.PopBackTo())
|
||||
store.dispatch(NavigationAction.PopBackTo(AppScreen.Home))
|
||||
}
|
||||
|
||||
btn_scan.setOnClickListener {
|
||||
|
|
@ -95,7 +95,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
|
|||
if (!state.showDetails) {
|
||||
toolbar.menu.removeItem(R.id.details_menu)
|
||||
} else if (toolbar.menu.findItem(R.id.details_menu) == null) {
|
||||
toolbar.menu.add(R.menu.wallet, R.id.details_menu, NONE, R.string.details_toolbar_title)
|
||||
toolbar.menu.add(R.menu.wallet, R.id.details_menu, NONE, R.string.details_title)
|
||||
}
|
||||
|
||||
srl_wallet.setOnRefreshListener {
|
||||
|
|
@ -149,9 +149,9 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), StoreSubscriber<Walle
|
|||
if (state.error == ErrorType.NoInternetConnection) {
|
||||
srl_wallet?.isRefreshing = false
|
||||
snackbar = Snackbar.make(
|
||||
coordinator_wallet, getString(R.string.notification_no_internet),
|
||||
coordinator_wallet, getString(R.string.wallet_notification_no_internet),
|
||||
Snackbar.LENGTH_INDEFINITE
|
||||
).setAction(getString(R.string.notification_no_internet_retry))
|
||||
).setAction(getString(R.string.common_retry))
|
||||
{ store.dispatch(WalletAction.LoadData) }
|
||||
.also { it.show() }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ class PayIdDialog(context: Context) : Dialog(context) {
|
|||
store.dispatch(WalletAction.CreatePayId.EmptyField)
|
||||
} else {
|
||||
val payid = this.et_payid.text!!.toString() +
|
||||
this.context.getString(R.string.wallet_pay_id_address)
|
||||
this.context.getString(R.string.wallet_create_payid_domain)
|
||||
store.dispatch(WalletAction.CreatePayId.CompleteCreatingPayId(payid))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ class QrDialog(context: Context) : Dialog(context) {
|
|||
} else {
|
||||
this.tv_qr_dialog_header.show()
|
||||
this.tv_qr_dialog_header.text = context.getString(
|
||||
R.string.wallet_dialog_qr_code_header, currencyName
|
||||
R.string.wallet_qr_title_format, currencyName
|
||||
)
|
||||
}
|
||||
super.show()
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ import com.tangem.wallet.R
|
|||
class WarningDialog(context: Context) : AlertDialog(context) {
|
||||
|
||||
private val dialog: AlertDialog = Builder(context)
|
||||
.setTitle(context.getString(R.string.generic_warning))
|
||||
.setPositiveButton(context.getString(R.string.general_ok)) { _, _ ->
|
||||
.setTitle(context.getString(R.string.common_warning))
|
||||
.setPositiveButton(context.getString(R.string.common_ok)) { _, _ ->
|
||||
dismiss()
|
||||
}.setOnDismissListener {
|
||||
store.dispatch(WalletAction.SaveCardId)
|
||||
|
|
@ -21,8 +21,8 @@ class WarningDialog(context: Context) : AlertDialog(context) {
|
|||
|
||||
fun show(warningType: WarningType) {
|
||||
val messageRes = when (warningType) {
|
||||
WarningType.CardSignedHashesBefore -> R.string.warning_card_signed_transactions
|
||||
WarningType.DevCard -> R.string.wallet_warning_dev_card
|
||||
WarningType.CardSignedHashesBefore -> R.string.alert_card_signed_transactions
|
||||
WarningType.DevCard -> R.string.alert_developer_card
|
||||
}
|
||||
dialog.setMessage(dialog.context.getString(messageRes))
|
||||
dialog.show()
|
||||
|
|
|
|||
|
|
@ -65,12 +65,22 @@ class PreferencesStorage(applicationContext: Application) {
|
|||
private fun restoreScannedCardIds(): String =
|
||||
preferences.getString(SCANNED_CARDS_IDS_KEY, "") ?: ""
|
||||
|
||||
|
||||
fun saveDisclaimerAccepted() {
|
||||
preferences.edit().putBoolean(DISCLAIMER_ACCEPTED_KEY, true).apply()
|
||||
}
|
||||
|
||||
fun wasDisclaimerAccepted(): Boolean {
|
||||
return preferences.getBoolean(DISCLAIMER_ACCEPTED_KEY, false)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PREFERENCES_NAME = "tapPrefs"
|
||||
private const val APP_CURRENCY_KEY = "appCurrency"
|
||||
private const val FIAT_CURRENCIES_KEY = "fiatCurrencies"
|
||||
private const val FIRST_LAUNCH_CHECK_KEY = "firstLaunchCheck"
|
||||
private const val SCANNED_CARDS_IDS_KEY = "scannedCardIds"
|
||||
private const val DISCLAIMER_ACCEPTED_KEY = "disclaimerAccepted"
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
android:ellipsize="middle"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:paddingEnd="24dp"
|
||||
android:text="@string/wallet_dialog_pay_id_button"
|
||||
android:text="@string/wallet_create_payid"
|
||||
android:textColor="@color/textGray"
|
||||
android:textSize="17sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
android:layout_height="50dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:hint="@string/wallet_dialog_pay_id_hint"
|
||||
android:hint="@string/wallet_create_payid_hint"
|
||||
android:inputType="textNoSuggestions|textVisiblePassword"
|
||||
android:paddingStart="4dp"
|
||||
android:paddingEnd="4dp"
|
||||
|
|
@ -46,7 +46,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:paddingBottom="1dp"
|
||||
android:text="@string/wallet_pay_id_address"
|
||||
android:text="@string/wallet_create_payid_domain"
|
||||
android:textColor="@color/darkGray4"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/et_payid"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
@ -60,7 +60,7 @@
|
|||
android:layout_marginStart="24dp"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/wallet_dialog_pay_id_description"
|
||||
android:text="@string/wallet_create_payid_info"
|
||||
android:textColor="@color/darkGray1"
|
||||
android:textSize="13sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
android:insetBottom="0dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:text="@string/wallet_dialog_pay_id_button"
|
||||
android:text="@string/wallet_create_payid"
|
||||
android:textColor="@color/blue"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
android:insetBottom="0dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:text="@string/generic_done"
|
||||
android:text="@string/common_done"
|
||||
android:textColor="@color/blue"
|
||||
android:textSize="14sp" />
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
|
||||
app:title="@string/details_toolbar_title" />
|
||||
app:title="@string/details_title" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="14dp"
|
||||
android:text="@string/details_card_id"
|
||||
android:text="@string/details_row_title_cid"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
|
||||
|
|
@ -71,7 +71,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="14dp"
|
||||
android:text="@string/details_issuer"
|
||||
android:text="@string/details_row_title_issuer"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
@ -92,7 +92,8 @@
|
|||
android:id="@+id/tv_signed_hashes_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/details_signed_hashes"
|
||||
android:paddingBottom="7dp"
|
||||
android:text="@string/details_row_title_signed_hashes"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
@ -108,18 +109,32 @@
|
|||
app:layout_constraintTop_toBottomOf="@id/tv_issuer"
|
||||
tools:text="48 hashes" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_disclaimer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="7dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:drawablePadding="15dp"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
app:drawableEndCompat="@drawable/ic_angle_bracket_right"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_signed_hashes_title"
|
||||
android:text="@string/disclaimer_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_settings_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="40dp"
|
||||
android:layout_marginTop="22dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:text="@string/details_settings"
|
||||
android:text="@string/details_section_title_settings"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/colorSecondary"
|
||||
android:textSize="13sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_signed_hashes_title" />
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_disclaimer" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
|
@ -146,25 +161,19 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:text="@string/details_currency"
|
||||
android:text="@string/details_row_title_currency"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_settings_title" />
|
||||
|
||||
<!-- <androidx.constraintlayout.widget.Group-->
|
||||
<!-- android:id="@+id/group_app_currency"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- app:constraint_referenced_ids="tv_app_currency_title, tv_app_currency" />-->
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_card_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="22dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:text="@string/details_card"
|
||||
android:text="@string/details_section_title_card"
|
||||
android:textAllCaps="true"
|
||||
android:textColor="@color/colorSecondary"
|
||||
android:textSize="13sp"
|
||||
|
|
@ -197,7 +206,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="7dp"
|
||||
android:text="@string/details_manage_security"
|
||||
android:text="@string/details_row_title_manage_security"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
@ -216,7 +225,7 @@
|
|||
app:drawableEndCompat="@drawable/ic_angle_bracket_right"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_security_title"
|
||||
android:text="@string/details_erase_wallet" />
|
||||
android:text="@string/details_row_title_erase_wallet" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@
|
|||
android:layout_height="48dp"
|
||||
android:layout_marginStart="7dp"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginEnd="30dp"
|
||||
tools:text="@string/wallet_button_send"
|
||||
android:layout_marginEnd="16dp"
|
||||
tools:text="@string/common_save"
|
||||
tools:icon="@drawable/ic_send"
|
||||
app:layout_constraintStart_toEndOf="@+id/guideline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
app:title="@string/details_manage_security"
|
||||
app:title="@string/details_row_title_manage_security"
|
||||
app:navigationIcon="@drawable/ic_baseline_arrow_back_24" />
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
|
@ -184,8 +184,8 @@
|
|||
android:layout_height="48dp"
|
||||
android:layout_marginStart="7dp"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:text="@string/details_continue"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:text="@string/common_continue"
|
||||
app:icon="@drawable/ic_save"
|
||||
app:layout_constraintStart_toEndOf="@+id/guideline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
|||
82
app/src/main/res/layout/fragment_disclaimer.xml
Normal file
82
app/src/main/res/layout/fragment_disclaimer.xml
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/coordinator_details_confirm"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/backgroundLightGray"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/app_bar"
|
||||
style="@style/Widget.MaterialComponents.Toolbar.Surface"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/backgroundLightGray"
|
||||
android:fitsSystemWindows="true"
|
||||
app:liftOnScroll="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
|
||||
app:title="@string/disclaimer_title" />
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/cl_details_confirm"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="33dp"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/sv_wallet"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:fillViewport="true"
|
||||
android:overScrollMode="never"
|
||||
app:layout_constraintBottom_toTopOf="@id/btn_accept">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_warning_description"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="22dp"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingEnd="24dp"
|
||||
android:paddingBottom="40dp"
|
||||
android:text="@string/disclaimer_text"
|
||||
android:textAlignment="textStart"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintGuide_percent="0.37" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btn_accept"
|
||||
style="@style/TapButtonWithIcon"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="7dp"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:text="@string/common_accept"
|
||||
app:icon="@drawable/ic_send"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/guideline" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
|
@ -54,7 +54,7 @@
|
|||
android:layout_marginTop="100dp"
|
||||
android:paddingStart="30dp"
|
||||
android:paddingEnd="30dp"
|
||||
android:text="@string/home_do_you_have_card"
|
||||
android:text="@string/home_welcome"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="29sp"
|
||||
app:layout_constraintTop_toBottomOf="@id/iv_home_card" />
|
||||
|
|
@ -64,9 +64,9 @@
|
|||
style="@style/TapBlackButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginBottom="33dp"
|
||||
android:text="@string/home_button_no_card"
|
||||
android:text="@string/common_no"
|
||||
app:icon="@drawable/ic_shop"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/guideline"
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
android:layout_width="0dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="33dp"
|
||||
android:text="@string/home_button_yes"
|
||||
app:icon="@drawable/ic_send"
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@
|
|||
app:layout_constraintStart_toEndOf="@+id/guideline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginStart="8dp">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
|
|
@ -106,7 +106,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:fontFamily="@font/saira_semi_condensed_regular"
|
||||
android:text="@string/send_btn_send"
|
||||
android:text="@string/send_title"
|
||||
app:icon="@drawable/ic_arrow_right" />
|
||||
|
||||
<ProgressBar
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
android:layout_height="?attr/actionBarSize"
|
||||
app:menu="@menu/wallet"
|
||||
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
|
||||
app:title="@string/wallet_toolbar_title" />
|
||||
app:title="@string/wallet_title" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
|
@ -91,7 +91,7 @@
|
|||
style="@style/TapBlackButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="30dp"
|
||||
android:text="@string/wallet_button_scan"
|
||||
app:icon="@drawable/ic_scan"
|
||||
|
|
@ -118,7 +118,7 @@
|
|||
android:layout_height="48dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:text="@string/wallet_button_send"
|
||||
app:icon="@drawable/ic_send"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
android:paddingTop="4dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:paddingBottom="25dp"
|
||||
android:text="@string/wallet_explore_address"
|
||||
android:text="@string/wallet_address_button_explore"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:drawablePadding="9dp"
|
||||
android:padding="16dp"
|
||||
android:text="@string/wallet_create_payid"
|
||||
android:text="@string/wallet_address_button_create_payid"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
android:paddingStart="16dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:text="@string/wallet_verified_balance"
|
||||
android:text="@string/wallet_balance_verified"
|
||||
android:textColor="@color/accent"
|
||||
android:textSize="14sp"
|
||||
android:visibility="gone"
|
||||
|
|
@ -45,7 +45,7 @@
|
|||
android:paddingStart="16dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:text="@string/wallet_blockchain_is_unreachable"
|
||||
android:text="@string/wallet_balance_blockchain_unreachable"
|
||||
android:textColor="@color/warning"
|
||||
android:textSize="14sp"
|
||||
android:visibility="gone"
|
||||
|
|
@ -81,7 +81,7 @@
|
|||
android:paddingStart="16dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:text="@string/wallet_balance_is_loading"
|
||||
android:text="@string/wallet_balance_loading"
|
||||
android:textColor="@color/darkGray6"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone"
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
android:id="@+id/tv_error_title"
|
||||
app:layout_constraintStart_toEndOf="@id/iv_balance_error"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="@string/wallet_account_not_created"
|
||||
tools:text="@string/wallet_error_no_account"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="16dp"
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:text="@string/send_total"
|
||||
android:text="@string/send_total_label"
|
||||
android:textSize="20sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
|
|
@ -45,8 +45,9 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:gravity="end"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="@string/send_total_will_be_sent"
|
||||
tools:text="@string/send_total_subtitle_format"
|
||||
android:textColor="@color/darkGray1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
|
@ -62,7 +63,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
android:text="@string/send_total"
|
||||
android:text="@string/send_total_label"
|
||||
android:textColor="@color/darkGray1"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
android:id="@+id/tilAddressOrPayId"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/send_address_or_payid"
|
||||
android:hint="@string/send_destination_hint"
|
||||
app:boxBackgroundColor="@color/backgroundLightGray"
|
||||
app:errorIconDrawable="@null"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:text="@string/send_fee"
|
||||
android:text="@string/send_network_fee_title"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/flExpandCollapse"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
@ -51,21 +51,21 @@
|
|||
style="@style/ChipNetworkFee"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/send_fee_low" />
|
||||
android:text="@string/send_fee_picker_low" />
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/chipNormal"
|
||||
style="@style/ChipNetworkFee"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/send_fee_normal" />
|
||||
android:text="@string/send_fee_picker_normal" />
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/chipPriority"
|
||||
style="@style/ChipNetworkFee"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/send_fee_priority" />
|
||||
android:text="@string/send_fee_picker_priority" />
|
||||
|
||||
</com.google.android.material.chip.ChipGroup>
|
||||
|
||||
|
|
@ -75,7 +75,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="@string/send_fee_include"
|
||||
android:text="@string/send_fee_include_description"
|
||||
android:textSize="13sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
android:id="@+id/tvReceiptAmount"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/send_total_amount"
|
||||
android:text="@string/send_amount_label"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/send_total_fee"
|
||||
android:text="@string/send_fee_label"
|
||||
android:textColor="@color/darkGray1"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:text="@string/wallet_tokens"
|
||||
android:text="@string/wallet_balance_tokens_title"
|
||||
android:textColor="@color/darkGray1"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
android:id="@+id/tv_message"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/send_set_maximum_amount"
|
||||
android:text="@string/send_max_amount_label"
|
||||
android:textColor="#F4F5F6"
|
||||
android:textSize="16sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/details_menu"
|
||||
android:title="@string/details_toolbar_title"
|
||||
android:title="@string/details_title"
|
||||
android:icon="@drawable/ic_settings"
|
||||
app:showAsAction="ifRoom" />
|
||||
</menu>
|
||||
170
app/src/main/res/values-de/strings.xml
Normal file
170
app/src/main/res/values-de/strings.xml
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="common_no">Nein</string>
|
||||
<string name="common_save_changes">Änderungen speichern</string>
|
||||
<string name="common_warning">Warnung</string>
|
||||
<string name="common_retry">Erneut versuchen</string>
|
||||
<string name="common_done">Erledigt</string>
|
||||
<string name="common_cancel">Abbrechen</string>
|
||||
<string name="common_accept">Akzeptieren</string>
|
||||
|
||||
<string name="common_camera_denied_alert_title">Der Kamerazugriff wurde verweigert </string>
|
||||
<string name="common_camera_denied_alert_message">Sie haben keinen Zugang zur Kamera erteilt, bitte passen Sie Ihre Datenschutzeinstellungen an</string>
|
||||
<string name="common_camera_alert_button_settings">Einstellungen</string>
|
||||
<string name="home_welcome">Willkommen bei Tangem. Haben Sie eine dieser Karten?</string>
|
||||
<string name="home_welcome_back">Willkommen bei Tangem Tap. Scannen Sie Ihre Karten um zu starten.</string>
|
||||
<string name="home_button_yes">Ja! Bitte scannen</string>
|
||||
<string name="home_button_shop">Einkaufen</string>
|
||||
<string name="home_ready_title">Halten Sie die \ncard hinter dem \nphone bereit und scannen Sie sie.</string>
|
||||
<string name="home_button_tapin">Eintippen</string>
|
||||
<string name="home_button_scan">Karte scannen</string>
|
||||
<string name="wallet_button_scan">Scannen</string>
|
||||
<string name="wallet_button_send">Absenden</string>
|
||||
<string name="wallet_button_create_wallet">ein Wallet erstellen</string>
|
||||
<string name="wallet_title">Tangem Tap</string>
|
||||
<string name="wallet_choice_wallet_option_title">eine Walletoption wählen</string>
|
||||
<string name="wallet_balance_token_title">Token</string>
|
||||
<string name="wallet_balance_tokens_title">Tokens</string>
|
||||
<string name="wallet_balance_verified">Verifizierte Bilanz</string>
|
||||
<string name="wallet_balance_loading">Die Bilanz wird aufgeladen…</string>
|
||||
<string name="wallet_balance_blockchain_unreachable">Blockchain ist nicht erreichbar</string>
|
||||
<string name="wallet_error_no_account">Das Konto ist nicht erstellt</string>
|
||||
<string name="wallet_error_no_account_subtitle_format">%s+ %s aufladen um ein Konto zu erstellen</string>
|
||||
<string name="wallet_error_empty_card">Leere Karte</string>
|
||||
<string name="wallet_error_empty_card_subtitle">Erstellen Sie ein Wallet um die Tangem-Karte verwenden zu können</string>
|
||||
<string name="wallet_error_unsupported_blockchain">Diese Karte wird nicht unterstützt</string>
|
||||
<string name="wallet_error_unsupported_blockchain_subtitle">Ihre Tangem-Karte wurde für die Arbeit mit einer anderen App ausgestellt. Bitte sehen Sie sich den Namen und die Anleitung auf Ihrer Karte an und installieren Sie eine korrekte App</string>
|
||||
<string name="wallet_balance_tx_in_progress">Die Transaktion läuft…</string>
|
||||
<string name="wallet_pending_tx_sending">Senden\u0020</string>
|
||||
<string name="wallet_pending_tx_sending_address_format">an %s </string>
|
||||
<string name="wallet_pending_tx_receiving">Erhalten\u0020</string>
|
||||
<string name="wallet_pending_tx_receiving_address_format">von %s </string>
|
||||
<string name="wallet_address_button_explore">Adresse erkunden</string>
|
||||
<string name="wallet_address_button_create_payid">PayID erstellen</string>
|
||||
<string name="wallet_qr_title_format">%s Wallet</string>
|
||||
<string name="wallet_create_payid">PayID erstellen</string>
|
||||
<string name="wallet_create_payid_card_format">Karte: %s</string>
|
||||
<string name="wallet_create_payid_hint">PayID Name</string>
|
||||
<string name="wallet_create_payid_domain">$payid.tangem.com</string>
|
||||
<string name="wallet_create_payid_button_title">Erstellen</string>
|
||||
<string name="wallet_create_payid_info">PayID sind Ihre einzigartigen Identifikationsdaten wie Telefonnummer, E-Mail-Adresse oder ABN.</string>
|
||||
<string name="wallet_create_payid_success_message">Ihre PayID wurde erfolgreich erstellt und zum Clipboard kopiert</string>
|
||||
<string name="wallet_create_payid_error_message">Fehlerantwort beim Erstellen der ZahlungsID</string>
|
||||
<string name="wallet_create_payid_error_already_created">Diese PayID existiert bereits. Versuchen Sie mit einer anderen erneut.</string>
|
||||
<string name="send_destination_hint">Adresse oder PayID</string>
|
||||
<string name="send_title">Absenden</string>
|
||||
<string name="send_network_fee_title">Netzgebühr</string>
|
||||
<string name="send_amount_label">Betrag</string>
|
||||
<string name="send_fee_label">Gebühr</string>
|
||||
<string name="send_total_label">Gesamt</string>
|
||||
<string name="send_max_amount_label">Höchstbetrag</string>
|
||||
<string name="send_validation_invalid_address">Ungültige Adresse</string>
|
||||
<string name="send_validation_invalid_amount">Ungültiger Betrag</string>
|
||||
<string name="send_validation_amount_exceeds_balance">Der Betrag geht über die Bilanz hinaus</string>
|
||||
<string name="send_validation_invalid_total">Der Gesamtbetrag geht über die Bilanz hinaus</string>
|
||||
<string name="send_validation_invalid_fee">Die Gebühr geht über die Bilanz hinaus</string>
|
||||
<string name="send_fee_picker_low">Niedrig</string>
|
||||
<string name="send_fee_picker_normal">Normal</string>
|
||||
<string name="send_fee_picker_priority">Priorität</string>
|
||||
<string name="send_fee_include_description">inkl. Gebühr</string>
|
||||
<string name="send_total_subtitle_format">%s %s wird gesendet</string>
|
||||
<string name="send_total_subtitle_fiat_format">≈ %s (inkl. Gebühr: %s)</string>
|
||||
<string name="send_total_subtitle_asset_format">%s %s und %s %s werden gesendet</string>
|
||||
<string name="send_balance_subtitle_format">Bilanz: %s %s</string>
|
||||
<string name="send_transaction_success">Die Transaktion wurde erfolgreich signiert und an den Blockchain-Knoten gesendet. Die Walletbilanz wird aktualisiert</string>
|
||||
<string name="details_title">Details</string>
|
||||
<string name="details_row_title_cid">KartenID</string>
|
||||
<string name="details_row_title_issuer">Emittent</string>
|
||||
<string name="details_row_title_signed_hashes">Signiert</string>
|
||||
<string name="details_row_subtitle_signed_hashes_format">%s Hasch</string>
|
||||
<string name="details_row_title_currency">App Währung</string>
|
||||
<string name="details_section_title_settings">Einstellungen</string>
|
||||
<string name="details_section_title_card">Karte</string>
|
||||
<string name="details_row_title_validate">Karte validieren</string>
|
||||
<string name="details_row_title_manage_security">Sicherheit verwalteny</string>
|
||||
<string name="details_row_title_erase_wallet">Wallet löschen</string>
|
||||
<string name="details_erase_wallet_warning">Dieser Vorgang ist irriversibel. Wenn jemand nach dem Löschen des Wallets Geld überweist, können Sie es nicht mehr abheben.</string>
|
||||
<string name="details_security_management_warning">Sollten Sie den Code verloren haben, haben Sie keinen Zugriff auf die Karte. Sie können Ihren Code nicht wiederherstellen und nicht ändern, wenn Sie ihn verlieren.</string>
|
||||
<string name="details_manage_security_title">Sicherheit verwalten</string>
|
||||
<string name="details_manage_security_long_tap">Langes Tippen</string>
|
||||
<string name="details_manage_security_long_tap_description">Dieser Mechanismus schützt vor Annäherungsangriffen auf eine Karte. Es wird eine Verzögerung zwischen dem Empfang und der Ausführung eines Befehls erzwungen. Nach der ersten signierten Transaktion wird dieses Telefon mit der Karte verknüpft und die Transaktionen werden sofort signiert</string>
|
||||
<string name="details_manage_security_passcode">Passcode</string>
|
||||
<string name="details_manage_security_passcode_description">Bevor Sie einen Befehl ausführen, der eine Änderung des Kartenstatus zur Folge hat, müssen Sie den Passcode eingeben.</string>
|
||||
<string name="details_manage_security_access_code">Zugangscode</string>
|
||||
<string name="details_manage_security_access_code_description">Sie müssen den richtigen Zugangscode eingeben, bevor Sie die Karte scannen.</string>
|
||||
<string name="alert_old_device_this_card">Sie können NFC-Probleme mit einigen iPhone 7/7+ während der Extraktion haben</string>
|
||||
<string name="alert_card_signed_transactions">Warnung: Diese Karte wurde früher bereits aufgeladen und Transaktionen wurden damit signiert.\n Ziehen Sie eine sofortige Auszahlung aller Beträge in Betracht, wenn Sie diese Karte von einer nicht vertrauenswürdigen Quelle erhalten haben.</string>
|
||||
|
||||
<string name="alert_unsupported_card">Diese Karte ist für die Zusammenarbeit mit Tangem Tap nicht geeignet</string>
|
||||
<string name="alert_developer_card">Die von Ihnen gescannte Karte ist eine Entwicklungskarte. Akzeptieren Sie sie nicht als Zahlungsmittel</string>
|
||||
<string name="alert_old_card">Die vor September 2019 ausgestellten Karten können mit iPhone momentan nicht extrahiert werden. Wir arbeiten eng mit Apple zusammen, damit es in den nächsten Versionen von iOS möglich wäre.</string>
|
||||
<string name="initial_message_sign_header">Tippen um zu signieren</string>
|
||||
<string name="initial_message_sign_body">Scannen Sie die Karte mit Ihrem Handy wie oben gezeigt</string>
|
||||
<string name="initial_message_purge_wallet_body">Tippen Sie um das Wallet zu löschen</string>
|
||||
<string name="initial_message_create_wallet_body">Tippen Sie um ein Wallet zu erstellen</string>
|
||||
<string name="initial_message_change_access_code_body">Tippen Sie um den Zugangscode zu ändern</string>
|
||||
<string name="initial_message_change_passcode_body">Tippen Sie um den Passcode zu ändern</string>
|
||||
<string name="payid_service_error_loading">Ungültige ZahlungsID</string>
|
||||
|
||||
|
||||
<string name="disclaimer_text">
|
||||
RECHTLICHER HAFTUNGSAUSSCHLUSS
|
||||
\n\n1.Tangem Tap App (Software)
|
||||
|
||||
\n\nDie Software ist nur für die Verwendung mit Tangem hardware Wallets (Karten) über NFC-Schnittstelle geeignet. Die Software:
|
||||
|
||||
\n\na. generieret, speichert, überträgt KEINE privaten (geheimen) kryptografischen Schlüssel für Blockchain- Wallets mit digitalen Assets, einschließlich Kryptowährung, und hat KEINEN Zugriff darauf.
|
||||
\n\nb. generieret, speichert, überträgt KEINE geheimen Schlüssel, Passwörter, Passphrasen, Wiederherstellungssätze, die verwendet werden können, um private (geheime) Schlüssel in Blockchain- Wallets, die digitale Assets enthalten, wiederherzustellen oder zu kopieren, einschließlich Kryptowährung, und hat KEINEN Zugriff darauf.
|
||||
\n\nc. erbringt KEINE Wechsel-, Handels- und Investitionsdienstleistungen im Auftrag der Tangem AG.
|
||||
|
||||
|
||||
\n\n2. Risiken im Zusammenhang mit der Verwendung von Software
|
||||
|
||||
\n\nTangem haftet nicht für Verluste, Schäden oder Ansprüche aus den Ereignissen, die in den Geltungsbereich von folgenden fünf Kategorien fallen:
|
||||
|
||||
\n\na. Fehler, die der Benutzer einer kryptowährungsbezogenen Software oder eines kryptowährungsbezogenen Services macht, z.B. vergessene Passwörter, an falsche Adressen gesendete Zahlungen und zufälliges Löschen von Blockchain-Wallets auf Karten.
|
||||
\n\nb. Probleme mit Software und/oder blockchain- oder kryptowährungsbezogener Software oder Services, z.B. beschädigte Dateien, falsch konstruierte Transaktionen, unsichere kryptografische Bibliotheken, Schadsoftware.
|
||||
\n\nc. Technische Ausfälle in der Hardware des Benutzers, einschließlich Karten, jeglicher kryptowährungsbezogener Software oder Services, z.B. Datenverlust infolge eines fehlerhaften oder beschädigten Speichers.
|
||||
\n\nd. Sicherheitsprobleme, die der Benutzer einer kryptowährungsbezogenen Software oder eines kryptowährungsbezogenen Services hat, z.B. unbefugter Zugriff auf Benutzer-Wallets und/oder -Konten.
|
||||
\n\ne. Handlungen oder Untätigkeit Dritter und/oder Vorkommnisse bei den Dritten, z.B. Insolvenz von Dienstleistungserbringern, Informationssicherheitsattacken bei den Dienstleistungserbringern und Betrug durch Dritte.
|
||||
|
||||
|
||||
\n\n3. Tradings- und Investitionsrisiken
|
||||
|
||||
\n\nBei jeder Kryptowährung oder einer anderen digitalen Assetwechsel-Transaktion besteht ein hohes Risiko. Jede Transaktion mit Währungen birgt Risiken, einschließlich, aber nicht beschränkt auf das Potenzial für sich ändernde wirtschaftliche Bedingungen, die den Preis oder die Liquidität einer Währung erheblich beeinflussen können. Investitionen in Kryptowährungsspekulationen können auch anfällig für starke Anstiege und Rückgänge sein, wenn die relevanten Marktwerte schwanken. Aus diesem Grund ist es bei Spekulationen auf solchen Märkten ratsam, nur das Risikokapital zu verwenden.
|
||||
|
||||
|
||||
\n\n4. Risiken im Zusammenhang mit elektronischem Trading
|
||||
|
||||
\n\nBevor Sie Transaktionen über ein elektronisches System tätigen, sollten Sie die Regeln und Vorschriften der Börsen, die das System anbieten, und/oder die Instrumente, mit denen Sie handeln möchten, sorgfältig überprüfen. Der Online-Handel birgt ein dazugehörendes Risiko aufgrund der Systemreaktion und der Zugriffszeiten, die aufgrund der Marktbedingungen, der Systemleistung und anderer Faktoren variieren können. Sie sollten diese und andere Risiken vor dem Tradingsbeginn berücksichtigen.
|
||||
|
||||
|
||||
\n\n5. Einhaltung der Steuerpflichten
|
||||
|
||||
\n\nDie Benutzer der Software müssen allein bestimmen, welche Steuern, wenn überhaupt, für Ihre Kryptowährungstransaktionen gelten. Die Eigentümer oder die Mitwirkenden an der Software sind für die Ermittlung der Steuern, die für Kryptowährungstransaktionen gelten, NICHT verantwortlich.
|
||||
|
||||
|
||||
\n\n6. Garantieausschluss
|
||||
|
||||
\n\nDie Software wird „wie gesehen“ bereitgestellt, ohne jegliche Gewährleistung in Bezug auf die Software und/oder Inhalte, Daten, Materialien und/oder Services, die zur Software gehören.
|
||||
|
||||
|
||||
\n\n7. Haftungsbeschränkung
|
||||
|
||||
\n\nSofern gesetzlich nichts anderes vorgesehen ist, haften die Eigentümer oder die Mitwirkenden an der Software in keinem Fall für Schäden jeglicher Art, einschließlich, aber nicht beschränkt auf Nutzungsausfall, entgangenen Gewinn oder Datenverlust, die aus der Verwendung der Software oder in Zusammenhang mit der jeglichen Verwendung der Software entstehen. Auf keine Weise sind die Eigentümer oder die Mitwirkenden an der Software für die von Ihnen im Vertrauen auf die Software vorgenommenen oder unterlassenen Handlungen, Entscheidungen oder sonstigen Verhaltensweisen verantwortlich.
|
||||
|
||||
|
||||
\n\n8. Letzte Änderung
|
||||
|
||||
\n\nDieser Haftungsausschuss wurde am 1. Oktober 2020 zum letzten Mal geändert.
|
||||
|
||||
</string>
|
||||
<string name="disclaimer_title">Nutzungsbedingungen</string>
|
||||
|
||||
<string name="wallet_notification_no_internet">Keine Internetverbindung</string>
|
||||
<string name="initial_message_scan_header">Tippen um zu scannen</string>
|
||||
<string name="initial_message_tap_header">Tippen um zu scannen</string>
|
||||
<string name="send_error_no_target_account">Das Zielkonto ist nicht erstellt. Der abzusendende Betrag soll %1$s %2$s + Gebühr oder mehr sein</string>
|
||||
<string name="send_error_fee_request_failed">Erhalt der Gebühr fehlgeschlagen</string>
|
||||
|
||||
</resources>
|
||||
168
app/src/main/res/values-fr/strings.xml
Normal file
168
app/src/main/res/values-fr/strings.xml
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="common_no">Non </string>
|
||||
<string name="common_save_changes">Sauvegarder les modifications </string>
|
||||
<string name="common_warning"> Alerte </string>
|
||||
<string name="common_retry"> Réessayer </string>
|
||||
<string name="common_done"> Exécuté </string>
|
||||
<string name="common_cancel"> Annuler </string>
|
||||
<string name="common_accept">J\'accepte</string>
|
||||
|
||||
<string name="common_camera_denied_alert_title">L’accès à la caméra est refusé </string>
|
||||
<string name="common_camera_denied_alert_message">Vous n\'avez pas octroyé l’accès à votre caméra, veuillez modifier vos paramètres de confidentialité </string>
|
||||
<string name="common_camera_alert_button_settings">Paramètres </string>
|
||||
<string name="home_welcome">Bienvenue à Tangem. Avez-vous une de nos cartes</string>
|
||||
<string name="home_welcome_back"> Encore une fois, bienvenue dans Tangem Tap. \nScannez votre carte pour commencer.</string>
|
||||
<string name="home_button_yes">Oui! Scannez-la. </string>
|
||||
<string name="home_button_shop">Magasin </string>
|
||||
<string name="home_ready_title">Préparez-vous à appuyer votre carte au dos de votre téléphone.</string>
|
||||
<string name="home_button_tapin">Appuyez </string>
|
||||
<string name="home_button_scan">Scannez la carte </string>
|
||||
<string name="wallet_button_scan">Scanner </string>
|
||||
<string name="wallet_button_send">Envoyer </string>
|
||||
<string name="wallet_button_create_wallet">Créer un portefeuille </string>
|
||||
<string name="wallet_title">Tangem Tap</string>
|
||||
<string name="wallet_choice_wallet_option_title">Choisir une variante de portefeuille </string>
|
||||
<string name="wallet_balance_token_title"> Jeton d\'authentification </string>
|
||||
<string name="wallet_balance_tokens_title">Jetons d\'authentification </string>
|
||||
<string name="wallet_balance_verified">Solde confirmé </string>
|
||||
<string name="wallet_balance_loading"> Solde est en cours de téléchargement …</string>
|
||||
<string name="wallet_balance_blockchain_unreachable">Blockchain est inaccessible </string>
|
||||
<string name="wallet_error_no_account">Compte n’est pas créé </string>
|
||||
<string name="wallet_error_no_account_subtitle_format"> Téléchargez %s +%s pour créer un compte </string>
|
||||
<string name="wallet_error_empty_card">Carte vide </string>
|
||||
<string name="wallet_error_empty_card_subtitle">Créez un portefeuille pour commencer à utiliser votre carte Tangem </string>
|
||||
<string name="wallet_error_unsupported_blockchain">Cette carte n\'est pas prise en charge </string>
|
||||
<string name="wallet_error_unsupported_blockchain_subtitle">Votre carte Tangem a été créée pour fonctionner avec une autre application. Regardez le nom et les instructions sur votre carte et installez l\'application pertinente </string>
|
||||
<string name="wallet_balance_tx_in_progress">Transaction en cours…</string>
|
||||
<string name="wallet_pending_tx_sending">Envoi\u0020</string>
|
||||
<string name="wallet_pending_tx_sending_address_format">jusqu’à %s </string>
|
||||
<string name="wallet_pending_tx_receiving">Réception \u0020</string>
|
||||
<string name="wallet_pending_tx_receiving_address_format">de %s </string>
|
||||
<string name="wallet_address_button_explore">Explorer l\'adresse </string>
|
||||
<string name="wallet_address_button_create_payid">Créer PayID</string>
|
||||
<string name="wallet_qr_title_format">Portefeuille %s</string>
|
||||
<string name="wallet_create_payid">Créer PayID</string>
|
||||
<string name="wallet_create_payid_card_format">Carte: %s</string>
|
||||
<string name="wallet_create_payid_hint">Dénomination PayID</string>
|
||||
<string name="wallet_create_payid_domain">$payid.tangem.com</string>
|
||||
<string name="wallet_create_payid_button_title">Créer </string>
|
||||
<string name="wallet_create_payid_info">Votre PayID est une information qui vous est propre, comme un numéro de téléphone, une adresse du courrier électronique ou un ABN.</string>
|
||||
<string name="wallet_create_payid_success_message">PayID a été créé avec succès et copié dans le presse-papiers </string>
|
||||
<string name="wallet_create_payid_error_message">Mauvaise réponse lors de la création de PayID </string>
|
||||
<string name="wallet_create_payid_error_already_created">Ce PayID existe déjà. Essayez une autre variante.</string>
|
||||
<string name="send_destination_hint">Adresse ou PayID</string>
|
||||
<string name="send_title">Envoyer </string>
|
||||
<string name="send_network_fee_title">Commissions du réseau </string>
|
||||
<string name="send_amount_label">Somme </string>
|
||||
<string name="send_fee_label">Commissions </string>
|
||||
<string name="send_total_label">Total </string>
|
||||
<string name="send_max_amount_label">Somme maximale </string>
|
||||
<string name="send_validation_invalid_address">Adresse incorrecte </string>
|
||||
<string name="send_validation_invalid_amount">Somme incorrecte </string>
|
||||
<string name="send_validation_amount_exceeds_balance">Le montant dépasse le solde </string>
|
||||
<string name="send_validation_invalid_total">Le total dépasse le solde </string>
|
||||
<string name="send_validation_invalid_fee">Les commissions dépassent le solde </string>
|
||||
<string name="send_fee_picker_low">Bas </string>
|
||||
<string name="send_fee_picker_normal">Normal </string>
|
||||
<string name="send_fee_picker_priority">Priorité </string>
|
||||
<string name="send_fee_include_description">Inclure les commissions </string>
|
||||
<string name="send_total_subtitle_format">Sera envoyé %s %s</string>
|
||||
<string name="send_total_subtitle_fiat_format">≈ %s (incl. les commissions : %s)</string>
|
||||
<string name="send_total_subtitle_asset_format">Sera envoyé %s %s et %s %s</string>
|
||||
<string name="send_balance_subtitle_format">Solde : %s %s</string>
|
||||
<string name="send_transaction_success">La transaction a été signée avec succès et envoyée au nœud de blockchain. Le solde du portefeuille sera mis à jour après un certain temps </string>
|
||||
<string name="details_title">Référénces </string>
|
||||
<string name="details_row_title_cid">ID de la carte </string>
|
||||
<string name="details_row_title_issuer">Emetteur </string>
|
||||
<string name="details_row_title_signed_hashes">Signé </string>
|
||||
<string name="details_row_subtitle_signed_hashes_format">%s hashes </string>
|
||||
<string name="details_row_title_currency">Monnaie de l’application </string>
|
||||
<string name="details_section_title_settings">Paramètres </string>
|
||||
<string name="details_section_title_card">Carte </string>
|
||||
<string name="details_row_title_validate">Valider la carte </string>
|
||||
<string name="details_row_title_manage_security">Gestion de la sécurité </string>
|
||||
<string name="details_row_title_erase_wallet">Annuler le portefeuille </string>
|
||||
<string name="details_erase_wallet_warning">Cette action est irréversible. Si, après avoir annulé le portefeuille, quelqu\'un lui envoie des fonds, vous ne pourrez pas les retirer.</string>
|
||||
<string name="details_security_management_warning">Si vous oubliez le code, vous perdrez la possibilité d\'utiliser la carte. Si vous perdez le code, il sera impossible de le restaurer ou modifier. </string>
|
||||
<string name="details_manage_security_title">Gestion de la sécurité </string>
|
||||
<string name="details_manage_security_long_tap">Tenez la carte fermement</string>
|
||||
<string name="details_manage_security_long_tap_description">Ce mécanisme protège contre les attaques sans contact sur la carte. Il y a un délai entre la réception et l\'exécution de la commande. Après la première transaction signée, ce téléphone sera associé à la carte et les transactions seront signées immédiatement.</string>
|
||||
<string name="details_manage_security_passcode">Mot de passe </string>
|
||||
<string name="details_manage_security_passcode_description">Avant d\'exécuter une commande qui modifie l\'état de la carte, vous devrez entrer un mot de passe.</string>
|
||||
<string name="details_manage_security_access_code">Code d’accès </string>
|
||||
<string name="details_manage_security_access_code_description">Vous devrez entrer le mot de passe correct avant de scanner la carte </string>
|
||||
<string name="alert_old_device_this_card">Vous pouvez rencontrer des problèmes NFC avec certains iPhone 7/7 + lors de l’extraction </string>
|
||||
<string name="alert_card_signed_transactions">Attention: cette carte a déjà été rechargée et a signé des transactions avant. Envisagez la possibilité de retirer tous les fonds immédiatement si vous avez reçu cette carte d\'une source non fiable.</string>
|
||||
<string name="alert_unsupported_card">Cette carte n\'est pas conçue pour fonctionner avec Tangem Tap </string>
|
||||
<string name="alert_developer_card">La carte que vous avez scannée est une carte de développement. Ne l\'acceptez pas comme paiement </string>
|
||||
<string name="alert_old_card">Les cartes Tangem émises avant septembre 2019 ne peuvent actuellement pas être extraites à l\'aide de l\'iPhone. Nous travaillons activement avec Apple pour rendre cela possible dans les futures versions d\'iOS. </string>
|
||||
<string name="initial_message_sign_header">Touchez pour signer </string>
|
||||
<string name="initial_message_sign_body">Appuyez votre carte au téléphone comme indiqué ci-dessus </string>
|
||||
<string name="initial_message_purge_wallet_body">Touchez, pour annuler un portefeuille </string>
|
||||
<string name="initial_message_create_wallet_body">Touchez, pour créer un portefeuille </string>
|
||||
<string name="initial_message_change_access_code_body">Touchez, pour modifier le code d’accès </string>
|
||||
<string name="initial_message_change_passcode_body">Touchez, pour modifier le mot de passe </string>
|
||||
<string name="payid_service_error_loading">PayID incorrect </string>
|
||||
|
||||
<string name="disclaimer_text">
|
||||
|
||||
Avertissement
|
||||
|
||||
\n\n1.Application Tangem Tap (Logiciel)
|
||||
|
||||
\n\nLe logiciel est destiné à l\’utilisation exclusivement avec les e-portefeuilles Tangem (Cartes) à l\’aide de l\’interface NFC. Le logiciel NE réalise pas ce qui suit :
|
||||
|
||||
\n\na. Génération, stockage, transmission ou octroi d\’accès aux clés privées (confidentiels) de chiffrement des blockchain-portefeuilles, qui contiennent les avoirs numériques, y compris la crypto-monnaie.
|
||||
\n\nb. Génération, stockage, transmission ou octroi d\’accès aux clés confidentielles, aux mots de passe, phrases secrètes, phrases de restitution, qui pourront être utilisées pour la restitution ou pour le clonage des clés privées (confidentiels) de chiffrement des blockchain-portefeuilles, contenant les avoirs numériques, y compris la crypto-monnaie.
|
||||
\n\nc. Prestation des services de bourse, de commerce, d\’investissement du nom de Tangem AG.
|
||||
|
||||
|
||||
\n\n2. Risques, liés avec l\’utilisation du logiciel
|
||||
|
||||
\n\nTangem n\’assume aucune responsabilité pour tous les dommages, préjudice ou prétentions, qui peuvent survenir comme résultat des évènements, se rapportant à une de cinq catégories suivantes :
|
||||
|
||||
|
||||
\n\na. Les erreurs, commises par l\’utilisateur de tout logiciel ou service liés avec la crypto-monnaie, par exemple, les mots de passe oubliés, les paiements envoyés aux adresses incorrectes, et élimination occasionnelle des blockchain-portefeuilles sur les Cartes.
|
||||
\n\nb. Les problèmes du Logiciel et/ou de tout progiciel ou service liés avec blockchain ou avec la crypto-monnaie, par exemple, les fichiers endommagés, les transaction créées d\’une manière incorrecte, les bibliothèques cryptographiques non sécurisées, les logiciels malveillants.
|
||||
\n\nc. Les défaillances techniques du hardware de l\’utilisateur, y compris les Cartes, de tout logiciel ou service liés avec la crypto-monnaie, par exemple, la perte des données à cause des périphériques défectives ou endommagées de stockage.
|
||||
\n\nd. Les problèmes de la sécurité, subis par l\’utilisateur de tout logiciel ou service liés avec la crypto-monnaie, par exemple, l\’accès non autorisé aux portefeuilles et/ou comptes des utilisateurs.
|
||||
\n\ne. Les actions ou l\’inaction des tierces personnes et/ou les évènements subis par les tierces personnes, par exemple, la faillite du prestataire de services, les attaques sur la sécurité informatique des prestataires de services et la fraude commise par des tierces personnes.
|
||||
|
||||
\n\n3. Risques commerciales et d\’investissement
|
||||
|
||||
\n\nToute échange de crypto-monnaie ou d\’autres avoirs numériques implique les risques importants. Toute transaction liée avec la monnaie implique les risques, qui incluent, entre autres, la possibilité de modification des conditions économiques, qui peuvent influencer d\’une manière significative le prix ou la disponibilité de la monnaie. Les investissements dans les spéculations boursières avec les crypto-monnaies peuvent aussi être exposés aux montées et chutes en flèche lors des fluctuations des valeurs marchandes correspondants. C\'est pour cette raison, que lors de la spéculation sur tels marchés, il est conseillé d\’utiliser seulement le capital-risque.
|
||||
|
||||
|
||||
\n\n4. Risques de commerce électronique
|
||||
|
||||
\n\nAvant de passer aux transactions en utilisant le système électronique, Vous devez prendre connaissance, d\’une manière bien attentive, des règles et des dispositions stipulées par les bourses qui offrent ce système, et/ou les listes des titres de placement que vous voulez négocier. Le commerce en ligne possède le risque inaliénable lié avec la vitesse de réponse du système et avec le temps d\’accès qui peuvent varier en fonction des conditions de marché, du rendement du système et d\’autres facteurs. Avant de commencer les négoces, vous devez comprendre ces risques aussi que les risques supplémentaires.
|
||||
|
||||
\n\n5. Respect des obligations fiscales
|
||||
|
||||
\n\nLes utilisateurs du Logiciel assument toute la responsabilité pour définir, quels impôts sont appliqués à leurs transactions avec la crypto-monnaie, au cas où il y a de tels impôts. Les propriétaires et les participants à l\’élaboration du Logiciel n\’assument pas la responsabilité pour la définition des impôts qui sont appliqués aux transactions avec la crypto-monnaie.
|
||||
|
||||
\n\n6. Absence de garanties
|
||||
|
||||
\n\nLe logiciel est concédé sous les conditions « tel quel », sans aucune garantie à l\’égard du Logiciel et/ou de tout le contenu, données, matériaux et/ou services, présentes dans ce Logiciel.
|
||||
|
||||
\n\n7. Restriction de la responsabilité
|
||||
|
||||
\n\nSauf disposition contraire prévue par la législation, les propriétaires et les participants à l\’élaboration du Logiciel n\’assument pas la responsabilité pour aucun dommage, y compris l\’indisponibilité, la perte de profit ou la perte des données, qui surviennent comme résultat de l\’utilisation ou bien qui sont liés d\’une certaine manière avec l\’utilisation du Logiciel. Les propriétaires et les participants à l\’élaboration du Logiciel n\’assument pas la responsabilité pour les actions, les résolutions ou pour une autre conduite que vous manifestez ou pas par l\’intermédiaire du Logiciel.
|
||||
|
||||
|
||||
\n\n8. Dernière modification
|
||||
|
||||
\n\nCette avertissement a été modifié, pour la dernière fois, le 1 octobre 2020.
|
||||
|
||||
</string>
|
||||
<string name="disclaimer_title"> Conditions d\'utilisation</string>
|
||||
|
||||
<string name="wallet_notification_no_internet">Pas de connexion internet</string>
|
||||
<string name="initial_message_scan_header">Touchez pour scanner</string>
|
||||
<string name="initial_message_tap_header">Touchez pour scanner</string>
|
||||
<string name="send_error_no_target_account">Le compte cible n\'a pas été créé. Le montant à envoyer doit être de %1$s %2$s + commissions ou plus</string>
|
||||
<string name="send_error_fee_request_failed">Échec de réception des commissions</string>
|
||||
|
||||
</resources>
|
||||
|
|
@ -2,129 +2,201 @@
|
|||
|
||||
<string name="app_name" translatable="false">Tangem Tap</string>
|
||||
|
||||
<string name="generic_done">Done</string>
|
||||
<string name="generic_cancel">Cancel</string>
|
||||
<string name="generic_retry">Retry</string>
|
||||
<string name="generic_and">and</string>
|
||||
<string name="generic_warning">Warning</string>
|
||||
<string name="common_no">No</string>
|
||||
<string name="common_save_changes">Save changes</string>
|
||||
<string name="common_warning">Warning</string>
|
||||
<string name="common_retry">Retry</string>
|
||||
<string name="common_done">Done</string>
|
||||
<string name="common_cancel">Cancel</string>
|
||||
<string name="common_accept">Accept</string>
|
||||
|
||||
<string name="tap_to_scan">Tap to scan</string>
|
||||
<string name="tap_the_card">Tap the card</string>
|
||||
<string name="tap_to_sign">Tap to sign</string>
|
||||
<string name="tap_to_purge_wallet">Tap to purge wallet</string>
|
||||
<string name="tap_to_create_wallet">Tap to create wallet</string>
|
||||
<string name="tap_to_change_passcode">Tap to change passcode</string>
|
||||
<string name="tap_to_change_access_code">Tap to change access code</string>
|
||||
<string name="common_camera_denied_alert_title">Camera access denied</string>
|
||||
<string name="common_camera_denied_alert_message">You have not given access to your camera, please adjust your privacy settings</string>
|
||||
<string name="common_camera_alert_button_settings">Settings</string>
|
||||
|
||||
<string name="notification_address_copied">Address was successfully copied</string>
|
||||
<string name="notification_no_internet">No internet connection</string>
|
||||
<string name="notification_no_internet_retry">@string/generic_retry</string>
|
||||
|
||||
<string name="home_do_you_have_card">Welcome to Tangem.\nDo you have one of our cards?</string>
|
||||
<string name="home_welcome">Welcome to Tangem.\nDo you have one of our cards?</string>
|
||||
<string name="home_welcome_back">Welcome back to Tangem Tap. \nScan your card to start.</string>
|
||||
<string name="home_button_yes">Yes. Scan it!</string>
|
||||
<string name="home_button_scan">Scan card</string>
|
||||
<string name="home_button_shop">Shop</string>
|
||||
<string name="home_button_no_card">No</string>
|
||||
<string name="home_ready_title">Get ready to tap your \ncard to the back of the \nphone.</string>
|
||||
<string name="home_button_tapin">Tap in</string>
|
||||
<string name="home_button_scan">Scan card</string>
|
||||
<string name="home_button_yes">Yes! Scan it.</string>
|
||||
|
||||
<string name="wallet_toolbar_title" translatable="false">Tangem Tap</string>
|
||||
<string name="wallet_button_scan">Scan</string>
|
||||
<string name="wallet_button_send">Send</string>
|
||||
<string name="wallet_button_create_wallet">Create Wallet</string>
|
||||
<string name="wallet_explore_address">Explore address</string>
|
||||
<string name="wallet_button_create_wallet">Create wallet</string>
|
||||
<string name="wallet_title">Tangem Tap</string>
|
||||
<string name="wallet_choice_wallet_option_title">Choice wallet option</string>
|
||||
|
||||
<string name="wallet_balance_token_title">Token</string>
|
||||
<string name="wallet_balance_tokens_title">Tokens</string>
|
||||
<string name="wallet_balance_verified">Verified Balance</string>
|
||||
<string name="wallet_balance_loading">Balance is loading…</string>
|
||||
<string name="wallet_balance_blockchain_unreachable">Blockchain is unreachable</string>
|
||||
|
||||
<string name="wallet_error_no_account">Account is not created</string>
|
||||
<string name="wallet_error_no_account_subtitle_format">Load %1$s+ %2$s to create account</string>
|
||||
<string name="wallet_error_empty_card">Empty card</string>
|
||||
<string name="wallet_error_empty_card_subtitle">Create wallet to start using Tangem card</string>
|
||||
<string name="wallet_error_unsupported_blockchain">This card is not supported</string>
|
||||
<string name="wallet_error_unsupported_blockchain_subtitle">Your Tangem card was made to work with a different application. Please see the name and instructions on your card, and install the correct app</string>
|
||||
|
||||
<string name="wallet_balance_tx_in_progress">Transaction is in progress…</string>
|
||||
<string name="wallet_pending_tx_sending_address_format">to %s</string>
|
||||
<string name="wallet_pending_tx_receiving_address_format">from %s</string>
|
||||
<string name="wallet_pending_tx_receiving">Receiving\u0020</string>
|
||||
<string name="wallet_pending_tx_sending">Sending\u0020</string>
|
||||
|
||||
<string name="wallet_address_button_explore">Explore address</string>
|
||||
<string name="wallet_address_button_create_payid">Create PayID</string>
|
||||
<string name="wallet_qr_title_format">$s wallet</string>
|
||||
|
||||
<string name="wallet_create_payid">Create PayID</string>
|
||||
<string name="wallet_verified_balance">Verified Balance</string>
|
||||
<string name="wallet_blockchain_is_unreachable">Blockchain is unreachable</string>
|
||||
<string name="wallet_transaction_in_progress">Transaction is in progress</string>
|
||||
<string name="wallet_unknown_blockchain">Your Tangem card was made to work with a different application. Please see the name and instructions on your card, and install the correct app.</string>
|
||||
<string name="wallet_unknown_blockchain_title">Uh oh!</string>
|
||||
<string name="wallet_balance_is_loading">Balance is loading…</string>
|
||||
<string name="wallet_account_not_created">Account is not created</string>
|
||||
<string name="wallet_empty_card">Empty Card</string>
|
||||
<string name="wallet_empty_card_description">Create wallet to start using Tangem card</string>
|
||||
<string name="wallet_no_account">Account is not created</string>
|
||||
<string name="wallet_no_account_description">Load %1s+ %2s to create account</string>
|
||||
<string name="wallet_tokens">Tokens</string>
|
||||
<string name="wallet_pending_transaction_incoming">Receiving\u0020</string>
|
||||
<string name="wallet_pending_transaction_outcoming">Sending\u0020</string>
|
||||
<string name="wallet_pending_transaction_incoming_address"> from %s </string>
|
||||
<string name="wallet_pending_transaction_outcoming_address"> to %s </string>
|
||||
|
||||
<string name="wallet_dialog_pay_id_button">Create PayID</string>
|
||||
<string name="wallet_create_payid_empty">Enter desired PayID first</string>
|
||||
<string name="wallet_dialog_pay_id_hint">PayID name</string>
|
||||
<string name="wallet_pay_id_address" translatable="false">$payid.tangem.com</string>
|
||||
<string name="wallet_dialog_pay_id_description">Your PayID is information unique to you, like your phone number, email or ABN.</string>
|
||||
<string name="wallet_dialog_qr_code_header">%s wallet</string>
|
||||
|
||||
<string name="wallet_warning_dev_card">The card you scanned is a development card. Don\'t accept it as a payment.</string>
|
||||
<string name="warning_card_signed_transactions">Warning: This card has been already topped up and signed transactions in the past.
|
||||
Consider immediate withdrawal of all funds if you have received this card from an untrusted source.</string>
|
||||
|
||||
<string name="error_payid_already_created">This PayID already exists. Try a different one.</string>
|
||||
<string name="error_creating_payid">Error response while creating PayID.</string>
|
||||
|
||||
<string name="error_card_for_different_app">This card it is not designed to work with Tangem Tap</string>
|
||||
|
||||
<string name="error_unknown">Unknown error</string>
|
||||
<string name="error_payid_verification_failed">PayID verification failed</string>
|
||||
<string name="error_payid_unsupported_by_blockchain">PayID unsupported by blockchain</string>
|
||||
<string name="error_payid_not_registere">PayID not registered</string>
|
||||
<string name="error_payid_request_failed">PayID request failed</string>
|
||||
<string name="error_address_invalid_or_unsupported">Address is invalid or unsupported by blockchain</string>
|
||||
<string name="error_address_same_as_wallet">Address is the same as wallet address</string>
|
||||
<string name="error_fee_request_failed">Network fee request is failed</string>
|
||||
<string name="error_insufficient_balance">Insufficient balance</string>
|
||||
<string name="error_blockchain_internal">Blockchain internal error</string>
|
||||
<string name="amount_exceeds_balance">Amount Exceeds Balance</string>
|
||||
<string name="fee_exceeds_balance">Fee Exceeds Balance</string>
|
||||
<string name="total_exceeds_balance">Total Exceeds Balance</string>
|
||||
<string name="invalid_amount_value">Invalid Amount</string>
|
||||
<string name="invalid_fee_value">Invalid Fee</string>
|
||||
<string name="dust_amount">Minimum amount is %s</string>
|
||||
<string name="dust_change">Change is too small</string>
|
||||
<string name="create_account_underfunded">Target account is not created. Send more than %1$s %2$s to create</string>
|
||||
<string name="wallet_create_payid_card_format">Card: %s</string>
|
||||
<string name="wallet_create_payid_hint">PayID name</string>
|
||||
<string name="wallet_create_payid_domain">$payid.tangem.com</string>
|
||||
<string name="wallet_create_payid_button_title">Create</string>
|
||||
<string name="wallet_create_payid_info">Your PayID is information unique to you, like your phone number, email or ABN.</string>
|
||||
<string name="wallet_create_payid_success_message">PayID created successfully and copied to clipboard</string>
|
||||
<string name="wallet_create_payid_error_message">Error response while creating PayID</string>
|
||||
<string name="wallet_create_payid_error_already_created">This PayID already exists. Try a different one.</string>
|
||||
|
||||
<string name="send_destination_hint">Address or PayID</string>
|
||||
<string name="send_title">Send</string>
|
||||
<string name="send_address_or_payid">Address or PayID</string>
|
||||
<string name="send_fee">Network fee</string>
|
||||
<string name="send_fee_include">Include fee</string>
|
||||
<string name="send_fee_low">Low</string>
|
||||
<string name="send_fee_normal">Normal</string>
|
||||
<string name="send_fee_priority">Priority</string>
|
||||
<string name="send_btn_send">Send</string>
|
||||
<string name="send_total">Total</string>
|
||||
<string name="send_total_amount">Amount</string>
|
||||
<string name="send_total_fee">Fee</string>
|
||||
<string name="send_total_will_be_sent">will be sent</string>
|
||||
<string name="send_balance">Balance: %1s %2s</string>
|
||||
<string name="send_set_maximum_amount">Maximum amount</string>
|
||||
<string name="send_transaction_complete">Transaction was signed and sent to the blockchain</string>
|
||||
<string name="send_network_fee_title">Network fee</string>
|
||||
<string name="send_amount_label">Amount</string>
|
||||
<string name="send_fee_label">Fee</string>
|
||||
<string name="send_total_label">Total</string>
|
||||
<string name="send_max_amount_label">Maximum amount</string>
|
||||
<string name="send_validation_invalid_address">Invalid address</string>
|
||||
<string name="send_validation_invalid_amount">Invalid amount</string>
|
||||
<string name="send_validation_amount_exceeds_balance">Amount Exceeds Balance</string>
|
||||
<string name="send_validation_invalid_total">Total Exceeds Balance</string>
|
||||
<string name="send_validation_invalid_fee">Fee Exceeds Balance</string>
|
||||
<string name="send_fee_picker_low">Low</string>
|
||||
<string name="send_fee_picker_normal">Normal</string>
|
||||
<string name="send_fee_picker_priority">Priority</string>
|
||||
<string name="send_fee_include_description">Include fee</string>
|
||||
<string name="send_total_subtitle_format">%1$s %2$s will be sent</string>
|
||||
<string name="send_total_subtitle_fiat_format">≈ %1$s (inc. fee: %2$s)</string>
|
||||
<string name="send_total_subtitle_asset_format">%1$s %2$s and %3$s %4$s will be sent</string>
|
||||
<string name="send_balance_subtitle_format">Balance: %1$s %2$s</string>
|
||||
<string name="send_transaction_success">Transaction has been successfully signed and sent to blockchain node. Wallet balance will be updated in a while</string>
|
||||
|
||||
<string name="details_title">Details</string>
|
||||
<string name="details_row_title_cid">Card ID</string>
|
||||
<string name="details_row_title_issuer">Issuer</string>
|
||||
<string name="details_row_title_signed_hashes">Signed</string>
|
||||
<string name="details_row_subtitle_signed_hashes_format">%s hashes</string>
|
||||
<string name="details_row_title_currency">App currency</string>
|
||||
<string name="details_section_title_settings">Settings</string>
|
||||
<string name="details_section_title_card">Card</string>
|
||||
<string name="details_row_title_validate">Validate card</string>
|
||||
<string name="details_row_title_manage_security">Manage Security</string>
|
||||
<string name="details_row_title_erase_wallet">Erase wallet</string>
|
||||
<string name="details_erase_wallet_warning">This action is irreversible. If, after deleting the wallet, someone sends funds to it, then you will not be able to withdraw them.</string>
|
||||
<string name="details_security_management_warning">If you forget the code, you will lose the ability to use the card. There is no way to recover or change your code if you lose it.</string>
|
||||
<string name="details_manage_security_title">Manage Security</string>
|
||||
<string name="details_manage_security_long_tap">Long Tap</string>
|
||||
<string name="details_manage_security_long_tap_description">This mechanism protects against proximity attack on a card. It will enforce a delay between reception and execution of a command. After the first signed transaction this phone will be linked with the card and transactions will be signed immediately.</string>
|
||||
<string name="details_manage_security_passcode">Passcode</string>
|
||||
<string name="details_manage_security_passcode_description">Before execution any command entailing a change of the card state you will have to enter the passcode.</string>
|
||||
<string name="details_manage_security_access_code">Access code</string>
|
||||
<string name="details_manage_security_access_code_description">You will have to submit the correct access code before scanning the card</string>
|
||||
|
||||
<string name="alert_old_device_this_card">You may experience NFC problems with some iPhone 7/7+ during the extraction</string>
|
||||
<string name="alert_card_signed_transactions">Warning: This card has been already topped up and signed transactions in the past.\n\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020Consider immediate withdrawal of all funds if you have received this card from an untrusted source.</string>
|
||||
<string name="alert_unsupported_card">This card it is not designed to work with Tangem Tap</string>
|
||||
<string name="alert_developer_card">The card you scanned is a development card. Don’t accept it as a payment</string>
|
||||
<string name="alert_old_card">Tangem cards manufactured before September 2019 cannot currently be extracted with an iPhone. We’re working hard with Apple to make it possible in future versions of iOS.</string>
|
||||
|
||||
<string name="initial_message_sign_header">Tap to sign</string>
|
||||
<string name="initial_message_sign_body">Tap the card to your phone as shown above</string>
|
||||
<string name="initial_message_purge_wallet_body">Tap to erase wallet</string>
|
||||
<string name="initial_message_create_wallet_body">Tap to create wallet</string>
|
||||
<string name="initial_message_change_access_code_body">Tap to change the access code</string>
|
||||
<string name="initial_message_change_passcode_body">Tap to change the passcode</string>
|
||||
|
||||
<string name="payid_service_error_loading">Invalid PayID</string>
|
||||
|
||||
<string name="disclaimer_text">Legal Disclaimer
|
||||
\n
|
||||
\n1. Tangem Tap application (Software)
|
||||
\n
|
||||
\nThe Software is intended for usage only with Tangem hardware wallets (Cards) via NFC interface. The Software DOES NOT:
|
||||
\n
|
||||
\na) Generate, store, transmit, or have access to private (secret) cryptographic keys to blockchain wallets holding digital assets, including crypto-currency.
|
||||
\n
|
||||
\nb) Generate, store, transmit, or have access to secret keys, passwords, passphrases, recovery phrases that can be used to restore or to copy private (secret) keys to blockchain wallets holding digital assets, including crypto-currency.
|
||||
\n
|
||||
\nc) Provide exchange, trading, investment services on behalf of Tangem AG.
|
||||
\n
|
||||
\n2. Risks related to the use of Software
|
||||
\n
|
||||
\nTangem will not be responsible for any losses, damages or claims arising from events falling within the scope of the following five categories:
|
||||
\n
|
||||
\na) Mistakes made by the user of any cryptocurrency-related software or service, e.g., forgotten passwords, payments sent to wrong addresses, and accidental deletion of blockchain wallets on Cards.
|
||||
\n
|
||||
\nb) Problems of Software and/or any blockchain- or cryptocurrency- related software or service, e.g., corrupted files, incorrectly constructed transactions, unsafe cryptographic libraries, malware.
|
||||
\n
|
||||
\nc) Technical failures in the hardware of the user, including Cards, of any cryptocurrency-related software or service, e.g., data loss due to a faulty or damaged storage device.
|
||||
\n
|
||||
\nd) Security problems experienced by the user of any cryptocurrency-related software or service, e.g., unauthorized access to users’ wallets and/or accounts.
|
||||
\n
|
||||
\ne) Actions or inactions of third parties and/or events experienced by third parties, e.g., bankruptcy of service providers, information security attacks on service providers, and fraud conducted by third parties.
|
||||
\n
|
||||
\n3. Trading and Investment risks
|
||||
\n
|
||||
\nThere is considerable exposure to risk in any crypto-currency or other digital asset exchange transaction. Any transaction involving currencies involves risks including, but not limited to, the potential for changing economic conditions that may substantially affect the price or liquidity of a currency. Investments in crypto-currency exchange speculation may also be susceptible to sharp rises and falls as the relevant market values fluctuate. It is for this reason that when speculating in such markets it is advisable to use only risk capital.
|
||||
\n
|
||||
\n4. Electronic Trading Risks
|
||||
\n
|
||||
\nBefore you engage in transactions using an electronic system, you should carefully review the rules and regulations of the exchanges offering the system and/or listing the instruments you intend to trade. Online trading has inherent risk due to system response and access times that may vary due to market conditions, system performance, and other factors. You should understand these and additional risks before trading.
|
||||
\n
|
||||
\n5. Compliance with tax obligations
|
||||
\n
|
||||
\nThe users of the Software are solely responsible to determinate what, if any, taxes apply to their crypto-currency transactions. The owners of, or contributors to, the Software are NOT responsible for determining the taxes that apply to crypto-currency transactions.
|
||||
\n
|
||||
\n6. No warranties
|
||||
\n
|
||||
\nThe Software is provided on an \“as is\” basis without any warranties of any kind regarding the Software and/or any content, data, materials and/or services provided on the Software.
|
||||
\n
|
||||
\n7. Limitation of liability
|
||||
\n
|
||||
\nUnless otherwise required by law, in no event shall the owners of, or contributors to, the Software be liable for any damages of any kind, including, but not limited to, loss of use, loss of profits, or loss of data arising out of or in any way connected with the use of the Software. In no way are the owners of, or contributors to, the Software responsible for the actions, decisions, or other behavior taken or not taken by you in reliance upon the Software.
|
||||
\n
|
||||
\n8. Last amendment
|
||||
\n
|
||||
\nThis disclaimer was amended for the last time on October 1st, 2020.</string>
|
||||
<string name="disclaimer_title">Terms of service</string>
|
||||
|
||||
<string name="send_error_fee_request_failed">Failed to get fee</string>
|
||||
<string name="send_error_no_target_account">Target account is not created. Amount to send should be %1$s %2$s + fee or more to create</string>
|
||||
<string name="wallet_notification_no_internet">No internet connection</string>
|
||||
|
||||
<string name="send_error_unknown">Unknown error</string>
|
||||
<string name="send_error_payid_verification_failed">PayID verification failed</string>
|
||||
<string name="send_error_payid_unsupported_by_blockchain">PayID unsupported by blockchain</string>
|
||||
<string name="send_error_payid_not_registered">PayID not registered</string>
|
||||
<string name="send_error_payid_request_failed">PayID request failed</string>
|
||||
|
||||
<string name="send_error_address_same_as_wallet">Address is the same as wallet address</string>
|
||||
<string name="send_error_insufficient_balance">Insufficient balance</string>
|
||||
<string name="send_error_blockchain_internal">Blockchain internal error</string>
|
||||
<string name="send_error_invalid_fee_value">Invalid Fee</string>
|
||||
<string name="send_error_dust_amount_format">Minimum amount is %s</string>
|
||||
<string name="send_error_dust_change">Change is too small</string>
|
||||
|
||||
<string name="wallet_notification_address_copied">Address was copied to clipboard</string>
|
||||
|
||||
|
||||
<string name="wallet_create_payid_empty">Enter desired PayID first</string>
|
||||
|
||||
<string name="initial_message_scan_header">Tap to scan</string>
|
||||
<string name="initial_message_tap_header">Tap the card</string>
|
||||
|
||||
<string name="details_toolbar_title">Details</string>
|
||||
<string name="details_notification_erase_wallet_not_allowed">Card settings prohibits from erasing wallet</string>
|
||||
<string name="details_notification_erase_wallet_not_possible">You balance on this wallet is not zero, or you have unconfirmed transactions</string>
|
||||
<string name="details_notification_security_option_already_active">This is the currently active option</string>
|
||||
<string name="details_card_id">Card ID</string>
|
||||
<string name="details_issuer">Issuer</string>
|
||||
<string name="details_signed_hashes">Signed</string>
|
||||
<string name="details_settings">Settings</string>
|
||||
<string name="details_currency">App currency</string>
|
||||
<string name="details_card">Card</string>
|
||||
<string name="details_validate_card">Validate card</string>
|
||||
<string name="details_manage_security">Manage security</string>
|
||||
<string name="details_erase_wallet">Erase wallet</string>
|
||||
<string name="details_save_changes">Save changes</string>
|
||||
<string name="details_continue">Continue</string>
|
||||
<string name="details_manage_security_long_tap">Long Tap</string>
|
||||
<string name="details_manage_security_passcode">Passcode</string>
|
||||
<string name="details_manage_security_access_code">Access Code</string>
|
||||
<string name="details_manage_security_long_tap_description">This mechanism protects against proximity attack on a card. It will enforce a delay between reception and execution of a command. After the first signed transaction this phone will be linked with the card and transactions will be signed immediately.</string>
|
||||
<string name="details_manage_security_passcode_description">Before execution of any command entailing a change of the card state you will have to enter the passcode.</string>
|
||||
<string name="details_manage_security_access_code_description">You will have to submit the correct access code before scanning the card.</string>
|
||||
<string name="details_erase_wallet_warning">This action is irreversible. If, after deleting the wallet, someone sends funds to it, then you will not be able to withdraw them.</string>
|
||||
<string name="details_manage_security_warning">If you forget the code, you will lose the ability to use the card. There is no way to recover or change your code if you lose it.
|
||||
</string>
|
||||
|
||||
|
||||
</resources>
|
||||
Loading…
Add table
Add a link
Reference in a new issue