From ecdada724420acd8a3a0e7bd86a8a3ab268540b9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 15:02:09 +0800 Subject: [PATCH 1/6] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/MainActivity.kt | 6 +++++- .../tokendetails/viewmodels/TokenDetailsViewModel.kt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 60e185ca30..8d836dbb16 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -39,6 +39,7 @@ import com.tangem.tap.common.shop.googlepay.GooglePayService import com.tangem.tap.common.shop.googlepay.GooglePayService.Companion.LOAD_PAYMENT_DATA_REQUEST_CODE import com.tangem.tap.common.shop.googlepay.GooglePayUtil.createPaymentsClient import com.tangem.tap.domain.TangemSdkManager +import com.tangem.tap.domain.userWalletList.implementation.BiometricUserWalletsListManager import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor import com.tangem.tap.features.intentHandler.IntentProcessor import com.tangem.tap.features.intentHandler.handlers.BackgroundScanIntentHandler @@ -349,7 +350,10 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac } private fun navigateToInitialScreen(intentWhichStartedActivity: Intent?) { - if (store.state.globalState.userWalletsListManager?.hasUserWallets == true) { + val canSaveWallets = userWalletsListManager is BiometricUserWalletsListManager + val hasSavedWallets = userWalletsListManager.hasUserWallets + + if (canSaveWallets && hasSavedWallets) { store.dispatch( NavigationAction.NavigateTo( screen = AppScreen.Welcome, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 43546d8ba5..bdfe161039 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -239,7 +239,7 @@ internal class TokenDetailsViewModel @Inject constructor( showErrorIfDemoModeOrElse { val status = cryptoCurrencyStatus ?: return@showErrorIfDemoModeOrElse - viewModelScope.launch(dispatchers.io) { + viewModelScope.launch(dispatchers.main) { reduxStateHolder.dispatch( TradeCryptoAction.New.Buy( userWallet = getUserWalletUseCase(userWalletId).getOrElse { return@launch }, From 9dbb4c7c2b78a75cbc61e5d565728ff82540de2e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 11:27:35 +0400 Subject: [PATCH 2/6] Updated on 2026-08-14 --- .../tangem/tap/common/feedback/AdditionalFeedbackInfo.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt index b28a3256cb..7b68b75ab5 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/AdditionalFeedbackInfo.kt @@ -36,8 +36,7 @@ class AdditionalFeedbackInfo { var userWalletId: String = "" // wallets - var walletsInfo = emptyList() - private set + val walletsInfo = mutableListOf() var onSendErrorWalletInfo: EmailWalletInfo? = null private set var signedHashesCount: String = "" @@ -74,7 +73,10 @@ class AdditionalFeedbackInfo { @Deprecated("Don't use it directly") fun setWalletsInfo(walletManagers: List) { - walletsInfo = walletManagers.map(::createEmailWalletInfo) + walletsInfo.clear() + walletManagers.forEach { + walletsInfo.add(createEmailWalletInfo(it)) + } } fun updateOnSendError( From fd48173296c3835ad431805a4d7095d748539a00 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 11:09:57 +0500 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../tokenreceive/TokenReceiveBottomSheet.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt index 0555bfe0e1..b9dc31d04f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt @@ -1,6 +1,7 @@ package com.tangem.core.ui.components.bottomsheets.tokenreceive import android.widget.Toast +import androidx.compose.animation.animateColorAsState import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -23,7 +24,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextAlign import com.tangem.core.ui.R -import com.tangem.core.ui.components.MiddleEllipsisText import com.tangem.core.ui.components.SecondaryButtonIconStart import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig @@ -113,6 +113,7 @@ private fun QrCodeContent(content: TokenReceiveBottomSheetConfig, onAddressChang state = pagerState, ) { currentPage -> Column( + modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing24), ) { @@ -134,7 +135,7 @@ private fun QrCodeContent(content: TokenReceiveBottomSheetConfig, onAddressChang modifier = Modifier .size(TangemTheme.dimens.size248), ) - MiddleEllipsisText( + Text( text = content.addresses[currentPage].value, color = TangemTheme.colors.text.primary1, textAlign = TextAlign.Center, @@ -156,11 +157,9 @@ private fun QrCodeContent(content: TokenReceiveBottomSheetConfig, onAddressChang ) { repeat(pagerState.pageCount) { iteration -> item(key = iteration) { - val color = if (pagerState.currentPage == iteration) { - selectedColor - } else { - unselectedColor - } + val color by animateColorAsState( + if (pagerState.currentPage == iteration) selectedColor else unselectedColor, + ) Box( modifier = Modifier .padding( From c3de434c5416b18227c387836703d07d31f3aa6e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 11:15:57 +0300 Subject: [PATCH 4/6] Updated on 2026-08-14 --- .../wallet/state/factory/TokenActionsProvider.kt | 9 --------- .../factory/WalletCryptoCurrencyActionsConverter.kt | 12 ++++++++++++ .../wallet/state/factory/WalletStateFactory.kt | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/TokenActionsProvider.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/TokenActionsProvider.kt index 9b60ca31e3..df989ef9b8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/TokenActionsProvider.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/TokenActionsProvider.kt @@ -29,7 +29,6 @@ internal class TokenActionsProvider( fun provideActions(tokenActions: TokenActionsState): ImmutableList { return tokenActions.states .filterIfSingleWithToken() - .filterIfS2C() .mapNotNull { mapTokenActionState( actionsState = it, @@ -47,14 +46,6 @@ internal class TokenActionsProvider( } } - private fun List.filterIfS2C(): List { - return if (currentWalletProvider().scanResponse.cardTypesResolver.isStart2Coin()) { - filterNot { it is TokenActionsState.ActionState.Buy || it is TokenActionsState.ActionState.Sell } - } else { - this - } - } - private fun mapTokenActionState( actionsState: TokenActionsState.ActionState, cryptoCurrencyStatus: CryptoCurrencyStatus, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletCryptoCurrencyActionsConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletCryptoCurrencyActionsConverter.kt index eb2400e286..b0a13a51de 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletCryptoCurrencyActionsConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletCryptoCurrencyActionsConverter.kt @@ -1,7 +1,9 @@ package com.tangem.feature.wallet.presentation.wallet.state.factory import com.tangem.common.Provider +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.tokens.model.TokenActionsState +import com.tangem.domain.wallets.models.UserWallet import com.tangem.feature.wallet.presentation.wallet.state.WalletMultiCurrencyState import com.tangem.feature.wallet.presentation.wallet.state.WalletSingleCurrencyState import com.tangem.feature.wallet.presentation.wallet.state.WalletState @@ -12,6 +14,7 @@ import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.toPersistentList internal class WalletCryptoCurrencyActionsConverter( + private val currentWalletProvider: Provider, private val currentStateProvider: Provider, private val clickIntents: WalletClickIntents, ) : Converter { @@ -28,6 +31,7 @@ internal class WalletCryptoCurrencyActionsConverter( private fun TokenActionsState.mapToManageButtons(): PersistentList { return this.states + .filterIfS2C() .mapNotNull { action -> when (action) { is TokenActionsState.ActionState.Buy -> { @@ -60,4 +64,12 @@ internal class WalletCryptoCurrencyActionsConverter( } .toPersistentList() } + + private fun List.filterIfS2C(): List { + return if (currentWalletProvider().scanResponse.cardTypesResolver.isStart2Coin()) { + filterNot { it is TokenActionsState.ActionState.Buy || it is TokenActionsState.ActionState.Sell } + } else { + this + } + } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletStateFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletStateFactory.kt index a95b0edd6e..e6c913a5ec 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletStateFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/WalletStateFactory.kt @@ -127,6 +127,7 @@ internal class WalletStateFactory( private val cryptoCurrencyActionsConverter by lazy { WalletCryptoCurrencyActionsConverter( + currentWalletProvider = currentWalletProvider, currentStateProvider = currentStateProvider, clickIntents = clickIntents, ) From be0b066598e484d0d146370046aedf2c4a7edf6f Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 16:32:12 +0800 Subject: [PATCH 5/6] Updated on 2026-08-14 --- app/build.gradle.kts | 2 - app/src/main/AndroidManifest.xml | 4 - .../java/com/tangem/tap/TapApplication.kt | 5 +- .../com/tangem/tap/common/chat/ChatManager.kt | 18 +--- .../implementation/ZendeskChatOpener.kt | 87 ------------------- .../main/res/values-v29/zendesk_styles.xml | 6 -- app/src/main/res/values/zendesk_styles.xml | 10 --- .../datasource/config/ConfigManagerImpl.kt | 1 - .../datasource/config/models/ChatConfig.kt | 23 +---- .../tangem/datasource/config/models/Config.kt | 1 - .../datasource/config/models/JsonModels.kt | 1 - .../preferences/PreferencesDataSource.kt | 5 -- .../com/tangem/domain/common/LogConfig.kt | 1 - gradle/dependencies.toml | 4 - settings.gradle.kts | 1 - 15 files changed, 6 insertions(+), 163 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/chat/opener/implementation/ZendeskChatOpener.kt delete mode 100644 app/src/main/res/values-v29/zendesk_styles.xml delete mode 100644 app/src/main/res/values/zendesk_styles.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7817290795..e72316ffd3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -156,8 +156,6 @@ dependencies { implementation(deps.appsflyer) implementation(deps.amplitude) implementation(deps.kotsonGson) - implementation(deps.zendesk.chat) - implementation(deps.zendesk.messaging) implementation(deps.spongecastle.core) implementation(deps.lottie) implementation(deps.shopify.buy) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c1b1d65718..3eb4bc059b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -141,10 +141,6 @@ android:name="com.tangem.tap.common.qrCodeScan.ScanQrCodeActivity" android:theme="@style/AppTheme" /> - - diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 2f6e54f690..1f50712ace 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -338,7 +338,7 @@ internal class TapApplication : Application(), ImageLoaderFactory { private fun initWithConfigDependency(config: Config) { shopService = TangemShopService(this, config.shopify!!) initAnalytics(this, config) - initFeedbackManager(this, preferencesStorage, foregroundActivityObserver, store) + initFeedbackManager(this, foregroundActivityObserver, store) } private fun initAnalytics(application: Application, config: Config) { @@ -360,7 +360,6 @@ internal class TapApplication : Application(), ImageLoaderFactory { private fun initFeedbackManager( context: Context, - preferencesStorage: PreferencesDataSource, foregroundActivityObserver: ForegroundActivityObserver, store: Store, ) { @@ -399,7 +398,7 @@ internal class TapApplication : Application(), ImageLoaderFactory { val feedbackManager = FeedbackManager( infoHolder = additionalFeedbackInfo, logCollector = tangemLogCollector, - chatManager = ChatManager(preferencesStorage, foregroundActivityObserver), + chatManager = ChatManager(foregroundActivityObserver), ) store.dispatch(GlobalAction.SetFeedbackManager(feedbackManager)) } diff --git a/app/src/main/java/com/tangem/tap/common/chat/ChatManager.kt b/app/src/main/java/com/tangem/tap/common/chat/ChatManager.kt index 693113b27a..5bbe3fc679 100644 --- a/app/src/main/java/com/tangem/tap/common/chat/ChatManager.kt +++ b/app/src/main/java/com/tangem/tap/common/chat/ChatManager.kt @@ -1,39 +1,23 @@ package com.tangem.tap.common.chat import android.content.Context -import android.os.Build -import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.datasource.config.models.ChatConfig import com.tangem.datasource.config.models.SprinklrConfig -import com.tangem.datasource.config.models.ZendeskConfig import com.tangem.tap.ForegroundActivityObserver import com.tangem.tap.common.chat.opener.ChatOpener import com.tangem.tap.common.chat.opener.implementation.SprinklrChatOpener -import com.tangem.tap.common.chat.opener.implementation.ZendeskChatOpener import java.io.File -class ChatManager( - private val preferencesStorage: PreferencesDataSource, - private val foregroundActivityObserver: ForegroundActivityObserver, -) { +class ChatManager(private val foregroundActivityObserver: ForegroundActivityObserver) { private val openers = mutableMapOf() fun open(config: ChatConfig, createLogsFile: (Context) -> File?, createFeedbackFile: (Context) -> File?) { val opener = openers.getOrPut(config) { when (config) { is SprinklrConfig -> SprinklrChatOpener(config, foregroundActivityObserver) - is ZendeskConfig -> ZendeskChatOpener(getZendeskUserId(), config, foregroundActivityObserver) } } opener.open(createFeedbackFile, createLogsFile) } - - private fun getZendeskUserId(): String { - if (preferencesStorage.zendeskFirstLaunchTime == null) { - preferencesStorage.zendeskFirstLaunchTime = System.currentTimeMillis() - } - - return "${preferencesStorage.zendeskFirstLaunchTime}${Build.MODEL}".hashCode().toString() - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/ZendeskChatOpener.kt b/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/ZendeskChatOpener.kt deleted file mode 100644 index a65749ce62..0000000000 --- a/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/ZendeskChatOpener.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.tangem.tap.common.chat.opener.implementation - -import android.content.Context -import com.tangem.core.analytics.Analytics -import com.tangem.datasource.config.models.ZendeskConfig -import com.tangem.domain.common.LogConfig -import com.tangem.tap.ForegroundActivityObserver -import com.tangem.tap.common.chat.opener.ChatOpener -import com.tangem.tap.withForegroundActivity -import com.tangem.wallet.R -import com.zendesk.logger.Logger -import timber.log.Timber -import zendesk.chat.* -import zendesk.configurations.Configuration -import zendesk.messaging.MessagingActivity -import java.io.File - -internal class ZendeskChatOpener( - private val userId: String, - private val config: ZendeskConfig, - private val foregroundActivityObserver: ForegroundActivityObserver, -) : ChatOpener { - - private var isInitialized = false - private var isFilesSent = false - - override fun open(createFeedbackFile: (Context) -> File?, createLogsFile: (Context) -> File?) { - foregroundActivityObserver.withForegroundActivity { activity -> - initZendeskIfNeeded(activity.applicationContext) - setChatVisitorInfo() - showMessagingActivity(activity) - sendFeedbackFile(createFeedbackFile(activity)) - sendLogsFile(createLogsFile(activity)) - } - } - - private fun initZendeskIfNeeded(context: Context) { - if (isInitialized) return - isInitialized = true - - Chat.INSTANCE.init(context, config.accountKey, config.appId) - Logger.setLoggable(LogConfig.zendesk) - } - - private fun setChatVisitorInfo() { - val visitorInfo = VisitorInfo.builder().withName("User $userId").build() - - Chat.INSTANCE.chatProvidersConfiguration = - ChatProvidersConfiguration.builder().withVisitorInfo(visitorInfo).build() - } - - private fun sendFeedbackFile(feedbackFile: File?) { - if (isInitialized && feedbackFile != null && !isFilesSent) { - Chat.INSTANCE.providers()?.chatProvider()?.sendFile(feedbackFile) { _, bytesUploaded, _ -> - Timber.d("Log file sent", "bytesUploaded: $bytesUploaded") - } - isFilesSent = true - } - } - - private fun sendLogsFile(logsFile: File?) { - if (isInitialized && logsFile != null && !isFilesSent) { - Chat.INSTANCE.providers()?.chatProvider()?.sendFile(logsFile) { _, bytesUploaded, _ -> - Timber.d("Log file sent", "bytesUploaded: $bytesUploaded") - } - isFilesSent = true - } - } - - private fun showMessagingActivity(context: Context) { - Analytics.send(com.tangem.tap.common.analytics.events.Chat.ScreenOpened()) - MessagingActivity.builder() - .withMultilineResponseOptionsEnabled(false) - .withBotLabelStringRes(R.string.chat_bot_name) - .withBotAvatarDrawable(R.mipmap.ic_launcher) - .withEngines(ChatEngine.engine()) - .show(context, buildChatConfig()) - } - - private fun buildChatConfig(): Configuration { - return ChatConfiguration.builder() - .withOfflineFormEnabled(true) - .withAgentAvailabilityEnabled(true) - .withPreChatFormEnabled(false) - .build() - } -} \ No newline at end of file diff --git a/app/src/main/res/values-v29/zendesk_styles.xml b/app/src/main/res/values-v29/zendesk_styles.xml deleted file mode 100644 index 764f632e87..0000000000 --- a/app/src/main/res/values-v29/zendesk_styles.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/app/src/main/res/values/zendesk_styles.xml b/app/src/main/res/values/zendesk_styles.xml deleted file mode 100644 index 2513114d19..0000000000 --- a/app/src/main/res/values/zendesk_styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt index 2a1e34d105..6bf2505649 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt @@ -102,7 +102,6 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager { appsFlyerDevKey = configValues.appsFlyer.appsFlyerDevKey, amplitudeApiKey = configValues.amplitudeApiKey, shopify = configValues.shopifyShop, - zendesk = configValues.zendesk, sprinklr = configValues.sprinklr, swapReferrerAccount = configValues.swapReferrerAccount, walletConnectProjectId = configValues.walletConnectProjectId, diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/ChatConfig.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/ChatConfig.kt index 2ab45d66bc..067c8572f3 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/ChatConfig.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/ChatConfig.kt @@ -5,26 +5,9 @@ import com.squareup.moshi.JsonClass sealed interface ChatConfig -@JsonClass(generateAdapter = true) -data class ZendeskConfig( - @Json(name = "zendeskApiKey") - val apiKey: String, - @Json(name = "zendeskAppId") - val appId: String, - @Json(name = "zendeskClientId") - val clientId: String, - @Json(name = "zendeskAccountKey") - val accountKey: String, - @Json(name = "zendeskUrl") - val url: String, -) : ChatConfig - @JsonClass(generateAdapter = true) data class SprinklrConfig( - @Json(name = "appID") - val appId: String, - @Json(name = "apiKey") - val apiKey: String, - @Json(name = "environment") - val environment: String, + @Json(name = "appID") val appId: String, + @Json(name = "apiKey") val apiKey: String, + @Json(name = "environment") val environment: String, ) : ChatConfig \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt index f8fe099745..2980e22216 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt @@ -15,7 +15,6 @@ data class Config( @Deprecated("Not relevant since version 3.23") val isCreatingTwinCardsAllowed: Boolean = false, val shopify: ShopifyShop? = null, - val zendesk: ZendeskConfig? = null, val sprinklr: SprinklrConfig? = null, val swapReferrerAccount: SwapReferrerAccount? = null, val walletConnectProjectId: String = "", diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt index 93210485ef..77d2c0808f 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt @@ -31,7 +31,6 @@ class ConfigValueModel( val infuraProjectId: String?, val appsFlyer: AppsFlyer, val shopifyShop: ShopifyShop?, - val zendesk: ZendeskConfig?, val sprinklr: SprinklrConfig?, val tronGridApiKey: String, val amplitudeApiKey: String, diff --git a/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt b/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt index 218863ac9a..5da77acb5b 100644 --- a/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt +++ b/data/source/preferences/src/main/kotlin/com/tangem/data/source/preferences/PreferencesDataSource.kt @@ -42,10 +42,6 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con toppedUpWalletStorage = ToppedUpWalletStorage(preferences, moshiConverter) } - var zendeskFirstLaunchTime: Long? - get() = preferences.getLong(ZENDESK_FIRST_LAUNCH_KEY, 0).takeIf { it != 0L } - set(value) = preferences.edit { putLong(ZENDESK_FIRST_LAUNCH_KEY, value ?: 0) } - var sprinklrFirstLaunchTime: Long? get() = preferences.getLong(SPRINKLR_FIRST_LAUNCH_KEY, 0).takeIf { it != 0L } set(value) = preferences.edit { putLong(SPRINKLR_FIRST_LAUNCH_KEY, value ?: 0) } @@ -93,7 +89,6 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con private const val PREFERENCES_NAME = "tapPrefs" private const val TWINS_ONBOARDING_SHOWN_KEY = "twinsOnboardingShown" private const val APP_LAUNCH_COUNT_KEY = "launchCount" - private const val ZENDESK_FIRST_LAUNCH_KEY = "chatFirstLaunchKey" private const val SPRINKLR_FIRST_LAUNCH_KEY = "sprinklrFirstLaunch" private const val SAVE_WALLET_DIALOG_SHOWN_KEY = "saveUserWalletShown" private const val SAVE_ACCESS_CODES_KEY = "saveAccessCodes" diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/LogConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/LogConfig.kt index 6ad07afbf2..2e115068d1 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/LogConfig.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/LogConfig.kt @@ -5,7 +5,6 @@ import com.tangem.domain.features.BuildConfig object LogConfig { const val imageLoader: Boolean = false val storeAction: Boolean = BuildConfig.DEBUG - const val zendesk: Boolean = false val network: NetworkLogConfig = NetworkLogConfig val analyticsHandlers: AnalyticsHandlersLogConfig = AnalyticsHandlersLogConfig } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 5955bdfd13..758d9fa77f 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -67,8 +67,6 @@ spongycastleCryptoCore = "1.58.0.0" timber = "4.7.1" viewBindingDelegate = "1.5.9" xmlShimmer = "1.1.3" -zendeskChat = "3.3.5" -zendeskMessaging = "5.2.4" zxingQrBarcodeScanner = "1.9.8" zxingQrCode = "3.5.1" mviCore = "1.3.1" @@ -219,8 +217,6 @@ retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.re timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } viewBindingDelegate = { module = "com.github.kirich1409:viewbindingpropertydelegate-noreflection", version.ref = "viewBindingDelegate" } xmlShimmer = { module = "com.github.skydoves:androidveil", version.ref = "xmlShimmer" } -zendesk-chat = { module = "com.zendesk:chat", version.ref = "zendeskChat" } -zendesk-messaging = { module = "com.zendesk:messaging", version.ref = "zendeskMessaging" } zxing-qrBarcodeScanner = { module = "me.dm7.barcodescanner:zxing", version.ref = "zxingQrBarcodeScanner" } zxing-qrCore = { module = "com.google.zxing:core", version.ref = "zxingQrCode" } mviCore-watcher = { module = "com.github.badoo.mvicore:mvicore-diff", version.ref = "mviCore" } diff --git a/settings.gradle.kts b/settings.gradle.kts index df1029f7b1..e2478e48b5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,7 +39,6 @@ dependencyResolutionManagement { } } maven("https://jitpack.io") - maven("https://zendesk.jfrog.io/zendesk/repo") maven("https://clients-nexus.sprinklr.com/") } From 95892045b89729e8c73c99055b961b329242b3a1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Oct 2023 13:15:57 +0500 Subject: [PATCH 6/6] Updated on 2026-08-14 --- .../repository/DefaultCurrenciesRepository.kt | 15 +++++++++++++++ .../tokens/GetCryptoCurrencyActionsUseCase.kt | 13 +++++++++---- .../domain/tokens/GetCurrencyWarningsUseCase.kt | 2 +- .../tokens/repository/CurrenciesRepository.kt | 9 +++++++++ .../tokens/repository/MockCurrenciesRepository.kt | 8 ++++++++ 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 9da44ae71c..ebe2622cd9 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -17,6 +17,7 @@ import com.tangem.domain.common.util.hasDerivation import com.tangem.domain.core.error.DataError import com.tangem.domain.demo.DemoConfig import com.tangem.domain.tokens.model.CryptoCurrency +import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.Network import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.wallets.models.UserWallet @@ -302,6 +303,20 @@ internal class DefaultCurrenciesRepository( } } + override fun hasPendingTransactions( + cryptoCurrencyStatus: CryptoCurrencyStatus, + coinStatus: CryptoCurrencyStatus?, + ): Boolean { + val blockchain = Blockchain.fromId(cryptoCurrencyStatus.currency.network.id.value) + val isBitcoinBlockchain = blockchain == Blockchain.Bitcoin || blockchain == Blockchain.BitcoinTestnet + return if (cryptoCurrencyStatus.currency is CryptoCurrency.Coin && isBitcoinBlockchain) { + val outgoingTransactions = cryptoCurrencyStatus.value.pendingTransactions.filter { it.isOutgoing } + outgoingTransactions.isNotEmpty() + } else { + coinStatus?.value?.hasCurrentNetworkTransactions == true + } + } + private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow> { return userTokensStore.get(userWallet.walletId).map { storedTokens -> responseCurrenciesFactory.createCurrencies( diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt index ebd92d44a3..55d6d6adf8 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt @@ -102,10 +102,7 @@ class GetCryptoCurrencyActionsUseCase( } // send - if (cryptoCurrencyStatus.value.amount.isNullOrZero() || - coinStatus?.value?.amount.isNullOrZero() || - coinStatus?.value?.hasCurrentNetworkTransactions == true - ) { + if (isSendDisabled(cryptoCurrencyStatus = cryptoCurrencyStatus, coinStatus = coinStatus)) { disabledList.add(TokenActionsState.ActionState.Send(false)) } else { activeList.add(TokenActionsState.ActionState.Send(true)) @@ -151,4 +148,12 @@ class GetCryptoCurrencyActionsUseCase( activeList.add(TokenActionsState.ActionState.HideToken(true)) return activeList + disabledList } + + private fun isSendDisabled(cryptoCurrencyStatus: CryptoCurrencyStatus, coinStatus: CryptoCurrencyStatus?): Boolean = + cryptoCurrencyStatus.value.amount.isNullOrZero() || + coinStatus?.value?.amount.isNullOrZero() || + currenciesRepository.hasPendingTransactions( + cryptoCurrencyStatus = cryptoCurrencyStatus, + coinStatus = coinStatus, + ) } \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 89c51796ec..895ee2ee8e 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -91,7 +91,7 @@ class GetCurrencyWarningsUseCase( when { tokenStatus != null && coinStatus != null -> { buildList { - if (tokenStatus.value.hasCurrentNetworkTransactions) { + if (currenciesRepository.hasPendingTransactions(tokenStatus, coinStatus)) { add(CryptoCurrencyWarning.HasPendingTransactions(coinStatus.currency.symbol)) } if (!tokenStatus.value.amount.isZero() && coinStatus.value.amount.isZero()) { diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt index 84d8bf55f5..d2c1bd3b72 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt @@ -1,6 +1,7 @@ package com.tangem.domain.tokens.repository import com.tangem.domain.tokens.model.CryptoCurrency +import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow @@ -173,4 +174,12 @@ interface CurrenciesRepository { fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow fun getMissedAddressesCryptoCurrencies(userWalletId: UserWalletId): Flow> + + /** + * Determines whether the currency has pending transaction or currency network has pending transaction + * + * @param cryptoCurrencyStatus currency status + * @param coinStatus main currency status in [cryptoCurrencyStatus] network + */ + fun hasPendingTransactions(cryptoCurrencyStatus: CryptoCurrencyStatus, coinStatus: CryptoCurrencyStatus?): Boolean } \ No newline at end of file diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt index df656f33fb..97e34fcc43 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt @@ -4,6 +4,7 @@ import arrow.core.Either import arrow.core.getOrElse import com.tangem.domain.core.error.DataError import com.tangem.domain.tokens.model.CryptoCurrency +import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow @@ -109,4 +110,11 @@ internal class MockCurrenciesRepository( override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow { return isSortedByBalance.map { it.getOrElse { e -> throw e } } } + + override fun hasPendingTransactions( + cryptoCurrencyStatus: CryptoCurrencyStatus, + coinStatus: CryptoCurrencyStatus?, + ): Boolean { + return false + } } \ No newline at end of file