diff --git a/app/src/main/java/com/monstarlab/core/persistence/DataSource.kt b/app/src/main/java/com/monstarlab/core/persistence/DataSource.kt index e22cfa7b..8e1e5f20 100644 --- a/app/src/main/java/com/monstarlab/core/persistence/DataSource.kt +++ b/app/src/main/java/com/monstarlab/core/persistence/DataSource.kt @@ -1,8 +1,7 @@ package com.monstarlab.core.persistence interface DataSource { - suspend fun getAll(): List - suspend fun add(item: T) - suspend fun addAll(items: List) + suspend fun load(): T? + suspend fun save(item: T) suspend fun clear() } diff --git a/app/src/main/java/com/monstarlab/core/persistence/ListDataSource.kt b/app/src/main/java/com/monstarlab/core/persistence/ListDataSource.kt new file mode 100644 index 00000000..9aaeb7d9 --- /dev/null +++ b/app/src/main/java/com/monstarlab/core/persistence/ListDataSource.kt @@ -0,0 +1,6 @@ +package com.monstarlab.core.persistence + +interface ListDataSource : DataSource> { + override suspend fun save(items: List) + suspend fun add(item: T) +} diff --git a/app/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt b/app/src/main/java/com/monstarlab/core/persistence/ListPreferenceDataStore.kt similarity index 67% rename from app/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt rename to app/src/main/java/com/monstarlab/core/persistence/ListPreferenceDataStore.kt index 338fa351..18fca9da 100644 --- a/app/src/main/java/com/monstarlab/core/persistence/SharedPreferenceDataStore.kt +++ b/app/src/main/java/com/monstarlab/core/persistence/ListPreferenceDataStore.kt @@ -11,38 +11,48 @@ import kotlinx.serialization.SerializationException import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.Json -abstract class SharedPreferenceDataStore constructor( +abstract class ListPreferenceDataStore constructor( private val dataStore: DataStore, private val serializer: KSerializer, -) : DataSource { +) : ListDataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) - override suspend fun getAll(): List { + /** + * @return the stored collection of objects or an empty list, if no object was stored + */ + override suspend fun load(): List { return try { val json = dataStore.data.map { it[key] ?: "" }.first() Json.decodeFromString(ListSerializer(serializer), json) } catch (e: SerializationException) { - emptyList() + emptyList() } } + /** + * Add a single [item] to the collection of stored elements + */ override suspend fun add(item: T) { - val list = getAll().toMutableList() - list.add(item) - addAll(list) + save(load().plus(item)) } - override suspend fun addAll(items: List) { + /** + * Write [items] to storage, replacing any current ones + */ + override suspend fun save(items: List) { val json = Json.encodeToString(ListSerializer(serializer), items) dataStore.edit { it[key] = json } } + /** + * Remove the storage + */ override suspend fun clear() { dataStore.edit { - it[key] = "" + it.remove(key) } } } diff --git a/app/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt b/app/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt deleted file mode 100644 index b0e51603..00000000 --- a/app/src/main/java/com/monstarlab/core/persistence/SingleDataSource.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.monstarlab.core.persistence - -interface SingleDataSource { - suspend fun get(): T? - suspend fun add(item: T) - suspend fun clear() -} diff --git a/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt b/app/src/main/java/com/monstarlab/core/persistence/SinglePreferenceDataStore.kt similarity index 69% rename from app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt rename to app/src/main/java/com/monstarlab/core/persistence/SinglePreferenceDataStore.kt index 5cba9ee9..60321dbf 100644 --- a/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt +++ b/app/src/main/java/com/monstarlab/core/persistence/SinglePreferenceDataStore.kt @@ -11,24 +11,29 @@ import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import timber.log.Timber -abstract class SingleSharedPreferenceDataStore constructor( +abstract class SinglePreferenceDataStore constructor( private val dataStore: DataStore, private val serializer: KSerializer, -) : SingleDataSource { +) : DataSource { private val key = stringPreferencesKey(this.javaClass.simpleName) - override suspend fun get(): T? { + /** + * @return the stored object or null, if no object was stored + */ + override suspend fun load(): T? { return try { val json = dataStore.data.map { it[key] ?: "" }.first() - val entries = Json.decodeFromString(serializer, json) - entries + Json.decodeFromString(serializer, json) } catch (e: SerializationException) { null } } - override suspend fun add(item: T) { + /** + * Write [item] to storage, replacing any existing ones + */ + override suspend fun save(item: T) { try { val json = Json.encodeToString(serializer, item) dataStore.edit { @@ -39,7 +44,12 @@ abstract class SingleSharedPreferenceDataStore constructor( } } + /** + * Remove the storage + */ override suspend fun clear() { - dataStore.edit { it[key] = "" } + dataStore.edit { + it.remove(key) + } } } diff --git a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcesPreferenceStore.kt similarity index 60% rename from app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt rename to app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcesPreferenceStore.kt index 0e98e451..9e176083 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcePreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/persistence/ResourcesPreferenceStore.kt @@ -2,10 +2,10 @@ package com.monstarlab.features.resources.data.persistence import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences -import com.monstarlab.core.persistence.SharedPreferenceDataStore +import com.monstarlab.core.persistence.ListPreferenceDataStore import com.monstarlab.features.resources.domain.model.Resource import javax.inject.Inject -class ResourcePreferenceStore @Inject constructor( +class ResourcesPreferenceStore @Inject constructor( dataStore: DataStore, -) : SharedPreferenceDataStore(dataStore, Resource.serializer()) +) : ListPreferenceDataStore(dataStore, Resource.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt index 25dfb7c4..f7ef4a4e 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/repository/ResourceRepositoryImpl.kt @@ -2,19 +2,19 @@ package com.monstarlab.features.resources.data.repository import com.monstarlab.features.resources.data.api.ResourcesApi import com.monstarlab.features.resources.data.api.dtos.toResource -import com.monstarlab.features.resources.data.persistence.ResourcePreferenceStore +import com.monstarlab.features.resources.data.persistence.ResourcesPreferenceStore import com.monstarlab.features.resources.domain.model.Resource import com.monstarlab.features.resources.domain.repository.ResourceRepository import javax.inject.Inject class ResourceRepositoryImpl @Inject constructor( private val api: ResourcesApi, - private val resourcePreferenceStore: ResourcePreferenceStore, + private val resourcesPreferenceStore: ResourcesPreferenceStore, ) : ResourceRepository { override suspend fun get(): List { return api.getResources().data.map { it.toResource() }.also { - resourcePreferenceStore.addAll(it) + resourcesPreferenceStore.save(it) } } } diff --git a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt index bdf3291b..4d6c2476 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/persistence/UserPreferenceStore.kt @@ -2,10 +2,10 @@ package com.monstarlab.features.user.data.persistence import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences -import com.monstarlab.core.persistence.SingleSharedPreferenceDataStore +import com.monstarlab.core.persistence.SinglePreferenceDataStore import com.monstarlab.features.user.domain.model.User import javax.inject.Inject class UserPreferenceStore @Inject constructor( dataStore: DataStore, -) : SingleSharedPreferenceDataStore(dataStore, User.serializer()) +) : SinglePreferenceDataStore(dataStore, User.serializer()) diff --git a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt index 2cd41c4a..6a98895b 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/repository/UserRepositoryImpl.kt @@ -14,7 +14,7 @@ class UserRepositoryImpl @Inject constructor( override suspend fun get(): User { return api.getUser().data.toUser().also { - userPreferenceStore.add(it) + userPreferenceStore.save(it) } } } diff --git a/build.gradle.kts b/build.gradle.kts index 0947dd5d..3f17e9e4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,7 +33,7 @@ subprojects { kotlin { target("**/*.kt") targetExclude("**/RateReminderActions.kt") - ktlint("0.40.0") + ktlint("1.0.0") } } }