diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index 5c04f34268..ff4810cfc6 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -32,6 +32,7 @@ import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase import com.tangem.features.details.DetailsFeatureToggles import com.tangem.features.pushnotifications.api.featuretoggles.PushNotificationsFeatureToggles +import com.tangem.tap.common.log.TangemAppLoggerInitializer import com.tangem.tap.domain.walletconnect2.domain.WalletConnectSessionsRepository import com.tangem.tap.features.customtoken.api.featuretoggles.CustomTokenFeatureToggles import com.tangem.tap.proxy.AppStateHolder @@ -116,4 +117,6 @@ interface ApplicationEntryPoint { fun getAppRouter(): AppRouter fun getPushNotificationsFeatureToggles(): PushNotificationsFeatureToggles + + fun getTangemAppLogger(): TangemAppLoggerInitializer } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 0c1d250993..42280203ef 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -6,8 +6,6 @@ import android.content.pm.PackageManager import coil.ImageLoader import coil.ImageLoaderFactory import com.chuckerteam.chucker.api.ChuckerInterceptor -import com.orhanobut.logger.AndroidLogAdapter -import com.orhanobut.logger.Logger import com.tangem.Log import com.tangem.LogFormat import com.tangem.TangemSdkLogger @@ -54,8 +52,8 @@ import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandle import com.tangem.tap.common.feedback.AdditionalFeedbackInfo import com.tangem.tap.common.feedback.LegacyFeedbackManager import com.tangem.tap.common.images.createCoilImageLoader +import com.tangem.tap.common.log.TangemAppLoggerInitializer import com.tangem.tap.common.log.TangemLogCollector -import com.tangem.tap.common.log.TimberFormatStrategy import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.appReducer import com.tangem.tap.common.redux.global.GlobalAction @@ -69,7 +67,6 @@ import com.tangem.wallet.BuildConfig import dagger.hilt.EntryPoints import kotlinx.coroutines.runBlocking import org.rekotlin.Store -import timber.log.Timber import com.tangem.tap.domain.walletconnect2.domain.LegacyWalletConnectRepository as WalletConnect2Repository lateinit var store: Store @@ -191,6 +188,9 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { private val pushNotificationsFeatureToggles: PushNotificationsFeatureToggles get() = entryPoint.getPushNotificationsFeatureToggles() + + private val tangemAppLoggerInitializer: TangemAppLoggerInitializer + get() = entryPoint.getTangemAppLogger() // endregion override fun onCreate() { @@ -202,16 +202,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { fun init() { store = createReduxStore() - if (BuildConfig.LOG_ENABLED) { - Logger.addLogAdapter(AndroidLogAdapter(TimberFormatStrategy())) - Timber.plant( - object : Timber.DebugTree() { - override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { - Logger.log(priority, tag, message, t) - } - }, - ) - } + tangemAppLoggerInitializer.initialize() foregroundActivityObserver = ForegroundActivityObserver() activityResultCaller = foregroundActivityObserver 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 new file mode 100644 index 0000000000..7a7e2c72b0 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/log/TangemAppLoggerInitializer.kt @@ -0,0 +1,48 @@ +package com.tangem.tap.common.log + +import android.util.Log +import com.orhanobut.logger.AndroidLogAdapter +import com.orhanobut.logger.Logger +import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.wallet.BuildConfig +import timber.log.Timber + +/** + * Tangem app logger + * + * @property settingsRepository repository for saving logs + * +[REDACTED_AUTHOR] + */ +class TangemAppLoggerInitializer( + private val settingsRepository: SettingsRepository, +) { + + /** Initialize */ + fun initialize() { + if (IS_LOG_ENABLED) { + Logger.addLogAdapter(AndroidLogAdapter(TimberFormatStrategy())) + } + + Timber.plant(tree = createTimberTree()) + } + + private fun createTimberTree(): Timber.Tree { + return object : Timber.DebugTree() { + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + if (IS_LOG_ENABLED) { + Logger.log(priority, tag, message, t) + } + + if (PERMITTED_PRIORITY.contains(priority)) { + settingsRepository.saveLogMessage(message) + } + } + } + } + + private companion object { + val IS_LOG_ENABLED: Boolean = BuildConfig.LOG_ENABLED + val PERMITTED_PRIORITY = listOf(Log.ERROR, Log.INFO) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/log/TangemCardSDKLogger.kt b/app/src/main/java/com/tangem/tap/common/log/TangemCardSDKLogger.kt index 0da020d6bf..fad6b562f7 100644 --- a/app/src/main/java/com/tangem/tap/common/log/TangemCardSDKLogger.kt +++ b/app/src/main/java/com/tangem/tap/common/log/TangemCardSDKLogger.kt @@ -4,11 +4,6 @@ import com.tangem.Log import com.tangem.LogFormat import com.tangem.TangemSdkLogger import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock /** * CardSDK logger implementation @@ -16,7 +11,6 @@ import kotlinx.coroutines.sync.withLock * @property levels logging levels * @property messageFormatter message formatter * @property settingsRepository settings repository - * @property dispatchers coroutine dispatchers provider * [REDACTED_AUTHOR] */ @@ -24,19 +18,11 @@ internal class TangemCardSDKLogger( private val levels: List, private val messageFormatter: LogFormat, private val settingsRepository: SettingsRepository, - private val dispatchers: CoroutineDispatcherProvider, ) : TangemSdkLogger { - private val scope = CoroutineScope(dispatchers.main) - private val mutex = Mutex() - override fun log(message: () -> String, level: Log.Level) { if (!levels.contains(level)) return - scope.launch(dispatchers.main) { - mutex.withLock { - settingsRepository.updateAppLogs(message = messageFormatter.format(message, level)) - } - } + settingsRepository.saveLogMessage(message = messageFormatter.format(message, level)) } } \ No newline at end of file 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 903d5542ea..c275de1626 100644 --- a/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt +++ b/app/src/main/java/com/tangem/tap/data/TangemBlockchainSDKLogger.kt @@ -2,33 +2,19 @@ package com.tangem.tap.data import com.tangem.blockchain.common.logging.BlockchainSDKLogger import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock /** * BlockchainSDK logger implementation * * @property settingsRepository settings repository - * @property dispatchers coroutine dispatchers provider * [REDACTED_AUTHOR] */ internal class TangemBlockchainSDKLogger( private val settingsRepository: SettingsRepository, - private val dispatchers: CoroutineDispatcherProvider, ) : BlockchainSDKLogger { - private val scope = CoroutineScope(dispatchers.main) - private val mutex = Mutex() - override fun log(level: BlockchainSDKLogger.Level, message: String) { - scope.launch(dispatchers.main) { - mutex.withLock { - settingsRepository.updateAppLogs(message) - } - } + settingsRepository.saveLogMessage(message) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/data/BlockchainSDKLoggerModule.kt b/app/src/main/java/com/tangem/tap/di/data/BlockchainSDKLoggerModule.kt deleted file mode 100644 index 90906e322d..0000000000 --- a/app/src/main/java/com/tangem/tap/di/data/BlockchainSDKLoggerModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.tangem.tap.di.data - -import com.tangem.blockchain.common.logging.BlockchainSDKLogger -import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.tap.data.TangemBlockchainSDKLogger -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -internal object BlockchainSDKLoggerModule { - - @Provides - @Singleton - fun provideBlockchainSDKLogger( - settingsRepository: SettingsRepository, - dispatchers: CoroutineDispatcherProvider, - ): BlockchainSDKLogger { - return TangemBlockchainSDKLogger(settingsRepository, dispatchers) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/data/CardSDKLoggerModule.kt b/app/src/main/java/com/tangem/tap/di/data/TangemLoggingModule.kt similarity index 59% rename from app/src/main/java/com/tangem/tap/di/data/CardSDKLoggerModule.kt rename to app/src/main/java/com/tangem/tap/di/data/TangemLoggingModule.kt index 9b326b64c7..e361ca70a6 100644 --- a/app/src/main/java/com/tangem/tap/di/data/CardSDKLoggerModule.kt +++ b/app/src/main/java/com/tangem/tap/di/data/TangemLoggingModule.kt @@ -3,9 +3,11 @@ package com.tangem.tap.di.data import com.tangem.Log import com.tangem.LogFormat import com.tangem.TangemSdkLogger +import com.tangem.blockchain.common.logging.BlockchainSDKLogger import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.tap.common.log.TangemAppLoggerInitializer import com.tangem.tap.common.log.TangemCardSDKLogger -import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.tap.data.TangemBlockchainSDKLogger import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -14,14 +16,17 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -internal object CardSDKLoggerModule { +internal object TangemLoggingModule { @Provides @Singleton - fun provideCardSDKLogger( - settingsRepository: SettingsRepository, - dispatchers: CoroutineDispatcherProvider, - ): TangemSdkLogger { + fun provideAppLoggerInitializer(settingsRepository: SettingsRepository): TangemAppLoggerInitializer { + return TangemAppLoggerInitializer(settingsRepository) + } + + @Provides + @Singleton + fun provideCardSDKLogger(settingsRepository: SettingsRepository): TangemSdkLogger { val logLevels = listOf( Log.Level.ApduCommand, Log.Level.Apdu, @@ -40,7 +45,12 @@ internal object CardSDKLoggerModule { levels = logLevels, messageFormatter = LogFormat.StairsFormatter(), settingsRepository = settingsRepository, - dispatchers = dispatchers, ) } + + @Provides + @Singleton + fun provideBlockchainSDKLogger(settingsRepository: SettingsRepository): BlockchainSDKLogger { + return TangemBlockchainSDKLogger(settingsRepository) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt index 25d15d3194..b986870d0c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt @@ -1,34 +1,16 @@ package com.tangem.datasource.api.common.config -import com.tangem.datasource.BuildConfig - /** * TangemTech [ApiConfig] * * @property currentEnvironment current api environment */ internal data class TangemTech( - override val currentEnvironment: ApiEnvironment = initializeCurrentEnvironment(), + override val currentEnvironment: ApiEnvironment = ApiEnvironment.PROD, ) : ApiConfig(currentEnvironment) { override val environments: Map = mapOf( ApiEnvironment.DEV to "https://devapi.tangem-tech.com/v1/", ApiEnvironment.PROD to "https://api.tangem-tech.com/v1/", ) - - private companion object { - - fun initializeCurrentEnvironment(): ApiEnvironment { - return when (BuildConfig.BUILD_TYPE) { - DEBUG_BUILD_TYPE, - INTERNAL_BUILD_TYPE, - -> ApiEnvironment.DEV - MOCKED_BUILD_TYPE, - EXTERNAL_BUILD_TYPE, - RELEASE_BUILD_TYPE, - -> ApiEnvironment.PROD - else -> error("Unknown build type [${BuildConfig.BUILD_TYPE}]") - } - } - } } \ No newline at end of file diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt index bfc7de29cc..dd71cf6d85 100644 --- a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt +++ b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt @@ -61,16 +61,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { private fun createTangemTechModel(): Model { return Model( id = ApiConfig.ID.TangemTech, - expected = when (BuildConfig.BUILD_TYPE) { - DEBUG_BUILD_TYPE, - INTERNAL_BUILD_TYPE, - -> "https://devapi.tangem-tech.com/v1/" - MOCKED_BUILD_TYPE, - EXTERNAL_BUILD_TYPE, - RELEASE_BUILD_TYPE, - -> "https://api.tangem-tech.com/v1/" - else -> error("Unknown build type [${BuildConfig.BUILD_TYPE}]") - }, + expected = "https://api.tangem-tech.com/v1/", ) } } 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 335d4b86fd..fd7a139ab2 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 @@ -5,12 +5,21 @@ import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.preferences.utils.store import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import org.joda.time.DateTime internal class DefaultSettingsRepository( private val appPreferencesStore: AppPreferencesStore, + dispatchers: CoroutineDispatcherProvider, ) : SettingsRepository { + private val scope = CoroutineScope(dispatchers.io) + private val mutex = Mutex() + override suspend fun shouldShowSaveUserWalletScreen(): Boolean { return appPreferencesStore.getSyncOrDefault( key = PreferencesKeys.SHOULD_SHOW_SAVE_USER_WALLET_SCREEN_KEY, @@ -36,13 +45,17 @@ internal class DefaultSettingsRepository( ) } - override suspend fun updateAppLogs(message: String) { + override fun saveLogMessage(message: String) { val newLogs = DateTime.now().millis.toString() to message - appPreferencesStore.editData { preferences -> - val savedLogs = preferences.getObjectMap(PreferencesKeys.APP_LOGS_KEY) + scope.launch { + mutex.withLock { + appPreferencesStore.editData { preferences -> + val savedLogs = preferences.getObjectMap(PreferencesKeys.APP_LOGS_KEY) - preferences.setObjectMap(key = PreferencesKeys.APP_LOGS_KEY, value = savedLogs + newLogs) + preferences.setObjectMap(key = PreferencesKeys.APP_LOGS_KEY, value = savedLogs + newLogs) + } + } } } diff --git a/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt b/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt index d1daa5b8a0..3efdd2e7eb 100644 --- a/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt +++ b/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt @@ -9,6 +9,7 @@ import com.tangem.domain.settings.repositories.AppRatingRepository import com.tangem.domain.settings.repositories.PermissionRepository import com.tangem.domain.settings.repositories.PromoSettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -21,8 +22,11 @@ internal object SettingsDataModule { @Provides @Singleton - fun provideSettingsRepository(appPreferencesStore: AppPreferencesStore): SettingsRepository { - return DefaultSettingsRepository(appPreferencesStore = appPreferencesStore) + fun provideSettingsRepository( + appPreferencesStore: AppPreferencesStore, + dispatchers: CoroutineDispatcherProvider, + ): SettingsRepository { + return DefaultSettingsRepository(appPreferencesStore = appPreferencesStore, dispatchers = dispatchers) } @Provides diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt index f69e364662..a3cbd7d4f8 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt @@ -16,8 +16,8 @@ internal class FeedbackDataBuilder { fun addCardInfo(cardInfo: CardInfo) { builder.appendKeyValue("Card ID", cardInfo.cardId) builder.appendKeyValue("Firmware version", cardInfo.firmwareVersion) - builder.appendKeyValue("Linked cards count:", cardInfo.cardsCount) - builder.appendKeyValue("Has seed phrase:", cardInfo.isImported.toString()) + builder.appendKeyValue("Linked cards count", cardInfo.cardsCount) + builder.appendKeyValue("Has seed phrase", cardInfo.isImported.toString()) builder.appendKeyValue("Card Blockchain", cardInfo.cardBlockchain) builder.appendSignedHashes(cardInfo.signedHashesList) } diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt index 3b5f6d3c40..992990fe85 100644 --- a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt +++ b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt @@ -11,7 +11,7 @@ interface SettingsRepository { suspend fun setWalletScrollPreviewAvailability(isEnabled: Boolean) @Throws - suspend fun updateAppLogs(message: String) + fun saveLogMessage(message: String) @Throws suspend fun deleteDeprecatedLogs(maxSize: Int)