diff --git a/app/src/main/assets/testnet_tokens.json b/app/src/main/assets/testnet_tokens.json index 179a72b282..25abb76a88 100644 --- a/app/src/main/assets/testnet_tokens.json +++ b/app/src/main/assets/testnet_tokens.json @@ -430,6 +430,17 @@ "networkId" : "polkadot/test" } ] + }, + { + "id": "optimistic-ethereum", + "name": "Optimistic Ethereum", + "symbol": "ETH", + "active": true, + "networks": [ + { + "networkId": "optimistic-ethereum/test" + } + ] } ], diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index ca63f4a459..d7c7fea602 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -10,6 +10,7 @@ import com.tangem.Log import com.tangem.LogFormat import com.tangem.blockchain.network.BlockchainSdkRetrofitBuilder import com.tangem.domain.DomainLayer +import com.tangem.domain.common.LogConfig import com.tangem.network.common.MoshiConverter import com.tangem.tap.common.AndroidAssetReader import com.tangem.tap.common.analytics.GlobalAnalyticsHandler @@ -38,7 +39,6 @@ val store = Store( middleware = AppState.getMiddleware(), state = AppState(), ) -val logConfig = LogConfig() lateinit var foregroundActivityObserver: ForegroundActivityObserver @@ -69,11 +69,14 @@ class TapApplication : Application(), ImageLoaderFactory { initConfigManager(configLoader, ::initWithConfigDependency) initWarningMessagesManager() - BlockchainSdkRetrofitBuilder.enableNetworkLogging = BuildConfig.DEBUG + BlockchainSdkRetrofitBuilder.enableNetworkLogging = LogConfig.network.blockchainSdkNetwork } override fun newImageLoader(): ImageLoader { - return createCoilImageLoader(context = this) + return createCoilImageLoader( + context = this, + logEnabled = LogConfig.imageLoader + ) } private fun initConfigManager(loader: FeaturesLocalLoader, onComplete: (Config) -> Unit) { @@ -131,6 +134,7 @@ class TapApplication : Application(), ImageLoaderFactory { infoHolder = additionalFeedbackInfo, logCollector = tangemLogCollector, preferencesStorage = preferencesStorage, + logEnabled = LogConfig.zendesk, ) feedbackManager.initChat( context = context, @@ -142,10 +146,4 @@ class TapApplication : Application(), ImageLoaderFactory { private fun initWarningMessagesManager() { store.dispatch(GlobalAction.SetWarningManager(WarningMessagesManager())) } -} - -data class LogConfig( - val coil: Boolean = false, - val storeAction: Boolean = BuildConfig.DEBUG, - val zendesk: Boolean = BuildConfig.DEBUG, -) \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt index 73f63aa2a8..71165c14df 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt @@ -29,6 +29,8 @@ fun Blockchain.getRoundIconRes(): Int { Blockchain.Tron, Blockchain.TronTestnet -> R.drawable.ic_tron_round Blockchain.Gnosis -> R.drawable.ic_gnosis_round Blockchain.Polkadot, Blockchain.PolkadotTestnet -> R.drawable.ic_polkadot_round + Blockchain.Optimism, Blockchain.OptimismTestnet -> R.drawable.ic_optimism + Blockchain.Dash -> R.drawable.ic_dash else -> R.drawable.ic_tangem_logo } } @@ -57,6 +59,8 @@ fun Blockchain.getGreyedOutIconRes(): Int { Blockchain.Tron, Blockchain.TronTestnet -> R.drawable.ic_tron_no_color Blockchain.Gnosis -> R.drawable.ic_gnosis_no_color Blockchain.Polkadot, Blockchain.PolkadotTestnet -> R.drawable.ic_polkadot_no_color + Blockchain.Optimism, Blockchain.OptimismTestnet -> R.drawable.ic_optimism_no_color + Blockchain.Dash -> R.drawable.ic_dash_no_color else -> R.drawable.ic_tangem_logo } } diff --git a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt index 617f69c36d..4be902ebf7 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt @@ -1,7 +1,12 @@ package com.tangem.tap.common.extensions import android.app.Activity -import android.content.* +import android.content.ActivityNotFoundException +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.ContextWrapper +import android.content.Intent import android.content.res.Resources import android.graphics.drawable.Drawable import android.os.Build @@ -21,7 +26,6 @@ import androidx.fragment.app.Fragment import com.google.android.material.card.MaterialCardView import com.tangem.common.extensions.VoidCallback - fun Fragment.getDrawable(@DrawableRes drawableResId: Int): Drawable? { return ContextCompat.getDrawable(requireContext(), drawableResId) } @@ -53,6 +57,10 @@ fun View.getString(@StringRes id: Int, vararg formatArgs: String): String { return context.getString(id, *formatArgs) } +fun View.getQuantityString(@StringRes id: Int, quantity: Int): String { + return context.resources.getQuantityString(id, quantity, quantity) +} + fun View.getResourceName(): String { return try { resources.getResourceEntryName(id) @@ -89,15 +97,13 @@ fun View.invisible(invisible: Boolean = true, invokeBeforeStateChanged: (() -> U } else { this.show(invokeBeforeStateChanged) } - } fun Context.dpToPixels(dp: Int): Int = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), this.resources.displayMetrics + TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), this.resources.displayMetrics, ).toInt() - fun Context.pixelsToDp(pixels: Int): Int { return (pixels.toFloat() / (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)) @@ -107,7 +113,6 @@ fun Context.pixelsToDp(pixels: Int): Int { fun Context.dpToPixels(dp: Float): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, this.resources.displayMetrics) - fun Context.pixelsToDp(pixels: Float): Float = (pixels / (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)) @@ -118,14 +123,14 @@ fun MaterialCardView.setMargins( marginLeftDp: Int = 16, marginTopDp: Int = 8, marginRightDp: Int = 16, - marginBottomDp: Int = 8 + marginBottomDp: Int = 8, ) { val params = this.layoutParams (params as ViewGroup.MarginLayoutParams).setMargins( context.dpToPixels(marginLeftDp), context.dpToPixels(marginTopDp), context.dpToPixels(marginRightDp), - context.dpToPixels(marginBottomDp) + context.dpToPixels(marginBottomDp), ) this.layoutParams = params } @@ -144,7 +149,8 @@ fun Activity.setSystemBarTextColor(setTextDark: Boolean) { } fun View.hideKeyboard() { - val inputMethodManager = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager + val inputMethodManager = + context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager inputMethodManager?.hideSoftInputFromWindow(this.windowToken, 0) } @@ -182,7 +188,7 @@ fun Context.safeStartActivity( intent: Intent, options: Bundle? = null, fallback: ((ActivityNotFoundException) -> Unit)? = null, - finally: VoidCallback? = null + finally: VoidCallback? = null, ) { try { this.startActivity(intent, options) @@ -200,7 +206,7 @@ fun View.getString(resId: Int, vararg formatArgs: Any?): String { fun View.animateVisibility( show: Boolean, durationMillis: Long = SHORT_ANIMATION_DURATION, - hiddenVisibility: Int = View.GONE + hiddenVisibility: Int = View.GONE, ) { if (show) { this.animate() diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt index ddd4e6ff6d..1631952ce6 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt @@ -7,7 +7,6 @@ import com.tangem.tap.common.extensions.sendEmail import com.tangem.tap.common.log.TangemLogCollector import com.tangem.tap.common.zendesk.ZendeskConfig import com.tangem.tap.foregroundActivityObserver -import com.tangem.tap.logConfig import com.tangem.tap.persistence.PreferencesStorage import com.tangem.tap.withForegroundActivity import com.tangem.wallet.R @@ -31,6 +30,7 @@ class FeedbackManager( val infoHolder: AdditionalFeedbackInfo, private val logCollector: TangemLogCollector, private val preferencesStorage: PreferencesStorage, + private val logEnabled: Boolean = false, ) { fun initChat( context: Context, @@ -43,7 +43,7 @@ class FeedbackManager( ) // Zendesk logs - Logger.setLoggable(logConfig.zendesk) + Logger.setLoggable(logEnabled) } fun sendEmail(feedbackData: FeedbackData, onFail: ((Exception) -> Unit)? = null) { diff --git a/app/src/main/java/com/tangem/tap/common/images/Coil.kt b/app/src/main/java/com/tangem/tap/common/images/Coil.kt index 64b7b76734..5224c40df0 100644 --- a/app/src/main/java/com/tangem/tap/common/images/Coil.kt +++ b/app/src/main/java/com/tangem/tap/common/images/Coil.kt @@ -4,7 +4,6 @@ import android.content.Context import android.util.Log import coil.ImageLoader import coil.util.Logger -import com.tangem.tap.logConfig import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import timber.log.Timber @@ -12,11 +11,12 @@ import timber.log.Timber private const val COIL_LOG_TAG = "COIL" fun createCoilImageLoader( - context: Context + context: Context, + logEnabled: Boolean = false, ): ImageLoader { return ImageLoader.Builder(context) .apply { - if (!logConfig.coil) return@apply + if (!logEnabled) return@apply logger(CoilTimberLogger()) okHttpClient { diff --git a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt index 5e5daf10c8..1337effab2 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.redux -import com.tangem.tap.logConfig +import com.tangem.domain.common.LogConfig import org.rekotlin.Middleware import timber.log.Timber @@ -10,7 +10,9 @@ import timber.log.Timber val logMiddleware: Middleware = { dispatch, appState -> { nextDispatch -> { action -> - if (logConfig.storeAction) Timber.d("Dispatch action: $action") + if (LogConfig.storeAction) { + Timber.d("Dispatch action: $action") + } nextDispatch(action) } } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index 4d227fcd92..e3b1dfb9af 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -5,6 +5,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.common.extensions.ifNotNull import com.tangem.common.services.Result +import com.tangem.domain.common.LogConfig import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchDialogShow @@ -96,7 +97,8 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di ?.setWalletsInfo(action.walletManagers) } is GlobalAction.ExchangeManager.Init -> { - val config = appState()?.globalState?.configManager?.config + val appStateSafe = appState() ?: return + val config = appStateSafe.globalState.configManager?.config ifNotNull( config?.mercuryoWidgetId, config?.mercuryoSecret, @@ -108,8 +110,13 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di apiVersion = MercuryoApi.API_VERSION, mercuryoWidgetId = mercuryoWidgetId, secret = mercuryoSecret, + logEnabled = LogConfig.network.mercuryoService, + ) + val sellService = MoonPayService( + apiKey = moonPayKey, + secretKey = moonPaySecretKey, + logEnabled = LogConfig.network.moonPayService, ) - val sellService = MoonPayService(moonPayKey, moonPaySecretKey) val cardProvider = { store.state.globalState.scanResponse?.card } val exchangeManager = CurrencyExchangeManager( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt index 0e7a4341df..b5c11c60b8 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesWarning.kt @@ -24,7 +24,10 @@ fun CurrenciesWarning() { contentAlignment = Alignment.Center, modifier = Modifier .padding(16.dp) - .background(Color(0xFFF2F2F2), shape = RoundedCornerShape(10.dp)) + .background( + color = Color(0xFFF2F2F2), + shape = RoundedCornerShape(10.dp), + ), ) { val warning = stringResource(id = R.string.alert_manage_tokens_addresses_message) @@ -33,18 +36,18 @@ fun CurrenciesWarning() { AnnotatedString.Range( SpanStyle(fontWeight = FontWeight.Bold), start = 0, - end = end - ) + end = end, + ), ) Text( text = AnnotatedString(text = warning, spanStyles = spanStyles), - textAlign = TextAlign.Center, + textAlign = TextAlign.Start, color = Color(0xFF848488), modifier = Modifier.padding( top = 8.dp, bottom = 8.dp, start = 16.dp, - end = 16.dp + end = 16.dp, ), fontSize = 13.sp, fontWeight = FontWeight.Normal, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt index f3d40a401b..b029341439 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/currencyItem/CurrencyItemHeader.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape @@ -50,7 +51,7 @@ fun CurrencyItemHeader( Row( modifier = Modifier .fillMaxWidth() - .height(62.dp) + .heightIn(min = 62.dp) .clickable( interactionSource = remember { MutableInteractionSource() }, indication = null, @@ -172,8 +173,7 @@ private fun BlockchainNetworkItem( addedBlockchains: List, ) { val added = addedBlockchains.contains(blockchain) - val icon = - if (added) blockchain?.getRoundIconRes() else blockchain?.getGreyedOutIconRes() + val icon = if (added) blockchain?.getRoundIconRes() else blockchain?.getGreyedOutIconRes() if (icon != null) { Box( Modifier diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt index 73504ddbfc..19c1eb1c8a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/MultiWalletView.kt @@ -8,6 +8,7 @@ import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.tap.common.extensions.animateVisibility import com.tangem.tap.common.extensions.formatAmountAsSpannedString +import com.tangem.tap.common.extensions.getQuantityString import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.show import com.tangem.tap.common.redux.navigation.AppScreen @@ -27,7 +28,9 @@ import com.tangem.wallet.R import com.tangem.wallet.databinding.FragmentWalletBinding class MultiWalletView : WalletView() { + private lateinit var walletsAdapter: WalletAdapter + override fun changeWalletView(fragment: WalletFragment, binding: FragmentWalletBinding) { setFragment(fragment, binding) onViewCreated() @@ -51,8 +54,7 @@ class MultiWalletView : WalletView() { if (card?.backupStatus is Card.BackupStatus.Active) { val cardCount = (card.backupStatus as Card.BackupStatus.Active).cardCount + 1 tvTwinCardNumber.show() - tvTwinCardNumber.text = - fragment?.getString(R.string.wallet_twins_chip_format, 1, cardCount) + tvTwinCardNumber.text = tvTwinCardNumber.getQuantityString(R.plurals.card_label_card_count, cardCount) } else { tvTwinCardNumber.hide() } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt index ab271db8fb..9b8a2e759f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/wallet/SingleWalletView.kt @@ -89,8 +89,7 @@ class SingleWalletView : WalletView() { TwinCardNumber.First -> 1 TwinCardNumber.Second -> 2 } - tvTwinCardNumber.text = - fragment?.getString(R.string.wallet_twins_chip_format, number, 2) + tvTwinCardNumber.text = fragment?.getString(R.string.wallet_twins_chip_format, number, 2) } if (twinCardsState?.cardNumber == null) { tvTwinCardNumber.hide() diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt index 9e02287ff0..dec1f05bae 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt @@ -20,10 +20,13 @@ class MercuryoService( private val apiVersion: String, private val mercuryoWidgetId: String, private val secret: String, + private val logEnabled: Boolean, ) : ExchangeService, ExchangeUrlBuilder { - private val api: MercuryoApi = createRetrofitInstance(MercuryoApi.BASE_URL) - .create(MercuryoApi::class.java) + private val api: MercuryoApi = createRetrofitInstance( + baseUrl = MercuryoApi.BASE_URL, + logEnabled = logEnabled, + ).create(MercuryoApi::class.java) private val blockchainsAvailableToBuy = mutableListOf() private val tokensAvailableToBy = mutableMapOf>() diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index 00db516c5b..5e52716d98 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -20,11 +20,14 @@ import javax.crypto.spec.SecretKeySpec class MoonPayService( private val apiKey: String, private val secretKey: String, + private val logEnabled: Boolean, ) : ExchangeService, ExchangeUrlBuilder { private val api: MoonPayApi by lazy { - createRetrofitInstance(MoonPayApi.MOOONPAY_BASE_URL) - .create(MoonPayApi::class.java) + createRetrofitInstance( + baseUrl = MoonPayApi.MOOONPAY_BASE_URL, + logEnabled = logEnabled, + ).create(MoonPayApi::class.java) } private var status: MoonPayStatus? = null diff --git a/app/src/main/java/com/tangem/tap/network/payid/PayIdService.kt b/app/src/main/java/com/tangem/tap/network/payid/PayIdService.kt index b82c9d60df..f4612643d3 100644 --- a/app/src/main/java/com/tangem/tap/network/payid/PayIdService.kt +++ b/app/src/main/java/com/tangem/tap/network/payid/PayIdService.kt @@ -23,7 +23,10 @@ class PayIdService { return performRequest { payIdApi.setPayId(cardId, publicKey, payId, address, network) } } - private fun provideRetrofit(): Retrofit = createRetrofitInstance("https://tangem.com/") + private fun provideRetrofit(): Retrofit = createRetrofitInstance( + baseUrl = "https://tangem.com/", + logEnabled = false, + ) } diff --git a/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyService.kt b/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyService.kt index f3b327591b..f5e7ed1f96 100644 --- a/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyService.kt +++ b/app/src/main/java/com/tangem/tap/network/payid/PayIdVerifyService.kt @@ -8,10 +8,13 @@ import com.tangem.network.common.createRetrofitInstance [REDACTED_AUTHOR] */ class PayIdVerifyService( - private val baseUrl: String + private val baseUrl: String, ) { - private val api = createRetrofitInstance(baseUrl).create(PayIdVerifyApi::class.java) + private val api = createRetrofitInstance( + baseUrl = baseUrl, + logEnabled = false, + ).create(PayIdVerifyApi::class.java) suspend fun verifyAddress(user: String, network: String): Result { return performRequest { api.verifyAddress(user, createNetworkHeader(network)) } diff --git a/app/src/main/res/drawable/ic_dash.xml b/app/src/main/res/drawable/ic_dash.xml new file mode 100644 index 0000000000..67df63c241 --- /dev/null +++ b/app/src/main/res/drawable/ic_dash.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_dash_no_color.xml b/app/src/main/res/drawable/ic_dash_no_color.xml new file mode 100644 index 0000000000..be475ecf51 --- /dev/null +++ b/app/src/main/res/drawable/ic_dash_no_color.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_optimism.xml b/app/src/main/res/drawable/ic_optimism.xml new file mode 100644 index 0000000000..fb8ce845a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_optimism.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_optimism_no_color.xml b/app/src/main/res/drawable/ic_optimism_no_color.xml new file mode 100644 index 0000000000..3a9d21620b --- /dev/null +++ b/app/src/main/res/drawable/ic_optimism_no_color.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/values-de/strings_plurals_final.xml b/app/src/main/res/values-de/strings_plurals_final.xml new file mode 100644 index 0000000000..fa02d656a3 --- /dev/null +++ b/app/src/main/res/values-de/strings_plurals_final.xml @@ -0,0 +1,6 @@ + + + %d card + %d cards + + diff --git a/app/src/main/res/values-fr/strings_plurals_final.xml b/app/src/main/res/values-fr/strings_plurals_final.xml new file mode 100644 index 0000000000..f7ce3f895b --- /dev/null +++ b/app/src/main/res/values-fr/strings_plurals_final.xml @@ -0,0 +1,7 @@ + + + %d card + %d cards + %d cards + + diff --git a/app/src/main/res/values-it/strings_plurals_final.xml b/app/src/main/res/values-it/strings_plurals_final.xml new file mode 100644 index 0000000000..fa02d656a3 --- /dev/null +++ b/app/src/main/res/values-it/strings_plurals_final.xml @@ -0,0 +1,6 @@ + + + %d card + %d cards + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9c7aef46d4..ca3e7e93f1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -314,7 +314,6 @@ Основная карта Сканировать основную карту Перейти к моему кошельку - Карта %1s из %2s Отправка %s Подготовьте резервную карту с номером %s Подготовьте основную карту с номером %s diff --git a/app/src/main/res/values-ru/strings_plurals_final.xml b/app/src/main/res/values-ru/strings_plurals_final.xml new file mode 100644 index 0000000000..53720a4bb6 --- /dev/null +++ b/app/src/main/res/values-ru/strings_plurals_final.xml @@ -0,0 +1,8 @@ + + + %d карта + %d карты + %d карт + %d карт + + diff --git a/app/src/main/res/values/strings_plurals_final.xml b/app/src/main/res/values/strings_plurals_final.xml new file mode 100644 index 0000000000..530ada144e --- /dev/null +++ b/app/src/main/res/values/strings_plurals_final.xml @@ -0,0 +1,8 @@ + + + %d card + %d card + %d cards + %d cards + + diff --git a/app/src/main/res/values/strings_untranslated.xml b/app/src/main/res/values/strings_untranslated.xml index cc9e1a3cf3..afdc44412f 100644 --- a/app/src/main/res/values/strings_untranslated.xml +++ b/app/src/main/res/values/strings_untranslated.xml @@ -286,7 +286,6 @@ Primary card Scan the primary card Continue to my wallet - Card %1s of %2s Sending %s Prepare the backup card with number %s Prepare the primary card with number %s diff --git a/dependencies.gradle b/dependencies.gradle index 8762730416..5d1d0d6fa5 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,7 +2,7 @@ ext.versions = [ kotlin : '1.6.10', build_gradle : '7.1.3', tangem_card_sdk : 'develop-159', - tangem_blockchain_sdk: 'develop-113', + tangem_blockchain_sdk: 'develop-115', // tangem_blockchain_sdk: '0.0.1', ] diff --git a/domain/src/main/java/com/tangem/domain/common/LogConfig.kt b/domain/src/main/java/com/tangem/domain/common/LogConfig.kt new file mode 100644 index 0000000000..56c2950141 --- /dev/null +++ b/domain/src/main/java/com/tangem/domain/common/LogConfig.kt @@ -0,0 +1,17 @@ +package com.tangem.domain.common + +import com.tangem.domain.features.BuildConfig + +object LogConfig { + val imageLoader: Boolean = false + val storeAction: Boolean = BuildConfig.DEBUG + val zendesk: Boolean = false + val network: NetworkLogConfig = NetworkLogConfig +} + +object NetworkLogConfig { + val mercuryoService: Boolean = false + val moonPayService: Boolean = false + val tangemTechService: Boolean = BuildConfig.DEBUG + val blockchainSdkNetwork: Boolean = BuildConfig.DEBUG +} \ No newline at end of file diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 6a4eb3b3e1..8dabde8702 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -41,6 +41,9 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "polkadot" -> Blockchain.Polkadot "polkadot/test" -> Blockchain.PolkadotTestnet "kusama" -> Blockchain.Kusama + "optimistic-ethereum" -> Blockchain.Optimism + "optimistic-ethereum/test" -> Blockchain.OptimismTestnet + "dash" -> Blockchain.Dash else -> null } } @@ -86,6 +89,9 @@ fun Blockchain.toNetworkId(): String { Blockchain.Polkadot -> "polkadot" Blockchain.PolkadotTestnet -> "polkadot/test" Blockchain.Kusama -> "kusama" + Blockchain.Optimism -> "optimistic-ethereum" + Blockchain.OptimismTestnet -> "optimistic-ethereum/test" + Blockchain.Dash -> "dash" Blockchain.SaltPay -> "xdai"//TODO } } @@ -114,6 +120,8 @@ fun Blockchain.toCoinId(): String { Blockchain.Dogecoin -> "dogecoin" Blockchain.Gnosis -> "xdai" Blockchain.Kusama -> "kusama" + Blockchain.Optimism, Blockchain.OptimismTestnet -> "ethereum" + Blockchain.Dash -> "dash" Blockchain.SaltPay -> "xdai" //TODO Blockchain.Unknown -> "unknown" } diff --git a/domain/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt b/domain/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt index 5bf1264638..1f2109b371 100644 --- a/domain/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt +++ b/domain/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt @@ -1,6 +1,7 @@ package com.tangem.domain.redux.global import com.tangem.domain.DomainDialog +import com.tangem.domain.common.LogConfig import com.tangem.domain.common.ScanResponse import com.tangem.network.api.tangemTech.TangemTechService @@ -17,5 +18,5 @@ data class DomainGlobalState( ) data class NetworkServices( - val tangemTechService: TangemTechService = TangemTechService() + val tangemTechService: TangemTechService = TangemTechService(LogConfig.network.tangemTechService) ) diff --git a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt index 3bf3bd232e..b52b34c013 100644 --- a/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt +++ b/network/src/main/java/com/tangem/network/api/tangemTech/TangemTechService.kt @@ -11,9 +11,12 @@ import kotlinx.coroutines.withContext /** [REDACTED_AUTHOR] */ -class TangemTechService { +class TangemTechService( + private val logIsEnabled: Boolean = false, +) { + private val headerInterceptors = mutableListOf( - CacheControlHttpInterceptor(cacheMaxAge) + CacheControlHttpInterceptor(cacheMaxAge), ) private var api: TangemTechApi = createApi() @@ -24,7 +27,7 @@ class TangemTechService { active: Boolean? = null, searchText: String? = null, offset: Int? = null, - limit: Int? = null + limit: Int? = null, ): Result = withContext(Dispatchers.IO) { performRequest { api.coins( @@ -33,14 +36,14 @@ class TangemTechService { active = active, searchText = searchText, offset = offset, - limit = limit + limit = limit, ) } } suspend fun rates( currency: String, - ids: List + ids: List, ): Result = withContext(Dispatchers.IO) { performRequest { api.rates(currency.lowercase(), ids.joinToString(",")) @@ -65,7 +68,7 @@ class TangemTechService { val retrofit = createRetrofitInstance( baseUrl = baseUrl, interceptors = headerInterceptors.toList(), -// logEnabled = true, + logEnabled = logIsEnabled, ) return retrofit.create(TangemTechApi::class.java) } diff --git a/network/src/main/java/com/tangem/network/common/Retrofit.kt b/network/src/main/java/com/tangem/network/common/Retrofit.kt index 86ab156c51..70bb657bce 100644 --- a/network/src/main/java/com/tangem/network/common/Retrofit.kt +++ b/network/src/main/java/com/tangem/network/common/Retrofit.kt @@ -13,7 +13,7 @@ fun createRetrofitInstance( okHttpBuilder: OkHttpClient.Builder = OkHttpClient.Builder(), interceptors: List = emptyList(), converterFactory: Converter.Factory = MoshiConverter.createFactory(), - logEnabled: Boolean = false + logEnabled: Boolean, ): Retrofit { okHttpBuilder.apply { callTimeout(10, TimeUnit.SECONDS)