Add color scheme import/export
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user