Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-20 21:54:46 +04:00
parent 8b75e37e30
commit a9bca131c3
386 changed files with 1369 additions and 1347 deletions

View file

@ -66,7 +66,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
/** DI */

View file

@ -25,10 +25,10 @@ import com.tangem.features.account.createedit.error.AccountFeatureError
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.JobHolder
import com.tangem.utils.coroutines.saveIn
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
@Suppress("LongParameterList")
@ -147,7 +147,7 @@ internal class ArchivedAccountListModel @Inject constructor(
private fun logError(error: AccountFeatureError, params: Map<String, String> = emptyMap()) {
val exception = IllegalStateException(error.toString())
Timber.e(exception)
TangemLogger.e("Error", exception)
analyticsExceptionHandler.sendException(
event = ExceptionAnalyticsEvent(exception = exception, params = params),

View file

@ -8,8 +8,8 @@ import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.account.models.ArchivedAccount
import com.tangem.domain.account.usecase.ArchivedAccountList
import com.tangem.domain.models.account.AccountId
import com.tangem.utils.logging.TangemLogger
import kotlinx.collections.immutable.toImmutableList
import timber.log.Timber
import javax.inject.Inject
internal class AccountArchivedUMBuilder @Inject constructor() {
@ -49,7 +49,7 @@ internal class AccountArchivedUMBuilder @Inject constructor() {
onCloseClick: () -> Unit,
getArchivedAccounts: () -> Unit,
): AccountArchivedUM.Error {
Timber.e(throwable)
TangemLogger.e("Error", throwable)
return AccountArchivedUM.Error(
onCloseClick = onCloseClick,
onRetryClick = { getArchivedAccounts() },

View file

@ -42,11 +42,11 @@ import com.tangem.features.account.createedit.entity.AccountCreateEditUMBuilder.
import com.tangem.features.account.createedit.entity.AccountCreateEditUMBuilder.Companion.updateName
import com.tangem.features.account.createedit.error.AccountFeatureError
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@ModelScoped
@ -242,7 +242,7 @@ internal class AccountCreateEditModel @Inject constructor(
private fun onNameChange(name: AccountNameUM) {
val isNotEmptyCustomName = (name as? AccountNameUM.Custom)?.raw?.isNotEmpty() == true
if (!name.isValidName() && isNotEmptyCustomName) {
Timber.d("Invalid account name: $name")
TangemLogger.d("Invalid account name: $name")
return
}
@ -310,7 +310,7 @@ internal class AccountCreateEditModel @Inject constructor(
private fun logError(error: AccountFeatureError, params: Map<String, String> = emptyMap()) {
val exception = IllegalStateException(error.toString())
Timber.e(exception)
TangemLogger.e("Error", exception)
analyticsExceptionHandler.sendException(
event = ExceptionAnalyticsEvent(exception = exception, params = params),

View file

@ -50,7 +50,6 @@ dependencies {
/** Other */
implementation(deps.decompose)
implementation(deps.decompose.ext.compose)
implementation(deps.timber)
implementation(deps.kotlin.immutable.collections)
implementation(deps.arrow.core)

View file

@ -8,6 +8,7 @@ import com.tangem.blockchain.common.TransactionData
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.blockchain.common.transaction.TransactionFee
import com.tangem.common.ui.bottomsheet.permission.state.ApproveType
import com.tangem.common.ui.userwallet.ext.walletInterationIcon
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.analytics.models.Basic
@ -15,6 +16,7 @@ import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.DialogMessage
import com.tangem.domain.models.currency.CryptoCurrency
@ -27,19 +29,17 @@ import com.tangem.domain.transaction.usecase.SendTransactionUseCase
import com.tangem.domain.transaction.usecase.gasless.CreateAndSendGaslessTransactionUseCase
import com.tangem.domain.transaction.usecase.gasless.GetFeeForGaslessUseCase
import com.tangem.domain.transaction.usecase.gasless.GetFeeForTokenUseCase
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.features.approval.api.GiveApprovalComponent
import com.tangem.features.send.v2.api.callbacks.FeeSelectorModelCallback
import com.tangem.features.send.v2.api.entity.FeeSelectorUM
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.common.ui.userwallet.ext.walletInterationIcon
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.utils.TangemBlogUrlBuilder.RESOURCE_TO_LEARN_ABOUT_APPROVING_IN_SWAP
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import java.math.BigDecimal
import javax.inject.Inject
@ -183,7 +183,7 @@ internal class GiveApprovalModel @Inject constructor(
contractAddress = tokenCurrency.contractAddress,
spenderAddress = params.spenderAddress,
).getOrElse { error ->
Timber.e(error, "Failed to create approval transaction")
TangemLogger.e("Failed to create approval transaction", error)
return false
}
@ -201,7 +201,7 @@ internal class GiveApprovalModel @Inject constructor(
)
}.fold(
ifLeft = { error ->
Timber.e("Failed to send approval transaction: $error")
TangemLogger.e("Failed to send approval transaction: $error")
false
},
ifRight = {

View file

@ -23,6 +23,7 @@ dependencies {
implementation(projects.core.analytics.models)
implementation(projects.core.configToggles)
implementation(projects.core.navigation)
implementation(projects.core.utils)
/** Domain */
implementation(projects.domain.wallets)
@ -45,7 +46,6 @@ dependencies {
}
/** Other */
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -22,13 +22,13 @@ import com.tangem.features.biometry.AskBiometryComponent
import com.tangem.features.biometry.impl.ui.state.AskBiometryUM
import com.tangem.sdk.api.TangemSdkManager
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.logging.TangemLogger
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@Suppress("LongParameterList")
@ -88,7 +88,7 @@ internal class AskBiometryModel @Inject constructor(
* because it will be automatically saved on UserWalletsListManager switch
*/
val selectedUserWallet = getSelectedWalletUseCase.sync().getOrNull() ?: run {
Timber.e("Unable to save user wallet")
TangemLogger.e("Unable to save user wallet")
uiMessageSender.send(
SnackbarMessage(stringReference("No selected user wallet")),
)

View file

@ -68,7 +68,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
/** DI */

View file

@ -66,7 +66,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
/** DI */

View file

@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
private const val HIDE_PROGRESS_DELAY = 400L
@ -211,7 +211,7 @@ internal class CreateWalletStartModel @Inject constructor(
val userWallet = coldUserWalletBuilderFactory.create(scanResponse = scanResponse).build()
if (userWallet == null) {
Timber.e("User wallet not created")
TangemLogger.e("User wallet not created")
setLoading(false)
return
}
@ -221,7 +221,7 @@ internal class CreateWalletStartModel @Inject constructor(
delay(HIDE_PROGRESS_DELAY)
setLoading(false)
when (error) {
is SaveWalletError.DataError -> Timber.e(error.toString(), "Unable to save user wallet")
is SaveWalletError.DataError -> TangemLogger.e("Unable to save user wallet: $error")
is SaveWalletError.WalletAlreadySaved -> {
userWalletsListRepository.unlock(
userWalletId = userWallet.walletId,
@ -246,8 +246,8 @@ internal class CreateWalletStartModel @Inject constructor(
private fun handleScanError(error: TangemError) {
when (error) {
is TangemSdkError.NfcFeatureIsUnavailable -> handleNfcFeatureUnavailable()
is TangemSdkError -> Timber.e(error, "Scan error occurred")
else -> Timber.e(error, "Error happened")
is TangemSdkError -> TangemLogger.e("Scan error occurred", error)
else -> TangemLogger.e("Error happened", error)
}
}

View file

@ -28,6 +28,7 @@ dependencies {
implementation(projects.core.configToggles)
implementation(projects.core.navigation)
implementation(projects.core.analytics)
implementation(projects.core.utils)
implementation(projects.core.analytics.models)
implementation(projects.common.routing)
implementation(projects.common.ui)
@ -78,7 +79,6 @@ dependencies {
/* Other */
implementation(deps.kotlin.immutable.collections)
implementation(deps.reKotlin)
implementation(deps.timber)
implementation(deps.arrow.core)
implementation(deps.arrow.fx)
}

View file

@ -2,6 +2,7 @@ package com.tangem.features.details.model
import android.content.res.Resources
import arrow.core.getOrElse
import com.tangem.utils.logging.TangemLogger
import com.tangem.common.routing.AppRoute
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam
@ -45,7 +46,6 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import java.util.Locale
import javax.inject.Inject
@ -84,8 +84,8 @@ internal class DetailsModel @Inject constructor(
val isWalletConnectAvailable = runBlocking {
// danger region, this works immediately, but will be refactored later with WC
checkIsWalletConnectAvailableUseCase(params.userWalletId).getOrElse {
Timber.w("Unable to check WalletConnect availability: $it")
checkIsWalletConnectAvailableUseCase(params.userWalletId).getOrElse { throwable ->
TangemLogger.w("Unable to check WalletConnect availability: $throwable")
false
}

View file

@ -29,7 +29,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -115,7 +115,7 @@ internal class UserWalletListModel @Inject constructor(
unlockWalletUseCase(userWalletId)
.onRight { router.push(AppRoute.WalletSettings(userWalletId)) }
.onLeft { error ->
Timber.e("Failed to unlock wallet $userWalletId: $error")
TangemLogger.e("Failed to unlock wallet $userWalletId: $error")
error.handle(
onUserCancelled = {},
isFromUnlockAll = false,
@ -142,7 +142,7 @@ internal class UserWalletListModel @Inject constructor(
applyUserWalletListSortingUseCase(userWalletIds).onRight {
analyticsEventHandler.send(WalletSettingsAnalyticEvents.WalletsReorder())
}.onLeft { error ->
Timber.e("Failed to apply wallet list sorting: $error")
TangemLogger.e("Failed to apply wallet list sorting: $error")
}
}
}

View file

@ -45,7 +45,6 @@ dependencies {
/** Other dependencies */
implementation(deps.arrow.core)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -5,7 +5,7 @@ import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import com.google.accompanist.web.AccompanistWebViewClient
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
/**
* [AccompanistWebViewClient] for Disclaimer [WebView]
@ -24,7 +24,7 @@ internal class DisclaimerWebViewClient(
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
Timber.d("onPageStarted: $url")
TangemLogger.d("onPageStarted: $url")
if (url != null) {
loadedUrls[url] = false
}
@ -33,7 +33,7 @@ internal class DisclaimerWebViewClient(
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Timber.d("onPageFinished: $url")
TangemLogger.d("onPageFinished: $url")
if (url != null && loadedUrls.containsKey(url)) {
loadedUrls[url] = true
onLoadingFinished(false)
@ -45,7 +45,7 @@ internal class DisclaimerWebViewClient(
val url = request?.url?.toString()
Timber.d("onReceivedError: $url")
TangemLogger.d("onReceivedError: $url")
if (url != null && loadedUrls.containsKey(url)) {
loadedUrls[url] = true

View file

@ -75,7 +75,6 @@ dependencies {
/* Other */
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
implementation(deps.decompose.ext.compose)
/* Core */

View file

@ -34,7 +34,7 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
private const val TOKEN_ACTIONS_DELAY = 500L
@ -205,7 +205,7 @@ internal class AddToPortfolioModel @Inject constructor(
finishFlow()
}
.catch { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
params.callback.onDismiss()
}
.launchIn(modelScope)

View file

@ -29,7 +29,7 @@ import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.*
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import javax.inject.Inject
@ -134,7 +134,7 @@ internal class AddToPortfolioPreselectedDataModel @Inject constructor(
finishSuccessFlow(addedToken.currency, selectedPortfolioValue.userWallet.walletId)
}
.catch { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
params.callback.onDismiss()
}
.launchIn(modelScope)

View file

@ -11,7 +11,7 @@ import com.tangem.domain.managetokens.CheckCurrencyUnsupportedUseCase
import com.tangem.domain.managetokens.model.CurrencyUnsupportedState
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.features.feed.impl.R
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
class CheckCurrencyUnsupportedDelegate @Inject constructor(
@ -29,14 +29,14 @@ class CheckCurrencyUnsupportedDelegate @Inject constructor(
networkId = rawNetworkId,
isMainNetwork = isMainNetwork,
).getOrElse { throwable ->
Timber.e(
throwable,
TangemLogger.e(
"""
Failed to check currency unsupported state
|- User wallet ID: $userWalletId
|- Network ID: $rawNetworkId
|- Is main network: $isMainNetwork
""".trimIndent(),
throwable,
)
val message = SnackbarMessage(

View file

@ -16,7 +16,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultMarketsTokenDetailDeepLinkHandler @AssistedInject constructor(
@Assisted private val scope: CoroutineScope,
@ -44,7 +44,7 @@ internal class DefaultMarketsTokenDetailDeepLinkHandler @AssistedInject construc
tokenId = rawTokenId,
tokenSymbol = "", // used for analytics
).getOrElse {
Timber.e("Failed to get market token info")
TangemLogger.e("Failed to get market token info")
return@launch
}

View file

@ -9,7 +9,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultNewsDetailsDeepLinkHandler @AssistedInject constructor(
@Assisted private val scope: CoroutineScope,
@ -25,7 +25,7 @@ internal class DefaultNewsDetailsDeepLinkHandler @AssistedInject constructor(
scope.launch {
val articleId = extractArticleIdFromUri(deeplinkUri)
if (articleId == null) {
Timber.e(
TangemLogger.e(
"""
Failed to extract article ID from deep link
|- Received URI: $deeplinkUri

View file

@ -6,10 +6,10 @@ import com.tangem.domain.markets.TokenMarketUpdateRequest
import com.tangem.pagination.BatchAction
import com.tangem.pagination.BatchUpdateResult
import com.tangem.pagination.PaginationStatus
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal fun logStatus(tag: String, status: PaginationStatus<List<TokenMarket>>) {
Timber.tag(tag).d(
TangemLogger.withTag(tag).d(
"""
Status
$status
@ -19,19 +19,19 @@ internal fun logStatus(tag: String, status: PaginationStatus<List<TokenMarket>>)
internal fun logAction(tag: String, action: BatchAction<Int, TokenMarketListConfig, TokenMarketUpdateRequest>) {
when (action) {
is BatchAction.Reload -> Timber.tag(tag).d(
is BatchAction.Reload -> TangemLogger.withTag(tag).d(
"""
Reload = ${action.requestParams}
""".trimIndent(),
)
is BatchAction.UpdateBatches -> Timber.tag(tag).d(
is BatchAction.UpdateBatches -> TangemLogger.withTag(tag).d(
"""
To update:
keys: ${action.keys.toList()}
updateType: ${action.updateRequest.javaClass.simpleName}
""".trimIndent(),
)
else -> Timber.tag(tag).d(
else -> TangemLogger.withTag(tag).d(
"""
$action
""".trimIndent(),
@ -48,7 +48,7 @@ internal fun logUpdateResults(
is BatchUpdateResult.Error -> s.throwable.toString()
}
Timber.tag(tag).d(
TangemLogger.withTag(tag).d(
"""
updateResults
request: ${updateResult.first}

View file

@ -35,7 +35,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.util.Locale
import javax.inject.Inject
@ -134,7 +134,7 @@ internal class NewsDetailsModel @Inject constructor(
modelScope.launch {
toggleArticleLikedUseCase
.toggleLiked(articleId)
.onLeft { Timber.e(it) }
.onLeft { TangemLogger.e("Error", it) }
analyticsEventHandler.send(NewsDetailsAnalyticsEvent.NewsLikeClicked(articleId))
}
}
@ -231,7 +231,7 @@ internal class NewsDetailsModel @Inject constructor(
}
// global request executing error
newsId < 0 -> {
Timber.e(error)
TangemLogger.e("Error", error)
}
else -> {
val (code, message) = when (error) {

View file

@ -22,7 +22,8 @@ dependencies {
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.core.navigation)
implementation(projects.core.utils)
/** Common */
implementation(projects.common.routing)
@ -63,7 +64,6 @@ dependencies {
/** Other libraries */
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -48,7 +48,7 @@ import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.util.Locale
import javax.inject.Inject
@ -196,7 +196,7 @@ internal class HomeModel @Inject constructor(
val userWallet = coldUserWalletBuilderFactory.create(scanResponse = scanResponse).build()
if (userWallet == null) {
Timber.e("User wallet not created")
TangemLogger.e("User wallet not created")
setLoading(false)
return
}
@ -205,11 +205,11 @@ internal class HomeModel @Inject constructor(
userWallet = userWallet,
analyticsSource = AnalyticsParam.ScreensSources.Intro,
).fold(
ifLeft = {
ifLeft = { error ->
delay(HIDE_PROGRESS_DELAY)
setLoading(false)
when (it) {
is SaveWalletError.DataError -> Timber.e(it.toString(), "Unable to save user wallet")
when (error) {
is SaveWalletError.DataError -> TangemLogger.e("Unable to save user wallet: $error")
is SaveWalletError.WalletAlreadySaved -> appRouter.replaceAll(AppRoute.Wallet)
}
},
@ -245,8 +245,8 @@ internal class HomeModel @Inject constructor(
private fun handleScanError(error: TangemError) {
when (error) {
is TangemSdkError.NfcFeatureIsUnavailable -> handleNfcFeatureUnavailable()
is TangemSdkError -> Timber.e(error, "Scan error occurred")
else -> Timber.e(error, "Error happened")
is TangemSdkError -> TangemLogger.e("Scan error occurred", error)
else -> TangemLogger.e("Error happened", error)
}
}

View file

@ -72,7 +72,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
/** DI */

View file

@ -26,7 +26,7 @@ import com.tangem.utils.coroutines.saveIn
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@ModelScoped
@ -53,7 +53,7 @@ internal class HotAccessCodeRequestModel @Inject constructor(
suspend fun show(attemptRequest: HotWalletPasswordRequester.AttemptRequest) {
if (userWalletExists(attemptRequest.hotWalletId).not()) {
Timber.e("User wallet with id ${attemptRequest.hotWalletId} does not exist")
TangemLogger.e("User wallet with id ${attemptRequest.hotWalletId} does not exist")
result.value = HotWalletPasswordRequester.Result.Dismiss
return
}

View file

@ -1,5 +1,6 @@
package com.tangem.features.hotwallet.addexistingwallet.im.port.model
import com.tangem.utils.logging.TangemLogger
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent
@ -28,7 +29,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@Suppress("LongParameterList")
@ -96,10 +96,10 @@ internal class AddExistingWalletImportModel @Inject constructor(
val hotUserWalletBuilder = hotUserWalletBuilderFactory.create(hotWalletId)
val userWallet = hotUserWalletBuilder.build()
saveUserWalletUseCase.invoke(userWallet.copy(backedUp = true))
.onLeft {
.onLeft { error ->
setImportProgress(false)
when (it) {
is SaveWalletError.DataError -> Timber.e(it.toString(), "Unable to save user wallet")
when (error) {
is SaveWalletError.DataError -> TangemLogger.e("Unable to save user wallet: $error")
is SaveWalletError.WalletAlreadySaved -> {
uiMessageSender.send(
SnackbarMessage(resourceReference(R.string.hw_import_seed_phrase_already_imported)),
@ -129,8 +129,8 @@ internal class AddExistingWalletImportModel @Inject constructor(
)
params.callbacks.onWalletImported(userWallet.walletId)
}
}.onFailure {
Timber.e(it)
}.onFailure { throwable ->
TangemLogger.e("Error", throwable)
setImportProgress(false)
}
}

View file

@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
private const val HIDE_PROGRESS_DELAY = 400L
@ -129,7 +129,7 @@ internal class CreateHardwareWalletModel @Inject constructor(
val userWallet = coldUserWalletBuilderFactory.create(scanResponse = scanResponse).build()
if (userWallet == null) {
Timber.e("User wallet not created")
TangemLogger.e("User wallet not created")
setLoading(false)
return
}
@ -142,7 +142,7 @@ internal class CreateHardwareWalletModel @Inject constructor(
delay(HIDE_PROGRESS_DELAY)
setLoading(false)
when (saveWalletError) {
is SaveWalletError.DataError -> Timber.e(saveWalletError.toString(), "Unable to save user wallet")
is SaveWalletError.DataError -> TangemLogger.e("Unable to save user wallet: $saveWalletError")
is SaveWalletError.WalletAlreadySaved -> handleAlreadySavedCard(
saveWalletError.messageId,
walletId = userWallet.walletId,
@ -164,8 +164,8 @@ internal class CreateHardwareWalletModel @Inject constructor(
private fun handleScanError(error: TangemError) {
when (error) {
is TangemSdkError.NfcFeatureIsUnavailable -> handleNfcFeatureUnavailable()
is TangemSdkError -> Timber.e(error, "Scan error occurred")
else -> Timber.e(error, "Error happened")
is TangemSdkError -> TangemLogger.e("Scan error occurred", error)
else -> TangemLogger.e("Error happened", error)
}
}

View file

@ -28,7 +28,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -112,7 +112,7 @@ internal class CreateMobileWalletModel @Inject constructor(
router.replaceAll(AppRoute.Wallet)
}.onFailure { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
uiState.update { it.copy(createButtonLoading = false) }
}

View file

@ -1,6 +1,7 @@
package com.tangem.features.hotwallet.forgetwallet
import arrow.core.getOrElse
import com.tangem.utils.logging.TangemLogger
import com.tangem.common.routing.AppRoute
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
@ -20,7 +21,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@ModelScoped
@ -80,8 +80,8 @@ internal class ForgetWalletModel @Inject constructor(
private fun forgetWallet() {
modelScope.launch {
val hasUserWallets = deleteWalletUseCase(params.userWalletId)
.getOrElse {
Timber.e("Unable to delete wallet: $it")
.getOrElse { error ->
TangemLogger.e("Unable to delete wallet: $error")
uiMessageSender.send(
message = SnackbarMessage(resourceReference(R.string.common_unknown_error)),

View file

@ -3,6 +3,7 @@ package com.tangem.features.hotwallet.manualbackup.check.model
import androidx.compose.runtime.Stable
import androidx.compose.ui.text.input.TextFieldValue
import arrow.core.getOrElse
import com.tangem.utils.logging.TangemLogger
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
@ -20,15 +21,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
import kotlin.Boolean
import kotlin.Int
import kotlin.String
import kotlin.Suppress
import kotlin.collections.List
import kotlin.collections.all
import kotlin.collections.map
@Stable
@ModelScoped
@ -63,7 +56,7 @@ internal class ManualBackupCheckModel @Inject constructor(
}
}
}.onFailure {
Timber.e(it)
TangemLogger.e("Error", it)
}
}
}
@ -114,8 +107,8 @@ internal class ManualBackupCheckModel @Inject constructor(
uiState.update {
it.copy(completeButtonProgress = false)
}
}.onFailure {
Timber.e(it)
}.onFailure { throwable ->
TangemLogger.e("Error", throwable)
uiState.update {
it.copy(completeButtonProgress = false)

View file

@ -19,7 +19,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Stable
@ -58,7 +58,7 @@ internal class ManualBackupPhraseModel @Inject constructor(
}
}
}.onFailure {
Timber.e(it)
TangemLogger.e("Error", it)
}
}
}

View file

@ -19,7 +19,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Stable
@ -53,7 +53,7 @@ internal class ViewPhraseModel @Inject constructor(
modelScope.launch {
val words = exportSeedPhraseUseCase.invoke(userWallet.hotWalletId)
.getOrElse { error -> Timber.e(error); throw error }
.getOrElse { error -> TangemLogger.e("Error", error); throw error }
.mnemonic.mnemonicComponents
uiState.update {

View file

@ -21,7 +21,7 @@ import com.tangem.features.hotwallet.walletbackup.entity.WalletBackupUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.util.concurrent.atomic.AtomicBoolean
import javax.inject.Inject
@ -71,7 +71,7 @@ internal class WalletBackupModel @Inject constructor(
.onEach { either ->
either.fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
if (!isScreenOpenedEventSent.get() && userWallet is UserWallet.Hot) {
@ -128,13 +128,13 @@ internal class WalletBackupModel @Inject constructor(
getUserWalletUseCase.invoke(params.userWalletId)
.fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
when (userWallet) {
is UserWallet.Cold -> {
val userWalletId = userWallet.walletId
Timber.e("Unexpected cold wallet when request seed phrase: $userWalletId")
TangemLogger.e("Unexpected cold wallet when request seed phrase: $userWalletId")
}
is UserWallet.Hot -> showSeedPhrase(userWallet)
}
@ -155,7 +155,7 @@ internal class WalletBackupModel @Inject constructor(
unlockHotWalletContextualUseCase.invoke(hotWallet.hotWalletId)
.fold(
ifLeft = {
Timber.e("Error while export seed phrase: $it")
TangemLogger.e("Error while export seed phrase: $it")
},
ifRight = { seedPhrasePrivateInfo ->
router.push(AppRoute.ViewPhrase(params.userWalletId))

View file

@ -35,7 +35,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -147,7 +147,7 @@ internal class WalletHardwareBackupModel @Inject constructor(
-> modelScope.launch {
unlockHotWalletContextualUseCase.invoke(hotWalletId)
.onLeft {
Timber.e(it, "Unable to unlock wallet with id ${params.userWalletId}")
TangemLogger.e("Unable to unlock wallet with id ${params.userWalletId}", it)
}
.onRight {
router.push(AppRoute.UpgradeWallet(userWalletId = params.userWalletId))

View file

@ -49,7 +49,6 @@ dependencies {
/** Other libraries */
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
implementation(deps.sumsub.sdk)
implementation(deps.arrow.core)

View file

@ -13,7 +13,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Stable
@ -40,7 +40,7 @@ class DefaultKycModel @Inject constructor(
tangemPayEligibilityManager.reset()
}
} catch (e: Exception) {
Timber.e(e)
TangemLogger.e("Error", e)
}
}
}

View file

@ -24,6 +24,7 @@ dependencies {
implementation(projects.core.ui)
implementation(projects.core.configToggles)
implementation(projects.core.analytics)
implementation(projects.core.utils)
implementation(projects.common.routing)
implementation(projects.common.ui)
@ -67,6 +68,5 @@ dependencies {
/* Other */
implementation(deps.kotlin.immutable.collections)
implementation(deps.decompose.ext.compose)
implementation(deps.timber)
implementation(deps.reKotlin) // need for legacy onboarding
}

View file

@ -41,7 +41,7 @@ import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -243,7 +243,7 @@ internal class ChooseManagedTokensModel @Inject constructor(
}
is PaginationStatus.Paginating -> {
(status.lastResult as? BatchFetchResult.Error)?.let { fetchError ->
Timber.e(fetchError.throwable)
TangemLogger.e("Error", fetchError.throwable)
}
state.copy(

View file

@ -1,6 +1,7 @@
package com.tangem.features.managetokens.model
import arrow.core.getOrElse
import com.tangem.utils.logging.TangemLogger
import com.tangem.common.core.TangemSdkError
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
@ -36,7 +37,6 @@ import kotlinx.collections.immutable.mutate
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
// TODO: Divide to sub-components: [REDACTED_JIRA]
@ -239,7 +239,7 @@ internal class CustomTokenFormModel @Inject constructor(
}
private fun showErrorDialog(throwable: Throwable) {
Timber.e(throwable)
TangemLogger.e("Error", throwable)
val message = when (throwable) {
is TangemSdkError -> resourceReference(
R.string.generic_error_code,
@ -279,7 +279,7 @@ internal class CustomTokenFormModel @Inject constructor(
stateAcc // No need to display error
}
is CustomTokenFormValidationException.DataError -> {
Timber.e(exception.cause, "Unable to validate custom currency")
TangemLogger.e("Unable to validate custom currency", exception.cause)
stateAcc
}
}

View file

@ -38,7 +38,7 @@ import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList", "LargeClass")
@ -248,7 +248,7 @@ internal class ManageTokensModel @Inject constructor(
}
is PaginationStatus.Paginating -> {
(status.lastResult as? BatchFetchResult.Error)?.let { fetchError ->
Timber.e(fetchError.throwable)
TangemLogger.e("Error", fetchError.throwable)
}
state.copySealed(
@ -339,7 +339,7 @@ internal class ManageTokensModel @Inject constructor(
currenciesToAdd = manageTokensListManager.currenciesToAdd.value,
currenciesToRemove = manageTokensListManager.currenciesToRemove.value,
).getOrElse { throwable ->
Timber.e(throwable, "Failed to save changes")
TangemLogger.e("Failed to save changes", throwable)
return@resource
}

View file

@ -33,7 +33,7 @@ import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -167,7 +167,7 @@ internal class OnboardingManageTokensModel @Inject constructor(
}
is PaginationStatus.Paginating -> {
(status.lastResult as? BatchFetchResult.Error)?.let { fetchError ->
Timber.e(fetchError.throwable)
TangemLogger.e("Error", fetchError.throwable)
}
state.copy(
@ -261,7 +261,7 @@ internal class OnboardingManageTokensModel @Inject constructor(
currenciesToAdd = manageTokensListManager.currenciesToAdd.value,
currenciesToRemove = manageTokensListManager.currenciesToRemove.value,
).getOrElse { throwable ->
Timber.e(throwable, "Failed to save changes")
TangemLogger.e("Failed to save changes", throwable)
return@resource
}
@ -286,7 +286,7 @@ internal class OnboardingManageTokensModel @Inject constructor(
currenciesToAdd = manageTokensListManager.currenciesToAdd.value,
currenciesToRemove = manageTokensListManager.currenciesToRemove.value,
).getOrElse { throwable ->
Timber.e(throwable, "Failed to save changes")
TangemLogger.e("Failed to save changes", throwable)
return@resource
}

View file

@ -16,7 +16,7 @@ import com.tangem.utils.coroutines.saveInAndJoin
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class CustomCurrencyValidator(
private val userWalletId: UserWalletId,
@ -103,7 +103,7 @@ internal class CustomCurrencyValidator(
).getOrElse { e ->
when (e) {
is FindTokenException.DataError -> {
Timber.e(e.cause, "Unable to find custom currency")
TangemLogger.e("Unable to find custom currency", e.cause)
updateStatus(Status.UnexpectedException(e.cause))
return
}
@ -135,7 +135,7 @@ internal class CustomCurrencyValidator(
).getOrElse { e ->
val newStatus = when (e) {
is FindTokenException.DataError -> {
Timber.e(e.cause, "Unable to find custom currency")
TangemLogger.e("Unable to find custom currency", e.cause)
Status.UnexpectedException(e.cause)
}
is FindTokenException.NotFound -> {
@ -161,7 +161,7 @@ internal class CustomCurrencyValidator(
derivationPath = derivationPath,
formValues = validatedForm,
).getOrElse { e ->
Timber.e(e, "Unable to create custom currency")
TangemLogger.e("Unable to create custom currency", e)
updateStatus(Status.UnexpectedException(e))
return
}
@ -181,7 +181,7 @@ internal class CustomCurrencyValidator(
is CryptoCurrency.Token -> currency.contractAddress
},
).getOrElse { e ->
Timber.e(e, "Unable to check if currency is already added")
TangemLogger.e("Unable to check if currency is already added", e)
updateStatus(Status.UnexpectedException(e))
return

View file

@ -5,6 +5,7 @@ import arrow.core.raise.Raise
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import arrow.core.right
import com.tangem.utils.logging.TangemLogger
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchainsdk.utils.fromNetworkId
import com.tangem.domain.account.producer.SingleAccountListProducer
@ -21,7 +22,6 @@ import com.tangem.lib.crypto.derivation.AccountNodeRecognizer
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
internal class CustomTokenFormUseCasesFacade @AssistedInject constructor(
@Assisted private val userWalletId: UserWalletId,
@ -84,14 +84,14 @@ internal class CustomTokenFormUseCasesFacade @AssistedInject constructor(
val blockchain = Blockchain.fromNetworkId(networkId = currency.network.backendId)
if (blockchain == null) {
val exception = IllegalStateException("Token has unknown networkId: ${currency.id}")
Timber.e(exception)
TangemLogger.e("Error", exception)
raise(exception)
}
val derivationPathValue = currency.network.derivationPath.value
if (derivationPathValue == null) {
val exception = IllegalStateException("Token has no derivation path: ${currency.id}")
Timber.e(exception)
TangemLogger.e("Error", exception)
raise(exception)
}
@ -99,10 +99,9 @@ internal class CustomTokenFormUseCasesFacade @AssistedInject constructor(
val index = accountNodeRecognizer.recognize(derivationPathValue)?.toInt()
if (index == null) {
Timber.e(
"%s%s",
"Unable to determine account index for derivation path: $derivationPathValue. ",
"Use main account index instead.",
TangemLogger.e(
"Unable to determine account index for derivation path: $derivationPathValue. " +
"Use main account index instead.",
)
DerivationIndex.Main.value
} else {

View file

@ -38,7 +38,7 @@ import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
@Suppress("LongParameterList", "LargeClass")
internal class ManageTokensListManager @AssistedInject constructor(
@ -222,7 +222,7 @@ internal class ManageTokensListManager @AssistedInject constructor(
scope.launch {
useCasesFacade.removeCustomCurrencyUseCase(currency)
.onRight { reload() }
.onLeft { Timber.e(it) }
.onLeft { TangemLogger.e("Error", it) }
}
}
@ -266,13 +266,13 @@ internal class ManageTokensListManager @AssistedInject constructor(
tempAddedTokens = changedCurrenciesManager.currenciesToAdd.value,
tempRemovedTokens = changedCurrenciesManager.currenciesToRemove.value,
).getOrElse { throwable ->
Timber.e(
throwable,
TangemLogger.e(
"""
Failed to check linked tokens
|- Mode: $mode
|- Network ID: ${network.id}
""".trimIndent(),
throwable,
)
val message = SnackbarMessage(
@ -292,13 +292,13 @@ internal class ManageTokensListManager @AssistedInject constructor(
return useCasesFacade.checkCurrencyUnsupportedUseCase(
sourceNetwork = sourceNetwork,
).getOrElse { throwable ->
Timber.e(
throwable,
TangemLogger.e(
"""
Failed to check currency unsupported state
|- Mode: $mode
|- Source Network: $sourceNetwork
""".trimIndent(),
throwable,
)
val message = SnackbarMessage(

View file

@ -68,7 +68,6 @@ dependencies {
/* Other */
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
implementation(deps.decompose.ext.compose)
/* Core */
@ -78,6 +77,7 @@ dependencies {
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.core.navigation)
implementation(projects.core.utils)
/* Common */
implementation(projects.common.ui)

View file

@ -73,7 +73,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
/** DI */

View file

@ -21,7 +21,7 @@ import com.tangem.features.nft.impl.R
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -136,7 +136,7 @@ internal class NFTCollectionsModel @Inject constructor(
_state.update { ChangeRefreshingStateTransformer(true).transform(it) }
try {
refreshAllNFTUseCase(params.userWalletId)
.onLeft { Timber.e(it) }
.onLeft { TangemLogger.e("Error", it) }
} finally {
_state.update { ChangeRefreshingStateTransformer(false).transform(it) }
}

View file

@ -38,7 +38,7 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -115,7 +115,7 @@ internal class NFTDetailsModel @Inject constructor(
getNFTPriceUseCase(params.userWalletId, params.nftAsset)
.fold(
ifLeft = {
Timber.w(it)
TangemLogger.w("Error", it)
},
ifRight = { quoteFlow ->
quoteFlow

View file

@ -81,7 +81,6 @@ dependencies {
/** Other libraries */
implementation(deps.kotlin.immutable.collections)
implementation(deps.kotlin.serialization)
implementation(deps.timber)
implementation(deps.firebase.crashlytics)
implementation(tangemDeps.card.core)

View file

@ -1,5 +1,6 @@
package com.tangem.features.onboarding.v2.twin.impl.model
import com.tangem.utils.logging.TangemLogger
import com.tangem.Message
import com.tangem.common.CompletionResult
import com.tangem.common.KeyPair
@ -47,7 +48,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@Suppress("LongParameterList", "LargeClass")
@ -296,7 +296,7 @@ internal class OnboardingTwinModel @Inject constructor(
private suspend fun finishActivation(scanResponse: ScanResponse) = coroutineScope {
val userWallet = coldUserWalletBuilderFactory.create(scanResponse).build() ?: run {
Timber.e("User wallet not created")
TangemLogger.e("User wallet not created")
setLoading(false)
return@coroutineScope
}
@ -305,8 +305,8 @@ internal class OnboardingTwinModel @Inject constructor(
userWallet = userWallet,
canOverride = true,
analyticsSource = AnalyticsParam.ScreensSources.Onboarding,
).onLeft {
Timber.e("Unable to save user wallet: $it")
).onLeft { error ->
TangemLogger.e("Unable to save user wallet: $error")
setLoading(false)
return@coroutineScope
}
@ -326,7 +326,7 @@ internal class OnboardingTwinModel @Inject constructor(
modelScope.launch {
val userWallet = coldUserWalletBuilderFactory.create(params.scanResponse).build() ?: run {
Timber.e("User wallet not created")
TangemLogger.e("User wallet not created")
setLoading(false)
return@launch
}
@ -335,8 +335,8 @@ internal class OnboardingTwinModel @Inject constructor(
userWallet = userWallet,
canOverride = true,
analyticsSource = AnalyticsParam.ScreensSources.Onboarding,
).onLeft {
Timber.e("Unable to save user wallet: $it")
).onLeft { error ->
TangemLogger.e("Unable to save user wallet: $error")
setLoading(false)
return@launch
}

View file

@ -82,5 +82,4 @@ dependencies {
implementation(deps.decompose.ext.compose)
implementation(deps.kotlin.immutable.collections)
implementation(deps.reKotlin)
implementation(deps.timber)
}

View file

@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
internal class AllOffersModel @Inject constructor(
@ -127,7 +127,7 @@ internal class AllOffersModel @Inject constructor(
}
private fun handleOnrampError(onrampError: OnrampError) {
Timber.e(onrampError.toString())
TangemLogger.e(onrampError.toString())
state.update { stateFactory.getOnrampErrorState(onrampError) }
}
}

View file

@ -5,7 +5,7 @@ import com.tangem.common.routing.AppRouter
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultBuyDeepLinkHandler @AssistedInject constructor(
router: AppRouter,
@ -16,7 +16,7 @@ internal class DefaultBuyDeepLinkHandler @AssistedInject constructor(
// It is okay here, we are navigating from outside, and there is no other way to getting UserWallet
getSelectedWalletSyncUseCase().fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
router.push(AppRoute.BuyCrypto(userWallet.walletId))

View file

@ -8,7 +8,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultOnrampDeepLinkHandler @AssistedInject constructor(
@Assisted scope: CoroutineScope,
@ -36,7 +36,7 @@ internal class DefaultOnrampDeepLinkHandler @AssistedInject constructor(
}
}
else -> {
Timber.e(
TangemLogger.e(
"""
Invalid parameters for ONRAMP deeplink
|- Params: $queryParams

View file

@ -5,7 +5,7 @@ import com.tangem.common.routing.AppRouter
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultSellDeepLinkHandler @AssistedInject constructor(
router: AppRouter,
@ -16,7 +16,7 @@ internal class DefaultSellDeepLinkHandler @AssistedInject constructor(
// It is okay here, we are navigating from outside, and there is no other way to getting UserWallet
getSelectedWalletSyncUseCase().fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
router.push(AppRoute.SellCrypto(userWallet.walletId))

View file

@ -5,7 +5,7 @@ import com.tangem.common.routing.AppRouter
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultSwapDeepLinkHandler @AssistedInject constructor(
router: AppRouter,
@ -16,7 +16,7 @@ internal class DefaultSwapDeepLinkHandler @AssistedInject constructor(
// It is okay here, we are navigating from outside, and there is no other way to getting UserWallet
getSelectedWalletSyncUseCase().fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
router.push(AppRoute.SwapCrypto(userWallet.walletId))

View file

@ -41,7 +41,7 @@ import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.*
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
/**
@ -187,7 +187,7 @@ internal class HotCryptoModel @Inject constructor(
channel.close()
}
.catch { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
closeNavigationFlow()
}
.launchIn(modelScope)

View file

@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
/**
@ -56,13 +56,13 @@ internal class OnrampAddToPortfolioModel @Inject constructor(
private fun isTangemIconVisible(): Boolean {
return getUserWalletUseCase(params.userWalletId)
.onLeft { Timber.e("Unable to get wallet by id [${params.userWalletId}]: $it") }
.onLeft { TangemLogger.e("Unable to get wallet by id [${params.userWalletId}]: $it") }
.fold(ifLeft = { false }, ifRight = { it is UserWallet.Cold })
}
private fun getUserWalletName(): String {
return getUserWalletUseCase(params.userWalletId)
.onLeft { Timber.e("Unable to get wallet name by id [${params.userWalletId}]: $it") }
.onLeft { TangemLogger.e("Unable to get wallet name by id [${params.userWalletId}]: $it") }
.fold(ifLeft = { "" }, ifRight = UserWallet::name)
}
@ -74,7 +74,7 @@ internal class OnrampAddToPortfolioModel @Inject constructor(
manageCryptoCurrenciesUseCase(accountId = accountId, add = params.cryptoCurrency)
.onRight { params.onSuccessAdding(params.cryptoCurrency.id) }
.onLeft { throwable ->
Timber.e("Failed to add crypto currency: $throwable")
TangemLogger.e("Failed to add crypto currency: $throwable")
changeAddButtonProgressStatus(isProgress = false)
}
}

View file

@ -29,7 +29,7 @@ import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.isNullOrZero
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList", "LargeClass")
@ -351,7 +351,7 @@ internal class OnrampMainComponentModel @Inject constructor(
}
private fun handleOnrampError(onrampError: OnrampError) {
Timber.e(onrampError.toString())
TangemLogger.e(onrampError.toString())
state.update { stateFactory.getOnrampErrorState(onrampError) }
}

View file

@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.util.Locale
import javax.inject.Inject
@ -116,7 +116,7 @@ internal class SelectProviderModel @Inject constructor(
}
.onLeft { error ->
sendOnrampErrorEvent(error)
Timber.e(error.toString())
TangemLogger.e(error.toString())
}
}
}

View file

@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -133,7 +133,7 @@ internal class OnrampRedirectModel @Inject constructor(
}
private fun handleError(error: OnrampError) {
Timber.e(error.toString())
TangemLogger.e(error.toString())
analyticsEventHandler.sendOnrampErrorEvent(
error = error,
tokenSymbol = params.cryptoCurrency.symbol,

View file

@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import kotlin.properties.Delegates
@ -89,12 +89,12 @@ internal class OnrampSuccessComponentModel @Inject constructor(
getOnrampTransactionUseCase(txId = params.txId)
.fold(
ifLeft = { error ->
Timber.e(error.toString())
TangemLogger.e(error.toString())
showErrorAlert(error)
},
ifRight = { transaction ->
userWallet = getUserWalletUseCase(transaction.userWalletId).getOrElse {
Timber.e("UserWallet found")
TangemLogger.e("UserWallet not found")
// this case should never happened
showErrorAlert(OnrampError.DomainError("UserWallet not found"))
return@launch
@ -104,7 +104,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
?.getCryptoCurrency(currencyIdValue = transaction.toCurrencyId)?.getOrNull()
.toOption()
.getOrElse {
Timber.e("Crypto currency not found")
TangemLogger.e("Crypto currency not found")
showErrorAlert(OnrampError.DomainError(null))
return@launch
}
@ -145,7 +145,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
providerName = transaction.providerName,
paymentMethod = transaction.paymentMethod,
)
Timber.e(error.toString())
TangemLogger.e(error.toString())
showErrorAlert(error)
},
ifRight = { status ->

View file

@ -5,7 +5,7 @@ import com.tangem.features.onramp.swap.entity.utils.createEmptyExchangeTo
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
/**
@ -26,12 +26,12 @@ internal class SwapSelectTokensController @Inject constructor() {
)
fun update(transform: (SwapSelectTokensUM) -> SwapSelectTokensUM) {
Timber.d("Applying non-name transformation")
TangemLogger.d("Applying non-name transformation")
state.update(transform)
}
fun update(transformer: SwapSelectTokensUMTransformer) {
Timber.d("Applying ${transformer::class.simpleName ?: "null"}")
TangemLogger.d("Applying ${transformer::class.simpleName ?: "null"}")
state.update(transformer::transform)
}
}

View file

@ -8,7 +8,7 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
/**
@ -36,17 +36,17 @@ internal class TokenListUMController @Inject constructor() {
)
fun update(transform: (TokenListUM) -> TokenListUM) {
Timber.d("Applying non-name transformation")
TangemLogger.d("Applying non-name transformation")
state.update(transform)
}
fun update(transformer: TokenListUMTransformer) {
Timber.d("Applying ${transformer::class.simpleName ?: "unknown"}")
TangemLogger.d("Applying ${transformer::class.simpleName ?: "unknown"}")
state.update(transformer::transform)
}
fun update(transformer: SearchBarUMTransformer) {
Timber.d("Applying ${transformer::class.simpleName ?: "unknown"}")
TangemLogger.d("Applying ${transformer::class.simpleName ?: "unknown"}")
state.update { prevState ->
prevState.copy(
searchBarUM = transformer.transform(prevState.searchBarUM),

View file

@ -36,7 +36,6 @@ dependencies {
/** Other */
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -12,10 +12,10 @@ import com.tangem.features.promobanners.impl.converters.PromoBannerDisplayToNoti
import com.tangem.features.promobanners.impl.repository.PromoBannersRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runSuspendCatching
import com.tangem.utils.logging.TangemLogger
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.Locale
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
@ -76,7 +76,7 @@ internal class PromoBannersBlockModel @Inject constructor(
onCarouselScrolled = ::onCarouselScrolled,
)
}.onFailure { error ->
Timber.w(error, "Failed to load promo banners")
TangemLogger.w("Failed to load promo banners", error)
}
}
@ -111,11 +111,9 @@ internal class PromoBannersBlockModel @Inject constructor(
runSuspendCatching {
repository.dismissBanner(walletId, displayId)
}.onFailure { error ->
Timber.w(
TangemLogger.w(
"Failed to dismiss promo banner $displayId for wallet $walletId",
error,
"Failed to dismiss promo banner %s for wallet %s",
displayId,
walletId,
)
}
}

View file

@ -23,7 +23,6 @@ dependencies {
implementation(deps.compose.accompanist.permission)
/** Other dependencies */
implementation(deps.timber)
implementation(deps.arrow.core)
implementation(deps.kotlin.immutable.collections)
@ -34,6 +33,7 @@ dependencies {
implementation(projects.core.navigation)
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.core.utils)
/** Common modules */
implementation(projects.common.routing)

View file

@ -60,6 +60,5 @@ dependencies {
/** Other dependencies */
implementation(deps.arrow.core)
implementation(deps.timber)
implementation(tangemDeps.card.core)
}

View file

@ -26,7 +26,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.delay
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.io.IOException
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
@ -63,8 +63,8 @@ class DefaultQrScanningComponent @AssistedInject constructor(
}
}
val galleryLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {
val selectedImage = it ?: Uri.EMPTY
val galleryLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
val selectedImage = uri ?: Uri.EMPTY
if (selectedImage != Uri.EMPTY) {
val mimeType = context.contentResolver.getType(selectedImage)
if (mimeType.isImageMimeType()) {
@ -72,7 +72,7 @@ class DefaultQrScanningComponent @AssistedInject constructor(
val image = InputImage.fromFilePath(context, selectedImage)
analyzer.analyze(image)
} catch (e: IOException) {
Timber.e(e, "Unable to get image $selectedImage from gallery")
TangemLogger.e("Unable to get image $selectedImage from gallery", e)
}
}
}

View file

@ -35,7 +35,6 @@ dependencies {
/** Dependencies */
implementation(deps.arrow.core)
implementation(deps.jodatime)
implementation(deps.timber)
implementation(tangemDeps.card.core)
/** DI */

View file

@ -13,7 +13,7 @@ import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.feature.referral.domain.errors.ReferralError
import com.tangem.feature.referral.domain.models.ReferralData
import com.tangem.feature.referral.domain.models.TokenData
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class ReferralInteractorImpl(
private val repository: ReferralRepository,
@ -62,7 +62,7 @@ internal class ReferralInteractorImpl(
)
.mapLeft { it.mapToDomainError() }
.onLeft { error ->
Timber.e(error)
TangemLogger.e("Error", error)
if (error is ReferralError.UserCancelledException) {
throw error
}

View file

@ -58,7 +58,6 @@ dependencies {
implementation(deps.kotlin.immutable.collections)
implementation(deps.decompose.ext.compose)
implementation(deps.compose.accompanist.systemUiController)
implementation(deps.timber)
/** DI */
implementation(deps.hilt.android)

View file

@ -8,7 +8,7 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.feature.referral.api.deeplink.ReferralDeepLinkHandler
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
internal class DefaultReferralDeepLinkHandler @AssistedInject constructor(
appRouter: AppRouter,
@ -19,7 +19,7 @@ internal class DefaultReferralDeepLinkHandler @AssistedInject constructor(
// It is okay here, we are navigating from outside, and there is no other way to getting UserWallet
getSelectedWalletSyncUseCase().fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
if (userWallet !is UserWallet.Cold || userWallet.cardTypesResolver.isTangemWallet()) {

View file

@ -33,6 +33,7 @@ dependencies {
implementation(projects.core.configToggles)
implementation(projects.core.navigation)
implementation(projects.core.datasource)
implementation(projects.core.utils)
api(projects.core.pagination)
/** Tangem SDK */
@ -85,7 +86,6 @@ dependencies {
/** Other dependencies */
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
implementation(deps.androidx.paging.runtime)
/** DI */

View file

@ -18,7 +18,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
@Suppress("ComplexCondition")
internal class DefaultSellRedirectDeepLinkHandler @AssistedInject constructor(
@ -40,13 +40,13 @@ internal class DefaultSellRedirectDeepLinkHandler @AssistedInject constructor(
getSelectedWalletSyncUseCase()
.fold(
ifLeft = {
Timber.e("Error on getting user wallet: $it")
TangemLogger.e("Error on getting user wallet: $it")
},
ifRight = { userWallet ->
if (currencyId.isNullOrEmpty() || transactionId.isNullOrEmpty() ||
amount.isNullOrEmpty() || destinationAddress.isNullOrEmpty()
) {
Timber.e(
TangemLogger.e(
"""
Invalid parameters for SELL deeplink
|- Params: $queryParams
@ -57,7 +57,7 @@ internal class DefaultSellRedirectDeepLinkHandler @AssistedInject constructor(
scope.launch {
val cryptoCurrency = getCryptoCurrency(userWallet.walletId, currencyId).getOrElse {
Timber.e("Error on getting cryptoCurrency: $currencyId")
TangemLogger.e("Error on getting cryptoCurrency: $currencyId")
return@launch
}
// Convert using universal parser to account for regional separators

View file

@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
@Suppress("LongParameterList")
internal class FeeSelectorLogic @AssistedInject constructor(
@ -277,7 +277,7 @@ internal class FeeSelectorLogic @AssistedInject constructor(
val selectedToken = getSelectedTokenStatus(fee.feeTokenId).bind()
val availableTokens = getAvailableFeeTokens().fold(
ifLeft = { error ->
Timber.e("Failed to get available fee tokens: $error")
TangemLogger.e("Failed to get available fee tokens: $error")
if (selectedToken.currency !is CryptoCurrency.Coin) {
raise(error)
}

View file

@ -77,7 +77,7 @@ import com.tangem.utils.extensions.stripZeroPlainString
import com.tangem.utils.transformer.update
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import javax.inject.Inject
import com.tangem.features.send.v2.api.entity.FeeSelectorUM as FeeSelectorUMRedesigned
@ -374,7 +374,7 @@ internal class SendConfirmModel @Inject constructor(
network = cryptoCurrency.network,
).fold(
ifLeft = { error ->
Timber.e(error)
TangemLogger.e("Error", error)
_uiState.update(SendConfirmSendingStateTransformer(isSending = false))
alertFactory.getGenericErrorState(
onFailedTxEmailClick = {
@ -470,7 +470,7 @@ internal class SendConfirmModel @Inject constructor(
val tokenToAdd = currenciesRepository.createTokenCurrency(cryptoCurrency, network)
manageCryptoCurrenciesUseCase(accountId = accountId, add = tokenToAdd)
.onLeft(Timber::e)
.onLeft { TangemLogger.e("Error", it) }
}
}

View file

@ -65,7 +65,7 @@ import com.tangem.utils.coroutines.JobHolder
import com.tangem.utils.coroutines.saveIn
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import kotlin.properties.Delegates
@ -262,7 +262,7 @@ internal class SendModel @Inject constructor(
}
override fun onError(error: GetUserWalletError) {
Timber.w(error.toString())
TangemLogger.w(error.toString())
showAlertError()
}
@ -421,7 +421,7 @@ internal class SendModel @Inject constructor(
.launchIn(modelScope)
},
ifLeft = { error ->
Timber.w(error.toString())
TangemLogger.w(error.toString())
showAlertError()
return@launch
},

View file

@ -57,7 +57,7 @@ import com.tangem.utils.extensions.stripZeroPlainString
import com.tangem.utils.transformer.update
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import javax.inject.Inject
import com.tangem.features.send.v2.api.entity.FeeSelectorUM as FeeSelectorUMRedesigned
@ -273,7 +273,7 @@ internal class NFTSendConfirmModel @Inject constructor(
network = cryptoCurrency.network,
).fold(
ifLeft = { error ->
Timber.e(error)
TangemLogger.e("Error", error)
_uiState.update(NFTSendConfirmSendingStateTransformer(isSending = false))
alertFactory.getGenericErrorState(
onFailedTxEmailClick = { onFailedTxEmailClick(error.localizedMessage.orEmpty()) },
@ -297,7 +297,7 @@ internal class NFTSendConfirmModel @Inject constructor(
result.fold(
ifLeft = { error ->
Timber.e(error.toString())
TangemLogger.e(error.toString())
alertFactory.getSendTransactionErrorState(
error = error,
popBack = appRouter::pop,

View file

@ -23,7 +23,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.lifecycle.compose)
implementation(deps.jodatime)
implementation(deps.timber)
implementation(deps.moshi)
/** Compose */

View file

@ -17,7 +17,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
@Suppress("LongParameterList")
internal class DefaultStakingDeepLinkHandler @AssistedInject constructor(
@ -44,7 +44,7 @@ internal class DefaultStakingDeepLinkHandler @AssistedInject constructor(
// If selected user wallet is different than from deeplink - ignore deeplink
// If selected user wallet is null - ignore deeplink
if (walletId != selectedUserWalletId || selectedUserWalletId == null) {
Timber.e("Error on getting user wallet")
TangemLogger.e("Error on getting user wallet")
return
}
@ -60,7 +60,7 @@ internal class DefaultStakingDeepLinkHandler @AssistedInject constructor(
}
if (cryptoCurrency == null) {
Timber.e(
TangemLogger.e(
"""
Could not get crypto currency for
|- $NETWORK_ID_KEY: $networkId
@ -77,7 +77,7 @@ internal class DefaultStakingDeepLinkHandler @AssistedInject constructor(
val option = (availability as? StakingAvailability.Available)?.option
if (option == null) {
Timber.e("Staking is unavailable for ${cryptoCurrency.name}")
TangemLogger.e("Staking is unavailable for ${cryptoCurrency.name}")
return@launch
}

View file

@ -106,7 +106,7 @@ import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.util.concurrent.CopyOnWriteArrayList
import javax.inject.Inject
@ -835,7 +835,7 @@ internal class StakingModel @Inject constructor(
userWalletId = userWalletId,
).fold(
ifLeft = { error ->
Timber.e(error.toString())
TangemLogger.e(error.toString())
analyticsEventHandler.send(
StakingAnalyticsEvent.TransactionError(
errorCode = "CreateApprovalTxError",
@ -864,7 +864,7 @@ internal class StakingModel @Inject constructor(
network = tokenCryptoCurrency.network,
).fold(
ifLeft = { error ->
Timber.e(error.toString())
TangemLogger.e(error.toString())
analyticsEventHandler.send(
StakingAnalyticsEvent.TransactionError(
errorCode = error.getAnalyticsDescription(),
@ -1438,7 +1438,7 @@ internal class StakingModel @Inject constructor(
userWalletId = userWalletId,
network = cryptoCurrencyStatus.currency.network,
).getOrElse { throwable ->
Timber.e(throwable)
TangemLogger.e("Error", throwable)
false
}

View file

@ -39,7 +39,7 @@ import dagger.assisted.AssistedInject
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
@Suppress("LongParameterList")
@ -286,7 +286,7 @@ internal class StakeKitTransactionSender @AssistedInject constructor(
transactionHash = transactionHash,
)
}.onRight {
Timber.d("Successful hash submission")
TangemLogger.d("Successful hash submission")
}
}
}

View file

@ -26,6 +26,7 @@ dependencies {
implementation(projects.core.navigation)
implementation(projects.core.res)
implementation(projects.core.ui)
implementation(projects.core.utils)
implementation(projects.core.analytics)
/** AndroidX */
@ -37,10 +38,9 @@ dependencies {
implementation(deps.compose.ui.tooling)
/** Others */
implementation(deps.kotlin.immutable.collections)
implementation(deps.compose.coil)
implementation(deps.timber)
implementation(deps.arrow.core)
implementation(deps.compose.coil)
implementation(deps.kotlin.immutable.collections)
/** DI */
implementation(deps.hilt.android)

View file

@ -17,7 +17,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
internal class StoriesModel @Inject constructor(
@ -52,7 +52,7 @@ internal class StoriesModel @Inject constructor(
modelScope.launch {
getStoryContentUseCase.invokeSync(params.storyId).fold(
ifLeft = {
Timber.e("Unable to load stories for ${params.storyId}")
TangemLogger.e("Unable to load stories for ${params.storyId}")
openScreen(hideStories = false)
},
ifRight = { story ->

View file

@ -31,6 +31,7 @@ dependencies {
implementation(projects.core.configToggles)
implementation(projects.core.datasource)
implementation(projects.core.analytics)
implementation(projects.core.utils)
/** Common */
implementation(projects.common.ui)
@ -85,7 +86,6 @@ dependencies {
implementation(deps.arrow.core)
implementation(deps.decompose)
implementation(deps.decompose.ext.compose)
implementation(deps.timber)
implementation(deps.kotlin.immutable.collections)
implementation(deps.coil)

View file

@ -63,7 +63,7 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.util.Locale
import javax.inject.Inject
@ -558,7 +558,7 @@ internal class SwapAmountModel @Inject constructor(
startLoadingQuotesTask(isSilentReload = false)
} else {
@Suppress("NullableToStringCall")
Timber.e(
TangemLogger.e(
"""
Invalid cryptocurrencies status:
| Primary -> $primaryStatus

View file

@ -28,7 +28,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
@Suppress("LongParameterList")
@ -67,7 +67,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor(
private fun initContent() {
val userWallet = getUserWalletUseCase(params.userWalletId).getOrElse { error ->
Timber.e("Failed to get user wallet: $error")
TangemLogger.e("Failed to get user wallet: $error")
swapChooseTokenAlertFactory.getGenericErrorState(params.onDismiss)
return
}
@ -77,7 +77,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor(
token = params.token,
userWalletId = params.userWalletId,
).getOrElse {
Timber.e("Failed to get crypto currency")
TangemLogger.e("Failed to get crypto currency")
swapChooseTokenAlertFactory.getGenericErrorState(params.onDismiss)
return@launch
}
@ -88,7 +88,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor(
filterProviderTypes = SEND_WITH_SWAP_PROVIDER_TYPES,
swapTxType = SwapTxType.SendWithSwap,
).getOrElse { error ->
Timber.e(error.toString())
TangemLogger.e(error.toString())
uiState.update(
SwapChooseErrorStateTransformer(
tokenName = params.token.name,

View file

@ -28,7 +28,7 @@ import com.tangem.features.swap.v2.impl.common.ConfirmData
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.math.RoundingMode
@ -67,7 +67,7 @@ internal class SwapTransactionSender @AssistedInject constructor(
ExpressProviderType.DEX_BRIDGE,
ExpressProviderType.ONRAMP,
-> {
Timber.w("Provider $providerType is not supported in Send With Swap")
TangemLogger.w("Provider $providerType is not supported in Send With Swap")
onExpressError(ExpressError.UnknownError)
}
}
@ -155,7 +155,7 @@ internal class SwapTransactionSender @AssistedInject constructor(
userWalletId = userWallet.walletId,
network = fromStatus.currency.network,
).getOrElse { error ->
Timber.e(error, "Failed to create swap CEX tx data")
TangemLogger.e("Failed to create swap CEX tx data", error)
onSendError(SendTransactionError.UnknownError(Exception(error)))
return
}

View file

@ -34,7 +34,7 @@ import com.tangem.features.swap.v2.impl.sendviaswap.entity.SendWithSwapUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import javax.inject.Inject
import kotlin.properties.Delegates
@ -159,7 +159,7 @@ internal class SendWithSwapModel @Inject constructor(
getPrimaryCurrencyStatusUpdates(params.currency)
},
ifLeft = { error ->
Timber.w(error.toString())
TangemLogger.w(error.toString())
swapAlertFactory.getGenericErrorState(
expressError = ExpressError.UnknownError,
onFailedTxEmailClick = {

View file

@ -54,7 +54,6 @@ dependencies {
implementation(tangemDeps.blockchain)
/** Others */
implementation(deps.timber)
implementation(deps.jodatime)
/** DI */

View file

@ -39,7 +39,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.async
import kotlinx.coroutines.supervisorScope
import kotlinx.coroutines.withContext
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.io.IOException
import java.math.BigDecimal
import java.util.UUID
@ -253,7 +253,7 @@ internal class DefaultSwapRepository(
)
},
catch = { exception ->
Timber.e("getExchangeStatus error: $exception")
TangemLogger.e("getExchangeStatus error: $exception")
raise(UnknownError(exception.message))
},
)
@ -404,7 +404,7 @@ internal class DefaultSwapRepository(
return try {
txDetailsMoshiAdapter.fromJson(txDetailsJson)
} catch (e: IOException) {
Timber.e(e, "error parsing txDetailsJson")
TangemLogger.e("error parsing txDetailsJson", e)
null
}
}

View file

@ -55,7 +55,6 @@ dependencies {
/** Other Libraries **/
implementation(deps.kotlin.coroutines)
implementation(deps.arrow.core)
implementation(deps.timber)
implementation(tangemDeps.blockchain)
implementation(tangemDeps.card.core)
implementation(deps.moshi)

View file

@ -70,7 +70,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.coroutineScope
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.math.BigInteger
import java.math.RoundingMode
@ -290,7 +290,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
contractAddress = permissionOptions.forTokenContractAddress,
spenderAddress = permissionOptions.spenderAddress,
).getOrElse { error ->
Timber.e(error, "Failed to create approveTransaction")
TangemLogger.e("Failed to create approveTransaction", error)
return SwapTransactionState.Error.UnknownError
}
@ -321,7 +321,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
reduceBalanceBy: BigDecimal,
txFeeSealedState: TxFeeSealedState,
): Map<SwapProvider, SwapState> {
Timber.i(
TangemLogger.i(
"""
Find the best quote
|- fromToken: $fromToken
@ -702,7 +702,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
expressOperationType: ExpressOperationType,
isTangemPayWithdrawal: Boolean,
): SwapTransactionState {
Timber.i(
TangemLogger.i(
"""
Swap
|- swapProvider: $swapProvider
@ -795,7 +795,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
network = currencyToSendStatus.currency.network,
txExtras = createDexTxExtras(dataToSign, currencyToSendStatus.currency.network, txFee.fee.getGasLimit()),
).getOrElse { error ->
Timber.e(error, "Failed to create swap dex tx data")
TangemLogger.e("Failed to create swap dex tx data", error)
return SwapTransactionState.Error.UnknownError
}
@ -999,7 +999,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
userWalletId = userWalletId,
network = currencyToSend.currency.network,
).getOrElse { error ->
Timber.e(error, "Failed to create swap CEX tx data")
TangemLogger.e("Failed to create swap CEX tx data", error)
return SwapTransactionState.Error.UnknownError
}
@ -2065,7 +2065,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
userWallet = userWallet,
).getOrNull() ?: error("unable to calculate fee")
} catch (e: Exception) {
Timber.e(e, "Failed to get fee")
TangemLogger.e("Failed to get fee", e)
// it's impossible next steps without fee
return createSwapErrorWith(
fromToken = fromTokenStatus,
@ -2491,7 +2491,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
quotesRepository.getMultiQuoteSyncOrNull(currenciesIds = this@getQuotesOrEmpty).orEmpty()
}.getOrElse { e ->
Timber.e(e, "Failed to get quotes: ${e.message.orEmpty()}")
TangemLogger.e("Failed to get quotes: ${e.message.orEmpty()}", e)
emptySet()
}
}
@ -2505,7 +2505,7 @@ internal class SwapInteractorImpl @AssistedInject constructor(
return try {
SolanaTransactionHelper.removeSignaturesPlaceholders(hash)
} catch (e: Exception) {
Timber.e("Failed to format the hash: ${e.message.orEmpty()}")
TangemLogger.e("Failed to format the hash: ${e.message.orEmpty()}")
hash
}
}

View file

@ -94,7 +94,6 @@ dependencies {
implementation(deps.compose.accompanist.systemUiController)
implementation(deps.kotlin.serialization)
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
implementation(deps.decompose.ext.compose)
/** Tangem libs */

View file

@ -115,7 +115,7 @@ import com.tangem.utils.coroutines.*
import com.tangem.utils.isNullOrZero
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import timber.log.Timber
import com.tangem.utils.logging.TangemLogger
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat
@ -555,7 +555,7 @@ internal class SwapModel @Inject constructor(
subscribeToCoinBalanceUpdatesIfNeeded()
}.onFailure { error ->
Timber.e(error)
TangemLogger.e("Error", error)
applyInitialTokenChoice(
state = TokensDataStateExpress.EMPTY,
@ -597,7 +597,7 @@ internal class SwapModel @Inject constructor(
swapRouter.back()
}.onFailure { error ->
Timber.e(error)
TangemLogger.e("Error", error)
}
}
}
@ -820,11 +820,11 @@ internal class SwapModel @Inject constructor(
}
} else {
feeSelectorRepository.state.value = FeeSelectorUM.Error(GetFeeError.UnknownError, isHidden = true)
Timber.e("Accidentally empty quotes list")
TangemLogger.e("Accidentally empty quotes list")
}
},
onError = { error ->
Timber.e("Error when loading quotes: $error")
TangemLogger.e("Error when loading quotes: $error")
feeSelectorRepository.state.value = FeeSelectorUM.Error(GetFeeError.UnknownError, isHidden = true)
uiState = stateBuilder.addNotification(uiState, null) { startLoadingQuotesFromLastState() }
},
@ -1031,7 +1031,7 @@ internal class SwapModel @Inject constructor(
val provider = requireNotNull(dataState.selectedProvider) { "Selected provider is null" }
val lastLoadedQuotesState = dataState.lastLoadedSwapStates[provider] as? SwapState.QuotesLoadedState
if (lastLoadedQuotesState == null) {
Timber.e("Last loaded quotes state is null")
TangemLogger.e("Last loaded quotes state is null")
return
}
val fromCurrency = requireNotNull(dataState.fromCryptoCurrency)
@ -1075,7 +1075,7 @@ internal class SwapModel @Inject constructor(
txHash = swapTransactionState.txHash,
currency = fromCurrency.currency,
).getOrElse {
Timber.i("tx hash explore not supported")
TangemLogger.i("tx hash explore not supported")
""
}
@ -1119,7 +1119,7 @@ internal class SwapModel @Inject constructor(
}
}
}.onFailure { error ->
Timber.e(error)
TangemLogger.e("Error", error)
startLoadingQuotesFromLastState()
showAlert()
}
@ -1214,7 +1214,7 @@ internal class SwapModel @Inject constructor(
val feeForPermission = when (val fee = approveDataModel.fee) {
TxFeeState.Empty -> {
showAlert(resourceReference(R.string.swapping_fee_estimation_error_text))
Timber.e("Fee should not be Empty")
TangemLogger.e("Fee should not be Empty")
return@launch
}
is TxFeeState.MultipleFeeState -> fee.priorityFee
@ -1254,7 +1254,7 @@ internal class SwapModel @Inject constructor(
}
}.onFailure { showAlert() }
}.onFailure { error ->
Timber.e(error.message.orEmpty())
TangemLogger.e(error.message.orEmpty())
showAlert()
}
}
@ -1436,14 +1436,14 @@ internal class SwapModel @Inject constructor(
coin: CryptoCurrency.Coin,
isFromCurrency: Boolean,
) {
Timber.d("Subscribe to ${coin.id} balance updates")
TangemLogger.d("Subscribe to ${coin.id} balance updates")
getAccountCurrencyStatusUseCase(
userWalletId = userWalletId,
currency = coin,
).distinctUntilChanged { old, new -> old.status.value.amount == new.status.value.amount } // Check only balance changes
.onEach { (account, currencyStatus) ->
Timber.d("${coin.id} balance is ${currencyStatus.value.amount ?: "null"}")
TangemLogger.d("${coin.id} balance is ${currencyStatus.value.amount ?: "null"}")
if (isFromCurrency) {
dataState = dataState.copy(

View file

@ -20,6 +20,7 @@ dependencies {
implementation(projects.core.error)
implementation(projects.core.navigation)
implementation(projects.core.ui)
implementation(projects.core.utils)
/** Common */
implementation(projects.common.ui)
@ -60,5 +61,4 @@ dependencies {
/** Other */
implementation(deps.kotlin.immutable.collections)
implementation(deps.timber)
}

Some files were not shown because too many files have changed in this diff Show more