From cb8dfb4873a9d2fe6b7a3145c666784a62ecc590 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:35:01 +0200 Subject: [PATCH] Add migration for custom color scheme --- .../CustomColorSchemeSettingsScreenVM.kt | 43 +----------- .../mm20/launcher2/preferences/DataStore.kt | 3 +- .../de/mm20/launcher2/preferences/Defaults.kt | 65 +------------------ .../mm20/launcher2/preferences/ktx/Scheme.kt | 46 +++++++++++++ .../preferences/migrations/Migration_15_16.kt | 51 +++++++++++++++ 5 files changed, 103 insertions(+), 105 deletions(-) create mode 100644 core/preferences/src/main/java/de/mm20/launcher2/preferences/ktx/Scheme.kt create mode 100644 core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_15_16.kt diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CustomColorSchemeSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CustomColorSchemeSettingsScreenVM.kt index 142efcc1..f324224d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CustomColorSchemeSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/CustomColorSchemeSettingsScreenVM.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings.AppearanceSettings.CustomColors +import de.mm20.launcher2.preferences.ktx.toSettingsColorsScheme import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -144,46 +145,4 @@ class CustomColorSchemeSettingsScreenVM : ViewModel(), KoinComponent { val scheme = Scheme.lightFromCorePalette(CorePalette(a1, a2, a3, n1, n2, error)) return scheme.toSettingsColorsScheme() } - - private fun Scheme.toSettingsColorsScheme(): CustomColors.Scheme { - val scheme = this - return CustomColors.Scheme.newBuilder() - .setPrimary(scheme.primary) - .setSurfaceTint(scheme.primary) - .setOnPrimary(scheme.onPrimary) - .setPrimaryContainer(scheme.primaryContainer) - .setOnPrimaryContainer(scheme.onPrimaryContainer) - .setSecondary(scheme.secondary) - .setOnSecondary(scheme.onSecondary) - .setSecondaryContainer(scheme.secondaryContainer) - .setOnSecondaryContainer(scheme.onSecondaryContainer) - .setTertiary(scheme.tertiary) - .setOnTertiary(scheme.onTertiary) - .setTertiaryContainer(scheme.tertiaryContainer) - .setOnTertiaryContainer(scheme.onTertiaryContainer) - .setError(scheme.error) - .setOnError(scheme.onError) - .setErrorContainer(scheme.errorContainer) - .setOnErrorContainer(scheme.onErrorContainer) - .setBackground(scheme.background) - .setOnBackground(scheme.onBackground) - .setSurface(scheme.surface) - .setOnSurface(scheme.onSurface) - .setSurfaceVariant(scheme.surfaceVariant) - .setOnSurfaceVariant(scheme.onSurfaceVariant) - .setOutline(scheme.outline) - .setOutlineVariant(scheme.outlineVariant) - .setInverseSurface(scheme.inverseSurface) - .setInverseOnSurface(scheme.inverseOnSurface) - .setInversePrimary(scheme.inversePrimary) - .setScrim(scheme.scrim) - .setSurfaceDim(scheme.surfaceDim) - .setSurfaceBright(scheme.surfaceBright) - .setSurfaceContainerLowest(scheme.surfaceContainerLowest) - .setSurfaceContainerLow(scheme.surfaceContainerLow) - .setSurfaceContainer(scheme.surfaceContainer) - .setSurfaceContainerHigh(scheme.surfaceContainerHigh) - .setSurfaceContainerHighest(scheme.surfaceContainerHighest) - .build() - } } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt index 1b1b87df..b5af78bf 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt @@ -22,7 +22,7 @@ internal val Context.dataStore: LauncherDataStore by dataStore( } ) -internal const val SchemaVersion = 15 +internal const val SchemaVersion = 16 internal fun getMigrations(context: Context): List> { return listOf( @@ -41,5 +41,6 @@ internal fun getMigrations(context: Context): List> { Migration_12_13(), Migration_13_14(), Migration_14_15(), + Migration_15_16(), ) } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt index a2f38c10..12d65ab4 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.preferences import android.content.Context import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors +import de.mm20.launcher2.preferences.ktx.toSettingsColorsScheme import scheme.Scheme fun createFactorySettings(context: Context): Settings { @@ -209,71 +210,11 @@ internal val DefaultCustomColorsBase: Settings.AppearanceSettings.CustomColors.B internal val DefaultLightCustomColorScheme: Settings.AppearanceSettings.CustomColors.Scheme get() { val scheme = Scheme.light(0xFFACE330.toInt()) - return Settings.AppearanceSettings.CustomColors.Scheme.newBuilder() - .setPrimary(scheme.primary) - .setOnPrimary(scheme.onPrimary) - .setPrimaryContainer(scheme.primaryContainer) - .setOnPrimaryContainer(scheme.onPrimaryContainer) - .setSecondary(scheme.secondary) - .setOnSecondary(scheme.onSecondary) - .setSecondaryContainer(scheme.secondaryContainer) - .setOnSecondaryContainer(scheme.onSecondaryContainer) - .setTertiary(scheme.tertiary) - .setOnTertiary(scheme.onTertiary) - .setTertiaryContainer(scheme.tertiaryContainer) - .setOnTertiaryContainer(scheme.onTertiaryContainer) - .setBackground(scheme.background) - .setOnBackground(scheme.onBackground) - .setSurface(scheme.surface) - .setOnSurface(scheme.onSurface) - .setSurfaceVariant(scheme.surfaceVariant) - .setOnSurfaceVariant(scheme.onSurfaceVariant) - .setError(scheme.error) - .setOnError(scheme.onError) - .setErrorContainer(scheme.errorContainer) - .setOnErrorContainer(scheme.onErrorContainer) - .setInverseSurface(scheme.inverseSurface) - .setInverseOnSurface(scheme.inverseOnSurface) - .setInversePrimary(scheme.inversePrimary) - .setOutline(scheme.outline) - .setScrim(scheme.scrim) - .setOutlineVariant(scheme.outlineVariant) - .setSurfaceTint(scheme.primary) - .build() + return scheme.toSettingsColorsScheme() } internal val DefaultDarkCustomColorScheme: Settings.AppearanceSettings.CustomColors.Scheme get() { val scheme = Scheme.dark(0xFFACE330.toInt()) - return Settings.AppearanceSettings.CustomColors.Scheme.newBuilder() - .setPrimary(scheme.primary) - .setOnPrimary(scheme.onPrimary) - .setPrimaryContainer(scheme.primaryContainer) - .setOnPrimaryContainer(scheme.onPrimaryContainer) - .setSecondary(scheme.secondary) - .setOnSecondary(scheme.onSecondary) - .setSecondaryContainer(scheme.secondaryContainer) - .setOnSecondaryContainer(scheme.onSecondaryContainer) - .setTertiary(scheme.tertiary) - .setOnTertiary(scheme.onTertiary) - .setTertiaryContainer(scheme.tertiaryContainer) - .setOnTertiaryContainer(scheme.onTertiaryContainer) - .setBackground(scheme.background) - .setOnBackground(scheme.onBackground) - .setSurface(scheme.surface) - .setOnSurface(scheme.onSurface) - .setSurfaceVariant(scheme.surfaceVariant) - .setOnSurfaceVariant(scheme.onSurfaceVariant) - .setError(scheme.error) - .setOnError(scheme.onError) - .setErrorContainer(scheme.errorContainer) - .setOnErrorContainer(scheme.onErrorContainer) - .setInverseSurface(scheme.inverseSurface) - .setInverseOnSurface(scheme.inverseOnSurface) - .setInversePrimary(scheme.inversePrimary) - .setOutline(scheme.outline) - .setScrim(scheme.scrim) - .setOutlineVariant(scheme.outlineVariant) - .setSurfaceTint(scheme.primary) - .build() + return scheme.toSettingsColorsScheme() } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/ktx/Scheme.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ktx/Scheme.kt new file mode 100644 index 00000000..a79d0240 --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/ktx/Scheme.kt @@ -0,0 +1,46 @@ +package de.mm20.launcher2.preferences.ktx + +import de.mm20.launcher2.preferences.Settings +import scheme.Scheme + +fun Scheme.toSettingsColorsScheme(): Settings.AppearanceSettings.CustomColors.Scheme { + val scheme = this + return Settings.AppearanceSettings.CustomColors.Scheme.newBuilder() + .setPrimary(scheme.primary) + .setSurfaceTint(scheme.primary) + .setOnPrimary(scheme.onPrimary) + .setPrimaryContainer(scheme.primaryContainer) + .setOnPrimaryContainer(scheme.onPrimaryContainer) + .setSecondary(scheme.secondary) + .setOnSecondary(scheme.onSecondary) + .setSecondaryContainer(scheme.secondaryContainer) + .setOnSecondaryContainer(scheme.onSecondaryContainer) + .setTertiary(scheme.tertiary) + .setOnTertiary(scheme.onTertiary) + .setTertiaryContainer(scheme.tertiaryContainer) + .setOnTertiaryContainer(scheme.onTertiaryContainer) + .setError(scheme.error) + .setOnError(scheme.onError) + .setErrorContainer(scheme.errorContainer) + .setOnErrorContainer(scheme.onErrorContainer) + .setBackground(scheme.background) + .setOnBackground(scheme.onBackground) + .setSurface(scheme.surface) + .setOnSurface(scheme.onSurface) + .setSurfaceVariant(scheme.surfaceVariant) + .setOnSurfaceVariant(scheme.onSurfaceVariant) + .setOutline(scheme.outline) + .setOutlineVariant(scheme.outlineVariant) + .setInverseSurface(scheme.inverseSurface) + .setInverseOnSurface(scheme.inverseOnSurface) + .setInversePrimary(scheme.inversePrimary) + .setScrim(scheme.scrim) + .setSurfaceDim(scheme.surfaceDim) + .setSurfaceBright(scheme.surfaceBright) + .setSurfaceContainerLowest(scheme.surfaceContainerLowest) + .setSurfaceContainerLow(scheme.surfaceContainerLow) + .setSurfaceContainer(scheme.surfaceContainer) + .setSurfaceContainerHigh(scheme.surfaceContainerHigh) + .setSurfaceContainerHighest(scheme.surfaceContainerHighest) + .build() +} \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_15_16.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_15_16.kt new file mode 100644 index 00000000..5d26c1ee --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_15_16.kt @@ -0,0 +1,51 @@ +package de.mm20.launcher2.preferences.migrations + +import de.mm20.launcher2.preferences.Settings +import de.mm20.launcher2.preferences.Settings.AppearanceSettings.CustomColors.Scheme +import palettes.TonalPalette + +class Migration_15_16 : VersionedMigration(15, 16) { + override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder { + return builder.setAppearance( + builder.appearance.toBuilder() + .setCustomColors( + builder.appearance.customColors.toBuilder() + .setLightScheme( + migrateColorScheme( + builder.appearance.customColors.lightScheme, + false, + builder.appearance.customColors.advancedMode + ) + ) + .setDarkScheme( + migrateColorScheme( + builder.appearance.customColors.darkScheme, + true, + builder.appearance.customColors.advancedMode + ) + ) + ) + ) + } + + fun migrateColorScheme(colorScheme: Scheme, dark: Boolean, advancedMode: Boolean): Scheme { + val oldSurface = colorScheme.surface + val oldSurfaceVariant = colorScheme.surfaceVariant + val neutralPalette = TonalPalette.fromInt(oldSurface) + val neutralVariantPalette = TonalPalette.fromInt(oldSurfaceVariant) + + return colorScheme.toBuilder().apply { + if (!advancedMode) { + surface = neutralPalette.tone(if (dark) 6 else 98) + } + surfaceDim = neutralPalette.tone(if (dark) 6 else 87) + surfaceBright = neutralPalette.tone(if (dark) 24 else 98) + surfaceContainerLowest = neutralVariantPalette.tone(if (dark) 4 else 100) + surfaceContainerLow = neutralVariantPalette.tone(if (dark) 10 else 96) + surfaceContainer = neutralVariantPalette.tone(if (dark) 12 else 94) + surfaceContainerHigh = neutralVariantPalette.tone(if (dark) 17 else 92) + surfaceContainerHighest = neutralVariantPalette.tone(if (dark) 22 else 90) + }.build() + } + +} \ No newline at end of file