From efebb9550e6269e6394e8eee5c936697eff677ae Mon Sep 17 00:00:00 2001 From: "a.emogurov" Date: Thu, 5 Mar 2026 17:01:35 +0400 Subject: [PATCH] feature: migrate to data store --- .../debug/noop/plugin/servers/DebugServer.kt | 1 - plugins/plugin-servers/build.gradle.kts | 6 +- .../plugin/servers/ServersPluginContainer.kt | 7 +- .../servers/data/DebugServerRepository.kt | 70 ++++--------------- .../plugin/servers/data/model/DebugServer.kt | 11 +-- .../servers/data/model/DebugServersData.kt | 9 +++ .../servers/data/storage/DebugServersDao.kt | 22 ------ .../data/storage/ServersDataSerializer.kt | 23 ++++++ .../servers/data/storage/ServersDataStore.kt | 36 ++++++++++ .../data/storage/ServersPluginDatabase.kt | 30 -------- .../servers/data/storage/ServersStorage.kt | 9 +++ .../data/storage/SharedPreferencesProvider.kt | 13 ---- .../plugin/servers/ui/ServersViewModel.kt | 33 ++++----- .../plugin/servers/ui/ServersViewState.kt | 2 +- 14 files changed, 111 insertions(+), 161 deletions(-) create mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServersData.kt delete mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/DebugServersDao.kt create mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataSerializer.kt create mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataStore.kt delete mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersPluginDatabase.kt create mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersStorage.kt delete mode 100644 plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/SharedPreferencesProvider.kt diff --git a/panel-no-op/src/main/kotlin/com/redmadrobot/debug/noop/plugin/servers/DebugServer.kt b/panel-no-op/src/main/kotlin/com/redmadrobot/debug/noop/plugin/servers/DebugServer.kt index 91d54293..1999cde8 100644 --- a/panel-no-op/src/main/kotlin/com/redmadrobot/debug/noop/plugin/servers/DebugServer.kt +++ b/panel-no-op/src/main/kotlin/com/redmadrobot/debug/noop/plugin/servers/DebugServer.kt @@ -1,7 +1,6 @@ package com.redmadrobot.debug.plugin.servers.data.model data class DebugServer( - val id: Int = 0, val name: String, val url: String, val isDefault: Boolean = false diff --git a/plugins/plugin-servers/build.gradle.kts b/plugins/plugin-servers/build.gradle.kts index 3e498547..16e05965 100644 --- a/plugins/plugin-servers/build.gradle.kts +++ b/plugins/plugin-servers/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - alias(stack.plugins.ksp) id("convention.debug.panel.plugin") + alias(stack.plugins.kotlin.serialization) } description = "Plugin for switching server hosts" @@ -11,9 +11,7 @@ android { dependencies { implementation(androidx.core) - implementation(androidx.room) - implementation(androidx.room.runtime) + implementation(androidx.datastore) implementation(stack.kotlinx.serialization.json) implementation(stack.okhttp) - ksp(androidx.room.compiler) } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPluginContainer.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPluginContainer.kt index 161a9c6f..471497c7 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPluginContainer.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ServersPluginContainer.kt @@ -4,19 +4,18 @@ import com.redmadrobot.debug.core.internal.CommonContainer import com.redmadrobot.debug.core.internal.PluginDependencyContainer import com.redmadrobot.debug.plugin.servers.data.DebugServerRepository import com.redmadrobot.debug.plugin.servers.data.model.DebugServer -import com.redmadrobot.debug.plugin.servers.data.storage.ServersPluginDatabase +import com.redmadrobot.debug.plugin.servers.data.storage.ServersDataStore import com.redmadrobot.debug.plugin.servers.ui.ServersViewModel internal class ServersPluginContainer( private val preinstalledServers: List, private val container: CommonContainer ) : PluginDependencyContainer { - private val pluginStorage by lazy { ServersPluginDatabase.getInstance(container.context) } + private val serversDataStore by lazy { ServersDataStore(container.context) } val serversRepository by lazy { DebugServerRepository( - context = container.context, - debugServersDao = pluginStorage.getDebugServersDao(), + serversDataStore = serversDataStore, preInstalledServers = preinstalledServers, ) } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugServerRepository.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugServerRepository.kt index c87ff3cf..9faef005 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugServerRepository.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/DebugServerRepository.kt @@ -1,76 +1,30 @@ package com.redmadrobot.debug.plugin.servers.data -import android.content.Context -import androidx.core.content.edit import com.redmadrobot.debug.plugin.servers.data.model.DebugServer -import com.redmadrobot.debug.plugin.servers.data.storage.DebugServersDao -import com.redmadrobot.debug.plugin.servers.data.storage.SharedPreferencesProvider -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext +import com.redmadrobot.debug.plugin.servers.data.storage.ServersDataStore internal class DebugServerRepository( - private val context: Context, - private val debugServersDao: DebugServersDao, + private val serversDataStore: ServersDataStore, private val preInstalledServers: List ) { - private val sharedPreferences by lazy { - SharedPreferencesProvider.get(context) - } + fun getPreInstalledServers(): List = preInstalledServers - fun getPreInstalledServers(): List { - return preInstalledServers - } + fun getDefault(): DebugServer = preInstalledServers.first { it.isDefault } - fun saveSelectedServer(selectedServer: DebugServer) { - sharedPreferences.edit { - putString(SELECTED_SERVER_NAME, selectedServer.name) - putString(SELECTED_SERVER_URL, selectedServer.url) - } + suspend fun saveSelectedServer(selectedServer: DebugServer) { + serversDataStore.saveSelected(selectedServer) } suspend fun getSelectedServer(): DebugServer { - val serverName = sharedPreferences.getString(SELECTED_SERVER_NAME, null) - val serverUrl = sharedPreferences.getString(SELECTED_SERVER_URL, null) - - return if (serverName != null && serverUrl != null) { - preInstalledServers.find { it.name == serverName && it.url == serverUrl } - ?: debugServersDao.getServer(serverName, serverUrl) - ?: getDefault() - } else { - getDefault() - } + return serversDataStore.getSelected() ?: getDefault() } - fun getDefault(): DebugServer { - return preInstalledServers.first { it.isDefault } - } + suspend fun addServer(server: DebugServer) = serversDataStore.add(server) - suspend fun addServer(server: DebugServer) { - withContext(Dispatchers.IO) { - debugServersDao.insert(server) - } - } + suspend fun getServers(): List = serversDataStore.getAll() - suspend fun getServers(): List { - return withContext(Dispatchers.IO) { - debugServersDao.getAll() - } - } + suspend fun removeServer(server: DebugServer) = serversDataStore.remove(server) - suspend fun removeServer(server: DebugServer) { - withContext(Dispatchers.IO) { - debugServersDao.remove(server) - } - } - - suspend fun updateServer(server: DebugServer) { - withContext(Dispatchers.IO) { - debugServersDao.update(server) - } - } - - companion object { - private const val SELECTED_SERVER_URL = "SELECTED_SERVER_URL" - private const val SELECTED_SERVER_NAME = "SELECTED_SERVER_NAME" - } + suspend fun updateServer(oldServer: DebugServer, newServer: DebugServer) = + serversDataStore.update(oldServer, newServer) } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServer.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServer.kt index 207a6b3e..a9c58e74 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServer.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServer.kt @@ -1,12 +1,9 @@ package com.redmadrobot.debug.plugin.servers.data.model -import androidx.room.Entity -import androidx.room.PrimaryKey +import kotlinx.serialization.Serializable -@Entity(tableName = DebugServer.TABLE_NAME) +@Serializable public data class DebugServer( - @PrimaryKey(autoGenerate = true) - val id: Int = 0, val name: String, val url: String, val isDefault: Boolean = false @@ -15,8 +12,4 @@ public data class DebugServer( val otherServer = other as DebugServer return this.name == otherServer.name && this.url == otherServer.url } - - internal companion object { - const val TABLE_NAME = "debug_server" - } } diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServersData.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServersData.kt new file mode 100644 index 00000000..7dad9753 --- /dev/null +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/model/DebugServersData.kt @@ -0,0 +1,9 @@ +package com.redmadrobot.debug.plugin.servers.data.model + +import kotlinx.serialization.Serializable + +@Serializable +internal data class DebugServersData( + val servers: List = emptyList(), + val selectedServer: DebugServer? = null +) diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/DebugServersDao.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/DebugServersDao.kt deleted file mode 100644 index 05496964..00000000 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/DebugServersDao.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.redmadrobot.debug.plugin.servers.data.storage - -import androidx.room.* -import com.redmadrobot.debug.plugin.servers.data.model.DebugServer - -@Dao -internal interface DebugServersDao { - @Query("SELECT * FROM ${DebugServer.TABLE_NAME}") - suspend fun getAll(): List - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insert(server: DebugServer) - - @Delete - suspend fun remove(server: DebugServer) - - @Update - suspend fun update(server: DebugServer) - - @Query("SELECT * FROM ${DebugServer.TABLE_NAME} WHERE name = :name AND url =:url") - suspend fun getServer(name: String, url: String): DebugServer? -} diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataSerializer.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataSerializer.kt new file mode 100644 index 00000000..30a2df45 --- /dev/null +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataSerializer.kt @@ -0,0 +1,23 @@ +package com.redmadrobot.debug.plugin.servers.data.storage + +import androidx.datastore.core.Serializer +import com.redmadrobot.debug.plugin.servers.data.model.DebugServersData +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import kotlinx.serialization.json.encodeToStream +import java.io.InputStream +import java.io.OutputStream + +@OptIn(ExperimentalSerializationApi::class) +internal object ServersDataSerializer : Serializer { + override val defaultValue: DebugServersData = DebugServersData() + + override suspend fun readFrom(input: InputStream): DebugServersData { + return Json.decodeFromStream(input) + } + + override suspend fun writeTo(t: DebugServersData, output: OutputStream) { + Json.encodeToStream(t, output) + } +} diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataStore.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataStore.kt new file mode 100644 index 00000000..2a46438d --- /dev/null +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersDataStore.kt @@ -0,0 +1,36 @@ +package com.redmadrobot.debug.plugin.servers.data.storage + +import android.content.Context +import com.redmadrobot.debug.plugin.servers.data.model.DebugServer +import kotlinx.coroutines.flow.first + +internal class ServersDataStore(private val context: Context) { + private val dataStore by lazy { context.serversStorage } + + suspend fun getAll(): List { + return dataStore.data.first().servers + } + + suspend fun add(server: DebugServer) { + dataStore.updateData { data -> data.copy(servers = data.servers + server) } + } + + suspend fun remove(server: DebugServer) { + dataStore.updateData { data -> data.copy(servers = data.servers - server) } + } + + suspend fun update(oldServer: DebugServer, newServer: DebugServer) { + dataStore.updateData { data -> + val updatedServers = data.servers.map { if (it == oldServer) newServer else it } + data.copy(servers = updatedServers) + } + } + + suspend fun saveSelected(server: DebugServer) { + dataStore.updateData { data -> data.copy(selectedServer = server) } + } + + suspend fun getSelected(): DebugServer? { + return dataStore.data.first().selectedServer + } +} diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersPluginDatabase.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersPluginDatabase.kt deleted file mode 100644 index 17c8903c..00000000 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersPluginDatabase.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.redmadrobot.debug.plugin.servers.data.storage - -import android.content.Context -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase -import com.redmadrobot.debug.plugin.servers.data.model.DebugServer - -@Database( - entities = [DebugServer::class], - version = 3 -) -internal abstract class ServersPluginDatabase : RoomDatabase() { - abstract fun getDebugServersDao(): DebugServersDao - - companion object { - private const val DATABASE_NAME = "servers_plugin_db" - - fun getInstance(context: Context): ServersPluginDatabase { - return Room.databaseBuilder( - context.applicationContext, - ServersPluginDatabase::class.java, - DATABASE_NAME - ) - .fallbackToDestructiveMigration(dropAllTables = true) - .allowMainThreadQueries() - .build() - } - } -} diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersStorage.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersStorage.kt new file mode 100644 index 00000000..2ef9b76f --- /dev/null +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/ServersStorage.kt @@ -0,0 +1,9 @@ +package com.redmadrobot.debug.plugin.servers.data.storage + +import android.content.Context +import androidx.datastore.dataStore + +internal val Context.serversStorage by dataStore( + fileName = "plugin_servers.json", + serializer = ServersDataSerializer +) diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/SharedPreferencesProvider.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/SharedPreferencesProvider.kt deleted file mode 100644 index 22f09b88..00000000 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/data/storage/SharedPreferencesProvider.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.redmadrobot.debug.plugin.servers.data.storage - -import android.content.Context -import android.content.SharedPreferences - -internal object SharedPreferencesProvider { - private const val NAME = ":servers" - - fun get(context: Context): SharedPreferences { - val prefFileName = "${context.packageName}$NAME" - return context.getSharedPreferences(prefFileName, 0) - } -} diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewModel.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewModel.kt index c686906d..3d6457b6 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewModel.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewModel.kt @@ -75,13 +75,13 @@ internal class ServersViewModel( return } - if (dialogState.editableServerId == null) { + if (dialogState.editableServer == null) { addServer(dialogState.serverName, dialogState.serverUrl) } else { updateServerData( - dialogState.editableServerId, - dialogState.serverName, - dialogState.serverUrl + oldServer = dialogState.editableServer, + name = dialogState.serverName, + url = dialogState.serverUrl ) } @@ -126,20 +126,15 @@ internal class ServersViewModel( } } - private fun updateServerData(id: Int, name: String, url: String) { - val serverForUpdate = _state.value.addedServers - .find { it.server.id == id } - ?.server - - serverForUpdate?.let { - val updatedServer = serverForUpdate.copy(name = name, url = url) - viewModelScope.safeLaunch { - serversRepository.updateServer(updatedServer) - _state.update { serversState -> - serversState.copy( - addedServers = serversRepository.getServers().mapToServerItems() - ) - } + private fun updateServerData(oldServer: DebugServer, name: String, url: String) { + val updatedServer = oldServer.copy(name = name, url = url) + + viewModelScope.safeLaunch { + serversRepository.updateServer(oldServer = oldServer, newServer = updatedServer) + _state.update { serversState -> + serversState.copy( + addedServers = serversRepository.getServers().mapToServerItems() + ) } } } @@ -148,7 +143,7 @@ internal class ServersViewModel( _state.update { serversState -> serversState.copy( serverDialogState = ServerDialogState( - editableServerId = debugServer.id, + editableServer = debugServer, serverName = debugServer.name, serverUrl = debugServer.url, show = true diff --git a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewState.kt b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewState.kt index e54ea5c3..bbd4a8f2 100644 --- a/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewState.kt +++ b/plugins/plugin-servers/src/main/kotlin/com/redmadrobot/debug/plugin/servers/ui/ServersViewState.kt @@ -12,7 +12,7 @@ internal data class ServerDialogState( val show: Boolean = false, val serverName: String = "", val serverUrl: String = "", - val editableServerId: Int? = null, + val editableServer: DebugServer? = null, val inputErrors: ServerDialogErrors? = null )