diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a2c8978746..5379cdff1d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -369,9 +369,7 @@ dependencies { implementation(deps.googlePlay.services) implementation(deps.googlePlay.advertising) coreLibraryDesugaring(deps.desugar) - implementation(deps.timber) implementation(deps.kermit) - implementation(deps.reKotlin) implementation(deps.zxing.qrCore) implementation(deps.coil) implementation(deps.coil.gif) @@ -390,6 +388,7 @@ dependencies { implementation(deps.viewBindingDelegate) implementation(deps.armadillo) implementation(deps.kotlin.serialization) + implementation(deps.reKotlin) implementation(deps.reownCore) implementation(deps.reownWeb3) implementation(deps.prettyLogger) diff --git a/app/src/androidTest/kotlin/com/tangem/common/ApplicationInjectionExecutionRule.kt b/app/src/androidTest/kotlin/com/tangem/common/ApplicationInjectionExecutionRule.kt index 0301a65b80..fbf86435f4 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/ApplicationInjectionExecutionRule.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/ApplicationInjectionExecutionRule.kt @@ -8,7 +8,7 @@ import dagger.hilt.android.testing.OnComponentReadyRunner import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.lang.reflect.Field class ApplicationInjectionExecutionRule( @@ -46,7 +46,7 @@ class ApplicationInjectionExecutionRule( try { originalVersionValues = FeatureToggles.entries.associateWith { it.version } } catch (e: Exception) { - Timber.e("Failed to save original toggles values: ${e.message}") + TangemLogger.e("Failed to save original toggles values: ${e.message}") } } @@ -60,9 +60,10 @@ class ApplicationInjectionExecutionRule( versionField.set(toggle, newVersion) } - Timber.i("FeatureToggles.values updated: $toggleStates") + TangemLogger.i("FeatureToggles.values updated: $toggleStates") + } catch (e: Exception) { - Timber.e("FeatureToggles.values didn't change with error: ${e.message}") + TangemLogger.e("FeatureToggles.values didn't change with error: ${e.message}") } } @@ -75,9 +76,9 @@ class ApplicationInjectionExecutionRule( versionField.set(toggle, originalVersion) } - Timber.i("FeatureToggles.values restored") + TangemLogger.i("FeatureToggles.values restored") } catch (e: Exception) { - Timber.e("FeatureToggles.values didn't restored with error: ${e.message}") + TangemLogger.e("FeatureToggles.values didn't restored with error: ${e.message}") } } diff --git a/app/src/androidTest/kotlin/com/tangem/common/rules/ApiEnvironmentRule.kt b/app/src/androidTest/kotlin/com/tangem/common/rules/ApiEnvironmentRule.kt index a8d1a2c038..098d2f4def 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/rules/ApiEnvironmentRule.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/rules/ApiEnvironmentRule.kt @@ -11,7 +11,7 @@ import kotlinx.coroutines.runBlocking import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * A JUnit rule that sets up the API environment for tests based on annotations or instrumentation arguments. @@ -82,11 +82,11 @@ class ApiEnvironmentRule : TestRule { val environment = ApiEnvironment.valueOf(parts[1]) apiConfigId to environment } catch (e: IllegalArgumentException) { - Timber.w("Invalid config or environment: $configPair") + TangemLogger.w("Invalid config or environment: $configPair") null } } else { - Timber.w("Invalid config format: $configPair. Expected format: 'ConfigId=Environment'") + TangemLogger.w("Invalid config format: $configPair. Expected format: 'ConfigId=Environment'") null } } @@ -94,7 +94,7 @@ class ApiEnvironmentRule : TestRule { DEFAULT_API_CONFIGS.associateWith { ApiEnvironment.MOCK } + parsedConfigs } catch (e: Exception) { - Timber.w("Failed to parse environment configs: $envConfigArg") + TangemLogger.w("Failed to parse environment configs: $envConfigArg") DEFAULT_API_CONFIGS.associateWith { ApiEnvironment.MOCK } } } @@ -115,7 +115,7 @@ class ApiEnvironmentRule : TestRule { runBlocking { targetEnvironments.forEach { (apiConfigId, environment) -> changeEnvironment(apiConfigId.name, environment) - Timber.i("$apiConfigId environment set to: ${environment.name}") + TangemLogger.i("$apiConfigId environment set to: ${environment.name}") } } } diff --git a/app/src/androidTest/kotlin/com/tangem/common/utils/NetworkUtils.kt b/app/src/androidTest/kotlin/com/tangem/common/utils/NetworkUtils.kt index da1573d026..48c2a5cc5a 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/utils/NetworkUtils.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/utils/NetworkUtils.kt @@ -3,7 +3,7 @@ package com.tangem.common.utils import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.util.concurrent.TimeUnit /** @@ -13,7 +13,7 @@ fun getWcUri( network: String = "ethereum", baseUrl: String = "[REDACTED_ENV_URL]" ): String? { - Timber.i("Getting WC URI for network: $network") + TangemLogger.i("Getting WC URI for network: $network") val client = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) // Таймаут подключения @@ -29,31 +29,31 @@ fun getWcUri( return try { client.newCall(request).execute().use { response -> - Timber.i("Response code: ${response.code}") + TangemLogger.i("Response code: ${response.code}") if (response.isSuccessful) { val body = response.body?.string() ?: "" - Timber.i("Response body: $body") + TangemLogger.i("Response body: $body") val jsonObject = JSONObject(body) if (jsonObject.getBoolean("success")) { val wcUri = jsonObject.getString("wcUri") - Timber.i("Got WC URI successfully: $wcUri") + TangemLogger.i("Got WC URI successfully: $wcUri") wcUri } else { - Timber.e("API returned error: ${jsonObject.optString("error", "Unknown")}") + TangemLogger.e("API returned error: ${jsonObject.optString("error", "Unknown")}") null } } else { val errorBody = response.body?.string() ?: "No error body" - Timber.e("Request failed: ${response.code}, body: $errorBody") + TangemLogger.e("Request failed: ${response.code}, body: $errorBody") null } } } catch (e: Exception) { - Timber.e(e, "Error getting WC URI") + TangemLogger.e("Error getting WC URI", e) null } } @@ -61,7 +61,7 @@ fun getWcUri( fun checkServiceHealth( baseUrl: String = "[REDACTED_ENV_URL]" ): String? { - Timber.i("Checking service health") + TangemLogger.i("Checking service health") val client = OkHttpClient() val request = Request.Builder() @@ -71,14 +71,14 @@ fun checkServiceHealth( return try { client.newCall(request).execute().use { response -> - Timber.i("Response code: ${response.code}") + TangemLogger.i("Response code: ${response.code}") if (response.isSuccessful) { val body = response.body?.string() ?: "" - Timber.i("Response body: $body") + TangemLogger.i("Response body: $body") if (body.isEmpty()) { - Timber.e("Response body is empty") + TangemLogger.e("Response body is empty") return null } @@ -86,20 +86,20 @@ fun checkServiceHealth( val status = jsonObject.optString("status", "") if (status.isNotEmpty()) { - Timber.i("Got status successfully: $status") + TangemLogger.i("Got status successfully: $status") status } else { - Timber.e("Status field is missing or empty") + TangemLogger.e("Status field is missing or empty") null } } else { val errorBody = response.body?.string() ?: "No error body" - Timber.e("Request failed: ${response.code}, body: $errorBody") + TangemLogger.e("Request failed: ${response.code}, body: $errorBody") null } } } catch (e: Exception) { - Timber.e(e, "Error checking health") + TangemLogger.e("Error checking health", e) null } } \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/common/utils/WireMockUtils.kt b/app/src/androidTest/kotlin/com/tangem/common/utils/WireMockUtils.kt index 1095a7aa96..0f7a68f9b8 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/utils/WireMockUtils.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/utils/WireMockUtils.kt @@ -4,7 +4,7 @@ import com.tangem.datasource.utils.WireMockRedirectInterceptor import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.io.IOException private const val DEFAULT_WIREMOCK_URL = "[REDACTED_ENV_URL]" @@ -27,8 +27,8 @@ fun setWireMockScenarioState( state: String, baseUrl: String = getWireMockBaseUrl() ): Boolean { - Timber.i("=== WireMock Scenario Set ===") - Timber.i("Setting scenario '$scenarioName' to state: $state") + TangemLogger.i("=== WireMock Scenario Set ===") + TangemLogger.i("Setting scenario '$scenarioName' to state: $state") val client = OkHttpClient() val json = """{"state": "$state"}""" val mediaType = "application/json".toMediaType() @@ -41,14 +41,14 @@ fun setWireMockScenarioState( return try { client.newCall(request).execute().use { response -> val body = response.body?.string() ?: "" - Timber.d("WireMock scenario request URL: ${request.url}") - Timber.d("WireMock scenario request body: $json") - Timber.d("WireMock scenario response: ${response.code} - ${response.message}") - Timber.d("WireMock scenario response body: $body") + TangemLogger.d("WireMock scenario request URL: ${request.url}") + TangemLogger.d("WireMock scenario request body: $json") + TangemLogger.d("WireMock scenario response: ${response.code} - ${response.message}") + TangemLogger.d("WireMock scenario response body: $body") response.isSuccessful } } catch (e: IOException) { - Timber.e(e, "WireMock scenario error") + TangemLogger.e("WireMock scenario error", e) false } } @@ -67,12 +67,12 @@ fun checkWireMockStatus(baseUrl: String = getWireMockBaseUrl()): Boolean { return try { client.newCall(request).execute().use { response -> val body = response.body?.string() ?: "" - Timber.d("WireMock status check: ${response.code}") - Timber.d("Available scenarios: $body") + TangemLogger.d("WireMock status check: ${response.code}") + TangemLogger.d("Available scenarios: $body") response.isSuccessful } } catch (e: IOException) { - Timber.e(e, "WireMock not accessible") + TangemLogger.e("WireMock not accessible", e) false } } @@ -82,12 +82,12 @@ fun checkWireMockStatus(baseUrl: String = getWireMockBaseUrl()): Boolean { * @param baseUrl WireMock base URL (defaults to local override if set, otherwise remote) */ fun resetWireMockScenarios(baseUrl: String = getWireMockBaseUrl()): Boolean { - Timber.i("=== WireMock Scenarios Reset ===") - Timber.i("Base URL: $baseUrl") + TangemLogger.i("=== WireMock Scenarios Reset ===") + TangemLogger.i("Base URL: $baseUrl") val client = OkHttpClient() val url = "$baseUrl/__admin/scenarios/reset" - Timber.i("Request URL: $url") + TangemLogger.i("Request URL: $url") val request = Request.Builder() .url(url) @@ -95,19 +95,19 @@ fun resetWireMockScenarios(baseUrl: String = getWireMockBaseUrl()): Boolean { .build() return try { - Timber.d("Sending reset request...") + TangemLogger.d("Sending reset request...") client.newCall(request).execute().use { response -> - Timber.d("Response code: ${response.code}") - Timber.d("Response message: ${response.message}") + TangemLogger.d("Response code: ${response.code}") + TangemLogger.d("Response message: ${response.message}") val responseBody = response.body?.string() ?: "" - Timber.d("Response body: $responseBody") + TangemLogger.d("Response body: $responseBody") val isSuccessful = response.isSuccessful - Timber.d("Is successful: $isSuccessful") + TangemLogger.d("Is successful: $isSuccessful") isSuccessful } } catch (e: IOException) { - Timber.e(e, "Exception during reset") + TangemLogger.e("Exception during reset", e) false } } @@ -124,7 +124,7 @@ fun resetWireMockScenarioState( initialState: String = "Started", baseUrl: String = getWireMockBaseUrl() ): Boolean { - Timber.i("=== WireMock Scenario Reset ===") - Timber.i("Resetting scenario '$scenarioName' to initial state: $initialState") + TangemLogger.i("=== WireMock Scenario Reset ===") + TangemLogger.i("Resetting scenario '$scenarioName' to initial state: $initialState") return setWireMockScenarioState(scenarioName, initialState, baseUrl) } \ No newline at end of file diff --git a/app/src/google/java/com/tangem/tap/FirebasePushNotificationsTokenProvider.kt b/app/src/google/java/com/tangem/tap/FirebasePushNotificationsTokenProvider.kt index 627e41f2cc..39067a2ac9 100644 --- a/app/src/google/java/com/tangem/tap/FirebasePushNotificationsTokenProvider.kt +++ b/app/src/google/java/com/tangem/tap/FirebasePushNotificationsTokenProvider.kt @@ -1,9 +1,9 @@ package com.tangem.tap import com.google.firebase.messaging.FirebaseMessaging +import com.tangem.utils.logging.TangemLogger import com.tangem.utils.notifications.PushNotificationsTokenProvider import kotlinx.coroutines.tasks.await -import timber.log.Timber import javax.inject.Inject internal class FirebasePushNotificationsTokenProvider @Inject constructor() : PushNotificationsTokenProvider { @@ -11,7 +11,7 @@ internal class FirebasePushNotificationsTokenProvider @Inject constructor() : Pu return try { FirebaseMessaging.getInstance().token.await() } catch (ex: Exception) { - Timber.e(ex) + TangemLogger.e("Error", ex) "" } } diff --git a/app/src/google/java/com/tangem/tap/GoogleReviewManager.kt b/app/src/google/java/com/tangem/tap/GoogleReviewManager.kt index 956e058583..cf4724d3f4 100644 --- a/app/src/google/java/com/tangem/tap/GoogleReviewManager.kt +++ b/app/src/google/java/com/tangem/tap/GoogleReviewManager.kt @@ -5,7 +5,7 @@ import com.google.android.gms.tasks.Task import com.google.android.play.core.review.ReviewInfo import com.google.android.play.core.review.ReviewManagerFactory import com.tangem.core.navigation.review.ReviewManager -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import com.google.android.play.core.review.ReviewManager as GReviewManager /** @@ -26,7 +26,7 @@ internal class GoogleReviewManager : ReviewManager { onDismissClick = onDismissClick, ) } - .addOnFailureListener(Timber::e) + .addOnFailureListener { TangemLogger.e("Error", it) } } } @@ -42,9 +42,9 @@ internal class GoogleReviewManager : ReviewManager { .addOnCompleteListener { resultReviewTask -> if (!resultReviewTask.isSuccessful) onDismissClick() } - .addOnFailureListener(Timber::e) + .addOnFailureListener { TangemLogger.e("Error", it) } } else { - Timber.e(task.exception) + TangemLogger.e("Error", task.exception) } } } \ No newline at end of file diff --git a/app/src/huawei/java/com/tangem/tap/HuaweiPushNotificationsTokenProvider.kt b/app/src/huawei/java/com/tangem/tap/HuaweiPushNotificationsTokenProvider.kt index 03c709cd6c..1136383fb5 100644 --- a/app/src/huawei/java/com/tangem/tap/HuaweiPushNotificationsTokenProvider.kt +++ b/app/src/huawei/java/com/tangem/tap/HuaweiPushNotificationsTokenProvider.kt @@ -11,7 +11,7 @@ import com.tangem.utils.notifications.PushNotificationsTokenProvider import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject internal class HuaweiPushNotificationsTokenProvider @Inject constructor( @@ -25,7 +25,7 @@ internal class HuaweiPushNotificationsTokenProvider @Inject constructor( try { FirebaseMessaging.getInstance().token.await() } catch (ex: Exception) { - Timber.e(ex) + TangemLogger.e("Error", ex) "" } } else { @@ -33,10 +33,10 @@ internal class HuaweiPushNotificationsTokenProvider @Inject constructor( try { val appId = AGConnectOptionsBuilder().build(context).getString(APP_ID_KEY) val token = HmsInstanceId.getInstance(context).getToken(appId, TOKEN_REQUEST_MODE) - Timber.i("Requested token from HuaweiService: $token") + TangemLogger.i("Requested token from HuaweiService: $token") token } catch (e: ApiException) { - Timber.i("Fetching token from HuaweiService failed cause: ${e.message}") + TangemLogger.i("Fetching token from HuaweiService failed cause: ${e.message}") "" } } diff --git a/app/src/huawei/java/com/tangem/tap/HuaweiPushService.kt b/app/src/huawei/java/com/tangem/tap/HuaweiPushService.kt index b7a1de528d..cfd160dab2 100644 --- a/app/src/huawei/java/com/tangem/tap/HuaweiPushService.kt +++ b/app/src/huawei/java/com/tangem/tap/HuaweiPushService.kt @@ -5,7 +5,7 @@ import com.huawei.hms.push.HmsMessageService import com.huawei.hms.push.RemoteMessage import com.tangem.google.GoogleServicesHelper import com.tangem.tap.common.pushes.PushNotificationDelegate -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger class HuaweiPushService : HmsMessageService() { @@ -15,12 +15,12 @@ class HuaweiPushService : HmsMessageService() { override fun onNewToken(token: String?, bundle: Bundle?) { super.onNewToken(token, bundle) - Timber.i("HuaweiPushService: On new token from HuaweiService: $token") + TangemLogger.i("HuaweiPushService: On new token from HuaweiService: $token") } override fun onTokenError(e: Exception?, bundle: Bundle?) { super.onTokenError(e, bundle) - Timber.i("HuaweiPushService: Fetching token from HuaweiService failed cause: ${e?.message}") + TangemLogger.i("HuaweiPushService: Fetching token from HuaweiService failed cause: ${e?.message}") } override fun onMessageReceived(message: RemoteMessage?) { diff --git a/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt b/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt index 30db15d90c..b0e4f21128 100644 --- a/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt +++ b/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt @@ -4,7 +4,7 @@ import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import kotlin.reflect.KClass object ForegroundActivityObserver { @@ -14,7 +14,7 @@ object ForegroundActivityObserver { val foregroundActivity: AppCompatActivity? get() = activities.entries .firstOrNull { entry -> - Timber.i("foregroundActivity: ${entry.key} | ${entry.value.isDestroyed}") + TangemLogger.i("foregroundActivity: ${entry.key} | ${entry.value.isDestroyed}") entry.value.isDestroyed == false } ?.value @@ -27,15 +27,15 @@ object ForegroundActivityObserver { } override fun onActivityResumed(activity: Activity) { - Timber.i("onActivityResumed ${activity::class}") + TangemLogger.i("onActivityResumed ${activity::class}") if (activity is AppCompatActivity) { - Timber.i("onActivityResumed store activity") + TangemLogger.i("onActivityResumed store activity") activities[activity::class] = activity } } override fun onActivityDestroyed(activity: Activity) { - Timber.i("onActivityDestroyed") + TangemLogger.i("onActivityDestroyed") activities.remove(activity::class) } diff --git a/app/src/main/java/com/tangem/tap/LockTimerWorker.kt b/app/src/main/java/com/tangem/tap/LockTimerWorker.kt index 62c9fa652d..40aace40cd 100644 --- a/app/src/main/java/com/tangem/tap/LockTimerWorker.kt +++ b/app/src/main/java/com/tangem/tap/LockTimerWorker.kt @@ -6,9 +6,9 @@ import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedInject -import timber.log.Timber @HiltWorker class LockTimerWorker @AssistedInject constructor( @@ -19,11 +19,11 @@ class LockTimerWorker @AssistedInject constructor( ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { - Timber.i("onStart job") + TangemLogger.i("onStart job") userWalletsListRepository.lockAllWallets().onRight { settingsRepository.setShouldOpenWelcomeScreenOnResume(value = true) } - Timber.i("onStart job complete") + TangemLogger.i("onStart job complete") return Result.success() } diff --git a/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt b/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt index 809f2808bc..35e3e92b9a 100644 --- a/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt +++ b/app/src/main/java/com/tangem/tap/LockUserWalletsTimer.kt @@ -12,11 +12,11 @@ import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.wallets.usecase.ClearAllHotWalletContextualUnlockUseCase import com.tangem.tap.LockTimerWorker.Companion.TAG import com.tangem.tap.common.extensions.dispatchNavigationAction +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import timber.log.Timber import java.util.concurrent.TimeUnit import kotlin.time.Duration @@ -45,7 +45,7 @@ internal class LockUserWalletsTimer( WorkManager.getInstance(context).cancelAllWorkByTag(TAG) coroutineScope.launch { val shouldOpenWelcomeScreenOnResume = settingsRepository.shouldOpenWelcomeScreenOnResume() - Timber.i( + TangemLogger.i( """ Owner resumed |- Need to open welcome screen: $shouldOpenWelcomeScreenOnResume @@ -65,7 +65,7 @@ internal class LockUserWalletsTimer( } override fun onStop(owner: LifecycleOwner) { - Timber.i("Owner stopped") + TangemLogger.i("Owner stopped") delayJob = null startTimerWorker() @@ -73,7 +73,7 @@ internal class LockUserWalletsTimer( fun restart() { if (delayJob == null) return - Timber.i( + TangemLogger.i( """ Timer restart |- Duration millis: ${duration.inWholeMilliseconds} @@ -93,7 +93,7 @@ internal class LockUserWalletsTimer( private fun start(log: Boolean = true) { if (log) { - Timber.i( + TangemLogger.i( """ Timer start |- Duration millis: ${duration.inWholeMilliseconds} diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index ea612e1a2d..dd856fb233 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -63,11 +63,11 @@ import com.tangem.tap.routing.utils.DeepLinkFactory import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler import com.tangem.utils.extensions.uriValidate +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.BuildConfig import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import timber.log.Timber import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlin.time.Duration.Companion.seconds @@ -169,7 +169,7 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder { private val onActivityResultCallbacks = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { - Timber.i("onCreate") + TangemLogger.i("onCreate") // We need to call it before onCreate to prevent unnecessary activity recreation installAppTheme() @@ -306,18 +306,18 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder { override fun onStart() { super.onStart() - Timber.i("onStart") + TangemLogger.i("onStart") dialogManager.onStart(this) } override fun onStop() { dialogManager.onStop() super.onStop() - Timber.i("onStop") + TangemLogger.i("onStop") } override fun onDestroy() { - Timber.i("onDestroy") + TangemLogger.i("onDestroy") // workaround: kill process when activity destroy to avoid state when lock() wallets // and navigation to unlock screen was skipped because system kills activity but not process if (BuildConfig.BUILD_TYPE != MOCKED_BUILD_TYPE) { @@ -416,8 +416,8 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder { private fun sendStakingUnsubmittedHashes() { lifecycleScope.launch { sendUnsubmittedHashesUseCase.invoke() - .onLeft { Timber.e(it.toString()) } - .onRight { Timber.d("Submitting hashes succeeded") } + .onLeft { TangemLogger.e(it.toString()) } + .onRight { TangemLogger.d("Submitting hashes succeeded") } } } diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 5dd5a03d4c..835298b890 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -75,13 +75,13 @@ import com.tangem.tap.common.redux.appReducer import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.redux.DaggerGraphState +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.BuildConfig import dagger.hilt.EntryPoints import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import org.rekotlin.Store -import timber.log.Timber lateinit var store: Store @@ -299,10 +299,10 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. store = createReduxStore() - Timber.i("APP STARTED") + TangemLogger.i("APP STARTED") if (BuildConfig.TESTER_MENU_ENABLED) { - Timber.i(featureTogglesManager.toString()) - Timber.i(excludedBlockchainsManager.toString()) + TangemLogger.i(featureTogglesManager.toString()) + TangemLogger.i(excludedBlockchainsManager.toString()) } initWithConfigDependency(environmentConfig = environmentConfig) diff --git a/app/src/main/java/com/tangem/tap/WindowObscurationObserver.kt b/app/src/main/java/com/tangem/tap/WindowObscurationObserver.kt index 57f5a3fdec..627b631f1c 100644 --- a/app/src/main/java/com/tangem/tap/WindowObscurationObserver.kt +++ b/app/src/main/java/com/tangem/tap/WindowObscurationObserver.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.LifecycleOwner import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.event.TechAnalyticsEvent import com.tangem.core.analytics.models.event.TechAnalyticsEvent.WindowObscured.ObscuredState -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal object WindowObscurationObserver : DefaultLifecycleObserver { @@ -36,7 +36,7 @@ internal object WindowObscurationObserver : DefaultLifecycleObserver { } if (isPartiallyObscured) { - Timber.d("Window is partially obscured") + TangemLogger.d("Window is partially obscured") if (!isWindowPartiallyObscuredAlreadySent) { analyticsEventHandler.send( @@ -50,7 +50,7 @@ internal object WindowObscurationObserver : DefaultLifecycleObserver { val isFullyObscured = event.flags and MotionEvent.FLAG_WINDOW_IS_OBSCURED != 0 if (isFullyObscured) { - Timber.d("Window is partially or fully obscured") + TangemLogger.d("Window is partially or fully obscured") if (!isWindowFullyObscuredAlreadySent) { analyticsEventHandler.send( diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt index 29b584fa05..62505009a4 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsEventsLogger.kt @@ -1,9 +1,9 @@ package com.tangem.tap.common.analytics import com.tangem.common.json.MoshiJsonConverter -import com.tangem.core.analytics.api.ExceptionLogger import com.tangem.core.analytics.api.EventLogger -import timber.log.Timber +import com.tangem.core.analytics.api.ExceptionLogger +import com.tangem.utils.logging.TangemLogger class AnalyticsEventsLogger( private val name: String, @@ -11,11 +11,11 @@ class AnalyticsEventsLogger( ) : EventLogger, ExceptionLogger { override fun logEvent(event: String, params: Map) { - Timber.d(jsonConverter.prettyPrint(PrintEventModel(name, event, params))) + TangemLogger.d(jsonConverter.prettyPrint(PrintEventModel(name, event, params))) } override fun logException(error: Throwable, params: Map) { - Timber.e(error, jsonConverter.prettyPrint(PrintEventModel(name, "error", params))) + TangemLogger.e(jsonConverter.prettyPrint(PrintEventModel(name, "error", params)), error) } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerDeepLinkListener.kt b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerDeepLinkListener.kt index ae2547a4a9..b43b358a5c 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerDeepLinkListener.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerDeepLinkListener.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.analytics.appsflyer import com.appsflyer.deeplink.DeepLinkListener import com.appsflyer.deeplink.DeepLinkResult -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -17,10 +17,10 @@ class AppsFlyerDeepLinkListener @Inject constructor( referralParamsHandler.handle(deepLink = p0.deepLink) } DeepLinkResult.Status.NOT_FOUND -> { - Timber.i("No deep link found") + TangemLogger.i("No deep link found") } DeepLinkResult.Status.ERROR -> { - Timber.e("Deep link error: ${p0.error}") + TangemLogger.e("Deep link error: ${p0.error}") } } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt index a643b0142e..51352ef3ee 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/AppsFlyerReferralParamsHandler.kt @@ -2,13 +2,13 @@ package com.tangem.tap.common.analytics.appsflyer import com.appsflyer.deeplink.DeepLink import com.tangem.datasource.local.appsflyer.AppsFlyerStore -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.wallets.models.AppsFlyerConversionData import com.tangem.feature.referral.domain.SetShouldShowMobileWalletPromoUseCase +import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton import kotlin.contracts.ExperimentalContracts @@ -41,15 +41,15 @@ class AppsFlyerReferralParamsHandler @Inject constructor( private fun handle(deepLinkValue: String?, deepLinkSub1: String?, deepLinkSub2: String?) { if (deepLinkValue != REFERRAL_DEEP_LINK_VALUE) { - Timber.i("Ignoring deep link with value: ${deepLinkValue ?: "null"}") + TangemLogger.i("Ignoring deep link with value: ${deepLinkValue ?: "null"}") return } @Suppress("NullableToStringCall") - Timber.i("refcode=$deepLinkSub1\ncampaign=$deepLinkSub2") + TangemLogger.i("refcode=$deepLinkSub1\ncampaign=$deepLinkSub2") if (!isValidParam(deepLinkSub1)) { - Timber.e("Deeplink conversion data is invalid") + TangemLogger.e("Deeplink conversion data is invalid") return } @@ -69,7 +69,7 @@ class AppsFlyerReferralParamsHandler @Inject constructor( coroutineScope.launch { mutex.withLock { setShouldShowMobileWalletPromoUseCase(true) - .onLeft { Timber.e(it) } + .onLeft { TangemLogger.e("Error", it) } appsFlyerStore.storeIfAbsent( value = AppsFlyerConversionData(refcode = refcode, campaign = campaign), ) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/TangemAFConversionListener.kt b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/TangemAFConversionListener.kt index a051eefeb9..a0391029a5 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/TangemAFConversionListener.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/appsflyer/TangemAFConversionListener.kt @@ -1,7 +1,7 @@ package com.tangem.tap.common.analytics.appsflyer import com.appsflyer.AppsFlyerConversionListener -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -11,7 +11,7 @@ class TangemAFConversionListener @Inject constructor( ) : AppsFlyerConversionListener { override fun onConversionDataSuccess(p0: Map?) { - Timber.i("AppsFlyer conversion data success: ${p0.orEmpty()}") + TangemLogger.i("AppsFlyer conversion data success: ${p0.orEmpty()}") if (p0 == null) return @@ -19,14 +19,14 @@ class TangemAFConversionListener @Inject constructor( } override fun onConversionDataFail(p0: String?) { - Timber.e("AppsFlyer conversion data failure: ${p0.orEmpty()}") + TangemLogger.e("AppsFlyer conversion data failure: ${p0.orEmpty()}") } override fun onAppOpenAttribution(p0: Map?) { - Timber.i("AppsFlyer app open attribution: ${p0.orEmpty()}") + TangemLogger.i("AppsFlyer app open attribution: ${p0.orEmpty()}") } override fun onAttributionFailure(p0: String?) { - Timber.e("AppsFlyer attribution failure: ${p0.orEmpty()}") + TangemLogger.e("AppsFlyer attribution failure: ${p0.orEmpty()}") } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsClient.kt index 2f07e571b1..772c294d3b 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsClient.kt @@ -6,16 +6,16 @@ import com.appsflyer.attribution.AppsFlyerRequestListener import com.tangem.core.analytics.api.EventLogger import com.tangem.core.analytics.api.UserIdHolder import com.tangem.datasource.local.appsflyer.AppsFlyerStore -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.tap.common.analytics.appsflyer.AppsFlyerDeepLinkListener import com.tangem.tap.common.analytics.appsflyer.TangemAFConversionListener import com.tangem.tap.common.analytics.handlers.firebase.UnderscoreAnalyticsEventConverter +import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.launch -import timber.log.Timber interface AppsFlyerAnalyticsClient : EventLogger, UserIdHolder @@ -40,9 +40,9 @@ class AppsFlyerClient @AssistedInject constructor( init(apiKey, tangemAFConversionListener, context) - Timber.i("Starting AppsFlyer SDK") + TangemLogger.i("Starting AppsFlyer SDK") start(context, apiKey, InitializationListener) - Timber.i("AppsFlyer SDK started") + TangemLogger.i("AppsFlyer SDK started") saveUID() } @@ -57,7 +57,7 @@ class AppsFlyerClient @AssistedInject constructor( } override fun logEvent(event: String, params: Map) { - Timber.tag("AppsFlyer").i("Logging event: $event with params: $params") + TangemLogger.withTag("AppsFlyer").i("Logging event: $event with params: $params") appsFlyerLib.logEvent( context, event, @@ -78,21 +78,21 @@ class AppsFlyerClient @AssistedInject constructor( private object InitializationListener : AppsFlyerRequestListener { override fun onSuccess() { - Timber.d("AppsFlyer initialized successfully") + TangemLogger.d("AppsFlyer initialized successfully") } override fun onError(p0: Int, p1: String) { - Timber.e("AppsFlyer initialization error: $p0, $p1") + TangemLogger.e("AppsFlyer initialization error: $p0, $p1") } } private object LogEventListener : AppsFlyerRequestListener { override fun onSuccess() { - Timber.tag("AppsFlyerClient").i("AppsFlyerRequestListener send") + TangemLogger.withTag("AppsFlyerClient").i("AppsFlyerRequestListener send") } override fun onError(p0: Int, p1: String) { - Timber.tag("AppsFlyerClient").e("AppsFlyerRequestListener onError: $p0, $p1") + TangemLogger.withTag("AppsFlyerClient").e("AppsFlyerRequestListener onError: $p0, $p1") } } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsHandler.kt index 40dfd9b37a..611ca30dba 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/appsflyer/AppsFlyerAnalyticsHandler.kt @@ -6,14 +6,14 @@ import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AppsFlyerIncludedEvent import com.tangem.core.analytics.models.AppsFlyerOnlyEvent import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger class AppsFlyerAnalyticsHandler( private val client: AppsFlyerAnalyticsClient, ) : AnalyticsHandler, AnalyticsUserIdHandler { init { - Timber.tag("AppsFlyer").i("AppsFlyer Analytics Handler created") + TangemLogger.withTag("AppsFlyer").i("AppsFlyer Analytics Handler created") } override fun id(): String = ID @@ -21,11 +21,15 @@ class AppsFlyerAnalyticsHandler( override fun send(event: AnalyticsEvent) { when (event) { is AppsFlyerOnlyEvent -> { - Timber.tag("AppsFlyer").i("Sending event to AppsFlyer: ${event.id} with params: ${event.params}") + TangemLogger.withTag( + "AppsFlyer", + ).i("Sending event to AppsFlyer: ${event.id} with params: ${event.params}") client.logEvent(event.id, event.params) } is AppsFlyerIncludedEvent -> { - Timber.tag("AppsFlyer").i("Sending event to AppsFlyer: ${event.id} with params: ${event.params}") + TangemLogger.withTag( + "AppsFlyer", + ).i("Sending event to AppsFlyer: ${event.id} with params: ${event.params}") val replacedEvent = event.appsFlyerReplacedEvent ?: event.event client.logEvent( event = AnalyticsEvent(category = event.category, event = replacedEvent).id, @@ -52,15 +56,15 @@ class AppsFlyerAnalyticsHandler( ) : AnalyticsHandlerBuilder { init { - Timber.tag("AppsFlyer").i("AppsFlyer Analytics Handler Builder created") + TangemLogger.withTag("AppsFlyer").i("AppsFlyer Analytics Handler Builder created") } override fun build(data: AnalyticsHandlerBuilder.Data): AnalyticsHandler = AppsFlyerAnalyticsHandler( client = if (data.logConfig.isAppsflyerLogEnabled) { - Timber.tag("AppsFlyer").i("AppsFlyer log enabled, mock client created") + TangemLogger.withTag("AppsFlyer").i("AppsFlyer log enabled, mock client created") AppsFlyerLogClient(data.jsonConverter) } else { - Timber.tag("AppsFlyer").i("AppsFlyer log disabled, real client created") + TangemLogger.withTag("AppsFlyer").i("AppsFlyer log disabled, real client created") appsFlyerClientFactory.create(apiKey = data.config.appsFlyerApiKey) }, ) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoClient.kt index ddd534e938..098d41abf3 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoClient.kt @@ -1,11 +1,11 @@ package com.tangem.tap.common.analytics.handlers.customerio import android.app.Application +import com.tangem.utils.logging.TangemLogger import io.customer.messagingpush.ModuleMessagingPushFCM import io.customer.sdk.CustomerIO import io.customer.sdk.CustomerIOBuilder import io.customer.sdk.data.model.Region -import timber.log.Timber /** * Real Customer.io SDK client. @@ -32,7 +32,7 @@ internal class CustomerIoClient( .addCustomerIOModule(ModuleMessagingPushFCM()) .build() - Timber.d("CustomerIO SDK initialized") + TangemLogger.d("CustomerIO SDK initialized") } override fun setUserId(userId: String) { diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoLogClient.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoLogClient.kt index 62a36d09f1..6773cce899 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoLogClient.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/customerio/CustomerIoLogClient.kt @@ -1,6 +1,6 @@ package com.tangem.tap.common.analytics.handlers.customerio -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Log client for Customer.io (used in debug mode). @@ -13,11 +13,11 @@ internal class CustomerIoLogClient : CustomerIoAnalyticsClient { override fun setUserId(userId: String) { this.userId = userId - Timber.tag(CustomerIoAnalyticsHandler.ID).d("identify: userId=$userId") + TangemLogger.withTag(CustomerIoAnalyticsHandler.ID).d("identify: userId=$userId") } override fun clearUserId() { - Timber.tag(CustomerIoAnalyticsHandler.ID).d("clearIdentify: previous userId=$userId") + TangemLogger.withTag(CustomerIoAnalyticsHandler.ID).d("clearIdentify: previous userId=$userId") this.userId = null } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt index 5a8a85c072..a7117928b4 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt @@ -3,8 +3,8 @@ package com.tangem.tap.common.analytics.handlers.firebase import com.google.firebase.analytics.ktx.analytics import com.google.firebase.ktx.Firebase import com.tangem.core.analytics.AppInstanceIdProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.suspendCancellableCoroutine -import timber.log.Timber import kotlin.coroutines.resume internal class FirebaseAppInstanceIdProvider : AppInstanceIdProvider { @@ -13,7 +13,7 @@ internal class FirebaseAppInstanceIdProvider : AppInstanceIdProvider { Firebase.analytics.appInstanceId .addOnSuccessListener { continuation.resume(it) } .addOnFailureListener { - Timber.w("Fail to get appInstanceId") + TangemLogger.w("Fail to get appInstanceId") continuation.resume(null) } } @@ -22,7 +22,7 @@ internal class FirebaseAppInstanceIdProvider : AppInstanceIdProvider { return try { Firebase.analytics.appInstanceId.result } catch (e: IllegalStateException) { - Timber.e(e, "getAppInstanceIdSync") + TangemLogger.e("getAppInstanceIdSync", e) null } } diff --git a/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt b/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt index 1c33fe0909..478f23edeb 100644 --- a/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt +++ b/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt @@ -6,7 +6,7 @@ import android.content.ClipDescription.MIMETYPE_TEXT_PLAIN import android.os.Build import android.os.PersistableBundle import com.tangem.core.ui.clipboard.ClipboardManager -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import android.content.ClipboardManager as AndroidClipboardManager internal class DefaultClipboardManager(private val clipboardManager: AndroidClipboardManager) : ClipboardManager { @@ -24,13 +24,13 @@ internal class DefaultClipboardManager(private val clipboardManager: AndroidClip val clip = clipboardManager.primaryClip if (clip == null || clip.itemCount == 0) { - Timber.d("Clipboard is empty") + TangemLogger.d("Clipboard is empty") return default } val clipDescription = clipboardManager.primaryClipDescription if (clipDescription?.hasMimeType(MIMETYPE_TEXT_PLAIN) == false) { - Timber.d("Clipboard doesn't contain text") + TangemLogger.d("Clipboard doesn't contain text") return default } diff --git a/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt b/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt index 8013aa18f1..70d32a7166 100644 --- a/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt +++ b/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt @@ -1,12 +1,12 @@ package com.tangem.tap.common.clipboard import com.tangem.core.ui.clipboard.ClipboardManager -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal object MockClipboardManager : ClipboardManager { override fun setText(text: String, isSensitive: Boolean, label: String) { - Timber.w("Clipboard Manager not available") + TangemLogger.w("Clipboard Manager not available") } override fun getText(default: String?): String? = null diff --git a/app/src/main/java/com/tangem/tap/common/deeplink/DefaultDeeplinkLauncher.kt b/app/src/main/java/com/tangem/tap/common/deeplink/DefaultDeeplinkLauncher.kt index 3c6fa7e0c9..ce74ae1064 100644 --- a/app/src/main/java/com/tangem/tap/common/deeplink/DefaultDeeplinkLauncher.kt +++ b/app/src/main/java/com/tangem/tap/common/deeplink/DefaultDeeplinkLauncher.kt @@ -3,11 +3,11 @@ package com.tangem.tap.common.deeplink import android.content.Context import android.content.Intent import android.net.Uri +import androidx.core.net.toUri import com.tangem.common.routing.DeepLinkScheme import com.tangem.core.navigation.deeplink.DeeplinkLauncher import com.tangem.core.navigation.url.UrlOpener -import androidx.core.net.toUri -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * [DeeplinkLauncher] implementation that launches deep links as intents to the current Activity @@ -26,7 +26,7 @@ internal class DefaultDeeplinkLauncher( -> launchDeepLink(deeplinkUri) DeepLinkScheme.Https.scheme -> launchDeeplinkOrOpenBrowser(deeplinkUri, link) else -> { - Timber.i( + TangemLogger.i( """ No match found for deep link |- Received URI: $deeplinkUri diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index 3aeeb7d9cd..06dd58d367 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -10,8 +10,8 @@ import com.tangem.tap.domain.TapError import com.tangem.tap.domain.getFirstToken import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.delay -import timber.log.Timber /** [REDACTED_AUTHOR] @@ -31,7 +31,7 @@ suspend fun WalletManager.safeUpdate(isDemoCard: Boolean): Result = try Result.Success(wallet) } } catch (exception: Exception) { - Timber.e(exception) + TangemLogger.e("Error", exception) val networkConnectionManager = store.inject(DaggerGraphState::networkConnectionManager) if (!networkConnectionManager.isOnline) { diff --git a/app/src/main/java/com/tangem/tap/common/images/Coil.kt b/app/src/main/java/com/tangem/tap/common/images/Coil.kt index 39b02987d6..083711a2ca 100644 --- a/app/src/main/java/com/tangem/tap/common/images/Coil.kt +++ b/app/src/main/java/com/tangem/tap/common/images/Coil.kt @@ -9,10 +9,10 @@ import coil.decode.ImageDecoderDecoder import coil.decode.SvgDecoder import coil.memory.MemoryCache import coil.request.CachePolicy -import coil.util.Logger import com.tangem.datasource.api.common.createNetworkLoggingInterceptor +import com.tangem.utils.logging.TangemLogger import okhttp3.OkHttpClient -import timber.log.Timber +import coil.util.Logger as CoilLogger private const val COIL_LOG_TAG = "COIL" private const val COIL_MEMORY_CACHE_SIZE = 0.25 @@ -22,7 +22,7 @@ fun createCoilImageLoader(context: Context, logEnabled: Boolean = false): ImageL .apply { if (!logEnabled) return@apply - logger(CoilTimberLogger()) + logger(CoilKermitLogger()) okHttpClient { OkHttpClient.Builder() .addNetworkInterceptor(createNetworkLoggingInterceptor()) @@ -48,14 +48,16 @@ fun createCoilImageLoader(context: Context, logEnabled: Boolean = false): ImageL .build() } -private class CoilTimberLogger : Logger { +private class CoilKermitLogger : CoilLogger { override var level: Int = Log.DEBUG + private val logger = TangemLogger.withTag(COIL_LOG_TAG) override fun log(tag: String, priority: Int, message: String?, throwable: Throwable?) { - with(Timber.tag(COIL_LOG_TAG)) { - if (throwable != null) e(throwable, message) - if (message != null) d(message) + if (throwable != null) { + logger.e(message ?: "", throwable) + } else if (message != null) { + logger.d(message) } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/log/TangemAppLoggerInitializer.kt b/app/src/main/java/com/tangem/tap/common/log/TangemAppLoggerInitializer.kt index 8eaafd7505..0231c5fb23 100644 --- a/app/src/main/java/com/tangem/tap/common/log/TangemAppLoggerInitializer.kt +++ b/app/src/main/java/com/tangem/tap/common/log/TangemAppLoggerInitializer.kt @@ -8,8 +8,8 @@ import co.touchlab.kermit.Logger import co.touchlab.kermit.Severity import com.orhanobut.logger.AndroidLogAdapter import com.tangem.datasource.local.logs.AppLogsStore +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.BuildConfig -import timber.log.Timber import java.util.regex.Pattern import com.orhanobut.logger.Logger as PrettyLogger @@ -30,18 +30,9 @@ class TangemAppLoggerInitializer( PrettyLogger.addLogAdapter(AndroidLogAdapter(TimberFormatStrategy())) } - Timber.plant(tree = createTimberTree()) Logger.setLogWriters(KermitLogWriter(::finalLogOutput)) } - private fun createTimberTree(): Timber.Tree { - return object : Timber.DebugTree() { - override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { - finalLogOutput(priority = priority, tag = tag, message = message, t = t) - } - } - } - private fun finalLogOutput(priority: Int, tag: String?, message: String, t: Throwable?) { if (IS_LOG_ENABLED) { PrettyLogger.log(priority, tag, message, t) @@ -71,6 +62,8 @@ private class KermitLogWriter( KermitLogWriter::class.java.name, BaseLogger::class.java.name, Logger::class.java.name, + TangemLogger::class.java.name, + TangemLogger.TaggedLogger::class.java.name, ) override fun log(severity: Severity, message: String, tag: String, throwable: Throwable?) { @@ -87,7 +80,7 @@ private class KermitLogWriter( tag } else { /** - * like in [Timber.DebugTree.tag] + * like in [Logger.debugTree.tag] */ @Suppress("UnnecessaryLet", "ThrowingExceptionsWithoutMessageOrCause") Throwable().stackTrace @@ -99,7 +92,7 @@ private class KermitLogWriter( } /** - * copy from [Timber.DebugTree.createStackElementTag] + * copy from [Logger.debugTree.createStackElementTag] */ @Suppress("MagicNumber") private fun createStackElementTag(element: StackTraceElement): String? { @@ -120,7 +113,7 @@ private class KermitLogWriter( private const val KERMIT_LOGGER_DEFAULT_TAG = "" /** - * copy from [Timber.DebugTree.Companion] + * copy from [Logger.debugTree.Companion] */ private const val MAX_TAG_LENGTH = 23 private val ANONYMOUS_CLASS = Pattern.compile("(\\$\\d+)+$") diff --git a/app/src/main/java/com/tangem/tap/common/pushes/TangemPushNotificationService.kt b/app/src/main/java/com/tangem/tap/common/pushes/TangemPushNotificationService.kt index 9965c9a2f2..ba6b3ddcfe 100644 --- a/app/src/main/java/com/tangem/tap/common/pushes/TangemPushNotificationService.kt +++ b/app/src/main/java/com/tangem/tap/common/pushes/TangemPushNotificationService.kt @@ -4,9 +4,9 @@ import android.annotation.SuppressLint import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import com.tangem.tap.common.analytics.CustomerIoFeatureToggles +import com.tangem.utils.logging.TangemLogger import dagger.hilt.android.AndroidEntryPoint import io.customer.messagingpush.CustomerIOFirebaseMessagingService -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -22,7 +22,7 @@ internal class TangemPushNotificationService : FirebaseMessagingService() { override fun onNewToken(token: String) { super.onNewToken(token) - Timber.d("New FCM token received: $token") + TangemLogger.d("New FCM token received: $token") if (customerIoFeatureToggles.isFeatureEnabled) { CustomerIOFirebaseMessagingService.onNewToken(applicationContext, token) diff --git a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt index a544190398..7dd3992c54 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt @@ -1,7 +1,7 @@ package com.tangem.tap.common.redux +import com.tangem.utils.logging.TangemLogger import org.rekotlin.Middleware -import timber.log.Timber /** [REDACTED_AUTHOR] @@ -9,7 +9,7 @@ import timber.log.Timber val logMiddleware: Middleware = { _, _ -> { nextDispatch -> { action -> - Timber.i("Dispatch action: ${action::class.java.simpleName}") + TangemLogger.i("Dispatch action: ${action::class.java.simpleName}") nextDispatch(action) } } diff --git a/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt b/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt index e27db731ed..74e7e95205 100644 --- a/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt +++ b/app/src/main/java/com/tangem/tap/common/url/CustomTabsUrlOpener.kt @@ -14,8 +14,8 @@ import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder import com.tangem.tap.common.extensions.getColorCompat import com.tangem.tap.foregroundActivityObserver import com.tangem.tap.withForegroundActivity +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.R -import timber.log.Timber internal class CustomTabsUrlOpener : UrlOpener { @@ -55,7 +55,7 @@ internal class CustomTabsUrlOpener : UrlOpener { customTabsIntent.launchUrl(context, url.toUri()) } }.onFailure { - Timber.e(it) + TangemLogger.e("Error", it) } } diff --git a/app/src/main/java/com/tangem/tap/core/DefaultAppCoroutineScope.kt b/app/src/main/java/com/tangem/tap/core/DefaultAppCoroutineScope.kt index 190af9d4eb..242483b1b1 100644 --- a/app/src/main/java/com/tangem/tap/core/DefaultAppCoroutineScope.kt +++ b/app/src/main/java/com/tangem/tap/core/DefaultAppCoroutineScope.kt @@ -1,10 +1,10 @@ package com.tangem.tap.core -import co.touchlab.kermit.Logger import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.SupervisorJob @@ -28,7 +28,7 @@ internal class DefaultAppCoroutineScope @Inject constructor( } private fun logError(throwable: Throwable, coroutineName: String) { - Logger.withTag(tag).e( + TangemLogger.withTag(tag).e( messageString = "CoroutineName $coroutineName", throwable = throwable, ) diff --git a/app/src/main/java/com/tangem/tap/core/navigation/email/AndroidEmailSender.kt b/app/src/main/java/com/tangem/tap/core/navigation/email/AndroidEmailSender.kt index 12e69c91b8..e0aea6d0e0 100644 --- a/app/src/main/java/com/tangem/tap/core/navigation/email/AndroidEmailSender.kt +++ b/app/src/main/java/com/tangem/tap/core/navigation/email/AndroidEmailSender.kt @@ -8,7 +8,7 @@ import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import com.tangem.core.navigation.email.EmailSender import com.tangem.tap.foregroundActivityObserver -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Implementation of email sender for Android @@ -21,7 +21,7 @@ internal class AndroidEmailSender : EmailSender { val activity = foregroundActivityObserver.foregroundActivity if (activity == null) { - Timber.e("Foreground activity not found") + TangemLogger.e("Foreground activity not found") return } @@ -50,7 +50,7 @@ internal class AndroidEmailSender : EmailSender { ContextCompat.startActivity(activity, chooserIntent, null) } catch (ex: Exception) { - Timber.e("Failed to send email: $ex") + TangemLogger.e("Failed to send email: $ex") } } diff --git a/app/src/main/java/com/tangem/tap/core/security/DefaultDeviceSecurityInfoProvider.kt b/app/src/main/java/com/tangem/tap/core/security/DefaultDeviceSecurityInfoProvider.kt index 10a4807522..308322f8aa 100644 --- a/app/src/main/java/com/tangem/tap/core/security/DefaultDeviceSecurityInfoProvider.kt +++ b/app/src/main/java/com/tangem/tap/core/security/DefaultDeviceSecurityInfoProvider.kt @@ -2,7 +2,7 @@ package com.tangem.tap.core.security import com.dexprotector.rtc.RtcStatus import com.tangem.security.DeviceSecurityInfoProvider -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class DefaultDeviceSecurityInfoProvider : DeviceSecurityInfoProvider { override val isRooted: Boolean @@ -16,7 +16,7 @@ internal class DefaultDeviceSecurityInfoProvider : DeviceSecurityInfoProvider { return try { RtcStatus.getRtcStatus() } catch (e: Throwable) { - Timber.e(e) + TangemLogger.e("Error", e) null } } diff --git a/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt b/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt index 7bc5ae57c9..fdfcf8789e 100644 --- a/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt +++ b/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt @@ -2,7 +2,7 @@ package com.tangem.tap.data import com.tangem.blockchain.common.logging.BlockchainSDKLogger import com.tangem.datasource.local.logs.AppLogsStore -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * BlockchainSDK logger implementation @@ -16,7 +16,7 @@ internal class TangemBlockchainSDKLogger( ) : BlockchainSDKLogger { override fun log(level: BlockchainSDKLogger.Level, message: String) { - Timber.d(message) + TangemLogger.d(message) appLogsStore.saveLogMessage(tag = "BlockchainSDK_${level.name}", message) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt index 27f82f9b3b..f9b56d8d88 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt @@ -19,10 +19,10 @@ import com.tangem.datasource.local.visa.VisaOtpData import com.tangem.datasource.local.visa.hasSavedOTP import com.tangem.domain.card.common.visa.VisaWalletPublicKeyUtility import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.domain.visa.error.VisaActivationError import com.tangem.domain.visa.model.* import com.tangem.domain.visa.repository.VisaActivationRepository -import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.operations.GenerateOTPCommand import com.tangem.operations.attestation.AttestCardKeyCommand import com.tangem.operations.pins.SetUserCodeCommand @@ -31,11 +31,11 @@ import com.tangem.operations.sign.SignHashResponse import com.tangem.operations.wallet.CreateWalletTask import com.tangem.sdk.api.visa.VisaCardActivationResponse import com.tangem.sdk.api.visa.VisaCardActivationTaskMode +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.* -import timber.log.Timber import kotlin.coroutines.resume import kotlin.time.measureTimedValue @@ -94,7 +94,7 @@ class VisaCardActivationTask @AssistedInject constructor( } } } - Timber.i("VisaCardActivationTask all time: ${timedResult.duration}") + TangemLogger.i("VisaCardActivationTask all time: ${timedResult.duration}") return timedResult.value } @@ -109,11 +109,11 @@ class VisaCardActivationTask @AssistedInject constructor( } } } - Timber.i("AttestCardKeyCommand time: ${timedResult.duration}") + TangemLogger.i("AttestCardKeyCommand time: ${timedResult.duration}") return when (val result = timedResult.value) { is CompletionResult.Success -> { - Timber.i("AttestCardKeyCommand success") + TangemLogger.i("AttestCardKeyCommand success") processSignedAuthorizationChallenge( signedChallenge = challengeToSign.toSignedChallenge( signedChallenge = result.data.cardSignature.toHexString(), @@ -122,7 +122,7 @@ class VisaCardActivationTask @AssistedInject constructor( ) } is CompletionResult.Failure -> { - Timber.e("AttestCardKeyCommand failure ${result.error}") + TangemLogger.e("AttestCardKeyCommand failure ${result.error}") CompletionResult.Failure(result.error) } } @@ -206,15 +206,15 @@ class VisaCardActivationTask @AssistedInject constructor( } } - Timber.i("CreateWalletTask time: ${timedResult.duration}") + TangemLogger.i("CreateWalletTask time: ${timedResult.duration}") when (val result = timedResult.value) { is CompletionResult.Success -> { - Timber.i("CreateWalletTask success") + TangemLogger.i("CreateWalletTask success") CompletionResult.Success(Unit) } is CompletionResult.Failure -> { - Timber.e("CreateWalletTask failure ${result.error}") + TangemLogger.e("CreateWalletTask failure ${result.error}") CompletionResult.Failure(result.error) } } @@ -237,11 +237,11 @@ class VisaCardActivationTask @AssistedInject constructor( } } - Timber.i("GenerateOTPCommand time: ${timedResult.duration}") + TangemLogger.i("GenerateOTPCommand time: ${timedResult.duration}") return when (val result = timedResult.value) { is CompletionResult.Success -> { - Timber.i("GenerateOTPCommand success") + TangemLogger.i("GenerateOTPCommand success") otpStorage.saveOTP( cardId = cardId, data = VisaOtpData(result.data.rootOTP, result.data.rootOTPCounter), @@ -249,7 +249,7 @@ class VisaCardActivationTask @AssistedInject constructor( CompletionResult.Success(Unit) } is CompletionResult.Failure -> { - Timber.e("GenerateOTPCommand failure ${result.error}") + TangemLogger.e("GenerateOTPCommand failure ${result.error}") CompletionResult.Failure(result.error) } } @@ -278,11 +278,11 @@ class VisaCardActivationTask @AssistedInject constructor( } } - Timber.i("SignHashCommand time: ${timedResult.duration}") + TangemLogger.i("SignHashCommand time: ${timedResult.duration}") return when (val result = timedResult.value) { is CompletionResult.Success -> { - Timber.i("SignHashCommand success") + TangemLogger.i("SignHashCommand success") handleSignedData( dataToSign = dataToSign, response = result.data, @@ -290,7 +290,7 @@ class VisaCardActivationTask @AssistedInject constructor( ) } is CompletionResult.Failure -> { - Timber.e("SignHashCommand failure ${result.error}") + TangemLogger.e("SignHashCommand failure ${result.error}") CompletionResult.Failure(result.error) } } @@ -336,7 +336,7 @@ class VisaCardActivationTask @AssistedInject constructor( return CompletionResult.Success(Unit) } - Timber.i("Setting access code") + TangemLogger.i("Setting access code") val task = SetUserCodeCommand.changeAccessCode(mode.accessCode) @@ -348,15 +348,15 @@ class VisaCardActivationTask @AssistedInject constructor( } } - Timber.i("SetUserCodeCommand time: ${timedResult.duration}") + TangemLogger.i("SetUserCodeCommand time: ${timedResult.duration}") return when (val result = timedResult.value) { is CompletionResult.Success -> { - Timber.i("SetUserCodeCommand success") + TangemLogger.i("SetUserCodeCommand success") CompletionResult.Success(Unit) } is CompletionResult.Failure -> { - Timber.i("SetUserCodeCommand failure ${result.error}") + TangemLogger.i("SetUserCodeCommand failure ${result.error}") CompletionResult.Failure(result.error) } } diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/DefaultUserWalletsSensitiveInformationRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/DefaultUserWalletsSensitiveInformationRepository.kt index f4a2c32083..1eb51a4e27 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/DefaultUserWalletsSensitiveInformationRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/DefaultUserWalletsSensitiveInformationRepository.kt @@ -14,9 +14,9 @@ import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey import com.tangem.tap.domain.userWalletList.model.UserWalletSensitiveInformation import com.tangem.tap.domain.userWalletList.repository.UserWalletsSensitiveInformationRepository import com.tangem.tap.domain.userWalletList.utils.sensitiveInformation +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import timber.log.Timber import javax.crypto.spec.SecretKeySpec internal class DefaultUserWalletsSensitiveInformationRepository( @@ -123,7 +123,7 @@ internal class DefaultUserWalletsSensitiveInformationRepository( this@decodeToSensitiveInformation.decodeToString(throwOnInvalidSequence = true), ) } catch (e: CharacterCodingException) { - Timber.e(e, "Unable to decode sensitive information") + TangemLogger.e("Unable to decode sensitive information", e) null } diff --git a/app/src/main/java/com/tangem/tap/domain/visa/VisaCardScanHandler.kt b/app/src/main/java/com/tangem/tap/domain/visa/VisaCardScanHandler.kt index 2e96094cf1..ce85e49171 100644 --- a/app/src/main/java/com/tangem/tap/domain/visa/VisaCardScanHandler.kt +++ b/app/src/main/java/com/tangem/tap/domain/visa/VisaCardScanHandler.kt @@ -10,19 +10,18 @@ import com.tangem.common.extensions.toHexString import com.tangem.core.error.ext.tangemError import com.tangem.datasource.local.visa.VisaAuthTokenStorage import com.tangem.domain.card.common.visa.VisaWalletPublicKeyUtility -import com.tangem.domain.visa.model.VisaCardActivationStatus +import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.domain.visa.error.VisaActivationError import com.tangem.domain.visa.error.VisaApiError import com.tangem.domain.visa.error.VisaCardScanError import com.tangem.domain.visa.model.* import com.tangem.domain.visa.repository.VisaActivationRepository -import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.operations.attestation.AttestCardKeyCommand import com.tangem.operations.attestation.AttestCardKeyResponse import com.tangem.operations.attestation.AttestWalletKeyResponse import com.tangem.operations.attestation.AttestWalletKeyTask +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.suspendCancellableCoroutine -import timber.log.Timber import javax.inject.Inject import kotlin.coroutines.resume @@ -38,10 +37,10 @@ internal class VisaCardScanHandler @Inject constructor( ) suspend fun handleVisaCardScan(session: CardSession): CompletionResult { - Timber.i("Attempting to handle Visa card scan") + TangemLogger.i("Attempting to handle Visa card scan") val card = session.environment.card ?: run { - Timber.e("Card is null") + TangemLogger.e("Card is null") return CompletionResult.Failure(TangemSdkError.MissingPreflightRead()) } @@ -68,12 +67,12 @@ internal class VisaCardScanHandler @Inject constructor( } private suspend fun SessionContext.handleWalletAuthorization(): CompletionResult { - Timber.i("Started handling authorization using Visa wallet") + TangemLogger.i("Started handling authorization using Visa wallet") val card = session.environment.card ?: return CompletionResult.Failure(TangemSdkError.MissingPreflightRead()) val wallet = card.wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 } ?: run { - Timber.e("Failed to find extended public key while handling wallet authorization") + TangemLogger.e("Failed to find extended public key while handling wallet authorization") return CompletionResult.Failure(VisaCardScanError.FailedToFindWallet.tangemError) } @@ -82,14 +81,14 @@ internal class VisaCardScanHandler @Inject constructor( return CompletionResult.Failure(it.tangemError) } - Timber.i("Requesting challenge for wallet authorization") + TangemLogger.i("Requesting challenge for wallet authorization") val challengeResponse = visaAuthRemoteDataSource.getCardWalletAuthChallenge( cardId = card.cardId, // This is the wallet public key, not the address and it's alright, as the API expects it in this format cardWalletAddress = wallet.publicKey.toHexString(), ).getOrElse { error -> - Timber.i("Failed to get Access token for Wallet public key authorization") + TangemLogger.i("Failed to get Access token for Wallet public key authorization") return CompletionResult.Failure(error.tangemError) } @@ -103,7 +102,7 @@ internal class VisaCardScanHandler @Inject constructor( val signature = signChallengeResult.data.walletSignature val salt = signChallengeResult.data.salt - Timber.i("Challenge signed with Wallet public key") + TangemLogger.i("Challenge signed with Wallet public key") handleWalletAuthorizationTokens( cardWalletAddress = walletAddress.value, signedChallenge = challengeResponse.toSignedChallenge( @@ -113,7 +112,9 @@ internal class VisaCardScanHandler @Inject constructor( ) } is CompletionResult.Failure -> { - Timber.e("Error during Wallet authorization process. Tangem Sdk Error: ${signChallengeResult.error}") + TangemLogger.e( + "Error during Wallet authorization process. Tangem Sdk Error: ${signChallengeResult.error}", + ) CompletionResult.Failure(signChallengeResult.error) } } @@ -125,19 +126,19 @@ internal class VisaCardScanHandler @Inject constructor( ): CompletionResult { val authorizationTokensResponse = visaAuthRemoteDataSource.getAccessTokens(signedChallenge = signedChallenge) .getOrElse { error -> - Timber.i("Failed to get Access token for Wallet public key authorization.") + TangemLogger.i("Failed to get Access token for Wallet public key authorization.") return if ( error is VisaApiError.ProductInstanceIsNotActivated || error is VisaApiError.ProductInstanceNotFoundActivationRequired ) { - Timber.i("Proceeding with card authorization.") + TangemLogger.i("Proceeding with card authorization.") handleCardAuthorization(cardWalletAddress = cardWalletAddress) } else { CompletionResult.Failure(error.tangemError) } } - Timber.i("Authorized using Wallet public key successfully") + TangemLogger.i("Authorized using Wallet public key successfully") return CompletionResult.Success(VisaCardActivationStatus.Activated(authorizationTokensResponse)) } @@ -148,27 +149,27 @@ internal class VisaCardScanHandler @Inject constructor( ): CompletionResult { val card = session.environment.card ?: return CompletionResult.Failure(TangemSdkError.MissingPreflightRead()) - Timber.i("Requesting authorization challenge to sign") + TangemLogger.i("Requesting authorization challenge to sign") val challengeResponse = visaAuthRemoteDataSource.getCardAuthChallenge( cardId = card.cardId, cardPublicKey = card.cardPublicKey.toHexString(), ).getOrElse { error -> - Timber.e("Failed to get challenge for Card authorization. Plain error: ${error.errorCode}") + TangemLogger.e("Failed to get challenge for Card authorization. Plain error: ${error.errorCode}") return CompletionResult.Failure(error.tangemError) } - Timber.i("Received challenge to sign: ${challengeResponse.challenge}") + TangemLogger.i("Received challenge to sign: ${challengeResponse.challenge}") val signChallengeResult = signChallengeWithCard(challenge = challengeResponse.challenge) val attestCardKeyResponse = when (signChallengeResult) { is CompletionResult.Success -> { - Timber.i("Challenged signed.") + TangemLogger.i("Challenged signed.") signChallengeResult.data } is CompletionResult.Failure -> { - Timber.e( + TangemLogger.e( "Failed to sign challenge with Card public key. Tangem Sdk Error: ${signChallengeResult.error}", ) return CompletionResult.Failure(signChallengeResult.error) @@ -181,7 +182,7 @@ internal class VisaCardScanHandler @Inject constructor( salt = attestCardKeyResponse.salt.toHexString(), ), ).getOrElse { error -> - Timber.e("Failed to sign challenge with Card public key. Plain error: ${error.errorCode}") + TangemLogger.e("Failed to sign challenge with Card public key. Plain error: ${error.errorCode}") return CompletionResult.Failure(error.tangemError) } @@ -191,7 +192,7 @@ internal class VisaCardScanHandler @Inject constructor( ) val activationRemoteState = visaActivationRepository.getActivationRemoteState().getOrElse { error -> - Timber.e("Failed to sign challenge with Card public key. Plain error: ${error.errorCode}") + TangemLogger.e("Failed to sign challenge with Card public key. Plain error: ${error.errorCode}") return CompletionResult.Failure(error.tangemError) } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 6ecd467e40..724134783f 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -20,6 +20,7 @@ import com.tangem.tap.store import com.tangem.tap.tangemSdkManager import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.saveIn +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.distinctUntilChanged @@ -29,7 +30,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware -import timber.log.Timber @Suppress("MemberNameEqualsClassName") class DetailsMiddleware { @@ -228,7 +228,7 @@ class DetailsMiddleware { ) } .doOnFailure { error -> - Timber.e(error, "Unable to delete saved access codes") + TangemLogger.e("Unable to delete saved access codes", error) } } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt index 22e94ae7d3..b395cc0bf5 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt @@ -36,11 +36,11 @@ import com.tangem.tap.features.details.ui.common.utils.* import com.tangem.tap.store import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.addIf +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.R import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList") @@ -244,7 +244,7 @@ internal class CardSettingsModel @Inject constructor( when (val result = tangemSdkManager.setAccessCode(scanResponse.card.cardId)) { is CompletionResult.Success -> Analytics.send(Settings.CardSettings.UserCodeChanged()) is CompletionResult.Failure -> { - Timber.e("Failed to change access code: ${result.error}") + TangemLogger.e("Failed to change access code: ${result.error}") } } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/model/ResetCardModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/model/ResetCardModel.kt index 6e124933fc..10ec357e6b 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/model/ResetCardModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/model/ResetCardModel.kt @@ -28,6 +28,7 @@ import com.tangem.tap.features.details.ui.resetcard.api.ResetCardComponent import com.tangem.tap.store import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.DELAY_SDK_DIALOG_CLOSE +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.R import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @@ -35,7 +36,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList") @@ -190,7 +190,7 @@ internal class ResetCardModel @Inject constructor( resetCardUseCase(cardId = primaryCardId, params = currentUserCodeParams).onRight { deleteSavedAccessCodesUseCase(cardId = primaryCardId) val hasUserWallets = deleteWalletUseCase(userWalletId = currentUserWalletId).getOrElse { error -> - Timber.e("Unable to delete user wallet: $error") + TangemLogger.e("Unable to delete user wallet: $error") return@launch } diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt index b8fd319359..be57cd0aa2 100644 --- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt @@ -43,13 +43,13 @@ import com.tangem.tap.network.exchangeServices.SellService import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.routing.configurator.AppRouterConfig import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.BuildConfig import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout -import timber.log.Timber import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -155,7 +155,7 @@ internal class MainViewModel @Inject constructor( private suspend fun fetchUserCountry() { fetchUserCountryUseCase().onLeft { - Timber.e("Unable to fetch the user country code $it") + TangemLogger.e("Unable to fetch the user country code $it") } } @@ -189,8 +189,8 @@ internal class MainViewModel @Inject constructor( private suspend fun fetchStakingOptions() { fetchStakingOptionsUseCase() - .onLeft { Timber.e(it.toString(), "Unable to fetch staking options") } - .onRight { Timber.d("Staking options were fetched successfully") } + .onLeft { TangemLogger.e("Unable to fetch staking options: $it") } + .onRight { TangemLogger.d("Staking options were fetched successfully") } } private fun initializeOffRamp() { @@ -346,7 +346,9 @@ internal class MainViewModel @Inject constructor( val keyboardId = keyboardValidator.getKeyboardId() if (keyboardId != null) { - Timber.d("Keyboard ID: https://play.google.com/store/apps/details?id=${keyboardId.getPackageName()}") + TangemLogger.d( + "Keyboard ID: https://play.google.com/store/apps/details?id=${keyboardId.getPackageName()}", + ) analyticsEventHandler.send( event = TechAnalyticsEvent.KeyboardIdentifier( @@ -356,7 +358,7 @@ internal class MainViewModel @Inject constructor( ), ) } else { - Timber.e("Unable to get keyboard identifier") + TangemLogger.e("Unable to get keyboard identifier") } } } @@ -370,7 +372,7 @@ internal class MainViewModel @Inject constructor( refresh = true, ).fold( ifLeft = { error -> - Timber.e(error) + TangemLogger.e("Error", error) analyticsEventHandler.send( StoriesEvents.Error( type = StoryContentIds.STORY_FIRST_TIME_SWAP.analyticType, @@ -387,7 +389,7 @@ internal class MainViewModel @Inject constructor( ) } } catch (ex: Exception) { - Timber.e(ex) + TangemLogger.e("Error", ex) analyticsEventHandler.send( StoriesEvents.Error( type = StoryContentIds.STORY_FIRST_TIME_SWAP.analyticType, @@ -412,7 +414,7 @@ internal class MainViewModel @Inject constructor( associateAndUpdateWallets(applicationId = applicationId) } } - .onLeft(Timber::e) + .onLeft { TangemLogger.e("Error", it) } } private suspend fun associateAndUpdateWallets(applicationId: ApplicationId) { diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index 742e44ec5e..8807a899e6 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -19,9 +19,9 @@ import com.tangem.tap.domain.model.Currency import com.tangem.tap.network.exchangeServices.SellService import com.tangem.tap.network.exchangeServices.SellServiceInitializationStatus import com.tangem.tap.network.exchangeServices.moonpay.models.MoonPayAvailableCurrency +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import timber.log.Timber import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec @@ -42,13 +42,13 @@ class MoonPayService( override suspend fun update() { withIOContext { - Timber.i("Start updating") + TangemLogger.i("Start updating") _initializationStatus.value = lceLoading() performRequest { val userStatus = when (val result = performRequest { api.getUserStatus(apiKey) }) { is Result.Failure -> { - Timber.e(result.error, "Failed to load user status") + TangemLogger.e("Failed to load user status", result.error) _initializationStatus.value = result.error.lceError() return@performRequest } @@ -57,7 +57,7 @@ class MoonPayService( val currencies = when (val result = performRequest { api.getCurrencies(apiKey) }) { is Result.Failure -> { - Timber.e(result.error, "Failed to load currencies") + TangemLogger.e("Failed to load currencies", result.error) _initializationStatus.value = result.error.lceError() return@performRequest } @@ -77,7 +77,7 @@ class MoonPayService( ) } - Timber.i("Successfully updated") + TangemLogger.i("Successfully updated") _initializationStatus.value = lceContent() status = MoonPayStatus(currenciesToSell, userStatus, currencies) } diff --git a/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt b/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt index ad66a52dce..d9cd7759f2 100644 --- a/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt +++ b/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt @@ -7,10 +7,10 @@ import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.core.decompose.navigation.Router import com.tangem.tap.routing.configurator.AppRouterConfig import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import timber.log.Timber import kotlin.reflect.KClass internal class ProxyAppRouter( @@ -51,7 +51,7 @@ internal class ProxyAppRouter( runCatching { innerRouter.replaceAll(*routes, onComplete = onComplete) }.getOrElse { - Timber.e(it) + TangemLogger.e("Error", it) } } } @@ -76,12 +76,12 @@ internal class ProxyAppRouter( private fun safeNavigate(onComplete: (isSuccess: Boolean) -> Unit, message: String, block: () -> Unit) { routerScope.launch(dispatchers.mainImmediate) { - Timber.i(message) + TangemLogger.i(message) try { block() } catch (e: Throwable) { - Timber.e(e) + TangemLogger.e("Error", e) onComplete(false) } } @@ -90,7 +90,7 @@ internal class ProxyAppRouter( override fun defaultCompletionHandler(isSuccess: Boolean, errorMessage: String) { if (!isSuccess) { analyticsExceptionHandler.sendException(ExceptionAnalyticsEvent(RuntimeException(errorMessage))) - Timber.w(errorMessage) + TangemLogger.w(errorMessage) with(receiver = config.snackbarHandler ?: return) { showSnackbar( diff --git a/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt b/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt index 301a49d9ba..a4cdba0883 100644 --- a/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt +++ b/app/src/main/java/com/tangem/tap/routing/component/impl/DefaultRoutingComponent.kt @@ -45,11 +45,11 @@ import com.tangem.tap.routing.configurator.AppRouterConfig import com.tangem.tap.routing.utils.ChildFactory import com.tangem.tap.routing.utils.DeepLinkFactory import com.tangem.tap.store +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.launch -import timber.log.Timber @Suppress("LongParameterList") internal class DefaultRoutingComponent @AssistedInject constructor( @@ -101,7 +101,7 @@ internal class DefaultRoutingComponent @AssistedInject constructor( try { childFactory.createChild(route, childByContext(childContext)) } catch (e: Exception) { - Timber.e(e, "App Router Failed") + TangemLogger.e("App Router Failed", e) analyticsExceptionHandler.sendException( ExceptionAnalyticsEvent(exception = e, params = mapOf("Category" to "App Routing")), ) diff --git a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt index bf888af247..fb1acbcd80 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt @@ -23,6 +23,7 @@ import com.tangem.features.walletconnect.components.deeplink.WalletConnectDeepLi import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.saveIn import com.tangem.utils.extensions.uriValidate +import com.tangem.utils.logging.TangemLogger import dagger.hilt.android.scopes.ActivityScoped import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,7 +31,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.transformLatest -import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList") @@ -62,7 +62,7 @@ internal class DeepLinkFactory @Inject constructor( fun handleDeeplink(deeplinkUri: Uri, coroutineScope: CoroutineScope, isFromOnNewIntent: Boolean) { lastDeepLink = deeplinkUri - Timber.i( + TangemLogger.i( """ Received deep link intent |- Received URI: $deeplinkUri @@ -108,7 +108,7 @@ internal class DeepLinkFactory @Inject constructor( DeepLinkScheme.Tangem.scheme -> handleTangemDeepLinks(deeplinkUri, coroutineScope, isFromOnNewIntent) DeepLinkScheme.WalletConnect.scheme -> walletConnectDeepLink.create(deeplinkUri) else -> { - Timber.i( + TangemLogger.i( """ No match found for deep link |- Received URI: $deeplinkUri @@ -157,7 +157,7 @@ internal class DeepLinkFactory @Inject constructor( DeepLinkRoute.Promo.host -> promoDeepLink.create(coroutineScope, queryParams) DeepLinkRoute.OnboardVisa.host -> onboardVisaDeepLink.create(deeplinkUri) else -> { - Timber.i( + TangemLogger.i( """ No match found for deep link |- Received URI: $deeplinkUri diff --git a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt index 1692f38f75..0cb5e4db8f 100644 --- a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt +++ b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt @@ -29,7 +29,6 @@ import kotlinx.coroutines.test.* import org.junit.After import org.junit.Before import org.junit.Test -import timber.log.Timber @OptIn(ExperimentalCoroutinesApi::class) class DeepLinkFactoryTest { @@ -126,7 +125,6 @@ class DeepLinkFactoryTest { every { mockedUri.port } returns 443 // Default HTTPS port every { mockedUri.fragment } returns null // No fragment in this URI - Timber.uprootAll() // Disable Timber logging for tests } @OptIn(ExperimentalCoroutinesApi::class) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 30cd9f7258..0e396106b3 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -25,7 +25,6 @@ dependencies { implementation(deps.firebase.messaging) // end - implementation(deps.timber) implementation(deps.arrow.core) diff --git a/common/routing/build.gradle.kts b/common/routing/build.gradle.kts index b34c827c74..253b68bc9c 100644 --- a/common/routing/build.gradle.kts +++ b/common/routing/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { /* Core */ implementation(projects.core.decompose) implementation(projects.core.configToggles) + implementation(projects.core.utils) /* Domain */ implementation(projects.domain.qrScanning.models) @@ -30,7 +31,6 @@ dependencies { /* Libs - Other */ api(deps.kotlin.serialization) implementation(deps.androidx.core.ktx) - implementation(deps.timber) /* Tests */ testImplementation(deps.test.junit) diff --git a/common/src/main/kotlin/com/tangem/common/uri/ExternalUrlValidator.kt b/common/src/main/kotlin/com/tangem/common/uri/ExternalUrlValidator.kt index 9f3973c29b..49785fb80e 100644 --- a/common/src/main/kotlin/com/tangem/common/uri/ExternalUrlValidator.kt +++ b/common/src/main/kotlin/com/tangem/common/uri/ExternalUrlValidator.kt @@ -1,7 +1,7 @@ package com.tangem.common.uri import com.google.firebase.crashlytics.FirebaseCrashlytics -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.net.URI /** @@ -22,7 +22,7 @@ object ExternalUrlValidator { } catch (e: Exception) { val exception = IllegalStateException("Failed to validate URI: $externalUri", e) - Timber.e(exception) + TangemLogger.e("Error", exception) FirebaseCrashlytics.getInstance().recordException(exception) false diff --git a/core/ab-tests/build.gradle.kts b/core/ab-tests/build.gradle.kts index d47ebe83f1..f557fcda9e 100644 --- a/core/ab-tests/build.gradle.kts +++ b/core/ab-tests/build.gradle.kts @@ -17,7 +17,6 @@ dependencies { kapt(deps.hilt.kapt) /** Other libraries */ - implementation(deps.timber) /** Core modules */ implementation(projects.core.analytics.models) diff --git a/core/ab-tests/src/main/kotlin/com/tangem/core/abtests/manager/impl/AmplitudeABTestsManager.kt b/core/ab-tests/src/main/kotlin/com/tangem/core/abtests/manager/impl/AmplitudeABTestsManager.kt index 703c717a79..7869bdbc27 100644 --- a/core/ab-tests/src/main/kotlin/com/tangem/core/abtests/manager/impl/AmplitudeABTestsManager.kt +++ b/core/ab-tests/src/main/kotlin/com/tangem/core/abtests/manager/impl/AmplitudeABTestsManager.kt @@ -8,8 +8,8 @@ import com.amplitude.experiment.ExperimentUser import com.tangem.core.abtests.manager.ABTestsManager import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.launch -import timber.log.Timber internal class AmplitudeABTestsManager( val application: Application, @@ -21,7 +21,7 @@ internal class AmplitudeABTestsManager( override fun init() { if (::client.isInitialized) { - Timber.w("AB Tests manager already initialized, skipping") + TangemLogger.w("AB Tests manager already initialized, skipping") return } @@ -40,7 +40,7 @@ internal class AmplitudeABTestsManager( val allVariants = client.all() logAllVariants(allVariants) } catch (exception: Exception) { - Timber.e(exception, "Failed to fetch AB test variants") + TangemLogger.e("Failed to fetch AB test variants", exception) } } } @@ -69,23 +69,23 @@ internal class AmplitudeABTestsManager( } private fun logAllVariants(allVariants: Map) { - Timber.d("=".repeat(SEPARATOR_LENGTH)) - Timber.d("AB Tests: Fetched ${allVariants.size} variants") - Timber.d("=".repeat(SEPARATOR_LENGTH)) + TangemLogger.d("=".repeat(SEPARATOR_LENGTH)) + TangemLogger.d("AB Tests: Fetched ${allVariants.size} variants") + TangemLogger.d("=".repeat(SEPARATOR_LENGTH)) if (allVariants.isEmpty()) { - Timber.d("No variants available") + TangemLogger.d("No variants available") } else { allVariants.entries.forEachIndexed { index, (key, variant) -> - Timber.d("[${index + 1}/${allVariants.size}] Key: $key") - Timber.d(" → Value: ${variant.value ?: "null"}") - Timber.d(" → Payload: ${variant.payload ?: "null"}") - Timber.d(" → Key: ${variant.key ?: "null"}") - Timber.d("-".repeat(SEPARATOR_LENGTH)) + TangemLogger.d("[${index + 1}/${allVariants.size}] Key: $key") + TangemLogger.d(" → Value: ${variant.value ?: "null"}") + TangemLogger.d(" → Payload: ${variant.payload ?: "null"}") + TangemLogger.d(" → Key: ${variant.key ?: "null"}") + TangemLogger.d("-".repeat(SEPARATOR_LENGTH)) } } - Timber.d("=".repeat(SEPARATOR_LENGTH)) + TangemLogger.d("=".repeat(SEPARATOR_LENGTH)) } private companion object { diff --git a/core/config-toggles/build.gradle.kts b/core/config-toggles/build.gradle.kts index 4b01f4402d..55ba623cd7 100644 --- a/core/config-toggles/build.gradle.kts +++ b/core/config-toggles/build.gradle.kts @@ -73,7 +73,6 @@ dependencies { /** Other libraries */ implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) /** Core modules */ diff --git a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt index f19eb0ce0b..f5d01447c9 100644 --- a/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt +++ b/core/config-toggles/src/main/kotlin/com/tangem/core/configtoggle/version/Version.kt @@ -1,7 +1,7 @@ package com.tangem.core.configtoggle.version import androidx.annotation.VisibleForTesting -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Presentation of application version (..). @@ -67,7 +67,7 @@ internal class Version private constructor(value: String) : Comparable return try { Version(value) } catch (exception: Exception) { - Timber.e(exception, "Invalid version - %s", value) + TangemLogger.e("Invalid version - $value", exception) return null } } diff --git a/core/datasource/build.gradle.kts b/core/datasource/build.gradle.kts index 353cb3f5ab..34a72ebb46 100644 --- a/core/datasource/build.gradle.kts +++ b/core/datasource/build.gradle.kts @@ -97,7 +97,6 @@ dependencies { implementation(deps.kotlin.datetime) /** Logging */ - implementation(deps.timber) /** Network */ implementation(deps.moshi) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseCallDelegate.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseCallDelegate.kt index 28c7fa4f72..82329e9e3c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseCallDelegate.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseCallDelegate.kt @@ -1,12 +1,12 @@ package com.tangem.datasource.api.common.response import com.tangem.core.analytics.api.AnalyticsErrorHandler +import com.tangem.utils.logging.TangemLogger import okhttp3.Request import okio.Timeout import retrofit2.Call import retrofit2.Callback import retrofit2.Response -import timber.log.Timber internal class ApiResponseCallDelegate( private val wrappedCall: Call, @@ -41,10 +41,10 @@ internal class ApiResponseCallDelegate( val error = try { t.toApiError() } catch (e: ApiResponseError) { - Timber.e(e, "error map toApiError") + TangemLogger.e("error map toApiError", e) e } catch (e: Exception) { - Timber.e(e, "onFailure UnknownException") + TangemLogger.e("onFailure UnknownException", e) ApiResponseError.UnknownException(e) } diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt index ec7f06e90d..e83dc434c0 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt @@ -2,9 +2,9 @@ package com.tangem.datasource.api.common.response import com.tangem.core.analytics.api.AnalyticsErrorHandler import com.tangem.datasource.api.common.response.analytics.ApiErrorEvent +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.TimeoutCancellationException import retrofit2.Response -import timber.log.Timber import java.net.ConnectException import java.net.SocketTimeoutException import java.net.UnknownHostException @@ -31,7 +31,7 @@ internal fun Response.toSafeApiResponse(analyticsErrorHandler: Anal ApiResponseError.HttpException(code, message(), errorBody) } } catch (e: Exception) { - Timber.e(e, "UnknownException occured") + TangemLogger.e("UnknownException occured", e) ApiResponseError.UnknownException(e) } diff --git a/core/datasource/src/main/java/com/tangem/datasource/asset/loader/AssetLoader.kt b/core/datasource/src/main/java/com/tangem/datasource/asset/loader/AssetLoader.kt index 9325df9a70..3a8e5629f9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/asset/loader/AssetLoader.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/asset/loader/AssetLoader.kt @@ -9,8 +9,8 @@ import com.tangem.datasource.asset.reader.AssetReader import com.tangem.datasource.di.NetworkMoshi import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -49,7 +49,10 @@ class AssetLoader @Inject constructor( json = json, ) - Timber.e(IllegalStateException("Parsed config [$fileName] is null")) + TangemLogger.e( + "Error", + IllegalStateException("Parsed config [$fileName] is null"), + ) } parsedConfig @@ -61,51 +64,65 @@ class AssetLoader @Inject constructor( json = json, ) - Timber.e(throwable, "Failed to load config [$fileName] from assets") + TangemLogger.e("Failed to load config [$fileName] from assets", throwable) null }, ) } /** Load list [V] values of asset file [fileName] */ - suspend inline fun loadList(fileName: String): List = runCatching(dispatchers.io) { - val json = assetReader.read(fullFileName = "$fileName.json") + suspend inline fun loadList(fileName: String): List { + val result = runCatching(dispatchers.io) { + val json = assetReader.read(fullFileName = "$fileName.json") - val type = Types.newParameterizedType(List::class.java, V::class.java) - val adapter = moshi.adapter>(type) + val type = Types.newParameterizedType(List::class.java, V::class.java) + val adapter = moshi.adapter>(type) - adapter.fromJson(json) - } - .fold( + adapter.fromJson(json) + } + return result.fold( onSuccess = { parsedConfig -> - if (parsedConfig == null) Timber.e(IllegalStateException("Parsed config [$fileName] is null")) + if (parsedConfig == null) { + TangemLogger.e( + "Error", + IllegalStateException("Parsed config [$fileName] is null"), + ) + } parsedConfig.orEmpty() }, onFailure = { throwable -> - Timber.e(throwable, "Failed to load config [$fileName] from assets") + TangemLogger.e("Failed to load config [$fileName] from assets", throwable) emptyList() }, ) + } /** Load map [String] keys and [V] values of asset file [fileName] */ - suspend inline fun loadMap(fileName: String): Map = runCatching(dispatchers.io) { - val json = assetReader.read(fullFileName = "$fileName.json") + suspend inline fun loadMap(fileName: String): Map { + val result = runCatching(dispatchers.io) { + val json = assetReader.read(fullFileName = "$fileName.json") - val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java) - val adapter = moshi.adapter>(type) + val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java) + val adapter = moshi.adapter>(type) - adapter.fromJson(json) - } - .fold( + adapter.fromJson(json) + } + return result.fold( onSuccess = { parsedConfig -> - if (parsedConfig == null) Timber.e(IllegalStateException("Parsed config [$fileName] is null")) + if (parsedConfig == null) { + TangemLogger.e( + "Error", + IllegalStateException("Parsed config [$fileName] is null"), + ) + } parsedConfig.orEmpty() }, onFailure = { throwable -> - Timber.e(throwable, "Failed to load config [$fileName] from assets") + TangemLogger.e("Failed to load config [$fileName] from assets", throwable) emptyMap() }, ) + } fun sendException(fileName: String, isParsingSuccess: Boolean, json: String?) { analyticsExceptionHandler.sendException( diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/StatusCodeInterceptor.kt b/core/datasource/src/main/java/com/tangem/datasource/di/StatusCodeInterceptor.kt index 4da4c8b17d..6516a08182 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/StatusCodeInterceptor.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/StatusCodeInterceptor.kt @@ -1,10 +1,10 @@ package com.tangem.datasource.di +import com.tangem.utils.logging.TangemLogger import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody -import timber.log.Timber class StatusCodeInterceptor : Interceptor { @@ -12,7 +12,7 @@ class StatusCodeInterceptor : Interceptor { val originalResponse = chain.proceed(chain.request()) if (shouldInterceptResponse(originalResponse)) { - Timber.e("StatusCodeInterceptor INTERCEPTED%s", originalResponse.request.url.toString()) + TangemLogger.e("StatusCodeInterceptor INTERCEPTED${originalResponse.request.url}") val body = getBody().toResponseBody("application/json".toMediaTypeOrNull()) val code = getCode() diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/appsflyer/DefaultAppsFlyerStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/appsflyer/DefaultAppsFlyerStore.kt index bc349dac1c..8226326f81 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/appsflyer/DefaultAppsFlyerStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/appsflyer/DefaultAppsFlyerStore.kt @@ -8,7 +8,7 @@ import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull import com.tangem.datasource.local.preferences.utils.getSyncOrNull import com.tangem.datasource.local.preferences.utils.storeObject import com.tangem.domain.wallets.models.AppsFlyerConversionData -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class DefaultAppsFlyerStore( private val appPreferencesStore: AppPreferencesStore, @@ -18,14 +18,14 @@ internal class DefaultAppsFlyerStore( val dto = appPreferencesStore.getObjectSyncOrNull(CONVERSION_DATA_KEY) ?: return null return ConversionDataConverter.convertBack(value = dto).also { - Timber.i("Getting conversion data from store: $it") + TangemLogger.i("Getting conversion data from store: $it") } } override suspend fun getUID(): String? = appPreferencesStore.getSyncOrNull(UID_KEY) override suspend fun store(value: AppsFlyerConversionData) { - Timber.i("Storing conversion data to store: $value") + TangemLogger.i("Storing conversion data to store: $value") val dto = ConversionDataConverter.convert(value) @@ -33,24 +33,24 @@ internal class DefaultAppsFlyerStore( } override suspend fun storeIfAbsent(value: AppsFlyerConversionData) { - Timber.i("Storing conversion data to store if absent: $value") + TangemLogger.i("Storing conversion data to store if absent: $value") appPreferencesStore.editData { preferences -> val saved = preferences[CONVERSION_DATA_KEY] if (saved == null) { - Timber.i("Conversion data is absent, storing $value") + TangemLogger.i("Conversion data is absent, storing $value") preferences.setObject(CONVERSION_DATA_KEY, ConversionDataConverter.convert(value)) } } } override suspend fun storeUIDIfAbsent(value: String) { - Timber.i("Storing UID to store if absent: $value") + TangemLogger.i("Storing UID to store if absent: $value") appPreferencesStore.editData { preferences -> val saved = preferences[UID_KEY] if (saved == null) { - Timber.i("UID is absent, storing $value") + TangemLogger.i("UID is absent, storing $value") preferences[UID_KEY] = value } } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/logs/AppLogsStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/logs/AppLogsStore.kt index 007f386f0e..65dd45cf46 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/logs/AppLogsStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/logs/AppLogsStore.kt @@ -3,13 +3,14 @@ package com.tangem.datasource.local.logs import android.content.Context import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.* +import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import org.joda.time.DateTime import org.joda.time.format.DateTimeFormatterBuilder -import timber.log.Timber import java.io.* import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream @@ -121,7 +122,7 @@ class AppLogsStore @Inject constructor( private fun createFileIfNotExist() { if (!logFile.exists()) { runCatching { logFile.createNewFile() } - .onFailure(Timber::e) + .onFailure { TangemLogger.e("Error", it) } } } @@ -129,7 +130,7 @@ class AppLogsStore @Inject constructor( scope.launch { mutex.withLock { runCatching { callback() } - .onFailure(Timber::e) + .onFailure { TangemLogger.e("Error", it) } } } } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesDataStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesDataStore.kt index 72835aa183..db9df71d9d 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesDataStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesDataStore.kt @@ -17,7 +17,7 @@ import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_RING_ import com.tangem.datasource.local.preferences.utils.CleanupKeyMigration import com.tangem.datasource.local.preferences.utils.SharedPreferencesKeyMigration import com.tangem.utils.coroutines.AppCoroutineScope -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Application preferences data store 'DataStore'. @@ -49,7 +49,7 @@ internal object PreferencesDataStore { private fun createCorruptionHandler(): ReplaceFileCorruptionHandler { return ReplaceFileCorruptionHandler( produceNewData = { corruptionException -> - Timber.w(corruptionException) + TangemLogger.w("Error", corruptionException) emptyPreferences() }, ) diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/WireMockRedirectInterceptor.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/WireMockRedirectInterceptor.kt index b246a027cb..4451945383 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/WireMockRedirectInterceptor.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/WireMockRedirectInterceptor.kt @@ -1,8 +1,8 @@ package com.tangem.datasource.utils +import com.tangem.utils.logging.TangemLogger import okhttp3.Interceptor import okhttp3.Response -import timber.log.Timber /** * OkHttp interceptor that redirects requests from wiremock.tests-d.com to a local WireMock instance. @@ -17,7 +17,7 @@ class WireMockRedirectInterceptor : Interceptor { if (url.contains(WIREMOCK_REMOTE_URL)) { val newUrl = url.replace(WIREMOCK_REMOTE_URL, override.trimEnd('/')) - Timber.d("WireMockRedirect: $url -> $newUrl") + TangemLogger.d("WireMockRedirect: $url -> $newUrl") val newRequest = request.newBuilder() .url(newUrl) .build() diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/ApiConfigTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/ApiConfigTest.kt index 5650f72e16..1b1693d5a7 100644 --- a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/ApiConfigTest.kt +++ b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/ApiConfigTest.kt @@ -4,13 +4,13 @@ import com.google.common.truth.Truth import com.tangem.datasource.api.common.AuthProvider import com.tangem.datasource.local.config.environment.EnvironmentConfig import com.tangem.utils.ProviderSuspend +import com.tangem.utils.logging.TangemLogger import io.mockk.clearMocks import io.mockk.every import io.mockk.mockk import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance -import timber.log.Timber /** [REDACTED_AUTHOR] @@ -38,7 +38,7 @@ class ApiConfigTest { // Actual val actual = allBaseUrls.all { it.endsWith("/") } - Timber.e(allBaseUrls.joinToString(separator = "\n")) + TangemLogger.e(allBaseUrls.joinToString(separator = "\n")) // Assert Truth.assertThat(actual).isTrue() diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 8dc7d5437d..3020e44ee4 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -11,10 +11,11 @@ android { } dependencies { + implementation(projects.core.utils) + implementation(deps.hilt.android) kapt(deps.hilt.kapt) implementation(deps.material) implementation(deps.reKotlin) - implementation(deps.timber) } \ No newline at end of file diff --git a/core/res/build.gradle.kts b/core/res/build.gradle.kts index c444a12b01..9fe72ddbb5 100644 --- a/core/res/build.gradle.kts +++ b/core/res/build.gradle.kts @@ -12,7 +12,6 @@ dependencies { implementation(projects.core.utils) - implementation(deps.timber) // region Firebase libraries implementation(platform(deps.firebase.bom)) diff --git a/core/res/src/main/java/com/tangem/core/res/Resources.kt b/core/res/src/main/java/com/tangem/core/res/Resources.kt index 3964c5c093..d795fd2f00 100644 --- a/core/res/src/main/java/com/tangem/core/res/Resources.kt +++ b/core/res/src/main/java/com/tangem/core/res/Resources.kt @@ -5,7 +5,7 @@ import androidx.annotation.PluralsRes import androidx.annotation.StringRes import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.utils.SupportedLanguages -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Get a string resource safely or the resource name if an exception is thrown @@ -87,7 +87,7 @@ private fun reportIssue(throwable: Throwable, resources: Resources, id: Int, var "\terror message: ${throwable.message.orEmpty()}\n", ) - Timber.tag("Resources").e(exception) + TangemLogger.withTag("Resources").e("Error", exception) FirebaseCrashlytics.getInstance().recordException(exception) } \ No newline at end of file diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 9be1ed52f9..87b86b8135 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -59,7 +59,6 @@ dependencies { implementation(deps.kotlin.immutable.collections) implementation(deps.zxing.qrCore) api(deps.jodatime) - implementation(deps.timber) implementation(deps.markdown) api(deps.haze) { exclude(module = "activity-compose") diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/fields/visualtransformations/AmountVisualTransformation.kt b/core/ui/src/main/java/com/tangem/core/ui/components/fields/visualtransformations/AmountVisualTransformation.kt index 7dd6ee0767..3349f73c68 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/fields/visualtransformations/AmountVisualTransformation.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/fields/visualtransformations/AmountVisualTransformation.kt @@ -12,7 +12,7 @@ import com.tangem.core.ui.format.bigdecimal.BigDecimalFormatConstants.CURRENCY_S import com.tangem.core.ui.format.bigdecimal.getJavaCurrencyByCode import com.tangem.core.ui.utils.defaultFormat import com.tangem.core.ui.utils.formatWithThousands -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.text.DecimalFormat import java.text.NumberFormat import java.util.Locale @@ -78,7 +78,7 @@ class AmountVisualTransformation( currency = formatterCurrency } val formatter = requireNotNull(numberFormatter as? DecimalFormat) { - Timber.e("NumberFormat is null") + TangemLogger.e("NumberFormat is null") return AnnotatedString(BigDecimalFormatConstants.EMPTY_BALANCE_SIGN) } return buildAnnotatedString { diff --git a/core/utils/build.gradle.kts b/core/utils/build.gradle.kts index 48e632eff4..0d59823349 100644 --- a/core/utils/build.gradle.kts +++ b/core/utils/build.gradle.kts @@ -23,6 +23,10 @@ dependencies { implementation(deps.jodatime) // endregion + // region Logging + implementation(deps.kermit) + // endregion + testImplementation(deps.test.coroutine) testImplementation(deps.test.junit5) testRuntimeOnly(deps.test.junit5.engine) diff --git a/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt index 9b92b1cf18..582d6d4b57 100644 --- a/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt +++ b/core/utils/src/main/java/com/tangem/utils/coroutines/FeatureCoroutineExceptionHandler.kt @@ -1,10 +1,9 @@ package com.tangem.utils.coroutines +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineExceptionHandler import java.io.PrintWriter import java.io.StringWriter -import java.util.logging.Level -import java.util.logging.Logger /** [REDACTED_AUTHOR] @@ -16,11 +15,7 @@ object FeatureCoroutineExceptionHandler { val sw = StringWriter() throwable.printStackTrace(PrintWriter(sw)) val exceptionAsString: String = sw.toString() - // it delegates logging to android Logger, cause cant use timber in java module - Logger.getLogger("CoroutineExceptHandler").log( - Level.INFO, - "CoroutineException: from: $from, exception: $exceptionAsString", - ) + TangemLogger.i("CoroutineException: from: $from, exception: $exceptionAsString") throw throwable } } \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/logging/TangemLogger.kt b/core/utils/src/main/java/com/tangem/utils/logging/TangemLogger.kt new file mode 100644 index 0000000000..5bd1fab06f --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/logging/TangemLogger.kt @@ -0,0 +1,63 @@ +package com.tangem.utils.logging + +import co.touchlab.kermit.Logger + +/** + * Application-level logger that wraps Kermit [Logger] with the same API. + * All modules should use [TangemLogger] instead of importing Kermit directly. + */ +object TangemLogger { + + fun v(messageString: String, throwable: Throwable? = null) { + Logger.v(messageString, throwable) + } + + fun d(messageString: String, throwable: Throwable? = null) { + Logger.d(messageString, throwable) + } + + fun i(messageString: String, throwable: Throwable? = null) { + Logger.i(messageString, throwable) + } + + fun w(messageString: String, throwable: Throwable? = null) { + Logger.w(messageString, throwable) + } + + fun e(messageString: String, throwable: Throwable? = null) { + Logger.e(messageString, throwable) + } + + fun a(messageString: String, throwable: Throwable? = null) { + Logger.a(messageString, throwable) + } + + fun withTag(tag: String): TaggedLogger = TaggedLogger(tag) + + class TaggedLogger internal constructor(private val tag: String) { + + fun v(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).v(messageString, throwable) + } + + fun d(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).d(messageString, throwable) + } + + fun i(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).i(messageString, throwable) + } + + fun w(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).w(messageString, throwable) + } + + fun e(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).e(messageString, throwable) + } + + fun a(messageString: String, throwable: Throwable? = null) { + Logger.withTag(tag).a(messageString, throwable) + } + } +} \ No newline at end of file diff --git a/data/account/build.gradle.kts b/data/account/build.gradle.kts index a07d7fac8a..61664f301e 100644 --- a/data/account/build.gradle.kts +++ b/data/account/build.gradle.kts @@ -63,7 +63,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) // endregion // region Test diff --git a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt index b655bbbdcc..adb70a2b7e 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt @@ -7,9 +7,9 @@ import com.tangem.domain.account.fetcher.SingleAccountListFetcher import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject @@ -30,7 +30,7 @@ internal class DefaultMultiAccountListFetcher @Inject constructor( when (params) { is MultiAccountListFetcher.Params.Set -> { if (params.ids.isEmpty()) { - Timber.d("No wallet ids provided to fetch accounts.") + TangemLogger.d("No wallet ids provided to fetch accounts.") return@either } @@ -52,7 +52,7 @@ internal class DefaultMultiAccountListFetcher @Inject constructor( "Failed to fetch accounts for wallets:\n${errors.entries.joinToString(separator = "\n")}", ) - Timber.e(exception) + TangemLogger.e("Error", exception) raise(exception) } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt index 0e0b010f72..361622055b 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt @@ -16,7 +16,7 @@ import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResp import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.domain.models.wallet.UserWalletId -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -60,7 +60,7 @@ internal class FetchWalletAccountsErrorHandler @Inject constructor( ): FetchResult { val isResponseUpToDate = error.isNetworkError(code = Code.NOT_MODIFIED) if (isResponseUpToDate) { - Timber.e("ETag is up to date, no need to update accounts for wallet: $userWalletId") + TangemLogger.e("ETag is up to date, no need to update accounts for wallet: $userWalletId") val response = requireNotNull(savedAccountsResponse) { "Saved accounts response is null for wallet: $userWalletId" } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt b/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt index ef589cc97d..65e2f11bde 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt @@ -32,10 +32,10 @@ import com.tangem.domain.models.account.AccountName import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.replaceBy +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -import timber.log.Timber /** [REDACTED_AUTHOR] @@ -174,7 +174,7 @@ internal class DefaultAccountsCRUDRepository( val response = getAccountsResponseSync(userWalletId = userWalletId) if (response == null) { - Timber.e("Can't sync tokens. No accounts response found for wallet: $userWalletId") + TangemLogger.e("Can't sync tokens. No accounts response found for wallet: $userWalletId") return } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/tokens/DefaultMainAccountTokensMigration.kt b/data/account/src/main/kotlin/com/tangem/data/account/tokens/DefaultMainAccountTokensMigration.kt index b48fff6967..36343bcd89 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/tokens/DefaultMainAccountTokensMigration.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/tokens/DefaultMainAccountTokensMigration.kt @@ -20,12 +20,12 @@ import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.local.accounts.AccountTokenMigrationStore import com.tangem.datasource.utils.getSyncOrNull import com.tangem.domain.account.tokens.MainAccountTokensMigration -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.wallet.UserWalletId import com.tangem.lib.crypto.derivation.AccountNodeRecognizer +import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.launch -import timber.log.Timber /** * Implementation of [MainAccountTokensMigration] for migrating tokens associated with a main account. @@ -49,7 +49,7 @@ internal class DefaultMainAccountTokensMigration( val response = store.getSyncOrNull() ensureNotNull(response) { val exception = IllegalStateException("No cached accounts response found") - Timber.e(exception) + TangemLogger.e("Error", exception) exception } val mainAccount = findAccount(response = response, derivationIndex = DerivationIndex.Main) @@ -57,7 +57,7 @@ internal class DefaultMainAccountTokensMigration( .filterNot { accountDTO -> accountDTO.derivationIndex.toDerivationIndex().isMain } if (customAccounts.isEmpty()) { - Timber.i("There is only the Main account. Nothing to migrate") + TangemLogger.i("There is only the Main account. Nothing to migrate") return@either response } @@ -66,7 +66,7 @@ internal class DefaultMainAccountTokensMigration( .filter { it.key.value in customAccountIndexes } if (unassignedTokens.isEmpty()) { - Timber.i("No unassigned tokens found for migration") + TangemLogger.i("No unassigned tokens found for migration") return@either response } @@ -103,7 +103,7 @@ internal class DefaultMainAccountTokensMigration( derivationIndex: DerivationIndex, ): Either = either { if (derivationIndex == DerivationIndex.Main) { - Timber.i("Migration skipped: derivation index is Main") + TangemLogger.i("Migration skipped: derivation index is Main") return@either } @@ -113,7 +113,7 @@ internal class DefaultMainAccountTokensMigration( ensureNotNull(response) { val exception = IllegalStateException("No cached accounts response found") - Timber.e(exception) + TangemLogger.e("Error", exception) exception } @@ -123,7 +123,7 @@ internal class DefaultMainAccountTokensMigration( val unassignedTokens = mainAccount.findUnassignedTokens(derivationIndex) if (unassignedTokens.isNullOrEmpty()) { - Timber.i("No unassigned tokens found for migration") + TangemLogger.i("No unassigned tokens found for migration") return@either } @@ -158,7 +158,7 @@ internal class DefaultMainAccountTokensMigration( return ensureNotNull(account) { val exception = IllegalStateException("No account found with derivation index: $derivationIndex") - Timber.e(exception) + TangemLogger.e("Error", exception) exception } } @@ -198,13 +198,13 @@ internal class DefaultMainAccountTokensMigration( return filter { savedToken -> val blockchain = Blockchain.fromNetworkId(networkId = savedToken.networkId) if (blockchain == null) { - Timber.e("Token has unknown networkId: $savedToken") + TangemLogger.e("Token has unknown networkId: $savedToken") return@filter false } val derivationPathValue = savedToken.derivationPath if (derivationPathValue == null) { - Timber.e("Token has no derivation path: $savedToken") + TangemLogger.e("Token has no derivation path: $savedToken") return@filter false } @@ -212,7 +212,7 @@ internal class DefaultMainAccountTokensMigration( val accountNodeValue = accountNodeRecognizer.recognize(derivationPathValue) if (accountNodeValue == null) { - Timber.e("Token has unrecognized derivation path: $savedToken") + TangemLogger.e("Token has unrecognized derivation path: $savedToken") return@filter false } @@ -230,7 +230,7 @@ internal class DefaultMainAccountTokensMigration( eTagsStore.clear(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts) } val exception = IllegalStateException("Failed to push updated tokens after migration") - Timber.e(exception) + TangemLogger.e("Error", exception) raise(exception) }, ) diff --git a/data/analytics/build.gradle.kts b/data/analytics/build.gradle.kts index 279caa054f..1ad08811c1 100644 --- a/data/analytics/build.gradle.kts +++ b/data/analytics/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { /** Project - Analytics */ implementation(projects.core.analytics.models) + implementation(projects.core.utils) /** Project - Data */ implementation(projects.core.datasource) @@ -32,5 +33,4 @@ dependencies { /** Other */ implementation(deps.kotlin.coroutines) - implementation(deps.timber) } \ No newline at end of file diff --git a/data/app-currency/build.gradle.kts b/data/app-currency/build.gradle.kts index ca214f10a9..719c23cae7 100644 --- a/data/app-currency/build.gradle.kts +++ b/data/app-currency/build.gradle.kts @@ -33,5 +33,4 @@ dependencies { /** Other */ implementation(deps.jodatime) implementation(deps.kotlin.coroutines) - implementation(deps.timber) } \ No newline at end of file diff --git a/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/FlipListener.kt b/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/FlipListener.kt index 292a209dc4..7afc9d5717 100644 --- a/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/FlipListener.kt +++ b/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/FlipListener.kt @@ -25,10 +25,10 @@ internal class FlipListener(private val action: () -> Unit) : SensorEventListene isScreenDown = true lastTriggerTime = currentTime // TODO add module logging - // Timber.tag("onSensorChanged").d("screen down") + // Logger.withTag("onSensorChanged").d("screen down") } else if (zAxisValue >= zAxisThreshold) { if (isScreenDown && currentTime - lastTriggerTime <= throttleTimeMs) { - // Timber.tag("onSensorChanged").d("screen up!") + // Logger.withTag("onSensorChanged").d("screen up!") lastTriggerTime = currentTime action.invoke() } diff --git a/data/common/build.gradle.kts b/data/common/build.gradle.kts index cb2baa1194..e8cda44907 100644 --- a/data/common/build.gradle.kts +++ b/data/common/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.jodatime) implementation(deps.kotlin.coroutines) - implementation(deps.timber) /* Test */ testImplementation(projects.common.test) diff --git a/data/common/src/main/kotlin/com/tangem/data/common/api/ApiResponseRaise.kt b/data/common/src/main/kotlin/com/tangem/data/common/api/ApiResponseRaise.kt index 4cdf5d1178..b3b0576829 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/api/ApiResponseRaise.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/api/ApiResponseRaise.kt @@ -4,8 +4,8 @@ import arrow.core.raise.Raise import arrow.core.raise.recover import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.common.response.ApiResponseError +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withTimeoutOrNull -import timber.log.Timber import kotlin.time.Duration /** @@ -67,7 +67,7 @@ suspend inline fun safeApiCall( ): T = recover( block = { call(ApiResponseRaise(raise = this)) }, recover = { error -> - Timber.e(error, "Unable to perform safe API call") + TangemLogger.e("Unable to perform safe API call", error) onError(error) }, ) \ No newline at end of file diff --git a/data/common/src/main/kotlin/com/tangem/data/common/cache/DefaultCacheRegistry.kt b/data/common/src/main/kotlin/com/tangem/data/common/cache/DefaultCacheRegistry.kt index 3ad4dfe46c..ecd52fa3ac 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/cache/DefaultCacheRegistry.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/cache/DefaultCacheRegistry.kt @@ -2,13 +2,13 @@ package com.tangem.data.common.cache import com.tangem.datasource.local.cache.CacheKeysStore import com.tangem.datasource.local.cache.model.CacheKey +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import org.joda.time.Duration import org.joda.time.LocalDateTime -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap internal class DefaultCacheRegistry( @@ -26,17 +26,17 @@ internal class DefaultCacheRegistry( } override suspend fun invalidate(key: String) { - Timber.d("Invalidate the cache key: $key") + TangemLogger.d("Invalidate the cache key: $key") withContext(NonCancellable) { cacheKeysStore.remove(key) } } override suspend fun invalidate(keys: Collection) { - Timber.d("Invalidate cache keys: $keys") + TangemLogger.d("Invalidate cache keys: $keys") withContext(NonCancellable) { cacheKeysStore.remove(keys) } } override suspend fun invalidateAll() { - Timber.d("Invalidate all cache keys") + TangemLogger.d("Invalidate all cache keys") withContext(NonCancellable) { cacheKeysStore.clear() } } @@ -58,7 +58,7 @@ internal class DefaultCacheRegistry( } try { - Timber.d("Invoke the action associated with the cache key: $key") + TangemLogger.d("Invoke the action associated with the cache key: $key") cacheKeysStore.store( key = CacheKey( @@ -70,7 +70,7 @@ internal class DefaultCacheRegistry( block() } catch (e: Throwable) { - Timber.e(e, "The action related to the cache key has failed: $key") + TangemLogger.e("The action related to the cache key has failed: $key", e) invalidate(key) diff --git a/data/common/src/main/kotlin/com/tangem/data/common/cache/etag/DefaultETagsStore.kt b/data/common/src/main/kotlin/com/tangem/data/common/cache/etag/DefaultETagsStore.kt index 3fe201e5de..59a7d62ae3 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/cache/etag/DefaultETagsStore.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/cache/etag/DefaultETagsStore.kt @@ -6,7 +6,7 @@ import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.utils.getSyncOrNull import com.tangem.datasource.local.preferences.utils.store import com.tangem.domain.models.wallet.UserWalletId -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Default implementation of the [ETagsStore] interface for managing ETag values @@ -25,7 +25,7 @@ internal class DefaultETagsStore( override suspend fun store(userWalletId: UserWalletId, key: ETagsStore.Key, value: String) { if (value.isBlank()) { - Timber.e("ETag value is blank, not storing it. userWalletId: $userWalletId, key: $key") + TangemLogger.e("ETag value is blank, not storing it. userWalletId: $userWalletId, key: $key") return } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt index 14bb34f708..4b7cffe26c 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt @@ -11,7 +11,7 @@ import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWallet -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import com.tangem.blockchain.common.Token as SdkToken // FIXME: Make internal @@ -52,7 +52,7 @@ class CryptoCurrencyFactory( accountIndex: DerivationIndex? = null, ): CryptoCurrency.Token? { if (blockchain == Blockchain.Unknown) { - Timber.e("Unable to map the SDK token to the domain token with Unknown blockchain") + TangemLogger.e("Unable to map the SDK token to the domain token with Unknown blockchain") return null } @@ -93,7 +93,7 @@ class CryptoCurrencyFactory( accountIndex = accountIndex, ) } else { - Timber.e("Unable to get blockchain from chainId == $chainId") + TangemLogger.e("Unable to get blockchain from chainId == $chainId") null } } @@ -105,7 +105,7 @@ class CryptoCurrencyFactory( accountIndex: DerivationIndex? = null, ): CryptoCurrency.Coin? { if (blockchain == Blockchain.Unknown) { - Timber.e("Unable to map the SDK token to the domain token with Unknown blockchain") + TangemLogger.e("Unable to map the SDK token to the domain token with Unknown blockchain") return null } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt index 06bc2f1e85..a939336175 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt @@ -11,7 +11,7 @@ import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWallet -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import com.tangem.blockchain.common.Token as SdkToken @@ -46,7 +46,7 @@ class ResponseCryptoCurrenciesFactory @Inject constructor( ): CryptoCurrency? { var blockchain = Blockchain.fromNetworkId(responseToken.networkId) if (blockchain == null || blockchain == Blockchain.Unknown) { - Timber.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}") + TangemLogger.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}") return null } @@ -71,7 +71,7 @@ class ResponseCryptoCurrenciesFactory @Inject constructor( ): CryptoCurrency? { var blockchain = Blockchain.fromNetworkId(responseToken.networkId) if (blockchain == null || blockchain == Blockchain.Unknown) { - Timber.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}") + TangemLogger.e("Unable to find a blockchain with the network ID: ${responseToken.networkId}") return null } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensResponseAccountIdEnricher.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensResponseAccountIdEnricher.kt index 3594f6f1a0..6a21673603 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensResponseAccountIdEnricher.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensResponseAccountIdEnricher.kt @@ -8,7 +8,7 @@ import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.wallet.UserWalletId import com.tangem.lib.crypto.derivation.AccountNodeRecognizer -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Enriches the [UserTokensResponse] with accountId values for tokens @@ -61,20 +61,20 @@ object UserTokensResponseAccountIdEnricher { .groupBy { savedToken -> val derivationPathValue = savedToken.derivationPath if (derivationPathValue == null) { - Timber.e("Token $savedToken has no derivation path") + TangemLogger.e("Token $savedToken has no derivation path") return@groupBy null } val blockchain = Blockchain.fromNetworkId(networkId = savedToken.networkId) if (blockchain == null) { - Timber.e("Token $savedToken has unknown networkId") + TangemLogger.e("Token $savedToken has unknown networkId") return@groupBy null } val accountNodeRecognizer = AccountNodeRecognizer(blockchain) val accountIndex = accountNodeRecognizer.recognize(derivationPathValue) if (accountIndex == null) { - Timber.e("Token $savedToken has unrecognized derivation path") + TangemLogger.e("Token $savedToken has unrecognized derivation path") return@groupBy null } @@ -89,7 +89,7 @@ object UserTokensResponseAccountIdEnricher { if (accountIndex == null) return@mapKeys null val derivationIndex = DerivationIndex.invoke(value = accountIndex.toInt()).getOrElse { - Timber.e("Failed to parse derivation index from account index: $accountIndex") + TangemLogger.e("Failed to parse derivation index from account index: $accountIndex") return@mapKeys null } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt index 5796a28601..a745dfe274 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/UserTokensSaver.kt @@ -12,10 +12,10 @@ import com.tangem.domain.common.wallets.getSyncOrNull import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import com.tangem.utils.retryer.Retryer import com.tangem.utils.retryer.RetryerPool import kotlinx.coroutines.withContext -import timber.log.Timber @Suppress("LongParameterList") class UserTokensSaver( @@ -36,7 +36,7 @@ class UserTokensSaver( val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId) if (userWallet == null) { - Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.") + TangemLogger.e("UserWallet with id $userWalletId not found. Cannot push tokens.") onFailSend() return@withContext } @@ -116,7 +116,7 @@ class UserTokensSaver( userWalletId = userWalletId, response = response, onFailSend = { - Timber.e( + TangemLogger.e( "Retryer: Failed to push updated tokens on attempt ${iteration + 1} for $userWalletId", ) diff --git a/data/common/src/main/kotlin/com/tangem/data/common/network/NetworkFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/network/NetworkFactory.kt index bf9014a844..97ba053720 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/network/NetworkFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/network/NetworkFactory.kt @@ -13,7 +13,7 @@ import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.derivations.DerivationStyleProvider import com.tangem.domain.wallets.derivations.derivationStyleProvider import com.tangem.lib.crypto.derivation.toMutable -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -154,11 +154,11 @@ class NetworkFactory @Inject constructor( private fun Blockchain.isBlockchainSupported(): Boolean { if (this == Blockchain.Unknown) { - Timber.w("Unable to convert Unknown blockchain to the domain network model") + TangemLogger.w("Unable to convert Unknown blockchain to the domain network model") return false } if (this in excludedBlockchains) { - Timber.w("Unable to convert excluded blockchain to the domain network model") + TangemLogger.w("Unable to convert excluded blockchain to the domain network model") return false } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/quote/DefaultQuotesFetcher.kt b/data/common/src/main/kotlin/com/tangem/data/common/quote/DefaultQuotesFetcher.kt index 91f3f11426..a3c47ae0f1 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/quote/DefaultQuotesFetcher.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/quote/DefaultQuotesFetcher.kt @@ -15,11 +15,11 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.QuotesResponse import com.tangem.domain.core.utils.eitherOn import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import org.joda.time.DateTime -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap import kotlin.time.Duration.Companion.seconds @@ -194,7 +194,7 @@ internal class DefaultQuotesFetcher( return this } - Timber.d("Some quotes are missing from the server response: $skippedIds") + TangemLogger.d("Some quotes are missing from the server response: $skippedIds") val emptyQuotes = skippedIds.associateWith { QuotesResponse.Quote.EMPTY } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/utils/RequestUtils.kt b/data/common/src/main/kotlin/com/tangem/data/common/utils/RequestUtils.kt index 710a982835..a1b8af7782 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/utils/RequestUtils.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/utils/RequestUtils.kt @@ -1,10 +1,10 @@ package com.tangem.data.common.utils +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.yield -import timber.log.Timber import kotlin.coroutines.cancellation.CancellationException @Suppress("UnconditionalJumpStatementInLoop", "MagicNumber") @@ -19,7 +19,7 @@ suspend fun retryOnError(priority: Boolean = false, startRetryDelay: Int = 5 currentCoroutineContext().ensureActive() } - Timber.e(e, "Error occurred during retryOnError block") + TangemLogger.e("Error occurred during retryOnError block", e) if (priority && priorityCounter > 0) { --priorityCounter diff --git a/data/earn/build.gradle.kts b/data/earn/build.gradle.kts index 985868438d..87173ffe7a 100644 --- a/data/earn/build.gradle.kts +++ b/data/earn/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { // region Other libraries implementation(deps.androidx.datastore) implementation(deps.moshi.kotlin) - implementation(deps.timber) implementation(tangemDeps.blockchain) // endregion diff --git a/data/express/build.gradle.kts b/data/express/build.gradle.kts index f75d1dde55..473892eedf 100644 --- a/data/express/build.gradle.kts +++ b/data/express/build.gradle.kts @@ -30,7 +30,6 @@ dependencies { /** Other */ implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) /** DI */ implementation(deps.hilt.android) diff --git a/data/express/src/main/java/com/tangem/data/express/DefaultExpressRepository.kt b/data/express/src/main/java/com/tangem/data/express/DefaultExpressRepository.kt index 31d7577acf..360ebda6c1 100644 --- a/data/express/src/main/java/com/tangem/data/express/DefaultExpressRepository.kt +++ b/data/express/src/main/java/com/tangem/data/express/DefaultExpressRepository.kt @@ -12,7 +12,7 @@ import com.tangem.domain.express.models.ExpressProviderType import com.tangem.domain.models.wallet.UserWallet import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.filterIf -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class DefaultExpressRepository( private val tangemExpressApi: TangemExpressApi, @@ -36,7 +36,7 @@ internal class DefaultExpressRepository( .filterIf(filterProviderTypes.isNotEmpty()) { it.type in filterProviderTypes } }, onError = { error -> - Timber.w(error, "Unable to fetch express providers") + TangemLogger.w("Unable to fetch express providers", error) throw error }, ) diff --git a/data/express/src/main/java/com/tangem/data/express/DefaultExpressServiceFetcher.kt b/data/express/src/main/java/com/tangem/data/express/DefaultExpressServiceFetcher.kt index 6e97e2c7b5..449959c978 100644 --- a/data/express/src/main/java/com/tangem/data/express/DefaultExpressServiceFetcher.kt +++ b/data/express/src/main/java/com/tangem/data/express/DefaultExpressServiceFetcher.kt @@ -22,11 +22,11 @@ import com.tangem.domain.express.models.ExpressAsset import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.update -import timber.log.Timber import javax.inject.Inject typealias InitializationStatusFlow = MutableStateFlow>> @@ -85,7 +85,7 @@ internal class DefaultExpressServiceFetcher @Inject constructor( if (expressAssetsStore.getSyncOrNull(userWallet.walletId) == null) { initializationStatus.update { e.lceError() } } - Timber.e(e, "Unable to fetch assets for: ${userWallet.walletId.stringValue}") + TangemLogger.e("Unable to fetch assets for: ${userWallet.walletId.stringValue}", e) throw e } } diff --git a/data/feedback/build.gradle.kts b/data/feedback/build.gradle.kts index 08b86b9db4..c5ea5e524e 100644 --- a/data/feedback/build.gradle.kts +++ b/data/feedback/build.gradle.kts @@ -25,7 +25,6 @@ dependencies { // endregion // Other libraries - implementation(deps.timber) // endregion // region Core modules diff --git a/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt b/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt index ca09522466..5f39f9f870 100644 --- a/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt +++ b/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt @@ -14,10 +14,10 @@ import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase +import com.tangem.utils.logging.TangemLogger import com.tangem.utils.version.AppVersionProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update -import timber.log.Timber import java.io.File /** @@ -102,7 +102,7 @@ internal class DefaultFeedbackRepository( override fun getBlockchainErrorInfo(userWalletId: UserWalletId): BlockchainErrorInfo? { return blockchainsErrors.value[userWalletId].also { - if (it == null) Timber.e("Blockchain error info is null for $userWalletId") + if (it == null) TangemLogger.e("Blockchain error info is null for $userWalletId") } } diff --git a/data/manage-tokens/build.gradle.kts b/data/manage-tokens/build.gradle.kts index ce17fcef05..fa149015fa 100644 --- a/data/manage-tokens/build.gradle.kts +++ b/data/manage-tokens/build.gradle.kts @@ -51,7 +51,6 @@ dependencies { /** Other */ implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) } \ No newline at end of file diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt index efdfc59129..c6316183e1 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt @@ -22,7 +22,7 @@ import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.derivations.derivationStyleProvider import com.tangem.lib.crypto.BlockchainUtils -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class ManagedCryptoCurrencyFactory( private val networkFactory: NetworkFactory, @@ -223,7 +223,7 @@ internal class ManagedCryptoCurrencyFactory( blockchain.canHandleTokens() -> { val formattedContractAddress = blockchain.reformatContractAddress(contractAddress) if (formattedContractAddress == null) { - Timber.w("Couldn't reformat $contractAddress") + TangemLogger.w("Couldn't reformat $contractAddress") return null } SourceNetwork.Default( diff --git a/data/markets/build.gradle.kts b/data/markets/build.gradle.kts index 1678a61ead..bce4fe8a70 100644 --- a/data/markets/build.gradle.kts +++ b/data/markets/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { implementation(deps.jodatime) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) implementation(tangemDeps.blockchain) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) diff --git a/data/networks/build.gradle.kts b/data/networks/build.gradle.kts index 90ca5576e0..d90e4e2a52 100644 --- a/data/networks/build.gradle.kts +++ b/data/networks/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { // region Other libraries implementation(deps.androidx.datastore) implementation(deps.moshi) - implementation(deps.timber) // endregion // region Tests diff --git a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt index 8c3fbae1a2..6585752203 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt @@ -3,7 +3,7 @@ package com.tangem.data.networks.converters import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.models.network.NetworkAddress import com.tangem.utils.converter.TwoWayConverter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Converter from [NetworkAddressConverter.Value] to [NetworkAddress] and vice versa @@ -58,7 +58,7 @@ internal object NetworkAddressConverter : TwoWayConverter + TangemLogger.e("Failed to fetch network status for $userWalletId [${network.rawId}]", throwable) networksStatusesStore.setSourceAsOnlyCache(userWalletId = userWalletId, network = network) } } diff --git a/data/networks/src/main/java/com/tangem/data/networks/multi/DefaultMultiNetworkStatusProducer.kt b/data/networks/src/main/java/com/tangem/data/networks/multi/DefaultMultiNetworkStatusProducer.kt index 8406342ea9..94e3c3b9cc 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/multi/DefaultMultiNetworkStatusProducer.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/multi/DefaultMultiNetworkStatusProducer.kt @@ -10,11 +10,11 @@ import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.networks.multi.MultiNetworkStatusProducer import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.* -import timber.log.Timber /** * Default implementation of [MultiNetworkStatusProducer] @@ -43,7 +43,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor( val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId) if (userWallet == null) { - Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}") + TangemLogger.e("Unable to get UserWallet with provided ID: ${params.userWalletId}") return@mapNotNull null } diff --git a/data/networks/src/main/java/com/tangem/data/networks/repository/DefaultNetworksRepository.kt b/data/networks/src/main/java/com/tangem/data/networks/repository/DefaultNetworksRepository.kt index 4755e55248..b0dc9c6af7 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/repository/DefaultNetworksRepository.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/repository/DefaultNetworksRepository.kt @@ -1,9 +1,9 @@ package com.tangem.data.networks.repository -import com.tangem.domain.common.tokens.CardCryptoCurrencyFactory import com.tangem.data.networks.store.NetworksStatusesStore import com.tangem.data.networks.store.storeStatus import com.tangem.data.networks.utils.NetworkStatusFactory +import com.tangem.domain.common.tokens.CardCryptoCurrencyFactory import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.CryptoCurrencyAddress import com.tangem.domain.models.network.Network @@ -11,8 +11,8 @@ import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.networks.repository.NetworksRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber /** * Default implementation of [NetworksRepository] @@ -36,8 +36,8 @@ internal class DefaultNetworksRepository( val currencies = runCatching { cardCryptoCurrencyFactory.create(userWalletId = userWalletId, network = network) } - .getOrElse { - Timber.e(it, "Unable to create wallet currencies") + .getOrElse { error -> + TangemLogger.e("Unable to create wallet currencies", error) return@withContext } @@ -50,8 +50,8 @@ internal class DefaultNetworksRepository( network: Network, ): List { return runCatching { cardCryptoCurrencyFactory.create(userWalletId = userWalletId, network = network) } - .getOrElse { - Timber.e(it, "Unable to create wallet currencies") + .getOrElse { error -> + TangemLogger.e("Unable to create wallet currencies", error) return emptyList() } .map { currency -> @@ -67,8 +67,8 @@ internal class DefaultNetworksRepository( network: Network.RawID, ): List { return runCatching { cardCryptoCurrencyFactory.createByRawId(userWalletId = userWalletId, network = network) } - .getOrElse { - Timber.e(it, "Unable to create wallet currencies") + .getOrElse { error -> + TangemLogger.e("Unable to create wallet currencies", error) return emptyList() } .map { currency -> diff --git a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStore.kt b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStore.kt index 0cb7dba076..05b161810f 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStore.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStore.kt @@ -7,15 +7,17 @@ import com.tangem.data.networks.converters.SimpleNetworkStatusConverter import com.tangem.data.networks.models.SimpleNetworkStatus import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.datasource.local.network.entity.NetworkStatusDM -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.StatusSource import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.extensions.addOrReplace -import kotlinx.coroutines.* +import com.tangem.utils.logging.TangemLogger +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* -import timber.log.Timber +import kotlinx.coroutines.launch import java.io.File internal typealias WalletIdWithSimpleStatus = Map> @@ -45,7 +47,7 @@ internal class DefaultNetworksStatusesStore( oldFile.delete() } } catch (e: Exception) { - Timber.e(e, "Error while deleting old networks statuses datastore file") + TangemLogger.e("Error while deleting old networks statuses datastore file", e) } val cachedStatuses = persistenceDataStore.data.firstOrNull() ?: return@launch @@ -89,7 +91,7 @@ internal class DefaultNetworksStatusesStore( ifNotFound: (Network.ID) -> SimpleNetworkStatus?, ) { if (networks.isEmpty()) { - Timber.d("Nothing to update: networks are empty") + TangemLogger.d("Nothing to update: networks are empty") return } diff --git a/data/networks/src/main/java/com/tangem/data/networks/store/NetworkStatusesStoreExt.kt b/data/networks/src/main/java/com/tangem/data/networks/store/NetworkStatusesStoreExt.kt index b1da135fa9..6edd224074 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/store/NetworkStatusesStoreExt.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/store/NetworkStatusesStoreExt.kt @@ -5,7 +5,7 @@ import com.tangem.domain.models.StatusSource import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.wallet.UserWalletId -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Store actual network [status] by [userWalletId]. @@ -41,14 +41,14 @@ internal suspend fun NetworksStatusesStore.storeStatus(userWalletId: UserWalletI internal suspend fun NetworksStatusesStore.storeSuccess(userWalletId: UserWalletId, status: NetworkStatus) { if (status.value is NetworkStatus.Unreachable) { val message = "Use storeError method to save unreachable status" - Timber.d(message) + TangemLogger.d(message) error(message) } if (status.value.source != StatusSource.ACTUAL) { val message = "Method storeActual can be called only with StatusSource.ACTUAL" - Timber.d(message) + TangemLogger.d(message) error(message) } diff --git a/data/networks/src/main/java/com/tangem/data/networks/utils/DefaultNetworksCleaner.kt b/data/networks/src/main/java/com/tangem/data/networks/utils/DefaultNetworksCleaner.kt index b395990e65..59058d09c2 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/utils/DefaultNetworksCleaner.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/utils/DefaultNetworksCleaner.kt @@ -8,10 +8,10 @@ import com.tangem.domain.networks.utils.NetworksCleaner import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.withContext -import timber.log.Timber /** * Default implementation of [NetworksCleaner]. @@ -30,7 +30,7 @@ internal class DefaultNetworksCleaner( override suspend fun invoke(userWalletId: UserWalletId, currencies: List) { if (currencies.isEmpty()) { - Timber.d("No currencies to clear for wallet: $userWalletId") + TangemLogger.d("No currencies to clear for wallet: $userWalletId") return } @@ -49,7 +49,7 @@ internal class DefaultNetworksCleaner( runSuspendCatching { networksStatusesStore.clear(userWalletId = userWalletId, networks = networks) } - .onFailure { Timber.e(it, "Failed to clear network statuses for wallet: $userWalletId") } + .onFailure { TangemLogger.e("Failed to clear network statuses for wallet: $userWalletId", it) } } } @@ -63,7 +63,7 @@ internal class DefaultNetworksCleaner( walletManagersFacade.remove(userWalletId = userWalletId, networks = networks) } .onFailure { - Timber.e(it, "Failed to remove networks from Blockchain SDK for wallet: $userWalletId") + TangemLogger.e("Failed to remove networks from Blockchain SDK for wallet: $userWalletId", it) } } @@ -72,7 +72,7 @@ internal class DefaultNetworksCleaner( walletManagersFacade.removeTokens(userWalletId = userWalletId, tokens = tokens) } .onFailure { - Timber.e(it, "Failed to remove tokens from Blockchain SDK for wallet: $userWalletId") + TangemLogger.e("Failed to remove tokens from Blockchain SDK for wallet: $userWalletId", it) } } } diff --git a/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt b/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt index 9c9742678c..e94de7efb5 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/utils/NetworkStatusFactory.kt @@ -9,7 +9,7 @@ import com.tangem.domain.models.network.NetworkAddress import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.network.TxInfo import com.tangem.domain.models.yield.supply.YieldSupplyStatus -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** Factory for creating [NetworkStatus] */ object NetworkStatusFactory { @@ -104,7 +104,7 @@ object NetworkStatusFactory { } if (amount == null) { - Timber.w("Unable to find amount for cryptocurrency: $currency") + TangemLogger.w("Unable to find amount for cryptocurrency: $currency") currency.id to NetworkStatus.Amount.NotFound } else { currency.id to NetworkStatus.Amount.Loaded(amount.value) @@ -129,7 +129,7 @@ object NetworkStatusFactory { } if (amount == null) { - Timber.w("Unable to find amount for cryptocurrency: $currency") + TangemLogger.w("Unable to find amount for cryptocurrency: $currency") currency.id to null } else { currency.id to amount.yieldSupplyStatus @@ -191,7 +191,7 @@ object NetworkStatusFactory { } if (address.value.isBlank()) { - Timber.w("Address value is blank") + TangemLogger.w("Address value is blank") } return NetworkAddress.Address(address.value, type) diff --git a/data/news/build.gradle.kts b/data/news/build.gradle.kts index 86796fcedd..0d06bf693d 100644 --- a/data/news/build.gradle.kts +++ b/data/news/build.gradle.kts @@ -39,7 +39,6 @@ dependencies { // region Other libraries implementation(deps.androidx.datastore) implementation(deps.moshi.kotlin) - implementation(deps.timber) // endregion // region Tests diff --git a/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt b/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt index 3e3ef70c45..293cc63837 100644 --- a/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt +++ b/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt @@ -28,9 +28,9 @@ import com.tangem.pagination.exception.EndOfPaginationException import com.tangem.pagination.fetcher.BatchFetcher import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import timber.log.Timber /** * Implementation of [NewsRepository]. @@ -72,7 +72,7 @@ internal class DefaultNewsRepository( response.items }, onError = { error -> - Timber.e(error, "Failed to get list of news") + TangemLogger.e("Failed to get list of news", error) throw error }, ) @@ -224,8 +224,7 @@ internal class DefaultNewsRepository( return withContext(dispatchers.io) { when (val apiResponse = newsApi.getTrendingNews(limit = limit, language = language)) { is ApiResponse.Error -> { - Timber.e( - apiResponse.cause, + TangemLogger.e( "Trending news fetch failed cause: ${ when (val error = apiResponse.cause) { is ApiResponseError.HttpException -> error.code @@ -234,6 +233,7 @@ internal class DefaultNewsRepository( is ApiResponseError.UnknownException -> "UnknownException" } }", + apiResponse.cause, ) trendingNewsStore.clear() trendingNewsStore.store( diff --git a/data/nft/build.gradle.kts b/data/nft/build.gradle.kts index f53acc71ce..63a318a877 100644 --- a/data/nft/build.gradle.kts +++ b/data/nft/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.arrow.fx) implementation(deps.jodatime) - implementation(deps.timber) implementation(deps.androidx.paging.runtime) implementation(deps.moshi.kotlin) ksp(deps.moshi.kotlin.codegen) diff --git a/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt b/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt index 7b022349ef..3baa26a3f4 100644 --- a/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt +++ b/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt @@ -34,6 +34,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.runSuspendCatching import com.tangem.utils.coroutines.saveIn +import com.tangem.utils.logging.TangemLogger import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.* @@ -42,7 +43,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import com.tangem.blockchain.nft.models.NFTAsset as SdkNFTAsset @@ -241,7 +241,7 @@ internal class DefaultNFTRepository @Inject constructor( // NFTCleaner implementation override suspend fun invoke(userWalletId: UserWalletId, networks: Set) { if (networks.isEmpty()) { - Timber.d("No networks to clear for wallet: $userWalletId") + TangemLogger.d("No networks to clear for wallet: $userWalletId") return } @@ -252,7 +252,7 @@ internal class DefaultNFTRepository @Inject constructor( // nftRuntimeStoreFactory.provide(network = network).clear() } .onFailure { throwable -> - Timber.e(throwable, "Failed to clear NFT data for network $network for wallet: $userWalletId") + TangemLogger.e("Failed to clear NFT data for network $network for wallet: $userWalletId", throwable) } } } diff --git a/data/onramp/build.gradle.kts b/data/onramp/build.gradle.kts index bf0adddbac..c61541ce6a 100644 --- a/data/onramp/build.gradle.kts +++ b/data/onramp/build.gradle.kts @@ -47,7 +47,6 @@ dependencies { implementation(deps.kotlin.immutable.collections) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) implementation(deps.kotlin.serialization) diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt index 5f768924a0..e7f7ad38db 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt @@ -22,19 +22,15 @@ import com.tangem.domain.card.common.extensions.canHandleToken import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.common.wallets.getSyncStrict import com.tangem.domain.common.wallets.loadAndGet -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.onramp.model.HotCryptoCurrency import com.tangem.domain.onramp.repositories.HotCryptoRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import com.tangem.utils.coroutines.JobHolder -import com.tangem.utils.coroutines.runCatching -import com.tangem.utils.coroutines.saveIn +import com.tangem.utils.coroutines.* +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.plus -import timber.log.Timber /** * Default implementation of [HotCryptoRepository] @@ -123,9 +119,9 @@ internal class DefaultHotCryptoRepository( return runCatching(dispatchers.io) { tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow() } - .onSuccess { Timber.d("HotCrypto is successfully updated") } + .onSuccess { TangemLogger.d("HotCrypto is successfully updated") } .onFailure { throwable -> - Timber.e(throwable, "Unable to fetch hot crypto") + TangemLogger.e("Unable to fetch hot crypto", throwable) val httpException = throwable as? ApiResponseError.HttpException analyticsEventHandler.send( diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt index bf07c9a118..7fe880aa2b 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt @@ -50,6 +50,7 @@ import com.tangem.domain.onramp.repositories.OnrampRepository import com.tangem.domain.tokens.model.Amount import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -57,7 +58,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.joda.time.DateTime -import timber.log.Timber import java.util.UUID @Suppress("LongParameterList", "LargeClass", "TooManyFunctions") @@ -221,7 +221,7 @@ internal class DefaultOnrampRepository( ).bind() }, onError = { error -> - Timber.w(error, "Unable to fetch onramp payment methods") + TangemLogger.w("Unable to fetch onramp payment methods", error) throw error }, ) @@ -256,7 +256,7 @@ internal class DefaultOnrampRepository( ).bind() }, onError = { error -> - Timber.w(error, "Unable to fetch onramp pairs") + TangemLogger.w("Unable to fetch onramp pairs", error) throw error }, ) @@ -273,7 +273,7 @@ internal class DefaultOnrampRepository( ).bind() }, onError = { error -> - Timber.w(error, "Unable to fetch express providers") + TangemLogger.w("Unable to fetch express providers", error) throw error }, ) @@ -321,7 +321,7 @@ internal class DefaultOnrampRepository( ).bind() }, onError = { error -> - Timber.w(error, "Unable to fetch onramp pairs") + TangemLogger.w("Unable to fetch onramp pairs", error) throw error }, ) @@ -455,7 +455,7 @@ internal class DefaultOnrampRepository( ).bind() }, onError = { e -> - Timber.e(e) + TangemLogger.e("Error", e) throw e }, ) @@ -478,7 +478,7 @@ internal class DefaultOnrampRepository( throw OnrampRedirectError.VerificationFailed } } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) throw e } } @@ -602,7 +602,7 @@ internal class DefaultOnrampRepository( countryCode = countryCode, ) } else { - Timber.w(error, "Unable to fetch onramp quotes for ${provider.id}. $error") + TangemLogger.w("Unable to fetch onramp quotes for ${provider.id}. $error", error) OnrampQuote.Error( paymentMethod = paymentMethod, provider = provider, @@ -612,7 +612,7 @@ internal class DefaultOnrampRepository( ) } } else { - Timber.w(error, "Unable to fetch onramp quotes for ${provider.id}. $error") + TangemLogger.w("Unable to fetch onramp quotes for ${provider.id}. $error", error) null } diff --git a/data/promo/build.gradle.kts b/data/promo/build.gradle.kts index b4ab572c21..e4e45ecdca 100644 --- a/data/promo/build.gradle.kts +++ b/data/promo/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { implementation(deps.androidx.datastore) implementation(deps.jodatime) - implementation(deps.timber) implementation(deps.hilt.android) kapt(deps.hilt.kapt) diff --git a/data/quotes/build.gradle.kts b/data/quotes/build.gradle.kts index b4f0191e43..5d169e0702 100644 --- a/data/quotes/build.gradle.kts +++ b/data/quotes/build.gradle.kts @@ -44,7 +44,6 @@ dependencies { // region Other libraries implementation(deps.androidx.datastore) implementation(deps.moshi.kotlin) - implementation(deps.timber) // endregion // region Tests diff --git a/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteStatusFetcher.kt b/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteStatusFetcher.kt index 1660472cb9..6b1099fb1a 100644 --- a/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteStatusFetcher.kt +++ b/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteStatusFetcher.kt @@ -13,7 +13,7 @@ import com.tangem.domain.core.utils.catchOn import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -37,7 +37,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor( override suspend fun invoke(params: MultiQuoteStatusFetcher.Params) = Either.catchOn(dispatchers.default) { if (params.currenciesIds.isEmpty()) { - Timber.d("No currencies to fetch quotes for") + TangemLogger.d("No currencies to fetch quotes for") return@catchOn } @@ -67,7 +67,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor( quotesStatusesStore.store(values = updatedResponse.quotes) } .onLeft { throwable -> - Timber.e(throwable) + TangemLogger.e("Error", throwable) quotesStatusesStore.setSourceAsOnlyCache(currenciesIds = params.currenciesIds) } @@ -77,7 +77,7 @@ internal class DefaultMultiQuoteStatusFetcher @Inject constructor( if (appCurrencyId.isNullOrBlank()) { val exception = IllegalStateException("Unable to get AppCurrency for updating quotes") - Timber.e(exception) + TangemLogger.e("Error", exception) throw exception } diff --git a/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteUpdater.kt b/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteUpdater.kt index f499f8a4a0..cad0c16d50 100644 --- a/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteUpdater.kt +++ b/data/quotes/src/main/java/com/tangem/data/quotes/multi/DefaultMultiQuoteUpdater.kt @@ -4,17 +4,17 @@ import androidx.annotation.VisibleForTesting import arrow.core.left import com.tangem.data.quotes.store.QuotesStatusesStore import com.tangem.datasource.appcurrency.AppCurrencyResponseStore -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.core.utils.EitherFlow import com.tangem.domain.models.quote.QuoteStatus import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher import com.tangem.domain.quotes.multi.MultiQuoteUpdater +import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.saveIn +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* -import timber.log.Timber /** * Default implementation of [MultiQuoteUpdater] which updates quotes when the app currency changes @@ -36,14 +36,14 @@ internal class DefaultMultiQuoteUpdater( private val updaterHolder = JobHolder() override fun subscribe() { - Timber.d("Subscribe on quotes updates") + TangemLogger.d("Subscribe on quotes updates") getMultiQuoteUpdates() .launchIn(coroutineScope) .saveIn(updaterHolder) } override fun unsubscribe() { - Timber.e("Unsubscribe from quotes updates") + TangemLogger.i("Unsubscribe from quotes updates") updaterHolder.cancel() } @@ -63,10 +63,10 @@ internal class DefaultMultiQuoteUpdater( appCurrencyId = appCurrency.id, ), ) - .onLeft(Timber::e) + .onLeft { TangemLogger.e("Error", it) } } .retryWhen { cause, _ -> - Timber.e("Retry updating quotes: $cause") + TangemLogger.e("Retry updating quotes: $cause") emit(cause.left()) diff --git a/data/quotes/src/main/java/com/tangem/data/quotes/repository/DefaultQuotesRepository.kt b/data/quotes/src/main/java/com/tangem/data/quotes/repository/DefaultQuotesRepository.kt index d170b82c5c..d16b775518 100644 --- a/data/quotes/src/main/java/com/tangem/data/quotes/repository/DefaultQuotesRepository.kt +++ b/data/quotes/src/main/java/com/tangem/data/quotes/repository/DefaultQuotesRepository.kt @@ -4,7 +4,7 @@ import com.tangem.data.quotes.store.QuotesStatusesStore import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.quote.QuoteStatus import com.tangem.domain.quotes.QuotesRepository -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Default implementation of [QuotesRepository] @@ -19,7 +19,7 @@ internal class DefaultQuotesRepository( override suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set): Set { if (currenciesIds.isEmpty()) { - Timber.e("currenciesIds are empty") + TangemLogger.e("currenciesIds are empty") return emptySet() } diff --git a/data/quotes/src/main/java/com/tangem/data/quotes/store/DefaultQuotesStatusesStore.kt b/data/quotes/src/main/java/com/tangem/data/quotes/store/DefaultQuotesStatusesStore.kt index 3225adfea6..9c4bd521e7 100644 --- a/data/quotes/src/main/java/com/tangem/data/quotes/store/DefaultQuotesStatusesStore.kt +++ b/data/quotes/src/main/java/com/tangem/data/quotes/store/DefaultQuotesStatusesStore.kt @@ -4,16 +4,16 @@ import androidx.datastore.core.DataStore import com.tangem.data.quotes.converter.QuoteStatusConverter import com.tangem.datasource.api.tangemTech.models.QuotesResponse import com.tangem.datasource.local.datastore.RuntimeSharedStore -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.StatusSource import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.quote.QuoteStatus +import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.extensions.addOrReplace +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch -import timber.log.Timber internal typealias CurrencyIdWithQuote = Map @@ -64,7 +64,7 @@ internal class DefaultQuotesStatusesStore( ifNotFound: (CryptoCurrency.RawID) -> QuoteStatus?, ) { if (currenciesIds.isEmpty()) { - Timber.d("Nothing to update: currencies ids are empty") + TangemLogger.d("Nothing to update: currencies ids are empty") return } diff --git a/data/settings/build.gradle.kts b/data/settings/build.gradle.kts index 30c7231276..3b71894edc 100644 --- a/data/settings/build.gradle.kts +++ b/data/settings/build.gradle.kts @@ -33,7 +33,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) // endregion diff --git a/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt b/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt index 588d3b71e3..0f77d6749a 100644 --- a/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt +++ b/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt @@ -14,11 +14,11 @@ import com.tangem.domain.settings.usercountry.models.GB_COUNTRY import com.tangem.domain.settings.usercountry.models.UserCountry import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.withContext -import timber.log.Timber import java.util.Locale @Suppress("TooManyFunctions") @@ -145,7 +145,7 @@ internal class DefaultSettingsRepository( override fun getUserCountryCode(): StateFlow = userCountryFlow override suspend fun fetchUserCountryCode() { - Timber.i("Start fetching user country code") + TangemLogger.i("Start fetching user country code") // for GB locale avoid request geo and use device default (FCA fixes) if (Locale.getDefault().country == GB_COUNTRY.code) { @@ -166,7 +166,7 @@ internal class DefaultSettingsRepository( else -> UserCountry.Other(code = country) } - Timber.i("User code country is $code") + TangemLogger.i("User code country is $code") userCountryFlow.value = code } diff --git a/data/staking/build.gradle.kts b/data/staking/build.gradle.kts index fc7059b626..3aa93ac8e2 100644 --- a/data/staking/build.gradle.kts +++ b/data/staking/build.gradle.kts @@ -55,7 +55,6 @@ dependencies { implementation(deps.kotlin.immutable.collections) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) implementation(deps.firebase.crashlytics) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultP2PEthPoolRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultP2PEthPoolRepository.kt index 8752d83b0e..b189675a38 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultP2PEthPoolRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultP2PEthPoolRepository.kt @@ -5,11 +5,7 @@ import arrow.core.getOrElse import arrow.core.raise.Raise import arrow.core.raise.either import arrow.core.raise.ensure -import com.tangem.data.staking.converters.ethpool.P2PEthPoolBroadcastResultConverter -import com.tangem.data.staking.converters.ethpool.P2PEthPoolErrorConverter -import com.tangem.data.staking.converters.ethpool.P2PEthPoolStakingAccountConverter -import com.tangem.data.staking.converters.ethpool.P2PEthPoolUnsignedTxConverter -import com.tangem.data.staking.converters.ethpool.P2PEthPoolVaultConverter +import com.tangem.data.staking.converters.ethpool.* import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.ethpool.P2PEthPoolApi import com.tangem.datasource.api.ethpool.models.request.P2PEthPoolBroadcastRequest @@ -28,11 +24,11 @@ import com.tangem.domain.staking.model.stakekit.StakingError import com.tangem.domain.staking.repositories.P2PEthPoolRepository import com.tangem.domain.staking.toggles.StakingFeatureToggles import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -import timber.log.Timber /** * P2PEthPool staking repository implementation @@ -71,7 +67,7 @@ internal class DefaultP2PEthPoolRepository( override suspend fun fetchVaults(network: P2PEthPoolNetwork) { val vaults = if (stakingFeatureToggles.isEthStakingEnabled) { getVaults(network).getOrElse { error -> - Timber.e("Error fetching P2PEthPool vaults: $error") + TangemLogger.e("Error fetching P2PEthPool vaults: $error") emptyList() } } else { diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitRepository.kt index 171c5c720a..79dc265b4f 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitRepository.kt @@ -47,13 +47,13 @@ import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction import com.tangem.domain.staking.repositories.StakeKitRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -import timber.log.Timber @Suppress("LargeClass", "LongParameterList", "TooManyFunctions") internal class DefaultStakeKitRepository( @@ -91,7 +91,7 @@ internal class DefaultStakeKitRepository( when (response) { is ApiResponse.Success -> response.data.data.filter { yield -> yield.isAvailable == true } is ApiResponse.Error -> { - Timber.e("Error fetching enabled yields: ${response.cause}") + TangemLogger.e("Error fetching enabled yields: ${response.cause}") emptyList() } } @@ -142,7 +142,7 @@ internal class DefaultStakeKitRepository( network = networkTypeString, status = actionStatusString, ).getOrThrow().data, - onError = { Timber.e("Error converting staking actions list: $it") }, + onError = { TangemLogger.e("Error converting staking actions list: $it") }, ) } } @@ -348,7 +348,7 @@ internal class DefaultStakeKitRepository( private suspend fun getEnabledYieldsSync(): List { return YieldConverter.convertListIgnoreErrors( input = stakingYieldsStore.getSync(), - onError = { Timber.e("Error converting one of the items in enabled yields: $it") }, + onError = { TangemLogger.e("Error converting one of the items in enabled yields: $it") }, ) } @@ -356,7 +356,7 @@ internal class DefaultStakeKitRepository( return stakingYieldsStore.get().map { yields -> YieldConverter.convertListIgnoreErrors( input = yields, - onError = { Timber.e("Error converting one of the items in enabled yields: $it") }, + onError = { TangemLogger.e("Error converting one of the items in enabled yields: $it") }, ) } } diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitTransactionHashRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitTransactionHashRepository.kt index 0147b2da07..b0c1a1ad67 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitTransactionHashRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakeKitTransactionHashRepository.kt @@ -1,15 +1,15 @@ package com.tangem.data.staking import com.tangem.datasource.api.stakekit.StakeKitApi -import com.tangem.datasource.api.stakekit.models.request.* +import com.tangem.datasource.api.stakekit.models.request.SubmitTransactionHashRequestBody import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectListSync import com.tangem.domain.staking.model.UnsubmittedTransactionMetadata import com.tangem.domain.staking.repositories.StakeKitTransactionHashRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber internal class DefaultStakeKitTransactionHashRepository( private val stakeKitApi: StakeKitApi, @@ -75,7 +75,7 @@ internal class DefaultStakeKitTransactionHashRepository( append("StakeKit id = ${transaction.transactionId} and\n") append("transaction hash = ${transaction.transactionHash}") } - Timber.e(logMessage) + TangemLogger.e(logMessage) } } } diff --git a/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiStakingBalanceFetcher.kt b/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiStakingBalanceFetcher.kt index c957ac3d12..d329e2bb77 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiStakingBalanceFetcher.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/multi/DefaultMultiStakingBalanceFetcher.kt @@ -30,11 +30,11 @@ import com.tangem.domain.staking.model.ethpool.P2PEthPoolVault import com.tangem.domain.staking.multi.MultiStakingBalanceFetcher import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject /** @@ -66,10 +66,10 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( ) : MultiStakingBalanceFetcher { override suspend fun invoke(params: MultiStakingBalanceFetcher.Params): Either { - Timber.i("Start fetching staking balances for params:\n$params") + TangemLogger.i("Start fetching staking balances for params:\n$params") val stakingIds = params.stakingIds.ifEmpty { - Timber.i("Nothing to fetch, empty stakingIds for ${params.userWalletId}") + TangemLogger.i("Nothing to fetch, empty stakingIds for ${params.userWalletId}") return Unit.right() } @@ -84,7 +84,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( stakingIntegrationID is StakingIntegrationID.StakeKit } - Timber.i( + TangemLogger.i( """ Staking IDs to fetch: - StakeKit: ${stakeKitIds.joinToString()} @@ -104,7 +104,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( } } .onLeft { throwable -> - Timber.e(throwable, "Unable to fetch staking balances $params") + TangemLogger.e("Unable to fetch staking balances $params", throwable) if (stakeKitIds.isNotEmpty()) { stakeKitBalancesStore.storeError( @@ -137,7 +137,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( val vaults = runSuspendCatching { p2pEthPoolVaultsStore.getSync() }.getOrNull().orEmpty() if (vaults.isEmpty()) { - Timber.w("No P2PEthPool vaults available for $userWalletId, storing empty balances") + TangemLogger.w("No P2PEthPool vaults available for $userWalletId, storing empty balances") p2PEthPoolBalancesStore.storeEmpty(userWalletId = userWalletId, stakingIds = stakingIds) return } @@ -155,7 +155,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( val addresses = stakingIds.map { it.address }.toSet() val responses = fetchP2PAccountResponses(vaults = vaults, addresses = addresses) - Timber.i("Successfully fetched ${responses.size} P2PEthPool balances for $userWalletId") + TangemLogger.i("Successfully fetched ${responses.size} P2PEthPool balances for $userWalletId") if (responses.isNotEmpty()) { p2PEthPoolBalancesStore.storeActual(userWalletId = userWalletId, values = responses) @@ -167,19 +167,22 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( } if (missingStakingIds.isNotEmpty()) { - Timber.i("Missing responses for ${missingStakingIds.size} staking IDs: $missingStakingIds") + TangemLogger.i( + "Missing responses for ${missingStakingIds.size} staking IDs:" + + " $missingStakingIds", + ) p2PEthPoolBalancesStore.storeError( userWalletId = userWalletId, stakingIds = missingStakingIds.toSet(), ) } } else { - Timber.i("No P2PEthPool responses received for $userWalletId") + TangemLogger.i("No P2PEthPool responses received for $userWalletId") p2PEthPoolBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds) } }, onError = { throwable -> - Timber.e(throwable, "Unable to fetch P2PEthPool balances $userWalletId") + TangemLogger.e("Unable to fetch P2PEthPool balances $userWalletId", throwable) p2PEthPoolBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds) @@ -207,7 +210,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( is ApiResponse.Success -> { val data = response.data if (data.error != null) { - Timber.w( + TangemLogger.w( "P2PEthPool API returned error for vault ${vault.vaultAddress}, " + "address $address: ${data.error ?: "error"}", ) @@ -219,17 +222,17 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( } } is ApiResponse.Error -> { - Timber.w( - response.cause, + TangemLogger.w( "Failed to fetch P2PEthPool balance for vault ${vault.vaultAddress}, " + "address $address", + response.cause, ) } } }.onFailure { error -> - Timber.w( - error, + TangemLogger.w( "Failed to fetch P2PEthPool balance for vault ${vault.vaultAddress}, address $address", + error, ) } } @@ -245,7 +248,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( if (!isSupportedByWallet) { val exception = IllegalStateException("Wallet $userWalletId is not supported: $maybeUserWallet") - Timber.e(exception) + TangemLogger.e("Error", exception) ifNotSupported(exception) } @@ -263,7 +266,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( val availableStakingIds = groupedStakingIds[true].orEmpty() val unavailableStakingIds = groupedStakingIds[false].orEmpty() - Timber.i( + TangemLogger.i( """ Available staking IDs: ${availableStakingIds.joinToString()} Unavailable staking IDs: ${unavailableStakingIds.joinToString()} @@ -282,7 +285,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( – stakingIds: ${stakingIds.joinToString()} """.trimIndent(), ) - Timber.i(exception) + TangemLogger.i(exception.toString()) throw exception } } @@ -293,7 +296,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( if (yieldsIds.isEmpty()) { val exception = IllegalStateException("No enabled yields for $userWalletId") - Timber.e(exception) + TangemLogger.e("Error", exception) throw exception } @@ -320,7 +323,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( .toSet() } - Timber.i( + TangemLogger.i( "Successfully fetched staking balances for $userWalletId:\n${yieldBalances.joinToString("\n")}", ) stakeKitBalancesStore.storeActual(userWalletId = userWalletId, values = yieldBalances) @@ -337,7 +340,7 @@ internal class DefaultMultiStakingBalanceFetcher @Inject constructor( } }, onError = { throwable -> - Timber.e(throwable, "Unable to fetch staking balances $userWalletId") + TangemLogger.e("Unable to fetch staking balances $userWalletId", throwable) stakeKitBalancesStore.storeError(userWalletId = userWalletId, stakingIds = stakingIds) diff --git a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleStakingBalanceProducer.kt b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleStakingBalanceProducer.kt index bf66f62a4a..5f96221f71 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleStakingBalanceProducer.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleStakingBalanceProducer.kt @@ -10,13 +10,13 @@ import com.tangem.domain.staking.multi.MultiStakingBalanceSupplier import com.tangem.domain.staking.single.SingleStakingBalanceProducer import com.tangem.domain.staking.single.SingleStakingBalanceProducer.Companion.selectStakingBalance import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import timber.log.Timber /** * Default implementation of [SingleStakingBalanceProducer] @@ -39,7 +39,7 @@ internal class DefaultSingleStakingBalanceProducer @AssistedInject constructor( override val fallback: Option = StakingBalance.Error(stakingId = params.stakingId).some() override fun produce(): Flow { - Timber.i("Producing staking balance for params:\n$params") + TangemLogger.i("Producing staking balance for params:\n$params") return multiStakingBalanceSupplier( params = MultiStakingBalanceProducer.Params(userWalletId = params.userWalletId), diff --git a/data/staking/src/main/java/com/tangem/data/staking/utils/DefaultStakingCleaner.kt b/data/staking/src/main/java/com/tangem/data/staking/utils/DefaultStakingCleaner.kt index 0fe16ead81..696578c106 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/utils/DefaultStakingCleaner.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/utils/DefaultStakingCleaner.kt @@ -9,10 +9,10 @@ import com.tangem.domain.staking.StakingIdFactory import com.tangem.domain.staking.utils.StakingCleaner import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.withContext -import timber.log.Timber /** * Default implementation of [StakingCleaner]. @@ -32,7 +32,7 @@ internal class DefaultStakingCleaner( override suspend fun invoke(userWalletId: UserWalletId, currencies: List) { if (currencies.isEmpty()) { - Timber.d("No currencies to clear for wallet: $userWalletId") + TangemLogger.d("No currencies to clear for wallet: $userWalletId") return } @@ -41,7 +41,7 @@ internal class DefaultStakingCleaner( } if (stakingIds.isEmpty()) { - Timber.d("All currencies have no stakingIds to clear for wallet: $userWalletId") + TangemLogger.d("All currencies have no stakingIds to clear for wallet: $userWalletId") return } @@ -50,7 +50,7 @@ internal class DefaultStakingCleaner( override suspend fun invoke(userWalletId: UserWalletId, stakingIds: Set) { if (stakingIds.isEmpty()) { - Timber.d("No stakingIds to clear for wallet: $userWalletId") + TangemLogger.d("No stakingIds to clear for wallet: $userWalletId") return } @@ -66,13 +66,13 @@ internal class DefaultStakingCleaner( runSuspendCatching { stakeKitBalancesStore.clear(userWalletId, stakingIds) } - .onFailure { Timber.e(it, "Failed to clear StakeKit balance statuses for wallet: $userWalletId") } + .onFailure { TangemLogger.e("Failed to clear StakeKit balance statuses for wallet: $userWalletId", it) } } private suspend fun clearP2PEthPoolBalancesStore(userWalletId: UserWalletId, stakingIds: Set) { runSuspendCatching { p2pEthPoolBalancesStore.clear(userWalletId, stakingIds) } - .onFailure { Timber.e(it, "Failed to clear P2PEthPool balance statuses for wallet: $userWalletId") } + .onFailure { TangemLogger.e("Failed to clear P2PEthPool balance statuses for wallet: $userWalletId", it) } } } \ No newline at end of file diff --git a/data/swap/build.gradle.kts b/data/swap/build.gradle.kts index a7ea5bd55c..8b9fdaffe8 100644 --- a/data/swap/build.gradle.kts +++ b/data/swap/build.gradle.kts @@ -52,7 +52,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) /** DI */ implementation(deps.hilt.android) diff --git a/data/swap/src/main/java/com/tangem/data/swap/DefaultSwapRepositoryV2.kt b/data/swap/src/main/java/com/tangem/data/swap/DefaultSwapRepositoryV2.kt index e4bbdeebee..0f4ef33398 100644 --- a/data/swap/src/main/java/com/tangem/data/swap/DefaultSwapRepositoryV2.kt +++ b/data/swap/src/main/java/com/tangem/data/swap/DefaultSwapRepositoryV2.kt @@ -35,11 +35,11 @@ import com.tangem.domain.swap.models.* import com.tangem.domain.swap.models.SwapAmountType import com.tangem.domain.tokens.operations.CryptoCurrencyStatusFactory import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.withContext -import timber.log.Timber import java.io.IOException import java.math.BigDecimal import java.util.UUID @@ -392,7 +392,7 @@ internal class DefaultSwapRepositoryV2 @Inject constructor( ).getOrThrow() }, onError = { error -> - Timber.w(error, "Unable to get pairs") + TangemLogger.w("Unable to get pairs", error) throw error }, ) @@ -438,7 +438,7 @@ internal class DefaultSwapRepositoryV2 @Inject constructor( return try { txDetailsMoshiAdapter.fromJson(txDetailsJson) } catch (e: IOException) { - Timber.e(e, "error parsing txDetailsJson") + TangemLogger.e("error parsing txDetailsJson", e) null } } diff --git a/data/tokens/build.gradle.kts b/data/tokens/build.gradle.kts index 96158e5dfb..f25b6ec88e 100644 --- a/data/tokens/build.gradle.kts +++ b/data/tokens/build.gradle.kts @@ -72,7 +72,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi.kotlin) implementation(deps.retrofit) // For HttpException - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) // endregion diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt index 4d0cf9c1fc..fe43c7fe58 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt @@ -8,10 +8,10 @@ import com.tangem.datasource.api.tangemTech.models.CoinsResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.withContext -import timber.log.Timber /** * Responsible for merging custom tokens into a user's token response. @@ -105,7 +105,7 @@ internal class CustomTokensMerger( ).bind() }, onError = { error -> - Timber.e(error, "Unable to fetch token:\n$token") + TangemLogger.e("Unable to fetch token:\n$token", error) null }, ) diff --git a/data/transaction/build.gradle.kts b/data/transaction/build.gradle.kts index 7becb2b968..a372c747a8 100644 --- a/data/transaction/build.gradle.kts +++ b/data/transaction/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { kapt(deps.hilt.kapt) /** Other */ - implementation(deps.timber) /** tests */ testImplementation(projects.common.test) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 06b461cbd4..ba4141909d 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -33,8 +33,8 @@ import com.tangem.domain.transaction.models.EventTransactionTypeDto import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runCatching +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import java.math.BigDecimal import java.math.BigInteger @@ -271,7 +271,7 @@ internal class DefaultTransactionRepository( Result.failure(ex) } } else { - Timber.e("${walletManager?.wallet?.blockchain} does not support transaction validation") + TangemLogger.e("${walletManager?.wallet?.blockchain} does not support transaction validation") Result.success(Unit) } } @@ -441,14 +441,14 @@ internal class DefaultTransactionRepository( val response = tangemTechApi.transactionEvents(body) response.fold( onSuccess = { - Timber.d("Successfully sent yield supply transaction hash: $hash") + TangemLogger.d("Successfully sent yield supply transaction hash: $hash") }, onError = { error -> - Timber.e(error, "Failed to send yield supply transaction hash: $hash") + TangemLogger.e("Failed to send yield supply transaction hash: $hash", error) }, ) }.onFailure { error -> - Timber.e(error, "Failed to send yield supply transaction hash: $hash") + TangemLogger.e("Failed to send yield supply transaction hash: $hash", error) } } @@ -460,7 +460,7 @@ internal class DefaultTransactionRepository( derivationPath = network.derivationPath.value, ) val preparer = walletManager as? TransactionPreparer ?: run { - Timber.e("${walletManager?.wallet?.blockchain} does not support TransactionBuilder") + TangemLogger.e("${walletManager?.wallet?.blockchain} does not support TransactionBuilder") error("Wallet manager does not support TransactionPreparer") } return preparer diff --git a/data/txhistory/build.gradle.kts b/data/txhistory/build.gradle.kts index 78b3545254..17ca52c9ce 100644 --- a/data/txhistory/build.gradle.kts +++ b/data/txhistory/build.gradle.kts @@ -29,7 +29,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.androidx.paging.runtime) - implementation(deps.timber) implementation(deps.jodatime) implementation(tangemDeps.blockchain) diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt index 23761f8743..1763c2dd4b 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt @@ -20,9 +20,9 @@ import com.tangem.domain.txhistory.repository.TxHistoryRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.utils.SdkPageConverter import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext -import timber.log.Timber class DefaultTxHistoryRepository( private val cacheRegistry: CacheRegistry, @@ -110,7 +110,7 @@ class DefaultTxHistoryRepository( ) ?.items.orEmpty() } catch (e: Throwable) { - Timber.e(e, "Unable to load the transaction history for the requested page: ${Page.Initial}") + TangemLogger.e("Unable to load the transaction history for the requested page: ${Page.Initial}", e) emptyList() } } diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/RefactoredTxHistoryRepository.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/RefactoredTxHistoryRepository.kt index 972344ad6e..88b9b82391 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/RefactoredTxHistoryRepository.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/RefactoredTxHistoryRepository.kt @@ -16,7 +16,7 @@ import com.tangem.pagination.BatchFetchResult import com.tangem.pagination.BatchListSource import com.tangem.pagination.toBatchFlow import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class RefactoredTxHistoryRepository( private val walletManagersFacade: WalletManagersFacade, @@ -96,16 +96,17 @@ internal class RefactoredTxHistoryRepository( .filterIfTxAlreadyAdded(apiItems = items) return if (recentItems.isEmpty()) { - Timber.d("Nothing to add to TxHistory") + TangemLogger.d("Nothing to add to TxHistory") this } else { - Timber.d( - "Recent transactions were added to TxHistory: %s", - recentItems.joinToString( - prefix = "[", - postfix = "]", - transform = TxInfo::txHash, - ), + TangemLogger.d( + "Recent transactions were added to TxHistory: ${ + recentItems.joinToString( + prefix = "[", + postfix = "]", + transform = TxInfo::txHash, + ) + }", ) return copy(items = recentItems + items) diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/paging/TxHistoryPagingSource.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/paging/TxHistoryPagingSource.kt index 2f67ef406b..c95c0761bb 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/paging/TxHistoryPagingSource.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/paging/TxHistoryPagingSource.kt @@ -11,7 +11,7 @@ import com.tangem.domain.txhistory.models.Page import com.tangem.domain.txhistory.models.PaginationWrapper import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.utils.SdkPageConverter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class TxHistoryPagingSource( private val sourceParams: Params, @@ -44,7 +44,7 @@ internal class TxHistoryPagingSource( } LoadResult.Page(wrappedItems.items, prevKey = null, nextKey = nextKey) } catch (e: Throwable) { - Timber.e(e, "Unable to load the transaction history for the requested page: $pageToLoad") + TangemLogger.e("Unable to load the transaction history for the requested page: $pageToLoad", e) LoadResult.Error(e) } @@ -89,16 +89,17 @@ internal class TxHistoryPagingSource( .filterIfTxAlreadyAdded(apiItems = items) return if (recentItems.isEmpty()) { - Timber.d("Nothing to add to TxHistory") + TangemLogger.d("Nothing to add to TxHistory") this } else { - Timber.d( - "Recent transactions were added to TxHistory: %s", - recentItems.joinToString( - prefix = "[", - postfix = "]", - transform = TxInfo::txHash, - ), + TangemLogger.d( + "Recent transactions were added to TxHistory: ${ + recentItems.joinToString( + prefix = "[", + postfix = "]", + transform = TxInfo::txHash, + ) + }", ) return copy(items = recentItems + items) diff --git a/data/visa/build.gradle.kts b/data/visa/build.gradle.kts index ef2ebc1613..80f1139140 100644 --- a/data/visa/build.gradle.kts +++ b/data/visa/build.gradle.kts @@ -54,7 +54,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.arrow.fx) implementation(deps.jodatime) - implementation(deps.timber) implementation(deps.androidx.paging.runtime) implementation(deps.moshi.kotlin) ksp(deps.moshi.kotlin.codegen) diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt index 505383a099..6a903986b1 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt @@ -11,7 +11,7 @@ import com.tangem.data.pay.util.TangemPayErrorConverter import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject private const val TAG = "TangemPay: DefaultTangemPayCryptoCurrencyFactory" @@ -53,7 +53,7 @@ internal class DefaultTangemPayCryptoCurrencyFactory @Inject constructor( decimals = TOKEN_DECIMALS, ) }.mapLeft { exception -> - Timber.tag(TAG).e(exception) + TangemLogger.withTag(TAG).e("Error", exception) errorConverter.convert(exception) } } diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/flow/DefaultPaymentAccountStatusFetcher.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/flow/DefaultPaymentAccountStatusFetcher.kt index fe1aa3f0bd..7342c3da2a 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/flow/DefaultPaymentAccountStatusFetcher.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/flow/DefaultPaymentAccountStatusFetcher.kt @@ -16,7 +16,7 @@ import com.tangem.domain.visa.error.VisaApiError import com.tangem.security.DeviceSecurityInfoProvider import com.tangem.security.isSecurityExposed import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject private const val TAG = "PaymentAccountStatusFetcher" @@ -31,12 +31,14 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( override suspend fun invoke(params: PaymentAccountStatusFetcher.Params): Either = eitherOn(dispatchers.default) { - Timber.tag(TAG).i("fetch: ${params.userWalletId.stringValue}") + TangemLogger.withTag(TAG).i("fetch: ${params.userWalletId.stringValue}") if (deviceSecurity.isSecurityExposed()) { - Timber.tag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}") - Timber.tag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}") - Timber.tag(TAG).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}") + TangemLogger.withTag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}") + TangemLogger.withTag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}") + TangemLogger.withTag( + TAG, + ).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}") return@eitherOn paymentAccountStatusesStore.store( userWalletId = params.userWalletId, @@ -47,7 +49,9 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( val status = onboardingRepository.hasTangemPayInWallet(userWalletId = params.userWalletId) .fold( ifLeft = { error -> - Timber.tag(TAG).e("Failed check wallet ${params.userWalletId}: ${error.javaClass.simpleName}") + TangemLogger.withTag( + TAG, + ).e("Failed check wallet ${params.userWalletId}: ${error.javaClass.simpleName}") when (error) { is VisaApiError.NotPaeraCustomer -> PaymentAccountStatus.NotCreated else -> PaymentAccountStatus.Error.Unavailable(source = StatusSource.ACTUAL) @@ -57,7 +61,7 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( proceedHasTangemPayResult(userWalletId = params.userWalletId, hasTangemPay = hasTangemPay) }, ) - Timber.tag(TAG).i("invoke status ${params.userWalletId}: $status") + TangemLogger.withTag(TAG).i("invoke status ${params.userWalletId}: $status") paymentAccountStatusesStore.store(userWalletId = params.userWalletId, status = status) } @@ -65,7 +69,7 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( userWalletId: UserWalletId, hasTangemPay: Boolean, ): PaymentAccountStatus { - Timber.tag(TAG).i("proceedHasTangemPayResult for $userWalletId hasTangemPay: $hasTangemPay") + TangemLogger.withTag(TAG).i("proceedHasTangemPayResult for $userWalletId hasTangemPay: $hasTangemPay") return if (hasTangemPay) { fetchTangemPayAccountStatus(userWalletId = userWalletId) } else { @@ -98,15 +102,15 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( private suspend fun proceedWithoutOrder(userWalletId: UserWalletId): PaymentAccountStatus { return onboardingRepository.getCustomerInfo(userWalletId).fold( ifLeft = { error -> - Timber.tag(TAG).e("proceedWithoutOrder $userWalletId error: $error") + TangemLogger.withTag(TAG).e("proceedWithoutOrder $userWalletId error: $error") error.mapToPaymentAccountStatus() }, ifRight = { customerInfo -> - Timber.tag(TAG).i("proceedWithoutOrder data customerInfo $userWalletId") + TangemLogger.withTag(TAG).i("proceedWithoutOrder data customerInfo $userWalletId") val status = customerInfo.mapToPaymentAccountStatus() if (customerInfo.productInstance == null) { onboardingRepository.createOrder(userWalletId) - .onLeft { Timber.tag(TAG).e("createOrder failed: $it") } + .onLeft { TangemLogger.withTag(TAG).e("createOrder failed: $it") } } status }, @@ -116,11 +120,11 @@ internal class DefaultPaymentAccountStatusFetcher @Inject constructor( private suspend fun proceedWithOrderId(userWalletId: UserWalletId, orderId: String): PaymentAccountStatus { return customerOrderRepository.getOrderData(userWalletId, orderId = orderId).fold( ifLeft = { error -> - Timber.tag(TAG).e("proceedWithOrderId $userWalletId orderId: $orderId error: $error") + TangemLogger.withTag(TAG).e("proceedWithOrderId $userWalletId orderId: $orderId error: $error") error.mapToPaymentAccountStatus() }, ifRight = { orderData -> - Timber.tag(TAG).i("proceedWithOrderId $userWalletId: $orderId status: ${orderData.status}") + TangemLogger.withTag(TAG).i("proceedWithOrderId $userWalletId: $orderId status: ${orderData.status}") when (orderData.status) { // Kyc is passed and user waits for order creation -> no need to get customer info OrderStatus.NEW, diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt index 0c0b28df99..2f05b72de7 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt @@ -19,18 +19,21 @@ import com.tangem.datasource.api.pay.models.response.FreezeUnfreezeCardResponse import com.tangem.datasource.api.pay.models.response.OrderResponse.Result.Status import com.tangem.datasource.local.visa.TangemPayCardFrozenStateStore import com.tangem.datasource.local.visa.TangemPayStorage -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.pay.model.SetPinResult import com.tangem.domain.pay.model.TangemPayCardBalance import com.tangem.domain.pay.model.TangemPayCardDetails import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository import com.tangem.domain.visa.model.TangemPayCardFrozenState -import kotlinx.coroutines.* +import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -296,7 +299,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor( cardFrozenStateStore.store(cardId, finalState) } }.onLeft { error -> - Timber.e("error ${error.errorCode}") + TangemLogger.e("error ${error.errorCode}") // stop retrying after 3 errors if (retryCount > MAX_POLLING_RETRIES) { pollingJobs.remove(key = orderId) @@ -305,7 +308,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor( retryCount++ } } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) storePollingMutex.withLock { pollingJobs.remove(orderId) } @@ -338,7 +341,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor( } private fun catchException(throwable: Throwable): Either { - Timber.tag(TAG).e(throwable) + TangemLogger.withTag(TAG).e("Error", throwable) return errorConverter.convert(throwable).left() } diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayWithdrawRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayWithdrawRepository.kt index 555c6c8e32..74512256e4 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayWithdrawRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayWithdrawRepository.kt @@ -24,13 +24,13 @@ import com.tangem.feature.swap.domain.api.SwapRepository import com.tangem.feature.swap.domain.models.ExpressDataError import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.extensions.addHexPrefix +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber import java.math.BigDecimal import java.math.RoundingMode import java.util.Currency @@ -176,14 +176,14 @@ internal class DefaultTangemPayWithdrawRepository @Inject constructor( } } if (attemptCount >= MAX_POLLING_ATTEMPTS) { - Timber.tag(TAG).e("Polling stopped after $attemptCount unsuccessful attempts") + TangemLogger.withTag(TAG).e("Polling stopped after $attemptCount unsuccessful attempts") tangemPayStorage.deleteWithdrawOrder(userWalletId = userWallet.walletId, orderId = orderId) pollingMutex.withLock { pollingJobs.remove(key) } } } catch (exception: CancellationException) { throw exception } catch (exception: Exception) { - Timber.tag(TAG).e(exception) + TangemLogger.withTag(TAG).e("Error", exception) tangemPayStorage.deleteWithdrawOrder(userWalletId = userWallet.walletId, orderId = orderId) pollingMutex.withLock { pollingJobs.remove(key) } } @@ -240,7 +240,7 @@ internal class DefaultTangemPayWithdrawRepository @Inject constructor( } catch (exception: CancellationException) { throw exception } catch (exception: Exception) { - Timber.tag(TAG).e(exception) + TangemLogger.withTag(TAG).e("Error", exception) } } } diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt index 3e83c4ff0d..c29153ce52 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt @@ -17,10 +17,10 @@ import com.tangem.domain.visa.error.VisaApiError import com.tangem.domain.visa.model.TangemPayAuthTokens import com.tangem.domain.visa.model.getAuthHeader import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import timber.log.Timber import java.util.UUID import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject @@ -69,7 +69,7 @@ internal class TangemPayRequestPerformer @Inject constructor( } }, catch = { errorConverter.convert(it).left() }, - ).onLeft { visaApiError -> Timber.tag(TAG).e(visaApiError.toString()) } + ).onLeft { visaApiError -> TangemLogger.withTag(TAG).e(visaApiError.toString()) } } suspend fun getCustomerWalletAddress(userWalletId: UserWalletId): String { @@ -129,7 +129,7 @@ internal class TangemPayRequestPerformer @Inject constructor( idempotencyKey = UUID.randomUUID().toString(), ) }.mapLeft { error -> - Timber.tag(TAG).e("Can not refresh auth tokens: $error") + TangemLogger.withTag(TAG).e("Can not refresh auth tokens: $error") if (error is VisaApiError.ServerUnavailable) error else VisaApiError.RefreshTokenExpired }.onRight { tokens -> tangemPayStorage.storeAuthTokens(customerWalletAddress = customerWalletAddress, tokens = tokens) diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/store/PaymentAccountStatusesStore.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/store/PaymentAccountStatusesStore.kt index 4eec265d04..d42e7623a1 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/store/PaymentAccountStatusesStore.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/store/PaymentAccountStatusesStore.kt @@ -4,15 +4,15 @@ import androidx.datastore.core.DataStore import com.tangem.data.pay.converter.PaymentAccountStatusDMConverter import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.datasource.local.visa.entity.PaymentAccountStatusDM -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.pay.PaymentAccountStatus +import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch -import timber.log.Timber internal typealias WalletIdWithPaymentStatus = Map internal typealias WalletIdWithPaymentStatusDM = Map @@ -39,7 +39,7 @@ internal class PaymentAccountStatusesStore( }, ) } catch (e: Exception) { - Timber.e(e, "Error while loading cached payment account statuses") + TangemLogger.e("Error while loading cached payment account statuses", e) } } } diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/TangemPayTxHistoryItemConverter.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/TangemPayTxHistoryItemConverter.kt index be1d69448d..c75c111c9d 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/TangemPayTxHistoryItemConverter.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/TangemPayTxHistoryItemConverter.kt @@ -7,9 +7,9 @@ import com.tangem.utils.converter.Converter import com.tangem.utils.extensions.isPositive import com.tangem.utils.extensions.isZero import com.tangem.utils.extensions.orZero +import com.tangem.utils.logging.TangemLogger import org.joda.time.DateTime import org.joda.time.DateTimeZone -import timber.log.Timber import java.util.Currency internal class TangemPayTxHistoryItemConverter(moshi: Moshi) : @@ -26,7 +26,7 @@ internal class TangemPayTxHistoryItemConverter(moshi: Moshi) : ?: value.fee?.let { convertFee(id = value.id, fee = it) } ?: value.collateral?.let { convertCollateral(id = value.id, collateral = it) } ?: run { - Timber.wtf("unknown type of transaction: $value") + TangemLogger.e("unknown type of transaction: $value") null } } @@ -82,7 +82,7 @@ internal class TangemPayTxHistoryItemConverter(moshi: Moshi) : collateral: TangemPayTxHistoryResponse.Collateral, ): TangemPayTxHistoryItem.Collateral? { val date = collateral.postedAt ?: return run { - Timber.e("Collateral transaction postedAt is null: $collateral") + TangemLogger.e("Collateral transaction postedAt is null: $collateral") return@run null } return TangemPayTxHistoryItem.Collateral( diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt index 07ebc8a190..df5b49ac6c 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt @@ -7,10 +7,10 @@ import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.visa.model.VisaTxHistoryItem import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.withContext -import timber.log.Timber internal class VisaTxHistoryPagingSource( params: Params, @@ -56,7 +56,7 @@ internal class VisaTxHistoryPagingSource( LoadResult.Page(items, prevOffset, nextOffset) } catch (e: Throwable) { - Timber.e(e, "Unable to load the transaction history for the requested offset: $offsetToLoad") + TangemLogger.e("Unable to load the transaction history for the requested offset: $offsetToLoad", e) LoadResult.Error(e) } } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/initialize/DefaultWcInitializeUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/initialize/DefaultWcInitializeUseCase.kt index b35c96e84d..13522ffe02 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/initialize/DefaultWcInitializeUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/initialize/DefaultWcInitializeUseCase.kt @@ -9,10 +9,10 @@ import com.reown.walletkit.client.WalletKit import com.tangem.data.walletconnect.pair.WcPairSdkDelegate import com.tangem.data.walletconnect.request.DefaultWcRequestService import com.tangem.data.walletconnect.sessions.DefaultWcSessionsManager -import com.tangem.data.walletconnect.utils.WcSdkObserver import com.tangem.data.walletconnect.utils.WC_TAG +import com.tangem.data.walletconnect.utils.WcSdkObserver import com.tangem.domain.walletconnect.usecase.initialize.WcInitializeUseCase -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class DefaultWcInitializeUseCase( private val application: Application, @@ -48,7 +48,7 @@ internal class DefaultWcInitializeUseCase( application = application, metaData = appMetaData, ) { error -> - Timber.tag(WC_TAG).e("Error while initializing client: $error") + TangemLogger.withTag(WC_TAG).e("Error while initializing client: $error") } WalletKit.initialize( @@ -57,10 +57,10 @@ internal class DefaultWcInitializeUseCase( val walletDelegate = defineWalletDelegate() WalletKit.setWalletDelegate(walletDelegate) wcSdkObservers.forEach { it.onWcSdkInit() } - Timber.tag(WC_TAG).i("onWcSdkInit") + TangemLogger.withTag(WC_TAG).i("onWcSdkInit") }, onError = { error -> - Timber.tag(WC_TAG).e("Error while initializing Web3Wallet: $error") + TangemLogger.withTag(WC_TAG).e("Error while initializing Web3Wallet: $error") }, ) } @@ -70,32 +70,32 @@ internal class DefaultWcInitializeUseCase( get() = super.onSessionAuthenticate override fun onConnectionStateChange(state: Wallet.Model.ConnectionState) { - Timber.tag(WC_TAG).i("sdk callback onConnectionStateChange isAvailable=${state.isAvailable}") + TangemLogger.withTag(WC_TAG).i("sdk callback onConnectionStateChange isAvailable=${state.isAvailable}") wcSdkObservers.forEach { it.onConnectionStateChange(state) } } override fun onError(error: Wallet.Model.Error) { - Timber.tag(WC_TAG).e(error.throwable, "sdk callback onError") + TangemLogger.withTag(WC_TAG).e("sdk callback onError", error.throwable) wcSdkObservers.forEach { it.onError(error) } } override fun onProposalExpired(proposal: Wallet.Model.ExpiredProposal) { - Timber.tag(WC_TAG).i("sdk callback onProposalExpired $proposal") + TangemLogger.withTag(WC_TAG).i("sdk callback onProposalExpired $proposal") wcSdkObservers.forEach { it.onProposalExpired(proposal) } } override fun onRequestExpired(request: Wallet.Model.ExpiredRequest) { - Timber.tag(WC_TAG).i("sdk callback onRequestExpired $request") + TangemLogger.withTag(WC_TAG).i("sdk callback onRequestExpired $request") wcSdkObservers.forEach { it.onRequestExpired(request) } } override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) { - Timber.tag(WC_TAG).i("sdk callback onSessionDelete $sessionDelete") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionDelete $sessionDelete") wcSdkObservers.forEach { it.onSessionDelete(sessionDelete) } } override fun onSessionExtend(session: Wallet.Model.Session) { - Timber.tag(WC_TAG).i("sdk callback onSessionExtend $session") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionExtend $session") wcSdkObservers.forEach { it.onSessionExtend(session) } } @@ -103,7 +103,7 @@ internal class DefaultWcInitializeUseCase( sessionProposal: Wallet.Model.SessionProposal, verifyContext: Wallet.Model.VerifyContext, ) { - Timber.tag(WC_TAG).i("sdk callback onSessionProposal $sessionProposal") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionProposal $sessionProposal") wcSdkObservers.forEach { it.onSessionProposal(sessionProposal, verifyContext) } } @@ -111,17 +111,17 @@ internal class DefaultWcInitializeUseCase( sessionRequest: Wallet.Model.SessionRequest, verifyContext: Wallet.Model.VerifyContext, ) { - Timber.tag(WC_TAG).i("sdk callback onSessionRequest $sessionRequest") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionRequest $sessionRequest") wcSdkObservers.forEach { it.onSessionRequest(sessionRequest, verifyContext) } } override fun onSessionSettleResponse(settleSessionResponse: Wallet.Model.SettledSessionResponse) { - Timber.tag(WC_TAG).i("sdk callback onSessionSettleResponse $settleSessionResponse") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionSettleResponse $settleSessionResponse") wcSdkObservers.forEach { it.onSessionSettleResponse(settleSessionResponse) } } override fun onSessionUpdateResponse(sessionUpdateResponse: Wallet.Model.SessionUpdateResponse) { - Timber.tag(WC_TAG).i("sdk callback onSessionUpdateResponse $sessionUpdateResponse") + TangemLogger.withTag(WC_TAG).i("sdk callback onSessionUpdateResponse $sessionUpdateResponse") wcSdkObservers.forEach { it.onSessionUpdateResponse(sessionUpdateResponse) } } } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/SolanaBlockAidAddressConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/SolanaBlockAidAddressConverter.kt index 312d752068..6347e2f390 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/SolanaBlockAidAddressConverter.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/SolanaBlockAidAddressConverter.kt @@ -1,17 +1,17 @@ package com.tangem.data.walletconnect.network.solana import com.tangem.blockchain.extensions.decodeBase58 -import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.blockchain.extensions.encodeBase64NoWrap +import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.utils.converter.Converter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject internal class SolanaBlockAidAddressConverter @Inject constructor() : Converter { override fun convert(value: String): String? { return value.decodeBase58()?.encodeBase64NoWrap() ?: run { - Timber.tag(WC_TAG).e("Error while converting Solana transaction account address") + TangemLogger.withTag(WC_TAG).e("Error while converting Solana transaction account address") null } } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignTransactionUseCase.kt index c0d665b854..157cfaf912 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignTransactionUseCase.kt @@ -22,13 +22,13 @@ import com.tangem.domain.walletconnect.usecase.method.SignRequirements import com.tangem.domain.walletconnect.usecase.method.WcSignState import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase import com.tangem.lib.crypto.BlockchainUtils.SOLANA_TRANSACTION_SIZE_THRESHOLD_BYTES +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import okio.ByteString.Companion.decodeBase64 -import timber.log.Timber @Suppress("LongParameterList") internal class WcSolanaSignTransactionUseCase @AssistedInject constructor( @@ -57,13 +57,13 @@ internal class WcSolanaSignTransactionUseCase @AssistedInject constructor( val formattedHash = getFormattedHash(hash) // uses for flow sendLargeSolanaTransaction if (context.session.wallet is UserWallet.Cold && isLargeHash(formattedHash)) { // workaround for large transactions that cannot be signed directly by card - Timber.w("The transaction hash is too large to be signed directly: ${formattedHash.size} bytes") + TangemLogger.w("The transaction hash is too large to be signed directly: ${formattedHash.size} bytes") sendLargeSolanaTransactionUseCase(context.session.wallet as UserWallet.Cold, context.network, formattedHash) .fold( - ifLeft = { + ifLeft = { error -> analytics.send(SolanaLargeTransactionStatus(SolanaLargeTransactionStatus.Status.Failed)) - Timber.e(it.toString()) - emit(state.toResult(parseSendError(it).left())) + TangemLogger.e(error.toString()) + emit(state.toResult(parseSendError(error).left())) }, ifRight = { analytics.send(SolanaLargeTransactionStatus(SolanaLargeTransactionStatus.Status.Success)) @@ -115,7 +115,7 @@ internal class WcSolanaSignTransactionUseCase @AssistedInject constructor( return try { SolanaTransactionHelper.removeSignaturesPlaceholders(hash) } catch (e: Exception) { - Timber.e("Failed to format the hash: ${e.message}") + TangemLogger.e("Failed to format the hash: ${e.message}") hash } } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt index 78d58bd321..02ce4d738f 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt @@ -16,6 +16,7 @@ import com.tangem.domain.walletconnect.model.* import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData import com.tangem.domain.walletconnect.usecase.pair.WcPairState import com.tangem.domain.walletconnect.usecase.pair.WcPairUseCase +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -24,7 +25,6 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* import org.joda.time.DateTime import org.joda.time.Duration -import timber.log.Timber import java.net.URI @Suppress("LongParameterList") @@ -42,7 +42,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( @Suppress("LongMethod") override operator fun invoke(): Flow { return flow { - Timber.tag(WC_TAG).i("start pair flow $pairRequest") + TangemLogger.withTag(WC_TAG).i("start pair flow $pairRequest") analytics.send( WcAnalyticEvents.NewPairInitiated( source = pairRequest.source, @@ -52,22 +52,22 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( emit(WcPairState.Loading) val pairResult = sdkDelegate.pair(pairRequest.uri) - .onLeft { - Timber.tag(WC_TAG).e(it, "Failed to call pair $pairRequest") + .onLeft { error -> + TangemLogger.withTag(WC_TAG).e("Failed to call pair $pairRequest", error) analytics.send( WcAnalyticEvents.PairFailed( - errorCode = it.code, - errorMessage = it.message, + errorCode = error.code, + errorMessage = error.message, ), ) - emit(WcPairState.Error(it)) + emit(WcPairState.Error(error)) } .getOrNull() ?: return@flow val (sdkSessionProposal, sdkVerifyContext) = pairResult // check unsupported dApps, just local constant for now, finish if unsupported if (UnsupportedDApps.list.any { sdkSessionProposal.url.contains(it, ignoreCase = true) }) { - Timber.tag(WC_TAG).i("Unsupported DApp ${sdkSessionProposal.name}") + TangemLogger.withTag(WC_TAG).i("Unsupported DApp ${sdkSessionProposal.name}") val error = WcPairState.Error(WcPairError.UnsupportedDApp(sdkSessionProposal.name)) emit(error) return@flow @@ -93,7 +93,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( emit(proposalState) // wait first terminal action and continue WC pair flow - Timber.tag(WC_TAG).i("pair wait terminal action ${sdkSessionProposal.name}") + TangemLogger.withTag(WC_TAG).i("pair wait terminal action ${sdkSessionProposal.name}") val terminalAction = onCallTerminalAction.receiveAsFlow().first() val sessionForApprove: WcSessionApprove? = when (terminalAction) { is TerminalAction.Approve -> terminalAction.sessionForApprove @@ -139,30 +139,30 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( ), ) proposalState.dAppSession.dAppMetaData - }.onLeft { + }.onLeft { error -> analytics.send( WcAnalyticEvents.DAppConnectionFailed( - errorCode = it.code, - errorMessage = it.message, + errorCode = error.code, + errorMessage = error.message, ), ) sdkDelegate.rejectSession(sdkSessionProposal.proposerPublicKey) - Timber.tag(WC_TAG).e(it, "Failed to approve session ${sdkSessionProposal.name}") + TangemLogger.withTag(WC_TAG).e("Failed to approve session ${sdkSessionProposal.name}", error) } emit(WcPairState.Approving.Result(sessionForApprove, either)) } - .catch { - val pairError: WcPairError = when (it) { - is TimeoutCancellationException -> WcPairError.TimeoutException(it.message.orEmpty()) - else -> WcPairError.Unknown(it.message.orEmpty()) + .catch { throwable -> + val pairError: WcPairError = when (throwable) { + is TimeoutCancellationException -> WcPairError.TimeoutException(throwable.message.orEmpty()) + else -> WcPairError.Unknown(throwable.message.orEmpty()) } emit(WcPairState.Error(pairError)) } - .onCompletion { - if (it != null) { - Timber.tag(WC_TAG).e(it, "Completed with error $pairRequest") + .onCompletion { throwable -> + if (throwable != null) { + TangemLogger.withTag(WC_TAG).e("Completed with error $pairRequest", throwable) } else { - Timber.tag(WC_TAG).i("Completed successfully $pairRequest") + TangemLogger.withTag(WC_TAG).i("Completed successfully $pairRequest") } } } @@ -191,7 +191,7 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( ) sdkDelegate.approve(pendingSessionForSave, sessionApprove) } catch (e: Throwable) { - Timber.tag(WC_TAG).e(e, "Failed to sdk approve session $pairRequest") + TangemLogger.withTag(WC_TAG).e("Failed to sdk approve session $pairRequest", e) WcPairError.ApprovalFailed(e.message.orEmpty()).left() } @@ -203,8 +203,8 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( val verificationInfo = when { verifyContext.validation == Wallet.Model.Validation.INVALID -> CheckDAppResult.UNSAFE verifyContext.isScam == true -> CheckDAppResult.UNSAFE - else -> blockAidVerifier.verifyDApp(DAppData(sessionProposal.url)).getOrElse { - Timber.tag(WC_TAG).e(it, "Failed to verify DApp ${sessionProposal.name}") + else -> blockAidVerifier.verifyDApp(DAppData(sessionProposal.url)).getOrElse { error -> + TangemLogger.withTag(WC_TAG).e("Failed to verify DApp ${sessionProposal.name}", error) CheckDAppResult.FAILED_TO_VERIFY } } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/WcPairSdkDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/WcPairSdkDelegate.kt index 926afee1d3..a747091d4a 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/WcPairSdkDelegate.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/WcPairSdkDelegate.kt @@ -7,17 +7,17 @@ import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.WalletKit import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.data.walletconnect.utils.WcSdkObserver -import com.tangem.datasource.local.walletconnect.WalletConnectStore import com.tangem.data.walletconnect.utils.getDappOriginUrl +import com.tangem.datasource.local.walletconnect.WalletConnectStore import com.tangem.domain.walletconnect.model.WcPairError import com.tangem.domain.walletconnect.model.WcPairError.ApprovalFailed import com.tangem.domain.walletconnect.model.WcPendingApprovalSessionDTO import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.* -import timber.log.Timber import kotlin.coroutines.resume import kotlin.time.Duration.Companion.seconds @@ -91,7 +91,7 @@ internal class WcPairSdkDelegate( } fun rejectSession(proposerPublicKey: String) { - Timber.tag(WC_TAG).i("reject session proposerPublicKey = $proposerPublicKey") + TangemLogger.withTag(WC_TAG).i("reject session proposerPublicKey = $proposerPublicKey") WalletKit.rejectSession( params = Wallet.Params.SessionReject( proposerPublicKey = proposerPublicKey, diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt index b2393fe07f..130530c326 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt @@ -9,10 +9,10 @@ import com.tangem.data.walletconnect.utils.getDappOriginUrl import com.tangem.domain.walletconnect.WcRequestService import com.tangem.domain.walletconnect.model.WcMethodName import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* import org.joda.time.DateTime -import timber.log.Timber internal class DefaultWcRequestService( private val requestConverters: Set, @@ -35,10 +35,10 @@ internal class DefaultWcRequestService( sessionRequest = sessionRequest, ), ) - Timber.tag(WC_TAG).i("handle request $sr") + TangemLogger.withTag(WC_TAG).i("handle request $sr") val name = requestConverters.firstNotNullOfOrNull { it.toWcMethodName(sr) } ?: WcMethodName.Unsupported(sr.request.method) - Timber.tag(WC_TAG).i("handle request name $name") + TangemLogger.withTag(WC_TAG).i("handle request name $name") if (name is WcMethodName.Unsupported) { respondService.rejectRequestNonBlock(sr) if (name.raw.startsWith("wallet_")) return @@ -56,7 +56,7 @@ internal class DefaultWcRequestService( val noHaveCached = cachedRequest.none { (_, hashParams) -> hash == hashParams } if (!noHaveCached) { - Timber.tag(WC_TAG).i("filter request $request") + TangemLogger.withTag(WC_TAG).i("filter request $request") } return noHaveCached } diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt index 9745a0f84f..41caf2afe1 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt @@ -13,7 +13,7 @@ import com.tangem.domain.walletconnect.model.WcMethod import com.tangem.domain.walletconnect.model.WcRequestError.Companion.code import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject internal class DefaultWcRequestUseCaseFactory @Inject constructor( @@ -32,9 +32,9 @@ internal class DefaultWcRequestUseCaseFactory @Inject constructor( ?: HandleMethodError.UnknownError("Failed to create WcUseCase").left() val result = useCase.fold( - ifLeft = { - Timber.tag(WC_TAG).e("$it") - it.left() + ifLeft = { methodError -> + TangemLogger.withTag(WC_TAG).e("$methodError") + methodError.left() }, ifRight = { (it as? T)?.right() ?: HandleMethodError.Unsupported(WcMethod.Unsupported(request)).left() }, ) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/respond/DefaultWcRespondService.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/respond/DefaultWcRespondService.kt index ca0bc550dd..fdb3bf7bb1 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/respond/DefaultWcRespondService.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/respond/DefaultWcRespondService.kt @@ -10,11 +10,11 @@ import com.tangem.common.extensions.toHexString import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.domain.walletconnect.model.WcRequestError import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.suspendCancellableCoroutine import org.joda.time.Duration -import timber.log.Timber import kotlin.coroutines.resume internal class DefaultWcRespondService : WcRespondService { @@ -36,21 +36,21 @@ internal class DefaultWcRespondService : WcRespondService { result = response, ), ), - onSuccess = { + onSuccess = { requestResponse -> if (continuation.isCompleted) return@respondSessionRequest - val result = when (val response = it.jsonRpcResponse) { + val result = when (val response = requestResponse.jsonRpcResponse) { is Wallet.Model.JsonRpcResponse.JsonRpcError -> { - Timber.tag(WC_TAG).e("Failed respond $response for request $request") + TangemLogger.withTag(WC_TAG).e("Failed respond $response for request $request") WcRequestError.WcRespondError( code = response.code, message = response.message, ).left() } is Wallet.Model.JsonRpcResponse.JsonRpcResult -> { - Timber.tag(WC_TAG).i("Successful respond $response for request $request") + TangemLogger.withTag(WC_TAG).i("Successful respond $response for request $request") if (response.result == null) { - Timber.tag(WC_TAG).e( - "Response result is null, but it should be String. Casted to empty", + TangemLogger.withTag(WC_TAG).e( + "Response result is null, but requestResponse should be String. Casted to empty", ) } (response.result ?: "").right() @@ -58,16 +58,16 @@ internal class DefaultWcRespondService : WcRespondService { } continuation.resume(result) }, - onError = { + onError = { error -> if (continuation.isCompleted) return@respondSessionRequest - Timber.tag(WC_TAG).e(it.throwable, "Failed respond for request $request") - continuation.resume(WcRequestError.UnknownError(it.throwable).left()) + TangemLogger.withTag(WC_TAG).e("Failed respond for request $request", error.throwable) + continuation.resume(WcRequestError.UnknownError(error.throwable).left()) }, ) } override fun rejectRequestNonBlock(request: WcSdkSessionRequest, message: String) { - Timber.tag(WC_TAG).i("reject request $request") + TangemLogger.withTag(WC_TAG).i("reject request $request") removeCachedRequest(request) WalletKit.respondSessionRequest( params = Wallet.Params.SessionRequestResponse( diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt index d27195854e..c6fed93088 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt @@ -23,13 +23,13 @@ import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext -import timber.log.Timber import kotlin.coroutines.resume @Suppress("LongParameterList") @@ -91,7 +91,7 @@ internal class DefaultWcSessionsManager( } override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) { - Timber.i("onSessionDelete: $sessionDelete") + TangemLogger.i("onSessionDelete: $sessionDelete") onSessionDelete.trySend(sessionDelete) } @@ -150,7 +150,7 @@ internal class DefaultWcSessionsManager( val haveSomeUnknownSdkSessions = unknownSdkSessions.isNotEmpty() if (haveSomeUnknown) { - Timber.tag(WC_TAG).i("removeUnknownSessions $unknownStoredSessions") + TangemLogger.withTag(WC_TAG).i("removeUnknownSessions $unknownStoredSessions") store.removeSessions(unknownStoredSessions.toSet()) } @@ -162,7 +162,7 @@ internal class DefaultWcSessionsManager( val haveEmptyDto = emptyNetworksDto.isNotEmpty() if (haveEmptyDto) { - Timber.tag(WC_TAG).i("remove sessions without networks $emptyNetworksDto") + TangemLogger.withTag(WC_TAG).i("remove sessions without networks $emptyNetworksDto") store.removeSessions(emptyNetworksDto) } if (haveEmptySessions) { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt index 8bc9a0c492..f0d71c240c 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt @@ -11,8 +11,8 @@ import com.tangem.domain.walletconnect.model.WcMethod import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.WcSolanaMethod import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.flow -import timber.log.Timber import javax.inject.Inject internal class BlockAidVerificationDelegate @Inject constructor( @@ -72,9 +72,9 @@ internal class BlockAidVerificationDelegate @Inject constructor( params = params, ), ).fold( - ifLeft = { - Timber.e("Failed to verify transaction: ${it.localizedMessage}") - emit(Lce.Error(it)) + ifLeft = { throwable -> + TangemLogger.e("Failed to verify transaction: ${throwable.localizedMessage}") + emit(Lce.Error(throwable)) }, ifRight = { emit(Lce.Content(it)) diff --git a/data/wallet-manager/build.gradle.kts b/data/wallet-manager/build.gradle.kts index e703847de0..ace6ee7b8a 100644 --- a/data/wallet-manager/build.gradle.kts +++ b/data/wallet-manager/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { implementation(projects.libs.blockchainSdk) implementation(deps.androidx.datastore) implementation(deps.arrow.core) - implementation(deps.timber) /** Testing libraries */ testRuntimeOnly(deps.test.junit5.engine) diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt index 5791e4e9e0..68f31b8849 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt @@ -49,11 +49,11 @@ import com.tangem.domain.walletmanager.model.TokenInfo import com.tangem.domain.walletmanager.utils.SdkPageConverter import com.tangem.domain.wallets.extension.hasDerivation import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import timber.log.Timber import java.math.BigDecimal import java.util.EnumSet import java.util.concurrent.ConcurrentHashMap @@ -178,13 +178,13 @@ internal class DefaultWalletManagersFacade @Inject constructor( if (derivationPath != null && !userWallet.hasDerivation(blockchain, derivationPath) ) { - Timber.w("Derivation missed for: $blockchain") + TangemLogger.w("Derivation missed for: $blockchain") return UpdateWalletManagerResult.MissedDerivation } val walletManager = getOrCreateWalletManager(userWalletId, blockchain, derivationPath) if (walletManager == null || blockchain == Blockchain.Unknown) { - Timber.w("Unable to get a wallet manager for blockchain: $blockchain") + TangemLogger.w("Unable to get a wallet manager for blockchain: $blockchain") return UpdateWalletManagerResult.Unreachable() } @@ -285,7 +285,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( val gaslessFeeAddresses = try { gaslessTransactionRepository.getGaslessFeeAddresses() } catch (error: Throwable) { - Timber.e(error, "Failed to load gasless fee addresses; falling back to empty set") + TangemLogger.e("Failed to load gasless fee addresses; falling back to empty set", error) emptySet() } return when (itemsResult) { @@ -311,7 +311,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( extraTokens: Set, ): UpdateWalletManagerResult { if (derivationPath != null && !userWallet.hasDerivation(blockchain, derivationPath)) { - Timber.w("Derivation missed for: $blockchain") + TangemLogger.w("Derivation missed for: $blockchain") return UpdateWalletManagerResult.MissedDerivation } @@ -321,7 +321,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( derivationPath = derivationPath, ) if (walletManager == null || blockchain == Blockchain.Unknown) { - Timber.w("Unable to create or find a wallet manager for blockchain: $blockchain") + TangemLogger.w("Unable to create or find a wallet manager for blockchain: $blockchain") return UpdateWalletManagerResult.Unreachable() } @@ -360,7 +360,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( amountToCreateAccount = e.amountToCreateAccount, ) } catch (e: Throwable) { - Timber.w(e, "Unable to update a wallet manager for: ${walletManager.wallet.blockchain}") + TangemLogger.w("Unable to update a wallet manager for: ${walletManager.wallet.blockchain}", e) resultFactory.getUnreachableResult(walletManager) } @@ -376,7 +376,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( amountToCreateAccount = e.amountToCreateAccount, ) } catch (e: Throwable) { - Timber.w(e, "Unable to update a wallet manager for: ${walletManager.wallet.blockchain}") + TangemLogger.w("Unable to update a wallet manager for: ${walletManager.wallet.blockchain}", e) resultFactory.getUnreachableResult(walletManager) } @@ -584,7 +584,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( val walletManager = getOrCreateWalletManager(userWalletId = userWalletId, network = currency.network) if (walletManager == null) { - Timber.e("Unable to get a wallet manager for blockchain: ${currency.network.id}") + TangemLogger.e("Unable to get a wallet manager for blockchain: ${currency.network.id}") return emptyList() } diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt index a8d65edb01..c1ab2fb300 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/UpdateWalletManagerResultFactory.kt @@ -8,7 +8,7 @@ import com.tangem.data.walletmanager.utils.SdkAddressToAddressConverter import com.tangem.data.walletmanager.utils.TransactionDataToTxHistoryItemConverter import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.yield.supply.YieldSupplyStatus -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal /** Factory for creating [UpdateWalletManagerResult] */ @@ -68,7 +68,7 @@ internal class UpdateWalletManagerResultFactory { val amount = amountToCreateAccount ?: blockchain.amountToCreateAccount(walletManager, firstWalletToken) return if (amount == null) { - Timber.w("Unable to get required amount to create account for: $blockchain") + TangemLogger.w("Unable to get required amount to create account for: $blockchain") UpdateWalletManagerResult.Unreachable( selectedAddress = wallet.address, addresses = getAvailableAddresses(wallet.addresses), @@ -142,7 +142,7 @@ internal class UpdateWalletManagerResultFactory { val value = amount.value if (value == null) { - Timber.w("Currency amount must not be null: ${amount.currencySymbol}") + TangemLogger.w("Currency amount must not be null: ${amount.currencySymbol}") } return value diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/WalletManagerFactory.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/WalletManagerFactory.kt index edd6da8af5..e4b9650c5d 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/WalletManagerFactory.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/WalletManagerFactory.kt @@ -7,12 +7,12 @@ import com.tangem.blockchainsdk.BlockchainSDKFactory import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.data.walletmanager.extensions.makePublicKey import com.tangem.data.walletmanager.extensions.makeWalletManagerForApp -import com.tangem.domain.wallets.derivations.DerivationStyleProvider import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.config.curvesConfig +import com.tangem.domain.wallets.derivations.DerivationStyleProvider import com.tangem.domain.wallets.derivations.derivationStyleProvider -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class WalletManagerFactory( private val blockchainSDKFactory: BlockchainSDKFactory, @@ -32,7 +32,7 @@ internal class WalletManagerFactory( derivationParams = derivationParams, ) } catch (e: Throwable) { - Timber.w(e, "Failed to create wallet manager for $blockchain") + TangemLogger.w("Failed to create wallet manager for $blockchain", e) null } } @@ -68,7 +68,7 @@ internal class WalletManagerFactory( ) } } catch (e: Throwable) { - Timber.w(e, "Failed to create wallet manager for $blockchain") + TangemLogger.w("Failed to create wallet manager for $blockchain", e) null } } diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/utils/TransactionDataToTxHistoryItemConverter.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/utils/TransactionDataToTxHistoryItemConverter.kt index 36016b121b..1247fce030 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/utils/TransactionDataToTxHistoryItemConverter.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/utils/TransactionDataToTxHistoryItemConverter.kt @@ -11,7 +11,7 @@ import com.tangem.blockchain.yieldsupply.providers.ethereum.yield.EthereumYieldS import com.tangem.blockchainsdk.models.UpdateWalletManagerResult.Address import com.tangem.domain.models.network.TxInfo import com.tangem.utils.converter.Converter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal /** @@ -55,7 +55,7 @@ internal class TransactionDataToTxHistoryItemConverter( val value = amount.value if (value == null) { - Timber.w("Transaction amount must not be null: ${amount.currencySymbol}") + TangemLogger.w("Transaction amount must not be null: ${amount.currencySymbol}") } return when (feePaidCurrency) { diff --git a/data/wallets/build.gradle.kts b/data/wallets/build.gradle.kts index 512c474032..19a6351a4c 100644 --- a/data/wallets/build.gradle.kts +++ b/data/wallets/build.gradle.kts @@ -48,7 +48,6 @@ dependencies { implementation(deps.moshi) implementation(deps.moshi.kotlin) implementation(deps.retrofit) - implementation(deps.timber) /** tests */ testImplementation(projects.test.core) diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsPromoRepository.kt b/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsPromoRepository.kt index e5fb0f7e81..22b82c3fb7 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsPromoRepository.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsPromoRepository.kt @@ -14,8 +14,8 @@ import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.wallets.models.AppsFlyerConversionData import com.tangem.domain.wallets.repository.WalletsPromoRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber internal class DefaultWalletsPromoRepository( private val appPreferencesStore: AppPreferencesStore, @@ -47,7 +47,7 @@ internal class DefaultWalletsPromoRepository( if (savedBindingData != null) { bind(refcode = savedBindingData.refcode, campaign = savedBindingData.campaign) } else { - Timber.i("retryBindRefcodeWithWallets: Binding data isn't required") + TangemLogger.i("retryBindRefcodeWithWallets: Binding data isn't required") } } diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/cold/DefaultColdMapDerivationsRepository.kt b/data/wallets/src/main/java/com/tangem/data/wallets/cold/DefaultColdMapDerivationsRepository.kt index e00bde14e5..f3305bfb5e 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/cold/DefaultColdMapDerivationsRepository.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/cold/DefaultColdMapDerivationsRepository.kt @@ -20,8 +20,8 @@ import com.tangem.domain.wallets.usecase.BackendId import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.sdk.api.TangemSdkManager import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import javax.inject.Inject private typealias DerivedKeys = Map @@ -60,14 +60,14 @@ internal class DefaultColdMapDerivationsRepository @Inject constructor( networks: List, ): UserWallet.Cold = withContext(dispatchers.io) { if (!userWallet.scanResponse.card.settings.isHDWalletAllowed) { - Timber.d("Nothing to derive") + TangemLogger.d("Nothing to derive") return@withContext userWallet } val derivations = MissedDerivationsFinder(userWallet) .findByNetworks(networks) .ifEmpty { - Timber.d("Nothing to derive") + TangemLogger.d("Nothing to derive") return@withContext userWallet } diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/derivations/DefaultDerivationsRepository.kt b/data/wallets/src/main/java/com/tangem/data/wallets/derivations/DefaultDerivationsRepository.kt index 534b16cb36..c347bb1e54 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/derivations/DefaultDerivationsRepository.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/derivations/DefaultDerivationsRepository.kt @@ -16,8 +16,8 @@ import com.tangem.domain.wallets.derivations.HotMapDerivationsRepository import com.tangem.domain.wallets.usecase.BackendId import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import javax.inject.Inject internal class DefaultDerivationsRepository @Inject constructor( @@ -29,7 +29,7 @@ internal class DefaultDerivationsRepository @Inject constructor( override suspend fun derivePublicKeys(userWalletId: UserWalletId, currencies: List) { if (currencies.isEmpty()) { - Timber.d("Nothing to derive") + TangemLogger.d("Nothing to derive") return } diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/hot/DefaultHotMapDerivationsRepository.kt b/data/wallets/src/main/java/com/tangem/data/wallets/hot/DefaultHotMapDerivationsRepository.kt index 8d0f7ec5d1..bcf3ef947c 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/hot/DefaultHotMapDerivationsRepository.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/hot/DefaultHotMapDerivationsRepository.kt @@ -19,8 +19,8 @@ import com.tangem.domain.wallets.usecase.BackendId import com.tangem.hot.sdk.model.DeriveWalletRequest import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import javax.inject.Inject internal class DefaultHotMapDerivationsRepository @Inject constructor( @@ -62,7 +62,7 @@ internal class DefaultHotMapDerivationsRepository @Inject constructor( val derivations = MissedDerivationsFinder(userWallet) .findByNetworks(networks) .ifEmpty { - Timber.d("Nothing to derive") + TangemLogger.d("Nothing to derive") return@withContext userWallet } diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/hot/TangemHotWalletSigner.kt b/data/wallets/src/main/java/com/tangem/data/wallets/hot/TangemHotWalletSigner.kt index 58df536d84..0e21f98e12 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/hot/TangemHotWalletSigner.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/hot/TangemHotWalletSigner.kt @@ -9,10 +9,10 @@ import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.hot.HotWalletAccessor import com.tangem.hot.sdk.model.DataToSign import com.tangem.operations.sign.SignData +import com.tangem.utils.logging.TangemLogger import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import timber.log.Timber class TangemHotWalletSigner @AssistedInject constructor( @Assisted private val userWallet: UserWallet.Hot, @@ -43,12 +43,12 @@ class TangemHotWalletSigner @AssistedInject constructor( ), ), ) - }.getOrElse { - Timber.e(it) - return if (it is TangemSdkError) { - CompletionResult.Failure(it) + }.getOrElse { throwable -> + TangemLogger.e("Error", throwable) + return if (throwable is TangemSdkError) { + CompletionResult.Failure(throwable) } else { - CompletionResult.Failure(TangemSdkError.ExceptionError(it)) + CompletionResult.Failure(TangemSdkError.ExceptionError(throwable)) } } @@ -76,12 +76,12 @@ class TangemHotWalletSigner @AssistedInject constructor( ) }, ) - }.getOrElse { - Timber.e(it) - return if (it is TangemSdkError) { - CompletionResult.Failure(it) + }.getOrElse { throwable -> + TangemLogger.e("Error", throwable) + return if (throwable is TangemSdkError) { + CompletionResult.Failure(throwable) } else { - CompletionResult.Failure(TangemSdkError.ExceptionError(it)) + CompletionResult.Failure(TangemSdkError.ExceptionError(throwable)) } } diff --git a/data/yield-supply/build.gradle.kts b/data/yield-supply/build.gradle.kts index cc7313cd67..d5edaba7cd 100644 --- a/data/yield-supply/build.gradle.kts +++ b/data/yield-supply/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { kapt(deps.hilt.kapt) /** Other */ - implementation(deps.timber) /** tests */ testImplementation(projects.common.test) diff --git a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt index c761bd1160..19f06ecd0f 100644 --- a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt +++ b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt @@ -18,8 +18,8 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.yield.supply.YieldSupplyTransactionRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.orZero +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.withContext -import timber.log.Timber import java.math.BigDecimal @Suppress("LargeClass") @@ -109,7 +109,7 @@ internal class DefaultYieldSupplyTransactionRepository( decimals = cryptoCurrency.decimals, ), ) - }.onFailure(Timber::e).getOrThrow() + }.onFailure { TangemLogger.e("Error", it) }.getOrThrow() } @Suppress("LongParameterList") @@ -202,7 +202,7 @@ internal class DefaultYieldSupplyTransactionRepository( derivationPath = cryptoCurrency.network.derivationPath.value, ) ?: error("Wallet manager not found") walletManager.calculateYieldModuleAddress() - }.onFailure(Timber::e).getOrThrow() + }.onFailure { TangemLogger.e("Error", it) }.getOrThrow() } override suspend fun getYieldContractAddress(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): String? = @@ -215,7 +215,7 @@ internal class DefaultYieldSupplyTransactionRepository( derivationPath = cryptoCurrency.network.derivationPath.value, ) ?: error("Wallet manager not found") walletManager.getYieldModuleAddress() - }.onFailure(Timber::e).getOrThrow() + }.onFailure { TangemLogger.e("Error", it) }.getOrThrow() } private suspend fun getYieldTokenStatus( @@ -249,7 +249,7 @@ internal class DefaultYieldSupplyTransactionRepository( isAllowedToSpend = isAllowedToSpend, effectiveProtocolBalance = protocolBalance, ) - }.onFailure(Timber::e).getOrNull() + }.onFailure { TangemLogger.e("Error", it) }.getOrNull() } private fun createDeployTransaction( diff --git a/domain/account/status/build.gradle.kts b/domain/account/status/build.gradle.kts index d22d8549d9..7c6c759fa8 100644 --- a/domain/account/status/build.gradle.kts +++ b/domain/account/status/build.gradle.kts @@ -33,11 +33,10 @@ dependencies { implementation(projects.libs.blockchainSdk) implementation(projects.libs.crypto) + implementation(projects.core.utils) implementation(deps.kotlin.datetime) implementation(deps.kotlin.serialization) - implementation(deps.timber) - implementation(deps.kermit) implementation(tangemDeps.blockchain) diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultFlowProducerTools.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultFlowProducerTools.kt index e42901b839..1b49f91932 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultFlowProducerTools.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultFlowProducerTools.kt @@ -1,12 +1,12 @@ package com.tangem.domain.account.status.producer -import co.touchlab.kermit.Logger import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.domain.core.flow.FlowProducer import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import javax.inject.Inject @@ -55,7 +55,7 @@ class DefaultFlowProducerTools @Inject constructor( private fun logError(cause: Throwable, flowProducerName: String, attempt: Long) { val tag = "FlowProducerRetryWhen" - Logger.withTag(tag) + TangemLogger.withTag(tag) .e("flowProducerName $flowProducerName attempt $attempt", cause) val event = ExceptionAnalyticsEvent( diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ApplyTokenListSortingUseCase.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ApplyTokenListSortingUseCase.kt index 55e21d936c..6b0553047f 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ApplyTokenListSortingUseCase.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ApplyTokenListSortingUseCase.kt @@ -14,8 +14,8 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.tokens.error.TokenListSortingError import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.coroutineScope -import timber.log.Timber private typealias SortingErrorByAccountId = MutableMap @@ -68,7 +68,7 @@ class ApplyTokenListSortingUseCase( maybeSortedAccountList.toEitherNeg() .onLeft { errorByAccountId -> - Timber.e( + TangemLogger.e( """ Unable to sort tokens for accounts: ${ errorByAccountId.entries.joinToString { "${it.key.value}: ${it.value}" } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt index 71bf409b07..4043b8821f 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt @@ -20,7 +20,7 @@ import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.networks.multi.MultiNetworkStatusProducer import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -130,7 +130,7 @@ class GetAccountCurrencyByAddressUseCase( } return value ?: run { - Timber.d(message()) + TangemLogger.d(message()) raise(None) } } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ManageCryptoCurrenciesUseCase.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ManageCryptoCurrenciesUseCase.kt index 5bb104ed00..e9656e1601 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ManageCryptoCurrenciesUseCase.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/ManageCryptoCurrenciesUseCase.kt @@ -8,7 +8,6 @@ import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier import com.tangem.domain.account.status.utils.CryptoCurrencyBalanceFetcher import com.tangem.domain.account.status.utils.CryptoCurrencyMetadataCleaner -import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.domain.core.utils.eitherOn import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.models.ExpressAsset @@ -22,10 +21,14 @@ import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.derivations.DerivationsRepository +import com.tangem.utils.coroutines.AppCoroutineScope import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runSuspendCatching -import kotlinx.coroutines.* -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * Use case for saving crypto currencies to a specific account. @@ -77,7 +80,7 @@ class ManageCryptoCurrenciesUseCase( skipDerivationErrors: Boolean = true, ): Either = eitherOn(dispatchers.default) { if (add.isEmpty() && remove.isEmpty()) { - Timber.d("No currencies to add or remove, skipping") + TangemLogger.d("No currencies to add or remove, skipping") return@eitherOn } @@ -89,7 +92,7 @@ class ManageCryptoCurrenciesUseCase( .modify(add = add, remove = remove) if (!modifiedCurrencyList.hasChanges) { - Timber.d("No changes in currencies, skipping") + TangemLogger.d("No changes in currencies, skipping") return@withContext } @@ -279,7 +282,7 @@ class ManageCryptoCurrenciesUseCase( createWalletManagers(userWalletId = userWalletId, currencies = modifiedCurrencyList.added) runSuspendCatching { accountsCRUDRepository.syncTokens(userWalletId) } - .onFailure { Timber.e(it, "Failed to sync tokens for wallet $userWalletId") } + .onFailure { TangemLogger.e("Failed to sync tokens for wallet $userWalletId", it) } } /** @@ -296,7 +299,7 @@ class ManageCryptoCurrenciesUseCase( runSuspendCatching { walletManagersFacade.getOrCreateWalletManager(userWalletId = userWalletId, network = network) } - .onFailure { Timber.e(it, "Failed to create wallet manager for network ${network.id}") } + .onFailure { TangemLogger.e("Failed to create wallet manager for network ${network.id}", it) } } } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyBalanceFetcher.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyBalanceFetcher.kt index bb277d0707..b0d767f38a 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyBalanceFetcher.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyBalanceFetcher.kt @@ -5,11 +5,11 @@ import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.tokens.BalanceFetchingOperations import com.tangem.domain.tokens.FetchErrorFormatter import com.tangem.domain.tokens.FetchingSource +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap /** @@ -87,7 +87,7 @@ class CryptoCurrencyBalanceFetcher( ) if (errors.isNotEmpty()) { - Timber.e(FetchErrorFormatter.format(userWalletId, errors)) + TangemLogger.e(FetchErrorFormatter.format(userWalletId, errors)) } } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyOperations.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyOperations.kt index 63ff52a802..6acd7e70de 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyOperations.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/utils/CryptoCurrencyOperations.kt @@ -11,7 +11,7 @@ import com.tangem.domain.account.status.utils.AccountCryptoCurrencyStatusFinder. import com.tangem.domain.models.account.Account import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Extension functions for retrieving [CryptoCurrency] from an [AccountList] or [Account.CryptoPortfolio]. @@ -57,7 +57,7 @@ object CryptoCurrencyOperations { val currencyId = catch( block = { CryptoCurrency.ID.fromValue(currencyIdValue) }, catch = { throwable -> - Timber.e("Error on converting currencyId: $throwable") + TangemLogger.e("Error on converting currencyId: $throwable") raise(None) }, ) diff --git a/domain/card/build.gradle.kts b/domain/card/build.gradle.kts index a7eff175d4..44e17e2ce6 100644 --- a/domain/card/build.gradle.kts +++ b/domain/card/build.gradle.kts @@ -23,8 +23,8 @@ dependencies { implementation(projects.domain.tokens.models) implementation(projects.domain.wallets.models) implementation(projects.domain.visa.models) + implementation(projects.core.utils) - implementation(deps.timber) implementation(tangemDeps.card.core) implementation(tangemDeps.blockchain) { diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/EdSingleCurrencyCardConfig.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/EdSingleCurrencyCardConfig.kt index 37ee742b77..f21ad15983 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/EdSingleCurrencyCardConfig.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/EdSingleCurrencyCardConfig.kt @@ -2,7 +2,7 @@ package com.tangem.domain.card.configs import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger object EdSingleCurrencyCardConfig : CardConfig { @@ -14,7 +14,7 @@ object EdSingleCurrencyCardConfig : CardConfig { EllipticCurve.Ed25519 } else -> { - Timber.e("Unsupported blockchain, curve not found") + TangemLogger.e("Unsupported blockchain, curve not found") null } } diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/GenericCardConfig.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/GenericCardConfig.kt index 099c93ed10..eb9870b4f6 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/GenericCardConfig.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/GenericCardConfig.kt @@ -2,7 +2,7 @@ package com.tangem.domain.card.configs import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger class GenericCardConfig(maxWalletCount: Int) : CardConfig { @@ -25,7 +25,7 @@ class GenericCardConfig(maxWalletCount: Int) : CardConfig { EllipticCurve.Ed25519 } else -> { - Timber.e("Unsupported blockchain, curve not found") + TangemLogger.e("Unsupported blockchain, curve not found") null } } diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/MultiWalletCardConfig.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/MultiWalletCardConfig.kt index 8e661fffee..5ce2718892 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/MultiWalletCardConfig.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/MultiWalletCardConfig.kt @@ -2,7 +2,7 @@ package com.tangem.domain.card.configs import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger object MultiWalletCardConfig : CardConfig { override val mandatoryCurves: List @@ -27,7 +27,7 @@ object MultiWalletCardConfig : CardConfig { EllipticCurve.Bls12381G2Aug } else -> { - Timber.e("Unsupported blockchain, curve not found") + TangemLogger.e("Unsupported blockchain, curve not found") null } } diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/Wallet2CardConfig.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/Wallet2CardConfig.kt index 0c4ba1c0b0..a545214f6f 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/configs/Wallet2CardConfig.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/configs/Wallet2CardConfig.kt @@ -2,7 +2,7 @@ package com.tangem.domain.card.configs import com.tangem.blockchain.common.Blockchain import com.tangem.common.card.EllipticCurve -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger data object Wallet2CardConfig : CardConfig { override val mandatoryCurves: List @@ -37,14 +37,14 @@ data object Wallet2CardConfig : CardConfig { // EllipticCurve.Ed25519 // } // else -> { - // Timber.e("Unsupported blockchain, curve not found") + // TangemLogger.e("Unsupported blockchain, curve not found") // null // } // } val curve = getPrimaryCurveForBlockchain(blockchain) // check curve supports if (!blockchain.getSupportedCurves().contains(curve)) { - Timber.e("Unsupported curve $curve for blockchain $blockchain") + TangemLogger.e("Unsupported curve $curve for blockchain $blockchain") return null } return curve diff --git a/domain/legacy/build.gradle.kts b/domain/legacy/build.gradle.kts index 1326610ec7..6d09dae413 100644 --- a/domain/legacy/build.gradle.kts +++ b/domain/legacy/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { implementation(deps.moshi) implementation(deps.moshi.kotlin) implementation(deps.reKotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) /** Testing libraries */ diff --git a/domain/staking/build.gradle.kts b/domain/staking/build.gradle.kts index 7cf130837a..587e19d32d 100644 --- a/domain/staking/build.gradle.kts +++ b/domain/staking/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { implementation(deps.kotlin.datetime) implementation(deps.kotlin.serialization) implementation(deps.jodatime) - implementation(deps.timber) implementation(projects.domain.legacy) implementation(projects.domain.walletManager) // TODO refactor to use from data module diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleStakingBalanceProducer.kt b/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleStakingBalanceProducer.kt index dc87e3b8ed..3a41d1eee8 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleStakingBalanceProducer.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/single/SingleStakingBalanceProducer.kt @@ -7,7 +7,7 @@ import com.tangem.domain.models.staking.StakingBalance import com.tangem.domain.models.staking.StakingID import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.extensions.indexOfFirstOrNull -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Producer of staking balance for selected wallet [UserWalletId] @@ -51,9 +51,8 @@ interface SingleStakingBalanceProducer : FlowProducer { ), ) - Timber.e( - "Multiple balances found for staking ID $currentStakingId:\n%s", - currentBalances.joinToString("\n"), + TangemLogger.e( + "Multiple balances found for staking ID $currentStakingId:\n${currentBalances.joinToString("\n")}", ) val dataIndex = currentBalances.indexOfFirstOrNull { it is StakingBalance.Data } @@ -66,7 +65,7 @@ interface SingleStakingBalanceProducer : FlowProducer { } else { val balance = currentBalances.firstOrNull() ?: return null - Timber.i("Staking balance found for $currentStakingId:\n$balance") + TangemLogger.i("Staking balance found for $currentStakingId:\n$balance") balance } } diff --git a/domain/tokens/build.gradle.kts b/domain/tokens/build.gradle.kts index 52ba7c414e..236ce7785f 100644 --- a/domain/tokens/build.gradle.kts +++ b/domain/tokens/build.gradle.kts @@ -53,7 +53,6 @@ dependencies { /** Android - Other */ implementation(deps.androidx.paging.runtime) - implementation(deps.timber) /** Utils */ implementation(deps.jodatime) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/BalanceFetchingOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/BalanceFetchingOperations.kt index 96df850a31..9538efb817 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/BalanceFetchingOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/BalanceFetchingOperations.kt @@ -8,10 +8,10 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher import com.tangem.domain.staking.StakingIdFactory import com.tangem.domain.staking.multi.MultiStakingBalanceFetcher +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope -import timber.log.Timber /** * Shared utility for fetching cryptocurrency balance data from multiple sources. @@ -116,14 +116,14 @@ class BalanceFetchingOperations( val stakingId = stakingIdFactory.create(userWalletId = userWalletId, cryptoCurrency = currency) if (stakingId.isLeft { it is StakingIdFactory.Error.UnableToGetAddress }) { - Timber.e("Unable to get staking ID for user wallet $userWalletId and currency ${currency.id}") + TangemLogger.e("Unable to get staking ID for user wallet $userWalletId and currency ${currency.id}") } stakingId.getOrNull() } if (stakingIds.isEmpty()) { - Timber.i("No staking IDs found for user wallet $userWalletId") + TangemLogger.i("No staking IDs found for user wallet $userWalletId") return Unit.right() } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt index afb0384174..27a9af10ba 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt @@ -26,10 +26,10 @@ import com.tangem.domain.tokens.wallet.implementor.MultiWalletBalanceFetcher import com.tangem.domain.tokens.wallet.implementor.SingleWalletBalanceFetcher import com.tangem.domain.tokens.wallet.implementor.SingleWalletWithTokenBalanceFetcher import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope -import timber.log.Timber /** * Fetcher of wallet balance by [UserWalletId] @@ -184,7 +184,7 @@ class WalletBalanceFetcher internal constructor( check(errors.isEmpty()) { val message = FetchErrorFormatter.formatWalletErrors(userWalletId, errors) - Timber.e(message) + TangemLogger.e(message) message } } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/implementor/MultiWalletBalanceFetcher.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/implementor/MultiWalletBalanceFetcher.kt index e7f95702ce..4bbf8f3557 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/implementor/MultiWalletBalanceFetcher.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/implementor/MultiWalletBalanceFetcher.kt @@ -2,14 +2,14 @@ package com.tangem.domain.tokens.wallet.implementor import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.tokens.FetchingSource import com.tangem.domain.tokens.MultiWalletAccountListFetcher import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesProducer import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier -import com.tangem.domain.tokens.FetchingSource import com.tangem.domain.tokens.wallet.BaseWalletBalanceFetcher import com.tangem.domain.tokens.wallet.WalletFetchingSource +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.firstOrNull -import timber.log.Timber /** * Implementation of [BaseWalletBalanceFetcher] for MULTI-CURRENCY wallet @@ -37,7 +37,7 @@ internal class MultiWalletBalanceFetcher( multiWalletAccountListFetcher( params = MultiWalletAccountListFetcher.Params(userWalletId = userWalletId), ) - .onLeft(Timber::e) + .onLeft { TangemLogger.e("Error", it) } return multiWalletCryptoCurrenciesSupplier( params = MultiWalletCryptoCurrenciesProducer.Params(userWalletId = userWalletId), diff --git a/domain/tokensync/build.gradle.kts b/domain/tokensync/build.gradle.kts index bdf6721531..35464995f3 100644 --- a/domain/tokensync/build.gradle.kts +++ b/domain/tokensync/build.gradle.kts @@ -16,5 +16,4 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.arrow.core) - implementation(deps.timber) } \ No newline at end of file diff --git a/domain/tokensync/src/main/java/com/tangem/domain/tokensync/usecase/SyncTokensUseCase.kt b/domain/tokensync/src/main/java/com/tangem/domain/tokensync/usecase/SyncTokensUseCase.kt index d3f8fb0c31..ddf41c5794 100644 --- a/domain/tokensync/src/main/java/com/tangem/domain/tokensync/usecase/SyncTokensUseCase.kt +++ b/domain/tokensync/src/main/java/com/tangem/domain/tokensync/usecase/SyncTokensUseCase.kt @@ -6,9 +6,9 @@ import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.tokensync.repository.TokenSyncRepository import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap class SyncTokensUseCase( @@ -26,7 +26,7 @@ class SyncTokensUseCase( tokenSyncRepository.runSync(userWalletId) applyDiscoveredTokens(userWalletId) } catch (e: Exception) { - Timber.e(e, "Token sync failed for wallet: $userWalletId") + TangemLogger.e("Token sync failed for wallet: $userWalletId", e) } finally { activeSyncJobs.remove(userWalletId) } @@ -50,7 +50,7 @@ class SyncTokensUseCase( } } } catch (e: Exception) { - Timber.e(e, "Failed to apply pending syncs") + TangemLogger.e("Failed to apply pending syncs", e) } } } @@ -70,7 +70,7 @@ class SyncTokensUseCase( true }, ifLeft = { error -> - Timber.e("Failed to apply discovered tokens for wallet: $userWalletId, error: $error") + TangemLogger.e("Failed to apply discovered tokens for wallet: $userWalletId, error: $error") false }, ) diff --git a/domain/visa/build.gradle.kts b/domain/visa/build.gradle.kts index 3c13ebe644..ec2d1affc7 100644 --- a/domain/visa/build.gradle.kts +++ b/domain/visa/build.gradle.kts @@ -29,7 +29,6 @@ dependencies { implementation(deps.spongecastle.core) /** Libs - Other */ - implementation(deps.timber) implementation(deps.jodatime) implementation(deps.androidx.paging.runtime) implementation(deps.moshi) diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt index da2687589a..511457acb6 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt @@ -12,8 +12,8 @@ import com.tangem.domain.pay.repository.OnboardingRepository import com.tangem.domain.visa.error.VisaApiError import com.tangem.security.DeviceSecurityInfoProvider import com.tangem.security.isSecurityExposed +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.* -import timber.log.Timber private const val TAG = "TangemPayMainScreenCustomerInfoUseCase" @@ -28,12 +28,14 @@ class TangemPayMainScreenCustomerInfoUseCase( field = MutableStateFlow(value = mapOf()) suspend fun fetch(userWalletId: UserWalletId) { - Timber.tag(TAG).i("fetch: ${userWalletId.stringValue}") + TangemLogger.withTag(TAG).i("fetch: ${userWalletId.stringValue}") if (deviceSecurity.isSecurityExposed()) { - Timber.tag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}") - Timber.tag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}") - Timber.tag(TAG).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}") + TangemLogger.withTag(TAG).i("fetch security info: rooted: ${deviceSecurity.isRooted}") + TangemLogger.withTag(TAG).i("fetch security info: xposed: ${deviceSecurity.isXposed}") + TangemLogger.withTag( + TAG, + ).i("fetch security info: bootloader unlocked: ${deviceSecurity.isBootloaderUnlocked}") updateState(userWalletId = userWalletId, either = TangemPayCustomerInfoError.ExposedDeviceError.left()) return // fast exit @@ -42,7 +44,9 @@ class TangemPayMainScreenCustomerInfoUseCase( onboardingRepository.hasTangemPayInWallet(userWalletId) .fold( ifLeft = { error -> - Timber.tag(TAG).e("Failed checkCustomerWallet for $userWalletId: ${error.javaClass.simpleName}") + TangemLogger.withTag( + TAG, + ).e("Failed checkCustomerWallet for $userWalletId: ${error.javaClass.simpleName}") if (error is VisaApiError.NotPaeraCustomer) { showOnboardingBannerIfEligible(userWalletId) } else { @@ -50,7 +54,7 @@ class TangemPayMainScreenCustomerInfoUseCase( } }, ifRight = { hasTangemPay -> - Timber.tag(TAG).i("checkCustomerWallet for $userWalletId: $hasTangemPay") + TangemLogger.withTag(TAG).i("checkCustomerWallet for $userWalletId: $hasTangemPay") if (hasTangemPay) { val oldResult = state.value[userWalletId] if (oldResult == null) { @@ -125,14 +129,13 @@ class TangemPayMainScreenCustomerInfoUseCase( ): Either { return onboardingRepository.getCustomerInfo(userWalletId) .mapLeft { error -> - Timber.tag(TAG).e("mapErrorForCustomer: $error") + TangemLogger.withTag(TAG).e("mapErrorForCustomer: $error") error.mapErrorForCustomer() } .map { customerInfo -> - Timber.tag(TAG).i("customerInfo") + TangemLogger.withTag(TAG).i("customerInfo") if (customerInfo.productInstance == null) { onboardingRepository.createOrder(userWalletId) - Timber.tag("ddk9499").d("TangemPayMainScreenCustomerInfoUseCase.proceedWithoutOrder: ") MainScreenCustomerInfo(info = customerInfo, orderStatus = OrderStatus.NEW) } else { MainScreenCustomerInfo(info = customerInfo, orderStatus = OrderStatus.COMPLETED) diff --git a/domain/wallets/build.gradle.kts b/domain/wallets/build.gradle.kts index 47d5fd6e1c..4d61929513 100644 --- a/domain/wallets/build.gradle.kts +++ b/domain/wallets/build.gradle.kts @@ -52,7 +52,6 @@ dependencies { /** Other libraries */ implementation(platform(deps.firebase.bom)) implementation(deps.firebase.analytics) - implementation(deps.timber) // region DI implementation(deps.hilt.android) diff --git a/domain/wallets/models/build.gradle.kts b/domain/wallets/models/build.gradle.kts index 1af28af669..83c2d1f222 100644 --- a/domain/wallets/models/build.gradle.kts +++ b/domain/wallets/models/build.gradle.kts @@ -12,13 +12,14 @@ dependencies { // endregion // region Domain modules - implementation(project(":domain:models")) + implementation(projects.domain.models) // endregion + implementation(projects.core.utils) + // region Other libraries implementation(deps.kotlin.serialization) implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) // endregion } \ No newline at end of file diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SyncWalletWithRemoteUseCase.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SyncWalletWithRemoteUseCase.kt index 1f111425fc..063dd3380d 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SyncWalletWithRemoteUseCase.kt +++ b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/SyncWalletWithRemoteUseCase.kt @@ -3,7 +3,7 @@ package com.tangem.domain.wallets.usecase import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.utils.coroutines.runSuspendCatching -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Use case to sync wallet with remote @@ -16,6 +16,6 @@ class SyncWalletWithRemoteUseCase( suspend operator fun invoke(userWalletId: UserWalletId) { runSuspendCatching { walletsRepository.createWallet(userWalletId) } - .onFailure(Timber::e) + .onFailure { TangemLogger.e("Error", it) } } } \ No newline at end of file diff --git a/domain/yield-supply/build.gradle.kts b/domain/yield-supply/build.gradle.kts index e8a423d566..ea83aa3225 100644 --- a/domain/yield-supply/build.gradle.kts +++ b/domain/yield-supply/build.gradle.kts @@ -15,6 +15,7 @@ tasks.withType().configureEach { dependencies { /** Core */ implementation(projects.core.ui) + implementation(projects.core.utils) /** Domain */ implementation(projects.domain.account.status) @@ -34,7 +35,6 @@ dependencies { /** Other */ implementation(deps.arrow.core) - implementation(deps.timber) /** tests */ testImplementation(projects.common.test) diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyEstimateEnterFeeUseCase.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyEstimateEnterFeeUseCase.kt index 9a9da874ed..71f832affc 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyEstimateEnterFeeUseCase.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyEstimateEnterFeeUseCase.kt @@ -14,7 +14,7 @@ import com.tangem.domain.yield.supply.INCREASE_GAS_LIMIT_FOR_SUPPLY import com.tangem.domain.yield.supply.fixFee import com.tangem.domain.yield.supply.increaseGasLimitBy import com.tangem.utils.extensions.isSingleItem -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger class YieldSupplyEstimateEnterFeeUseCase( private val feeRepository: FeeRepository, @@ -65,7 +65,7 @@ class YieldSupplyEstimateEnterFeeUseCase( val estimatedFees = blockAidGasEstimate.getGasEstimation( cryptoCurrency = cryptoCurrency, transactionDataList = transactionDataList, - ).onLeft(Timber::e).getOrNull() ?: return null + ).onLeft { TangemLogger.e("Error", it) }.getOrNull() ?: return null if (estimatedFees.estimatedGasList.isEmpty()) return null diff --git a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyPendingTracker.kt b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyPendingTracker.kt index 8693bae476..9b202cc6ed 100644 --- a/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyPendingTracker.kt +++ b/domain/yield-supply/src/main/java/com/tangem/domain/yield/supply/usecase/YieldSupplyPendingTracker.kt @@ -4,14 +4,15 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.networks.single.SingleNetworkStatusFetcher import com.tangem.domain.yield.supply.YieldSupplyRepository +import com.tangem.domain.yield.supply.usecase.YieldSupplyPendingTracker.Companion.CHECK_INTERVAL_MS import com.tangem.utils.coroutines.AppCoroutineScope +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber import java.util.concurrent.ConcurrentHashMap /** @@ -73,7 +74,7 @@ class YieldSupplyPendingTracker( try { checkAllTracked() } catch (ex: Exception) { - Timber.e(ex) + TangemLogger.e("Error", ex) } } } diff --git a/features/account/impl/build.gradle.kts b/features/account/impl/build.gradle.kts index b6439a01c3..1c4ab8d7a1 100644 --- a/features/account/impl/build.gradle.kts +++ b/features/account/impl/build.gradle.kts @@ -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 */ diff --git a/features/account/impl/src/main/java/com/tangem/features/account/archived/ArchivedAccountListModel.kt b/features/account/impl/src/main/java/com/tangem/features/account/archived/ArchivedAccountListModel.kt index cde8aabbcb..57ca6f87e6 100644 --- a/features/account/impl/src/main/java/com/tangem/features/account/archived/ArchivedAccountListModel.kt +++ b/features/account/impl/src/main/java/com/tangem/features/account/archived/ArchivedAccountListModel.kt @@ -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 = emptyMap()) { val exception = IllegalStateException(error.toString()) - Timber.e(exception) + TangemLogger.e("Error", exception) analyticsExceptionHandler.sendException( event = ExceptionAnalyticsEvent(exception = exception, params = params), diff --git a/features/account/impl/src/main/java/com/tangem/features/account/archived/entity/AccountArchivedUMBuilder.kt b/features/account/impl/src/main/java/com/tangem/features/account/archived/entity/AccountArchivedUMBuilder.kt index 737b5f6e86..2c64642433 100644 --- a/features/account/impl/src/main/java/com/tangem/features/account/archived/entity/AccountArchivedUMBuilder.kt +++ b/features/account/impl/src/main/java/com/tangem/features/account/archived/entity/AccountArchivedUMBuilder.kt @@ -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() }, diff --git a/features/account/impl/src/main/java/com/tangem/features/account/createedit/AccountCreateEditModel.kt b/features/account/impl/src/main/java/com/tangem/features/account/createedit/AccountCreateEditModel.kt index 5ef205ef80..50a4eaf8b6 100644 --- a/features/account/impl/src/main/java/com/tangem/features/account/createedit/AccountCreateEditModel.kt +++ b/features/account/impl/src/main/java/com/tangem/features/account/createedit/AccountCreateEditModel.kt @@ -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 = emptyMap()) { val exception = IllegalStateException(error.toString()) - Timber.e(exception) + TangemLogger.e("Error", exception) analyticsExceptionHandler.sendException( event = ExceptionAnalyticsEvent(exception = exception, params = params), diff --git a/features/approval/impl/build.gradle.kts b/features/approval/impl/build.gradle.kts index e15b2662cd..2e43f87aee 100644 --- a/features/approval/impl/build.gradle.kts +++ b/features/approval/impl/build.gradle.kts @@ -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) diff --git a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt index 87882d24ce..3d328cc6bf 100644 --- a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt +++ b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt @@ -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 = { diff --git a/features/biometry/impl/build.gradle.kts b/features/biometry/impl/build.gradle.kts index def97bf1f3..075c304c23 100644 --- a/features/biometry/impl/build.gradle.kts +++ b/features/biometry/impl/build.gradle.kts @@ -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) diff --git a/features/biometry/impl/src/main/kotlin/com/tangem/features/biometry/impl/model/AskBiometryModel.kt b/features/biometry/impl/src/main/kotlin/com/tangem/features/biometry/impl/model/AskBiometryModel.kt index 78cd72167e..116d0fd053 100644 --- a/features/biometry/impl/src/main/kotlin/com/tangem/features/biometry/impl/model/AskBiometryModel.kt +++ b/features/biometry/impl/src/main/kotlin/com/tangem/features/biometry/impl/model/AskBiometryModel.kt @@ -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")), ) diff --git a/features/create-wallet-selection/impl/build.gradle.kts b/features/create-wallet-selection/impl/build.gradle.kts index 458b4b5048..8fd9175d79 100644 --- a/features/create-wallet-selection/impl/build.gradle.kts +++ b/features/create-wallet-selection/impl/build.gradle.kts @@ -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 */ diff --git a/features/create-wallet-start/impl/build.gradle.kts b/features/create-wallet-start/impl/build.gradle.kts index 1578c1916f..c280d4160c 100644 --- a/features/create-wallet-start/impl/build.gradle.kts +++ b/features/create-wallet-start/impl/build.gradle.kts @@ -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 */ diff --git a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt index ac00b3703e..4a864f1ca9 100644 --- a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt +++ b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt @@ -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) } } diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index 19d925cad1..742988403b 100644 --- a/features/details/impl/build.gradle.kts +++ b/features/details/impl/build.gradle.kts @@ -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) } \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt index fb9104d96e..a4d4c58b0a 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt @@ -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 } diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/UserWalletListModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/UserWalletListModel.kt index 44af704d49..5c00ab323d 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/UserWalletListModel.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/UserWalletListModel.kt @@ -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") } } } diff --git a/features/disclaimer/impl/build.gradle.kts b/features/disclaimer/impl/build.gradle.kts index 7c72408c05..58d95cba7f 100644 --- a/features/disclaimer/impl/build.gradle.kts +++ b/features/disclaimer/impl/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { /** Other dependencies */ implementation(deps.arrow.core) - implementation(deps.timber) /** DI */ implementation(deps.hilt.android) diff --git a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerWebViewClient.kt b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerWebViewClient.kt index 5265f434bf..110e0ae876 100644 --- a/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerWebViewClient.kt +++ b/features/disclaimer/impl/src/main/java/com/tangem/features/disclaimer/impl/ui/DisclaimerWebViewClient.kt @@ -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 diff --git a/features/feed/impl/build.gradle.kts b/features/feed/impl/build.gradle.kts index 95ac903999..2e076661b9 100644 --- a/features/feed/impl/build.gradle.kts +++ b/features/feed/impl/build.gradle.kts @@ -75,7 +75,6 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(deps.decompose.ext.compose) /* Core */ diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt index 0d733ab09f..ce12bfc05a 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt @@ -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) diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioPreselectedDataModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioPreselectedDataModel.kt index 79ca66cf2b..60acc73b60 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioPreselectedDataModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioPreselectedDataModel.kt @@ -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) diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/CheckCurrencyUnsupportedDelegate.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/CheckCurrencyUnsupportedDelegate.kt index feb3025f69..8b32b2497b 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/CheckCurrencyUnsupportedDelegate.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/CheckCurrencyUnsupportedDelegate.kt @@ -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( diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultMarketsTokenDetailDeepLinkHandler.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultMarketsTokenDetailDeepLinkHandler.kt index 3ef3be6ce2..89c501508c 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultMarketsTokenDetailDeepLinkHandler.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultMarketsTokenDetailDeepLinkHandler.kt @@ -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 } diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultNewsDetailsDeepLinkHandler.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultNewsDetailsDeepLinkHandler.kt index 8409d68360..0419dfe414 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultNewsDetailsDeepLinkHandler.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/deeplink/DefaultNewsDetailsDeepLinkHandler.kt @@ -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 diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/utils/LoggingUtils.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/utils/LoggingUtils.kt index 03579058d8..d3ba6deb04 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/utils/LoggingUtils.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/utils/LoggingUtils.kt @@ -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>) { - Timber.tag(tag).d( + TangemLogger.withTag(tag).d( """ Status $status @@ -19,19 +19,19 @@ internal fun logStatus(tag: String, status: PaginationStatus>) internal fun logAction(tag: String, action: BatchAction) { 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} diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt index 63cc26391a..bdd662e7f2 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt @@ -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) { diff --git a/features/home/impl/build.gradle.kts b/features/home/impl/build.gradle.kts index bd620457d9..afa7941725 100644 --- a/features/home/impl/build.gradle.kts +++ b/features/home/impl/build.gradle.kts @@ -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) diff --git a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt index 7cb91f3880..63a48788e4 100644 --- a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt +++ b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt @@ -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) } } diff --git a/features/hot-wallet/impl/build.gradle.kts b/features/hot-wallet/impl/build.gradle.kts index 380b51678e..37c0ca6773 100644 --- a/features/hot-wallet/impl/build.gradle.kts +++ b/features/hot-wallet/impl/build.gradle.kts @@ -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 */ diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/accesscoderequest/HotAccessCodeRequestModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/accesscoderequest/HotAccessCodeRequestModel.kt index 1a2cb122b6..f23c52ad2f 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/accesscoderequest/HotAccessCodeRequestModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/accesscoderequest/HotAccessCodeRequestModel.kt @@ -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 } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt index e2d4d75a14..eb4f297ea2 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/im/port/model/AddExistingWalletImportModel.kt @@ -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) } } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt index 49c8bc6351..d3e5315e41 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt @@ -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) } } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt index dad097a1fb..a5c4e17316 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt @@ -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) } } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/forgetwallet/ForgetWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/forgetwallet/ForgetWalletModel.kt index a4d9c89ffb..872ba5c072 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/forgetwallet/ForgetWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/forgetwallet/ForgetWalletModel.kt @@ -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)), diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/check/model/ManualBackupCheckModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/check/model/ManualBackupCheckModel.kt index b68069c4fe..3006348ca2 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/check/model/ManualBackupCheckModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/check/model/ManualBackupCheckModel.kt @@ -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) diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/phrase/model/ManualBackupPhraseModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/phrase/model/ManualBackupPhraseModel.kt index abb3ea0654..f4c716ed2b 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/phrase/model/ManualBackupPhraseModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/phrase/model/ManualBackupPhraseModel.kt @@ -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) } } } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/viewphrase/model/ViewPhraseModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/viewphrase/model/ViewPhraseModel.kt index 808f1df0b6..eb373c4429 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/viewphrase/model/ViewPhraseModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/viewphrase/model/ViewPhraseModel.kt @@ -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 { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt index 7c284f9cef..32986a6549 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt @@ -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)) diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt index c432ac4cc1..d7a12e7a10 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt @@ -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)) diff --git a/features/kyc/impl/build.gradle.kts b/features/kyc/impl/build.gradle.kts index 1bf8fc66f2..f51dea8c7d 100644 --- a/features/kyc/impl/build.gradle.kts +++ b/features/kyc/impl/build.gradle.kts @@ -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) diff --git a/features/kyc/impl/src/main/kotlin/com/tangem/features/kyc/DefaultKycModel.kt b/features/kyc/impl/src/main/kotlin/com/tangem/features/kyc/DefaultKycModel.kt index f729fe489c..d181f971dc 100644 --- a/features/kyc/impl/src/main/kotlin/com/tangem/features/kyc/DefaultKycModel.kt +++ b/features/kyc/impl/src/main/kotlin/com/tangem/features/kyc/DefaultKycModel.kt @@ -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) } } } diff --git a/features/manage-tokens/impl/build.gradle.kts b/features/manage-tokens/impl/build.gradle.kts index 4a0329dcad..867d3f035c 100644 --- a/features/manage-tokens/impl/build.gradle.kts +++ b/features/manage-tokens/impl/build.gradle.kts @@ -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 } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt index 43fbc9472f..1d6522b7b1 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt @@ -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( diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt index 5418e2b7b1..e62d320665 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/CustomTokenFormModel.kt @@ -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 } } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt index 960347fc65..2c10b94d72 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt @@ -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 } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt index 02a234043f..4010fb57e9 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt @@ -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 } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt index 698d65bd5b..d62b31c3e5 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt @@ -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 diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/CustomTokenFormUseCasesFacade.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/CustomTokenFormUseCasesFacade.kt index ea253fd2d2..96cc6f1e8a 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/CustomTokenFormUseCasesFacade.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/CustomTokenFormUseCasesFacade.kt @@ -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 { diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt index 6265318696..7020d8874f 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt @@ -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( diff --git a/features/markets/impl/build.gradle.kts b/features/markets/impl/build.gradle.kts index 86304b9fd5..bc76460d54 100644 --- a/features/markets/impl/build.gradle.kts +++ b/features/markets/impl/build.gradle.kts @@ -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) diff --git a/features/nft/impl/build.gradle.kts b/features/nft/impl/build.gradle.kts index 693be634b3..7db2bdc36d 100644 --- a/features/nft/impl/build.gradle.kts +++ b/features/nft/impl/build.gradle.kts @@ -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 */ diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt index 2f6f77b6c7..13fc9173de 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt @@ -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) } } diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt index e47a5fca31..4a91c998a3 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt @@ -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 diff --git a/features/onboarding-v2/impl/build.gradle.kts b/features/onboarding-v2/impl/build.gradle.kts index a992e7daea..917e123120 100644 --- a/features/onboarding-v2/impl/build.gradle.kts +++ b/features/onboarding-v2/impl/build.gradle.kts @@ -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) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt index b1893158d7..924382dc55 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt @@ -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 } diff --git a/features/onramp/impl/build.gradle.kts b/features/onramp/impl/build.gradle.kts index fcab39bc50..4c6b3a90a3 100644 --- a/features/onramp/impl/build.gradle.kts +++ b/features/onramp/impl/build.gradle.kts @@ -82,5 +82,4 @@ dependencies { implementation(deps.decompose.ext.compose) implementation(deps.kotlin.immutable.collections) implementation(deps.reKotlin) - implementation(deps.timber) } \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt index 5b0c5748d3..89dd1d8ecf 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt @@ -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) } } } \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyDeepLinkHandler.kt index 5633cf6424..4210dfcdc6 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyDeepLinkHandler.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyDeepLinkHandler.kt @@ -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)) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultOnrampDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultOnrampDeepLinkHandler.kt index 035c32ef13..ff2e4d0a3e 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultOnrampDeepLinkHandler.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultOnrampDeepLinkHandler.kt @@ -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 diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt index ee38f9501a..eb25b50f21 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt @@ -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)) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt index 7fff8ef48c..584aadf822 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt @@ -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)) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/model/HotCryptoModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/model/HotCryptoModel.kt index bf19ec5d37..cf1badae14 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/model/HotCryptoModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/model/HotCryptoModel.kt @@ -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) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/portfolio/model/OnrampAddToPortfolioModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/portfolio/model/OnrampAddToPortfolioModel.kt index 9863a66e16..cb33ca61de 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/portfolio/model/OnrampAddToPortfolioModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/hottokens/portfolio/model/OnrampAddToPortfolioModel.kt @@ -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) } } diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt index b72f54919d..63d3cce362 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt @@ -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) } } diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/model/SelectProviderModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/model/SelectProviderModel.kt index 95cab56383..ec8ba318be 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/model/SelectProviderModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/providers/model/SelectProviderModel.kt @@ -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()) } } } diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/model/OnrampRedirectModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/model/OnrampRedirectModel.kt index a550929c72..1540f81f69 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/model/OnrampRedirectModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/model/OnrampRedirectModel.kt @@ -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, diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt index 3fc7167dfc..dbae3fb93d 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt @@ -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 -> diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/entity/SwapSelectTokensController.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/entity/SwapSelectTokensController.kt index 616f0761c4..8adcb4725d 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/entity/SwapSelectTokensController.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/entity/SwapSelectTokensController.kt @@ -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) } } \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/entity/TokenListUMController.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/entity/TokenListUMController.kt index 5fb7287648..d2cb9c3ef3 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/entity/TokenListUMController.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/tokenlist/entity/TokenListUMController.kt @@ -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), diff --git a/features/promo-banners/impl/build.gradle.kts b/features/promo-banners/impl/build.gradle.kts index a93ef194f0..d90d0e2f70 100644 --- a/features/promo-banners/impl/build.gradle.kts +++ b/features/promo-banners/impl/build.gradle.kts @@ -36,7 +36,6 @@ dependencies { /** Other */ implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) /** DI */ implementation(deps.hilt.android) diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt index 3187d8e91c..5c596f3fd4 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt @@ -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, ) } } diff --git a/features/push-notifications/impl/build.gradle.kts b/features/push-notifications/impl/build.gradle.kts index e8a673832e..1765878318 100644 --- a/features/push-notifications/impl/build.gradle.kts +++ b/features/push-notifications/impl/build.gradle.kts @@ -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) diff --git a/features/qr-scanning/impl/build.gradle.kts b/features/qr-scanning/impl/build.gradle.kts index 5e1a8a4c8f..9c92b28a75 100644 --- a/features/qr-scanning/impl/build.gradle.kts +++ b/features/qr-scanning/impl/build.gradle.kts @@ -60,6 +60,5 @@ dependencies { /** Other dependencies */ implementation(deps.arrow.core) - implementation(deps.timber) implementation(tangemDeps.card.core) } \ No newline at end of file diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/DefaultQrScanningComponent.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/DefaultQrScanningComponent.kt index 8ee7c7ea48..adf60baa52 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/DefaultQrScanningComponent.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/DefaultQrScanningComponent.kt @@ -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) } } } diff --git a/features/referral/domain/build.gradle.kts b/features/referral/domain/build.gradle.kts index 3604d3a6be..e9ab3a55d8 100644 --- a/features/referral/domain/build.gradle.kts +++ b/features/referral/domain/build.gradle.kts @@ -35,7 +35,6 @@ dependencies { /** Dependencies */ implementation(deps.arrow.core) implementation(deps.jodatime) - implementation(deps.timber) implementation(tangemDeps.card.core) /** DI */ diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt index 5e67063fe0..3dac39dddb 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt @@ -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 } diff --git a/features/referral/impl/build.gradle.kts b/features/referral/impl/build.gradle.kts index 1ced33e61d..8f23358f8f 100644 --- a/features/referral/impl/build.gradle.kts +++ b/features/referral/impl/build.gradle.kts @@ -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) diff --git a/features/referral/impl/src/main/java/com/tangem/feature/referral/deeplink/DefaultReferralDeepLinkHandler.kt b/features/referral/impl/src/main/java/com/tangem/feature/referral/deeplink/DefaultReferralDeepLinkHandler.kt index cd54552b79..ce206c8140 100644 --- a/features/referral/impl/src/main/java/com/tangem/feature/referral/deeplink/DefaultReferralDeepLinkHandler.kt +++ b/features/referral/impl/src/main/java/com/tangem/feature/referral/deeplink/DefaultReferralDeepLinkHandler.kt @@ -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()) { diff --git a/features/send-v2/impl/build.gradle.kts b/features/send-v2/impl/build.gradle.kts index 66e97a0ebc..81c2490591 100644 --- a/features/send-v2/impl/build.gradle.kts +++ b/features/send-v2/impl/build.gradle.kts @@ -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 */ diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt index 71f276e7e4..dec24258e2 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt @@ -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 diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/model/FeeSelectorLogic.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/model/FeeSelectorLogic.kt index 836b3534d5..ac7220cf8e 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/model/FeeSelectorLogic.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/model/FeeSelectorLogic.kt @@ -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) } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index 710868cdef..4c9a5154ca 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -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) } } } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt index d6bbf30296..49db195ff3 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt @@ -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 }, diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt index 084f793b58..b0a07a0db9 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt @@ -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, diff --git a/features/staking/impl/build.gradle.kts b/features/staking/impl/build.gradle.kts index 72ddfd69ee..f2d9d8b1cf 100644 --- a/features/staking/impl/build.gradle.kts +++ b/features/staking/impl/build.gradle.kts @@ -23,7 +23,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.lifecycle.compose) implementation(deps.jodatime) - implementation(deps.timber) implementation(deps.moshi) /** Compose */ diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/deeplink/DefaultStakingDeepLinkHandler.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/deeplink/DefaultStakingDeepLinkHandler.kt index 9c90294738..c861dfb887 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/deeplink/DefaultStakingDeepLinkHandler.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/deeplink/DefaultStakingDeepLinkHandler.kt @@ -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 } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt index 27bf32458e..a45bcd44b5 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt @@ -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 } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakeKitTransactionSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakeKitTransactionSender.kt index c0e37364e6..ca9f4e5992 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakeKitTransactionSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakeKitTransactionSender.kt @@ -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") } } } diff --git a/features/stories/impl/build.gradle.kts b/features/stories/impl/build.gradle.kts index 077cadf096..bb49f8b167 100644 --- a/features/stories/impl/build.gradle.kts +++ b/features/stories/impl/build.gradle.kts @@ -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) diff --git a/features/stories/impl/src/main/java/com/tangem/feature/stories/impl/model/StoriesModel.kt b/features/stories/impl/src/main/java/com/tangem/feature/stories/impl/model/StoriesModel.kt index 875871e2cd..35c985a28a 100644 --- a/features/stories/impl/src/main/java/com/tangem/feature/stories/impl/model/StoriesModel.kt +++ b/features/stories/impl/src/main/java/com/tangem/feature/stories/impl/model/StoriesModel.kt @@ -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 -> diff --git a/features/swap-v2/impl/build.gradle.kts b/features/swap-v2/impl/build.gradle.kts index b64e7ab8d8..612a39dcc8 100644 --- a/features/swap-v2/impl/build.gradle.kts +++ b/features/swap-v2/impl/build.gradle.kts @@ -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) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index 2b3fc14c6d..45499a10b7 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -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 diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt index a9312fc84a..b40d57b863 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt @@ -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, diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SwapTransactionSender.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SwapTransactionSender.kt index 41f709edb1..b5c91be315 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SwapTransactionSender.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SwapTransactionSender.kt @@ -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 } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt index 039d065657..2ebed7f554 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt @@ -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 = { diff --git a/features/swap/data/build.gradle.kts b/features/swap/data/build.gradle.kts index 4efc95da23..dd4eda6edb 100644 --- a/features/swap/data/build.gradle.kts +++ b/features/swap/data/build.gradle.kts @@ -54,7 +54,6 @@ dependencies { implementation(tangemDeps.blockchain) /** Others */ - implementation(deps.timber) implementation(deps.jodatime) /** DI */ diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt index 7e3ef9caeb..ebd13fd35b 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt @@ -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 } } diff --git a/features/swap/domain/build.gradle.kts b/features/swap/domain/build.gradle.kts index 02e0992d2b..d0baa14afb 100644 --- a/features/swap/domain/build.gradle.kts +++ b/features/swap/domain/build.gradle.kts @@ -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) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 3b7b8442ab..96f8ec12bf 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -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 { - 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 } } diff --git a/features/swap/impl/build.gradle.kts b/features/swap/impl/build.gradle.kts index 8a54dbba3d..297b57d054 100644 --- a/features/swap/impl/build.gradle.kts +++ b/features/swap/impl/build.gradle.kts @@ -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 */ diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index 6fd3103a0f..8b516985a2 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -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( diff --git a/features/tangempay/details/impl/build.gradle.kts b/features/tangempay/details/impl/build.gradle.kts index cc18ae7c58..0aee66703c 100644 --- a/features/tangempay/details/impl/build.gradle.kts +++ b/features/tangempay/details/impl/build.gradle.kts @@ -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) } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt index 634b5a0e69..de7acccebe 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt @@ -21,7 +21,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider 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 javax.inject.Inject @Stable @@ -57,7 +57,7 @@ internal class TangemPayChangePinModel @Inject constructor( pin = uiState.value.pinCode, ).getOrNull() } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) return@launch } uiState.update { it.copy(submitButtonLoading = false) } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index 4ada6b4b01..cc3b8be977 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -62,7 +62,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 import javax.inject.Inject @Suppress("LongParameterList", "LargeClass") @@ -181,7 +181,7 @@ internal class TangemPayDetailsModel @Inject constructor( val result = try { cardDetailsRepository.freezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId) } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) return@launch } result @@ -220,7 +220,7 @@ internal class TangemPayDetailsModel @Inject constructor( val result = try { cardDetailsRepository.unfreezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId) } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) return@launch } result @@ -333,7 +333,7 @@ internal class TangemPayDetailsModel @Inject constructor( val result = try { cardDetailsRepository.getCardBalance(params.userWalletId).onRight { balance = it } } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) return@launch } uiState.update( @@ -357,7 +357,7 @@ internal class TangemPayDetailsModel @Inject constructor( val isDone = try { cardDetailsRepository.isAddToWalletDone(params.userWalletId).getOrNull() == true } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) return@launch } uiState.update( @@ -404,7 +404,7 @@ internal class TangemPayDetailsModel @Inject constructor( try { cardDetailsRepository.setAddToWalletAsDone(params.userWalletId) } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) } uiState.update( transformer = DetailsAddToWalletBannerTransformer( diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/GoogleWalletUtil.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/GoogleWalletUtil.kt index 22e3cf50fe..51aa84aae6 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/GoogleWalletUtil.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/GoogleWalletUtil.kt @@ -3,7 +3,7 @@ package com.tangem.features.tangempay.utils import android.content.Context import android.content.Intent import dagger.hilt.android.qualifiers.ApplicationContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject private const val TAG = "GoogleWalletUtil" @@ -24,15 +24,16 @@ internal class GoogleWalletUtil @Inject constructor( } private fun getWalletIntent(): Intent? { - return if (walletIntent != null) { - walletIntent + val cached = walletIntent + return if (cached != null) { + cached } else { try { context.packageManager.getLaunchIntentForPackage(WALLET_PACKAGE_NAME) ?.apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } .also { walletIntent = it } } catch (exception: Exception) { - Timber.tag(TAG).e(exception) + TangemLogger.withTag(TAG).e("Error", exception) null } } diff --git a/features/tangempay/onboarding/impl/build.gradle.kts b/features/tangempay/onboarding/impl/build.gradle.kts index c94b59ab29..5762f030f4 100644 --- a/features/tangempay/onboarding/impl/build.gradle.kts +++ b/features/tangempay/onboarding/impl/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(projects.core.error) implementation(projects.core.navigation) implementation(projects.core.ui) + implementation(projects.core.utils) /** Common */ implementation(projects.common.routing) @@ -49,7 +50,6 @@ dependencies { kapt(deps.hilt.kapt) /** Other */ - implementation(deps.timber) implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) } \ No newline at end of file diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt index dadd979f7f..78a7228a9d 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt @@ -25,11 +25,11 @@ import com.tangem.features.tangempay.model.transformers.TangemPayOnboardingButto import com.tangem.features.tangempay.ui.TangemPayOnboardingNavigation import com.tangem.features.tangempay.ui.TangemPayOnboardingScreenState 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 import com.tangem.utils.transformer.update as transformerUpdate @@ -100,7 +100,7 @@ internal class TangemPayOnboardingModel @Inject constructor( if (customerInfo.productInstance == null) { repository.createOrder(userWalletId) .onLeft { error -> - Timber.e("Error creating order before KYC: $error") + TangemLogger.e("Error creating order before KYC: $error") } } when (params) { @@ -170,14 +170,14 @@ internal class TangemPayOnboardingModel @Inject constructor( val result = produceInitialDataUseCase(userWalletId) if (result.isLeft()) { val errorMessage = result.leftOrNull()?.message ?: "Unknown error" - Timber.e("Error producing initial data: $errorMessage") + TangemLogger.e("Error producing initial data: $errorMessage") uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false)) return@launch } repository.getCustomerInfo(userWalletId = userWalletId) .fold( ifLeft = { error -> - Timber.e("Error getCustomerInfo: ${error.errorCode}") + TangemLogger.e("Error getCustomerInfo: ${error.errorCode}") uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false)) }, ifRight = { customerInfo -> @@ -187,7 +187,7 @@ internal class TangemPayOnboardingModel @Inject constructor( if (customerInfo.productInstance == null) { repository.createOrder(userWalletId) .onLeft { error -> - Timber.e("Error creating order before KYC: $error") + TangemLogger.e("Error creating order before KYC: $error") } } openKyc(userWalletId) diff --git a/features/tester/impl/build.gradle.kts b/features/tester/impl/build.gradle.kts index 6554b8a54f..3c61c2ed70 100644 --- a/features/tester/impl/build.gradle.kts +++ b/features/tester/impl/build.gradle.kts @@ -48,7 +48,6 @@ dependencies { /** Other libraries */ implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(deps.surveysparrow) /** Core modules */ diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsScreen.kt index f19b69a825..bad48fc458 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsScreen.kt @@ -26,7 +26,7 @@ import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.feature.tester.impl.R import com.tangem.feature.tester.presentation.actions.TesterActionsContentState.HideAllCurrenciesUM import com.tangem.feature.tester.presentation.actions.TesterActionsContentState.ToggleAppThemeUM -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.io.File @OptIn(ExperimentalFoundationApi::class) @@ -98,7 +98,7 @@ private fun Activity.shareFile(file: File?) { ContextCompat.startActivity(this, chooserIntent, null) } catch (ex: Exception) { - Timber.e("Failed to share file: $ex") + TangemLogger.e("Failed to share file: $ex") } } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsViewModel.kt index 599f82475f..5eeb879082 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/actions/TesterActionsViewModel.kt @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject @HiltViewModel @@ -86,7 +86,7 @@ internal class TesterActionsViewModel @Inject constructor( AppThemeMode.FOLLOW_SYSTEM -> AppThemeMode.FORCE_DARK } - Timber.d( + TangemLogger.d( """ Change app theme mode |- Current theme mode: $currentAppThemeMode @@ -95,7 +95,7 @@ internal class TesterActionsViewModel @Inject constructor( ) changeAppThemeModeUseCase(newAppThemeMode).onLeft { error -> - Timber.e( + TangemLogger.e( """ Unable to change app theme mode |- Error: $error @@ -108,7 +108,7 @@ internal class TesterActionsViewModel @Inject constructor( getAppThemeModeUseCase() .distinctUntilChanged() .onEach { maybeAppThemeMode -> - Timber.d( + TangemLogger.d( """ Current app theme mode updated |- Previous app theme mode: ${uiState.toggleAppThemeUM.currentAppTheme} @@ -119,7 +119,7 @@ internal class TesterActionsViewModel @Inject constructor( uiState = uiState.copy( toggleAppThemeUM = uiState.toggleAppThemeUM.copy( currentAppTheme = maybeAppThemeMode.getOrElse { error -> - Timber.e( + TangemLogger.e( """ Unable to get current app theme mode, using default |- Default theme mode: ${AppThemeMode.DEFAULT} diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/surveysparrow/SurveySparrowManager.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/surveysparrow/SurveySparrowManager.kt index 5a91649f19..3b2385900c 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/surveysparrow/SurveySparrowManager.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/surveysparrow/SurveySparrowManager.kt @@ -3,7 +3,7 @@ package com.tangem.feature.tester.presentation.surveysparrow import android.app.Activity import com.surveysparrow.ss_android_sdk.SsSurvey import com.surveysparrow.ss_android_sdk.SurveySparrow -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Manager for Survey Sparrow SDK. @@ -33,7 +33,7 @@ class SurveySparrowManager( SurveySparrow(activity, survey) } catch (e: Exception) { - Timber.e(e, "Failed to create SurveySparrow survey") + TangemLogger.e("Failed to create SurveySparrow survey", e) null } } @@ -49,7 +49,7 @@ class SurveySparrowManager( val surveySparrow = createSurvey(activity, customVariables) if (surveySparrow != null) { surveySparrow.startSurveyForResult(requestCode) - Timber.d("SurveySparrow survey started with requestCode: $requestCode") + TangemLogger.d("SurveySparrow survey started with requestCode: $requestCode") } } } \ No newline at end of file diff --git a/features/token-recieve/impl/build.gradle.kts b/features/token-recieve/impl/build.gradle.kts index b1b8d7b048..ddd6c0d9f9 100644 --- a/features/token-recieve/impl/build.gradle.kts +++ b/features/token-recieve/impl/build.gradle.kts @@ -23,7 +23,6 @@ dependencies { implementation(deps.compose.ui.utils) implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(deps.lifecycle.compose) implementation(deps.kotlin.serialization) implementation(deps.decompose.ext.compose) diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index 3b4adc992f..51a9203ba8 100644 --- a/features/tokendetails/impl/build.gradle.kts +++ b/features/tokendetails/impl/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { implementation(deps.reKotlin) implementation(tangemDeps.blockchain) implementation(tangemDeps.card.core) - implementation(deps.timber) implementation(deps.lifecycle.compose) implementation(deps.kotlin.serialization) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/deeplink/DefaultTokenDetailsDeepLinkHandler.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/deeplink/DefaultTokenDetailsDeepLinkHandler.kt index 20cf144c6d..d375886c77 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/deeplink/DefaultTokenDetailsDeepLinkHandler.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/deeplink/DefaultTokenDetailsDeepLinkHandler.kt @@ -31,7 +31,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 DefaultTokenDetailsDeepLinkHandler @AssistedInject constructor( @@ -66,18 +66,18 @@ internal class DefaultTokenDetailsDeepLinkHandler @AssistedInject constructor( val userWallet = userWalletId?.let { getUserWalletUseCase(userWalletId) }?.getOrNull() // If wallet to select is null or locked, ignore deeplink if (userWallet == null || userWallet.isLocked) { - Timber.e("Error on getting user wallet") + TangemLogger.e("Error on getting user wallet") return@launch } if (selectWalletUseCase(userWalletId).getOrNull() == null) { - Timber.e("Error on selecting user wallet") + TangemLogger.e("Error on selecting user wallet") return@launch } val cryptoCurrency = findCryptoCurrency(userWallet = userWallet, networkId = networkId, tokenId = tokenId) if (cryptoCurrency == null) { - Timber.e( + TangemLogger.e( """ Could not get crypto currency for |- $NETWORK_ID_KEY: $networkId diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index d260d470a2..e0034a4926 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Stable import arrow.core.getOrElse import arrow.core.merge import arrow.core.right +import com.tangem.utils.logging.TangemLogger import com.arkivanov.decompose.router.slot.SlotNavigation import com.arkivanov.decompose.router.slot.activate import com.arkivanov.decompose.router.slot.dismiss @@ -103,7 +104,6 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList", "LargeClass", "TooManyFunctions", "PropertyUsedBeforeDeclaration") @@ -499,11 +499,9 @@ internal class TokenDetailsModel @Inject constructor( ), ) - Timber.e( - /* t = */ throwable, - /* message = */ "Unable to get wallet manager for user wallet %s and network %s", - /* ...args = */ userWalletId, - cryptoCurrency.network, + TangemLogger.e( + "Unable to get wallet manager for user wallet $userWalletId and network ${cryptoCurrency.network}", + throwable, ) false @@ -655,7 +653,7 @@ internal class TokenDetailsModel @Inject constructor( cryptoCurrency.network, ).fold( ifLeft = { throwable -> - Timber.e(throwable.cause?.localizedMessage.orEmpty()) + TangemLogger.e(throwable.cause?.localizedMessage.orEmpty()) "" }, ifRight = { it }, @@ -756,12 +754,12 @@ internal class TokenDetailsModel @Inject constructor( val accountId = account?.accountId if (accountId == null) { - Timber.e("Account ID is null, cannot hide currency ${cryptoCurrency.id}") + TangemLogger.e("Account ID is null, cannot hide currency ${cryptoCurrency.id}") return@launch } manageCryptoCurrenciesUseCase(accountId = accountId, remove = cryptoCurrency) - .onLeft { Timber.e(it) } + .onLeft { TangemLogger.e("Error", it) } .onRight { router.popBackStack() } } } @@ -830,7 +828,7 @@ internal class TokenDetailsModel @Inject constructor( txHash = txHash, currency = cryptoCurrency, ).fold( - ifLeft = { Timber.e(it.toString()) }, + ifLeft = { TangemLogger.e(it.toString()) }, ifRight = { router.openUrl(url = it) }, ) } @@ -960,7 +958,7 @@ internal class TokenDetailsModel @Inject constructor( } if (message != null) { internalUiState.value = stateFactory.getStateWithErrorDialog(stringReference(message)) - Timber.e(message) + TangemLogger.e(message) } }, ifRight = { @@ -1033,7 +1031,7 @@ internal class TokenDetailsModel @Inject constructor( internalUiState.value = stateFactory.getStateWithErrorDialog( stringReference(e.message.orEmpty()), ) - Timber.e(e.message) + TangemLogger.e("Error: $e") }, ifRight = { internalUiState.value = stateFactory.getStateWithRemovedKaspaIncompleteTransactionNotification() @@ -1068,7 +1066,7 @@ internal class TokenDetailsModel @Inject constructor( internalUiState.value = stateFactory.getStateWithErrorDialog( stringReference(e.message.orEmpty()), ) - Timber.e(e.message) + TangemLogger.e("Error: $e") } } }, @@ -1141,7 +1139,7 @@ internal class TokenDetailsModel @Inject constructor( } private fun showStakingUnavailable() { - Timber.e("Staking is unavailable for ${cryptoCurrency.name}") + TangemLogger.e("Staking is unavailable for ${cryptoCurrency.name}") uiMessageSender.send(SnackbarMessage(resourceReference(R.string.staking_error_no_validators_title))) } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt index 38588b2f69..a57f83eafb 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt @@ -22,7 +22,7 @@ import com.tangem.utils.converter.Converter import com.tangem.utils.extensions.removeBy import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal import kotlin.String @@ -150,7 +150,7 @@ internal class TokenDetailsNotificationConverter( maxManaBalanceAmount = warning.maxAmount?.let { formatMana(it) } ?: run { - Timber.e("FeeResource maxAmount cannot be null in Koinos. Check KoinosWalletManager") + TangemLogger.e("FeeResource maxAmount cannot be null in Koinos. Check KoinosWalletManager") "" }, ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt index 4d2e2e0835..61415883f5 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStakingInfoConverter.kt @@ -24,7 +24,7 @@ import com.tangem.lib.crypto.BlockchainUtils.isStakingRewardUnavailable import com.tangem.utils.Provider import com.tangem.utils.converter.Converter import com.tangem.utils.isNullOrZero -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal internal class TokenDetailsStakingInfoConverter( @@ -46,7 +46,9 @@ internal class TokenDetailsStakingInfoConverter( state: TokenDetailsState, stakingAvailability: StakingAvailability, ): StakingBlockUM? { - Timber.i("Define staking block for [${status.currency.id.value}] with availability:\n$stakingAvailability") + TangemLogger.i( + "Define staking block for [${status.currency.id.value}] with availability:\n$stakingAvailability", + ) return when (stakingAvailability) { StakingAvailability.TemporaryUnavailable -> StakingBlockUM.TemporaryUnavailable StakingAvailability.Unavailable -> null @@ -73,7 +75,7 @@ internal class TokenDetailsStakingInfoConverter( val iconState = state.tokenInfoBlockState.iconState - Timber.i( + TangemLogger.i( """ getStakingInfoBlock: – stakingBalance: ${stakingBalance ?: "null"} diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt index c4204e04e1..bc8cbf7110 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt @@ -36,7 +36,7 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal import java.util.Locale @@ -122,7 +122,7 @@ internal class TokenDetailsSwapTransactionsStateConverter( fun updateTxStatus(tx: ExchangeUM, statusModel: ExchangeStatusModel): ExchangeUM { if (tx.activeStatus == statusModel.status && tx.hasLongTime == statusModel.hasLongTime) { - Timber.e("UpdateTxStatus isn't required. Current status isn't changed") + TangemLogger.e("UpdateTxStatus isn't required. Current status isn't changed") return tx } val hasFailed = statusModel.status.isFailed() diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExchangeStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExchangeStatusFactory.kt index 20d13122a3..3bc30b0d7c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExchangeStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/ExchangeStatusFactory.kt @@ -29,7 +29,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.map -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger @Suppress("LongParameterList") internal class ExchangeStatusFactory @AssistedInject constructor( @@ -127,7 +127,7 @@ internal class ExchangeStatusFactory @AssistedInject constructor( type = provider.type, ) } else { - Timber.e("Account ID is null, cannot add refund currency ${cryptoCurrency.id}") + TangemLogger.e("Account ID is null, cannot add refund currency ${cryptoCurrency.id}") null } @@ -175,7 +175,7 @@ internal class ExchangeStatusFactory @AssistedInject constructor( contractAddress = refundContractAddress, networkId = refundNetwork, ) - .onLeft(Timber::e) + .onLeft { TangemLogger.e("Error", it) } .getOrNull() } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt index cbdf9089fa..60d403d38c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt @@ -1,5 +1,6 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.express +import com.tangem.utils.logging.TangemLogger import com.tangem.common.ui.expressStatus.ExpressStatusBottomSheetConfig import com.tangem.common.ui.expressStatus.state.ExpressTransactionStateUM import com.tangem.common.ui.expressStatus.state.ExpressTransactionsBlockState @@ -25,7 +26,6 @@ import dagger.assisted.AssistedInject import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import timber.log.Timber @Suppress("LongParameterList") internal class OnrampStatusFactory @AssistedInject constructor( @@ -83,8 +83,8 @@ internal class OnrampStatusFactory @AssistedInject constructor( onrampTx } else { getOnrampStatusUseCase(userWallet = userWallet, onrampTx.info.txId).fold( - ifLeft = { - Timber.e("Couldn't update onramp status. $it") + ifLeft = { error -> + TangemLogger.e("Couldn't update onramp status. $error") onrampTx }, ifRight = { statusModel -> diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExchangeStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExchangeStatusFactory.kt index d145a7ab35..a8af24a292 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExchangeStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsExchangeStatusFactory.kt @@ -29,7 +29,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.map -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import kotlin.coroutines.cancellation.CancellationException @Suppress("LongParameterList") @@ -128,7 +128,7 @@ internal class TokenDetailsExchangeStatusFactory @AssistedInject constructor( type = provider.type, ) } else { - Timber.e("Account ID is null, cannot add refund currency ${cryptoCurrency.id}") + TangemLogger.e("Account ID is null, cannot add refund currency ${cryptoCurrency.id}") null } @@ -176,7 +176,7 @@ internal class TokenDetailsExchangeStatusFactory @AssistedInject constructor( contractAddress = refundContractAddress, networkId = refundNetwork, ) - .onLeft(Timber::e) + .onLeft { TangemLogger.e("Error", it) } .getOrNull() } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsOnrampStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsOnrampStatusFactory.kt index 802663f78a..f164ef18cb 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsOnrampStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/TokenDetailsOnrampStatusFactory.kt @@ -25,7 +25,7 @@ import dagger.assisted.AssistedInject import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger @Suppress("LongParameterList") internal class TokenDetailsOnrampStatusFactory @AssistedInject constructor( @@ -84,7 +84,7 @@ internal class TokenDetailsOnrampStatusFactory @AssistedInject constructor( } else { getOnrampStatusUseCase(userWallet = userWallet, onrampTx.info.txId).fold( ifLeft = { error -> - Timber.e("Couldn't update onramp status. $error") + TangemLogger.e("Couldn't update onramp status. $error") onrampTx }, ifRight = { statusModel -> diff --git a/features/txhistory/impl/build.gradle.kts b/features/txhistory/impl/build.gradle.kts index aae9596318..3ea746b243 100644 --- a/features/txhistory/impl/build.gradle.kts +++ b/features/txhistory/impl/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { /* Project - Core */ implementation(projects.core.decompose) implementation(projects.core.ui) + implementation(projects.core.utils) implementation(projects.common.routing) implementation(projects.core.configToggles) implementation(projects.core.analytics) @@ -57,5 +58,4 @@ dependencies { implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) implementation(deps.decompose.ext.compose) - implementation(deps.timber) } \ No newline at end of file diff --git a/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/model/TxHistoryModel.kt b/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/model/TxHistoryModel.kt index 7476b496da..7d89a3a061 100644 --- a/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/model/TxHistoryModel.kt +++ b/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/model/TxHistoryModel.kt @@ -27,7 +27,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") @@ -213,7 +213,7 @@ internal class TxHistoryModel @Inject constructor( txHash = txHash, currency = params.currency, ).fold( - ifLeft = { Timber.e(it.toString()) }, + ifLeft = { TangemLogger.e(it.toString()) }, ifRight = { urlOpener.openUrl(url = it) }, ) } diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts index fb82ff618a..634724e099 100644 --- a/features/wallet-settings/impl/build.gradle.kts +++ b/features/wallet-settings/impl/build.gradle.kts @@ -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.core.datasource) implementation(projects.common.routing) @@ -71,7 +72,6 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(deps.reKotlin) /** Tangem libraries */ diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/impl/model/RenameWalletModel.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/impl/model/RenameWalletModel.kt index ef51de94a8..5da7a76ea4 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/impl/model/RenameWalletModel.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/component/impl/model/RenameWalletModel.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -103,7 +103,7 @@ internal class RenameWalletModel @Inject constructor( renameWalletUseCase(userWalletId = params.userWalletId, name = newName.text) .onLeft { error -> - Timber.e("Unable to rename wallet: $error") + TangemLogger.e("Unable to rename wallet: $error") showRenameWalletError(error = error, updatedName = newName.text) } } diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt index 75dac67162..52efecf7c9 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt @@ -57,7 +57,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @@ -250,7 +250,7 @@ internal class WalletSettingsModel @Inject constructor( private fun forgetWallet() = modelScope.launch { val hasUserWallets = deleteWalletUseCase(params.userWalletId).getOrElse { error -> - Timber.e("Unable to delete wallet: $error") + TangemLogger.e("Unable to delete wallet: $error") messageSender.send( message = SnackbarMessage(resourceReference(R.string.common_unknown_error)), @@ -447,7 +447,7 @@ internal class WalletSettingsModel @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 { action(true) diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/AccountListSortingSaver.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/AccountListSortingSaver.kt index f698a67127..bf3acacb9a 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/AccountListSortingSaver.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/utils/AccountListSortingSaver.kt @@ -7,7 +7,7 @@ import com.tangem.domain.models.account.AccountId import com.tangem.domain.wallets.analytics.WalletSettingsAnalyticEvents import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.* -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton import kotlin.time.Duration.Companion.seconds @@ -38,7 +38,7 @@ internal class AccountListSortingSaver @Inject constructor( .debounce { 3.seconds } .onEach { accountIds -> applyAccountListSortingUseCase.invoke(accountIds).onLeft { - Timber.e("Error while saving account list sorting: $it") + TangemLogger.e("Error while saving account list sorting: $it") } .onRight { analyticsEventHandler.send(WalletSettingsAnalyticEvents.LongtapAccountsOrder()) diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index cb23c78346..7fcdc3dc2e 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { implementation(tangemDeps.hot.core) implementation(tangemDeps.card.core) implementation(tangemDeps.blockchain) - implementation(deps.timber) implementation(deps.firebase.perf) { exclude(group = "com.google.firebase", module = "protolite-well-known-types") exclude(group = "com.google.protobuf", module = "protobuf-javalite") diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt index e64451ff14..1d3096be23 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt @@ -68,7 +68,7 @@ import com.tangem.utils.coroutines.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.* -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject private const val TANGEM_PAY_UPDATE_INTERVAL = 60_000L @@ -157,7 +157,7 @@ internal class WalletModel @Inject constructor( modelScope.launch { bindRefcodeWithWalletUseCase.retry() - .onLeft { Timber.e("Failed to bind refcode with wallets: $it") } + .onLeft { TangemLogger.e("Failed to bind refcode with wallets: $it") } } } @@ -308,7 +308,7 @@ internal class WalletModel @Inject constructor( val shouldAskNotificationPermissionsViaBs = notificationsRepository.shouldAskNotificationPermissionsViaBs() val shouldShow = notificationsRepository.shouldShowSubscribeOnNotificationsAfterUpdate() val isHuaweiDevice = getIsHuaweiDeviceWithoutGoogleServicesUseCase() - Timber.d( + TangemLogger.d( "push BS afterUpdate: $shouldShow," + "isHuaweiDevice $isHuaweiDevice", ) @@ -454,7 +454,7 @@ internal class WalletModel @Inject constructor( awaitAll( async { refreshMultiCurrencyWalletQuotesUseCase(wallet.walletCardState.id).getOrElse { - Timber.e("Failed to refreshMultiCurrencyWalletQuotesUseCase $it") + TangemLogger.e("Failed to refreshMultiCurrencyWalletQuotesUseCase $it") } }, async { @@ -497,10 +497,10 @@ internal class WalletModel @Inject constructor( } is WalletsUpdateActionResolver.Action.ReorderWallets -> reorderWallets(action) WalletsUpdateActionResolver.Action.EmptyWallets -> { - Timber.w("Wallets list is empty!") + TangemLogger.w("Wallets list is empty!") } is WalletsUpdateActionResolver.Action.Unknown -> { - Timber.w("Unable to perform action: $action") + TangemLogger.w("Unable to perform action: $action") } } } @@ -820,7 +820,7 @@ internal class WalletModel @Inject constructor( setNotificationsEnabledUseCase(userWalletId, true).onRight { notificationsRepository.setNotificationsWasEnabledAutomatically(userWalletId.stringValue) }.onLeft { - Timber.e(it) + TangemLogger.e("Error", it) } } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletsUpdateActionResolver.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletsUpdateActionResolver.kt index fccfccfd12..501510ac6a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletsUpdateActionResolver.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletsUpdateActionResolver.kt @@ -13,7 +13,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotificat import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletType -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -42,7 +42,7 @@ internal class WalletsUpdateActionResolver @Inject constructor( getUpdateContentAction(currentState, wallets, selectedWallet) } - Timber.i("Resolved action: $action") + TangemLogger.i("Resolved action: $action") return action } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt index bf79ed8458..92136614c6 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletContentClickIntents.kt @@ -1,6 +1,7 @@ package com.tangem.feature.wallet.child.wallet.model.intents import arrow.core.getOrElse +import com.tangem.utils.logging.TangemLogger import com.tangem.common.ui.expressStatus.ExpressStatusBottomSheetConfig import com.tangem.common.ui.tokens.TokenItemStateConverter.ApySource import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -40,7 +41,6 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @Suppress("TooManyFunctions") @@ -131,12 +131,12 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( override fun onTokenItemLongClick(accountId: AccountId, cryptoCurrencyStatus: CryptoCurrencyStatus) { modelScope.launch(dispatchers.main) { val userWalletId = accountId.userWalletId - val userWallet = getUserWalletUseCase(userWalletId).getOrElse { - Timber.e( + val userWallet = getUserWalletUseCase(userWalletId).getOrElse { error -> + TangemLogger.e( """ Unable to get user wallet |- ID: $userWalletId - |- Exception: $it + |- Exception: $error """.trimIndent(), ) @@ -287,7 +287,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( txHash = txHash, currency = currency, ).fold( - ifLeft = { Timber.e(it.toString()) }, + ifLeft = { TangemLogger.e(it.toString()) }, ifRight = { router.openUrl(url = it) }, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt index c3b9d8d1f2..5d86ed9512 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt @@ -1,6 +1,7 @@ package com.tangem.feature.wallet.child.wallet.model.intents import arrow.core.getOrElse +import com.tangem.utils.logging.TangemLogger import com.tangem.common.TangemBlogUrlBuilder import com.tangem.common.routing.AppRoute.* import com.tangem.common.routing.AppRouter @@ -11,8 +12,8 @@ import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic.ButtonSupport import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender -import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.navigation.review.ReviewManager +import com.tangem.core.navigation.url.UrlOpener import com.tangem.domain.card.SetCardWasScannedUseCase import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.feedback.GetWalletMetaInfoUseCase @@ -53,7 +54,6 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @Suppress("TooManyFunctions") @@ -187,7 +187,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( userWalletId = userWallet.walletId, currencies = missedAddressCurrencies, ).fold( - ifLeft = { Timber.e(it, "Failed to derive public keys") }, + ifLeft = { TangemLogger.e("Failed to derive public keys", it) }, ifRight = { fetchCryptoCurrencies(userWalletId = userWallet.walletId, currencies = missedAddressCurrencies) }, @@ -485,7 +485,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( networks = currencies.map(CryptoCurrency::network).toSet(), ), ) - .onLeft { Timber.e("Unable to fetch networks: $it") } + .onLeft { TangemLogger.e("Unable to fetch networks: $it") } }, async { multiQuoteStatusFetcher( @@ -494,7 +494,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( appCurrencyId = null, ), ) - .onLeft { Timber.e("Unable to fetch quotes: $it") } + .onLeft { TangemLogger.e("Unable to fetch quotes: $it") } }, async { val stakingIds = currencies.mapNotNullTo(hashSetOf()) { @@ -507,7 +507,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( stakingIds = stakingIds, ), ) - .onLeft { Timber.e("Unable to fetch yield balances: $it") } + .onLeft { TangemLogger.e("Unable to fetch yield balances: $it") } }, ) .awaitAll() @@ -516,12 +516,12 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( private fun getSelectedUserWallet(): UserWallet? { val userWalletId = stateHolder.getSelectedWalletId() - return getUserWalletUseCase(userWalletId).getOrElse { - Timber.e( + return getUserWalletUseCase(userWalletId).getOrElse { error -> + TangemLogger.e( """ Unable to get user wallet |- ID: $userWalletId - |- Exception: $it + |- Exception: $error """.trimIndent(), ) @@ -538,7 +538,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( setNotificationsEnabledUseCase(userWalletId, true).onRight { notificationsRepository.setNotificationsWasEnabledAutomatically(userWalletId.stringValue) }.onLeft { - Timber.e(it) + TangemLogger.e("Error", it) } } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt index e2c99b4aa3..0321bc421a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/deeplink/DefaultPromoDeeplinkHandler.kt @@ -36,7 +36,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeoutOrNull -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import kotlin.time.Duration.Companion.seconds @Suppress("LongParameterList") @@ -72,12 +72,12 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( private fun findSelectedWallet(promoCode: String) { getSelectedWalletSyncUseCase().fold( - ifLeft = { - Timber.tag(LOG_TAG).e("Error on getting user wallet: $it") + ifLeft = { error -> + TangemLogger.withTag(LOG_TAG).e("Error on getting user wallet: $error") showAlert(Failed) }, ifRight = { userWallet -> - Timber.tag(LOG_TAG).d("SelectedUserWallet ${userWallet.walletId.stringValue.mask()}") + TangemLogger.withTag(LOG_TAG).d("SelectedUserWallet ${userWallet.walletId.stringValue.mask()}") findBitcoinAddress(userWallet = userWallet, promoCode = promoCode) }, ) @@ -96,24 +96,24 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( }, ) - Timber.tag(LOG_TAG).d("All user network statuses ${networkStatuses?.size}") + TangemLogger.withTag(LOG_TAG).d("All user network statuses ${networkStatuses?.size}") val cryptoCurrencies = multiWalletCryptoCurrenciesSupplier.getSyncOrNull( MultiWalletCryptoCurrenciesProducer.Params(userWallet.walletId), ) - Timber.tag(LOG_TAG).d("All user cryptoCurrencies on main ${cryptoCurrencies?.size}") + TangemLogger.withTag(LOG_TAG).d("All user cryptoCurrencies on main ${cryptoCurrencies?.size}") val bitcoinCurrency = cryptoCurrencies?.firstOrNull { it.id.rawNetworkId == Blockchain.Bitcoin.id } - Timber.tag(LOG_TAG).d("BitcoinCurrency $bitcoinCurrency") + TangemLogger.withTag(LOG_TAG).d("BitcoinCurrency $bitcoinCurrency") val bitcoinStatus = networkStatuses?.firstOrNull { status -> status.network.id == bitcoinCurrency?.network?.id } - Timber.tag(LOG_TAG).d("BitcoinStatus $bitcoinStatus") + TangemLogger.withTag(LOG_TAG).d("BitcoinStatus $bitcoinStatus") if (bitcoinStatus == null) { - Timber.tag(LOG_TAG).d("No bitcoin, bitcoin network status == null") + TangemLogger.withTag(LOG_TAG).d("No bitcoin, bitcoin network status == null") showAlert(NoBitcoinAddress) } else { val networkAddress = when (bitcoinStatus.value) { @@ -126,7 +126,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( ?.defaultAddress?.value if (bitcoinAddress != null) { - Timber.tag(LOG_TAG).d( + TangemLogger.withTag(LOG_TAG).d( "Start activation promoCode ${promoCode.mask()} address ${bitcoinAddress.mask()}", ) @@ -138,7 +138,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( } else { uiMessageSender.send(GlobalLoadingMessage(false)) delay(DEFAULT_MESSAGE_SENDER_DELAY) - Timber.tag(LOG_TAG).d("No Bitcoin address $bitcoinStatus.value") + TangemLogger.withTag(LOG_TAG).d("No Bitcoin address $bitcoinStatus.value") showAlert(NoBitcoinAddress) } } @@ -155,13 +155,15 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( delay(DEFAULT_MESSAGE_SENDER_DELAY) uiMessageSender.send(GlobalLoadingMessage(false)) delay(DEFAULT_MESSAGE_SENDER_DELAY) - Timber.tag(LOG_TAG).d("${promoCode.mask()} activation success on address ${bitcoinAddress.mask()}") + TangemLogger.withTag( + LOG_TAG, + ).d("${promoCode.mask()} activation success on address ${bitcoinAddress.mask()}") showAlert(Activated) }.onLeft { error -> delay(DEFAULT_MESSAGE_SENDER_DELAY) uiMessageSender.send(GlobalLoadingMessage(false)) delay(DEFAULT_MESSAGE_SENDER_DELAY) - Timber.tag(LOG_TAG).d("${promoCode.mask()} activation failed $error") + TangemLogger.withTag(LOG_TAG).d("${promoCode.mask()} activation failed $error") val alertType = when (error) { ActivatePromoCodeError.ActivationFailed -> Failed ActivatePromoCodeError.InvalidPromoCode -> InvalidPromoCode @@ -203,7 +205,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( @Suppress("NullableToStringCall") private fun saveAndBindRefcode() { scope.launch(dispatchers.default) { - Timber.i("saveAndBindRefcode: refcode = $refcode, campaign = $campaign") + TangemLogger.i("saveAndBindRefcode: refcode = $refcode, campaign = $campaign") if (!refcode.isNullOrBlank()) { val conversionData = AppsFlyerConversionData(refcode = refcode, campaign = campaign) @@ -211,7 +213,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor( appsFlyerStore.storeIfAbsent(value = conversionData) bindRefcodeWithWalletUseCase(conversionData) - .onLeft { Timber.e("Failed to bind refcode with wallets: $it") } + .onLeft { TangemLogger.e("Failed to bind refcode with wallets: $it") } } } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/HasSingleWalletSignedHashesUseCase.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/HasSingleWalletSignedHashesUseCase.kt index cb7eb1f324..4f32140696 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/HasSingleWalletSignedHashesUseCase.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/HasSingleWalletSignedHashesUseCase.kt @@ -7,9 +7,9 @@ import com.tangem.domain.demo.models.DemoConfig import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.utils.logging.TangemLogger import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import timber.log.Timber import javax.inject.Inject @ModelScoped @@ -42,7 +42,7 @@ class HasSingleWalletSignedHashesUseCase @Inject constructor( }, ) } catch (e: IllegalArgumentException) { - Timber.w(e, "Unable to validate signature count: user wallet not found") + TangemLogger.w("Unable to validate signature count: user wallet not found", e) false } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt index 2af73a2491..a757334ff9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt @@ -18,7 +18,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.withContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject @ModelScoped @@ -58,7 +58,7 @@ internal class OnrampStatusFactory @Inject constructor( if (!onrampTx.activeStatus.isTerminal) { getOnrampStatusUseCase(userWallet = userWallet, onrampTx.info.txId).fold( ifLeft = { - Timber.e("Couldn't update onramp status. $it") + TangemLogger.e("Couldn't update onramp status. $it") }, ifRight = { statusModel -> val txId = statusModel.txId diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/UseCaseExt.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/UseCaseExt.kt index 4b0d406ee5..53d32e9062 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/UseCaseExt.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/UseCaseExt.kt @@ -1,17 +1,17 @@ package com.tangem.feature.wallet.presentation.wallet.domain +import com.tangem.utils.logging.TangemLogger import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase -import timber.log.Timber internal fun GetSelectedWalletSyncUseCase.unwrap(): UserWallet? { return this().fold( - ifLeft = { - Timber.e("Impossible to get selected wallet $it") + ifLeft = { error -> + TangemLogger.e("Impossible to get selected wallet $error") null }, ifRight = { it }, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletContentFetcher.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletContentFetcher.kt index 10de4aeeb6..b4cae53df1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletContentFetcher.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletContentFetcher.kt @@ -11,7 +11,7 @@ import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import javax.inject.Singleton @@ -45,7 +45,7 @@ internal class WalletContentFetcher @Inject constructor( * (doesn't matter if it is active or not), then skip the update process. */ if (!forceUpdate && savedJobHolder != null && !savedJobHolder.isEmpty()) { - Timber.d("Skip fetching for $userWalletId") + TangemLogger.d("Skip fetching for $userWalletId") return@withContext } @@ -55,7 +55,7 @@ internal class WalletContentFetcher @Inject constructor( * then cancel the previous update. */ if (forceUpdate && savedJobHolder?.isActive == true) { - Timber.d("Cancel old fetching for $userWalletId") + TangemLogger.d("Cancel old fetching for $userWalletId") savedJobHolder.cancel() } @@ -63,7 +63,7 @@ internal class WalletContentFetcher @Inject constructor( JobHolder().also { fetchingJobMap[userWalletId] = it } } - Timber.d("Start fetching for $userWalletId") + TangemLogger.d("Start fetching for $userWalletId") val maybeResult = launch { walletBalanceFetcher( @@ -71,11 +71,11 @@ internal class WalletContentFetcher @Inject constructor( userWalletId = userWalletId, isPaymentAccountRefactorEnabled = tangemPayFeatureToggles.isTangemPayAccountsRefactorEnabled, ), - ).onLeft(Timber::e) + ).onLeft { TangemLogger.e("Error", it) } } .saveInAndJoin(jobHolder) - Timber.d("Finish fetching with result $maybeResult for $userWalletId") + TangemLogger.d("Finish fetching with result $maybeResult for $userWalletId") } } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletNameMigrationUseCase.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletNameMigrationUseCase.kt index c6754b834f..7ead228271 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletNameMigrationUseCase.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/WalletNameMigrationUseCase.kt @@ -3,7 +3,7 @@ package com.tangem.feature.wallet.presentation.wallet.domain import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.copy import com.tangem.domain.wallets.repository.WalletNamesMigrationRepository -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger class WalletNameMigrationUseCase( private val userWalletsListRepository: UserWalletsListRepository, @@ -17,13 +17,13 @@ class WalletNameMigrationUseCase( val wallets = userWalletsListRepository.userWalletsSync() val existingNames: MutableSet = mutableSetOf() - wallets.forEach { - val defaultName = it.name + wallets.forEach { wallet -> + val defaultName = wallet.name val suggestedWalletName = suggestedWalletName(defaultName, existingNames) if (defaultName != suggestedWalletName) { - userWalletsListRepository.saveWithoutLock(it.copy(name = suggestedWalletName), canOverride = true) + userWalletsListRepository.saveWithoutLock(wallet.copy(name = suggestedWalletName), canOverride = true) } - Timber.tag("Migrated names").e(it.walletId.toString() + " " + suggestedWalletName) + TangemLogger.withTag("Migrated names").e(wallet.walletId.toString() + " " + suggestedWalletName) } walletNamesMigrationRepository.setMigrationDone() diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/loaders/WalletScreenContentLoader.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/loaders/WalletScreenContentLoader.kt index 8965195057..3eb88195ed 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/loaders/WalletScreenContentLoader.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/loaders/WalletScreenContentLoader.kt @@ -7,7 +7,7 @@ import com.tangem.domain.models.wallet.isLocked import kotlinx.coroutines.CloseableCoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.newSingleThreadContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -45,19 +45,19 @@ internal class WalletScreenContentLoader @Inject constructor( storage.remove(id) loadInternal(userWallet, coroutineScope, isRefresh = true) } else { - Timber.d("$id content loading has already started") + TangemLogger.d("$id content loading has already started") } } } /** Cancel loading by [id] */ fun cancel(id: UserWalletId) { - Timber.d("$id content loading is canceled") + TangemLogger.d("$id content loading is canceled") storage.remove(id) } fun cancelAll() { - Timber.d("All content loading is canceled") + TangemLogger.d("All content loading is canceled") storage.clear() singleBackgroundDispatcher.close() } @@ -69,11 +69,11 @@ internal class WalletScreenContentLoader @Inject constructor( ) if (loader == null) { - Timber.e("Impossible to create loader for $userWallet") + TangemLogger.e("Impossible to create loader for $userWallet") return } - Timber.d("${userWallet.walletId} content loading is ${if (isRefresh) "re" else ""}started") + TangemLogger.d("${userWallet.walletId} content loading is ${if (isRefresh) "re" else ""}started") loader.subscribers .map { it.subscribe(coroutineScope, singleBackgroundDispatcher) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt index 89bff8d53b..092521153e 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt @@ -13,7 +13,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 import javax.inject.Singleton @@ -41,7 +41,7 @@ internal class WalletStateController @Inject constructor( } fun update(transformer: WalletScreenStateTransformer) { - Timber.d("Applying: ${transformer::class.simpleName}") + TangemLogger.d("Applying: ${transformer::class.simpleName}") mutableUiState.update(function = transformer::transform) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/DeleteWalletTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/DeleteWalletTransformer.kt index f30c88927b..1b72b3307d 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/DeleteWalletTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/DeleteWalletTransformer.kt @@ -5,7 +5,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenSta import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import kotlinx.collections.immutable.toImmutableList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class DeleteWalletTransformer( private val selectedWalletIndex: Int, @@ -31,7 +31,7 @@ internal class DeleteWalletTransformer( wallets = (prevState.wallets - deletedWalletState).toImmutableList(), ) else -> { - Timber.e("Wallets does not contain deleted wallet") + TangemLogger.e("Wallets does not contain deleted wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt index af3f38b3a4..01563ac966 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt @@ -6,7 +6,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Transformer that renames wallets @@ -51,7 +51,7 @@ internal class RenameWalletsTransformer( is WalletState.MultiCurrency.Locked, is WalletState.SingleCurrency.Locked, -> { - Timber.e("Impossible to rename wallet in locked state") + TangemLogger.e("Impossible to rename wallet in locked state") prevState } } @@ -63,7 +63,7 @@ internal class RenameWalletsTransformer( prevState.copy(walletsBalanceUM = prevState.walletsBalanceUM.copySealed(name = newName)) } is WalletUM.Locked -> { - Timber.e("Impossible to rename wallet in locked state") + TangemLogger.e("Impossible to rename wallet in locked state") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetCryptoCurrencyActionsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetCryptoCurrencyActionsTransformer.kt index f3dbd5dd9e..977e103f90 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetCryptoCurrencyActionsTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetCryptoCurrencyActionsTransformer.kt @@ -11,7 +11,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.toPersistentList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetCryptoCurrencyActionsTransformer( private val tokenActionsState: TokenActionsState, @@ -26,11 +26,11 @@ internal class SetCryptoCurrencyActionsTransformer( prevState.copy(buttons = tokenActionsState.toManageButtons()) } is WalletState.SingleCurrency.Locked -> { - Timber.w("Impossible to load primary currency status for locked wallet") + TangemLogger.w("Impossible to load primary currency status for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load crypto currency actions for multi-currency wallet") + TangemLogger.w("Impossible to load crypto currency actions for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetExpressStatusesTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetExpressStatusesTransformer.kt index 9d0afb1eff..510be12367 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetExpressStatusesTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetExpressStatusesTransformer.kt @@ -13,7 +13,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.SingleWalletOnrampTransactionConverter import kotlinx.collections.immutable.toPersistentList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetExpressStatusesTransformer( userWalletId: UserWalletId, @@ -47,11 +47,11 @@ internal class SetExpressStatusesTransformer( ) } is WalletState.SingleCurrency.Locked -> { - Timber.w("Impossible to load express statuses for locked wallet") + TangemLogger.w("Impossible to load express statuses for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load express statuses for multi-currency wallet") + TangemLogger.w("Impossible to load express statuses for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetPrimaryCurrencyTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetPrimaryCurrencyTransformer.kt index 5efac70c6d..207eb330f0 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetPrimaryCurrencyTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetPrimaryCurrencyTransformer.kt @@ -9,7 +9,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.SingleWalletCardStateConverter import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.SingleWalletMarketPriceConverter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger @Deprecated("Remove with main toggle [DesignFeatureToggles.isRedesignEnabled]") internal class SetPrimaryCurrencyTransformer( @@ -27,11 +27,11 @@ internal class SetPrimaryCurrencyTransformer( ) } is WalletState.SingleCurrency.Locked -> { - Timber.w("Impossible to load primary currency status for locked wallet") + TangemLogger.w("Impossible to load primary currency status for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load primary currency status for multi-currency wallet") + TangemLogger.w("Impossible to load primary currency status for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListErrorTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListErrorTransformer.kt index d2740b30c4..6bfbef7ab9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListErrorTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListErrorTransformer.kt @@ -13,7 +13,7 @@ import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents import com.tangem.feature.wallet.presentation.wallet.domain.WalletAdditionalInfoFactory import com.tangem.feature.wallet.presentation.wallet.state.model.* import com.tangem.feature.wallet.presentation.wallet.state.utils.disableButtons -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal internal class SetTokenListErrorTransformer( @@ -39,11 +39,11 @@ internal class SetTokenListErrorTransformer( ) } is WalletState.MultiCurrency.Locked -> { - Timber.w("Impossible to load tokens list for locked wallet") + TangemLogger.w("Impossible to load tokens list for locked wallet") prevState } is WalletState.SingleCurrency -> { - Timber.w("Impossible to load tokens list for single-currency wallet") + TangemLogger.w("Impossible to load tokens list for single-currency wallet") prevState } } @@ -68,7 +68,7 @@ internal class SetTokenListErrorTransformer( ) } is WalletUM.Locked -> { - Timber.w("Impossible to load tokens list for locked wallet") + TangemLogger.w("Impossible to load tokens list for locked wallet") walletUM } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListTransformer.kt index 8bbaf12cb9..4d5d813ddc 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTokenListTransformer.kt @@ -11,7 +11,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.transformers.converte import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.TokenListStateConverter import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.WalletTokensListUMConverter import com.tangem.feature.wallet.presentation.wallet.state.utils.enableButtons -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal internal class SetTokenListTransformer( @@ -35,12 +35,12 @@ internal class SetTokenListTransformer( ) } is WalletState.MultiCurrency.Locked -> { - Timber.w("Impossible to load tokens list for locked wallet") + TangemLogger.w("Impossible to load tokens list for locked wallet") prevState } is WalletState.SingleCurrency, -> { - Timber.w("Impossible to load tokens list for single-currency wallet") + TangemLogger.w("Impossible to load tokens list for single-currency wallet") prevState } } @@ -56,7 +56,7 @@ internal class SetTokenListTransformer( ) } is WalletUM.Locked -> { - Timber.w("Impossible to load tokens list for locked wallet") + TangemLogger.w("Impossible to load tokens list for locked wallet") walletUM } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountErrorTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountErrorTransformer.kt index 9a2b1164f9..2773d8a536 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountErrorTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountErrorTransformer.kt @@ -12,7 +12,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.TxHistoryItemStateConverter import kotlinx.collections.immutable.toImmutableList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetTxHistoryCountErrorTransformer( private val userWallet: UserWallet, @@ -46,7 +46,7 @@ internal class SetTxHistoryCountErrorTransformer( is WalletState.SingleCurrency.Locked, is WalletState.MultiCurrency, -> { - Timber.w("Impossible to load transactions history for multi-currency wallet") + TangemLogger.w("Impossible to load transactions history for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountTransformer.kt index cba6ac874b..bad52e78a8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryCountTransformer.kt @@ -9,7 +9,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetTxHistoryCountTransformer( userWalletId: UserWalletId, @@ -24,11 +24,11 @@ internal class SetTxHistoryCountTransformer( ) is WalletState.SingleCurrency.Locked, -> { - Timber.w("Impossible to load transactions history for locked wallet") + TangemLogger.w("Impossible to load transactions history for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load transactions history for multi-currency wallet") + TangemLogger.w("Impossible to load transactions history for multi-currency wallet") prevState } } @@ -40,7 +40,7 @@ internal class SetTxHistoryCountTransformer( private fun TxHistoryState.toLoadingState(): TxHistoryState { return if (this is TxHistoryState.Content) { - Timber.d("Load transactions history: $transactionsCount") + TangemLogger.d("Load transactions history: $transactionsCount") copy( contentItems = contentItems.apply { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsErrorTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsErrorTransformer.kt index b8af717c52..de0657e030 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsErrorTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsErrorTransformer.kt @@ -6,7 +6,7 @@ import com.tangem.domain.txhistory.models.TxHistoryListError import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetTxHistoryItemsErrorTransformer( userWalletId: UserWalletId, @@ -18,11 +18,11 @@ internal class SetTxHistoryItemsErrorTransformer( return when (prevState) { is WalletState.SingleCurrency.Content -> prevState.copy(txHistoryState = createErrorState()) is WalletState.SingleCurrency.Locked -> { - Timber.w("Impossible to load transactions history for locked wallet") + TangemLogger.w("Impossible to load transactions history for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load transactions history for multi-currency wallet") + TangemLogger.w("Impossible to load transactions history for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsTransformer.kt index 289daa4514..f13ad18498 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetTxHistoryItemsTransformer.kt @@ -9,7 +9,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.TxHistoryItemFlowConverter import kotlinx.coroutines.flow.Flow -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetTxHistoryItemsTransformer( userWallet: UserWallet, @@ -23,11 +23,11 @@ internal class SetTxHistoryItemsTransformer( txHistoryState = prevState.txHistoryState.toContentState(), ) is WalletState.SingleCurrency.Locked -> { - Timber.w("Impossible to load transactions history for locked wallet") + TangemLogger.w("Impossible to load transactions history for locked wallet") prevState } is WalletState.MultiCurrency -> { - Timber.w("Impossible to load transactions history for multi-currency wallet") + TangemLogger.w("Impossible to load transactions history for multi-currency wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetWarningsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetWarningsTransformer.kt index fde5efd497..9f36ea4e38 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetWarningsTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/SetWarningsTransformer.kt @@ -7,7 +7,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class SetWarningsTransformer( userWalletId: UserWalletId, @@ -23,7 +23,7 @@ internal class SetWarningsTransformer( is WalletState.MultiCurrency.Locked, is WalletState.SingleCurrency.Locked, -> { - Timber.w("Impossible to update notifications for locked wallet") + TangemLogger.w("Impossible to update notifications for locked wallet") prevState } } @@ -36,7 +36,7 @@ internal class SetWarningsTransformer( notificationsCarousel = notificationsCarousel, ) is WalletUM.Locked -> { - Timber.w("Impossible to update notifications for locked wallet") + TangemLogger.w("Impossible to update notifications for locked wallet") walletUM } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UnlockWalletTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UnlockWalletTransformer.kt index fcef9841df..2c1c7e542f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UnlockWalletTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UnlockWalletTransformer.kt @@ -11,7 +11,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletLoadingStateFactory import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentList -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class UnlockWalletTransformer( private val unlockedWallets: List, @@ -65,7 +65,7 @@ internal class UnlockWalletTransformer( is WalletState.MultiCurrency.Content, is WalletState.SingleCurrency.Content, -> { - Timber.e("Impossible to unlock wallet with not locked state") + TangemLogger.e("Impossible to unlock wallet with not locked state") prevState } } @@ -77,7 +77,7 @@ internal class UnlockWalletTransformer( userWallet = unlockedWallet, ) is WalletUM.Content -> { - Timber.e("Impossible to unlock wallet with not locked state") + TangemLogger.e("Impossible to unlock wallet with not locked state") walletUM } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UpdateWalletCardsCountTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UpdateWalletCardsCountTransformer.kt index 72c403ae19..2b4dd9e457 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UpdateWalletCardsCountTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/UpdateWalletCardsCountTransformer.kt @@ -7,7 +7,7 @@ import com.tangem.feature.wallet.presentation.wallet.domain.WalletImageResolver import com.tangem.feature.wallet.presentation.wallet.state.model.WalletCardState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger internal class UpdateWalletCardsCountTransformer( private val userWallet: UserWallet, @@ -25,7 +25,7 @@ internal class UpdateWalletCardsCountTransformer( is WalletState.MultiCurrency.Locked, is WalletState.SingleCurrency.Locked, -> { - Timber.e("Impossible to update wallet cards count for locked wallet") + TangemLogger.e("Impossible to update wallet cards count for locked wallet") prevState } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/BasicAccountListSubscriber.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/BasicAccountListSubscriber.kt index 48aa789257..463dd73e6e 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/BasicAccountListSubscriber.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/BasicAccountListSubscriber.kt @@ -19,7 +19,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.transformers.SetToken import com.tangem.feature.wallet.presentation.wallet.state.transformers.TokenConverterParams import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.math.BigDecimal /** @@ -126,7 +126,7 @@ internal abstract class BasicAccountListSubscriber : BasicWalletSubscriber() { ?: return }, ifError = { e -> - Timber.e("Failed to load token list: $e") + TangemLogger.e("Failed to load token list: $e") stateController.update( SetTokenListErrorTransformer( selectedWallet = userWallet, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt index 04f33d8338..cc818aa976 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger @Suppress("LongParameterList") internal class TangemPayMainSubscriber @AssistedInject constructor( @@ -67,7 +67,7 @@ internal class TangemPayMainSubscriber @AssistedInject constructor( } TangemPayCustomerInfoError.UnknownError -> { // hide TangemPay block - Timber.e("Failed when loading main screen TangemPay info: $tangemPayError") + TangemLogger.e("Failed when loading main screen TangemPay info: $tangemPayError") stateController.update( transformer = TangemPayHiddenStateTransformer(userWalletId), ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/WalletSubscriber.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/WalletSubscriber.kt index 4b48ea2769..7afe494928 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/WalletSubscriber.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/WalletSubscriber.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Component for implementation of flow subscription @@ -18,7 +18,7 @@ internal abstract class WalletSubscriber { protected abstract fun create(coroutineScope: CoroutineScope): Flow<*> fun subscribe(coroutineScope: CoroutineScope, dispatchers: CoroutineDispatcher): Job { - Timber.d("Subscribe on ${this::class.simpleName}") + TangemLogger.d("Subscribe on ${this::class.simpleName}") return create(coroutineScope) .flowOn(dispatchers) diff --git a/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt b/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt index 28fd3f1aec..de88d92e2a 100644 --- a/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt +++ b/features/wallet/impl/src/test/kotlin/com/tangem/feature/wallet/presentation/wallet/deeplink/DefaultPromoDeeplinkHandlerTest.kt @@ -45,7 +45,6 @@ import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test -import timber.log.Timber @OptIn(ExperimentalCoroutinesApi::class) class DefaultPromoDeeplinkHandlerTest { @@ -83,7 +82,6 @@ class DefaultPromoDeeplinkHandlerTest { messages = mutableListOf() every { uiMessageSender.send(capture(messages)) } just runs - Timber.uprootAll() } @Test diff --git a/features/walletconnect/impl/build.gradle.kts b/features/walletconnect/impl/build.gradle.kts index 48f84373fe..3c857c76b5 100644 --- a/features/walletconnect/impl/build.gradle.kts +++ b/features/walletconnect/impl/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { implementation(projects.core.decompose) implementation(projects.core.navigation) implementation(projects.core.ui) + implementation(projects.core.utils) /** Domain models */ implementation(projects.domain.account) @@ -73,7 +74,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.decompose.ext.compose) implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(tangemDeps.card.core) implementation(tangemDeps.blockchain) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt index 0bb89d47c0..bef2fd2b82 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt @@ -31,7 +31,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 @@ -60,7 +60,7 @@ internal class WcConnectedAppInfoModel @Inject constructor( modelScope.launch { val session = wcSessionsUseCase.findByTopic(topic = topic) if (session == null) { - Timber.e("Can not find WcSession by topic: $topic") + TangemLogger.e("Can not find WcSession by topic: $topic") messageSender.send(SnackbarMessage(stringReference("Can not find WcSession by topic: $topic"))) dismiss() } else { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/preview/WcConnectionsPreviewData.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/preview/WcConnectionsPreviewData.kt index 56a76748db..916d18477d 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/preview/WcConnectionsPreviewData.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/ui/preview/WcConnectionsPreviewData.kt @@ -9,7 +9,7 @@ import com.tangem.features.walletconnect.connections.entity.* import com.tangem.features.walletconnect.impl.R import com.tangem.features.walletconnect.transaction.ui.sign.accountPortfolioName import kotlinx.collections.immutable.persistentListOf -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.util.UUID internal object WcConnectionsPreviewData { @@ -24,13 +24,13 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/satoshi.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("Moralis clicked") }, + onClick = { TangemLogger.d("Moralis clicked") }, ), WcConnectedAppInfo( name = "website.com", iconUrl = "$BASE_URL/doge_again_lol.jpg", subtitle = "https://react-app.walletconnect.com/", - onClick = { Timber.d("website.com clicked") }, + onClick = { TangemLogger.d("website.com clicked") }, verifiedState = VerifiedDAppState.Unknown, ), ), @@ -44,7 +44,7 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/LiteCoin.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("React app clicked") }, + onClick = { TangemLogger.d("React app clicked") }, ), ), ), @@ -57,14 +57,14 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/satoshi.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("Moralis clicked") }, + onClick = { TangemLogger.d("Moralis clicked") }, ), WcConnectedAppInfo( name = "website.com", iconUrl = "$BASE_URL/doge_again_lol.jpg", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Unknown, - onClick = { Timber.d("website.com clicked") }, + onClick = { TangemLogger.d("website.com clicked") }, ), ), ), @@ -76,7 +76,7 @@ internal object WcConnectionsPreviewData { name = "React app", iconUrl = "$BASE_URL/LiteCoin.png", subtitle = "https://react-app.walletconnect.com/", - onClick = { Timber.d("React app clicked") }, + onClick = { TangemLogger.d("React app clicked") }, verifiedState = VerifiedDAppState.Verified {}, ), ), @@ -90,13 +90,13 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/satoshi.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("Moralis clicked") }, + onClick = { TangemLogger.d("Moralis clicked") }, ), WcConnectedAppInfo( name = "website.com", iconUrl = "$BASE_URL/doge_again_lol.jpg", subtitle = "https://react-app.walletconnect.com/", - onClick = { Timber.d("website.com clicked") }, + onClick = { TangemLogger.d("website.com clicked") }, verifiedState = VerifiedDAppState.Unknown, ), ), @@ -110,7 +110,7 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/LiteCoin.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("React app clicked") }, + onClick = { TangemLogger.d("React app clicked") }, ), ), ), @@ -137,7 +137,7 @@ internal object WcConnectionsPreviewData { iconUrl = "$BASE_URL/LiteCoin.png", subtitle = "https://react-app.walletconnect.com/", verifiedState = VerifiedDAppState.Verified {}, - onClick = { Timber.d("React app clicked") }, + onClick = { TangemLogger.d("React app clicked") }, ) val walletHeader diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/deeplink/DefaultWalletConnectDeepLinkHandler.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/deeplink/DefaultWalletConnectDeepLinkHandler.kt index 5d82c115da..bc3e83159d 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/deeplink/DefaultWalletConnectDeepLinkHandler.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/deeplink/DefaultWalletConnectDeepLinkHandler.kt @@ -8,7 +8,7 @@ import com.tangem.features.walletconnect.components.deeplink.WalletConnectDeepLi import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import java.net.URLDecoder internal class DefaultWalletConnectDeepLinkHandler @AssistedInject constructor( @@ -24,7 +24,7 @@ internal class DefaultWalletConnectDeepLinkHandler @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 = { wallet -> val decodedWcUri = URLDecoder.decode(wcUri, DEFAULT_CHARSET_NAME) @@ -38,7 +38,7 @@ internal class DefaultWalletConnectDeepLinkHandler @AssistedInject constructor( }, ) } catch (e: Exception) { - Timber.e(e) + TangemLogger.e("Error", e) } } } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt index cc68b795ce..4cd6fec245 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt @@ -1,5 +1,6 @@ package com.tangem.features.walletconnect.transaction.converter +import com.tangem.utils.logging.TangemLogger import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase @@ -8,7 +9,6 @@ import com.tangem.features.walletconnect.transaction.entity.common.WcTransaction import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.toImmutableList -import timber.log.Timber import javax.inject.Inject internal class WcTransactionRequestBlockUMConverter @Inject constructor( @@ -42,7 +42,7 @@ internal class WcTransactionRequestBlockUMConverter @Inject constructor( try { addAll(transactionParamsConverter.convert(params)) } catch (exception: Exception) { - Timber.e(exception, "Error while parsing transaction params - %s", params) + TangemLogger.e("Error while parsing transaction params - $params", exception) } } } diff --git a/features/welcome/impl/build.gradle.kts b/features/welcome/impl/build.gradle.kts index 09713985c8..e21ec865c7 100644 --- a/features/welcome/impl/build.gradle.kts +++ b/features/welcome/impl/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation(projects.core.navigation) implementation(projects.core.ui) implementation(projects.core.analytics) + implementation(projects.core.utils) implementation(projects.common.routing) implementation(projects.common.ui) @@ -57,7 +58,6 @@ dependencies { implementation(deps.decompose) implementation(deps.decompose.ext.compose) implementation(deps.kotlin.immutable.collections) - implementation(deps.timber) implementation(tangemDeps.card.core) implementation(tangemDeps.blockchain) implementation(tangemDeps.hot.core) diff --git a/features/yield-supply/impl/build.gradle.kts b/features/yield-supply/impl/build.gradle.kts index ada6f291fb..d71b9cf36a 100644 --- a/features/yield-supply/impl/build.gradle.kts +++ b/features/yield-supply/impl/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { implementation(projects.core.navigation) implementation(projects.core.analytics) implementation(projects.core.analytics.models) + implementation(projects.core.utils) /** Compose */ implementation(tangemDeps.vico.core) @@ -69,7 +70,6 @@ dependencies { /** Other */ implementation(deps.decompose) implementation(deps.decompose.ext.compose) - implementation(deps.timber) implementation(deps.kotlin.immutable.collections) /** DI */ diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/active/model/YieldSupplyActiveModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/active/model/YieldSupplyActiveModel.kt index 8ddd253ffb..92b9ebf190 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/active/model/YieldSupplyActiveModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/active/model/YieldSupplyActiveModel.kt @@ -40,7 +40,7 @@ import com.tangem.utils.transformer.update import kotlinx.collections.immutable.persistentListOf 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") @@ -202,7 +202,7 @@ internal class YieldSupplyActiveModel @Inject constructor( } }, ifEmpty = { - Timber.w("No currency status found: ${cryptoCurrency.id}") + TangemLogger.w("No currency status found: ${cryptoCurrency.id}") }, ) } @@ -210,7 +210,7 @@ internal class YieldSupplyActiveModel @Inject constructor( .launchIn(modelScope) }, ifLeft = { error -> - Timber.w(error.toString()) + TangemLogger.w(error.toString()) return@launch }, ) @@ -232,7 +232,7 @@ internal class YieldSupplyActiveModel @Inject constructor( apy = TextReference.Str(DASH_SIGN), ) } - Timber.e("Error loading token status") + TangemLogger.e("Error loading token status") } } } diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/entry/model/YieldSupplyEntryModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/entry/model/YieldSupplyEntryModel.kt index 5314191db2..649028c56e 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/entry/model/YieldSupplyEntryModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/entry/model/YieldSupplyEntryModel.kt @@ -16,7 +16,7 @@ import com.tangem.features.yield.supply.api.entry.YieldSupplyEntryRoute import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject @ModelScoped @@ -43,7 +43,7 @@ internal class YieldSupplyEntryModel @Inject constructor( singleAccountStatusListSupplier.getSyncOrNull(userWalletId) .getCryptoCurrencyStatus(currency = cryptoCurrency) .onNone { - Timber.e("Failed to get CryptoCurrencyStatus: ${cryptoCurrency.id}") + TangemLogger.e("Failed to get CryptoCurrencyStatus: ${cryptoCurrency.id}") withContext(dispatchers.mainImmediate) { router.pop() } diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt index ac026fed7c..70194d75cc 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.yield.supply.impl.main.model import arrow.core.getOrElse +import com.tangem.utils.logging.TangemLogger import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -35,7 +36,6 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.transformer.update import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import timber.log.Timber import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import kotlin.properties.Delegates @@ -100,8 +100,8 @@ internal class YieldSupplyModel @Inject constructor( userWallet = wallet subscribeOnCurrencyStatusUpdates() }, - ifLeft = { - Timber.w(it.toString()) + ifLeft = { error -> + TangemLogger.w(error.toString()) return@launch }, ) @@ -132,7 +132,7 @@ internal class YieldSupplyModel @Inject constructor( onCryptoCurrencyStatusUpdated(cryptoCurrencyStatus) }, ifEmpty = { - Timber.w("Unable to get crypto currency status: ${cryptoCurrency.id}") + TangemLogger.w("Unable to get crypto currency status: ${cryptoCurrency.id}") }, ) } @@ -149,8 +149,8 @@ internal class YieldSupplyModel @Inject constructor( onStartEarningClick = ::onStartEarningClick, ), ) - }.onLeft { - Timber.e(it) + }.onLeft { error -> + TangemLogger.e("Error", error) uiState.update { YieldSupplyUM.Initial } } } @@ -261,7 +261,7 @@ internal class YieldSupplyModel @Inject constructor( } computeAndApplyShowInfoIcon(cryptoCurrencyStatus) }.onLeft { t -> - Timber.e(t) + TangemLogger.e("Error", t) uiState.update { YieldSupplyUM.Content( title = resourceReference( diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt index 08cbe91674..a4b555063f 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.yield.supply.impl.subcomponents.approve.model import arrow.core.getOrElse +import com.tangem.utils.logging.TangemLogger import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.core.analytics.api.AnalyticsEventHandler @@ -12,15 +13,18 @@ import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.HoldToConfirmButtonFeatureToggles import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter -import com.tangem.core.ui.extensions.* +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format +import com.tangem.domain.account.status.usecase.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.isHotWallet -import com.tangem.domain.account.status.usecase.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.transaction.usecase.CreateApprovalTransactionUseCase import com.tangem.domain.transaction.usecase.GetFeeUseCase import com.tangem.domain.transaction.usecase.SendTransactionUseCase @@ -37,14 +41,12 @@ import com.tangem.features.yield.supply.impl.subcomponents.approve.YieldSupplyAp import com.tangem.features.yield.supply.impl.subcomponents.notifications.YieldSupplyNotificationsComponent import com.tangem.features.yield.supply.impl.subcomponents.notifications.YieldSupplyNotificationsUpdateTrigger import com.tangem.features.yield.supply.impl.subcomponents.notifications.entity.YieldSupplyNotificationData -import com.tangem.core.ui.extensions.TextReference import com.tangem.utils.TangemBlogUrlBuilder import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.transformer.update import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList") @@ -141,7 +143,7 @@ internal class YieldSupplyApproveModel @Inject constructor( network = cryptoCurrency.network, ).fold( ifLeft = { error -> - Timber.e(error.toString()) + TangemLogger.e(error.toString()) uiState.update(YieldSupplyTransactionReadyTransformer) analyticsEventHandler.send( YieldSupplyAnalytics.EarnErrors( @@ -219,8 +221,8 @@ internal class YieldSupplyApproveModel @Inject constructor( contractAddress = cryptoCurrency.contractAddress, spenderAddress = contractAddress, amount = null, - ).getOrElse { - Timber.e(it) + ).getOrElse { error -> + TangemLogger.e("Error", error) return } diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt index 0e7ff956e2..4824105018 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.yield.supply.impl.subcomponents.startearning.model import arrow.core.getOrElse +import com.tangem.utils.logging.TangemLogger import com.tangem.blockchain.common.TransactionSender import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam @@ -14,13 +15,13 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.wrappedList import com.tangem.datasource.local.appsflyer.AppsFlyerStore import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.account.status.usecase.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.account.status.utils.CryptoCurrencyStatusOperations.getCryptoCurrencyStatus import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.isHotWallet -import com.tangem.domain.account.status.usecase.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.transaction.error.GetFeeError import com.tangem.domain.transaction.usecase.SendTransactionUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase @@ -44,7 +45,6 @@ import com.tangem.utils.extensions.orZero import com.tangem.utils.transformer.update import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import timber.log.Timber import java.math.BigDecimal import javax.inject.Inject import kotlin.properties.Delegates @@ -231,7 +231,7 @@ internal class YieldSupplyStartEarningModel @Inject constructor( sendMode = TransactionSender.MultipleTransactionSendMode.DEFAULT, ).fold( ifLeft = { error -> - Timber.e(error.toString()) + TangemLogger.e(error.toString()) uiState.update(YieldSupplyTransactionReadyTransformer) analytics.send( YieldSupplyAnalytics.EarnErrors( @@ -323,8 +323,8 @@ internal class YieldSupplyStartEarningModel @Inject constructor( } getCurrenciesStatusUpdates() }, - ifLeft = { - Timber.w(it.toString()) + ifLeft = { error -> + TangemLogger.w(error.toString()) showAlertError() }, ) @@ -362,7 +362,7 @@ internal class YieldSupplyStartEarningModel @Inject constructor( ) }, ifEmpty = { - Timber.w("Unable to get crypto currency status: ${cryptoCurrency.id}") + TangemLogger.w("Unable to get crypto currency status: ${cryptoCurrency.id}") showAlertError() }, ) diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt index fbee3f5bb8..2d62921de0 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt @@ -46,7 +46,7 @@ import com.tangem.utils.extensions.orZero 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 javax.inject.Inject @Suppress("LongParameterList") @@ -153,7 +153,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor( network = cryptoCurrency.network, ).fold( ifLeft = { error -> - Timber.e(error.toString()) + TangemLogger.e(error.toString()) uiState.update(YieldSupplyTransactionReadyTransformer) analytics.send( YieldSupplyAnalytics.EarnErrors( diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 4cde3e5c09..32ce0df01b 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -77,7 +77,6 @@ rekotlin = "1.0.4" retrofit = "2.11.0" retrofitMoshiConverter = "2.9.0" spongycastleCryptoCore = "1.58.0.0" -timber = "4.7.1" kermit = "2.1.0" viewBindingDelegate = "1.5.9" xmlShimmer = "1.1.3" @@ -284,7 +283,6 @@ reKotlin = { module = "org.rekotlin:rekotlin", version.ref = "rekotlin" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit-response-type-keeper = { module = "com.squareup.retrofit2:response-type-keeper", version.ref = "retrofit" } retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "retrofitMoshiConverter" } -timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } viewBindingDelegate = { module = "com.github.kirich1409:viewbindingpropertydelegate-noreflection", version.ref = "viewBindingDelegate" } xmlShimmer = { module = "com.github.skydoves:androidveil", version.ref = "xmlShimmer" } diff --git a/libs/blockchain-sdk/build.gradle.kts b/libs/blockchain-sdk/build.gradle.kts index 42a75d606f..8e9d2b66df 100644 --- a/libs/blockchain-sdk/build.gradle.kts +++ b/libs/blockchain-sdk/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.timber) ksp(deps.moshi.kotlin.codegen) kaptForObfuscatingVariants(deps.retrofit.response.type.keeper) // endregion diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/WalletManagerFactoryCreator.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/WalletManagerFactoryCreator.kt index 6c0fb03aca..2327fa9623 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/WalletManagerFactoryCreator.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/WalletManagerFactoryCreator.kt @@ -7,7 +7,7 @@ import com.tangem.blockchain.common.WalletManagerFactory import com.tangem.blockchain.common.datastorage.BlockchainDataStorage import com.tangem.blockchain.common.logging.BlockchainSDKLogger import com.tangem.blockchainsdk.providers.BlockchainProviderTypes -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -26,7 +26,7 @@ internal class WalletManagerFactoryCreator @Inject constructor( ) { fun create(config: BlockchainSdkConfig, blockchainProviderTypes: BlockchainProviderTypes): WalletManagerFactory { - Timber.i("Create WalletManagerFactory") + TangemLogger.i("Create WalletManagerFactory") return WalletManagerFactory( config = config, diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt index b988b3fce1..ba05506e1a 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/converters/BlockchainProviderTypesConverter.kt @@ -6,7 +6,7 @@ import com.tangem.blockchainsdk.providers.BlockchainProviderTypes import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.utils.converter.TwoWayConverter -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Converts [BlockchainProvidersResponse] to [BlockchainProviderTypes] and vice versa @@ -23,7 +23,7 @@ internal object BlockchainProviderTypesConverter : val providerTypes = ProviderTypeConverter.convertList(input = blockchainProviders) providerTypes.forEach { - if (it == null) Timber.e("$blockchain provider type is not supported") + if (it == null) TangemLogger.e("$blockchain provider type is not supported") } blockchain to providerTypes.filterNotNull() diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseLoader.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseLoader.kt index 4c04ab93ee..86a63d3888 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseLoader.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseLoader.kt @@ -6,7 +6,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.config.providers.BlockchainProvidersStorage import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.runCatching -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -53,7 +53,7 @@ internal class BlockchainProvidersResponseLoader @Inject constructor( ) }, onFailure = { throwable -> - Timber.e(throwable, "Failed to load blockchain provider types from backend") + TangemLogger.e("Failed to load blockchain provider types from backend", throwable) localResponse.ifEmpty { null } }, ) diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt index 6e1a918463..575672207a 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/BlockchainProvidersResponseMerger.kt @@ -5,7 +5,7 @@ import com.tangem.blockchainsdk.BlockchainProvidersResponse import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.core.analytics.models.ExceptionAnalyticsEvent import com.tangem.datasource.local.config.providers.models.ProviderModel -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject /** @@ -81,7 +81,7 @@ internal class BlockchainProvidersResponseMerger @Inject internal constructor( "Remote config does not contain some blockchains or providers information", ) - Timber.e(exception) + TangemLogger.e("Error", exception) analyticsExceptionHandler.sendException( ExceptionAnalyticsEvent( diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt index 44587e8923..349870c0c8 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/DevBlockchainProvidersTypesManager.kt @@ -8,7 +8,7 @@ import com.tangem.blockchainsdk.converters.BlockchainProviderTypesConverter import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Implementation of [BlockchainProvidersTypesManager] in DEV environment @@ -36,7 +36,7 @@ internal class DevBlockchainProvidersTypesManager( val changed = changedBlockchainProvidersStore.data.firstOrNull().orEmpty() if (changed.isEmpty()) { - Timber.i("Initialize ChangedBlockchainProvidersStore") + TangemLogger.i("Initialize ChangedBlockchainProvidersStore") changedBlockchainProvidersStore.updateData { BlockchainProviderTypesConverter.convertBack(initial) } diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt index c535a0f61a..d1d0a03326 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/providers/ProdBlockchainProvidersTypesManager.kt @@ -2,7 +2,7 @@ package com.tangem.blockchainsdk.providers import com.tangem.blockchainsdk.converters.BlockchainProviderTypesConverter import kotlinx.coroutines.flow.Flow -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger import javax.inject.Inject import javax.inject.Singleton @@ -26,11 +26,11 @@ internal class ProdBlockchainProvidersTypesManager @Inject constructor( val response = blockchainProvidersResponseLoader.load() if (response == null) { - Timber.e("Error loading BlockchainProviderTypes") + TangemLogger.e("Error loading BlockchainProviderTypes") return } - Timber.i("Update BlockchainProviderTypes") + TangemLogger.i("Update BlockchainProviderTypes") blockchainProviderTypesStore.store( value = BlockchainProviderTypesConverter.convert(response), diff --git a/libs/crypto/build.gradle.kts b/libs/crypto/build.gradle.kts index 4b9238c713..6f903222b3 100644 --- a/libs/crypto/build.gradle.kts +++ b/libs/crypto/build.gradle.kts @@ -28,7 +28,6 @@ dependencies { // region Other deps implementation(deps.kotlin.coroutines) - implementation(deps.timber) // endregion // region Test libraries diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/AccountNodeRecognizer.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/AccountNodeRecognizer.kt index 32e90c0d4b..026215cd7c 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/AccountNodeRecognizer.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/AccountNodeRecognizer.kt @@ -4,7 +4,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.isUTXO import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.domain.models.network.Network -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** * Utility class to recognize the account node in a derivation path based on the blockchain type. @@ -36,7 +36,7 @@ class AccountNodeRecognizer(private val blockchain: Blockchain) { .takeIf { nodesCount >= it } if (index == null) { - Timber.e("Cannot determine account node index for ${blockchain.fullName}: ${derivationPath.rawPath}") + TangemLogger.e("Cannot determine account node index for ${blockchain.fullName}: ${derivationPath.rawPath}") } return index @@ -63,7 +63,7 @@ class AccountNodeRecognizer(private val blockchain: Blockchain) { fun recognize(derivationPath: DerivationPath): Long? { return runCatching { if (!blockchain.isAccountsSupported()) { - Timber.e("Account derivation is not supported for blockchain: ${blockchain.fullName}") + TangemLogger.e("Account derivation is not supported for blockchain: ${blockchain.fullName}") return null } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/MutableDerivationPath.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/MutableDerivationPath.kt index fe1f193f9a..a1d01ad5e5 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/MutableDerivationPath.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/derivation/MutableDerivationPath.kt @@ -3,7 +3,7 @@ package com.tangem.lib.crypto.derivation import com.tangem.blockchain.common.Blockchain import com.tangem.crypto.hdWallet.DerivationNode import com.tangem.crypto.hdWallet.DerivationPath -import timber.log.Timber +import com.tangem.utils.logging.TangemLogger /** Extension function to convert a [DerivationPath] into a [MutableDerivationPath] */ fun DerivationPath.toMutable(): MutableDerivationPath = MutableDerivationPath(value = this) @@ -33,7 +33,7 @@ class MutableDerivationPath internal constructor(val value: DerivationPath) { is DerivationNode.NonHardened -> DerivationNode.NonHardened(value) } } else { - Timber.e("Account node not found in the derivation path: ${this@MutableDerivationPath.value}") + TangemLogger.e("Account node not found in the derivation path: ${this@MutableDerivationPath.value}") } return DerivationPath(path = mutableNodes).toMutable() diff --git a/libs/tangem-sdk-api/build.gradle.kts b/libs/tangem-sdk-api/build.gradle.kts index f780f554c2..bf167d3a08 100644 --- a/libs/tangem-sdk-api/build.gradle.kts +++ b/libs/tangem-sdk-api/build.gradle.kts @@ -29,7 +29,6 @@ dependencies { } /** Other libraries */ - implementation(deps.timber) /** DI */ implementation(deps.hilt.android)