Updated on 2026-08-14

This commit is contained in:
Tangem 2024-03-01 14:14:52 +08:00
parent 3f1102f232
commit 6af3bb18e4
7 changed files with 65 additions and 6 deletions

View file

@ -65,11 +65,11 @@ class AppPreferencesStore(
} }
/** Get map with [String] key and value [V] by string [key] from [MutablePreferences] */ /** Get map with [String] key and value [V] by string [key] from [MutablePreferences] */
inline fun <reified V> MutablePreferences.getObjectMap(key: Preferences.Key<String>): Map<String, V>? { inline fun <reified V> MutablePreferences.getObjectMap(key: Preferences.Key<String>): Map<String, V> {
val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java) val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java)
val adapter = moshi.adapter<Map<String, V>>(type) val adapter = moshi.adapter<Map<String, V>>(type)
return this[key]?.let(adapter::fromJson) return this[key]?.let(adapter::fromJson).orEmpty()
} }
/** /**

View file

@ -61,6 +61,8 @@ object PreferencesKeys {
val IS_TANGEM_TOS_ACCEPTED_KEY by lazy { booleanPreferencesKey(name = "tangem_tos_accepted") } val IS_TANGEM_TOS_ACCEPTED_KEY by lazy { booleanPreferencesKey(name = "tangem_tos_accepted") }
val APP_LOGS_KEY by lazy { stringPreferencesKey(name = "app_logs") }
fun getStart2CoinTOSAcceptedKey(region: String?) = booleanPreferencesKey(name = "start2Coin_tos_accepted_$region") fun getStart2CoinTOSAcceptedKey(region: String?) = booleanPreferencesKey(name = "start2Coin_tos_accepted_$region")
} }

View file

@ -22,9 +22,15 @@ dependencies {
implementation(deps.androidx.datastore) implementation(deps.androidx.datastore)
/** DI */ // region DI
implementation(deps.hilt.android) implementation(deps.hilt.android)
kapt(deps.hilt.kapt) kapt(deps.hilt.kapt)
// endregion
// region Others dependencies
implementation(deps.jodatime)
implementation(deps.kotlin.coroutines) implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
// endregion
} }

View file

@ -3,11 +3,14 @@ package com.tangem.data.settings
import com.tangem.data.source.preferences.PreferencesDataSource import com.tangem.data.source.preferences.PreferencesDataSource
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getObjectMap
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
import com.tangem.datasource.local.preferences.utils.store import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.settings.models.AppLogsModel
import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.joda.time.DateTime
internal class DefaultSettingsRepository( internal class DefaultSettingsRepository(
private val preferencesDataSource: PreferencesDataSource, private val preferencesDataSource: PreferencesDataSource,
@ -32,4 +35,38 @@ internal class DefaultSettingsRepository(
value = isEnabled, value = isEnabled,
) )
} }
override suspend fun getAppLogs(): List<AppLogsModel> {
return appPreferencesStore.getObjectMap<String>(key = PreferencesKeys.APP_LOGS_KEY)
.map { AppLogsModel(timestamp = it.key.toLong(), message = it.value) }
}
override suspend fun updateAppLogs(message: String) {
val newLogs = DateTime.now().millis.toString() to message
appPreferencesStore.editData { preferences ->
val savedLogs = preferences.getObjectMap<String>(PreferencesKeys.APP_LOGS_KEY)
preferences.setObjectMap(key = PreferencesKeys.APP_LOGS_KEY, value = savedLogs + newLogs)
}
}
override suspend fun deleteDeprecatedLogs() {
val threeDaysAgo = getThreeDaysAgoTimestamp()
appPreferencesStore.editData { preferences ->
val savedLogs = preferences.getObjectMap<String>(PreferencesKeys.APP_LOGS_KEY)
preferences.setObjectMap(
key = PreferencesKeys.APP_LOGS_KEY,
value = savedLogs.filterKeys { it.toLong() > threeDaysAgo },
)
}
}
private fun getThreeDaysAgoTimestamp(): Long = DateTime.now().minusDays(THREE_DAYS).millis
private companion object {
const val THREE_DAYS = 3
}
} }

View file

@ -0,0 +1,3 @@
package com.tangem.domain.settings.models
data class AppLogsModel(val timestamp: Long, val message: String)

View file

@ -1,5 +1,7 @@
package com.tangem.domain.settings.repositories package com.tangem.domain.settings.repositories
import com.tangem.domain.settings.models.AppLogsModel
interface SettingsRepository { interface SettingsRepository {
suspend fun shouldShowSaveUserWalletScreen(): Boolean suspend fun shouldShowSaveUserWalletScreen(): Boolean
@ -7,4 +9,13 @@ interface SettingsRepository {
suspend fun isWalletScrollPreviewEnabled(): Boolean suspend fun isWalletScrollPreviewEnabled(): Boolean
suspend fun setWalletScrollPreviewAvailability(isEnabled: Boolean) suspend fun setWalletScrollPreviewAvailability(isEnabled: Boolean)
@Throws
suspend fun getAppLogs(): List<AppLogsModel>
@Throws
suspend fun updateAppLogs(message: String)
@Throws
suspend fun deleteDeprecatedLogs()
} }

View file

@ -152,7 +152,7 @@ class DefaultSwapTransactionRepository(
key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY, key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY,
) )
val updatesMap = savedMap?.toMutableMap() ?: mutableMapOf() val updatesMap = savedMap.toMutableMap()
updatesMap[txId] = status updatesMap[txId] = status
mutablePreferences.setObjectMap( mutablePreferences.setObjectMap(
@ -232,9 +232,9 @@ class DefaultSwapTransactionRepository(
val savedList = mutablePreferences.getObjectMap<ExchangeStatusModel>( val savedList = mutablePreferences.getObjectMap<ExchangeStatusModel>(
key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY, key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY,
) )
val editedList = savedList?.filterNot { it.key == txId } val editedList = savedList.filterNot { it.key == txId }
if (editedList.isNullOrEmpty()) { if (editedList.isEmpty()) {
mutablePreferences.remove(key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY) mutablePreferences.remove(key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY)
} else { } else {
mutablePreferences.setObjectMap( mutablePreferences.setObjectMap(