From f2a18e56c942b612398cb1d850f2e12510e50353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 03:22:05 +0700 Subject: [PATCH 1/8] Enable random theme on startup by default on Android < 12 --- app/src/main/kotlin/moe/rukamori/archivetune/App.kt | 2 +- .../archivetune/ui/screens/settings/AppearanceSettings.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index e3e3f7058..2022636be 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -174,7 +174,7 @@ class App : Application(), SingletonImageLoader.Factory { } // Apply random theme on startup if enabled - if (prefs[RandomThemeOnStartupKey] == true) { + if (prefs[RandomThemeOnStartupKey] ?: (Build.VERSION.SDK_INT < Build.VERSION_CODES.S)) { val randomPalette = ThemePalettes.generateRandomPalette() val seedPalette = ThemeSeedPalette( primary = randomPalette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index dc60cbc86..c652519a9 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -142,7 +142,7 @@ fun AppearanceSettings( ) val (randomThemeOnStartup, onRandomThemeOnStartupChange) = rememberPreference( RandomThemeOnStartupKey, - defaultValue = false + defaultValue = Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) val (darkMode, onDarkModeChange) = rememberEnumPreference( DarkModeKey, From b40ed226e063ff070ebbcc42c3fc3223cd9fdf1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 03:44:03 +0700 Subject: [PATCH 2/8] Add random theme style selector (Material You / Chaos) --- .../kotlin/moe/rukamori/archivetune/App.kt | 9 +++- .../archivetune/constants/PreferenceKeys.kt | 7 +++ .../ui/screens/settings/AppearanceSettings.kt | 22 +++++++++ .../screens/settings/PalettePickerScreen.kt | 46 +++++++++++++++---- app/src/main/res/values/strings.xml | 4 ++ 5 files changed, 76 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index 2022636be..f67c79483 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -175,14 +175,19 @@ class App : Application(), SingletonImageLoader.Factory { // Apply random theme on startup if enabled if (prefs[RandomThemeOnStartupKey] ?: (Build.VERSION.SDK_INT < Build.VERSION_CODES.S)) { - val randomPalette = ThemePalettes.generateRandomPalette() + val styleName = prefs[RandomThemeStyleKey] ?: RandomThemeStyle.MATERIAL_YOU.name + val style = try { RandomThemeStyle.valueOf(styleName) } catch (_: Exception) { RandomThemeStyle.MATERIAL_YOU } + val randomPalette = when (style) { + RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() + RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + } val seedPalette = ThemeSeedPalette( primary = randomPalette.primary, secondary = randomPalette.secondary, tertiary = randomPalette.tertiary, neutral = randomPalette.neutral ) - val encodedPalette = ThemeSeedPaletteCodec.encodeForPreference(seedPalette, "Random") + val encodedPalette = ThemeSeedPaletteCodec.encodeForPreference(seedPalette, style.name) dataStore.edit { settings -> settings[CustomThemeColorKey] = encodedPalette } diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt index b58adfa6a..b3db71859 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt @@ -19,6 +19,13 @@ import java.time.ZoneOffset val DynamicThemeKey = booleanPreferencesKey("dynamicTheme") val CustomThemeColorKey = stringPreferencesKey("customThemeColor") val RandomThemeOnStartupKey = booleanPreferencesKey("randomThemeOnStartup") + +enum class RandomThemeStyle { + MATERIAL_YOU, + CHAOS, +} + +val RandomThemeStyleKey = stringPreferencesKey("randomThemeStyle") val DarkModeKey = stringPreferencesKey("darkMode") val PureBlackKey = booleanPreferencesKey("pureBlack") val DisableAnimationsKey = booleanPreferencesKey("disableAnimations") diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index c652519a9..6402f3b31 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -89,6 +89,8 @@ import moe.rukamori.archivetune.constants.MiniPlayerBackgroundStyle import moe.rukamori.archivetune.constants.MiniPlayerBackgroundStyleKey import moe.rukamori.archivetune.constants.PureBlackKey import moe.rukamori.archivetune.constants.RandomThemeOnStartupKey +import moe.rukamori.archivetune.constants.RandomThemeStyle +import moe.rukamori.archivetune.constants.RandomThemeStyleKey import moe.rukamori.archivetune.constants.PlayerButtonsStyle import moe.rukamori.archivetune.constants.PlayerButtonsStyleKey import moe.rukamori.archivetune.constants.SliderStyle @@ -144,6 +146,10 @@ fun AppearanceSettings( RandomThemeOnStartupKey, defaultValue = Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) + val (randomThemeStyle, onRandomThemeStyleChange) = rememberEnumPreference( + RandomThemeStyleKey, + defaultValue = RandomThemeStyle.MATERIAL_YOU + ) val (darkMode, onDarkModeChange) = rememberEnumPreference( DarkModeKey, defaultValue = DarkMode.AUTO @@ -399,6 +405,22 @@ fun AppearanceSettings( ) } + item(visible = randomThemeOnStartup && (!dynamicTheme || Build.VERSION.SDK_INT < Build.VERSION_CODES.S)) { + EnumListPreference( + title = { Text(stringResource(R.string.random_theme_style)) }, + description = stringResource(R.string.random_theme_style_desc), + icon = { Icon(painterResource(R.drawable.shuffle), null) }, + selectedValue = randomThemeStyle, + valueText = { + when (it) { + RandomThemeStyle.MATERIAL_YOU -> stringResource(R.string.random_style_material_you) + RandomThemeStyle.CHAOS -> stringResource(R.string.random_style_chaos) + } + }, + onValueSelected = onRandomThemeStyleChange, + ) + } + item(visible = !dynamicTheme || Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { PreferenceEntry( title = { Text(stringResource(R.string.color_palette)) }, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt index 39d586bbe..5acaf90a7 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt @@ -775,20 +775,46 @@ object ThemePalettes { fun generateRandomPalette(): ThemePalette { val random = java.util.Random() - val primaryHue = random.nextFloat() * 360f - val primarySaturation = 0.5f + random.nextFloat() * 0.4f - val primaryLightness = 0.4f + random.nextFloat() * 0.25f - val primary = hctToColor(primaryHue, primarySaturation, primaryLightness) - val secondaryHue = (primaryHue + 30f + random.nextFloat() * 60f) % 360f - val secondary = hctToColor(secondaryHue, primarySaturation * 0.9f, primaryLightness * 1.1f) - val tertiaryHue = (primaryHue - 30f - random.nextFloat() * 60f + 360f) % 360f - val tertiary = hctToColor(tertiaryHue, primarySaturation * 0.8f, primaryLightness * 0.95f) - val neutralHue = (primaryHue + random.nextFloat() * 20f - 10f) % 360f - val neutral = hctToColor(neutralHue, 0.1f, primaryLightness * 0.8f) + val hue = random.nextFloat() * 360f + val saturation = 0.5f + random.nextFloat() * 0.4f + val lightness = 0.4f + random.nextFloat() * 0.25f + val primary = hctToColor(hue, saturation, lightness) return ThemePalette( id = "random_" + System.currentTimeMillis(), nameResId = R.string.palette_custom, primary = primary, + secondary = primary, + tertiary = primary, + neutral = primary, + ) + } + + fun generateChaosPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( + random.nextFloat() * 360f, + random.nextFloat(), + random.nextFloat(), + ) + val secondary = hctToColor( + random.nextFloat() * 360f, + random.nextFloat(), + random.nextFloat(), + ) + val tertiary = hctToColor( + random.nextFloat() * 360f, + random.nextFloat(), + random.nextFloat(), + ) + val neutral = hctToColor( + random.nextFloat() * 360f, + random.nextFloat(), + random.nextFloat(), + ) + return ThemePalette( + id = "chaos_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = secondary, tertiary = tertiary, neutral = neutral, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a067b275d..010b97c1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -342,6 +342,10 @@ Enable dynamic theme Random theme on startup Apply a random color palette every time the app starts + Random theme style + Choose how random colors are generated + Material You + Chaos Font Choose the app font source Default From 8ee2d147f9b9c03911ff0736ecd1fe207bd88545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 03:47:18 +0700 Subject: [PATCH 3/8] Add Reload new color theme button --- .../ui/screens/settings/AppearanceSettings.kt | 29 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 31 insertions(+) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index 6402f3b31..1f81cbb62 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -88,6 +88,7 @@ import moe.rukamori.archivetune.constants.PlayerBackgroundStyleKey import moe.rukamori.archivetune.constants.MiniPlayerBackgroundStyle import moe.rukamori.archivetune.constants.MiniPlayerBackgroundStyleKey import moe.rukamori.archivetune.constants.PureBlackKey +import moe.rukamori.archivetune.constants.CustomThemeColorKey import moe.rukamori.archivetune.constants.RandomThemeOnStartupKey import moe.rukamori.archivetune.constants.RandomThemeStyle import moe.rukamori.archivetune.constants.RandomThemeStyleKey @@ -124,7 +125,11 @@ import moe.rukamori.archivetune.ui.component.SwitchPreference import moe.rukamori.archivetune.ui.component.ThumbnailCornerRadiusSelectorButton import moe.rukamori.archivetune.ui.player.StyledPlaybackSlider import moe.rukamori.archivetune.ui.theme.CustomFontLoader +import moe.rukamori.archivetune.ui.theme.ThemeSeedPalette +import moe.rukamori.archivetune.ui.theme.ThemeSeedPaletteCodec import moe.rukamori.archivetune.ui.utils.backToMain +import moe.rukamori.archivetune.utils.PreferenceStore +import moe.rukamori.archivetune.utils.dataStore import moe.rukamori.archivetune.utils.isLowRamDevice import moe.rukamori.archivetune.utils.rememberEnumPreference import moe.rukamori.archivetune.utils.rememberPreference @@ -421,6 +426,30 @@ fun AppearanceSettings( ) } + item(visible = randomThemeOnStartup && (!dynamicTheme || Build.VERSION.SDK_INT < Build.VERSION_CODES.S)) { + PreferenceEntry( + title = { Text(stringResource(R.string.reload_random_theme)) }, + description = stringResource(R.string.reload_random_theme_desc), + icon = { Icon(painterResource(R.drawable.casino), null) }, + onClick = { + val palette = when (randomThemeStyle) { + RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() + RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + } + val seedPalette = ThemeSeedPalette( + primary = palette.primary, + secondary = palette.secondary, + tertiary = palette.tertiary, + neutral = palette.neutral, + ) + val encoded = ThemeSeedPaletteCodec.encodeForPreference(seedPalette, randomThemeStyle.name) + PreferenceStore.launchEdit(context.dataStore) { + this[CustomThemeColorKey] = encoded + } + }, + ) + } + item(visible = !dynamicTheme || Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { PreferenceEntry( title = { Text(stringResource(R.string.color_palette)) }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 010b97c1e..02df8c132 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -346,6 +346,8 @@ Choose how random colors are generated Material You Chaos + Reload new color theme + Generate and apply a new random color palette now Font Choose the app font source Default From a92fbdc866ce559f4e2639f0ce5f8313ab307c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 03:48:07 +0700 Subject: [PATCH 4/8] Add vi/jp translations for random theme strings --- app/src/main/res/values-ja/strings.xml | 6 ++++++ app/src/main/res/values-vi/strings.xml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cb9f963dd..9cac3c5d0 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -322,6 +322,12 @@ 動的テーマを有効にする 起動時のランダムなテーマ アプリを起動するたびにランダムなカラーパレットを適用する + ランダムテーマのスタイル + ランダムな色の生成方法を選択 + Material You + カオス + 新しいカラーテーマを生成 + 今すぐランダムなカラーパレットを生成して適用 システムフォントを使用する アプリのフォントの代わりにデバイスのフォントを使用する diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 234b1de8a..276c78f1d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -297,6 +297,12 @@ Bật giao diện động Chủ đề ngẫu nhiên khi khởi động Áp dụng bảng màu ngẫu nhiên mỗi khi app khởi động + Kiểu chủ đề ngẫu nhiên + Chọn cách tạo màu ngẫu nhiên + Material You + Hỗn loạn + Tạo chủ đề màu mới + Tạo và áp dụng bảng màu ngẫu nhiên mới ngay bây giờ Bảng màu Chọn màu giao diện ứng dụng của bạn From 5aca383588d5ba14c5aa40b528c01a62bff2c2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 03:56:24 +0700 Subject: [PATCH 5/8] Add Monochrome random style --- app/src/main/kotlin/moe/rukamori/archivetune/App.kt | 1 + .../archivetune/constants/PreferenceKeys.kt | 1 + .../ui/screens/settings/AppearanceSettings.kt | 2 ++ .../ui/screens/settings/PalettePickerScreen.kt | 13 +++++++++++++ app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 20 insertions(+) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index f67c79483..49e0bb485 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -180,6 +180,7 @@ class App : Application(), SingletonImageLoader.Factory { val randomPalette = when (style) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() } val seedPalette = ThemeSeedPalette( primary = randomPalette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt index b3db71859..0bc4c8639 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt @@ -23,6 +23,7 @@ val RandomThemeOnStartupKey = booleanPreferencesKey("randomThemeOnStartup") enum class RandomThemeStyle { MATERIAL_YOU, CHAOS, + MONOCHROME, } val RandomThemeStyleKey = stringPreferencesKey("randomThemeStyle") diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index 1f81cbb62..a8b5a64cb 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -420,6 +420,7 @@ fun AppearanceSettings( when (it) { RandomThemeStyle.MATERIAL_YOU -> stringResource(R.string.random_style_material_you) RandomThemeStyle.CHAOS -> stringResource(R.string.random_style_chaos) + RandomThemeStyle.MONOCHROME -> stringResource(R.string.random_style_monochrome) } }, onValueSelected = onRandomThemeStyleChange, @@ -435,6 +436,7 @@ fun AppearanceSettings( val palette = when (randomThemeStyle) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() } val seedPalette = ThemeSeedPalette( primary = palette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt index 5acaf90a7..7d11db16a 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt @@ -821,6 +821,19 @@ object ThemePalettes { ) } + fun generateMonochromePalette(): ThemePalette { + val random = java.util.Random() + val gray = hctToColor(0f, 0f, random.nextFloat()) + return ThemePalette( + id = "monochrome_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = gray, + secondary = gray, + tertiary = gray, + neutral = gray, + ) + } + private fun hctToColor(hue: Float, saturation: Float, lightness: Float): Color { val hsv = floatArrayOf(hue, saturation, lightness) val argb = android.graphics.Color.HSVToColor(hsv) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9cac3c5d0..1ddc165e9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -326,6 +326,7 @@ ランダムな色の生成方法を選択 Material You カオス + モノクロ 新しいカラーテーマを生成 今すぐランダムなカラーパレットを生成して適用 システムフォントを使用する diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 276c78f1d..97ae878b6 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -301,6 +301,7 @@ Chọn cách tạo màu ngẫu nhiên Material You Hỗn loạn + Đơn sắc Tạo chủ đề màu mới Tạo và áp dụng bảng màu ngẫu nhiên mới ngay bây giờ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 02df8c132..d585a0755 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -346,6 +346,7 @@ Choose how random colors are generated Material You Chaos + Monochrome Reload new color theme Generate and apply a new random color palette now Font From b939dd61fbcf5a2be17d4c388e00d00e65bb5c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 04:00:56 +0700 Subject: [PATCH 6/8] Rename Material You -> TonalSpot --- app/src/main/kotlin/moe/rukamori/archivetune/App.kt | 6 +++--- .../moe/rukamori/archivetune/constants/PreferenceKeys.kt | 2 +- .../archivetune/ui/screens/settings/AppearanceSettings.kt | 6 +++--- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index 49e0bb485..75d0b7585 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -175,11 +175,11 @@ class App : Application(), SingletonImageLoader.Factory { // Apply random theme on startup if enabled if (prefs[RandomThemeOnStartupKey] ?: (Build.VERSION.SDK_INT < Build.VERSION_CODES.S)) { - val styleName = prefs[RandomThemeStyleKey] ?: RandomThemeStyle.MATERIAL_YOU.name - val style = try { RandomThemeStyle.valueOf(styleName) } catch (_: Exception) { RandomThemeStyle.MATERIAL_YOU } + val styleName = prefs[RandomThemeStyleKey] ?: RandomThemeStyle.TONAL_SPOT.name + val style = try { RandomThemeStyle.valueOf(styleName) } catch (_: Exception) { RandomThemeStyle.TONAL_SPOT } val randomPalette = when (style) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() - RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateRandomPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() } val seedPalette = ThemeSeedPalette( diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt index 0bc4c8639..3bde9c5b4 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt @@ -21,7 +21,7 @@ val CustomThemeColorKey = stringPreferencesKey("customThemeColor") val RandomThemeOnStartupKey = booleanPreferencesKey("randomThemeOnStartup") enum class RandomThemeStyle { - MATERIAL_YOU, + TONAL_SPOT, CHAOS, MONOCHROME, } diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index a8b5a64cb..181bc7d2f 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -153,7 +153,7 @@ fun AppearanceSettings( ) val (randomThemeStyle, onRandomThemeStyleChange) = rememberEnumPreference( RandomThemeStyleKey, - defaultValue = RandomThemeStyle.MATERIAL_YOU + defaultValue = RandomThemeStyle.TONAL_SPOT ) val (darkMode, onDarkModeChange) = rememberEnumPreference( DarkModeKey, @@ -418,7 +418,7 @@ fun AppearanceSettings( selectedValue = randomThemeStyle, valueText = { when (it) { - RandomThemeStyle.MATERIAL_YOU -> stringResource(R.string.random_style_material_you) + RandomThemeStyle.TONAL_SPOT -> stringResource(R.string.random_style_tonal_spot) RandomThemeStyle.CHAOS -> stringResource(R.string.random_style_chaos) RandomThemeStyle.MONOCHROME -> stringResource(R.string.random_style_monochrome) } @@ -435,7 +435,7 @@ fun AppearanceSettings( onClick = { val palette = when (randomThemeStyle) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() - RandomThemeStyle.MATERIAL_YOU -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateRandomPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() } val seedPalette = ThemeSeedPalette( diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1ddc165e9..25df7cd24 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -324,7 +324,7 @@ アプリを起動するたびにランダムなカラーパレットを適用する ランダムテーマのスタイル ランダムな色の生成方法を選択 - Material You + Tonal Spot カオス モノクロ 新しいカラーテーマを生成 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 97ae878b6..c316dbb3c 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -299,7 +299,7 @@ Áp dụng bảng màu ngẫu nhiên mỗi khi app khởi động Kiểu chủ đề ngẫu nhiên Chọn cách tạo màu ngẫu nhiên - Material You + Tonal Spot Hỗn loạn Đơn sắc Tạo chủ đề màu mới diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d585a0755..1e97e3641 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -344,7 +344,7 @@ Apply a random color palette every time the app starts Random theme style Choose how random colors are generated - Material You + Tonal Spot Chaos Monochrome Reload new color theme From aa3da635608e418609efa8c35be4c3350240f637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 04:10:23 +0700 Subject: [PATCH 7/8] Add all PaletteStyle random theme options --- .../kotlin/moe/rukamori/archivetune/App.kt | 2 +- .../archivetune/constants/PreferenceKeys.kt | 9 +++++- .../ui/screens/settings/AppearanceSettings.kt | 21 ++++++++---- .../rukamori/archivetune/ui/theme/Theme.kt | 32 +++++++++++++++++-- app/src/main/res/values-ja/strings.xml | 9 +++++- app/src/main/res/values-vi/strings.xml | 9 +++++- app/src/main/res/values/strings.xml | 9 +++++- 7 files changed, 77 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index 75d0b7585..9053911fe 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -179,8 +179,8 @@ class App : Application(), SingletonImageLoader.Factory { val style = try { RandomThemeStyle.valueOf(styleName) } catch (_: Exception) { RandomThemeStyle.TONAL_SPOT } val randomPalette = when (style) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() - RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateRandomPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() + else -> ThemePalettes.generateRandomPalette() } val seedPalette = ThemeSeedPalette( primary = randomPalette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt index 3bde9c5b4..8330e4bd8 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/constants/PreferenceKeys.kt @@ -22,8 +22,15 @@ val RandomThemeOnStartupKey = booleanPreferencesKey("randomThemeOnStartup") enum class RandomThemeStyle { TONAL_SPOT, - CHAOS, + NEUTRAL, + VIBRANT, + EXPRESSIVE, + RAINBOW, + FRUIT_SALAD, MONOCHROME, + FIDELITY, + CONTENT, + CHAOS, } val RandomThemeStyleKey = stringPreferencesKey("randomThemeStyle") diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index 181bc7d2f..aa86d820d 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -417,11 +417,20 @@ fun AppearanceSettings( icon = { Icon(painterResource(R.drawable.shuffle), null) }, selectedValue = randomThemeStyle, valueText = { - when (it) { - RandomThemeStyle.TONAL_SPOT -> stringResource(R.string.random_style_tonal_spot) - RandomThemeStyle.CHAOS -> stringResource(R.string.random_style_chaos) - RandomThemeStyle.MONOCHROME -> stringResource(R.string.random_style_monochrome) - } + stringResource( + when (it) { + RandomThemeStyle.TONAL_SPOT -> R.string.random_style_tonal_spot + RandomThemeStyle.NEUTRAL -> R.string.random_style_neutral + RandomThemeStyle.VIBRANT -> R.string.random_style_vibrant + RandomThemeStyle.EXPRESSIVE -> R.string.random_style_expressive + RandomThemeStyle.RAINBOW -> R.string.random_style_rainbow + RandomThemeStyle.FRUIT_SALAD -> R.string.random_style_fruit_salad + RandomThemeStyle.MONOCHROME -> R.string.random_style_monochrome + RandomThemeStyle.FIDELITY -> R.string.random_style_fidelity + RandomThemeStyle.CONTENT -> R.string.random_style_content + RandomThemeStyle.CHAOS -> R.string.random_style_chaos + } + ) }, onValueSelected = onRandomThemeStyleChange, ) @@ -435,8 +444,8 @@ fun AppearanceSettings( onClick = { val palette = when (randomThemeStyle) { RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() - RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateRandomPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() + else -> ThemePalettes.generateRandomPalette() } val seedPalette = ThemeSeedPalette( primary = palette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/theme/Theme.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/theme/Theme.kt index 56a7d980b..4afa653da 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/theme/Theme.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/theme/Theme.kt @@ -45,6 +45,9 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import moe.rukamori.archivetune.constants.AppFontPreference +import moe.rukamori.archivetune.constants.RandomThemeStyle +import moe.rukamori.archivetune.constants.RandomThemeStyleKey +import moe.rukamori.archivetune.utils.rememberEnumPreference import kotlin.math.abs import kotlin.math.min @@ -113,22 +116,43 @@ fun ArchiveTuneTheme( } } val expressiveMotionScheme = remember { MotionScheme.expressive() } - val paletteStyle = remember(themeColor, seedPalette) { + val (randomThemeStyle, _) = rememberEnumPreference( + RandomThemeStyleKey, + defaultValue = RandomThemeStyle.TONAL_SPOT, + ) + + val paletteStyle = remember(themeColor, seedPalette, randomThemeStyle) { paletteStyleFor(seedPalette?.primary ?: themeColor) } + val forcedPaletteStyle = remember(randomThemeStyle) { + when (randomThemeStyle) { + RandomThemeStyle.TONAL_SPOT -> PaletteStyle.TonalSpot + RandomThemeStyle.NEUTRAL -> PaletteStyle.Neutral + RandomThemeStyle.VIBRANT -> PaletteStyle.Vibrant + RandomThemeStyle.EXPRESSIVE -> PaletteStyle.Expressive + RandomThemeStyle.RAINBOW -> PaletteStyle.Rainbow + RandomThemeStyle.FRUIT_SALAD -> PaletteStyle.FruitSalad + RandomThemeStyle.MONOCHROME -> PaletteStyle.Monochrome + RandomThemeStyle.FIDELITY -> PaletteStyle.Fidelity + RandomThemeStyle.CONTENT -> PaletteStyle.Content + RandomThemeStyle.CHAOS -> null + } + } + val appColorScheme = - remember(seedPalette, themeColor, darkTheme) { + remember(seedPalette, themeColor, darkTheme, forcedPaletteStyle) { if (seedPalette != null) { exactPaletteColorScheme( palette = seedPalette, isDark = darkTheme, + style = forcedPaletteStyle, ) } else { materialKolorDynamicColorScheme( keyColor = themeColor, isDark = darkTheme, - style = paletteStyle, + style = forcedPaletteStyle ?: paletteStyle, ) } } @@ -216,12 +240,14 @@ private fun animateColorScheme(targetColorScheme: ColorScheme): ColorScheme { private fun exactPaletteColorScheme( palette: ThemeSeedPalette, isDark: Boolean, + style: PaletteStyle? = null, ): ColorScheme = mergedSeedColorScheme( primarySeed = palette.primary, secondarySeed = palette.secondary, tertiarySeed = palette.tertiary, neutralSeed = palette.neutral, isDark = isDark, + style = style ?: paletteStyleFor(palette.primary), ) private fun materialKolorDynamicColorScheme( diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 25df7cd24..b16151ac1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -325,8 +325,15 @@ ランダムテーマのスタイル ランダムな色の生成方法を選択 Tonal Spot - カオス + Neutral + Vibrant + Expressive + Rainbow + Fruit Salad モノクロ + Fidelity + Content + カオス 新しいカラーテーマを生成 今すぐランダムなカラーパレットを生成して適用 システムフォントを使用する diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index c316dbb3c..608d6d12c 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -300,8 +300,15 @@ Kiểu chủ đề ngẫu nhiên Chọn cách tạo màu ngẫu nhiên Tonal Spot - Hỗn loạn + Neutral + Vibrant + Expressive + Rainbow + Fruit Salad Đơn sắc + Fidelity + Content + Hỗn loạn Tạo chủ đề màu mới Tạo và áp dụng bảng màu ngẫu nhiên mới ngay bây giờ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e97e3641..49d4a10a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,8 +345,15 @@ Random theme style Choose how random colors are generated Tonal Spot - Chaos + Neutral + Vibrant + Expressive + Rainbow + Fruit Salad Monochrome + Fidelity + Content + Chaos Reload new color theme Generate and apply a new random color palette now Font From 2e541d6dd1a469ccaca23b25672e62663560ca67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A0=20Ti=E1=BA=BFn=20S=C3=A1ng?= Date: Tue, 16 Jun 2026 04:13:42 +0700 Subject: [PATCH 8/8] Add dedicated seed generation per random style --- .../kotlin/moe/rukamori/archivetune/App.kt | 11 +- .../ui/screens/settings/AppearanceSettings.kt | 11 +- .../screens/settings/PalettePickerScreen.kt | 136 ++++++++++++++---- 3 files changed, 123 insertions(+), 35 deletions(-) diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt index 9053911fe..bd945e490 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/App.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/App.kt @@ -178,9 +178,16 @@ class App : Application(), SingletonImageLoader.Factory { val styleName = prefs[RandomThemeStyleKey] ?: RandomThemeStyle.TONAL_SPOT.name val style = try { RandomThemeStyle.valueOf(styleName) } catch (_: Exception) { RandomThemeStyle.TONAL_SPOT } val randomPalette = when (style) { - RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() + RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateTonalSpotPalette() + RandomThemeStyle.NEUTRAL -> ThemePalettes.generateNeutralPalette() + RandomThemeStyle.VIBRANT -> ThemePalettes.generateVibrantPalette() + RandomThemeStyle.EXPRESSIVE -> ThemePalettes.generateExpressivePalette() + RandomThemeStyle.RAINBOW -> ThemePalettes.generateRainbowPalette() + RandomThemeStyle.FRUIT_SALAD -> ThemePalettes.generateFruitSaladPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() - else -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.FIDELITY -> ThemePalettes.generateFidelityPalette() + RandomThemeStyle.CONTENT -> ThemePalettes.generateContentPalette() + RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() } val seedPalette = ThemeSeedPalette( primary = randomPalette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt index aa86d820d..b1a600594 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/AppearanceSettings.kt @@ -443,9 +443,16 @@ fun AppearanceSettings( icon = { Icon(painterResource(R.drawable.casino), null) }, onClick = { val palette = when (randomThemeStyle) { - RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() + RandomThemeStyle.TONAL_SPOT -> ThemePalettes.generateTonalSpotPalette() + RandomThemeStyle.NEUTRAL -> ThemePalettes.generateNeutralPalette() + RandomThemeStyle.VIBRANT -> ThemePalettes.generateVibrantPalette() + RandomThemeStyle.EXPRESSIVE -> ThemePalettes.generateExpressivePalette() + RandomThemeStyle.RAINBOW -> ThemePalettes.generateRainbowPalette() + RandomThemeStyle.FRUIT_SALAD -> ThemePalettes.generateFruitSaladPalette() RandomThemeStyle.MONOCHROME -> ThemePalettes.generateMonochromePalette() - else -> ThemePalettes.generateRandomPalette() + RandomThemeStyle.FIDELITY -> ThemePalettes.generateFidelityPalette() + RandomThemeStyle.CONTENT -> ThemePalettes.generateContentPalette() + RandomThemeStyle.CHAOS -> ThemePalettes.generateChaosPalette() } val seedPalette = ThemeSeedPalette( primary = palette.primary, diff --git a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt index 7d11db16a..d51d81224 100644 --- a/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt +++ b/app/src/main/kotlin/moe/rukamori/archivetune/ui/screens/settings/PalettePickerScreen.kt @@ -773,51 +773,87 @@ object ThemePalettes { fun getRandomPalette(): ThemePalette = allPalettes.random() - fun generateRandomPalette(): ThemePalette { + fun generateTonalSpotPalette(): ThemePalette { val random = java.util.Random() - val hue = random.nextFloat() * 360f - val saturation = 0.5f + random.nextFloat() * 0.4f - val lightness = 0.4f + random.nextFloat() * 0.25f - val primary = hctToColor(hue, saturation, lightness) + val primary = hctToColor( + random.nextFloat() * 360f, + 0.5f + random.nextFloat() * 0.4f, + 0.4f + random.nextFloat() * 0.25f, + ) return ThemePalette( - id = "random_" + System.currentTimeMillis(), + id = "tonalspot_" + System.currentTimeMillis(), nameResId = R.string.palette_custom, - primary = primary, - secondary = primary, - tertiary = primary, - neutral = primary, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, ) } - fun generateChaosPalette(): ThemePalette { + fun generateNeutralPalette(): ThemePalette { val random = java.util.Random() val primary = hctToColor( random.nextFloat() * 360f, - random.nextFloat(), - random.nextFloat(), + 0.1f + random.nextFloat() * 0.2f, + 0.4f + random.nextFloat() * 0.25f, ) - val secondary = hctToColor( + return ThemePalette( + id = "neutral_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, + ) + } + + fun generateVibrantPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( random.nextFloat() * 360f, - random.nextFloat(), - random.nextFloat(), + 0.8f + random.nextFloat() * 0.2f, + 0.45f + random.nextFloat() * 0.15f, + ) + return ThemePalette( + id = "vibrant_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, ) - val tertiary = hctToColor( + } + + fun generateExpressivePalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( random.nextFloat() * 360f, - random.nextFloat(), - random.nextFloat(), + 0.6f + random.nextFloat() * 0.35f, + 0.35f + random.nextFloat() * 0.35f, + ) + return ThemePalette( + id = "expressive_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, ) - val neutral = hctToColor( + } + + fun generateRainbowPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( random.nextFloat() * 360f, - random.nextFloat(), - random.nextFloat(), + 0.5f + random.nextFloat() * 0.4f, + 0.4f + random.nextFloat() * 0.25f, ) return ThemePalette( - id = "chaos_" + System.currentTimeMillis(), + id = "rainbow_" + System.currentTimeMillis(), nameResId = R.string.palette_custom, - primary = primary, - secondary = secondary, - tertiary = tertiary, - neutral = neutral, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, + ) + } + + fun generateFruitSaladPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( + random.nextFloat() * 360f, + 0.6f + random.nextFloat() * 0.3f, + 0.4f + random.nextFloat() * 0.3f, + ) + return ThemePalette( + id = "fruitsalad_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, ) } @@ -827,10 +863,48 @@ object ThemePalettes { return ThemePalette( id = "monochrome_" + System.currentTimeMillis(), nameResId = R.string.palette_custom, - primary = gray, - secondary = gray, - tertiary = gray, - neutral = gray, + primary = gray, secondary = gray, tertiary = gray, neutral = gray, + ) + } + + fun generateFidelityPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( + random.nextFloat() * 360f, + 0.5f + random.nextFloat() * 0.4f, + 0.4f + random.nextFloat() * 0.25f, + ) + return ThemePalette( + id = "fidelity_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, + ) + } + + fun generateContentPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor( + random.nextFloat() * 360f, + 0.5f + random.nextFloat() * 0.35f, + 0.4f + random.nextFloat() * 0.25f, + ) + return ThemePalette( + id = "content_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = primary, tertiary = primary, neutral = primary, + ) + } + + fun generateChaosPalette(): ThemePalette { + val random = java.util.Random() + val primary = hctToColor(random.nextFloat() * 360f, random.nextFloat(), random.nextFloat()) + val secondary = hctToColor(random.nextFloat() * 360f, random.nextFloat(), random.nextFloat()) + val tertiary = hctToColor(random.nextFloat() * 360f, random.nextFloat(), random.nextFloat()) + val neutral = hctToColor(random.nextFloat() * 360f, random.nextFloat(), random.nextFloat()) + return ThemePalette( + id = "chaos_" + System.currentTimeMillis(), + nameResId = R.string.palette_custom, + primary = primary, secondary = secondary, tertiary = tertiary, neutral = neutral, ) }