Add color scheme import/export

This commit is contained in:
MM20
2023-08-26 15:11:10 +02:00
parent d8e108cb70
commit 6c040bccce
5 changed files with 140 additions and 3 deletions
+2
View File
@@ -1,6 +1,7 @@
plugins {
id("com.android.library")
id("kotlin-android")
kotlin("plugin.serialization")
}
android {
@@ -36,6 +37,7 @@ android {
dependencies {
implementation(libs.bundles.kotlin)
implementation(libs.kotlinx.serialization.json)
implementation(libs.androidx.core)
implementation(libs.androidx.appcompat)
implementation(libs.bundles.androidx.lifecycle)
@@ -0,0 +1,57 @@
package de.mm20.launcher2.themes
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encodeToString
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.contextual
import kotlinx.serialization.modules.polymorphic
internal class ColorRefSerializer: KSerializer<ColorRef> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("$", PrimitiveKind.STRING)
override fun deserialize(decoder: Decoder): ColorRef {
return Color(decoder.decodeString()) as ColorRef
}
override fun serialize(encoder: Encoder, value: ColorRef) {
encoder.encodeString(value.toString())
}
}
internal class StaticColorSerializer: KSerializer<StaticColor> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("#", PrimitiveKind.STRING)
override fun deserialize(decoder: Decoder): StaticColor {
return Color(decoder.decodeString()) as StaticColor
}
override fun serialize(encoder: Encoder, value: StaticColor) {
encoder.encodeString(value.toString())
}
}
internal val module = SerializersModule {
polymorphic(Color::class) {
subclass(ColorRef::class, ColorRefSerializer())
subclass(StaticColor::class, StaticColorSerializer())
}
}
val ThemeJson = Json {
serializersModule = module
useArrayPolymorphism = true
}
fun Theme.toJson(): String {
return ThemeJson.encodeToString(this)
}
fun Theme.Companion.fromJson(json: String): Theme {
return ThemeJson.decodeFromString(json)
}
@@ -2,6 +2,8 @@ package de.mm20.launcher2.themes
import de.mm20.launcher2.database.entities.ThemeEntity
import hct.Hct
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import java.util.UUID
enum class CorePaletteColor {
@@ -70,6 +72,7 @@ value class StaticColor(val color: Int) : Color {
}
}
@Serializable
data class CorePalette<out T : Int?>(
val primary: T,
val secondary: T,
@@ -84,6 +87,7 @@ val EmptyCorePalette = CorePalette<Int?>(null, null, null, null, null, null)
typealias FullCorePalette = CorePalette<Int>
typealias PartialCorePalette = CorePalette<Int?>
@Serializable
data class ColorScheme<out T : Color?>(
val primary: T,
val onPrimary: T,
@@ -127,8 +131,9 @@ data class ColorScheme<out T : Color?>(
typealias FullColorScheme = ColorScheme<Color>
typealias PartialColorScheme = ColorScheme<Color?>
@Serializable
data class Theme(
val id: UUID,
@Transient val id: UUID = UUID.randomUUID(),
val builtIn: Boolean = false,
val name: String,
val corePalette: PartialCorePalette = EmptyCorePalette,